C++Primer中文版(第4版)第一章习题答案


习题1.1 查看所用的编译器文档,了解它所用的文件命名规范。编译并运行本节的main程序。 【解答】 一般而言,C++编译器要求待编译的程序保存在文件中。C++程序中一般涉及两类文件:头文件和源文件。大多数系统中,文件的名字由文件名和文件后缀(又称扩展名)组成。文件后缀通常表明文件的类型,如头文件的后缀可以是.h或.hpp等;源文件的后缀可以是.cc或.cpp等,具体的后缀与使用的编译器有关。通常可以通过编译器所提供的联机帮助文档了解其文件命名规范。 习题1.2 修改程序使其返回-1。返回值-1通常作为程序运行失败的指示器。然而,系统不同,如何(甚至是否)报告main函数运行失败也不同。重新编译并再次运行程序,看看你的系统如何处理main函数的运行失败指示器。 【解答】 笔者所使用的Windows操作系统并不报告main函数的运行失败,因此,程序返回-1或返回0在运行效果上没有什么区别。但是,如果在DOS命令提示符方式下运行程序,然后再键入echo %ERRORLEVEL%命令,则系统会显示返回值-1。 习题1.3 编一个程序,在标准输出上打印“Hello, World”。 【解答】 #include int main() { std::cout << "Hello, World" << std::endl; return 0; } 习题1.4 我们的程序利用内置的加法操作符“+”来产生两个数的和。编写程序,使用乘法操作符“*”产生两个数的积。 【解答】 #include int main() { std::cout << "Enter two numbers:" << std::endl; int v1, v2; std::cin >> v1 >> v2; std::cout << "The product of " << v1 << " and " << v2 << " is " << v1 * v2 << std::endl; return 0; } 习题1.5 我们的程序使用了一条较长的输出语句。重写程序,使用单独的语句打印每一个操作数。 【解答】 #include int main() { std::cout << "Enter two numbers:" << std::endl; int v1, v2; std::cin >> v1 >> v2; std::cout << "The sum of "; std::cout << v1; std::cout << " and "; std::cout << v2; std::cout << " is "; 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; 这段代码合法吗?如果合法,为什么?如果不合法,又为什么? 【解答】 这段代码不合法。 注意,第1、2、4行的末尾有分号,表示这段代码包含三条语句,即第1、2行各为一个语句,第3、4行构成一个语句。“<<”为二元操作符,在第2、3两条语句中,第一个“<<”缺少左操作数,因此不合法。 在第2、3行的开头加上“std::cout”,即可更正。 习题1.7 编译有不正确嵌套注释的程序。 【解答】 由注释对嵌套导致的编译器错误信息通常令人迷惑。例如,在笔者所用的编译器中编译1.3节中给出的带有不正确嵌套注释的程序: #include /* * comment pairs /* */ cannot nest. * "cannot nest" is considered source code, * as is the rest of the program */ int main() { return 0; } 编译器会给出如下错误信息: error C2143: syntax error : missing ';' before '<' error C2501: 'include' : missing storage-class or type specifiers warning C4138: '*/' found outside of comment (第6行) error C2143: syntax error : missing ';' before '{' (第8行) error C2447: '{' : missing function header (old-style formal list?)(第8行) 习题1.8 指出下列输出语句哪些(如果有)是合法的。 std::cout << "/*"; std::cout << "*/"; std::cout << /* "*/" */; 预测结果,然后编译包含上述三条语句的程序,检查你的答案。纠正所遇到的错误。 【解答】 第一条和第二条语句合法。 第三条语句中<<操作符之后至第二个双引号之前的部分被注释掉了,导致<<操作符的右操作数不是一个完整的字符串,所以不合法。在分号之前加上一个双引号即可更正。 习题1.9 下列循环做什么? sum的最终值是多少? int sum = 0; for (int i = -100; i <= 100; ++i) sum += i; 【解答】 该循环求-100~100之间所有整数的和(包括-100和100)。 sum的最终值是0。 习题1.10 用for循环编程,求从50~100的所有自然数的和。然后用while循环重写该程序。 【解答】 用for循环编写的程序如下: #include int main() { int sum = 0; for (int i = 50; i <= 100; ++i) sum += i; std::cout << "Sum of 50 to 100 inclusive is " << sum << std::endl; return 0; } 用while循环编写的程序如下: #include int main() { int sum = 0, int i = 50; while (i <= 100) { sum += i; ++i; } std::cout << "Sum of 50 to 100 inclusive is " << sum << std::endl; return 0; } 习题1.11 用while循环编程,输出10~0递减的自然数。然后用for循环重写该程序。 【解答】 用while循环编写的程序如下: #include int main() { int i = 10; while (i >= 0) { std::cout << i << " "; --i; } return 0; } 用for循环编写的程序如下: #include int main() { for (int i = 10; i >= 0; --i) std::cout << i << " "; return 0; } 习题1.12 对比前面两个习题中所写的循环。两种形式各有何优缺点? 【解答】 在for循环中,循环控制变量的初始化和修改都放在语句头部分,形式较简洁,且特别适用于循环次数已知的情况。在while循环中,循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不如for语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制循环)。两种形式各有优点,但它们在功能上是等价的,可以相互转换。 习题1.13 编译器不同,理解其诊断内容的难易程度也不同。编写一些程序,包含本小节“再谈编译”部分讨论的那些常见错误。研究编译器产生的信息,这样你在编译更复杂的程序遇到这些信息时不会陌生。 【解答】 对于程序中出现的错误,编译器通常会给出简略的提示信息,包括错误出现的文件及代码行、错误代码、错误性质的描述。如果要获得关于该错误的详细信息,一般可以根据编译器给出的错误代码在其联机帮助文档中查找。 习题1.14 如果输入值相等,本节展示的程序将产生什么问题? 【解答】 sum的值即为输入值。因为输入的v1和v2值相等(假设为x),所以lower和 upper相等,均为x。for循环中的循环变量val初始化为lower,从而val<=upper为真,循环体执行一次,sum的值为 val(即输入值x);然后val加1,val的值就大于upper,循环执行结束。 习题1.15 用两个相等的值作为输入编译并运行本节中的程序。将实际输出与你在习题1.14中所做的预测相比较,解释实际结果和你预计的结果间的不相符之处。 【解答】 运行1.4.3节中给出的程序,输入两个相等的值(例如3,3),则程序输出为: Sum of 3 to 3 inclusive is 3 与习题1.14中给出的预测一致。 习题1.16 编写程序,输出用户输入的两个数中的较大者。 【解答】 #include int main() { std::cout << "Enter two numbers:" << std::endl; int v1, v2; std::cin >> v1 >> v2; // 读入数据 if (v1 >= v2) std::cout << "The bigger number is" << v1 << std::endl; else std::cout << "The bigger number is" << v2 << std::endl; return 0; } 习题1.17 编写程序,要求用户输入一组数。输出信息说明其中有多少个负数。 【解答】 #include int main() { int amount = 0, value; // 读入数据直到遇见文件结束符,计算所读入的负数的个数 while (std::cin >> value) if (value <= 0) ++amount; std::cout << "Amount of all negative values read is" << amount << std::endl; return 0; } 习题1.18 编写程序,提示用户输入两个数并将这两个数范围内的每个数写到标准输出。 【解答】 #include int main() { std::cout << "Enter two numbers:" << std::endl; int v1, v2; std::cin >> v1 >> v2; // 读入两个数 // 用较小的数作为下界lower、较大的数作为上界upper int lower, upper; if (v1 <= v2) { lower = v1; upper = v2; } else { lower = v2; upper = v1; } // 输出从lower到upper之间的值 std::cout << "Values of " << lower << "to " << upper << "inclusive are: " << std::endl; for (int val = lower; val <= upper; ++val) std::cout << val << " "; return 0; } 习题1.19 如果上题给定数1000和2000,程序将产生什么结果?修改程序,使每一行输出不超过10个数。 【解答】 所有数的输出连在一起,不便于阅读。 程序修改如下: #include int main() { std::cout << "Enter two numbers:" << std::endl; int v1, v2; std::cin >> v1 >> v2; // 读入两个数 // 用较小的数作为下界lower、较大的数作为上界upper int lower, upper; if (v1 <= v2) { lower = v1; upper = v2; } else { lower = v2; upper = v1; } // 输出从lower到upper之间的值 std::cout << "Values of " << lower << "to " << upper << "inclusive are: " << std::endl; for (int val = lower, count=1; val <= upper; ++val, ++count) { std::cout << val << " "; if (count % 10 == 0) //每行输出10个值 std::cout << std::endl; } return 0; } 粗黑体部分为主要的修改:用变量count记录已输出的数的个数;若count的值为10的整数倍,则输出一个换行符。 习题1.20 编写程序,求用户指定范围内的数的和,省略设置上界和下界的if测试。假定输入数是7和3,按照这个顺序,预测程序运行结果。然后按照给定的数是7和3运行程序,看结果是否与你预测的相符。如果不相符,反复研究关于for和while循环的讨论直到弄清楚其中的原因。 【解答】 可编写程序如下: // 1-20.cpp // 省略设置上界和下界的if测试,求用户指定范围内的数的和 #include int main() { std::cout << "Enter two numbers:" << std::endl; int v1, v2; std::cin >> v1 >> v2; // 读入数据 int sum = 0; // 求和 for (int val = v1; val <= v2; ++val) sum += val; // sum = sum + val std::cout << "Sum of " << v1 << " to " << v2 << " inclusive is " << sum << std::endl; return 0; } 如果输入数据为7和3,则v1值为7,v2值为3。for语句头中将val的初始值设为7,第一次测试表达式val <= v2时,该表达式的值为false,for语句的循环体一次也不执行,所以求和结果sum为0。 习题1.21 本书配套网站(http://www.awprofessional.com/cpp_primer)的第1章的代码目录下有Sales_ item.h源文件。复制该文件到你的工作目录。编写程序,循环遍历一组书的销售交易,读入每笔交易并将交易写至标准输出。 【解答】 #include #include "Sales_item.h" int main() { Sales_item book; // 读入ISBN,售出书的本数,销售价格 std::cout << "Enter transactions:" << std::endl; while (std::cin >> book) { // 输出ISBN,售出书的本数,总收入,平均价格 std::cout << "ISBN, number of copies sold, " << "total revenue, and average price are:" << std::endl; std::cout << book << std::endl; } return 0; } 习题1.22 编写程序,读入两个具有相同ISBN的Sales_item对象并产生它们的和。 【解答】 #include #include "Sales_item.h" int main() { Sales_item trans1, trans2; // 读入交易 std::cout << "Enter two transactions:" << std::endl; std::cin >> trans1 >> trans2; if (trans1.same_isbn(trans2)) std::cout << "The total information: " << std::endl << "ISBN, number of copies sold, " << "total revenue, and average price are:" << std::endl << trans1 + trans2; else std::cout << "The two transactions have different ISBN." << std::endl; return 0; } 习题1.23 编写程序,读入几个具有相同ISBN的交易,输出所有读入交易的和。 【解答】 #include #include "Sales_item.h" int main() { Sales_item total, trans; // 读入交易 std::cout << "Enter transactions:" << std::endl; if (std::cin >> total) { while (std::cin >> trans) if (total.same_isbn(trans)) // ISBN相同 total = total + trans; else { // ISBN不同 std::cout << "Different ISBN." << std::endl; return –1; } // 输出交易之和 std::cout << "The total information: " << std::endl << "ISBN, number of copies sold, " << "total revenue, and average price are:" << std::endl << total; } else { std::cout << "No data?!" << std::endl; return –1; } return 0; } 习题1.24 编写程序,读入几笔不同的交易。对于每笔新读入的交易,要确定它的ISBN是否和以前的交易的ISBN一样,并且记下每一个ISBN的交易的总数。通过给定多笔不同的交易来测试程序。这些交易必须代表多个不同的ISBN,但是每个ISBN的记录应分在同一组。 【解答】 #include #include "Sales_item.h" int main() { // 声明变量以保存交易记录以及具有相同ISBN的交易的数目 Sales_item trans1, trans2; int amount; // 读入交易 std::cout << "Enter transactions:" << std::endl; std::cin >> trans1; amount=1; while (std::cin >> trans2) if (trans1.same_isbn(trans2))// ISBN相同 ++amount; else { // ISBN不同 std::cout << "Transaction amount of previous ISBN: " << amount << std::endl; trans1 = trans2; amount=1; } // 输出最后一个ISBN的交易数目 std::cout << "Transaction amount of the last ISBN: " << amount << std::endl; return 0; } 习题1.25 使用源自本书配套网站的Sales_item.h头文件,编译并执行1.6节给出的书店程序。 【解答】 可从C++ Primer(第4版)的配套网站(http://www.awprofessional.com/cpp_primer)下载头文件Sales_item.h,然后使用该头文件编译并执行1.6节给出的书店程序。 习题1.26 在书店程序中,我们使用了加法操作符而不是复合赋值操作符将trans加到total中,为什么我们不使用复合赋值操作符? 【解答】 因为在1.5.1节中提及的Sales_item对象上的操作中只包含了+和=,没有包含+=操作。(但事实上,使用Sales_item.h文件,已经可以用+=操作符取代=和+操作符的复合使用。) 优质内容筛选与推荐>>
1、Java六大必须理解的问题
2、Visual Studio 2008中 显示解决方案管理器中的解决方案节点,VS 2010 高级专业版 序列号
3、简单实用的PHP验证码类
4、软件技术文档撰写要求
5、基于verilog分频器总结


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号