专栏C++学习笔记
《C++ Primer》学习笔记/习题答案 总目录
——————————————————————————————————————————————————————
第1章 - 快速入门
练习1.1
查阅你使用的编译器的文档,确定它所使用的文件名约定。编译并运行第2页的main程序。
解:
#include <iostream>
int main()
{
system("pause");
return 0;
}
编译器VS2013中运行程序结果如下:
源文件编译为可执行文件。
在系统cmd命令行中运行可执行文件。
练习1.2
改写程序,让它返回-1。返回值-1通常被当做程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。
解:
#include <iostream>
int main()
{
system("pause");
return -1;
}
编译器VS2013中运行程序结果如下:
命令行中运行 echo %ERRORLEVEL%
练习1.3
编写程序,在标准输出上打印Hello, World。
解:
#include <iostream>
int main()
{
std::cout << "Hello, World" << std::endl;
system("pause");
return 0;
}
练习1.4
我们的程序使用加法运算符+
来将两个数相加。编写程序使用乘法运算符*
,来打印两个数的积。
解:
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The product of " << v1 << " and " << v2
<< " is " << v1 * v2 << std::endl;
system("pause");
return 0;
}
练习1.5
我们将所有的输出操作放在一条很长的语句中,重写程序,将每个运算对象的打印操作放在一条独立的语句中。
解:
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The product of ";
std::cout << v1;
std::cout << " and ";
std::cout << v2;
std::cout << " is ";
std::cout << v1 * v2;
std::cout << std::endl;
system("pause");
return 0;
}
练习1.6
解释下面程序片段是否合法。
std::cout << "The sum of " << v1;
<< " and " << v2;
<< " is " << v1 + v2 << std::endl;
如果程序是合法的,它的输出是什么?如果程序不合法,原因何在?应该如何修正?
解:
程序不合法,有多余的分号,修改如下:
std::cout << "The sum of " << v1
<< " and " << v2
<< " is " << v1 + v2 << std::endl;
或者在 << 之前缺少了输出流,修改如下:
std::cout << "The sum of " << v1;
std::cout << " and " << v2;
std::cout << " is " << v1 + v2 << std::endl;
练习1.7
编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。
解:
#include <iostream>
/*
* 注释对 */ */ 不能嵌套。
* "不能嵌套" 几个字会被认为是源码,
* 像剩余程序一样处理
*/
int main()
{
return 0;
}
错误信息:
练习1.8
指出下列哪些输出语句是合法的(如果有的话):
std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /* "*/" /* "/*" */;
预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。
解:
第一条和第二条语句显然是合法的;
在第三条语句中,第一个双引号被注释掉了,因此 << 运算符后真正被编译的内容是 " */
,编译器认为这是一个不完整的字符串,所以会报告:7 error:missing terminating " character
,即,缺少结束的双引号。在分号前补一个双引号,这条语句就变味正确的了;
第四条语句看起来很混乱,但它是正确的。第一个双引号被注释掉了,第四个双引号也被注释掉了,第二个双引号和第三个双引号之间的“ /* ”被认为是字符串的文字内容。但是这样的程序风格显然是不好的。
练习1.9
编写程序,使用while
循环将50到100整数相加。
解:
#include <iostream>
int main()
{
int sum = 0, val = 50;
while (val <= 100){
sum += val;
val += 1;
}
std::cout << "Sum of 50 to 100 inclusive is "
<< sum << std::endl;
system("pause");
return 0;
}
练习1.10
除了++
运算符将运算对象的值增加1之外,还有一个递减运算符--
实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10到0之间的整数。
解:
#include <iostream>
int main()
{
int val = 10;
while (val >= 0){
std::cout << val << " ";
val--;
}
std::cout << std::endl;
system("pause");
return 0;
}
练习1.11
编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。
解:
#include <iostream>
int main()
{
int start = 0, end = 0;
std::cout << "Please input two num: ";
std::cin >> start >> end;
if (start <= end) {
while (start <= end){
std::cout << start << " ";
++start;
}
std::cout << std::endl;
}
else{
std::cout << "start should be smaller than end !!!";
}
system("pause");
return 0;
}
练习1.12
下面的for循环完成了什么功能?sum的终值是多少?
int sum = 0;
for (int i = -100; i <= 100; ++i)
sum += i;
解:
此循环将 -100 加到 100(包括 -100 和100)的整数,sum 的终值是 0。
练习1.13
使用for循环重做1.4.1节中的所有练习(练习1.9到1.11)。
解:
练习1.9重做版本
#include <iostream>
int main()
{
int sum = 0;
for (int val = 50; val <= 100; ++val){
sum += val;
}
std::cout << "Sum of 50 to 100 inclusive is "
<< sum << std::endl;
system("pause");
return 0;
}
练习1.10重做版本
#include <iostream>
int main()
{
for (int val = 10; val >=0; --val){
std::cout << val << " ";
}
std::cout << std::endl;
system("pause");
return 0;
}
练习1.11重做版本
#include <iostream>
int main()
{
int start = 0, end = 0;
std::cout << "Please input two num: ";
std::cin >> start >> end;
if (start <= end) {
for (; start <= end; ++start){
std::cout << start << " ";
}
std::cout << std::endl;
}
else{
std::cout << "start should be smaller than end !!!";
}
system("pause");
return 0;
}
练习1.14
对比 for 循环和 while 循环,两种形式的优缺点各是什么?
解:
在循环次数已知的情况下,for 循环的形式显然更为简洁。
而循环次数无法预知时,用 while 循环实现更适合。用特定条件控制循环是否执行,循环体中执行的语句可能导致循环判定条件发生变化。
练习1.15
编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。
解:
对于复杂程序中的错误,编译器给出的错误信息很可能无法对应到真正的错误位置并给出准确的错误原因。这是很正常的,因为某些时候我们人类都无法准确判断程序员到底犯了什么错误,在当前人工智能技术发展水平下,要求编译器有超越人类的智能是不现实的,而且,不同的编译器对同一程序给出的错误信息有可能是有很大差别的。一方面是因为如前所述,很多时候并不存在“唯一正确”的错误原因:另一方面,不同编译器对同样地错误原因也可能有自己不同的解释方式。
编译器可以检查出的错误有:
- 语法错误
- 类型错误
- 声明错误
练习1.16
编写程序,从cin读取一组数,输出其和。
解:
#include <iostream>
int main()
{
int sum = 0, value = 0;
std::count << "请输入一些数,按Ctrl + z 表示结束" << std::endl;
for (; std::cin >> value; )
sum += value;
std::cout << "读入的数之和为" << sum << std::endl;
system("pause");
return 0;
}
练习1.17
如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?
解:
如果输入的所有值都相等,则 while 循环中的 else 分支永远不会执行,直到输入结束,while 循环退出,循环后的输出语句打印这唯一的一个值和它出现的次数。
若没有重复值,则 while 循环中的 if 语句的真值分支永远不会执行,每读入一个值,都会进入 else 分支,打印它的值和出现次数1。输入结束后,while 循环退出,循环后的输出语句打印最后一个值和出现次数1。
练习1.18
编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。
解:
全部重复:
>>> 1 1 1 1 1
1 occurs 5 times
没有重复:
>>> 1 2 3 4 5
1 occurs 1 times
2 occurs 1 times
3 occurs 1 times
4 occurs 1 times
5 occurs 1 times
注意:不要忘记了用 Ctrl + z 表示输入结束。
练习1.19
修改你为1.4.1节练习1.11(第11页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。
解:
#include <iostream>
int main()
{
int start = 0, end = 0;
std::cout << "Please input two num: ";
std::cin >> start >> end;
if (start <= end) {
while (start <= end){
std::cout << start << " ";
++start;
}
std::cout << std::endl;
}
else{
std::cout << "start should be smaller than end !!!";
}
system("pause");
return 0;
}
练习1.20 - 1.25放在后期类的章节中再做。
转载:https://blog.csdn.net/TeFuirnever/article/details/100847367