1、c面向对象程序设计课后习题解答谭浩强第1章C+的初步知识1 请根据你的了解,叙述 C+的特点。C+对C有哪些发展?【解】略。2个C+的程序是由哪几部分构成的?其中的每一部分起什么作用?【解】略。3从拿到一个任务到得到最终结果,一般要经过几个步骤?【解】略。4请说明编辑、编译、连接的作用。在编译后得到的目标文件为什么不能直接运行?【解】编译是以源程序文件为单位进行的,而一个完整的程序可能包含若干个程序文件,在分别对它 们编译之后,得到若干个目标文件(后缀一般为 .obj ),然后要将它们连接为一个整体。此外,还需要与编译系统提供的标准库相连接,才能生成一个可执 行文件(后缀为 .exe )。不能
2、直接运行后缀为 .obi的目标文件,只能运行后缀为 .exe的可执行 文件。5.分析下面程序运行的结果。#i ncludeusing n amespacestd;int main(cout This is ;cout a C+;cout program. endl;return 0;【解】输出的结果为ThisisaC+program.6 分析下面程序运行的结果。#i ncludeusing n amespacestd;int main(int a,b,c;a=10;b=23;c=a+b;cout a+b=;coutcout abc;c=f(a,b,c;cout a+b= a+b;解】上机编译出
3、错,编译出错信息告知在第2行出错,经检查,发现第1行的末尾多了一个分号,编译系 统无法理解第2行的花括号,导致报告第2行出错。将第行的末尾的分号去掉,重新編译,编 译出 错信息告知在第5行和第6行出错。第5行出错原因是cout未经声明,因为cout不是C+语言提供的 系统的关键字,而是输出流的对象,必须使用头文件iostream。第行出错原因是main是i nt型函 数,应返回一个整型值。将程序改为#i ncludeint main(int a,b;c=a+b;cout a+b= a+b;return 0;重新编译。编译出错信息告知在第5行和第6行出错。第5行出错原因是变量c未定义,第6行出错
4、 原因是cout未经声明,说明#include命令行未能起作用,原因是未指明命名空 间。将程序改为#includeusing namespacestd;int main(int a,b,c;c=a+b;cout a+b= a+b;return 0;重新编译。编译出错信息告知在第 7行出错,经检查 ,是“”用得不当, “”是提取运算符, 应与 cin联合使用,用来从 输入流中提取数据, 输出时应该 用插入运算符 把两处“都改为ab;c=a+b;cout a+b= a+b;return 0;C+重新编译,没有编译错误,能通过编译和连接,可以正常运行,在Visual6.0环境下运行 时屏幕显示如下:
5、5 9/a+b=14Press any key to continue显然这样的输出不理想,“ Press any key to continue 是VisualC+系统在输出了运行 结果后自动显示的一个信息,告 诉用户 如果想继续工作,请按任何一个 键”当用户按任何一个键后,显示运行结果的窗口消失,屏幕显示回到VisualC+的主窗口,显示出源程序和 编译信息。为了解决以上 输出不理想的情况,可以在最后一个 输出语句中增加 输出一个换行符。最后的程序如下:#i ncludeusing n amespacestd;int main(int a,b,c;cin ab;c=a+b;couta+b=
6、return 0;运行时屏幕显示如下:5 9/a+b=14Press any key to continue这就完成了程序的调试。这里对本题的调试过程作了比 较详细的分析,以便使 读者对如何调试程序有比较具体而清 晰的了解。需要说明:1 )编译系统给出的编译出错信息,只是提示性的,引 导用户去检查错误,用户必须根据程 序的上下文和 编译出错信息,全面考 虑,找出真正出 错之处。例如编译出错信息通知第2行出 错,其实可能是第1行出错。2)有寸,有的错误开始时未被检查出来并告知用 户(例如未定义变量c),由于其他错误未 解决,掩盖了 这个错误。当解决了其他 错误后,这个错误会被检查出来。有时在调试
7、过 程中会不 断检查 出新的 错误 ,这是不奇怪的。一一 处理,问题 会迎刃而解。(3)为了说明调试过 程,这里全部依靠 计算机系 统来检查错误 ,其实有些明 显的错误,完全 可以由人 工查出,这样可以提高调试效率。由人工在纸面或屏幕上检查错误,称为静态查错, 用计算机编译系统检查错误,称为动态查错。建议尽量先用静态查错的方法排除错误,只有人 工检查不出来的错误才让计算机检查。9输入以下程序, 进行编译,观察编译情况,如果有错误,请修改程序,再 进行编译,直到 没有错误,然后进行连接和运行,分析运行 结果。#includeusing namespacestd;int main(int a,b;
8、c=add(a,bcouta+b= a b;c=add(a,b;cout a+b= c x y z;sort(x,y,z;return 0;void sort(int x, int y, int zint temp;if (xy temp=x;x=y;y=temp; / 内3个语句的作用是将x和y的值互换if (z , x , y endl;else if (z , z , y endl;else cout x , y , z a b c;cout max(a,b,c= max(a,b,c endl;cout max(a,b= a a=b;if(ca a=c;return a;运行情况如下:1
9、3 5 76 /max(a, b, c=76 (从3个数中找最大者)max(a,b=13 (从前2个数中找最大者)如果想从3个数中找大者,可以在调用时写成max(a,b,c ”形式,如果只想从2个数中找大 者,则在调用时写成max(a,b ”形式,此时c自动取默认值0,由于0比任何正整数都小,因此从1 4,5, 0中选最大者和从14,5中选大者的结果是一样的。12.输入两个整数,将它们按由大到小的顺序输出。要求使用变量的引用。解】可以编写出以下程序:#i ncludeusing n amespacestd;int main( void change(int &,int &;int a,b;ci
10、n ab;if(a如果a,使a和b的值互换cout max= min= return 0;void change(int &r1,int &r2 / 函数的作用是使r1与r2互换 int temp;temp=r1;r1=r2;r2=temp;运行情况如下:12_67/max=67 min=1213.对3个变量按由小到大顺序排序,要求使用变量的引用。解】可以编写出以下程序:#in cludeusing namespace std;int main(void sort(int &,int &,int &;int a,b,c,a1,b1,c1;cout abc;a1=a;b1=b;c1=c;sort
11、(a1,b1,c1;cout in sorted order is;cout j chan ge(i, j;if (ik change(i, k;if (jk change(j, k;void change(int &x,int &y int temp;temp=x;x=y;y=temp;运行情况如下:Please enter 3 integers:2367-55/23 67 -55 in sorted order is -55 23 67这个程序 很容易理解,不易 出错。由于在调用sort函数时虚实 结合使形参i,j,k成为实参a1,b1,c1的引用(别名),因此 通过调用函数sort (a
12、1,b1,c1)既实现了对i,j,k排序,也就同 时实现了对a1,b1,c1排序。同样,执行cha nge ( i,j)函数,可以实现 对实参i利的互换。14.编一程序,将两个字符串连接起来,结果取代第一个字符串。要求用string方法。【解】可以编写出以 下程序:#include#include / 程 序中若 使 用字符串变量,必须包 含头文件 stringusing namespace std;int main( string s1= week ,s2= end ;cout s1= s1 endl;cout s2= s2 endl;s1=s1+s2;cout The new string
13、 is: str; /输入一个字 符串赋给字符串变量strn=str.size( ; /测量 str 的长度nfor(i=0;i /使str中的字符 对称互换temp=stri;stri=strn -i-1;strn -i-1=temp;cout str endl;return 0;运行情况如下:please in put a stri ng:LIGHT /THGIL注意:输入的字符串中不能含有空格。16.有5个字符串,要求将它们按由小到大的顺序排列,用string方法。 【解】可以编写出以下程序:#i nclude#i ncludeusing namespace std;int main(
14、int i;string str5= BASIC ,” C,” FORTRAN ,” C+ ,” PASCAL ;void sort(string ;sort(str; /对字符串排序cout the sorted strings : for(i=0;i5;i+cout ” ; /按已排好 的顺序输出字符串coutreturn 0;void sort(string s int i, j;string t;for (j=0; j5; j+for(i=0; isi+1t=si;si=si+1;si+1=t;运行结果 如 下:the sorted strings :BASIC C C+ FORTRA
15、N PASCAL17.编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单 精度型、双精度型。用重载函数实现。【解】可以编写出以 下两个程序:(1)建立3个函数,分别用于处理整型 、单精度型 、双精度型数据的排序,在3个函数中都采 用选择 法排序方法。#include#includeusing namespace std;int main(long a5=10100, -123567, 1198783,-165654, 3456;int b5=1,9,0,23, -45;float c5=2.4, 7.6, 5.5, 6.6, - 2.3 ;void sort(long
16、 ;void sort(int ;void sort(float ;sort(a;sort(b;sort(c;return 0;void sort(long a int i, j;long t;for (j=0; j5; j+for(i=0;iai+1 t=ai;ai=ai+1;ai+1=t; cout the sorted numbers : for(i=0;i5;i+cout ;coutvoid sort(int a int i, j, t;for (j=0; j5; j+ for(i=0;iai+1 t=ai;ai=ai+1;ai+1=t; cout the sorted numbers
17、 : for(i=0;i5;i+cout ;coutvoid sort(float a int i, j;float t;for (j=0;j5;j+for(i=0;iai+1 t=ai;ai=ai+1;ai+1=t; cout the sorted numbers : for(i=0;i5;i+ cout ;cout运行结果如下:the sorted numbers :- 123567 - 165654 10100 3456 1198783 (长 整型数据排序)the sorted numbers : (整型数据排序)-45 0 1 9 23the sorted numbers :-2.3
18、2.4 5.5 6.6 7.6 (单 精度型数据排序)选择 法排序,在下面的程个函数采用起泡法排序(2)在第1种方法中, 3个函数的函数体基本上是相同的,都是采用 序中,3个函数的函数体不全相同,前两个函数采用 选择 法排序,最后#include#includeusing namespacestd;int main( long a5= 10100, - 123567, 1198783,- 165654, 3456;int b5=1,9,0,23, - 45;float c5=2.4, 7.6, 5.5, 6.6, - 2.3 ; void sort(int ;void sort(float ;
19、void sort(long ;sort(a; /对长 整型数据排序sort(b; /对 整型数据排序 sort(c; /对单 精度型数据排序 return 0;void sort(long a /对长整型数据用 选择 法排序的函数 int i,j,min;long t; for(i=0;i5;i+min=i;for (j=i+1;jaj min=j;t=ai; ai=amin; amin=t; cout the sorted numbers : for(i=0;i5;i+ cout ;coutvoid sort(int a /对整型数据用 选择 法排序的函数 int i, j, t;for
20、(j=0; j5; j+ for(i=0;iai+1t=ai;ai=ai+1;ai+1=t; cout the sorted numbers : for(i=0;i5;i+cout ;coutvoid sort(float a /对单 精度型数据用起泡法排序的函数int i, j;float t;for (j=0;j5;j+for(i=0;iai+1t=ai;ai=ai+1;ai+1=t;cout the sorted numbers : for(i=0;i5;i+cout ;cout运行结果如下:the sorted numbers :-123567 -165654 10100 3456 1198783 (长 整型数据排序 结 果)the sorted numbers : (整型数据排序
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1