Java开发手册 个人收款码 overflow EasyCVR swing svg grails enums threejs grep Animsition vue路由 郑州网站开发 docker的安全特性有哪些 websocket库 python调用自定义函数 javasubstring java简介 java中scanner java的继承 java中class java如何配置环境变量 java遍历 java成员变量 java获取数据类型 java中collection java输出 linux密码忘记 php实例教程 快点蛆虫成就单刷 七宗罪游戏下载 野德天赋 催眠魔蛙 微信砍价活动怎么做 PCCAD 视频解析软件 红巨人插件 cubase下载 c4d文字 vue引入第三方js
当前位置: 首页 > 学习教程  > 编程语言

C++primer(第五版)第九章编程题

2021/2/13 17:22:30 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

练习9.2 /******************************************************************************* 定义一个list对象,其元素类型是int的deque。*****************************************************************************/ #include <list> #include <deque> #…

练习9.2
/******************************************************************************
 * 定义一个list对象,其元素类型是int的deque。
 *****************************************************************************/
#include <list>
#include <deque>
#include <iostream>

using std::cout;
using std::deque;
using std::list;

int main()
{
    list<deque<int>> lists;
    cout << lists.empty() << "\n";
    return 0;
}
练习9.4
/******************************************************************************
 * 编写函数,接受一对指向vector<int>的迭代器和一个int值。在两个迭代器指定的范围中查找
 * 给定的值,返回一个布尔值来指出是否找到。
 *****************************************************************************/
#include <iostream>
#include <vector>

using std::cout;
using std::vector;

bool is_found(vector<int>::iterator begin, vector<int>::iterator end, int num)
{
    for (; begin != end; ++begin)
        if (*begin == num)
            return true;
    return false;
}

int main()
{
    vector<int> vnum{1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    if (is_found(vnum.begin(), vnum.end(), 11))
        cout << "已找到!\n";
    else
        cout << "未找到!!\n";
    return 0;
}
练习9.5
/******************************************************************************
 * 重写上一题的函数,返回一个迭代器指向找到的元素。注意,程序必须处理未找到给定值的情
 * 况。
 *****************************************************************************/
#include <iostream>
#include <vector>

using std::cout;
using std::vector;

vector<int>::iterator is_found(vector<int>::iterator begin,
                               vector<int>::iterator end, int num)
{
    for (; begin != end; ++begin)
        if (*begin == num)
            return begin;
    return end;
}

int main()
{
    vector<int> vnum{1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    auto it = is_found(vnum.begin(), vnum.end(), 2);
    if (it == vnum.end())
        cout << "未找到给定值!!\n";
    else
        cout << *it << "\n";
    return 0;
}
练习9.13
/******************************************************************************
 * 如何从一个list<int>初始化一个vector<double>?从一个vector<int>又该如何创建?编写
 * 代码验证你的答案。
 *****************************************************************************/
#include <iostream>
#include <list>
#include <vector>

using std::cout;
using std::list;
using std::vector;

int main()
{
    list<int> lnum = {1, 2};
    vector<int> vint = {1, 3};
    // 从一个list<int>初始化一个vector<double>
    vector<double> vnum(lnum.begin(), lnum.end());
    // 从一个vector<int>初始化一个vector<double>
    vector<double> vnums(vint.begin(), vint.end());
    for (auto &num : lnum)
        cout << num << " ";
    cout << "\n";
    for (auto &num : vint)
        cout << num << " ";
    cout << "\n";
    for (auto &num : vnum)
        cout << num << " ";
    cout << "\n";
    for (auto &num : vnums)
        cout << num << " ";
    cout << "\n";
    return 0;
}
练习9.14
/******************************************************************************
 * 编写程序,将一个list中的char*指针(指向C风格字符串)元素赋值给一个vector中的string。
 *****************************************************************************/
#include <list>
#include <vector>
#include <iostream>

using std::cout;
using std::list;
using std::string;
using std::vector;

int main()
{
    list<char *> lstr = {(char *)"qwer", (char *)"tyui"};
    vector<string> vstr;
    vstr.assign(lstr.begin(), lstr.end());
    for (auto str : lstr)
        cout << str << "\n";
    for (auto str : vstr)
        cout << str << "\n";
    return 0;
}
练习9.15
/******************************************************************************
 * 编写程序,判定两个vector<int>是否相等。
 *****************************************************************************/
#include <iostream>
#include <vector>

using std::cout;
using std::vector;

int main()
{
    vector<int> v1 = {2, 2}, v2 = {2, 3, 3};
    if (v1 == v2)
        cout << "相等";
    else
        cout << "不相等";
    return 0;
}
练习9.16
/******************************************************************************
 * 重写上一题的程序,比较一个list<int>中的元素和一个vector<int>中的元素。
 *****************************************************************************/
#include <iostream>
#include <list>
#include <vector>

using std::cout;
using std::list;
using std::vector;

int main()
{
    list<int> lint = {1, 2};
    vector<int> vint = {2, 3};
    if (lint.size() == vint.size())
    {
        auto itv = vint.cbegin();
        for (auto itl = lint.cbegin(); itl != lint.cend(); ++itl, ++itv)
        {
            if (*itl != *itv)
            {
                cout << "不相等";
                return 0;
            }
        }
        cout << "相等";
    }
    else
        cout << "不相等";
    return 0;
}
练习9.18
/******************************************************************************
 * 编写程序,从标准输入读取string序列,存入一个deque中。编写一个循环,用迭代器打印
 * deque中的元素。
 *****************************************************************************/
#include <iostream>
#include <deque>

using std::cin;
using std::cout;
using std::deque;
using std::string;

int main()
{
    string str;
    deque<string> dstr;
    while (cin >> str)
        dstr.push_back(str);
    for (auto &stri : dstr)
        cout << stri << "\n";
    return 0;
}
练习9.19
/******************************************************************************
 * 重写上题的程序,用list替代list。列出程序中要做哪些改变。
 *****************************************************************************/
#include <iostream>
#include <list>

using std::cin;
using std::cout;
using std::list;
using std::string;

int main()
{
    string str;
    list<string> dstr;
    while (cin >> str)
        dstr.push_back(str);
    for (auto &stri : dstr)
        cout << stri << "\n";
    return 0;
}
练习9.20
/******************************************************************************
 * 编写程序,从一个list<int>拷贝元素到两个deque中。值为偶数的所有元素都拷贝到一个
 * deque中,而奇数值元素都拷贝到另一个deque中。
 *****************************************************************************/
#include <deque>
#include <list>
#include <iostream>

using std::cout;
using std::deque;
using std::list;

int main()
{
    list<int> lnum = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    deque<int> dood, deven;
    for (auto &num : lnum)
        if (num % 2)
            dood.push_back(num);
        else
            deven.push_back(num);
    cout << "奇数:\n";
    for (auto &num : dood)
        cout << num << "\n";
    cout << "偶数:\n";
    for (auto &num : deven)
        cout << num << "\n";
    return 0;
}
练习9.24
/******************************************************************************
 * 编写程序,分别使用at,下标运算符、front和begin提取一个vector中的第一个元素。在一个
 * 空vector上测试你的程序。
 *****************************************************************************/
#include <iostream>
#include <vector>

using std::cout;
using std::vector;

int main()
{
    vector<int> vint;
    cout << vint.at(0) << "\n"
         << vint[0] << "\n"
         << vint.front() << "\n"
         << *vint.begin() << "\n";
    return 0;
}
练习9.26
/******************************************************************************
 * 使用下面代码定义的ia,将ia拷贝到一个vector和一个list中。使用单迭代器版本的erase从
 * list中删除奇数元素,从vector中删除偶数元素。
 * int ia[]={0,1,1,2,3,5,8,13,21,55,89};
 *****************************************************************************/
#include <list>
#include <vector>
#include <iostream>

using std::cout;
using std::list;
using std::vector;

int main()
{
    int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89};
    vector<int> vint;
    list<int> lint;
    for (unsigned i = 0; i != 11; ++i)
    {
        vint.push_back(ia[i]);
        lint.push_back(ia[i]);
    }
    for (auto it = vint.begin(); it != vint.end();)
        if (*it % 2 == 0)
            it = vint.erase(it);
        else
            ++it;
    for (auto it = lint.begin(); it != lint.end();)
        if (*it % 2)
            it = lint.erase(it);
        else
            ++it;
    for (auto &num : lint)
        cout << num << "\n";
    cout << "\n";
    for (auto &num : vint)
        cout << num << "\n";
    return 0;
}
练习9.27
/******************************************************************************
 * 编写程序,查找并删除forward_list<int>中的奇数元素。
 *****************************************************************************/
#include <forward_list>
#include <iostream>

using std::cout;
using std::forward_list;

int main()
{
    forward_list<int> fint = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    cout << "删前:\n";
    for (auto &num : fint)
        cout << num << " ";
    auto pre = fint.before_begin();
    auto cur = fint.begin();
    while (cur != fint.end())
    {
        if (*cur % 2)
            cur = fint.erase_after(pre);
        else
            pre = cur++;
    }
    cout << "\n删后:\n";
    for (auto &num : fint)
        cout << num << " ";
    return 0;
}
练习9.31
/******************************************************************************
 * 第316页中删除偶数值元素并复制奇数值元素的程序不能用于list或forward_list。为什么?
 * 修改程序,使之也能用于这些类型。
 *****************************************************************************/
/*** 1 ***/
#include <iostream>
#include <list>

using std::cout;
using std::list;

int main()
{
    list<int> vi = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    auto iter = vi.begin();
    while (iter != vi.end())
    {
        if (*iter % 2)
        {
            iter = vi.insert(iter, *iter);
            iter++;
            iter++;
        }
        else
            iter = vi.erase(iter);
    }
    for (auto &num : vi)
        cout << num << " ";
    cout << "\n";
    return 0;
}
/*** 2 ***/
#include <iostream>
#include <forward_list>

using std::cout;
using std::forward_list;

int main()
{
    forward_list<int> vi = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    auto iter = vi.begin();
    auto per = vi.before_begin();
    while (iter != vi.end())
    {
        if (*iter % 2)
        {
            iter = vi.insert_after(iter, *iter);
            per = iter++;
        }
        else
            iter = vi.erase_after(per);
    }
    for (auto &num : vi)
        cout << num << " ";
    cout << "\n";
    return 0;
}
练习9.33
/******************************************************************************
 * 在本节最后一个例子中,如果不将insert的结果赋予begin,将会发生什么?编写程序,去掉此赋
 * 值语句,验证你的答案。
 *****************************************************************************/
#include <vector>

using std::vector;

int main()
{
    vector<int> v = {1, 2, 3};
    auto begin = v.begin();
    while (begin != v.end())
    {
        ++begin;
        v.insert(begin, 42);
        ++begin;
    }
    return 0;
}
练习9.34
/******************************************************************************
 * 假定vi是一个保存int的容器,其中有偶数值也有奇数值,分析下面循环的行为,然后编写程序
 * 验证你的分析是否正确。
 *  iter = vi.begin();
 *  while (iter != vi.end())
 *      if (*iter % 2)
 *          iter = vi.insert(iter, *iter);
 *      ++iter;
 *****************************************************************************/
#include <iostream>
#include <vector>

using std::cout;
using std::vector;

int main()
{
    vector<int> vi = {1, 2};
    auto iter = vi.begin();
    while (iter != vi.end())
        if (*iter % 2)
            iter = vi.insert(iter, *iter);
    ++iter;
    return 0;
}
练习9.38
/******************************************************************************
 * 编写程序,探究在你的标准库实现中,vector是如何增长的。
 *****************************************************************************/
#include <vector>
#include <iostream>

using std::cout;
using std::vector;

int main()
{
    vector<int> v;
    cout << "size: " << v.size() << "\tcapacity: " << v.capacity()<<"\n";
    for (int i = 0; i != 10; ++i)
    {
        v.push_back(i);
        cout << "-------------------------------------------------------\nv: ";
        for (auto &num : v)
            cout << num << " ";
        cout << "\nsize: " << v.size()
             << "\tcapacity: " << v.capacity() << "\n";
    }
    return 0;
}
练习9.41
/******************************************************************************
 * 编写程序,从一个vector<char>初始化一个string。
 *****************************************************************************/
#include <iostream>
#include <vector>

using std::cout;
using std::string;
using std::vector;

int main()
{
    vector<char> vchar = {'v', 'e', 'c', 't', 'e', 'r'};
    string str(vchar.begin(), vchar.end());
    cout << str;
    return 0;
}
练习9.43
/******************************************************************************
 * 编写一个函数,接受三个参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所
 * 有oldVal替换为newVal。测试你的程序,用它替换通用的简写形式,如,将“tho”替换为
 * “thought”,将“thru”替换为“through”。
 *****************************************************************************/
#include <iostream>

using std::cout;
using std::string;

string myReplace(string s, string oldVal, string newVal)
{
    auto oit = oldVal.cbegin();
    unsigned count = 0;
    for (auto it = s.begin(); it != s.end(); ++it)
        if (*it == *oit)
        {
            ++oit;
            ++count;
            if (oit == oldVal.cend())
            {
                it = s.erase(it - count + 1, it + 1);
                it = s.insert(it, newVal.begin(), newVal.end());
                count = 0;
                oit = oldVal.cbegin();
                it += newVal.size() - 1;
            }
        }
        else
        {
            oit = oldVal.cbegin();
            count = 0;
        }
    return s;
}

int main()
{
    cout << myReplace("thothwowthothwo", "tho", "thought") << "\n";
    cout << myReplace("thrruthruthrouthru", "thru", "through") << "\n";
    return 0;
}
练习9.44
/******************************************************************************
 * 编写一个函数,接受三个参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所
 * 有oldVal替换为newVal。测试你的程序,用它替换通用的简写形式,如,将“tho”替换为
 * “thought”,将“thru”替换为“through”。
 *****************************************************************************/
#include <iostream>

using std::cout;
using std::string;

string myReplace(string s, string oldVal, string newVal)
{
    unsigned count = 0;
    for (unsigned i = 0, j = 0; i != s.size(); ++i)
    {
        if (s[i] == oldVal[j])
        {
            ++j;
            ++count;
            if (count == oldVal.size())
            {
                s.replace(i - count + 1, count, newVal);
                i += abs(oldVal.size() - newVal.size());
            }
        }
        else
        {
            count = 0;
            j = 0;
        }
    }
    return s;
}

int main()
{
    cout << myReplace("thothwowthothwo", "tho", "thought") << "\n";
    cout << myReplace("thrruthruthrouthru", "thru", "through") << "\n";
    return 0;
}
练习9.45
/******************************************************************************
 *  编写一个函数,接受一个表示名字的string参数和两个分别表示前缀(如"Mr."或"Ms.")和后
 * 缀(如"Jr."III")的字符串。使用迭代器及insert和append函数将前缀和后缀添加到给定的名
 * 字中。将生成的新string返回。
 *****************************************************************************/
#include <iostream>

using std::cout;
using std::string;

string format_name(string name, string pre_name, string suf_name)
{
    pre_name.append(name.insert(0, "-")).append(suf_name.insert(0, "-"));
    return pre_name;
}

int main()
{
    cout << format_name("ma", "wang", "zi") << "\n ";
    return 0;
}
练习9.46
/******************************************************************************
 * 重写上一题的函数,这次使用位置和长度来管理string,并只使用insert。
 *****************************************************************************/
#include <iostream>

using std::cout;
using std::string;

string format_name(string name, string pre_name, string suf_name)
{
    suf_name.insert(0, name.insert(0, pre_name + "-") + "-");
    return suf_name;
}

int main()
{
    cout << format_name("ma", "wang", "zi") << "\n ";
    return 0;
}
练习9.47
/******************************************************************************
 * 编写程序,首先查找string"ab2c3d7R4E6"中的每个数字字符,然后查找其中每个字母字符。编
 * 写两个版本的程序,第一个要使用find_first_of,第二个要使用find_first_not_of。
 *****************************************************************************/

/*** 1 ***/
#include <iostream>

using std::cout;
using std::string;

int main()
{
    string number = "0123456789";
    string find_str = "ab2c3d7R4E6";
    string letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrestuvwxyz";
    string::size_type pos = 0;
    cout << "数字字符:\n";
    while ((pos = find_str.find_first_of(number, pos)) != string::npos)
    {
        cout << find_str[pos];
        pos++;
    }
    cout << "\n字母字符:\n";
    pos = 0;
    while ((pos = find_str.find_first_of(letter, pos)) != string::npos)
    {
        cout << find_str[pos];
        pos++;
    }
    cout << "\n";
    return 0;
}

/*** 2 ***/
#include <iostream>

using std::cout;
using std::string;

int main()
{
    string number = "0123456789";
    string find_str = "ab2c3d7R4E6";
    string letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrestuvwxyz";
    string::size_type pos = 0;
    cout << "数字字符:\n";
    while ((pos = find_str.find_first_not_of(letter, pos)) != string::npos)
    {
        cout << find_str[pos];
        pos++;
    }
    cout << "\n字母字符:\n";
    pos = 0;
    while ((pos = find_str.find_first_not_of(number, pos)) != string::npos)
    {
        cout << find_str[pos];
        pos++;
    }
    cout << "\n";
    return 0;
}
练习9.49
/******************************************************************************
 * 如果一个字母延伸到中线以上,如d或f,则称其有上出头部分(ascender)。如果一个字母延伸到
 * 中线之下,如p或g,则称其有下出头部分(descender)。编写程序,读入一个单词文件,输
 * 出最长的既不包含上出头部分,也不包含下出头部分的单词。
 *****************************************************************************/
#include <iostream>
#include <fstream>

using std::cout;
using std::ifstream;
using std::string;

int main()
{
    unsigned maxlenth = 0;
    string scender = "bdfghijklpqty", word, maxword;
    ifstream in("D:\\code\\cplusplus\\multiple\\exercise9_49\\txt\\wordfile.txt");
    if (!in)
        return -1;
    while (in >> word)
    {
        if (word.find_first_of(scender) == string::npos)
        {
            if (maxlenth <= word.size())
            {
                maxlenth = word.size();
                maxword = word;
            }
        }
    }
    cout << maxword << "\n";
    return 0;
}
练习9.50
/******************************************************************************
 * 编写程序处理一个vector<string>,其元素都表示整型值。计算vector中所有元素之和。修改
 * 程序,使之计算表示浮点值的string之和。
 *****************************************************************************/

/*** 1 ***/
#include <vector>
#include <iostream>

using std::cout;
using std::string;
using std::vector;

int main()
{
    vector<string> vint = {"12", "-34", "-56", "+78", "90"};
    int sum = 0;
    for (auto &num : vint)
    {
        sum += stoi(num);
    }
    cout << sum << "\n";
    return 0;
}

/*** 2 ***/
#include <vector>
#include <iostream>

using std::cout;
using std::string;
using std::vector;

int main()
{
    vector<string> vint = {"1.2", "-3.4", "-5.6", "+7.8", ".90"};
    double sum = 0;
    for (auto &num : vint)
    {
        sum += stod(num);
    }
    cout << sum << "\n";
    return 0;
}
练习9.51
/******************************************************************************
 * 设计一个类,它有三个unsigned成员,分别表示年、月和日。为其编写构造函数,接受一个表
 * 示日期的string参数。你的构造函数应该能处理不同数据格式,如January 1,1900、1/1/
 * 1900、Jan 1 1900等。
 *****************************************************************************/
#include <iostream>
#include <vector>
using std::cout;
using std::string;
using std::vector;

struct Date
{
    Date() = default;
    Date(string, unsigned);
    Date(string);
    unsigned year = 0;
    unsigned month = 0;
    unsigned day = 0;
};

Date::Date(string monday, unsigned y)
{
    vector<string> emonth = {"January",
                             "February",
                             "March",
                             "April",
                             "May",
                             "June",
                             "July",
                             "August",
                             "September",
                             "October",
                             "November",
                             "December"};
    for (unsigned i = 0; i != emonth.size(); ++i)
        if (monday.find(emonth[i]) != string::npos)
            month = i + 1;
    day = stoi(monday.substr(monday.find_first_of("1234567890")));
    year = y;
}

Date::Date(string ymd)
{
    if (ymd.find("/") != string::npos)
    {
        day = stoi(ymd);
        month = stoi(ymd.substr(ymd.find_first_of("/") + 1));
        year = stoi(ymd.substr(ymd.find_last_of("/") + 1));
    }
    else
    {
        vector<string> emonth = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
                                 "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"};
        for (unsigned i = 0; i != emonth.size(); ++i)
            if (ymd.find(emonth[i]) != string::npos)
                month = i + 1;
        day = stoi(ymd.substr(ymd.find_first_of("1234567890")));
        year = stoi(ymd.substr(ymd.find_last_of(" ") + 1));
    }
}

int main()
{
    Date date;
    Date dat("January 1", 1900);
    Date da("1/1/1900");
    Date d("Jan 1 1900");
    cout << date.year << "-" << date.month << "-" << date.day << "\n";
    cout << dat.year << "-" << dat.month << "-" << dat.day << "\n";
    cout << da.year << "-" << da.month << "-" << da.day << "\n";
    cout << d.year << "-" << d.month << "-" << d.day << "\n";
    return 0;
}

本文链接: http://www.dtmao.cc/news_show_700134.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?