您的位置:首页 > 编程语言 > C语言/C++

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

2015-11-11 21:43 411 查看
本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。

转载声明出处

练习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对象拷贝给一个整形数组。

在上面代码中已经实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: