第二章[2_1]简述C++的主要特点C++语言的主要特点表现在两个方面,一是全面兼容C,并对C的功能作了不少扩充,二是增加了面向对象的机制,具体表现为:(1)C++是C的超集,C++保持与C的兼容,这就使许多C代码不经修改就可以为C++所用,用C编写的众多的库函数和实用软件可以用于C++中。(2)C++是一个更好的C,它保持了C的简洁、高效和接近汇编语言等特点,并对C的功能做了不少扩充。用C++编写的程序比C更安全,可读性更好,代码结构更合理,C++的编译系统能够检查出更多的类型错误。(3)用C++编写的程序质量高,从开发时间、费用到形成的软件的可重用性、可扩充性、可维护性和可靠性等方面有了很大的提高,使得大中型的程序开发变得更加容易。(4)增加了面向对象的机制,几乎支持所有的面向对象程序设计特征,体现了近20年来在程序设计和软件开发领域出现的新思想和新技术,主要包括:抽象数据类型;封装与信息隐藏;以继承方式实现程序的重用;以函数重载、运算符重载和虚函数来实现多态性;以模板来实现类型的参数化。C++语言最有意义的方面是支持面向对象的特征,然而,由于C++与C保持兼容,使得C++不是一个纯正的面向对象的语言,C++既可以用于面向过程的结构化程序设计,也可以用于面向对象的程序设计。[2_2]下面是一个C程序,改写它,使它采用C++风格的i/o语句改写如下:#includeiostreamusingnamespacestd;intmain(){inta,b,d,min;cout”entertwonumbers:“;cina;cinb;min=ab?b:a;for(d=2;dmin;d++)if((a%b)==0)&&((b%d)==0))break;if(d==min){cout”nocommondenominators\n”;return0;}cout”thelowestcommondenominatoris“endld;return0;}[2_3]测试下面的注释是否有效?此注释有效,单行注释中可以嵌套/*……….*/方式的注释。[2_4]以下简单的C++程序不可能编译通过,为什么?原因是:在程序中,当一个函数的定义在后,而对它的调用在前时,必须将该函数的原型写在调用语句之前,而在本程序中缺少函数原型语句。在语句:usingnamespacestd;后加上函数原型语句sum(inta,intb);就可以通过了。[2_5](1)答:这两个函数原型是等价的,因为函数原型中的参数名可以缺省。(2)答:这两个函数的第一行是不等价的,函数的第一行中必须包含参数名。[2_6]----[2_17]DDAABACBDCDC[2_18]答:运行结果为:101说明:在语句::i=i+1;中赋值号左边::i的i单元是全局变量,赋值号右边的i单元是局部变量i。所以执行该语句的结果是将局部变量i的值+1(101)赋值给全局变量i[2_19]答:结果是:1010说明:函数f(int&m,intn)中的第一个参数是引用,引用参数是一种按地址传递参数的方法,对其的调用是传地址调用;而第二个参数是变量参数,对它的调用是通常的传值调用。所以运行后,a的值被改为10,b的值不变,仍为10[2_20]答:输出结果为:1020因为f函数的参数是引用,所以修改k的值有效。函数调用后,主函数中k的值变为10。由于m是对函数的引用,当m被赋值为20时,k的值也变为20。[2_21]举例说明可以使用const替代#define以消除#define的不安全性答:例如:#includeiostreamusingnamespacestd;#defineA2+4#defineBA*3intmain(){coutBendl;return0;}上面程序的运行结果是14而不是18,但很容易被认为是18。用const替代#define就能得到正确结果,从而消除了#define的不安全性。#includeiostreamusingnamespacestd;constA=2+4;constB=A*3;intmain(){coutBendl;return0;}运行结果为18。[2_22]用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中。答:#includeiostreamusingnamespacestd;intmain(){int*p=newint[20];//动态分配20个整型空间*p=1;*(p+1)=1;//前面两个空间赋值1cout*p”\t”*(p+1)”\t”;p=p+2;//p指向第三个空间for(i=3;i=20;i++){*p=*(p-1)+*(p-2);cout*p”\t”;//”\t”表示的就是键盘上的Tab键,称为跳格键,一般等于8个空格的长度if(i%5==0)coutendl;p++;//指向下一个空间}return0;}结果:11235813213455891442333776109871597258441816765[2_23]建立一个被称为sroot()的函数,返回其参数的二次方根。重载sroot()三次,让它返回整数、长整数与双精度数的二次方根(计算二次方根时,可以使用标准库函数sqrt())#includeiostream#includecmathusingnamespacestd;doublesroot(inti){returnsqrt(i);}//i是整数doublesroot(longl){returnsqrt(l);}//l是长整型doublesroot(doubled){returnsqrt(d);}//d是双精度intmain(){inti=12;longl=1234;doubled=12.34;cout“i的二次方根是:”sroot(i)endl;cout“l的二次方根是:”sroot(l)endl;cout“d的二次方根是:”sroot(d)endl;return0;}[2_24]编写C++风格的程序,解决百钱问题,将一元人民币兑换成1、2、5分的硬币,有多少种换法?#includeiostreamusingnamespacestd;intmain(){inti,j,sum=0;for(i=0;i=20;i++)for(j=0;j=50;j++)if(100-5*i-2*j=0){sum++;cout100-5*i-2*j”\t”j”\t”iendl;}cout”sumis“sumendl;return0;}[2_25]#includeiostreamusingnamespacestd;intmain(){voidchange(int&,int&);inta,b;cinab;if(ab)change(a,b);couta”,”bendl;return0;}voidchange(int&a1,int&b1);{inttemp;temp=a1;a1=b1;b1=temp;}[2_26]编写C++风格的程序,用二分法求解f(x)=0的根#includeiostream#includecmathusingnamespacestd;inlinefloatf(floatx){return2*x*x*x-4*x*x+3*x-6;}intmain(){floatleft,right,middle,ym,yl,yr;cout”pleasstwonumber:”endl;//接收输入,确定第一组数据区域cinleftright;yl=f(left);yr=f(right);do{middle=(right+left)/2;ym=f(middle);if(yr*ym0){right=middle;yr=ym;}else{left=middle;yl=ym;}}while(fabs(ym)=1e-6);cout”\nRootis:”middleendl;return0;}本例使用了内联函数f(x),因为在主函数中多次调用它,这样可以加快代码执行的速度。输入两个数:-1010结果:Rootis2