C语言与面向对象的设计._第1页
C语言与面向对象的设计._第2页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

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

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

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

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

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

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

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

8、个是对象。其中医务人员是 基类,医生、护士、化验员、药剂师是它的四个子类, 而内科医生、外科医生、五官科医4生、神经科医生又是医生的子类。另外管理人员是行政管理人员、设备管理人员、药品管 理人员、财务管理人员等子类的基类。5习题2参考答案2.1 C+与C语言的关系如何?它们的本质区别是什么?答:C+由C语言继承而来,并在C语言的基础上增加了对面向对象程序设计的支持,是传 统的结构化程序设计方法和面向对象程序设计方法的结合。C+保留了C语言的全部精华、与C语言兼容,又比C语言更适宜于管理大型、复杂的程序。二者的本质区别是:C是面向 过程的语言,而C+是面向对象的语言。C是战术语言,而C+是战略语

9、言。2. 2以下单词哪些是C+合法的标识符?publicarrayIx3.53rdnum1 _sot hi! x-y答:合法的标识符为:get_name、num1、_sot、_for。2.3保留字与一般标识符有什么不同?答:保留字又称关键字,是系统已预先定义的一些单词。 这些单词虽然符合标识符的命名规 则,但由于已经被C+语言预先赋予了特定的含义,因而不能被程序员用作一般的标识符来 定义和使用。2.4文件包含命令的形式如何?有什么作用?答: 文件包含命令的作用是让编译预处理器将指定文件的全部内容插入到当前源文件的该 命令行处。它有两种形式:#include 文件名和#“elude文件名。二者的

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

11、机器语言程序,得到目标文件;连接程序把各个目标文件和要用到的库文件连接 在一起,生成可执行文件,可执行文件是计算机能直接运行的文件。get_name nwhat? _for626什么是空语句?它有什么作用? 答: 空语句是只有一个分号的语句。它主要用于语法上需要有一条语句但实际上又没有任何 操作可执行的场合。2. 7什么是C+中的块?主要用于什么地方?答:块即复合语句或称分程序,是括在一对花括号之间的语句序列,在语法上相当于一条单 语句,凡是在单语句可用的地方都可以使用复合语句。复合语句主要用于语法上要求只能有 一条语句,但又难以只用一条简单语句表达的情形,如循环语句的循环体等;或者用于形成

12、局部化的封装体。2.8判断下列描述的对与错:(1)C+和C语言都是面向对象的语言。(2) 一个C+源程序可以分别存放在几个源文件中。(3)C+对标识符内的英文字母是区分大、小写的。(4)预处理命令是在程序正常编译之后执行的。(5)一个源程序若通过编译、连接得到了exe文件,执行后就能得到正确的结果。(6)以下四种写法均是C+合法的注释语句:/*/*/ */ /答:2.9分析下面程序的功能。若输入为9和4,写出程序的运行结果。#includevoid main()int n1, n2 ;cout n1n2;cout ( n1 + n2 )/2= (n1 + n2 )/2 endl;解答:程序的功

13、能为:从键盘接收两个整数,计算输出整数部分它们的平均值的。若输入为9和4, 运行结果为:(9 + 4 )/2=6 2.10编一个小程序, 完成小时数向秒数的转换。 例如, 若输入为2.5(小时),则输出为9000(秒)。 参考程序:#include void main()float hours, seconds;couthours; seconds=hours*3600; coutThe second is :secondsendl;*/*/*1)错 (2)对3)对(4)错7习题3参考答案31指出下列常量的类型 :34.5L 0 x345 89f .7E3 8ul -869答:各常量的类型依次

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

15、型转换时,可以不遵循隐式转换的原则。答:(1)错(2)错(3)错(4)对(5)错(6)错(7)对(8)对33写一段语句,对如下变量或常量进行声明: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 = &

16、b1 ;34在上题的基础上写一段语句完成下列操作:(1) 在屏幕上显示string;(2) 从键盘接收b1的值;(3) 将b2的值加上b1的值,仍赋给b2;(4) 输出b1和b2的值;(5) 将b1_ptr所指单元的内容加1并输出;答:(1)在屏幕上显示string;cout string b1;(3)将b2的值加上bl的值,仍赋给b2;b2 = b2 + b1;(4)输出bl和b2的值;8cout b1= b1 b2 = b2 endl ;(5)将b1_ptr所指单元的内容加1并输出;cout +*b1_ptr endl ;35分析下面程序的运行结果并上机验证。#includevoid ma

17、in()const double 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 y4)z | y & x y5)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 II y % - x 0

18、10(11)+x level; switch(level) case 1: cout one;break; case 1.5:cout oneand a half;break;case 2: coutxy;if xy cout xelse 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;case 2 : x = x-10;c

19、ase 3 : x = x*2;default : ;解答:(1) 第一句和第六句错。switch后的表达式和case后的常量表达式只能是字符型、整型 或枚举型,不能是浮点型。11(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+; while ( n+ 20 );cout total

20、= total endl ;答案:循环次数为10,运行结果为:total=110 46分析下面程序的功能并写出程序的运行结果:# 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的倍数,以及这样的 数有多少个。运行结果为:7035n=24.7编程求各位数字的和为偶数的三位数(例如163),并统计这样的数有多少个。参考程序:# in elude void

21、 mai n()int count = 0 , a , b , c ;12for ( int i=100; i= 999; i + ) a=i/100 ;/a为百位数字b=(i -a*100 )/10 ;b为十位数字c=i -a*100-*10 ;/c为个位数字if ( (a+b+c) % 2 = 0 ) coutie ndl;count +;coutco un t=co un te ndl;4.8编程计算下面的f(x):x2+6(4x)f(x)=-x(0 x4)-x3+7x +9 (x0)参考程序:# in clude void mai n()float x, f;coutx;if (4x)

22、 f = x*x+6;if (0 x & 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的个数 的个数以及其它字符的个数。913参考程序:# include void main()char ch;int dight10 , other=0, i

23、;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编程输出如下图形:12223 333 34 4 444 4 4参考程序:# include void main()int i,j;for ( i=1; i= 4; i + ) for ( j=1; j=5-j + ) cout” “;for ( j = 1 ; j =2*i-1; j + ) cout i ;cout endl ;4.12编

24、写程序,计算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;4.13编写程序:根据公式e = 1 + 1/1! + 1/2! + 1/3! +小于10-6为止。参考程序:计算e的值1/1直到最后一项14# include void main()double e=1, a=1;int i=1;do a=a / i;

25、e=e+a; i+; while ( a = 1e-6 ); coute= e endl;15习题5参考答案5.1简要回答下列问题:(1)数组名可以看作一个指针,它与一般的指针有什么不同?(2)试说明指针变量本身的长度与它所指向的数据的类型的长度的区别。(3)怎样为字符串数组赋值?(4)怎样定义具有100个数据记录的数据库二维表? 答:(1)数组名是地址常,指针是地址变量。(2)指针指向的数据的类型称为指针的基类型。不同的基类型的长度不同。指针变量本身的长度由机器字长决定,不管指针变量的基类型是什么,指针变量的长度都是一样的。(3)字符串数组是二维字符数组,可以在定义时用初始化列表赋初值。女口

26、:char name420 = LiXiaoHe , WangQiang , ShiHua , LiuLi ;或将字符串数组定义为字符型指针数组,也可以在定义时用初始化列表赋值。如:char *name14 = LiXiaoHe , WangQiang , ShiHua , LiuLi ;(4)要定义具有100个数据记录的数据库二维表,应当先定义表的结构,利用struct定义一个结构类型,然后定义该结构类型的10 0个变量,或者定义具有10 0个该结构类型元 素一维数组。5.2指出下列程序段中的错误,并说明错误原原因。(1)int length=50 ;char namelength; /错!

27、数组大小必须为常量(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 = y;(5)const int length = 5;int alength = 3343 , 5 , 32 , 56 , 7 , 65 ; /错!初始化数据个数大

28、于指定的数组大小(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; w = 1 , 2 , 3 , 4 ;16/错!不能在数组定义语句之外同时为多个数组元素赋值(9)int age5 = 12 , 26 , 48 , 29 , 33 , *

29、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; /错!数组大小应包括字符串常量结束符char str3 =This;(12)double x=3.6; double *ptr;*ptr=x;/错!指针变量未用地址赋值5.3写出下

30、面程序的运行结果:# 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 = zendl ;答:x = 133 y = 124 z = 165.4写出下面程序的运行结果:# include void main( )char str =There are 3 boys. ;char *p

31、 = 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;17for ( i = 0 ; i = n - 1 ; i+ )ai0=1; aii=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

32、 ) + j ) coutendl;运行结果为:11 11 2 11 3 3 11 4 6 4 15.6上机编程:建立并输出如下的10X 10矩阵。“0 1 2 3 4 5 6 7 8 91 2 34 5 6 7 8 9 02 345 6 7 8 9 0 19 0 1 2 3 4 5 6 7 8参考程序# in elude void mai n()int a1010;for ( int i=0; i=9; i + )for ( int j=0; j= 9; j + )aij= (i + j )%10;cout aij ;coute ndl;5.7上机编程:数组data中存放了n个互不相同的数,

33、找到其中的最小数并从数组中删除。 参考程序:# in clude void mai n()const int n=10;double data n;18int i, k;coutPlease en ter the data :;for ( i = 0; i datai;coutThe previous array is :;for ( i=0; i= n-; i + )coutdatai;coute ndl;k=0;for ( i=1; i= n-; i + )寻找最小数的位置19if ( dataidatak ) k=i;for ( i=k; i= n; i + ) datai = data

34、i+1 ;coutThe curent array is : for ( i=0; i= n; i + ) coutdatai ;coutendl;/删除最小数20习题6参考答案6.1指出并改正下列函数原型语句的语法错误。(1) int max(int a,b);(2) int small_one(float x; 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* &a

35、verage(float f,float f);答:(1)参数b没有指定类型。 改正为int max(int a, int b);(2)参数之间应该用逗号分隔。 改正为int small_one(float x, float, yfloat z);(3)函数无返回值类型。 改正为extern func(int first,int second,int third);(4)参数表中不能出现分号。 改正为char lookup(int*, char*)(5)没有错误。(6)不能同时使用*和&运算符,两个形式参数不能同名。 改正为double& average(floatf1,flo

36、at f2);6.2编程实现:两个学生班各派有9名学生参加计算课程对抗赛,对十种试题双方各派一名 参赛,最终以单种试题胜于对方最多的班级为优胜者。答:题目分析:分别以a、b两个数组按参赛试题的顺序登记成绩,最后把每组试题的对应元 数进行比较,并计算出一个班胜于对手的个数,即可比较大小。#includeint 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;el

37、se cout Class B is win!=t2)? 1:0;216.3下列程序企图对a、b两个数组进行整理,若aivbi则二者互换,使得a数组中每个变 量的值都大于或等于b数组相应变量的值。上机运行该程序时发现,程序并未达到预定的目 的,请改正程序中的逻辑错误,使它能得到预期的结果。#includevoid 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,-9

38、2.8,6.02,-71.5; doubleb10=-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,;coutendl;coutbi=; for(i=0;i10; i+) coutbi,; coutendl;答案:只需将程序第二行中函数参数由传值调用改为传地址调用即可:void swap(double& t1,double& t2)6.4编写一个函数使它能够输出一个浮点数的小数部分,然后

39、在主函数中调用该函数,将由 键盘输入的任意浮点数的整数部分和小数部分分别输出。参考程序:#includeint separate(double& f);void main()int a;double b; coutb; a=separate(b);coutThe input number is divided to a and bendl;intseparate(double& f)int temp; temp=int(f); f=f-temp;return temp;6.5下面给出了一个求素数的函数is_prime(的定义。编写程序,补充完成main()函数定义,验证哥德巴赫

40、猜想“任何大于2的偶数n都可以表示为两个素数之和”在小于等于106时成#include int is_prime(long n)22long k;k=sqrt(n);for(long i=2;i=k;i+) if (n%i=0) return 0;return 1;答案:#include void main()long n;coutn;for(long i=4;i=n;i+=2)for(long j=1;j=i/2;j+=2) if(is_prime(j) & is_prime(i-j)couti=j+(i-j)endl;23break;6.6编写程序,从键盘上接收n和m两个正整数,求

41、n中取m的组合数。(公式:n!/(m!*(n-m)!)参考程序:#includefloat fact(int k);int Cnm( int n, int m); void main( )int n, m, z; coutnm;z = Cnm(n,m); coutz=zendl;float fact( int k) /求k的阶乘float fa=1;int i;for( i = 2; i = k; i+)fa = fa * i;return fa;int Cnm( int n, int m) /求组合值int a;float b;b = fact(n) / ( fact(m) * fact(n

42、-m) );a = int(b); return a;6.7利用下面给出的判断是否闰年的函数is_leap_year和每年1月1日是星期几的函数first_day_of_year()定义,编写程序,在屏幕上显示任何一年中的任何一个月的月历。年、 月值从键盘输入指定。int is_leap_year(int y)return (y%4=0&y%100!=0|y%400=0);int first_day_of_year(int y)long n;n=y*365; for(i=1;iy;i+) n+= is_leap_year(i);return n%7;参考程序:#include int

43、is_leap_year(int y);24int first_day_of_year(int y);int days_of_the_month(int m);int year;void main()int month, month_days,week_d,daayys_of_the_year; coutyear; coutmonth; coutendl;week_day=first_day_of_year(year); month_days=days_of_the_month(month); inti;days_of_the_year=0; for(i=1;imonth;i+)days_of

44、_the_year=days_of_the_year+days_of_the_month(i);week_day=(week_day+days_of_the_year)%7; coutyear: year month:monthendl; coutSUN MON TUE WED THU FRI SATendl; for (intk=0;kweek_day;k+) cout ;for (i=1; i=month_days;i+)if (i10) cout i;else couti;cout ;week_day=week_day+;if (week_day%7=0)coutendl;coutend

45、l;int is_leap_year(int y)return (y%4=0&y%100!=0|y%400=0);int first_day_of_year(int y)long n;n=y*365;for(int i=1;iy;i+)n+= is_leap_year(i);return n%7;int days_of_the_month(int m)switch(m)case 1:case 3:case 5:case 7:25case 8:case 10:case 12:return 31;case 4:case 6:case 9:case 11: return 30;case 2:

46、 if (is_leap_year(year)r)eturn 29; else return 28; default:return 0;6.8上机实验题:in tegrate是用矩形法求定积分的函数,它有一个函数指针作为参数。试用它完成自定义 的一元函数定积分计算(例如求单位园的面积)。#include#includetypedef double (*Fp)(double);double integrate(Fp fun, double a, double b)double n;coutn;/决定精度double step=(b-a)/n;double area=0;while(ab)area

47、 += fun(a)*step;a += step;return area;参考解:double halfcircle(double x)return sqrt(1-x*x);void main()double area = 4*integrate(halfcircle, 0,1);coutareaendl;;26习题7参考答案71选择填空:(1)下列的( )是引用调用。A.形参是引用,实参是变量;B.形参和实参都是变量;C.形参是指针,实参是地址值;D.形参是数组名,实参是数组名。(2)作用域运算符的功能是( )A.给定作用域的大小;E.表示作用域的级别的;C.某个成员是属于哪个类的;D.指

48、出作用域的范围的。(3)下列的各函数中, ( )不是类的成员函数。A.构造函数;E.析构函数;C.拷贝初始化构造函数;D.友元函数。(4)下面( )不是构造函数的特征。A.构造函数可以重载;E.构造函数可以设置缺省参数;C.构造函数的函数名和类名相同;D.构造函数必须指定返回值类型。(5)下述静态数据成员的特性中,( )是错误的。A.静态数据成员要在类体外进行初始化;B.说明静态数据成员时前边要加修饰符staticC.静态数据成员不是所有对象所共有的;D.引用静态数据成员时,要在静态数据成员名前加类名和作用域运算符。(6) 已知类A有三个公有成员:void f1(int), void f2(i

49、nt)和int &则()是指向类A成员函数的指针。A.A *p;B. int A:*pc=&A:a;C. void(A :*pa)(int) ; D. A *p;(7) 下列关于对象数组的描述中,( )是错的。A.对象数组的数组名是一个地址常量;E.对象数组的下标是从0开始的;C.对象数组只能赋初值,不能被赋值;D.对象数组的数组元素是同一个类的对象.(8) 下列定义中,()是定义指向类A的对象数组的指针。A. A *p5;B. A (*p) 5;C. (A *) p5;D. A *p ;(9) 说明语句const char *pti中,ptr是()。A.指向字符常量的指针;B

50、.指向字符的常量指针;C.指向字符串常量的指针;D.指向字符串的常量指针。(10) 关于new运算符的下列描述中,()是错的.A.使用它创建对象时要调用构造函数;B.使用它创建对象数组时必须指定初始值;C.它可以用来动态创建对象和对象数组;27D.使用它创建的对象或对象数组可以使用运算符delete删除。答:(1)A(2)C(3)D(4)D(5)C(6)C(7)C(8)B(9)A(10)B 72分析下列程序的运行结果。(1)#includeclass Bprivate:int a,b;public:B() B(int i,int j)a = i ;b = j;void printb() cou

51、ta”,”bendl;class Aprivate:B c ;public:A() A(int i,int j):c(i,j) void printa() c.printb( ); ;void main()A m(7,8);m.printa( );答案:程序输出为7,8(2)#includeclass Countstatic int count ;public:Count( ) count+ ;static int Getc( ) return count ;Count( ) count-;int Count:count = 100;void main( )Count c1,c2,c3,c4

52、; coutCount:Getc( )endl;答案:输出为104;283)#include class Rect double w,h;public:Rect(double a,double b)w=a;h=b;friend double area(Rect &r) return r.w * r.h; ;void main( )Rect r1(3.0,4.0),r2(2.0,5.0);coutarea(r1)”, r”2)aernedal;(答案:输出为12,104)#include const int N=100; class Setint elemsN;int pc;public

53、:Set() pc=0;Set (Set &s);void Empty()pc=0;int IsEmpty() return pc=0;int IsMember(int n);int Add(int n);29void print();friend void reverse(Set *m);Set:Set(Set &s)pc=s.pc;for(int i=0;ipc;i+)elemsi=s.elemsi;int Set:IsMember(int n)for(int i=0;i=N) return 0;else elemspc+=n; return 1;void Set:prin

54、t()cout”“;for(int i=0;ipc-1;i+) coutelemsi0) coutelemspc-1;cout”endl;void main()Set a; couta.IsEmpty()endl;a.print();Set b;for(int i=1;i=8;i+)b.Add(i);b.print();coutb.IsMember(5)endl;b.Empty();for(int j=11;j20;j+)b.Add(j);Set c(b);c.print();程序输出:11,2,3,4,5,6,7,8111,12,13,14,15,16,17,18,19x=i;30(5)#i

55、ncludeclass Bint x,y;public:B();B(int i);B(int i,int j);B();void print();B:B()x=y=0;coutDefault constructor called.endl;B:B(int i)x=i;y=0;coutConstructor1 called endl;B:B(int i,int j)(6)31y=j;coutConstructor2 called endl;B:B()coutDestructor called endl;void B:print()coutx=x,y=yendl;void main()B *ptr

56、;ptr=new B3; ptr0=B();ptr1=B(5); ptr2=B(2,3);for(int i=0;i3;i+)ptri.print();delete ptr;答:程序输出Default constructor called.Default constructor called.Default constructor called.Default constructor called.Destructor calledConstructor1 calledDestructor calledConstructor2 calledDestructor called x=0,y=0 x

57、=5,y=0 x=2,y=3Destructor calledDestructor calledDestructor called#include class Aint a;public:A(int i)a=i;int fun(int b)return a*c+b;int c;void main()A x(8);int A:*pc;32pc=&A:c;x.*pc=3;int (A:*pfun)(int);pfun=A:fun;A*p=&x;cout*pfun)(5)endl;答:2973定义一个学生类studen,t它含有私有数据成员: 学号、 姓名、 年龄, 及公有成员函数:

58、setvalue(X用于设置三个私有数据成员的值)、print()(用于输出三个数据成员的值)及构造 函数,在主函数中定义student类的两个对象stul和stu2对student类进行测试。参考程序:#include#includeclass Studentprivate:char StudentNum8;char Name10;int age;public:Student();Student(char *pn,char *pname=noname,int n=0)SetValue(pn,pname,n);void SetValue(char *pn,char *pname=noname,

59、int n=0)strcpy(StudentNum,pn); strcpy(Name,pname); age=n;void print()coutStudentNumber=StudentNumendl;coutStudnetName=Nameendl; coutStudnetAge=ageendl;void main()Student stu1(9600101,LiPing,18);Student stu2(9600202,LiHong,19);stu1.print();stu2.print();3374输入5个学生4门课成绩,然后求出:A.每个学生的4门课总分;B.每门课程的平均分;C.输

60、出总分最高的学生的姓名和总分(提示:定义student类,有存放姓名和4门课成绩及总分的6个私有数据成员,定义 用于student对象初始化的构造函数,公有成员函数sumscoreS)(求每个学生4门课 总分),print()(用于输出学生姓名和总分)。求每门课程的平均分、判断并输出总分最 高的学生的姓名和总分可以定义为类student的友元函数。)参考程序:#include#includeclass Studentprivate:char name10;int g4,sum; /分/别存放一个学生4门课成绩和总分public:Student()strcpy(name,noname);g0=0;g1=0;g2=0;g3=0;sum=0;34Student(char *pn,int *ps,int n);void print()coutname:;for(int i=0;i4;i+) coutgi,;

温馨提示

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

评论

0/150

提交评论