C++ Primer 第三章

来源:互联网 发布:w7怎么设置网络共享 编辑:程序博客网 时间:2024/06/09 23:49
  • 练习3.1
#include <iostream>#include <string>#include "Sales_data.h"//using声明using std::cin;using std::cout;using std::endl;using std::cerr;int main(){    //计算50—100连加    int a = 50;    int sum = 0;    while (a <= 100)    {        sum += a;        ++a;    }    cout << sum << endl;//  return 0;    //计算两个Sale_item对象的和    //读入Sale_data1和Sales_data2    Sales_data data1,data2;    cin >> data1.ISBN >> data1.price >> data1.units_sold;//ISBN号、单价、销量    data1.revenue = data1.price * data1.units_sold;//销售额    cin >> data2.ISBN >> data2.price >> data2.units_sold;    data2.revenue = data2.price * data2.units_sold;    //判断ISBN号是否相同,如果相同,求和    double average = 0;    if (data1.ISBN == data2.ISBN)    {        int totalCnt = data1.units_sold + data2.units_sold;//销售总量        double totalRevenue = data1.revenue + data2.revenue;//销售总额        //平均价格        if (totalCnt != 0)        {            average = totalRevenue/totalCnt;        }        else            cout << "No sales" << endl;        cout << data2.ISBN << " " << totalCnt << " " << totalRevenue << " " << average ;        return 0;    }    else {        cerr << "Data must refer to the same ISBN" << endl;        return -1;    }}
  • 练习3.2、练习3.4、练习3.5
#include <iostream>#include <string>using std::string;using std::cin;using std::cout;using std::endl;int main(){/******************练习3.2********************/    string s;    //一次读入一整行    while (getline(cin, s))    {        cout << s << endl;    }    //一次读入一个词    //while (cin << s)    //{    //  cout << s << endl;    //}    /*********************练习3.4**********************/    string s1, s2;    cin >> s1 >> s2;    if (s1 == s2)    {        cout << "s1 = s2" << endl;    }    else    {        if (s1 > s2)        {            cout << s1 << endl;        }        else if (s1 < s2)        {            cout << s2 << endl;        }    }    //判断是否等长    if (s1.size() == s2.size())    {        cout << "s1.size = s2.size" << endl;    }    else     {        if (s1.size() < s2.size())        {            cout << s2 << endl;        }        else         {            cout << s1 << endl;        }    }    /**************练习3.5*******************/    string s3, s4;    if (cin >> s3)    {        while (cin >> s4)        {            //s3 += s4;            s3 = s3 + ' ' + s4;        }        cout << s3 << endl;    }    /********************************************ctrl+z to stop*****************************/    return 0;}
  • 练习3.3
    在执行读取操作时,string对象会自动忽略开头的空白(如空格符、换行符、制表符等)并从第一个真正的字符开始读起,知道遇见下一处空白为止;
    getline会白柳输入时的空白符,从输入流中读入内容,知道遇到换行符为止,然后把所读的内容存入到那个string对象中去(不存换行符)。

练习3.6/3.8/3.10

#include <iostream>#include <string>using std::cin;using std::cout;using std::string;using std::endl;int main(){    /**********************range for********************/    string s1;    cin >> s1;    decltype(s1.begin()) i;    for (i = s1.begin(); i < s1.end(); ++i)//for(auto c : s1)    {        *i = 'X';//c = 'X';    }    cout << s1 << endl;    /************************for*************************/    string s2;    cin >> s2;    string::size_type j;    for (j = 0; j < s2.size(); ++j)    {        s2[j] = 'X';    }    cout << s2 << endl;    /***********************while*************************/    string s3;    cin >> s3;    string::size_type k = 0;    while( k < s3.size() )    {        s3[k] = 'X';        ++k;    }    cout << s3 << endl;    /*********************del punctuation**********************/    string s4;    cin >> s4;    string::size_type m = 0;    string res;/*************************非符号存放在新的string**************************/    while( m < s4.size())    {        if (!ispunct(s4[m]))        {            res += s4[m];            ++m;        }        else            ++m;    }    cout << res << endl;    return 0;}
  • 练习3.7
    没影响。
  • 练习3.9
    不合法。因为s是空的。
  • 练习3.11
    合法。c是对常量char的引用。反正没法用rangefor。
    练习3.14/3.15
#include <iostream>#include <string>#include <vector>using std::cin;using std::cout;using std::endl;using std::string;using std::vector;int main(){    //int i;    string i;    //vector<int> v;    vector<string> v;    while(cin >> i)    {        v.push_back(i);    }    return 0;}
  • 练习3.16
#include <iostream>#include <string>#include <vector>using std::cin;using std::cout;using std::string;using std::vector;using std::endl;int main(){    vector<int> v1;    vector<int> v2(10);    vector<int> v3(10, 42);//10    //vector<int> v4{10};    //vector<int> v5{10, 42};//2    //vector<string> v6{10};    //vector<string> v7{10, "hi"};    int s1 = v1.size();    int s2 = v2.size();    int s3 = v3.size();    int i = 0;    while (i < v2.size())    {        cout << v2[i] << " ";        ++i;    }    cout << endl;    int j = 0;    while (j < v3.size())    {        cout << v3[j] << " ";        ++j;    }    cout << endl << s1 << " " << s2 << " " << s3 <<endl;}
  • 练习3.17
#include<iostream>#include <vector>#include <string>using std::cin;using std::cout;using std::vector;using std::string;using std::endl;int main(){    string word;    vector<string> v;//v中保存string对象 初始v为空    while (cin >> word)//当有string对象word输入时    {        v.push_back(word);//把word push到对象尾端    }    decltype(v.size()) i = 0;//计数器    vector<string> v2;//v2中保存string对象,用来存toupper后的v    while (i < v.size())//对于容器v中的每一个string对象    {        decltype(v[i].size()) j = 0;        while (j < v[i].size())//对于该string对象的每一个字符        {            v[i][j] = toupper(v[i][j]);//大写            ++j;//计数        }        cout << v[i] << endl;        ++i;//计数    }    return 0;}
  • 练习3.18
    不合法。ivec是一个空vector,根本不包含任何元素,不能通过下标去访问任何元素,正确的方法是用push_back。
  • 练习3.19
    1.vector ivec(10, 42);
    2.vector ivec{42,42,42,42,42,42,42,42,42,42};
    3.vector ivec;
    for(int i = 0; i != 10; ++i)
    ivec.push_back(42);

  • 练习3.20
    a)

#include <iostream>#include <vector>#include <string>using std::cin;using std::cout;using std::string;using std::vector;using std::endl;int main(){    int num;    vector<int> v;    while (cin >> num)//读入一组整数    {        v.push_back(num);    }    decltype(v.size()) i = 0;    decltype(v.size()) vs = v.size();    vector<int> res;    //相邻数相加    while (i < v.size() - 1)    {        int m = v[i] + v[i + 1];        res.push_back(m);        i = i + 2;    }    if (vs / 2 != 0)//如果有奇数个数    {        res.push_back(v[vs - 1]);    }    //输出容器res中存放的结果    decltype(res.size()) k = 0;    while (k < res.size())    {        cout << res[k];        ++k;    }    return 0;}

b)

#include <iostream>#include <vector>#include <string>using std::cin;using std::cout;using std::string;using std::vector;using std::endl;int main(){    int num;    vector<int> v;    while (cin >> num)//读入一组整数    {        v.push_back(num);    }    decltype(v.size()) i = 0;    decltype(v.size()) vs = v.size();    vector<int> res;    //相邻数相加    //while (i < v.size() - 1)    //{    //  int m = v[i] + v[i + 1];    //  res.push_back(m);    //  i = i + 2;    //}    //首尾相加    while (i < vs/2 )    {        int m = v[i] + v[vs - 1 - i];        res.push_back(m);        ++i;    }    //如果是奇数个    if (vs %2 != 0)    {        res.push_back(v[vs / 2]);    }    //if (vs % 2 != 0)//如果有奇数个数    //{    //  res.push_back(v[vs - 1]);    //}    //输出容器res中存放的结果    decltype(res.size()) k = 0;    while (k < res.size())    {        cout << res[k];        ++k;    }    return 0;}
  • 练习3.21
#include <iostream>#include <string>#include <vector>using std::cin;using std::cout;using std::string;using std::vector;using std::endl;int main(){    vector<int> v1;    vector<int> v2(10);    vector<int> v3(10, 42);    vector<int> v4{ 10 };    vector<int> v5{ 10, 42 };    vector<string> v6{ 10 };    vector<string> v7{ 10, "hi" };    //v2    int cnt = 0;    for (auto it = v2.begin(); it != v2.end();++it)    {        cout << (*it) << " ";        ++cnt;    }    cout << endl << cnt << endl;    //v3    int c3 = 0;    for (auto it = v3.begin(); it != v3.end();++it)    {        cout << (*it) << " ";        ++c3;    }    cout << endl << c3 << endl;    //v4    int c4 = 0;    for (auto it = v4.begin(); it != v4.end(); ++it)    {        cout << (*it) << " ";        ++c4;    }    cout << endl << c4 << endl;    //v5    int c5 = 0;    for (auto it = v5.begin(); it != v5.end(); ++it)    {        cout << (*it) << " ";        ++c5;    }    cout << endl << c5 << endl;    //v6    int c6 = 0;    for (auto it = v6.begin(); it != v6.end(); ++it)    {        cout << (*it) << " ";        ++c6;    }    cout << endl << c6 << endl;    //v7    int c7 = 0;    for (auto it = v7.begin(); it != v7.end(); ++it)    {        cout << (*it) << " ";        ++c7;    }    cout << endl << c7 << endl;    return 0;}

结果:

  • 练习3.22
#include <iostream>#include <vector>#include <string>using std::cin;using std::cout;using std::string;using std::vector;using std::endl;int main(){    vector<string> text;    string word;    while (cin >> word)//向text里面push_back字符串word    {        text.push_back(word);    }    for (auto it = text.begin(); it != text.end() && !it ->empty(); ++it)//对于vector容器text里的每一个string成员    {        decltype(it->size()) i;        for (i = 0; i != it->size(); ++i)//对于每一个string成员的每个字符        {            (*it)[i] = toupper((*it)[i]);//大写        }        cout << *it << endl;//输出    }    return 0;}
  • 练习3.23
#include <iostream>#include <string>#include <vector>using std::cin;using std::cout;using std::vector;using std::string;using std::endl;int main(){    vector<int> v;//不能用v(10),否则前十个数都是0    int dig;    while (cin >> dig)    {        v.push_back(dig);//向vetor容器v中push_back数字    }    for (auto i = v.begin(); i != v.end(); ++i)    {        *i = 2 * (*i);        cout << *i << " ";    }    return 0;}

练习3.24
a)

#include <iostream>#include <vector>#include <string>using std::cin;using std::cout;using std::string;using std::vector;using std::endl;int main(){    vector<int> v;    vector<int> res;    int dig;    while (cin >> dig)    {        v.push_back(dig);    }    int sum = 0;    int size = v.size();    if (size %2 == 0)//输入偶数个整数    {        for (auto it = v.begin(); it != v.end(); ++it)        {            sum = *it;            it += 1;            sum += *it;            res.push_back(sum);            cout << sum << " ";        }        cout << endl;    }    else    {        for (auto it = v.begin(); it != v.end() - 1; ++it)        {            sum = *it;            it += 1;            sum += *it;            res.push_back(sum);            cout << sum << " ";        }        auto i = v.end();        cout << *(i - 1) << endl;    }    return 0;}

b)

#include <iostream>#include <vector>#include <string>using std::cin;using std::cout;using std::string;using std::vector;using std::endl;int main(){    vector<int> v;    vector<int> res;    int dig;    while (cin >> dig)    {        v.push_back(dig);    }    int sum = 0;    int size = v.size();    auto mid = v.begin() + (v.end() - v.begin()) / 2;    auto i2 = v.end() - 1;    if (size % 2 == 0)//输入偶数个整数    {        for (auto it = v.begin(); it != mid; ++it)        {            sum = *it + *i2;            --i2;            cout << sum << " ";        }        cout << endl;    }    else    {        for (auto it = v.begin(); it != mid; ++it)        {            sum = *it + *i2;            --i2;            cout << sum << " ";        }        cout << *(mid) << endl;    }    return 0;}
  • 练习3.25
#include <iostream>#include <vector>#include <string>using std::cin;using std::cout;using std::string;using std::vector;using std::endl;int main(){    vector<int> scores(11, 0);//11个人数段    unsigned grade;    auto it = scores.begin();    while (cin >> grade)//有成绩输入    {        if (grade <= 100)        {            int n = grade / 10;            *(it + n ) += 1;        }    }    for (auto i = scores.begin(); i != scores.end(); ++i)    {        cout << *i << " ";    }    return 0;}
  • 练习3.26

因为用(beg + end)的话,结果可能会超出总长度,指向未知的位置,VS2013报错。

0 0
原创粉丝点击