1、第二章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+编写的程序质量高,从开发时间、费用到形成的软件的可重用性、可扩充性、可维护性和可靠性等方面有了很大的提高,使得大中型的程
2、序开发变得更加容易。(4)增加了面向对象的机制,几乎支持所有的面向对象程序设计特征,体现了近20年来在程序设计和软件开发领域出现的新思想和新技术,主要包括:l 抽象数据类型;l 封装与信息隐藏;l 以继承方式实现程序的重用;l 以函数重载、运算符重载和虚函数来实现多态性;l 以模板来实现类型的参数化。C+语言最有意义的方面是支持面向对象的特征,然而,由于C+与C保持兼容,使得C+不是一个纯正的面向对象的语言,C+既可以用于面向过程的结构化程序设计,也可以用于面向对象的程序设计。2_2下面是一个C程序,改写它,使它采用C+风格的i/o语句改写如下:#include using namespace
3、 std;int main()int a,b,d,min;couta;cinb;min=ab?b:a;for(d=2;dmin;d+)if(a%b)=0)&(b%d)=0) break;if(d=min)cout”no common denominatorsn”;return 0;cout”the lowest common denominator is “endld;return 0;2_3测试下面的注释是否有效?此注释有效,单行注释中可以嵌套/*.*/方式的注释。2_4以下简单的C+程序不可能编译通过,为什么?原因是:在程序中,当一个函数的定义在后,而对它的调用在前时,必须将该函数的原型写
4、在调用语句之前,而在本程序中缺少函数原型语句。在语句:using namespace std;后加上函数原型语句sum(int a,int b);就可以通过了。2_5(1)答:这两个函数原型是等价的,因为函数原型中的参数名可以缺省。(2)答:这两个函数的第一行是不等价的,函数的第一行中必须包含参数名。2_6-2_17D D A A B A C B D C D C2_18答:运行结果为:101说明:在语句:i=i+1;中赋值号左边:i的i单元是全局变量,赋值号右边的i单元是局部变量i。所以执行该语句的结果是将局部变量i的值+1(101)赋值给全局变量i2_19答:结果是:10 10说明:函数f(
5、int &m,int n)中的第一个参数是引用,引用参数是一种按地址传递参数的方法,对其的调用是传地址调用;而第二个参数是变量参数,对它的调用是通常的传值调用。所以运行后,a的值被改为10,b的值不变,仍为102_20答:输出结果为:1020因为f函数的参数是引用,所以修改k的值有效。函数调用后,主函数中k的值变为10。由于m是对函数的引用,当m被赋值为20时,k的值也变为20。2_21 举例说明可以使用const替代#define以消除#define的不安全性答:例如:#include using namespace std;#define A 2+4#define B A*3int mai
6、n()coutBendl;return 0;上面程序的运行结果是14而不是18,但很容易被认为是18。用const替代#define就能得到正确结果,从而消除了#define的不安全性。#include using namespace std;const A=2+4;const B=A*3; int main()coutBendl;return 0;运行结果为18。2_22 用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中。答:#include using namespace std;int main()int *p=new int20;/动态分配20个整型空间
7、*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+;/指向下一个空间return 0;结果:112358132134558914423337761098715972584418167652_23 建立一个被称为sroot()的函数,返回其参数的二次方根。重载sroot()三次,让它返回整数、长整数与双精度数的二次方根(计算二次方根时
8、,可以使用标准库函数sqrt())#include #include using namespace std;double sroot(int i) return sqrt(i); /i是整数double sroot(long l) return sqrt(l); /l是长整型double sroot(double d) return sqrt(d); /d是双精度int main()int i=12;long l=1234;double d=12.34;cout“i的二次方根是:”sroot(i)endl;cout“l的二次方根是:”sroot(l)endl;cout“d的二次方根是:” s
9、root(d)endl;return 0;2_24 编写C+风格的程序,解决百钱问题,将一元人民币兑换成1、2、5分的硬币,有多少种换法?#include using namespace std;int main()int i,j,sum=0;for(i=0;i=20;i+)for(j=0;j=0)sum+;cout100-5*i-2*j”t”j”t”iendl;cout”sum is “sumendl;return 0;2_25#include using namespace std;int main()void change(int &,int &);int a,b;cinab;if(ab
10、) change(a,b);couta”,”bendl;return 0;void change(int &a1,int &b1);int temp;temp=a1;a1=b1;b1=temp;2_26 编写C+风格的程序,用二分法求解f(x)=0的根#include #include using namespace std;inline float f(float x)return 2*x*x*x-4*x*x+3*x-6;int main()float left,right,middle,ym,yl,yr;cout”pleass two number:”leftright;yl=f(left);yr=f(right);domiddle=(right+left)/2;ym=f(middle);if(yr*ym0)right=middle;yr=ym;elseleft=middle;yl=ym;while(fabs(ym)=1e-6);cout”nRoot is:”middleendl;return 0;本例使用了内联函数f(x),因为在主函数中多次调用它,这样可以加快代码执行的速度。输入两个数:-10 10结果:Root is 2