1、第 1 章谭浩强 C+课后习题答案1请根据你的了解,叙述 C+ 的特点。C + 对 C 有哪些发展?【解】 略。2一个 C+的程序是由哪几部分构成的?其中的每一部分起什么作用?【解】 略。3从拿到一个任务到得到最终结果,一般要经过几个步骤?【解】 略。4请 说 明 编 辑 、 编 译 、 连 接 的 作 用 。 在 编 译 后 得 到 的 目 标 文 件 为 什 么 不 能 直 接运 行 ?【解】 编译是以源程序文件为单位进行的,而一个完整的程序可能包含若干个程序文件,在分别对它们编译之后,得到若干个目标文件(后缀一般为.obj),然后要将它们连接为一个整体。此外,还需要与编译系统提供的标准库
2、相连接,才能生成一个可执行文件(后缀为.exe)。不能直接运行后缀为.obj 的目标文件,只能运行后缀为.exe 的可执行文件。5分析下面程序运行的结果。#include using namespace std;int main( )coutusing namespace std;int main( )int a,b,c;a=10;b=23;c=a+b;coutusing namespace std;int main( )int a,b,c;int f(int x,int y,int z);cinabc;c=f(a,b,c);cout“ a+b=“ a+b; 【解】 上机编译出错,编译出错信息
3、告知在第 2 行出错,经检查,发现第 1 行的末尾多了一个分号,编译系统无法理解第 2 行的花括号,导致报告第 2 行出错。将第1 行的末尾的分号去掉,重新编译,编译出错信息告知在第 5 行和第 6 行出错。第 5 行出错原因是 cout 未经声明,因为 cout 不是 C+语言提供的系统的关键字,而是输出流的对象,必须使用头文件 iostream。第 6 行出错原因是 main 是 int 型函数,应返回一个整型值。将程序改为#include int main( )int a,b;c=a+b;cout “ a+b=“ a+b;return 0; 重新编译。编译出错信息告知在第 5 行和第 6
4、 行出错。第 5 行出错原因是变量 c 未定义,第 6 行出错原因是 cout 未经声明,说明#include 命令行未能起作用,原因是未指明命名空间。将程序改为#include using namespace std;int main( )int a,b,c;c=a+b;cout“ a+b=“ a+b;return 0;C+面向对象程序设计题解与上机指 导 6 重新编译。编译出错信息告知在第 7 行出错,经检查,是“”用得不当,“ ”是提取运算符,应与 cin 联合使用,用来从输入流中提取数据,输出时应该用插入运算符“ ”都改为“using namespace std;int main( )
5、int a,b,c;cinab;c=a+b;cout“ a+b=“ a+b;return 0;重新编译,没有编译错误,能通过编译和连接,可以正常运行,在 Visual C+ 6.0 环境下运行时屏幕显示如下:5 9a+b=14Press any key to continue显然这样的输出不理想,“Press any key to continue”是 Visual C+系统在输出了运行结果后自动显示的一个信息,告诉用户“如果想继续工作,请按任何一个键”。当用户按任何一个键后,显示运行结果的窗口消失,屏幕显示回到 Visual C+的主窗口,显示出源程序和编译信息。为了解决以上输出不理想的情况
6、,可以在最后一个输出语句中增加输出一个换行符。最后的程序如下:#include using namespace std;int main( )int a,b,c;cinab;c=a+b;coutusing namespace std;int main( )int a,b;c=add(a,b)coutusing namespace std;int main( )int add(int x,int y);int a,b,c;cin a b;c=add(a,b);cout using namespace std;int main( ) void sort(int x,int y,int z);int
7、 x,y,z;cin x y z;sort(x,y,z);return 0;void sort(int x, int y, int z)int temp;if (xy) temp=x;x=y;y=temp; / 内 3 个语句的作用是将 x 和 y 的值互换if (zusing namespace std;int main( )int max(int a,int b,int c=0);int a,b,c;cin a b c;cout a) a=b;if(ca) a=c;return a;运行情况如下:13 5 76max(a,b,c)=76 (从 3 个数中找最大者)max(a,b)=13 (
8、从前 2 个数中找最大者)如 果 想 从 3 个 数 中 找 大 者 , 可 以 在 调 用 时 写 成 “max(a,b,c)”形 式 , 如 果 只 想从 2 个 数 中 找 大 者 , 则 在 调 用 时 写 成 “max(a,b)”形 式 , 此 时 c 自 动 取 默 认 值 0,由 于 0 比 任 何 正 整 数 都 小 , 因 此 从 14, 5, 0 中 选 最 大 者 和 从 14, 5 中 选 大 者 的 结果 是 一 样 的 。12输入两个整数,将它们按由大到小的顺序输出。要求使用变量的引用。【解】 可以编写出以下程序:#includeusing namespace st
9、d;int main( ) void change(int int a,b;cinab;if(ausing namespace std;int main( )void sort(int int a,b,c,a1,b1,c1;coutabc;a1=a;b1=b;c1=c;sort(a1,b1,c1);coutj) change(i, j);if (ik) change(i, k);if (jk) change(j, k);void change(int temp=x;x=y;y=temp;运行情况如下:Please enter 3 integers:23 67 -5523 67 55 in so
10、rted order is 55 23 67这个程序很容易理解,不易出错。由于在调用 sort 函数时虚实结合使形参 i,j,k 成为实参 a1,b1,c1 的引用(别名),因此通过调用函数 sort(a1,b1,c1 )既实现了对 i,j,k排序,也就同时实现了对 a1,b1,c1 排序。同样,执行 change(i,j)函数,可以实现对实参 i 和 j 的互换。14编一程序,将两个字符串连接起来,结果取代第一个字符串。要求用 string 方法。【解】 可以编写出以下程序:#include #include /程序中若使用字符串变量,必须包含头文件 stringusing namespac
11、e std;int main( ) string s1= “ week “,s2= “ end “;C+面向对象程序设计题解与上机指 导 12cout #include using namespace std;int main( ) string str; /定义字符串变量 strint i,n;char temp; /定义字符变量 tempcoutstr; /输入一个字符串赋给字符串变量 strn=str.size( ); /测量 str 的长度 nfor(i=0;i#include using namespace std;第 1 章 C+ 的初步知识 13int main( ) int i
12、;string str5=“ BASIC“,“ C“,“ FORTRAN“,“ C+“,“PASCAL“;void sort(string );sort(str); /对字符串排序coutsi+1)t=si;si=si+1;si+1=t;运行结果如下:the sorted strings :BASIC C C+ FORTRAN PASCAL17编一个程序,用同一个函数名对 n 个数据进行从小到大排序,数据类型可以是整型、单精度型、双精度型。用重载函数实现。【解】 可以编写出以下两个程序:(1)建立 3 个函数,分别用于处理整型、单精度型、双精度型数据的排序,在 3个函数中都采用选择法排序方法。
13、#include #include using 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 );void sort(int );void sort(float );sort(a);sort(b);C+面向对象程序设计题解与上机指 导 14sort(c);return 0;void sort(long a )int i, j;long t;for (j=0; j
14、ai+1)t=ai;ai=ai+1;ai+1=t;coutai+1)t=ai;ai=ai+1;ai+1=t;coutai+1)t=ai;ai=ai+1;ai+1=t;cout#include using 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(int );void sort(float );void sort(long );sort(a); /对长整型数据排序so
15、rt(b); /对整型数据排序sort(c); /对单精度型数据排序return 0;void sort(long a ) /对长整型数据用选择法排序的函数int i,j,min;long t;for(i=0;iaj) min=j;t=ai; ai=amin; amin=t; coutai+1)t=ai;ai=ai+1;ai+1=t;coutai+1)t=ai;ai=ai+1;ai+1=t;cout#include using namespace std;template 第 1 章 C+ 的初步知识 17void sort(T a ) /函数模板,采用选择法排序int i, j, min;T
16、 t;for(i=0;iaj) min=j;t=ai; ai=amin; amin=t; cout“ the sorted numbers : “endl;for(i=0;i5;i+)coutai “ “;coutendlendl;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 ;sort(a);sort(b);sort(c);return 0;运行结果如下:the sorted numbers :-123567 -165654 10100 3456 1198783 (长整型数据排序)the sorted numbers : (整型数据排序)-45 0 1 9 23the sorted numbers :-2.3 2.4 5.5 6.6 7.6 (单精度型数据排序)对比第 17 题和 18 题,可以看到,如果重载函数的函数体基本相同的话,用函数模板显然更方便,可以压缩程序篇幅,使用方便。