当前位置: 代码迷 >> 综合 >> 《C++ Primer(第5版)》习题答案
  详细解决方案

《C++ Primer(第5版)》习题答案

热度:76   发布时间:2023-11-21 04:47:45.0
第1章 开始
练习1.1
查阅你使用的编译器的文档,确定它所使用的命名约定。编译并运行第2页的main程序。


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


练习1.3
编写程序,在标准输出上打印Hello, World。
#include <iostream>int main (void)
{std::cout << "Hello, World" << std::endl;return 0;
}

练习1.4
我们的程序使用加法运算符+来将两个数相加。编写程序使用惩罚运算符*,来打印两个数的积。
#include <iostream>int main (void)
{std::cout << "请输入两个数: " << std::endl;int v1, v2;std::cin >> v1 >> v2;std::cout << v1 << "和" << v2 << "的积为: " << v1*v2 << std::endl;return 0;
}

练习1.5
我们将所有输出放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。
#include <iostream>int main (void)
{std::cout << "请输入两个数: ";std::cout << std::endl;int v1, v2;std::cin >> v1 >> v2;std::cout << v1;std::cout << "和";std::cout << v2;std::cout << "的积为: ";std::cout << v1*v2;std::cout << std::endl;return 0;
}

练习1.6
解释下面的程序片段是否合法。
std::cout << "The sum of " << v1;<< "and " << v2;<< " is " << v1+v2 << std::endl;
不合法。前两行的末尾有分号,代表语句结束,第2、3两行为两条新的语句。而这两条语句在“<<”之前缺少了输出流,应在“<<”之前加上"std::cout"。


练习1.7
编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。
#include <iostream>/*
* 注释对/* */不能嵌套
* “不能嵌套”几个字会被认为是源码,像剩余程序一样处理
*/int main (void)
{return 0;
}

练习1.8
指出下列哪些输出语句是合法的(如果有的话)。
std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /* "*/" /* "/*" */;
预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。
第一条和第二条语句是合法的,第三条语句的第一个双引号和第四个双引号被注释掉了,第二个双引号和第三个双引号之间的“*/”被认为是字符串的文字内容。


练习1.9
编写程序,使用while循环将50到100的整数相加。
#include <iostream>int main (void)
{int sum = 0, i = 50;while (i <= 100){sum += i;++i;}std::cout << "50到100的整数和为 " << sum << std::endl;return 0;
}

练习1.10
除了++运算符将运算对象的值增加1以外,还有一个递减运算符(--)实现将值减少1。编写程序,使用递减运算符在循环中按递减序打印出10到0之间的整数。
#include <iostream>int main (void)
{int i = 11;while (i > 0)std::cout << --i << std::endl;return 0;
}

练习1.11
编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。
#include <iostream>int main (void)
{std::cout << "请输入两个整数以表示范围:" << std::endl;int v1, v2;std::cin >> v1 >> v2;if (v1 < v2){while (v1 <= v2){std::cout << v1 << " ";++v1;}}else if (v1 > v2){while (v2 >= v1){std::cout << v2 << " ";--v2;}}elsestd::cout << std::cout << v1;std::cout << std::endl;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节中的所有练习(第11页)。
练习1.9中,将while循环改为
for (i; i <= 100; ++i)
sum += i;
练习1.10中,将while循环改为
for (i = 10; i >= 0; ++i)
std::cout << i << std::endl;
练习1.11同理


练习1.14
对比for循环和while循环,两种形式的优缺点各是什么?
在循环次数已知的情况下,for循环更为简洁;无法预知循环次数是,while循环更合适。


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


练习1.16
编写程序,从cin读取一组数,输出其和。
#include <iostream>int main (void)
{int sum = 0, val;while (cin >> val)sum += val;std::cout << sum << std::endl;return 0;
}

练习1.17
如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?
如果输入的所有值都相等,则while循环中的else分支永远不会执行,直到输入结束,while循环退出,循环后的输出语句打印这唯一的一个值和它出现的次数。若没有重复值,则while循环中的if语句的真值分支永远不会执行,每读入一个值会打印它的值和出现的次数1


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


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


练习1.20
在网站http://www.informit.com/title/0321714113 上,第1章的代码目录汇总包含了头文件Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。
#include <iostream>
#include "Sales_item.h"int main (void)
{Sales_item book;std::cout << "请输入销售记录:" << std::endl;while (std::cin >> book)std::cout << "ISBN、销售额和平均售价为 " << book << std::endl;return 0;
}

练习1.21
编写程序,读取两个ISBN相同的Sales_item对象,输出它们的和。
#include <iostream>
#include "Sales_item.h"int main (void)
{Sales_item trans1, tran2;std::cout << "请输入两条ISBN相同的销售记录:" << std::endl;std::cin >> trans1 >> trans2;if (compareIsbn(trans1, trans2))std::cout << "汇总信息:ISBN、售出本数、销售额和平均售价为 " << trans1+trans2 << std::endl;elsestd::cout << "两条销售记录的ISBN不同" << std::endl;return 0;
}

练习1.22
编写程序,读取多个具有相同ISBN的销售记录,输出所有记录的和。
#include <iostream>
#include "Sales_item.h"int main (void)
{Sales_item total, trans;std::cout << "请输入几条ISBN相同的销售记录:" << std::endl;if (std::cin >> total){while (std::cin >> trans)if (compareIsbn(total, trans))total += trans;else{std::cout << "ISBN不同";return -1;}std::cout << "汇总信息:ISBN、售出本数、销售额和平均售价为 " << total << std::endl;}else{std::cout << "没有数据" << std::endl;return -1;}return 0;
}

练习1.23
编写程序,读取多条销售记录,并统计每个ISBN(每本书)有几条销售记录。
#include <iostream>
#include "Sales_item.h"int main (void)
{Sales_item trans1, trans2;int num = 1;std::cout << "请输入若干销售记录:" << std::endl;if (std::cin >> trans1){while (std::cin >> trans2){if (compareIsbn(trans1, trans2))num++;else{std::cout << trans1.isbn() << "共有" << num << "条销售记录" << std::endl;trans1 = trans2;num = 1;}std::cout << trans1.isbn() << "共有" << num << "条销售记录" << std::endl;}}return 0;
}

练习1.24
输入表示多个ISBN的多条销售记录来测试上一个程序,每个ISBN的记录应该聚在一起。
从网站http://www.informit.com/title/0321714113上下载数据文件,用文件重定向来读取文件中的数据作为输入进行测试。代码略。


练习1.25
借助网站上的Sales_item.h头文件,编译并运行本节给出的书店程序。
大作业,留着以后写。
  相关解决方案