c++ primer第五版(中文)习题答案 第三章第五节-数组

本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。
转载声明出处

练习3.27 假设txt_size 是一个无参数的函数,它返回值是int。请回答下列哪个定义是非法的?为什么?
unsigned buf_size = 1024;
a.int ia[buf_size]; //错误 必须是常量表达式,
b.int ia[4*7-14]; //正确
c.int ia[txt_size()];//错误 ,必须是常量
d.char st[11] =”fundamental” //错误 没有空间存储‘\0’

练习 3.28 下列数组中元素的值是什么?
string sa[10]; //string不是内置类型,会被设置为空
int ia[10]; //内置函数 在函数体外部 会被设置为零
int main(){
string sa2[10]; //函数体内部 ,空
int ia[10]; //函数体内 ,内置函数不被设置为0

}

在vs2013中调试和预先想的一样。
这里写图片描述

练习 3.29 相比于vector 来说,数组有哪些缺点,请举例
1.不能动态增长 元素个数,
2.vector更好的支持std。

练习 3.30 指出下面代码中的索引错误
constexpr size_t array_size 10; //constexpr 新关键字 ,vs2013还不支持
int ia [array_size];
for(size_t ix =1;ix<=array_size;++ix)
ia[ix] =ix;

改正如下
for(size_t ix =0;ix

#include <iostream>

int main(){
    const size_t array_size =10; //改写为const 其余和上面差不多
    int ia[array_size];
    for (size_t ix = 0; ix < array_size; ++ix)
        ia[ix] = ix;

    for (size_t ix = 0; ix < array_size; ++ix)
        std::cout << ia[ix] << "   ";
    system("pause");
    return 0;
}

改编上面代码即可

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

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

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

int main()
{
    // use array
    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];

    // 使用vector
    vector<int> iv(10);
    for (auto iter = iv.begin(); iter != iv.end(); ++iter)    
        *iter = iter - iv.begin();

    vector<int> iv2(iv);

///输出
    for (auto i : iv2)
        cout << i << " ";
    cout << endl;

    return 0;
}

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

练习 3.34假定p1和p2指向一个数组中的元素,则下面程序的功能是什么?什么情况下该程序上非法的
p1 += p2 - p1
作用吧p1 移动到p2的位置,当p1比p2大的时候非法。

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

#include <iostream>

int main()
{

    int array[10];
    int *p = array;
    for (int i = 0; i < 10;i++)
        *(p + i) = i;

    for (int i = 0; i < 10; i++)
        std::cout << " " << array[i] << " ";

    system("pause");
    return 0;
}

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

#include <iostream>
#include <vector>
int main()
{

    int array1[10] = {0,1,2,3,4,5,6,7,8,9};
    int array2[10] = { 0,1,2,3,4,5,8,7,8,9 };
    bool isEqual = true;
    //线判断长度是否相等
    if (std::end(array1) - std::begin(array1) != std::end(array2) - std::begin(array2))
    {
            isEqual = false;
    }
    else
    {
            //数据不相等
        for (size_t i = 0; i < std::end(array1) - std::begin(array1); i++)
            if (array1[i] != array2[i])
                isEqual = false;
    }

    std::cout << "two array is " << (isEqual ? "equal" : "notEqual") << " ";


    std::vector<int> vetA = { 0,1,2 };
    std::vector<int> vetB = { 2,1,2 };

    std::cout << "\n two vector  is " << (vetA == vetB ? "equal" : "notEqual") << " ";
    system("pause");
    return 0;
}

输出结果如下
这里写图片描述

练习3.37下面的程序是何含义,程序输出的结果是什么?
const char ca[] = {‘h’,’e’,’l’,’l’,’o’};
const char *cp =ca;
while(*cp){
cout<<*cp<

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


int main()
{
    // use string.
    std::string s1("iloveYou");
    std::string s2("iloveLQ");

    if (s1 == s2)
        std::cout << "same string." << std::endl;
    else if (s1 > s2)
        std::cout << "iloveYou > iloveLQ" << std::endl;
    else
        std::cout << "iloveYou < iloveLQ" << std::endl;

    std::cout << "=========" << std::endl;
    // use C-Style character strings.
    const char* cs1 = "iloveYou";
    const char* cs2 = "iloveLQ";

    auto result = strcmp(cs1, cs2);
    if (result == 0)
        std::cout << "same string." << std::endl;
    else if (result < 0)
        std::cout << "iloveYou < iloveLQ" << std::endl;
    else
        std::cout << "iloveYou > iloveLQ" << std::endl;


    system("pause");
    return 0;
}

练习 3.40 编写一段程序,定义两个字符串并用字符串字面值初始化他们,接着在定义一个字符数组,存放前两个数组链接后的结果。使用strcpy和strcat把前两个数组的内容拷贝到第三个数组中。

#include <iostream>
#include <cstring>

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

int main()
{
    const char* cs1 = "iloveyou";
    const char* cs2 = "LQ";
    char cstr3[13]; //不知道怎么动态计算 cs1cs2的长度,然后相加

    strcpy(cstr3, cs1);
    strcat(cstr3, " ");
    strcat(cstr3, cs2);

    std::cout << cstr3 << std::endl;

    system("pause");
    return 0;
}

练习 3.41 编写一段程序,用整形数组初始化一个vector对象。

#include <iostream>
#include <vector>


int main()
{
    int array[10] = { 0,1,2,3,4,5,6,7,8,9 };
    std::vector<int> vecI;

    for (int* i = std::begin(array); i < std::end(array);i++)
    {
        vecI.push_back(*i);
    }
    int array2[10];

    for(int a:vecI)
    {
        std::cout << a << " ";
        array2[a] = a;
    }
    std::cout << std::endl;

    for (int* i = std::begin(array2); i < std::end(array2); i++)
    {
        std::cout << *i << " ";
    }


    system("pause");
    return 0;


}

练习3.42 编写一段程序,将含有整数元素的vector对象拷贝给一个整形数组。

在上面代码中已经实现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值