面向对象程序设计课程作业及答案_第1页
面向对象程序设计课程作业及答案_第2页
面向对象程序设计课程作业及答案_第3页
面向对象程序设计课程作业及答案_第4页
面向对象程序设计课程作业及答案_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象程序设计课程作业及答案作业1:是非题 1. 头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。1. 错 2. 程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量。4. 对填空题 下面是一个求数组元素之和的程序。主程序中定义并初始化了一个数组,然后计算该数组各元素的和,并输出结果。函数sum计算数组元素之和。填充程序中不完整的部分。_A_int sum(int ,int);void main()int ia5 = 2,3,6,8,10; B ;sumOfArray = sum(ia,5);cout << "Sum

2、of array:" << sumOfArray << endl;int sum(int array,int len)int iSum = 0;for(int i = 0; C ; D ) E ;return iSum; 答案:A#include <iostream.h>Bint sumOfArray;Ci < lenDi+EiSum += arrayi;阅读理解题 写出下列程序的运行结果: /file1.cpp static int i = 20; int x; static int g(int p) return i + p; void

3、f(int v) x=g(v); /file2.cpp #include <iostream.h> extern int x; void f(int); void main() int i=5; f(i); cout << x; 回答以下问题: 1. 程序的运行结果是什么样的? 2. 为什么文件file2.cpp中要包含头文件<iostream.h>? 3. 在函数main()中是否可以直接调用函数g()?为什么? 4. 如果把文件file1.cpp中的两个函数定义的位置换一下,程序是否正确?为什么? 5. 文件file1.cpp和file2.cpp中的变量

4、i的作用域分别是怎样的?在程序中直接标出两个变量各自的作用域。 答案: 1. 程序的运行结果:25因为程序中需要利用cout对象进行输出,而cout是在C+标准I/O库iostream中定义的类ostream的一个对象。2 在函数main()中不可以直接调用函数g(),因为g()是静态函数,只在它所在的文件内可见。3 如果把文件file1.cpp中的两个函数定义的位置换一下,程序不正确,因为C+规定所有使用的变量和函数需要先声明,后使用。在函数f中用到了函数g,所以函数f不能出现在函数g的定义或声明之前。文件file1.cpp中的变量i的作用域从它的定义开始到文件结束。File2.cpp中的变

5、量i的作用域从它的定义开始到main函数结束。编程题 写一个函数,完成在链表末尾增加一个节点的操作。函数的原型为:Node * AddNode(Node * & head, int newData);其中,链表节点的定义如下:struct Node int data;/存放数据Node * next;/指向链表中的下一个节点;函数参数:函数的第一个参数head指向链表的第一个节点,如果链表为空,则head的值为NULL。第二个参数newData为要插入的新节点中存放的数据。函数返回值:当成功地插入新的节点时,函数返回指向新节点的指针,否则,如果不能申请到内存空间,则返回NULL。Nod

6、e * AddNode(Node *& head, int newData)/在这里写出函数的实现 答案: Node * AddNode(Node * &head, int newData) /申请新的节点空间 Node * newNode = new Node; if (newNode = NULL) return NULL; /填充新节点的内容 newNode->data = newData; newNode->next = NULL; /插入到链表的结尾 if (head = NULL) head = newNode; else /寻找链表的最后一个节点 No

7、de *tail = head; while(tail->next != NULL)tail = tail->next; /将新节点插入到最后 tail->next = newNode; return newNode; 作业2:是非题 1. 在不同作用域中的变量可以同名。对 2. 派生类的成员函数可以直接访问基类的所有成员。2. 错填空题 #include<iostream.h> _A_; void main() int a6=2,4,8,6,9,14; int x1=_B_; /调用f1函数求出a中前4各元素之和。 int x2=f1(a,6); cout<

8、;<x1<<' '<<x2<<endl; int f1(int a, int n) int i,s=0; for(i=0;i<n;i+) s+=ai; return s; 答案: A int f1(int a, int n); B f1(a,4)改错题 1. 下面的函数将浮点型指针参数para所指向的值赋给一个局部指针变量pFloat所指向的空间,然后输出*pFloat的值。#include <iostream.h>void func(float * para) float * pFloat; pFloat = par

9、a; cout << pFloat;错误为:_改正方法为:_答案错误为:没有给指针申请空间,就直接赋值改正的方法为:先为pFloat申请空间,再赋值。 2. 下列程序片段对二维数组的每个元素赋值unsigned short SomeArray54; for (int i = 1; i<=5; i+) for (int j = 1; j<=4; j+) SomeArrayij = i+j;错误为:_改正方法为:_答案错误为:访问数组元素的下标不对改正的方法为: 将两个for循环的循环初始值改为0,循环结束条件分别改为i<5和j<4。 编程题 写一个函数,找出给

10、定字符串中小写字母字符的个数。函数的原型为: int CalcAlpha(char *str);函数参数: str为所要处理的字符串;函数返回值:所给字符串中小写字母字符的个数int CalcAlpha(char *str)/在这里写上程序的实现 答案: int CalcAlpha(char *str) /判断字符指针是否为空 if(str = NULL) return 0; /记录小写字母字符个数的变量 int num=0; /依次检查各个字符,如果是小写字母,则总数加1 for(int i=0; stri!=0x0; i+) if(stri)>='a' &&a

11、mp; stri<='z')num+; /返回数字字符个数 return num; 作业3:是非题 1. 函数的参数和返回值类型可以是简单数据类型,也可以是指针、引用、数组和类。3. 错 2. 如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。5. 对填空题 #include<iostream.h> _A_; int f2(int* a, int n) _ B_; for(i=1;i<n;i+) if(max<ai) max=ai; return max; void main() int

12、bMM=3,12,6,20,9,7,34,50,25,66; _C_; /求出b4至b8 之间的最大值并赋给x1 _D_; /求出b0至b5 之间的最大值并赋给x2 cout<<x1<<' '<<x2<<endl; 答案: A const int MM=10; B int i,max=a0; C int x1=f2(b+4, 5); D int x2=f2(b, 6);阅读理解题 二、 valarray是C+的标准模板库中的一个类模板,类模板的每个实例类实现了某个具体的数据类型的数组,如valarray<int>是一个

13、整型的数组类。该类的使用和一般的数组非常类似,可以通过 运算符来访问数组中的每个元素。C+的标准模板库中还有一个模板函数abs(),其函数原型为: template<class T> valarray<T> abs(const valarray<T> & x);该函数的作用是将作为参数的数组x的每个元素的值取绝对值,并返回得到的新的数组。如原来的数组为:4 -1 -3 0 -34将这个数组作为参数传递给函数abs后,函数返回的数组就变成:4 1 3 0 34要求:阅读下列程序,回答后面的问题。/*/#include <iostream.h>

14、; #include <valarray.h> /该头文件中定义了模板类valarray和模板函数abs() #define ARRAY_SIZE 10 typedef valarray<int> INTVALARRAY; void main()INTVALARRAY val_array(ARRAY_SIZE); /定义一长度为ARRAY_SIZE的数组对象/赋初始值 for (int i = 0; i < ARRAY_SIZE; i+) val_arrayi = -i; cout << "Size of val_array = "

15、 << val_array.size() << "n" cout << "The values of val_array before calling abs():n" for (i = 0; i < ARRAY_SIZE; i+) cout << val_arrayi << " " cout << "n" INTVALARRAY abs_array = abs(val_array); cout << "The re

16、sult of val_array after calling abs():n" for (i = 0; i < ARRAY_SIZE; i+) cout << abs_arrayi << " " cout << "n"/*/ 问题1:写出程序的输出结果 问题2:关于程序中的语句:INTVALARRAY val_array(ARRAY_SIZE);下列说法哪些是正确的,哪些是错误的?在下表相应的位置写上“对”或“错”题号ABCDE对/错(A)该语句定义了一个对象val_array,这个对象是类valar

17、ray<int>的实例(B)该语句说明了一个函数原型,函数的名字为val_array,参数为ARRAY_SIZE,函数的返回值类型为INTVALARRAY(C)板类valarray一定有一个只带一个参数的构造函数(D)模板类valarray一定有一个只带两个参数的构造函数(E)ARRAY_SIZE将作为参数传递给val_array的构造函数,初始化val_array对象 问题3:(本小题共12分)下面是模板函数abs()的实现。这个实现中有错误,指出错误并写出正确的实现。注意:函数头是正确的,不要改变,所有的错误出现在函数体中。template<class T>vala

18、rray<T> abs(const valarray<T>& x)for(int i=0; i<x.size(); i+) if(xi<0)xi*=-1;return x;这个函数实现中有以下错误:(1)_(2)_(3)_正确的函数实现应为:template<class T>valarray<T> abs(const valarray<T>& x) 问题4:(本小题3分)从上面的程序中,你可以推断出,valarray模板类中至少重载了哪个或哪些C+的运算符?答:重载了_运算符 答案: 问题1:程序的输出结果

19、为: Size of val_array = 10 The values of val_array before calling abs(): 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 The result of val_array after calling abs(): 0 1 2 3 4 5 6 7 8 9 问题2题号ABCDE对/错对错对错对 问题3答案:该函数实现有以下错误:(1)函数的参数x为const参数,不能在函数体中被改变(2)在函数中应该创建一个临时对象,这个对象的内容由参数x的内容运算而来(3)函数返回的应是临时对象,而不是参数正确的函数实现为:templ

20、ate<class T>valarray<T> abs(const valarray<T>& x)INTVALARRAY ret_array(x);/利用拷贝构造函数构造临时对象for (int i = 0; i < x.size(); i+)if (ret_arrayi < 0)ret_arrayi *= -1;/取绝对值return ret_array;/返回临时对象或者template<class T>valarray<T> abs1(const valarray<T>& x)INTVAL

21、ARRAY ret_array(x.size();/构造一个与x长度相同的对象for (int i = 0; i < x.size(); i+)if (xi < 0)ret_arrayi = xi * (-1);/取绝对值elseret_arrayi = xi;return ret_array;/返回临时对象 问题4答案:重载了取数组下标的运算符编程题2(本每小题15分)写一个函数,找出给定字符串中具有最大ASCII码的字符。如字符串“world”中字符w具有最大的ASCII码。函数的原型为: char MaxCharacter(char *str);函数参数:str指向所要处理的

22、字符串;函数返回值:如果str不空,则返回具有最大ASCII码的字符,否则返回空字符0x0或0。char MaxCharacter(char *str)答案:程序可以有多种写法,下面是其中的四种第一种:char MaxCharacter(char *str)if (str = NULL)return 0x0;char maxChar = 0x0;for(int i=0; stri != 0x0; i+)if (stri > maxChar)maxChar = stri;return maxChar;第二种:char MaxCharacter(char *str)if (str = NUL

23、L)return 0x0;char maxChar = 0x0;for(int i=0; i < strlen(str); i+)if (stri > maxChar)maxChar = stri;return maxChar;第三种:char MaxCharacter(char *str)if (str = NULL | str0 = 0x0)return 0x0;char maxChar = str0;for(int i=1; stri!= 0x0; i+)if (stri > maxChar)maxChar = stri;return maxChar;第四种:char

24、MaxCharacter(char *str)if (str = NULL | str0 = 0x0)return 0x0;char maxChar = str0;int i=1;while(stri != 0x0)if (stri > maxChar)maxChar = stri;i+;return maxChar;作业4:是非题 1. 函数重载既要求两函数参数对应的类型不同又要求参数个数不同。错 2. 在基类中被说明为虚函数的类的成员函数必须在每个派生类中说明为虚函数,才能具有多态的特征。错填空题#include<iostream.h>class AA private:i

25、nt a;int b;public:AA(int aa, int bb=10)_A_; /将aa的值赋给a_B_; /将bb的值赋给b_C_; _D_; ;int AA:f1() return a+b;int AA:f2() return a*b;void main()AA x(2,3), y(8);cout<<x.f1()<<' '<<y.f2()<<endl; 答案: A a=aa; B b=bb; C int f1(); D int f2();阅读理解题 三、下面的文件queue.h是一个队列类模板Queue的完整实现。在这

26、个文件中首先定义了一个队列元素类模板QueueItem,然后在这个类的基础上定义了队列类模板Queue。在Queue中使用链表存放队列的各个元素,front指针指向链表的第一个节点元素,back指针指向链表的最后一个节点元素,成员函数add()将一个新节点元素加入到队列结尾,remove()从队列开头删除一个节点元素。为方便起见,程序中加上了行号。阅读程序,根据程序后面的问题作出相应解答。/*-/* 文件queue.h */*-/template <class Type>class Queue;/* 定义模板类QueueItem */template<class Type&g

27、t; class QueueItempublic:QueueItem(const Type & elem):item(elem) QueueItem() private:Type item;QueueItem * nextItem;friend class Queue<Type>/* 定义模板类Queue */template <class Type>class Queue public:Queue():front( NULL), _(A)_ Queue();Type remove();void add(const Type &);bool is_emp

28、ty() const return _(B)_ ; private:QueueItem<Type> *front; QueueItem<Type> *back;/模板类Queue的函数成员remove()的实现/从队列头取出一个节点,并返回该节点的值template<class Type>Type Queue<Type>:remove() QueueItem<Type> *pFront;/指向头节点的临时指针 Type retVal;/返回值 _(C)_; retVal = front->item; front = front-

29、>nextItem; delete pFront; return retVal;/模板类Queue的函数成员add()的实现template<class Type>void Queue<Type>:add(const Type & newItem) QueueItem<Type> *pNew = new QueueItem<Type> pNew->item = newItem; _(D)_; if (front = NULL) front = back = pNew; else back->nextItem = pNew

30、; _(E)_; template<class Type>Queue<Type>:Queue() QueueItem<Type> *p = front, *q; while(p != NULL) q = p->nextItem; delete p; p = q; 问题1:(每个填空3分,共15分) 程序中有几处填空,将它们完成。(A)_(B)_(C)_(D)_(E)_ 问题2:(本小题3分)题中程序第1,2行为什么要说明一下类模板Queue?如果没有这两行语句,程序还正确吗? 问题3:(本小题4分)程序第22,23行各有一个const,它们各自表示什么

31、含义: 问题4:(本小题3分)程序中模板类Queue的析构函数主要做了什么事情?为什么要这么做? 问题5:(本小题5分,每答对一个给1分)下面的程序使用了queue.h文件中定义的类模板,说明程序中哪些定义队列对象的语句是不正确的,哪些是正确的。#include “queue.h”void main()Queue q1;/1Queue<int> q2;/2Queue<int> q3(100);/3Queue<int> q4100;/4Queue<int> *q5 = new Queue<int>/5/.delete q5;语句号123

32、45对/错 答案: 问题1:答案为:(A)back(NULL)(B)front = NULL 或 back = NULL(C)pFront = front(D)pNew->nextItem = NULL(E)back = pNew 问题2: 答:不正确。因为在类QueueItem模板类的定义中用到了模板类Queue,而此时Queue还没有定义,所以要先声明一下,告诉编译程序Queue是一个模板类,它将在程序的其他地方定义。如果没有这个说明,编译程序就不知道标识符Queue代表什么样的含义了。 问题3: 答:第22行的const修饰的是函数的参数,表示在这个函数体中不能改它所修饰的参数所对

33、应的实际参数的值。第23行的const修饰的是模板类Queue的成员函数is_empty(),它表示在函数is_empty()的函数体中不能改变任何数据成员的值。 问题4: 答:析构函数中主要是释放链表中存放的各个节点的空间。因为Queue对象在其生存期间可能加入了很多节点,从堆中申请了一些内存空间,这些空间应该随着对象的消亡而释放掉,所以需要在析构函数中来释放这些空间。 问题5: 语句号12345错对/错错对对编程题 三、定义一个日期类Date,该类对象存放一个日期,可以提供的操作有:int GetYear ();/取年份int GetMonth ();/取月份int GetDay ( );

34、/取日子值void SetDate (int year, int month, int day);/设置日期值下面是测试你所定义的日期类的程序: #include <iostream.h> #include “date.h” voidmain() Date d1(1999, 1, 14);/用所给日期定义一个日期变量Date d2;/定义一个具有缺省值的日期,缺省值为1980年1月1日Date d3(d1);/用已有日期x构造一个新对象d2.SetDate(1999,3,13);cout << "Date:"cout << d1.GetYear() << '.' << d1.GetMonth() << '.'<< d1.GetDay() << endl;cout << "Date:"cout << d2.GetYear() << '.' << d2.GetMonth() <

温馨提示

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

评论

0/150

提交评论