C++Primer第五版 习题答案 第三章 字符串、向量和数组(Strings, Vectors, and Arrays)

3.1

3.1.1

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    int i = 50 ,sum = 0;

    while(i <= 100)
    {
        sum += i;
        ++i;
    }
    cout << sum << endl;

    return 0;
}

3.1.2

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    int i = 10 ,sum = 0;

    while(i >= 0)
    {
        sum += i;
        --i;
    }
    cout << sum << endl;

    return 0;
}

3.1.3

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
    int small = 0, big = 0;
    cout << "please input two integers:";
    cin >> small >> big;

    if (small > big) {
        int tmp = small;
        small = big;
        big = tmp;
    }

    while (small <= big) {
        cout << small << " ";
        ++small;
    }
    cout << endl;

    return 0;
}

3.1.4

#include <iostream>
#include <string>
#include "../ch02/ex2_42.h"

using std::cin;
using std::cout;
using std::endl;
using std::cerr;

int main()
{
    Sales_data data1, data2;

    // code to read into data1 and data2
    double price = 0;  // price per book, used to calculate total revenue

    // read the first transactions: ISBN, number of books sold, price per book 
    cin >> data1.bookNo >> data1.units_sold >> price;
    // calculate total revenue from price and units_sold
    data1.revenue = data1.units_sold * price;

    // read the second transaction
    cin >> data2.bookNo >> data2.units_sold >> price;
    data2.revenue = data2.units_sold * price;

    // code to check whether data1 and data2 have the same ISBN
    //        and if so print the sum of data1 and data2
    if (data1.bookNo == data2.bookNo)
    {
        unsigned totalCnt = data1.units_sold + data2.units_sold;
        double totalRevenue = data1.revenue + data2.revenue;

        // print: ISBN, total sold, total revenue, average price per book
        cout << data1.bookNo << " " << totalCnt
            << " " << totalRevenue << " ";
        if (totalCnt != 0)
            cout << totalRevenue / totalCnt << endl;
        else
            cout << "(no sales)" << endl;

        return 0;  // indicate success
    }
    else
    {  // transactions weren't for the same ISBN
        cerr << "Data must refer to the same ISBN" << endl;
        return -1; // indicate failure
    }
}

3.2

3.2.1

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
    std::string str_in;
    while(getline(cin,str_in))
    {
        cout << str_in << endl;
    }

    return 0;
}

3.2.2

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
    std::string str_in;

    while(cin>>str_in)
    {
        cout << str_in << endl;
    }
    return 0;
}

3.3

输入运算符碰到空格、回车和制表符,忽略前面空白;getline碰到回车,不忽略空白

3.4

3.4.1

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
    std::string str_in1,str_in2;

    cin>>str_in1>>str_in2;

    if(str_in1.size() != str_in2.size())
    {
        if(str_in1.size()>str_in2.size())
        {
            cout << str_in1 << endl;
        }else
        {
            cout << str_in2 << endl;
        }
    }

    return 0;
}

3.4.2

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
    std::string str_in1,str_in2;

    cin>>str_in1>>str_in2;

    if(str_in1.size() != str_in2.size())
    {
        if(str_in1.size()>str_in2.size())
        {
            cout << str_in1 << endl;
        }else
        {
            cout << str_in2 << endl;
        }
    }

    return 0;
}

3.5

3.5.1

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
    std::string str_in,str_sum;

    while(cin>>str_in)
    {
        str_sum = str_sum + str_in;
    }
    cout << str_sum << endl;
    return 0;
}

3.5.2

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
    std::string str_in,str_sum;

    while(cin>>str_in)
    {
        str_sum = str_sum + str_in + " ";
    }
    cout << str_sum << endl;
    return 0;
}

3.6

#include <string>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main()
{
    string str = "1122aabbcc 33";

    for(auto &c : str)
    {
        c = 'X';
    }
    cout<<str<<endl;

    return 0;
}

3.7

改为char后,在范围for循环中,改变的str中字符c的副本,因此,str并不会改变。

#include <string>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main()
{
    string str = "1122aabbcc 33";

    for(char c : str)
    {
        c = 'X';
    }
    cout<<str<<endl;

    return 0;
}

3.8

个人感觉范围for循环更好,更简洁,且声明的变量作用域在范围for循环内,不会对其他程序产生影响。

3.8.1

#include <string>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main()
{
    string str = "1122aabbcc 33";

    for(string::size_type index = 0;index < str.size();++index)
    {
        str[index] = 'X';
    }
    cout<<str<<endl;

    return 0;
}

3.8.2

#include <string>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main()
{
    string str = "1122aabbcc 33";

    string::size_type index = 0;
    while(str[index]!='\0')
    {
        str[index] = 'X';
        index++;
    }
    cout<<str<<endl;

    return 0;
}

3.9

合法,定义后就占用一个字节,包含’\0’。

3.10

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main()
{
    std::string str_in,str;
    cin>>str_in;
    for(auto c : str_in)
        if(!ispunct(c))
            str = str + c;
    cout << str << endl;
    return 0;
}

3.11

合法,对const char的引用,但是不能改变c。

3.12

(a)正确,创建了元素为vector的vector对象;
(b)错误,vector元素类型不一致;
(c)正确,创建了一个包含10个元素为“null”的vector对象。

3.13

(a)包含0个元素;(b)包含10个元素,值都为0;
(c)包含10个元素,值都为42;(d)包含1个元素,值为10;
(e)包含2个元素,值为10,42;(f)包含10个元素,空字符串;(g)包含10个元素,值都为“hi”。

3.14

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main()
{
    vector<int> iv;
    int i;

    while(cin >> i)
    {
        iv.push_back(i);
        // cout << i << endl;
    }

    return 0;
}

3.15

#include <string>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main()
{
    vector<string> sv;
    string str;

    while(cin >> str)
    {
        sv.push_back(str);
        // cout << str << endl;
    }

    return 0;
}

3.16

#include <string>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

// void print_vector(vector<int> v)
// {
//     cout << v.size() << endl;
//     for(auto c : v)
//     {
//         cout << c;
//     }
//     cout << endl;
// }

int main()
{
    vector<int> v1;
    // print_vector(v1);
    cout << v1.size() << endl;
    for(auto c : v1)
    {
        cout << c <<' ';
    }
    cout << endl;

    vector<int> v2(10);
    cout << v2.size() << endl;
    for(auto c : v2)
    {
        cout << c <<' ';
    }
    cout << endl;

    vector<int> v3(10,42);
    cout << v3.size() << endl;
    for(auto c : v3)
    {
        cout << c <<' ';
    }
    cout << endl;

    vector<int> v4{10};
    cout << v4.size() << endl;
    for(auto c : v4)
    {
        cout << c <<' ';
    }
    cout << endl;

    vector<int> v5{10,42};
    cout << v5.size() << endl;
    for(auto c : v5)
    {
        cout << c <<' ';
    }
    cout << endl;

    vector<string> v6{10};
    cout << v6.size() << endl;
    for(auto c : v6)
    {
        cout << c <<' ';
    }
    cout << endl;

    vector<string> v7{10,"hi"};
    cout << v7.size() << endl;
    for(auto c : v7)
    {
        cout << c <<' ';
    }
    cout << endl;

    return 0;
}

3.17

#include <string>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main()
{
    vector<string> str_v;
    string s;
    while(cin >> s)
    {
        str_v.push_back(s);
    }

    for(auto &c1 : str_v)
    {
        for(auto &c2 : c1)
        {
            c2 = toupper(c2);
        }
    }

    for(auto c : str_v)
    {
        cout << c <<endl;
    }

    return 0;
}

3.18

不合法,第2行改为:ivec.push_back(10)。

3.19

vector<int> ivec1(10,42);   //最好,大量重复值,简洁
vector<int> ivec2{ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42};
vector<int> ivec3 = { 42, 42, 42, 42, 42, 42, 42, 42, 42, 42};
vector<int> ivec4(ivec1);
vector<int> ivec4 = ivec1;

3.20

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main()
{
    vector<int> i_v,sum1_v,sum2_v;
    int i;
    while(cin >> i)
    {
        i_v.push_back(i);
    }

    for(decltype(i_v.size()) index = 0;index < i_v.size()-1;index++)
    {
        sum1_v.push_back(i_v[index] + i_v[index + 1]);
    }
    for(auto c : sum1_v)
    {
        cout << c <<" ";
    }
    cout << endl;

    for(decltype(i_v.size()) index = 0;index < i_v.size()/2 + 1;index++)
    {
        sum2_v.push_back(i_v[index] + i_v[i_v.size() - index - 1]);
    }
    for(auto c : sum2_v)
    {
        cout << c <<" ";
    }
    cout << endl;
    return 0;
}

3.21

#include <string>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main()
{
    vector<int> v1;
    cout << v1.size() << endl;
    for(auto it = v1.begin();it != v1.end();++it)
    {
        cout << *it << ' ';
    }
    cout << endl;

    vector<int> v2(10);
    cout << v2.size() << endl;
    for(auto it = v2.begin();it != v2.end();++it)
    {
        cout << *it << ' ';
    }
    cout << endl;

    vector<int> v3(10,42);
    cout << v3.size() << endl;
    for(auto it = v3.begin();it != v3.end();++it)
    {
        cout << *it << ' ';
    }
    cout << endl;

    vector<int> v4{10};
    cout << v4.size() << endl;
    for(auto it = v4.begin();it != v4.end();++it)
    {
        cout << *it << ' ';
    }
    cout << endl;

    vector<int> v5{10,42};
    cout << v5.size() << endl;
    for(auto it = v5.begin();it != v5.end();++it)
    {
        cout << *it << ' ';
    }
    cout << endl;

    vector<string> v6{10};
    cout << v6.size() << endl;
    for(auto it = v6.begin();it != v6.end();++it)
    {
        cout << *it << ' ';
    }
    cout << endl;

    vector<string> v7{10,"hi"};
    cout << v7.size() << endl;
    for(auto it = v7.begin();it != v7.end();++it)
    {
        cout << *it << ' ';
    }
    cout << endl;

    return 0;
}

3.22

#include <string>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main()
{
    vector<string> text{"abcd,efg","","AAaa"};
    for(auto it = text.begin();it != text.end() && !it->empty();++it)
    {
        for(auto &c : *it)
            c = toupper(c);
    }

    for(auto it = text.begin();it != text.end();++it)
    {
        cout << *it << endl;
    }

    return 0;
}

3.23

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main()
{
    vector<int> text{0,1,2,3,4,5,6,7,8,9};
    for(auto it = text.begin();it != text.end();++it)
    {
        *it = *it * 2;
    }

    for(auto it = text.begin();it != text.end();++it)
    {
        cout << *it << endl;
    }

    return 0;
}

3.24

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main()
{
    vector<int> i_v,sum1_v,sum2_v;
    int i;
    while(cin >> i)
    {
        i_v.push_back(i);
    }

    for(auto it = i_v.begin();it+1 != i_v.end();++it)
    {
        sum1_v.push_back(*it + *(it+1));
    }
    for(auto c : sum1_v)
    {
        cout << c <<" ";
    }
    cout << endl;

    for(auto it_begin = i_v.begin(),it_end = i_v.end()-1;it_begin <= it_end;++it_begin,--it_end)
    {
        sum2_v.push_back(*it_begin + *it_end);
    }
    for(auto c : sum2_v)
    {
        cout << c <<" ";
    }
    cout << endl;
    return 0;
}

3.25

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main()
{
    vector<unsigned> score(11,0);
    unsigned int grade;
    auto it = score.begin();
    while(cin >> grade)
    {
        (*(it + grade/10))++;
        cout << grade/10 << endl;
    }
    for(auto e : score)
    {
        cout << e <<" ";
    }
    cout << endl;
    return 0;
}

3.26

迭代器相加不成立,指针加指针无意义。

3.27

(a)非法;(b)合法;
(c)非法;(d)非法。

3.28

sa:空字符串;
ia:0;
sa2:空字符串;
ia2:不确定值。

3.29

数组的缺点:数组的大小是确定不变的,不能随意向数组中增加元素,丧失了vectoer的灵活性,没有API,风险更大。

3.30

数组越界ix < array_size。

3.31

#include <cstddef>
#include <iostream>

using std::cout;
using std::endl;

int main()
{
    int ia[10];
    for(size_t i = 0;i<10;i++) ia[i] = i;

    for(auto i : ia) cout << i << " ";
    cout << endl;

    return 0;
}

3.32

#include <cstddef>
#include <iostream>
#include <vector>

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

int main()
{
    int ia[10];
    for(size_t i = 0;i<10;++i) ia[i] = i;

    int ia2[10];
    for(size_t i = 0;i<10;++i) ia2[i] = ia[i];

    for(auto i : ia) cout << i << " ";
    cout << endl;

    vector<int> iv1;
    for(decltype(iv1.size()) index = 0;index < 10;++index) iv1.push_back(index);

    vector<int> iv2(iv1);
    for(auto e : iv2) cout << e << " ";
    cout << endl;

    return 0;
}

3.33

数组的值为不确定的。

3.34

将p1移动(p2-p1)个位置;p1或p2是非法的,该程序就是非法的。

3.35

#include <cstddef>
#include <iostream>
#include <vector>

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

int main()
{
    int ia[10];
    for(size_t i = 0;i<10;++i) ia[i] = i;
    for(auto i : ia) cout << i << " ";
    cout << endl;

    for(int i = 0,*pa = ia;i<10;++i)
    {
        *pa = 0;
        ++pa;
    }

    for(auto i : ia) cout << i << " ";
    cout << endl;

    return 0;
}

3.36

#include <iostream>
#include <vector>
#include <iterator>

using std::cout;
using std::endl;
using std::vector;
using std::end;
using std::begin;

//need int[] size
// bool compare_int(int const ia1[],int const ia2[])
// {
//     if(sizeof(ia1) == sizeof(ia2))
//     {

//         cout << sizeof(ia1) << sizeof(ia2) << endl;
//         for(int i = 0;i != sizeof(ia1)/sizeof(int);i++)
//         {
//             cout << ia1[i] << " " << ia2[i] << endl;
//             if(ia1[i] != ia2[i])
//             {
//                 return false;
//             }
//         }
//         return true;
//     }else
//     {
//         return false;
//     }
// }

bool compare_int(int *ia1_begin,int *ia1_end,int *ia2_begin,int *ia2_end)
{
    cout << ia1_end - ia1_begin << " " << ia2_end - ia2_begin <<endl;
    if((ia1_end - ia1_begin) == (ia2_end - ia2_begin))
    {
        for(int *i = ia1_begin,*j = ia2_begin;i != ia1_end,j != ia2_end;++i,++j)
        {
            if(*i != *j)
            {
                return false;
            }
        }
        return true;
    }else
    {
        return false;
    }
}

int main()
{

    int ia1[10] = {1,2,3};
    int ia2[9] = {1,2,3};

    if(compare_int(begin(ia1),end(ia1),begin(ia2),end(ia2)))
    {
        cout << "equal" << endl;
    }else
    {
        cout << "not equal" << endl;

    }

    vector<int> iv1{1,2,3,4};
    vector<int> iv2{1,2,3};
    if(iv1 == iv2)
    {
        cout << "equal" << endl;
    }else
    {
        cout << "not equal" << endl;
    }

    return 0;
}

3.37

没有’\0’,循环可能不会停止,将会打印出垃圾信息(存在风险)。

3.38

指针相加实际为地址相加,没有什么意义。

3.39

#include <iostream>
#include <string>
#include <cstring>

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


int main()
{
    string s1 = "aabb";
    string s2 = "aabb";

    if(s1 == s2)
    {
        cout << "equal" << endl;
    }else
    {
        cout << "not equal" << endl;
    }

    const char ca1[] = {'a','b','c'};
    const char ca2[] = "abc";

    if(strcmp(ca1,ca2) == 0)
    {
        cout << "equal" <<endl;
    }else
    {
        cout << "not equal" <<endl;
    }

    return 0;
}

3.40

#include <iostream>
#include <string>
#include <cstring>

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

int main()
{
    char ca1[] = "aaa";
    char ca2[] = "abc";
    char ca3[10];

    strcpy(ca3,ca1);
    strcat(ca3,ca2);

    cout << ca3 << endl;

    return 0;
}

3.41

#include <iostream>
#include <vector>
#include <iterator>

using std::cout;
using std::endl;
using std::vector;
using std::begin;
using std::end;

int main()
{
    int ia[] = {1,2,3};
    vector<int> iv(begin(ia),end(ia));

    for(auto e : iv)
        cout << e << " ";
    cout << endl;

    return 0;
}

3.42

#include <iostream>
#include <vector>

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

int main()
{
    vector<int> iv(3,2);
    int ia[3];

    for(int i = 0;i < 3;++i) ia[i] = iv[i];

    for(auto i : ia)
        cout << i << " ";
    cout << endl;

    return 0;
}

3.43

#include <iostream>
#include <cstddef>
#include <iterator>

using std::cout;
using std::endl;
using std::begin;
using std::end;

int main()
{
    int ia[3][4] = {
        {0,1,2,3},
        {4,5,6,7},
        {8,9,10,11}
    };

    for(const int (&i)[4]:ia)
        for(int j:i)
            cout << j << " ";
    cout << endl;

    for(size_t i = 0;i < 3;++i)
        for(size_t j = 0;j < 4;++j)
            cout << ia[i][j] << " ";
    cout << endl;

    for(int (*i)[4] = begin(ia);i != end(ia);i++)
        for(int *j = begin(*i);j != end(*i);j++)
            cout << *j << " ";
    cout << endl;

    return 0;
}

3.44

#include <iostream>
#include <cstddef>
#include <iterator>

using std::cout;
using std::endl;
using std::begin;
using std::end;

int main()
{
    typedef int int_array[4];
    // using int_array = int[4];
    int ia[3][4] = {
        {0,1,2,3},
        {4,5,6,7},
        {8,9,10,11}
    };

    for(const int_array &i:ia)
        for(int j:i)
            cout << j << " ";
    cout << endl;

    for(size_t i = 0;i < 3;++i)
        for(size_t j = 0;j < 4;++j)
            cout << ia[i][j] << " ";
    cout << endl;

    for(int_array *i = begin(ia);i != end(ia);i++)
        for(int *j = begin(*i);j != end(*i);j++)
            cout << *j << " ";
    cout << endl;

    return 0;
}

3.45

#include <iostream>
#include <cstddef>
#include <iterator>

using std::cout;
using std::endl;
using std::begin;
using std::end;

int main()
{
    int ia[3][4] = {
        {0,1,2,3},
        {4,5,6,7},
        {8,9,10,11}
    };

    for(const auto &i:ia)
        for(int j:i)
            cout << j << " ";
    cout << endl;

    for(size_t i = 0;i < 3;++i)
        for(size_t j = 0;j < 4;++j)
            cout << ia[i][j] << " ";
    cout << endl;

    for(auto *i = begin(ia);i != end(ia);i++)
        for(int *j = begin(*i);j != end(*i);j++)
            cout << *j << " ";
    cout << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/shamozhizhoutx/article/details/81590540