0%

C++ Primer personal answer chapter01

《C++ Primer》第五版习题个人答案

说明

  • 仅个人记录学习过程所用,习题答案及排版可能部分与其他作者雷同,如有错误及侵权,欢迎邮箱联系我处理。
  • 编译器是VS Code

练习1.1

查阅你使用的编译器文档,确定它所使用的文件命名约定。编译并运行第2页的main程序。

1
2
3
4
int main()
{
return 0;
}

练习1.2

改写程序,让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。

1
2
3
4
int main()
{
return -1;
}

和1.1结果相同,win11系统不处理或报告程序返回的错误标识。

练习1.3

编写程序,在标准输出上打印 Hello, World。

1
2
3
4
5
6
7
#include <iostream>
int main()
{
std::cout<<"Hello World"<<std::end1;
return 0;
}

练习1.4

我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 1, v2 = 1;
std::cin >> v1 >> v2;
std::cout << v1 << " multiplied by "<< v2
<< " is " << v1 * v2 << std::endl;
return 0;
}

练习1.5

我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 1, v2 = 1;
std::cin>>v1>>v2;
std::cout<<v1;
std::cout<<" multiplied by ";
std::cout<<v2;
std::cout<<" is ";
std::cout<<v1 * v2 << std::endl;
return 0;
}

练习1.6

解释下面程序片段是否合法。

1
2
3
std::cout << "The sum of " << v1;
<< " and " << v2;
<< " is " << v1 + v2 << std::endl;

如果程序是合法的,它的输出是什么?如果程序不合法,原因何在?应该如何修正?

不合法。
原因:分号将完整的输出语句分割,导致语法不完整。
修正:移除掉多余的分号,或在句子前面添加std::cout。

练习1.7

编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。

1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main()
{
std::cout<<"Hello World"<<std::end1;
/*正确注释
/* 注释里嵌套注释是错误的 */
*/
return 0;
}

编译器错误信息:

编译器错误信息

练习1.8

指出下列哪些输出语句是合法的(如果有的话):

1
2
3
4
std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /* "*/" /* "/*" */;

预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。

第三行编译出错,改正方法是增加一个引号。

1
2
3
4
5
6
7
8
#include<iostream>
int main()
{
std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */";
std::cout << /* "*/" /* "/*" */;
}

输出:

1
/**/ */ /*

练习1.9

编写程序,使用while循环将50到100的整数相加。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
int main()
{
int sum=0, val=50;
while(val<=100)
{
sum +=val;
++val;
}
std::cout<<"Sum of 50 to 100 inclusive is"<<sum<<std::endl;
return 0;

}

练习1.10

除了++运算符将运算对象的值增加1之外,还有一个递减运算符(–)实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10到0之间的整数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
int main()
{
int a=0,val=10;
while (val>=0)
{
a=val;
--val;
std::cout<<a<<std::endl;
}

return 0;
}

练习1.11

编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
int main()
{
int a=0,b=0;
std::cout<<"please input two numbers:"<<std::endl;
std::cin>>a>>b;
int min = std::min(a,b);
int max = std::max(a,b);
while (max>=min)
{
std::cout<<max<<std::endl;
max--;
}
return 0;
}

练习1.12

下面的for循环完成了什么功能?sum的终值是多少?

1
2
3
int sum = 0;
for (int i = -100; i <= 100; ++i)
sum += i;

功能是将从-100到100之间的所有整数累加到变量sum中,sum 的终值为 0。

练习1.13

使用for循环重做1.4.1节中的所有练习(第11页)。

exercise1.9:

1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main()
{
int sum = 0;
for (int i = 50; i <= 100; ++i)
{sum += i;
}
std::cout << "the sum is: " << sum << std::endl;
return 0;
}

exercise1.10:

1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main()
{
for ( int i = 10; i >= 0; --i)
{
std::cout<<i<<std::endl;
}
return 0;
}

exercise1.11:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
int main()
{
int a=0,b=0;
std::cout<<"please input two numbers:"<<std::endl;
std::cin>>a>>b;
int min = std::min(a,b);
int max = std::max(a,b);
for (int i = max; i >= min; i--)
{
std::cout<<i<<std::endl;
}

return 0;
}

练习1.14

对比for循环和while循环,两种形式的优缺点各是什么?

for循环语法简单明了,易于理解和维护;不适用于无限循环或循环次数不确定的情况,因为循环次数需要在循环开始前就确定。
while循环适用于循环次数不确定的情况,可以根据条件动态控制循环的执行;语法相对复杂,循环的初始化和迭代语句需要循环体外部定义,可读性稍差且容易出现死循环。

练习1.15

编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。

常见的错误有语法错误、类型错误、声明错误,这些都是编译器可以检查出的错误。

练习1.16

编写程序,从cin读取一组数,输出其和。

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
int main()
{
int sum = 0, value = 0;
//读取数据直到文件尾,计算所有读入的值的和
while (std::cin >> value)
{
sum += value;//等价于sum=sum+value
}
std::cout <<"Sum is"<< sum << std::endl;
return 0;
}

练习1.17

如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?

练习1.17
练习1.17

练习1.18

编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
int main()
{
//currVal是我们正在统计的数;我们将读入的新值存入val
int currVal =0,val=0;//读取第一个数,并确保确实有数据可以处理
if (std::cin>>currVal)
{
int cnt =1;//保存我们正在处理的当前值的个数
while (std::cin>>val)//读取剩余的数
{
if (val==currVal)//如果值相同
{
++cnt;//将cnt加一
}
else{//否则打印前一个值的数
std::cout<<currVal<<" occurs "<<cnt<<" times"<<std::endl;
currVal=val;//记住新值
cnt=1;//重置计数器
}

}//while在这里结束
//记住打印文件中的最后一个值的个数
std::cout<<currVal<<" occurs "<<cnt<<" times"<<std::endl;
}//最外层的if语句在这里结束
return 0;
}

键入9个9,输出结果如练习1.17图1所示。

练习1.19

修改你为1.4.1节练习1.11(第11页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
int main()
{
int a=0,b=0;
std::cout<<"please input two numbers:"<<std::endl;
std::cin>>a>>b;
if (a<=b)
{
while (a<=b)
{
std::cout<<a<<std::endl;
a++;
}
}
else{while (a>=b)
{
std::cout<<a<<std::endl;
a--;
}
}

return 0;
}

练习1.20

在网站http://www.informit.com/title/032174113 上,第1章的代码目录包含了头文件 Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。

还需要将下载文件中的Version_test.h加入到练习代码目录

1
2
3
4
5
6
7
8
9
10
11
#include<iotream>
#include"Sales_item.h"
int main()
{
Sales_item book;
//读入ISBN号、售出的册数及销售价格
std::cin>>book;
//写入ISBN号、售出的册数、总销售额和平均价格
std::cout<<book<<std::endl;
return 0;
}

练习1.21

编写程序,读取两个 ISBN 相同的 Sales_item 对象,输出他们的和。

1
2
3
4
5
6
7
8
9
#include<iostream>
#include"Sales_item.h"
int main()
{
Sales_item item1 item2;
std::cin>>item1>>item2;
std::cout<<item1+item2<<std::endl;
return 0;
}

练习1.22

编写程序,读取多个具有相同 ISBN 的销售记录,输出所有记录的和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include "Sales_item.h"

int main()
{
Sales_item total;//保存下一条交易记录的变量
//读入第一条交易记录,并确保有数据可以处理
if (std::cin >> total)
{
Sales_item trans;//保存和的变量
//读入并处理剩余交易记录
while (std::cin >> trans)
{//如果我们仍在处理相同的书
if (total.isbn() == trans.isbn())
total += trans;//更新总销售额
else
{//打印前一本书的结果
std::cout << total << std::endl;
total = trans;//total现在表示下一本书的销售额
}
}
std::cout << total << std::endl;//打印最后一本书的结果
}
else
{
std::cerr << "No data?!" << std::endl;//没有输入!警告读者
return -1;//表示失败
}

return 0;
}

练习1.23

编写程序,读取多条销售记录,并统计每个 ISBN(每本书)有几条销售记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include"Sales_item.h"
int main()
{
Sales_item current ,val;
if (std::cin>>current)
{
int cnt=1;
while (std::cin>>val)
{
if (current.isbn()==val.isbn())
{
++cnt;
}
else
{
std::cout<<current<<" occurs "<< cnt <<" times "<<std::endl;
current=val;
cnt =1;
}
}
std::cout<<current<<" occurs "<< cnt <<" times "<<std::endl;
return 0;
}
}

练习1.24

输入表示多个 ISBN 的多条销售记录来测试上一个程序,每个 ISBN 的记录应该聚在一起。

数据取自VisualStudio2012.zip\1\data\book_sales

练习1.24

练习1.25

借助网站上的Sales_item.h头文件,编译并运行本节给出的书店程序。