C Primer第4 版习题解答.docx
- 文档编号:10668777
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:121
- 大小:55.37KB
C Primer第4 版习题解答.docx
《C Primer第4 版习题解答.docx》由会员分享,可在线阅读,更多相关《C Primer第4 版习题解答.docx(121页珍藏版)》请在冰点文库上搜索。
CPrimer第4版习题解答
C++Primer(第4版)习题解答.txt51自信是永不枯竭的源泉,自信是奔腾不息的波涛,自信是急流奋进的渠道,自信是真正的成功之母。
书名:
C++Primer(第4版)习题解答
?
作者:
蒋爱军李师贤梅晓勇
?
来源:
人民邮电出版社
?
出版时间:
2006年12月
?
ISBN:
9787115155108
?
定价:
45元
内容介绍:
C++Primer(第4版)是C++大师StanleyB.Lippman丰富的实践经验和C++标准委员会原负责人Josée
Lajoie对C++标准深入理解的完美结合,更加入了C++先驱BarbaraE.Moo在C++教学方面的真知灼见,
C++Primer(4版)习题解答
2
是初学者的最佳C++指南,而且对于中高级程序员,也是不可或缺的参考书。
本书正是这部久负盛名的
C++经典教程的配套习题解答。
书中提供了C++Primer(第4版)中所有习题的参考答案。
本书对使用C++Primer(第4版)学习C++程序设计语言的读者是非常理想的参考书。
C++是一门非常实用的程序设计语言,既支持过程式程序设计,也支持面向对象
程序设计,因而也是目前应用极为广泛的一门程序设计语言。
在层出不穷的介绍C++语言的书籍中,C++Primer是一本广受欢迎的权威之作。
强大的作者阵容、全面的内容介绍、新颖的组织方式,使之深受C++爱好者的青
睐。
本书编者在翻译C++Primer(第4版)的过程中也深深地感受到了这一点。
在学习一门程序设计语言的过程中,亲自动手编写代码是一种极其有效的学习
方式,可以对语言的理解和应用达到事半功倍的效果,因此,C++Primer(第4
版)中提供了许多习题,以帮助读者加深对书中内容的理解。
本书试图成为C++Primer(第4版)的配套书籍,根据C++Primer(第4版)
中所介绍的内容提供配套习题的解答,书中所给出的“见xx节”,均指参见C++
Primer(第4版)的相应章节。
本书中给出的程序均已通过MicrosoftVisualC++.NET2003的编译。
源文件
(实现文件)以.cpp为扩展名,头文件为了与此对应采用.hpp为扩展名(而没
有采用编译器的默认扩展名.h)。
为了节省篇幅,有些程序中将类的定义与使
用类的主函数放在同一实现文件中。
包含主函数的源文件根据习题编号命名。
大多数模板的定义都没有区分头文件和实现文件(因为编者所用的编译器支持
模板的包含编译模型)。
另外,使用VisualC++.NET2003编译器的默认设置
会自动连接一些默认库,因此可能有某些所用到的库函数或库类型没有显式指
明相应的头文件。
使用其他编译器的读者需特别注意,必要时应加上相应的
#include指示。
衷心希望本书能对使用C++Primer(第4版)学习C++语言的读者有所帮助。
由于编者水平所限,书中不当之处在所难免,恳请读者批评指正。
编者
2006年10
月
习题1.1
查看所用的编译器文档,了解它所用的文件命名规范。
编译并运行本节的main
程序。
C++Primer(4版)习题解答
3
【解答】
一般而言,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
intmain()
{
std:
:
cout<<"Hello,World"< : endl; return0; } 习题1.4 我们的程序利用内置的加法操作符“+”来产生两个数的和。 编写程序,使用乘 法操作符“*”产生两个数的积。 【解答】 #include C++Primer(4版)习题解答 4 intmain() { std: : cout<<"Entertwonumbers: "< : endl; intv1,v2; std: : cin>>v1>>v2; std: : cout<<"Theproductof"< <<"is"< : endl; return0; } 习题1.5 我们的程序使用了一条较长的输出语句。 重写程序,使用单独的语句打印每一 个操作数。 【解答】 #include intmain() { std: : cout<<"Entertwonumbers: "< : endl; intv1,v2; std: : cin>>v1>>v2; std: : cout<<"Thesumof"; std: : cout< std: : cout<<"and"; std: : cout< std: : cout<<"is"; C++Primer(4版)习题解答 5 std: : cout< std: : cout< : endl; return0; } 习题1.6 解释下面的程序段: std: : cout<<"Thesumof"< <<"and"< <<"is"< < : endl; 这段代码合法吗? 如果合法,为什么? 如果不合法,又为什么? 【解答】 这段代码不合法。 注意,第1、2、4行的末尾有分号,表示这段代码包含三条语句,即第1、2行 各为一个语句,第3、4行构成一个语句。 “<<”为二元操作符,在第2、3两 条语句中,第一个“<<”缺少左操作数,因此不合法。 在第2、3行的开头加上“std: : cout”,即可更正。 习题1.7 编译有不正确嵌套注释的程序。 【解答】 由注释对嵌套导致的编译器错误信息通常令人迷惑。 例如,在笔者所用的编译 器中编译1.3节中给出的带有不正确嵌套注释的程序: #include /* *commentpairs/**/cannotnest. *"cannotnest"isconsideredsourcecode, *asistherestoftheprogram */ intmain() { return0; } 编译器会给出如下错误信息: errorC2143: syntaxerror: missing';'before'<' errorC2501: 'include': missingstorage-classortypespecifiers warningC4138: '*/'foundoutsideofcomment(第6行) errorC2143: syntaxerror: missing';'before'{'(第8行) errorC2447: '{': missingfunctionheader(old-styleformallist? )(第 8行) 习题1.8 指出下列输出语句哪些(如果有)是合法的。 std: : cout<<"/*"; std: : cout<<"*/"; std: : cout<*"*/"*/; 预测结果,然后编译包含上述三条语句的程序,检查你的答案。 纠正所遇到的 错误。 【解答】 第一条和第二条语句合法。 C++Primer(4版)习题解答 7 第三条语句中<<操作符之后至第二个双引号之前的部分被注释掉了,导致<<操 作符的右操作数不是一个完整的字符串,所以不合法。 在分号之前加上一个双 引号即可更正。 习题1.9 下列循环做什么? sum的最终值是多少? intsum=0; for(inti=-100;i<=100;++i) sum+=i; 【解答】 该循环求-100~100之间所有整数的和(包括-100和100)。 sum的最终值是0。 习题1.10 用for循环编程,求从50~100的所有自然数的和。 然后用while循环重写该程 序。 【解答】 用for循环编写的程序如下: #include intmain() { intsum=0; for(inti=50;i<=100;++i) sum+=i; std: : cout<<"Sumof50to100inclusiveis" < : endl; return0; C++Primer(4版)习题解答 8 } 用while循环编写的程序如下: #include intmain() { intsum=0,inti=50; while(i<=100){ sum+=i; ++i; } std: : cout<<"Sumof50to100inclusiveis" < : endl; return0; } 习题1.11 用while循环编程,输出10~0递减的自然数。 然后用for循环重写该程序。 【解答】 用while循环编写的程序如下: #include intmain() { inti=10; while(i>=0){ std: : cout< C++Primer(4版)习题解答 9 --i; } return0; } 用for循环编写的程序如下: #include intmain() { for(inti=10;i>=0;--i) std: : cout< return0; } 习题1.12 对比前面两个习题中所写的循环。 两种形式各有何优缺点? 【解答】 在for循环中,循环控制变量的初始化和修改都放在语句头部分,形式较简洁, 且特别适用于循环次数已知的情况。 在while循环中,循环控制变量的初始化 一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不 如for语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制 循环)。 两种形式各有优点,但它们在功能上是等价的,可以相互转换。 习题1.13 编译器不同,理解其诊断内容的难易程度也不同。 编写一些程序,包含本小节 “再谈编译”部分讨论的那些常见错误。 研究编译器产生的信息,这样你在编 译更复杂的程序遇到这些信息时不会陌生。 【解答】 C++Primer(4版)习题解答 10 对于程序中出现的错误,编译器通常会给出简略的提示信息,包括错误出现的 文件及代码行、错误代码、错误性质的描述。 如果要获得关于该错误的详细信 息,一般可以根据编译器给出的错误代码在其联机帮助文档中查找。 习题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),则程序输出为: Sumof3to3inclusiveis3 与习题1.14中给出的预测一致。 习题1.16 编写程序,输出用户输入的两个数中的较大者。 【解答】 #include intmain() { std: : cout<<"Entertwonumbers: "< : endl; intv1,v2; std: : cin>>v1>>v2;//读入数据 if(v1>=v2) std: : cout<<"Thebiggernumberis"< : endl; else std: : cout<<"Thebiggernumberis"< : endl; return0; } 习题1.17 编写程序,要求用户输入一组数。 输出信息说明其中有多少个负数。 【解答】 #include intmain() { intamount=0,value; //读入数据直到遇见文件结束符,计算所读入的负数的个数 while(std: : cin>>value) if(value<=0) ++amount; std: : cout<<"Amountofallnegativevaluesreadis" < : endl; return0; } 习题1.18 编写程序,提示用户输入两个数并将这两个数范围内的每个数写到标准输出。 C++Primer(4版)习题解答 12 【解答】 #include intmain() { std: : cout<<"Entertwonumbers: "< : endl; intv1,v2; std: : cin>>v1>>v2;//读入两个数 //用较小的数作为下界lower、较大的数作为上界upper intlower,upper; if(v1<=v2){ lower=v1; upper=v2; }else{ lower=v2; upper=v1; } //输出从lower到upper之间的值 std: : cout<<"Valuesof"< < "< : endl; for(intval=lower;val<=upper;++val) std: : cout< return0; } C++Primer(4版)习题解答 13 习题1.19 如果上题给定数1000和2000,程序将产生什么结果? 修改程序,使每一行输出 不超过10个数。 【解答】 所有数的输出连在一起,不便于阅读。 程序修改如下: #include intmain() { std: : cout<<"Entertwonumbers: "< : endl; intv1,v2; std: : cin>>v1>>v2;//读入两个数 //用较小的数作为下界lower、较大的数作为上界upper intlower,upper; if(v1<=v2){ lower=v1; upper=v2; }else{ lower=v2; upper=v1; } //输出从lower到upper之间的值 std: : cout<<"Valuesof"< < "< : endl; for(intval=lower,count=1;val<=upper;++val,++count){ std: : cout< if(count%10==0)//每行输出10个值 std: : cout< : endl; } return0; } 粗黑体部分为主要的修改: 用变量count记录已输出的数的个数;若count的 值为10的整数倍,则输出一个换行符。 习题1.20 编写程序,求用户指定范围内的数的和,省略设置上界和下界的if测试。 假定 输入数是7和3,按照这个顺序,预测程序运行结果。 然后按照给定的数是7和 3运行程序,看结果是否与你预测的相符。 如果不相符,反复研究关于for和 while循环的讨论直到弄清楚其中的原因。 【解答】 可编写程序如下: //1-20.cpp //省略设置上界和下界的if测试,求用户指定范围内的数的和 #include intmain() { std: : cout<<"Entertwonumbers: "< : endl; intv1,v2; std: : cin>>v1>>v2;//读入数据 intsum=0; //求和 for(intval=v1;val<=v2;++val) sum+=val;//sum=sum+val std: : cout<<"Sumof"< <<"to"< <<"inclusiveis" < : endl; return0; } 如果输入数据为7和3,则v1值为7,v2值为3。 for语句头中将val的初 始值设为7,第一次测试表达式val<=v2时,该表达式的值为false,for语 句的循环体一次也不执行,所以求和结果sum为0。 习题1.21 本书配套网站(章的代 码目录下有Sales_item.h源文件。 复制该文件到你的工作目录。 编写程序, 循环遍历一组书的销售交易,读入每笔交易并将交易写至标准输出。 【解答】 #include #include"Sales_item.h" intmain() { Sales_itembook; //读入ISBN,售出书的本数,销售价格 std: : cout<<"Entertransactions: "< : endl; while(std: : cin>>book){ C++Primer(4版)习题解答 16 //输出ISBN,售出书的本数,总收入,平均价格 std: : cout<<"ISBN,numberofcopiessold," <<"totalrevenue,andaveragepriceare: " < : endl; std: : cout< : endl; } return0; } 习题1.22 编写程序,读入两个具有相同ISBN的Sales_item对象并产生它们的和。 【解答】 #include #include"Sales_item.h" intmain() { Sales_itemtrans1,trans2; //读入交易 std: : cout<<"Entertwotransactions: "< : endl; std: : cin>>trans1>>trans2; if(trans1.same_isbn(trans2)) std: : cout<<"Thetotalinformation: "< : endl <<"ISBN,numberofcopiessold," <<"totalrevenue,andaveragepriceare: " < : endl< C++Primer(4版)习题解答 17 else std: : cout<<"ThetwotransactionshavedifferentISBN." < : endl; return0; } 习题1.23 编写程序,读入几个具有相同ISBN的交易,输出所有读入交易的和。 【解答】 #include #include"Sales_item.h" intmain() { Sales_itemtotal,trans; //读入交易 std: : cout<<"Entertransactions: "< : endl; if(std: : cin>>total){ while(std: : cin>>trans) if(total.same_isbn(trans))//ISBN相同 total=total+trans; else{//ISBN不同 std: : cout<<"DifferentISBN."< : endl; return–1; } //输出交易之和 C++Primer(4版)习题解答 18 std: : cout<<"Thetotalinformation: "< : endl <<"ISBN,numberofcopiessold," <<"totalrevenue,andaveragepriceare: " < : endl< } else{ std: : cout<<"Nodata? ! "< : endl; return–1; } return0; } 习题1.24 编写程序,读入几笔不同的交易。 对于每笔新读入的交易,要确定它的ISBN是 否和以前的交易的ISBN一样,并且记下每一个ISBN的交易的总数。 通过给定 多笔不同的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Primer第4 版习题解答 Primer 习题 解答