C++语言与面向对象的设计习题及参考解答_第1页
C++语言与面向对象的设计习题及参考解答_第2页
C++语言与面向对象的设计习题及参考解答_第3页
C++语言与面向对象的设计习题及参考解答_第4页
C++语言与面向对象的设计习题及参考解答_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c+语言与面向对象的设计第1至13章习题参考答案习题1参考答案1 用最简练的语言解释下列词汇在面向对象程序设计中的含义:对象,类,方法,接口,消息,封装,继承,服务答:对象是客观世界中的实体在计算机中的表示。是一组数据成员和方法成员的封装体。是类类型的实例。类是一种抽象数据类型。是一组对象共性的描述。方法是在一个类中定义的过程或函数,实现类的功能的代码。接口是对象封装体向外部公布的一组具有公有属性的方法。是从对象外部与对象通信的唯一途径。消息是对象之间的通信机制,对象的客户通过接口方法调用请求对象服务称为消息调用。对象之间通过消息传递,互相协调、配合,共同实现软件系统的整体设计目标。消息的载体

2、是对象提供的公有方法,即对象的接口。封装有以下两重含义:首先,是指将描述客观实体数据特征的数据和方法特征的代码组织在一起,作为一个整体,并为该整体命名标识,以区别于其它数据和程序代码。其次,通过对该整体内成员的访问属性的规定,使一部分成员的隐藏起来,对于封装体外成为不可见的,同时使另一部分成员对外开放,作为与外部交流的接口。继承是面向对象程序设计方法中描述的两个类之间一种增量包含关系。这两个类具有一种父子关系,子类通过为父类添加新的成员而创建。继承提供了利用一个类的代码创建新类的重用方法。继承关系也是对客观世界分类层次关系的一种模拟。服务即对象通过公有方法向外部提供功能。1. 2 试列举过程化

3、、模块化、结构化等程序设计方法的主要特点。面向对象程序设计是如何包容和吸收其它几种程序设计方法的有用成分的。答:过程化程序设计方法以过程或函数作为程序的基本构造单位。侧重于算法表达和过程间参数传递的组织。模块化程序设计方法以独立编译的源程序模块作为大型应用程序的基本组织单位。注重于应用程序的开发管理。包括系统开发的任务分解、模块间通信管理、可重用代码库的组织、由不同语言生成的目标模块的连接等方面。结构化等程序设计方法以单入口单出口的可嵌套基本控制结构作为程序构造单位。提倡自顶向下的分析和自底向上的设计相结合的软件系统构造方法。重点关注程序结构清晰,以获得程序的可理解性和可维护性。面向对象程序设

4、计方法包容了以上三种方法的所有积极成分。对象中包含的方法实际上就是过程或函数,方法的参数传递与过程或函数的传递都是利用堆栈进行的。在方法的实现时仍然用单入口单出口的基本控制结构编程。系统构造仍然使用自顶向下的分析和自底向上的设计过程。并用模块化方法管理整个系统的开发,整个软件系统由若干独立编译的源程序文件组成。面向对象方法对于以前程序设计方法的质的跃变在于将中算法与数据结构的多对多依赖变成了相互间的单一依赖关系。1. 3面向对象程序设计方法成功地取代其它程序设计方法在程序设计领域的主导地位有哪些根本原因?答:面向对象程序设计方法成功地取代其它程序设计方法的主要原因是(1)计算机软硬件技术的超高

5、速发展,促进了计算机应用领域的迅速扩展,带来了大规模复杂系统的开发需求。 (2) 程序设计方法研究中不断提高的数据抽象技术为复杂系统的开发带来了更有效、更能自然表示问题世界的系统构造模型。(3) 硬件设备的性能提高,足以支付新方法的存储空间冗余和时间开销的代价。1. 4 有人说对象是一个“黑盒子”,应该怎样看待这种说法?答:对象是一个“黑盒子”,这种说法是一个很贴切的比喻。所谓“黑盒子”,是指从用户的观点来看一个器件或产品时,并不关心其内部构造和原理,而只关心它的功能及如何使用这些功能。对象的封装性使对象的属性及功能的具体实现代码对于对象的客户是不可见的。客户只能通过接口方法使用对象功能。1.

6、 5 试分析“对象与其所属的应用程序”和“对象与其所属的类”这两种关系的区别。答:对象与其所属的应用程序的关系是个别和整体的关系,对象与其所属的类的关系是具体实例和它所对应的抽象概念的关系,二者不可混为一谈。1. 6试归纳总结子程序、过程、函数、方法、对象接口等概念的共同点及各自的特点。答:它们都是实现程序功能的代码块。子程序相对主程序而言,过程则关注本身的整体性。有时过程也特指无返回值的子程序。函数是有返回值的子程序,而且函数与数学中的函数概念一致,函数返回值与输入参数是“一一对应”或“一多对应”关系。函数的返回值与子程序的输出参数的概念是有区别的,一个函数只能有一个返回值而一个子程序可能有

7、多个输出参数。方法特指对象封装体中的过程或函数。对象接口是对象的公有方法。1. 7在一个医院里有医务人员、管理人员、后勤人员、临时工等人员。医务人员又分为医生、护士、化验员、药剂师。医生又有内科、外科、五官科、神经科之分。管理人员又分属为行政管理、设备管理、药品管理、财务管理等部门。请用面向对象的观点对上述信息进行分析,指出哪些是类,哪些是对象,并说明类与类之间存在的继承关系。若要根据上面的简要描述设计计算机医院人事管理系统,请画图表示上述人事关系。答:题目中提到的都是类,没有一个是类的实例,所以没有一个是对象。其中医务人员是基类,医生、护士、化验员、药剂师是它的四个子类,而内科医生、外科医生

8、、五官科医生、神经科医生又是医生的子类。另外管理人员是行政管理人员、设备管理人员、药品管理人员、财务管理人员等子类的基类。习题2参考答案21 c+与c语言的关系如何? 它们的本质区别是什么?答:c+由c语言继承而来,并在c语言的基础上增加了对面向对象程序设计的支持,是传统的结构化程序设计方法和面向对象程序设计方法的结合。c+保留了c语言的全部精华、与c语言兼容,又比c语言更适宜于管理大型、复杂的程序。二者的本质区别是:c是面向过程的语言,而c+是面向对象的语言。c是战术语言,而c+是战略语言。22 以下单词哪些是c+合法的标识符?public arrayi x3.5 3rd get_name

9、num1 _sot hi! x-y what? _for答:合法的标识符为:get_name、num1、_sot、_for。23 保留字与一般标识符有什么不同?答: 保留字又称关键字,是系统已预先定义的一些单词。这些单词虽然符合标识符的命名规则,但由于已经被c+语言预先赋予了特定的含义,因而不能被程序员用作一般的标识符来定义和使用。24 文件包含命令的形式如何?有什么作用?答: 文件包含命令的作用是让编译预处理器将指定文件的全部内容插入到当前源文件的该命令行处。它有两种形式:#include 和#include 文件名。二者的区别在于,前者主要用于嵌入系统提供的头文件(一般存于c+系统所在目录

10、的include子目录下),后者主要用于嵌入用户自己定义的文件。对于前者,c+预处理器将在include目录下搜索指定的头文件; 对于后者,c+预处理器先在当前目录中搜索指定文件,若找不到再到include目录下去搜索。25 什么叫源程序?c+程序在计算机上是如何实现的?答:用c+等高级语言编写的程序称为源程序。源程序是不能被计算机直接识别和执行的。c+程序在计算机上的实现包括编辑、编译、连接、运行几个步骤。其中编辑是指将源程序由键盘输入并保存,得到源程序文件; 编译是一个翻译过程,将c+源程序翻译成计算机能直接识别的机器语言程序,得到目标文件; 连接程序把各个目标文件和要用到的库文件连接在一

11、起,生成可执行文件,可执行文件是计算机能直接运行的文件。26 什么是空语句?它有什么作用?答:空语句是只有一个分号的语句。它主要用于语法上需要有一条语句但实际上又没有任何操作可执行的场合。27 什么是c+中的块?主要用于什么地方?答:块即复合语句或称分程序,是括在一对花括号之间的语句序列,在语法上相当于一条单语句,凡是在单语句可用的地方都可以使用复合语句。复合语句主要用于语法上要求只能有一条语句,但又难以只用一条简单语句表达的情形,如循环语句的循环体等; 或者用于形成局部化的封装体。28 判断下列描述的对与错:(1)c+和c语言都是面向对象的语言。(2)一个c+源程序可以分别存放在几个源文件中

12、。(3)c+对标识符内的英文字母是区分大、小写的。(4)预处理命令是在程序正常编译之后执行的。(5)一个源程序若通过编译、连接得到了exe文件,执行后就能得到正确的结果。(6)以下四种写法均是c+合法的注释语句: /* */ / /* */ */ / /*答: (1)错 (2)对 (3)对 (4)错 (5)错 (6)错29分析下面程序的功能。若输入为9和4,写出程序的运行结果。#includevoid main() int n1, n2 ; cout n1n2; cout ( n1 + n2 )/2= (n1 + n2 )/2 endl; 解答:程序的功能为:从键盘接收两个整数,计算输出整数部

13、分它们的平均值的。若输入为9和4,运行结果为:(9 + 4 )/2=6210 编一个小程序,完成小时数向秒数的转换。例如,若输入为2.5(小时),则输出为9000(秒)。参考程序:#include void main() float hours, seconds; couthours; seconds=hours*3600; coutthe second is : secondsendl; 习题3参考答案31 指出下列常量的类型: 34.5l 0x345 89f .7e3 8ul -869答:各常量的类型依次为:long double、int、float、double、unsigned lon

14、g int、signed int。32 判断下列描述的对错: (1)c+各基本类型的字宽和所能表示的数的范围在各种计算机上都是相同的。 (2)一个变量可以多次被赋值,所以可同时拥有不同的值。 (3)c+中的变量在使用之前必须先声明,而且必须在程序开头就声明。 (4)不同类型的指针分配到的内存空间的大小是一样的。 (5)将指针加1后,指针指向下一个字节。 (6)字符串 abx43xy的长度为8,在内存中占据9个字节。 (7)字符串可作为一个整体进行输入、输出,但不能作为整体进行赋值、比较等。 (8)在对数据进行强制类型转换时,可以不遵循隐式转换的原则。 答: (1) 错(2)错(3)错(4)对(

15、5)错(6)错(7)对(8)对33 写一段语句,对如下变量或常量进行声明: (1) double型变量b1和b2,其中b2的初始值为98.3; (2) int型的符号常量length,其值为5; (3) 字符串变量string,初始化为please enter b1 : ; (4) 指向b1的指针b1_ptr ; 答案:(1) double b1 , b2 ( 98.3) ; (2) const int length(5 ); (3) char string = please enter b1 : ; (4) double *b1_ptr = &b1 ; 34 在上题的基础上写一段语句完成下列

16、操作:(1)在屏幕上显示string; (2)从键盘接收b1的值; (3)将b2的值加上b1的值,仍赋给b2; (4)输出b1和b2的值; (5)将b1_ptr所指单元的内容加1并输出; (1) 答:在屏幕上显示string; cout string b1;(3)将b2的值加上b1的值,仍赋给b2; b2 = b2 + b1;(4)输出b1和b2的值; cout b1= b1 b2 = b2 endl ;(5)将b1_ptr所指单元的内容加1并输出; cout +*b1_ptr endl ; 35 分析下面程序的运行结果并上机验证。 #includevoid main() const doub

17、le pi(3.1415926),e(2.7182818);double r=0.5; cout(int)pi*r*r=(int)pi*r*rendl; coutint(e*1000)=int(e*1000)endl; coutpi=pi e=e= 73 ) (2) ( x != y ) | ( c b ) (3) z & y | x y (4) z | y & x y (5) 200 * x / y (6) double(x) / y +23 (7) x / y + 23 (8) c + y % x (9)x *= int(b/a) + y (10) c c = 2 | y % - x 0

18、(11) +x level; switch(level) case 1: cout one; break; case 1.5: cout one and a half; break; case 2: coutxy; if xy cout x else cout 0 ) cout* ; (4) 下面程序段用于计算23除以5的余数: float x = 23, y = 5, z; z = x % y; cout23 % 5 = z endl; (5) int i=0, j=9; for ( ; i+ != j- ; ) cout n; switch(n) case 1 : x = x +10; c

19、ase 2 : x = x-10; case 3 : x = x*2; default : ; 解答:(1)第一句和第六句错。switch后的表达式和case后的常量表达式只能是字符型、整型或枚举型,不能是浮点型。 (2)第二句错。if后的表达式要加括号; 句末应有分号。 (3)死循环。 (4)x、y、z应定义为整型(“%”的操作数应为整数)。 (5)死循环。 (6)各case子句中没有break语句,得到的结果与要求不一致。45 分析下面的程序的循环次数并写出运行结果: # include void main() int n=0 , total=0; do total=total+n; n+

20、; while ( n+ 20 ); cout total= total endl ; 答案:循环次数为10,运行结果为: total=11046 分析下面程序的功能并写出程序的运行结果: # include void main( ) int i=100, n=0; while (- i ) if ( i % 5 = 0 & i % 7 = 0 ) cout i endl ; n+ ; cout n= n endl ;答案:程序的功能为统计100以内的自然数中哪些既是5的倍数、又是7的倍数,以及这样的数有多少个。运行结果为: 70 35 n=2 47 编程求各位数字的和为偶数的三位数(例如16

21、3),并统计这样的数有多少个。参考程序:# include void main() int count = 0 , a , b , c ; for ( int i=100; i= 999; i + ) a=i/100 ; /a为百位数字 b=(i a*100 )/10 ; /b为十位数字 c=ia*100b*10 ; /c为个位数字 if ( (a+b+c) % 2 = 0 ) coutiendl; count +; coutcount=countendl; 48 编程计算下面的f(x): x2+6 (4x) f(x) = - x (0x4) x3+7x +9 (x0) 参考程序:# incl

22、ude void main() float x, f; coutx; if (4x) f = x*x+6; if (0x & x= 4) f = -x; if (x=0) f=x*x*x+7*x+9; coutf(x) = fendl; 49 编程:输入一个长整数,统计它的位数。参考程序:# include void main() long int n; int w; coutn; w = 1 ; while ( n /= 10 ) w+; coutwendl; 410 编程:从键盘输入一个以字符$结尾的字符串,统计其中0的个数、1的个数9的个数以及其它字符的个数。参考程序:# include

23、 void main() char ch; int dight10 , other=0, i; for ( i=0; i ch ; while ( ch != $ ) if ( ch = 0 & ch ch; for ( i=0; i=9; i + ) cout i : dighti endl; coutother : otherendl; 411 编程输出如下图形: 1 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4参考程序: # include void main() int i,j; for ( i=1; i= 4; i + ) for ( j=1; j=5i; j + )

24、cout” “; for ( j = 1 ; j =2*i-1; j + ) cout i ; cout endl ; 412 编写程序,计算s = 1 + ( 1 + 2 ) + ( 1 + 2 + 3 ) + + ( 1 + 2 + + n ),n由键盘输入。参考程序:# include void main() int n, sum=0, a=0; coutn; for ( int i =1; i = n; i+ ) a= a+i; sum=sum+a; coutsumendl; 413 编写程序:根据公式 e = 1 + 1/1! + 1/2! + 1/3! + .+ 1/n! 计算e的

25、值,直到最后一项小于10-6为止。参考程序:# include void main() double e=1, a=1; int i=1; do a=a / i; e=e+a; i+; while ( a = 1e-6 ); coute= e endl; 习题5参考答案5.1 简要回答下列问题:(1)数组名可以看作一个指针,它与一般的指针有什么不同?(2)试说明指针变量本身的长度与它所指向的数据的类型的长度的区别。(3)怎样为字符串数组赋值?(4)怎样定义具有100个数据记录的数据库二维表?答:(1)数组名是地址常,指针是地址变量。(2)指针指向的数据的类型称为指针的基类型。不同的基类型的长度

26、不同。指针变量本身的长度由机器字长决定,不管指针变量的基类型是什么,指针变量的长度都是一样的。(3)字符串数组是二维字符数组,可以在定义时用初始化列表赋初值。如:char name420 = lixiaohe , wangqiang , shihua , liuli ; 或将字符串数组定义为字符型指针数组,也可以在定义时用初始化列表赋值。如:char *name14 = lixiaohe , wangqiang , shihua , liuli ; (4)要定义具有100个数据记录的数据库二维表,应当先定义表的结构,利用struct定义一个结构类型,然后定义该结构类型的100个变量,或者定义具

27、有100个该结构类型元素一维数组。5.2 指出下列程序段中的错误,并说明错误原原因。 (1)int length=50 ; char namelength; /错!数组大小必须为常量 (2)const size=10; /错!定义常量时没有指明类型 int asize; size=20; /错!不能为常量赋值 int bsize; (3)float x=72; float *p; p = x ; /错!指针变量必须用地址赋值 (4) int x=9 , *x_ptr=&x; int y=78; *x_ptr = &y ; /错!指针变量用法错误,可改为x_ptr = &y ;或*x_ptr =

28、 y; (5)const int length = 5; int alength = 3343 , 5 , 32 , 56 , 7 , 65 ; /错!初始化数据个数大于指定的数组大小(6)int array1 3= 1 , 2 , 3 , 4 , 5 , 6 ; int array23 = 1 , 2 , 3 , 4 , 5 , 6 ; /错!只能缺省第一维大小 int array3 = 1 , 2 , 3 , 4 , 5 , 6 ; /错!只能缺省第一维大小(7) char a =sorry; char b =radio ; a = b ; /错!字符串变量不能相互赋值 (8)int w4

29、; w = 1 , 2 , 3 , 4 ; /错!不能在数组定义语句之外同时为多个数组元素赋值 (9)int age5 = 12 , 26 , 48 , 29 , 33 , *age_ptr = age ; cout *age *age_ptr endl ; age + ; /错!地址常量不能改变 age_ptr + ; cout *age *age_ptr endl; (10) char s = welcome!; char *p = &s; /错! s是地址常量,前面不能再用取地址运算符& (11) char str14= t , h , i , s ; char str24=this;

30、/错!数组大小应包括字符串常量结束符 char str3 =this; (12)double x=3.6; double *ptr; *ptr=x; /错!指针变量未用地址赋值5.3 写出下面程序的运行结果:# include void main( ) int a5=34 , 256 , 87 , 46 , 90 ; int b 3 = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ; int x , y , z; x=a2 + a3; y=*a+*(a+4); z= b12+*b +*(b+1)+*(*(b+1)+1); coutx = x y = y z = z en

31、dl ; 答:x = 133 y = 124 z = 165.4 写出下面程序的运行结果:# include void main( )char str =there are 3 boys. ; char *p = str; coutstrendl; *(p+10) = 5 ; coutstrendl ; 运行结果为:there are 3 boys.there are 5 boys.5.5 写出下面程序的运行结果:# include void main()const int n=5; int ann, i, j; for ( i = 0 ; i = n - 1 ; i+ ) ai0=1; ai

32、i=1; for ( j=1; ji ; j+ ) aij = ai-1j-1+ai-1j; for ( i=0; i= n-1; i+ )for ( j=0; j= i; j+ )cout* ( * ( a + i ) + j ) ; coutendl; 运行结果为: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 15.6 上机编程:建立并输出如下的1010矩阵。 0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 0 2 3 4 5 6 7 8 9 0 1 9 0 1 2 3 4 5 6 7 8参考程序# include void main() int a

33、1010 ; for ( int i=0; i=9; i + ) for ( int j=0; j= 9; j + ) aij= (i + j )%10; cout aij ; coutendl; 5.7上机编程:数组data中存放了n个互不相同的数,找到其中的最小数并从数组中删除。 参考程序:# include void main() const int n=10; double datan; int i, k; coutplease enter the data : ; for ( i = 0; idatai; coutthe previous array is : ; for ( i=0

34、; i= n1; i + ) coutdatai ; coutendl; k=0; for ( i=1; i= n1; i + ) /寻找最小数的位置 if ( dataidatak ) k=i; for ( i=k; i= n2; i + ) /删除最小数 datai = datai+1 ; coutthe curent array is : ; for ( i=0; i= n2 ; i + ) coutdatai ; coutendl; 习题6参考答案6.1 指出并改正下列函数原型语句的语法错误。(1) int max(int a,b);(2) int small_one(float x;

35、 float y; float z;);(3) extern func(int 1_st,int 2_nd,int 3_rd);(4) char lookup(int*, char*;)(5) double *averagefloat,float;(6) double* &average(float f,float f);答:(1) 参数b没有指定类型。 改正为 int max(int a, int b);(2) 参数之间应该用逗号分隔。 改正为 int small_one(float x, float y, float z);(3) 函数无返回值类型。 改正为 extern int func

36、(int first,int second,int third);(4) 参数表中不能出现分号。 改正为 char lookup(int*, char*);(5) 没有错误。(6) 不能同时使用* 和&运算符,两个形式参数不能同名。 改正为 double& average(float f1,float f2);6.2 编程实现:两个学生班各派有9名学生参加计算课程对抗赛,对十种试题双方各派一名参赛,最终以单种试题胜于对方最多的班级为优胜者。 答:题目分析:分别以a、b两个数组按参赛试题的顺序登记成绩,最后把每组试题的对应元数进行比较,并计算出一个班胜于对手的个数,即可比较大小。#include

37、int compare(float t1, float t2);void main()float a9,b9; int i, n;n=0; coutenter a、b classs grade:; for(i=0;iaibi; for(i=0;i5) cout class a is win!endl; else cout class b is win!=t2)? 1:0;6.3 下列程序企图对a、b两个数组进行整理,若aibi,则二者互换,使得a数组中每个变量的值都大于或等于b数组相应变量的值。上机运行该程序时发现,程序并未达到预定的目的,请改正程序中的逻辑错误,使它能得到预期的结果。#inc

38、ludevoid swap(double t1, double t2) double t;for (int i=1;i10;i+)if (t1t2)t=t1;t1=t2;t2=t;void main() double a10=0.55,8.21,7.16,-6.6,-34.5,23.4,71.6,-92.8,6.02,-71.5;double b10=-21.1,24.6,-2.8,15.5,-8.2,37.1,6.06,43.5,-16.2,7.05; int i; for(i=0;i10;i+)swap(ai,bi); coutai=;for(i=0;i10; i+) coutai,; c

39、outendl; coutbi=;for(i=0;i10; i+) coutbi,; coutendl;答案:只需将程序第二行中函数参数由传值调用改为传地址调用即可:void swap(double& t1, double& t2) 6.4 编写一个函数使它能够输出一个浮点数的小数部分,然后在主函数中调用该函数,将由键盘输入的任意浮点数的整数部分和小数部分分别输出。参考程序:#includeint separate(double& f);void main()int a;double b; coutb; a=separate(b); coutthe input number is divided to a and bendl;int separate(double& f) int temp;temp=int(f);f=f-temp;return temp;6.5 下面给出了一个求素数的函数is_prime()的定义。编写程序,补充完成main()函数定义,验证哥德巴赫猜想“任何大于2的偶数n都可以表示为两个素数之和”在小于等于106时成立。#i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论