• C++ Primer第5版 第三章课后练习答案


    练习3.1

    #include <iostream>
    using namespace std;
    int main()
    {
        int sum = 0, val = 50;
        while (val <= 100) {
            sum += val;
            ++val;
        }
        cout << "Sum of 50 to 100 inclusive is " << sum << std::endl;
        return 0;
    }
    #include <iostream>
    using namespace std;
    int main()
    {
        int val = 10;
        while (val >= 0) {
            cout << val-- << std::endl;
        }
        return 0;
    }
    #include <iostream>
    using namespace std;
    int main()
    {
        cout << "Please enter the two integers" << endl;
        int start, end;
        //我这里没有对传入格式进行判断,如果大家有需要可以添加这个功能
        cin >> start >> end;
        if (start > end) {
            swap(start, end);
        }
        while (start <= end) {
            cout << start++ << endl;
        }
        return 0;
    }
    #include<iostream>
    using namespace std;
    struct Sales_data {
        string bookNo;
        unsigned units_sold = { 0 };
        double revenue = { 0.0 };
    };
    int main()
    {
        Sales_data data;
        double price;
        while (cin >> data.bookNo >> data.units_sold >> price) {
            data.revenue = data.units_sold * price;
            cout << "Record:" << data.bookNo << " " << data.units_sold << " " << data.revenue << endl;
        }
    }
    #include  <iostream>
    using namespace std;
    struct Sales_data {
        string bookNo;
        unsigned units_sold = { 0 };
        double revenue = { 0.0 };
    };
    int main()
    {
        Sales_data data1, data2;
        double price;
        if (cin >> data1.bookNo >> data1.units_sold >> price) {
            data1.revenue = data1.units_sold * price;
        }
        if (cin >> data2.bookNo >> data2.units_sold >> price) {
            data2.revenue = data2.units_sold * price;
        }
        if (data1.bookNo == data2.bookNo) {
            unsigned totalCnt = data1.units_sold + data2.units_sold;
            double totalRevenue = data1.revenue + data2.revenue;
            cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << endl;
            return 0;
        }
        else {
            return -1;
        }
    }
    #include  <iostream>
    using namespace std;
    struct Sales_data {
        string bookNo;
        unsigned units_sold = { 0 };
        double revenue = { 0.0 };
    };
    int main()
    {
        Sales_data data1, data2;
        unsigned totalCnt = 0;
        double totalRevenue = 0.0;
        double price;
        while (cin >> data1.bookNo >> data1.units_sold >> price) {
            data1.revenue = data1.units_sold * price;
            totalCnt += data1.units_sold;
            totalRevenue += data1.revenue;
        }
        cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << endl;
        return 0;
    }
    #include  <iostream>
    using namespace std;
    struct Sales_data {
        string bookNo;
        unsigned units_sold = { 0 };
        double revenue = { 0.0 };
    };
    int main()
    {
        Sales_data data1, data2;
        double price;
        if (cin >> data1.bookNo >> data1.units_sold >> price) {
            data1.revenue = data2.units_sold * price;
            int cnt = 1;
            while (cin >> data2.bookNo >> data2.units_sold >> price) {
                data1.revenue = data2.units_sold * price;
                if (data1.bookNo == data2.bookNo)
                    cnt++;
                else {
                    cout << data1.bookNo << " " << cnt << endl;
                    cnt = 1;
                    data1 = data2;
                }
            }
            cout << data1.bookNo << " " << cnt << endl;
        }
        return 0;
    }

    练习3.2

    #include  <iostream>
    #include<string>
    using std::cin;
    using std::cout;
    using std::string;
    int main()
    {
        string str,line;
        //一次读入一整行
        while (getline(cin, line)) {
            str = str + line;
        }
        cout << str;
        return 0;
    }
    #include  <iostream>
    #include<string>
    using std::cin;
    using std::cout;
    using std::string;
    int main()
    {
        string str,line;
        //一次读入一个词
        while (cin>>line) {
            str = str + line;
        }
        cout << str;
        return 0;
    }

    练习3.3

    输入运算符会自动忽略开头的空白并从第一个真正的字符读起,直到遇见下一处空白为止

    getline会从给定的输入流中读入内容,保留输入时的空白符,直到遇到换行符为止

    练习3.4

    #include  <iostream>
    #include<string>
    using std::cin;
    using std::cout;
    using std::string;
    int main()
    {
        string str1,str2;
        //一次读入一整行
        cin >> str1 >> str2;
        if (str1 == str2)cout << "相等";
        else {
            cout << (str1 > str2 ? str1 : str2);
        }
        return 0;
    }
    #include  <iostream>
    #include<string>
    using std::cin;
    using std::cout;
    using std::string;
    int main()
    {
        string str1,str2;
        //一次读入一整行
        cin >> str1 >> str2;
        if (str1.size() == str2.size())cout << "相等";
        else {
            cout << (str1.size() > str2.size() ? str1 : str2);
        }
        return 0;
    }
    #include  <iostream>
    #include<string>
    using std::cin;
    using std::cout;
    using std::string;
    int main()
    {
        string str1,str2;
        //一次读入一整行
        cin >> str1 >> str2;
        if (str1.size() == str2.size())cout << "相等";
        else {
            cout << (str1.size() > str2.size() ? str1 : str2);
        }
        return 0;
    }

    练习3.5

    #include  <iostream>
    #include<string>
    using std::cin;
    using std::cout;
    using std::string;
    int main()
    {
        string str1,str2;
        while (cin >> str1) {
            str2 += str1;
        }
        cout << str2;
        return 0;
    }
    #include  <iostream>
    #include<string>
    using std::cin;
    using std::cout;
    using std::string;
    int main()
    {
        string str1,str2;
        while (cin >> str1) {
            str1 += " ";
            str2 += str1;
        }
        cout << str2;
        return 0;
    }

    练习3.6

    #include  <iostream>
    #include<string>
    using std::cout;
    using std::string;
    int main()
    {
        string str="0123456789ABCDEF";
        for (auto& c : str) {
            c = 'X';
        }
        cout << str;
        return 0;
    }

    练习3.7

    没有变化

    #include  <iostream>
    #include<string>
    using std::cout;
    using std::string;
    int main()
    {
        string str="0123456789ABCDEF";
        for (char& c : str) {
            c = 'X';
        }
        cout << str;
        return 0;
    }

    练习3.8

    #include  <iostream>
    #include<string>
    using std::cout;
    using std::string;
    int main()
    {
        string str="0123456789ABCDEF";
        decltype(str.size()) i = 0;
        while (i < str.size()) {
            str[i++] = 'X';
        }
        cout << str;
        return 0;
    }
    #include  <iostream>
    #include<string>
    using std::cout;
    using std::string;
    int main()
    {
        string str="0123456789ABCDEF";
        for (auto i = 0; i < str.size();i++) {
            str[i] = 'X';
        }
        cout << str;
        return 0;
    }

    练习3.9

    输出默认初始化字符串s的第一个元素。不合法,因为默认初始化的字符串是空串,所以s[0]越界了。

    练习3.10

    #include  <iostream>
    #include<string>
    using std::cout;
    using std::string;
    int main()
    {
        string str="123()_+asad";
        for (string::size_type i = 0; i < str.size(); i++) {
            if (!ispunct(str[i]))
                cout << str[i];
        }
        return 0;
    }

    练习3.11

    for循环体不看后面花括号的内容,肯定是合法的,但是如果在for循环中花括号中给C赋值,修改C的值,那么此时的for语句肯定是不合法的。C的类型是const char& 

    练习3.12

    知识点:vector的初始化:

    1:引用不可以成为vector的元素,因为其不是对象。

    2:可以用花括号初始化每一个值。

    3:可以用括号指定元素个数或相同的元素值。

    4:只能使用直接初始化,不可以使用拷贝初始化(vector之间的拷贝是可行的,但要保证类型相同)

    答案:

    (a)正确,创建了一个元素为vector的vector对象

    (b)不正确,类型不一致

    (c)正确,十个“null”对象

    练习3.13

    (a)空vector

    (b)10个重复执行值初始化对象0

    (c)10个重复的元素42

    (d)1个元素初始值为10

    (e)两个元素,初始分别为10,42

    (f)10个字符串,初始化为“ ”(空)

    (g)10个字符串,初始化为“hi ”

    练习3.14

    #include  <iostream>
    #include<string>
    #include <vector>
    using std::cin;
    using std::cout;
    using std::vector;
    int main()
    {
        int num;
        vector<int> v;
        while (cin >> num) {
            v.push_back(num);
        }
        return 0;
    }

    练习3.15

    #include  <iostream>
    #include<string>
    #include <vector>
    using std::cin;
    using std::cout;
    using std::vector;
    using std::string;
    int main()
    {
        string str;
        vector<string> v;
        while (cin >> str) {
            v.push_back(str);
        }
        return 0;
    }

    练习3.16

    #include  <iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    
    #include <vector>
    using std::vector;
    
    #include<string>
    using std::string;
    
    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");
        cout << v1.size()<<" ";
        for (auto v1_item = v1.begin(); v1_item != v1.end(); v1_item++)
            cout << *v1_item << " ";
    
        cout << endl << v2.size() << " ";
        for (auto v2_item = v2.begin(); v2_item != v2.end(); v2_item++)
            cout << *v2_item << " ";
    
        cout << endl << v1.size() << " ";
        for (auto v3_item = v3.begin(); v3_item != v3.end(); v3_item++)
            cout << *v3_item << " ";
    
        cout << endl << v1.size() << " ";
        for (auto v4_item = v4.begin(); v4_item != v4.end(); v4_item++)
            cout << *v4_item << " ";
    
        cout << endl << v5.size() << " ";
        for (auto v5_item = v5.begin(); v5_item != v5.end(); v5_item++)
            cout << *v5_item << " ";
    
        cout << endl << v6.size() << " ";
        for (auto v6_item = v6.begin(); v6_item != v6.end(); v6_item++)
            cout << *v6_item << " ";
    
        cout << endl << v7.size() << " ";
        for (auto v7_item = v7.begin(); v7_item != v7.end(); v7_item++)
            cout << *v7_item << " ";
        return 0;
    }

    0
    10 0 0 0 0 0 0 0 0 0 0
    0 42 42 42 42 42 42 42 42 42 42
    0 10
    2 10 42
    10
    10 hi hi hi hi hi hi hi hi hi hi

    练习3.17

    #include  <iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    
    #include <vector>
    using std::vector;
    
    #include<string>
    using std::string;
    
    int main()
    {
        vector<string> v;
        string str;
        while (cin >> str) {
            v.push_back(str);
        }
        for (auto i = v.begin(); i != v.end(); i++) {
            str = *i;
            for (auto&c:str) {
                if (islower(c))
                    c = toupper(c);
            }
            *i = str;
        }
        for (auto v_item : v) {
            cout << v_item << endl;
        }
        return 0;
    }

    练习3.18

    不合法。

        vector<int> ivec;
        ivec.push_back(42);

    练习3.19

        vector<int> v1(10, 42);
        vector<int> v2{ 42, 42,42, 42,42, 42,42, 42, 42, 42 };
        vector<int> v3 = v2;

    第一种最好,比较简洁

    练习3.20

    #include  <iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    
    #include <vector>
    using std::vector;
    
    int main()
    {
        vector<int> v;
        int num;
        while (cin >> num) {
            v.push_back(num);
        }
        for (decltype(v.size()) i = 0; i < v.size() - 1; i++) {
            cout << (v[i] + v[i + 1]) << " ";
        }
        return 0;
    }
    #include  <iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    
    #include <vector>
    using std::vector;
    
    int main()
    {
        vector<int> v;
        int num;
        while (cin >> num) {
            v.push_back(num);
        }
        decltype(v.size()) j = v.size() - 1;
        for (decltype(v.size()) i = 0; i < v.size(); i++) {
            if (i < j - i)
                cout << (v[i] + v[j - i]) << " ";
        }
        return 0;
    }

    练习3.21

    #include  <iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    
    #include <vector>
    using std::vector;
    
    #include<string>
    using std::string;
    
    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");
        cout << v1.size()<<" ";
        for (auto v1_item = v1.begin(); v1_item != v1.end(); v1_item++)
            cout << *v1_item << " ";
    
        cout << endl << v2.size() << " ";
        for (auto v2_item = v2.begin(); v2_item != v2.end(); v2_item++)
            cout << *v2_item << " ";
    
        cout << endl << v1.size() << " ";
        for (auto v3_item = v3.begin(); v3_item != v3.end(); v3_item++)
            cout << *v3_item << " ";
    
        cout << endl << v1.size() << " ";
        for (auto v4_item = v4.begin(); v4_item != v4.end(); v4_item++)
            cout << *v4_item << " ";
    
        cout << endl << v5.size() << " ";
        for (auto v5_item = v5.begin(); v5_item != v5.end(); v5_item++)
            cout << *v5_item << " ";
    
        cout << endl << v6.size() << " ";
        for (auto v6_item = v6.begin(); v6_item != v6.end(); v6_item++)
            cout << *v6_item << " ";
    
        cout << endl << v7.size() << " ";
        for (auto v7_item = v7.begin(); v7_item != v7.end(); v7_item++)
            cout << *v7_item << " ";
        return 0;
    }

    练习3.22

    #include  <iostream>
    using std::cin;
    using std::cout;
    
    #include <vector>
    using std::vector;int main()
    {
        vector<string> v;
        string str;
        if (getline(cin,str)) {
            v.push_back(str);
        }
        for (auto i = v.begin(); i != v.end(); i++) {
            str = *i;
            for (auto& c : str) {
                if (islower(c))
                    c = toupper(c);
            }
            *i = str;
        }
        for (auto v_item : v) {
            cout << v_item << endl;
        }
        return 0;
    }

    练习3.23

    #include  <iostream>
    using std::cin;
    using std::cout;
    
    #include <vector>
    using std::vector;
    
    int main()
    {
        vector<int> v;
        int num;
        for (unsigned i = 0; i < 10; i++) {
            cin >> num;
            v.push_back(num);
        }
        for (auto& v_item : v) {
            v_item *= 2;
        }
        for (auto v_item : v) {
            cout << v_item << " ";
        }
        return 0;
    }

    练习3.24

    #include  <iostream>
    using std::cin;
    using std::cout;
    
    #include <vector>
    using std::vector;
    
    int main()
    {
        vector<int> v;
        int num;
        while (cin >> num) {
            v.push_back(num);
        }
        for (auto i = v.begin(), j = v.end() - 1; i < j; i++,j--) {
            cout << (*i + *j) << " ";
        }
        return 0;
    }

    练习3.25

    #include  <iostream>
    using std::cin;
    using std::cout;
    
    #include <vector>
    using std::vector;
    
    int main()
    {
        vector<unsigned> scores(11,0);
        unsigned grade;
        while (cin >> grade) {
            if (grade <= 100) {
                auto it = (scores.begin() + grade / 10);
                (*it)++;
            }
        }
        return 0;
    }

    练习3.26

    迭代器不支持除法运算

    练习3.27

    (a)非法,buf_size不是常量表达式

    (c)非法,txt_size返回值是int而不是constexpr

    练习3.28

    在函数体外初始化

    sa数组为空。

    ia数组含有10个整数,皆为0。

    在函数体内初始化

    sa2数组为空。

    ia2数组含有10个整数,值不确定。

    练习3.29

    数组的大小确定不变,不能随意向数组中增加元素,因此损失了一些灵活性

    练习3.30

    第三行"ix<=array_size"数组下标越界

    练习3.31

    #include  <iostream>
    
    int main()
    {
        int array_int[10];
        for (size_t i = 0; i < 10; i++) {
            array_int[i] = i;
        }
        return 0;
    }

    练习3.32

    #include  <iostream>
    using std::cout;
    
    int main()
    {
        int array_int[10];
        for (size_t i = 0; i < 10; i++) {
            array_int[i] = i;
        }
        int array_int2[10];
        for (size_t i = 0; i < 10; i++) {
            array_int2[i] = array_int[i];
        }
        return 0;
    }
    #include  <iostream>
    
    #include<vector>
    using std::vector;
    
    int main()
    {
        vector<int> array_int(10);
        auto array_int_item = array_int.begin();
        for (size_t i = 0; i < 10; i++) {
            *(array_int_item+i) = i;
        }
        vector<int> array_int2(array_int);
        return 0;
    }

    练习3.33

    在函数体内不初始化值就是未知的。

    练习3.34

    将p1指向的元素修改为p2指向的元素,由于p1和p2指向同一个数组中的元素,所以没有改变。当p1或p2其中一个越界时该程序是非法的

    练习3.35

    #include  <iostream>
    
    
    #include<iterator>
    using std::begin;
    using std::end;
    
    int main()
    {
        int array_int[10];
        auto* pend = end(array_int);
        for (auto pben = begin(array_int); pben != pend; pben++) {
            *pben = 0;
        }
        return 0;
    }

    练习3.36

    template <typename _Container,unsigned N,unsigned M>
    bool comptr(_Container(&ptr1)[N], _Container(&ptr2)[M]) {
        if (N == M) {//比较数组长度
            auto pend = end(ptr1);
            for (auto ptr1_item = ptr1, ptr2_item = ptr2; ptr1_item != pend; ptr1_item++, ptr2_item++) {
                if (*ptr1_item != *ptr2_item)return false;
            }
            return true;
        }
        return false;
    }
    template <typename _Container>
    bool comptr(_Container(&ptr1), _Container(&ptr2)) {
        if (ptr1.size()==ptr2.size()) {
            for (auto ptr1_item = ptr1.begin(), ptr2_item = ptr2.begin(); ptr1_item != ptr1.end(); ptr1_item++, ptr2_item++) {
                if (*ptr1_item != *ptr2_item)return false;
            }
            return true;
        }
        return false;
    }

    练习3.37

    h
    e
    l
    l
    o

    练习3.38

    指针指代的是对象的地址,相加是地址相加,难以区分到底什么意义。

    练习3.39

    C++风格的字符串比较是字符串本身的比较

    C风格的字符串比较是字符串首地址的比较

    练习3.40

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    void main()
    {    
        char a[100] = "Hello World";
        char b[100] = "I want an apple";
        char c[200];
        strcpy(c,a);
        strcat(c," ");
        strcat(c,b);
        cout<<c;
    }

    练习3.41

    #include  <iostream>
    using std::cout;
    using std::endl;
    
    #include<iterator>
    using std::begin;
    using std::end;
    
    #include <vector>
    using std::vector;
        
    int main()
    {
        int array_int[] = { 0,1,2,3,4 };
        vector<int> v(begin(array_int), end(array_int));
    }

    练习3.42

    void vector_to_array(vector<int>::iterator it, size_t& size) {
        int* array_int = new int[size];
        for (auto i = 0; i < size; i++) {
            array_int[i] = *(it + i);
            cout << array_int[i]<<" ";
        }
    }

    练习3.43

        for (int(&p)[4] : ia) {
            for (int q : p) {
                cout << q << " ";
            }
            cout << endl;
        }
    
        for (int p = 0; p < 3; p++) {
            for (int q = 0; q < 4; q++) {
                cout << ia[p][q] << " ";
            }
            cout << endl;
        }
    
        for (int(*p)[4] = ia; p < ia + 3; p++) {
            for (int* q = *p; q < *p + 4; q++) {
                cout << *q << " ";
            }
            cout << endl;
        }

    练习3.44

        using int_array = int[4];
        for (int_array(&p) : ia) {
            for (int q : p) {
                cout << q << " ";
            }
            cout << endl;
        }
    
        for (int p = 0; p < 3; p++) {
            for (int q = 0; q < 4; q++) {
                cout << ia[p][q] << " ";
            }
            cout << endl;
        }
    
        for (int_array(*p) = ia; p < ia + 3; p++) {
            for (int* q = *p; q < *p + 4; q++) {
                cout << *q << " ";
            }
            cout << endl;
        }

    练习3.45

        for (auto (&p) : ia) {
            for (auto q : p) {
                cout << q << " ";
            }
            cout << endl;
        }
    
        for (auto p = 0; p < 3; p++) {
            for (auto q = 0; q < 4; q++) {
                cout << ia[p][q] << " ";
            }
            cout << endl;
        }
    
        for (auto (*p) = ia; p < ia + 3; p++) {
            for (auto* q = *p; q < *p + 4; q++) {
                cout << *q << " ";
            }
            cout << endl;
        }
  • 相关阅读:
    [汇编与C语言关系]1.函数调用
    深入理解计算机系统
    设计模式
    深度探索C++对象模型
    More Effective C++
    MySQL必知必会
    数据结构与算法分析
    Java编程思想(后)
    Java编程思想(前十章)
    Java 入门
  • 原文地址:https://www.cnblogs.com/GodZhuan/p/13823684.html
Copyright © 2020-2023  润新知