《面向对象程序设计课程作业及复习资料.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计课程作业及复习资料.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象程序设计课程作业及答案作业1:是非题 1. 头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。1. 错 2. 程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量。4. 对填空题 下面是一个求数组元素之和的程序。主程序中定义并初始化了一个数组,然后计算该数组各元素的和,并输出结果。函数计算数组元素之和。填充程序中不完整的部分。 5 = 2,3,6,8,10; B ; = (,5); = 0;( i = 0; C ; D ) E ; 答案:A B ;Ci DE i;阅读理解题 写出下列程序的运行结果: 1 i = 20; x; g( p)
2、 i + p; f( v) (v); 2 x; f(); 5; f(i); x; 回答以下问题: 1. 程序的运行结果是什么样的? 2. 为什么文件2中要包含头文件? 3. 在函数()中是否可以直接调用函数g()?为什么? 4. 如果把文件1中的两个函数定义的位置换一下,程序是否正确?为什么? 5. 文件1和2中的变量i的作用域分别是怎样的?在程序中直接标出两个变量各自的作用域。 答案: 1. 程序的运行结果:25因为程序中需要利用对象进行输出,而是在标准库中定义的类的一个对象。2 在函数()中不可以直接调用函数g(),因为g()是静态函数,只在它所在的文件内可见。3 如果把文件1中的两个函数
3、定义的位置换一下,程序不正确,因为规定所有使用的变量和函数需要先声明,后使用。在函数f中用到了函数g,所以函数f不能出现在函数g的定义或声明之前。文件1中的变量i的作用域从它的定义开始到文件结束。2中的变量i的作用域从它的定义开始到函数结束。编程题 写一个函数,完成在链表末尾增加一个节点的操作。函数的原型为:其中,链表节点的定义如下: ;存放数据 * ;指向链表中的下一个节点函数参数:函数的第一个参数指向链表的第一个节点,如果链表为空,则的值为。第二个参数为要插入的新节点中存放的数据。函数返回值:当成功地插入新的节点时,函数返回指向新节点的指针,否则,如果不能申请到内存空间,则返回。在这里写出
4、函数的实现 答案: 申请新的节点空间 填充新节点的内容 插入到链表的结尾 寻找链表的最后一个节点 将新节点插入到最后作业2:是非题 1. 在不同作用域中的变量可以同名。对 2. 派生类的成员函数可以直接访问基类的所有成员。2. 错填空题 a6=2,4,8,6,9,14; x1; 调用f1函数求出a中前4各元素之和。 x21(a,6); x1 x2; f1( a, n) 0; (0) i; s; 答案: A f1( a, n); B f1(a,4)改错题 1. 下面的函数将浮点型指针参数所指向的值赋给一个局部指针变量所指向的空间,然后输出*的值。错误为:改正方法为:答案错误为:没有给指针申请空间
5、,就直接赋值改正的方法为:先为申请空间,再赋值。 2. 下列程序片段对二维数组的每个元素赋值 54; ( i = 1; i=5; ) ( j = 1; j=4; ) ij = ;错误为:改正方法为:答案错误为:访问数组元素的下标不对改正的方法为: 将两个循环的循环初始值改为0,循环结束条件分别改为i5和j=a i=z) 返回数字字符个数作业3:是非题 1. 函数的参数和返回值类型可以是简单数据类型,也可以是指针、引用、数组和类。3. 错 2. 如果派生类的成员函数的原型及基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。5. 对填空题 f2(* a, n) (1
6、) (ai) i; b=3,12,6,20,9,7,34,50,25,66; ; 求出b4至b8 之间的最大值并赋给x1 ; 求出b0至b5 之间的最大值并赋给x2 x1 x2; 答案: A 10; B 0; C x12(4, 5); D x22(b, 6);阅读理解题 二、 是的标准模板库中的一个类模板,类模板的每个实例类实现了某个具体的数据类型的数组,如是一个整型的数组类。该类的使用和一般的数组非常类似,可以通过 运算符来访问数组中的每个元素。的标准模板库中还有一个模板函数(),其函数原型为: ( & x);该函数的作用是将作为参数的数组x的每个元素的值取绝对值,并返回得到的新的数组。如原
7、来的数组为:4 -1 -3 0 -34将这个数组作为参数传递给函数后,函数返回的数组就变成:4 1 3 0 34要求:阅读下列程序,回答后面的问题。 该头文件中定义了模板类和模板函数() 10 定义一长度为的数组对象赋初始值 ( i = 0; i ; ) i = ; = () n; ():n; (i = 0; i ; ) i ; n; ():n; (i = 0; i ; ) i ; n; 问题1:写出程序的输出结果 问题2:关于程序中的语句:下列说法哪些是正确的,哪些是错误的?在下表相应的位置写上“对”或“错”题号ABCDE对/错(A)该语句定义了一个对象,这个对象是类的实例(B)该语句说明了
8、一个函数原型,函数的名字为,参数为,函数的返回值类型为(C)板类一定有一个只带一个参数的构造函数(D)模板类一定有一个只带两个参数的构造函数(E)将作为参数传递给的构造函数,初始化对象 问题3:(本小题共12分)下面是模板函数()的实现。这个实现中有错误,指出错误并写出正确的实现。注意:函数头是正确的,不要改变,所有的错误出现在函数体中。 ( & x)( 0; i(); ) (xi0)xi*1; x;这个函数实现中有以下错误:(1)(2)(3)正确的函数实现应为: ( & x) 问题4:(本小题3分)从上面的程序中,你可以推断出,模板类中至少重载了哪个或哪些的运算符?答:重载了运算符 答案:
9、问题1:程序的输出结果为: = 10 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 0 1 2 3 4 5 6 7 8 9 问题2题号ABCDE对/错对错对错对 问题3答案:该函数实现有以下错误:(1)函数的参数x为参数,不能在函数体中被改变(2)在函数中应该创建一个临时对象,这个对象的内容由参数x的内容运算而来(3)函数返回的应是临时对象,而不是参数正确的函数实现为: ( & x) (x);利用拷贝构造函数构造临时对象 ( i = 0; i (); ) (i 0)i *= -1;取绝对值 ;返回临时对象或者 1( & x) ();构造一个及x长度相同的对象 ( i = 0; i
10、(); ) (xi ) = i;第二种: 0x0; = 0x0;( 0; i ) = i;第三种: ( 0 0x0) 0x0; = 0;( 1; i 0x0; ) (i ) = i;第四种: ( 0 0x0) 0x0; = 0; 1;(i 0x0) (i ) = i;作业4:是非题 1. 函数重载既要求两函数参数对应的类型不同又要求参数个数不同。错 2. 在基类中被说明为虚函数的类的成员函数必须在每个派生类中说明为虚函数,才能具有多态的特征。错填空题 a; b;( , 10); 将的值赋给a; 将的值赋给b 1() 2() a*b; x(2,3), y(8);1() 2(); 答案: A ;
11、B ; C f1(); D f2();阅读理解题 三、下面的文件是一个队列类模板的完整实现。在这个文件中首先定义了一个队列元素类模板,然后在这个类的基础上定义了队列类模板。在中使用链表存放队列的各个元素,指针指向链表的第一个节点元素,指针指向链表的最后一个节点元素,成员函数()将一个新节点元素加入到队列结尾,()从队列开头删除一个节点元素。为方便起见,程序中加上了行号。阅读程序,根据程序后面的问题作出相应解答。/* 文件 */* 定义模板类 */* 定义模板类 */()( ), (A) () (B) ; 模板类的函数成员()的实现从队列头取出一个节点,并返回该节点的值 *;指向头节点的临时指针
12、 ;返回值 (C);模板类的函数成员()的实现 (D); (E); *p = , *q; (p ) q = ; p; p = q; 问题1:(每个填空3分,共15分) 程序中有几处填空,将它们完成。(A)(B)(C)(D)(E) 问题2:(本小题3分)题中程序第1,2行为什么要说明一下类模板?如果没有这两行语句,程序还正确吗? 问题3:(本小题4分)程序第22,23行各有一个,它们各自表示什么含义: 问题4:(本小题3分)程序中模板类的析构函数主要做了什么事情?为什么要这么做? 问题5:(本小题5分,每答对一个给1分)下面的程序使用了文件中定义的类模板,说明程序中哪些定义队列对象的语句是不正确
13、的,哪些是正确的。 q1;1 q2;2 q3(100);3 q4100;4 *q5 = ;5 q5;语句号12345对/错 答案: 问题1:答案为:(A)()(B) 或 (C) = (D) = (E) = 问题2: 答:不正确。因为在类模板类的定义中用到了模板类,而此时还没有定义,所以要先声明一下,告诉编译程序是一个模板类,它将在程序的其他地方定义。如果没有这个说明,编译程序就不知道标识符代表什么样的含义了。 问题3: 答:第22行的修饰的是函数的参数,表示在这个函数体中不能改它所修饰的参数所对应的实际参数的值。第23行的修饰的是模板类的成员函数(),它表示在函数()的函数体中不能改变任何数据
14、成员的值。 问题4: 答:析构函数中主要是释放链表中存放的各个节点的空间。因为对象在其生存期间可能加入了很多节点,从堆中申请了一些内存空间,这些空间应该随着对象的消亡而释放掉,所以需要在析构函数中来释放这些空间。 问题5: 语句号12345错对/错错对对编程题 三、定义一个日期类,该类对象存放一个日期,可以提供的操作有: ();取年份 ();取月份 ( );取日子值 ( , , );设置日期值下面是测试你所定义的日期类的程序: d1(1999, 1, 14);用所给日期定义一个日期变量 d2;定义一个具有缺省值的日期,缺省值为1980年1月1日 d3(d1);用已有日期x构造一个新对象d2(1
15、999,3,13); d1() . d1() . d1() ; d2() . d2() . d2() ; d3() . d3() . d3() ;要求:(1)写出日期类的完整定义,其中,三个函数写成内联函数形式,写成非内联函数形式。所有数据成员都定义为私有成员。注意构造函数的三种形式。(2)写出程序的运行结果(3)修改程序,在日期类中定义日期的输出函数,这样,主程序就可以简化为: d1(1999, 1, 14);用所给日期定义一个日期变量 d2;定义一个具有缺省值的日期,缺省值为1980年1月1日 d3(d1);用已有日期x构造一个新对象d2(1999,3,13);d1();d2();d3();输出格式和上面一样。只需要写出类的修改部分。 答案:(1)类的定义:文件构造函数()(1980)(1)(1) ;( 1)(d1)(d1)(d1) ;文件(1)程序的运行结果:1999.1.14:1999.3.13:1999.1.14(2)修改部分如下:第 9 页