《C++ Primer》5th 课后练习 第三章 字符串、向量和数组 31~40

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40758751/article/details/102733547

练习3.31 编写一段程序,定义一个含有10个int的数组,令每个元素的值就是其下标值。

#include<cstddef>
#include<iostream>
using namespace std;
int main()
{
    constexpr size_t arr_size = 10;
    int arr[arr_size] = {};
    for (int i = 0; i < arr_size; i++)
    {
        arr[i] = i;
    }
    return 0;
}

练习3.32 将上一题刚刚创建的数组拷贝给另一数组。利用vector重写程序,实现类似的功能。

#include<cstddef>
#include<iostream>
using namespace std;
int main()
{
    constexpr size_t arr_size = 10;
    int arr1[arr_size] = {};
    for (int i = 0; i < arr_size; i++)
        arr1[i] = i;
    
    int arr2[arr_size];
    for (int i = 0; i < arr_size; i++)
        arr2[i] = arr1[i];

    vector<int> vec1;
    for (int i = 0; i < 10; i++)
        vec1.push_back(i);
    vector<int> vec2 = vec1;
    return 0;
}

练习3.33 对于104页的程序来说,如果不初始化scores将会发生什么?

scores中的值全部未定义。

练习3.34 假定p1 和 p2 都指向同一个数组中的元素,则下面程序的功能是什么?什么情况下该程序是非法的?

p1 += p2 - p1;

功能是将p1指向p2,不会非法。 //等价于 p1 = p1 + (p2-p1);

练习3.35 编写一段程序,利用指针将数组中的元素置为0。

#include<iterator>
using namespace std;
int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int *beg = begin(arr), *last = end(arr);
    while (beg != last)
    {
        *beg = 0;
        ++beg;
    }
    return 0;
}

练习3.36 编写一段程序,比较两个数组是否相等。再写一段程序,比较两个vector对象是否相等。

#include<iostream>
#include<iterator>
#include<vector>
using namespace std;
int main()
{
    int arr1[] = {1, 2, 3, 4, 5};
    int arr2[] = { 1, 2, 3, 4, 5 };
    int *pbeg1 = begin(arr1), *pend1 = end(arr1);
    int *pbeg2 = begin(arr2), *pend2 = end(arr2);
    bool flag1 = true;
    if (pend1 - pbeg1 == pend2 - pbeg2)
    {
        while (pbeg1 != pend1 && pbeg2 != pend2)
        {
            if (*pbeg1 != *pbeg2)
            {
                flag1 = false;
                break;
            }
            pbeg1++;pbeg2++;
        }
    }
    else
    {
        flag1 = false;
    }
    vector<int> vec1(5, 42);
    vector<int> vec2(5, 42);
    bool flag2 = true;
    if (vec1 != vec2)
        flag2 = false;
    cout << flag1 << " " << flag2 << endl;
    return 0;
}

练习3.37 下面的程序是何含义,程序的输出结果是什么?

const char ca[] = { 'h', 'e', 'l', 'l', 'o' };
const char *cp = ca;
while (*cp) {
    cout << *cp << endl;
    ++cp;
}

会将ca 字符数组中的元素打印出来。但是因为没有空字符的存在,程序会一直打印到空字符退出循环。

练习3.38 在本节中我们提到,将两个指针相加不但是非法的,而且也没有什么意义。请问为什么两个指针相加没有意义?

指针存放的是内存地址,将地址相加会产生不可预料的结果。

练习3.39 编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int flag1 = 1, flag2 = 1;
    string s1("aaaa");
    string s2("aaaa");
    if (s1 != s2)
        flag1 = 0;
    char s3[] = "bbbb";
    char s4[] = "bbbb";
    if (strcmp(s3, s4) != 0)
    {
        flag2 = 0;
    }
    cout << flag1 << flag2 << endl;
    return 0;
}

练习3.40 编写一段程序,定义两个字符数组并用字符串字面值初始化它们;接着再定义一个字符数组存放前面两个数组连接后的结果。使用strcpystrcat把前两个数组的内容拷贝到第三个数组当中。

#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
    char s1[] = "aaaa";
    char s2[] = "BBBB";
    char s3[10] = "";
    strcat(s3, s1);
    strcat(s3, s2);
    printf("%s\n", s3);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40758751/article/details/102733547
今日推荐