试卷代号:1008 中央广播电视大学2000-2001学年度第二学期“开放教育(本科)”期末考试(开) 计科技专业面向对象程序设计试题 2001年7月 对错题。判断以下说法的正确性,在下面表格中对应的编号下面写上“对”或“错” (20分,每个题目2分) 1.说明函数原型时不需要指明每个函数参数的名字,只需要说明每个参数的类型和返回值 类型就可以了。 2.所有的表达式都有值。 3.程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所 带来的编译工作量 4.类的静态数据成员需要在定义每个类的对象时进行初始化。 5.基类中被说明为 protected和 private的成员只能被其派生类的成员函数访问,不能被其 它的函数访问 6.当将一个类S定义为另一个类A的友元类时,类S的所有成员函数都可以直接访问类 A的所有成员。 7.当函数的返回值是数组类型的,传递的是数组第一个元素的地址。 8.如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这 个函数自动继承基类中虚函数的特性。 9.字符串helo, world”在内存中存放时,占用11个字节的空间。 用new动态申请的内存空间,必须用 delete来释放 、简单编程题。根据程序要求,写出函数的完整定义。(共25分) 1.(本小题15分)写一个函数,找出给定字符串中数字字符(即0—9这10个数字)的 个数(如字符串” olympic2000中数字字符的个数为4个。函数的原型为 int CalcDigital(char*str 函数参数:str为所要处理的字符串 函数返回值:所给字符串中数字字符的个数 int Calc Digital(char *str) ∥在下面写出程序的实现 2.(本小题10分)用递归函数完成以下运算: sum(n)=12+22+…+n2 函数的原型如下: long sum(int n) 该函数完成12+22+…+m2的运算,并返回运算结果,其中n>0。 提示:你可以使用递归表达式:sum(n)=sum(n-1)+n ong sum(int n) (本小题30分) 下面的文件 queue. h是一个队列类模板 Queue的完整实现。在这个文件中首先定义了一个 队列元素类模板 Queueltem,然后在这个类的基础上定义了队列类模板 Queue。在 Queue中 使用链表存放队列的各个元素, front指针指向链表的第一个节点元素,back指针指向链表 的最后一个节点元素,成员函数adO将一个新节点元素加入到队列结尾, remove(从队列开
试卷代号:1008 中央广播电视大学 2000—2001 学年度第二学期“开放教育(本科)”期末考试(开) 计科技专业面向对象程序设计试题 2001 年 7 月 一、 对错题。判断以下说法的正确性,在下面表格中对应的编号下面写上“对”或“错”。 (20 分,每个题目 2 分) 题号 1 2 3 4 5 6 7 8 9 10 对/错 1. 说明函数原型时不需要指明每个函数参数的名字,只需要说明每个参数的类型和返回值 类型就可以了。 2. 所有的表达式都有值。 3. 程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所 带来的编译工作量。 4. 类的静态数据成员需要在定义每个类的对象时进行初始化。 5. 基类中被说明为 protected 和 private 的成员只能被其派生类的成员函数访问,不能被其 它的函数访问。 6. 当将一个类 S 定义为另一个类 A 的友元类时,类 S 的所有成员函数都可以直接访问类 A 的所有成员。 7. 当函数的返回值是数组类型的,传递的是数组第一个元素的地址。 8. 如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这 个函数自动继承基类中虚函数的特性。 9. 字符串’hello,world”在内存中存放时,占用 11 个字节的空间。 10. 用 new 动态申请的内存空间,必须用 delete 来释放 。 二、简单编程题。根据程序要求,写出函数的完整定义。(共 25 分) 1.(本小题 15 分)写一个函数,找出给定字符串中数字字符(即’0’—‘9’这 10 个数字)的 个数(如字符串”olympic2000”中数字字符的个数为 4 个。函数的原型为: int CalcDigital(char *str); 函数参数:str 为所要处理的字符串。 函数返回值:所给字符串中数字字符的个数。 int CalcDigital(char *str) { //在下面写出程序的实现 } 2.(本小题 10 分)用递归函数完成以下运算: sum(n)=12+22+…+n2 函数的原型如下: long sum(int n); 该函数完成 1 2+22+…+n2 的运算,并返回运算结果,其中 n>0。 提示:你可以使用递归表达式:sum(n)=sum(n-1)+n2 long sum(int n) { } 三、 (本小题 30 分) 下面的文件 queue.h 是一个队列类模板 Queue 的完整实现。在这个文件中首先定义了一个 队列元素类模板 QueueItem,然后在这个类的基础上定义了队列类模板 Queue。在 Queue 中 使用链表存放队列的各个元素,front 指针指向链表的第一个节点元素,back 指针指向链表 的最后一个节点元素,成员函数 add()将一个新节点元素加入到队列结尾,remove()从队列开
头删除一个节点元素。为方便起见,程序中加上了行号。阅读程序,根据程序后面的问题作 出相应解答。 1 template<class Type> 3/*******定义模板类 Queueltem*幸*本**幸*事********* 4 template <class Type> 5 class Queueltem 6{ 7 public Queueltem(const Type &elem): item(elem)1 QueueltemOd 10 1234 Queueltem*nextltem iend class Queue<Type> }; 5/本***幸*****幸***定义模板类 Queue'*幸**本***事****幸**** 16 template<class Type> 17 class Queue public Queue(: front(NULL) (A) Queue 21 Type eo void add( const Type &) bool is emptyOconst return (B) 2 4567 priva Queueltem<Type>*back; 2 28∥模板类 Queue的函数成员 remove的实现 29∥从队列头取出一个节点,并返回该节点的值 30 template<class Type> 31 Type Queue<Type>. remove) 32 Queueltem<lype>* fRont,∥指向头节点的临时指针 34 Type ret Val;∥返回值 36 ret Val=front->item front=front->nextltem delete pF return ret val 40 ∥模板类 Queue的函数成员ad0实 42 template<class Ty 43 void Queue<Type>. add(const Type& newltem) 456 { Queueltem<Type>"pNew=new Queueltem<Type> pNew->item=newlten (D ew 5555 back->nextItem=pNew
头删除一个节点元素。为方便起见,程序中加上了行号。阅读程序,根据程序后面的问题作 出相应解答。 1 template<class Type> 2 class Queue; 3 /******************定义模板类 QueueItem*******************************/ 4 template <class Type> 5 class QueueItem 6 { 7 public: 8 QueueItem(const Type &elem):item(elem){} 9 QueueItem(){} 10 private: 11 Type item; 12 QueueItem *nextItem; 13 friend class Queue<Type>; 14 }; 15 /***********************定义模板类 Queue*****************************/ 16 template<class Type> 17 class Queue{ 18 public: 19 Queue():front(NULL),_______(A)_______{} 20 ~Queue(); 21 Type remove(); 22 void add(const Type &); 23 bool is_empty()const {return ____(B)____;} 24 private: 25 QueueItem<Type> *front; 26 QueueItem<Type> *back; 27 }; 28 //模板类 Queue 的函数成员 remove()的实现 29 //从队列头取出一个节点,并返回该节点的值 30 template<class Type> 31 Type Queue<Type>::remove() 32 { 33 QueueItem<Type> *pFront; //指向头节点的临时指针 34 Type retVal; //返回值 35 ____(C)____; 36 retVal=front->item; 37 front=front->nextItem; 38 delete pFront; 39 return retVal; 40 } 41 //模板类 Queue 的函数成员 add()的实现 42 template<class Type> 43 void Queue<Type>::add(const Type& newItem) 44 { 45 QueueItem<Type> *pNew=new QueueItem<Type>; 46 pNew->item=newItem; 47 ____(D)____; 48 if(front==NULL) 49 front=back=pNew; 50 else 51 { 52 back->nextItem=pNew; 53 ____(E)____; 54 }
57 template <class Type> 58 Queue<Type>: Que 59{ 61 while(pl=NULL) q=p->nextItem 65 66 问题1:(每个填空3分,共15分)程序中有几处填空,将它们完成。 (B) (C) (D) (E) 问题2:(本小题3分)题中程序第1、2行为什么要说明一下类模板 Queue?如果没有这两 行语句,程序还正确吗? 答 问题3:(本小题4分)程序第22、23行各有一个 const,它们各自表示什么含义? 问题4:(本小题3分)程序中模板类 Queue的析构函数主要做了什么事情?为什么要这么 做 问题5:(本小题5分,每答对一个给1分)下面的程序使用了 queue.h文件中定义的类模板, 说明程序中哪些定义队列对象的语句是不正确的,哪些是正确的? # nclude“ queue. h” Queue<int>q2 Queue<int> q3(100) Queue<int>q4[100] 14 Queue<int>q5=new Queue<int>: /5 delete q5 语句号 对/错 四 (本小题16分)阅读下面的程序,写出程序运行的结果 水*水 #include <iostream .h>
55 } 56 57 template <class Type> 58 Queue<Type>::~Queue() 59 { 60 QueueItem<Type> *p=front, *q; 61 while(p!=NULL) 62 { 63 q=p->nextItem; 64 delete p; 65 p=q; 66 } 67 } 问题 1:(每个填空 3 分,共 15 分)程序中有几处填空,将它们完成。 (A)______________________________________________ (B)______________________________________________ (C)______________________________________________ (D)______________________________________________ (E)______________________________________________ 问题 2:(本小题 3 分)题中程序第 1、2 行为什么要说明一下类模板 Queue?如果没有这两 行语句,程序还正确吗? 答: 问题 3:(本小题 4 分)程序第 22、23 行各有一个 const,它们各自表示什么含义? 答: 问题 4:(本小题 3 分)程序中模板类 Queue 的析构函数主要做了什么事情?为什么要这么 做? 答: 问题 5:(本小题 5 分,每答对一个给 1 分)下面的程序使用了 queue.h 文件中定义的类模板, 说明程序中哪些定义队列对象的语句是不正确的,哪些是正确的? #include “queue.h” void main() { Queue q1; //1 Queue<int> q2; //2 Queue<int> q3(100); //3 Queue<int> q4[100]; //4 Queue<int> q5=new Queue<int>; //5 //… delete q5; } 答: 语句号 1 2 3 4 5 对/错 四、 (本小题 16 分)阅读下面的程序,写出程序运行的结果。 /*************************************************************/ #include <iostream.h>
class At private: …其它成员 public virtual void func(int data)scout<<class A: "<<data<<endl; void func(char *str)f cout<<class A: <<str<<endl; i class B: public At …其它成员 void funco(cout<<function in B without parameter! n, void func(int data) cout<<class B: <<data<<endl; void func( char *str)f cout<<class B: <<str<<end; i int main(int argc, char argvD) ApA pa=&b pA->func(1) A->func(haha”); eturn o 问题1:(本小题4分)在下面写出程序的运行结果 问题2:(本小题2分)如下句所示,在函数manO中通过pA调用类B中定义的参数表为 空的函数funO: pA->funco 是否正确? 答:(正确/不正确) 问题3:(本小题10分)如果要记录已尼创建的A类的实例(对象)的个数,我们可以借助 于类的静态成员。修改上面类A的定义,使得它包含一个私有的静态成员 object count,记 录属于该类的对象的个数,然后为类A增加必要的成员函数,使得下面的程序 A*pA=new A[3] cout<" There are”<<pA> GetObject Count)<<” objects”"< <endl delete pA cout<<"There are<<A: GetObject Count(<<"objects<<endl 得到的输出为: There are 3 objects There are 0 objects 在下面写出类A的定义(将所有的函数成员实现写在类定义体中): 在下面写出初始化类的静态成员 object count的语句: 五、(本题共9分)
class A{ private: //…其它成员 public: virtual void func(int data){cout<<”class A:”<<data<<endl;} void func(char *str){ cout<<”class A:”<<str<<endl; } }; class B: public A{ //…其它成员 public: void func() {cout<<”function in B without parameter! \n”;} void func(int data) { cout<<”class B:”<<data<<endl; } void func(char *str){ cout<<”class B:”<<str<<endl;} }; int main(int argc,char *argv[]) { A *pA; B b; pA=&b; pA->func(1); pA->func(“haha”); return 0; } /*************************************************************************/ 问题 1:(本小题 4 分)在下面写出程序的运行结果: 问题 2:(本小题 2 分)如下句所示,在函数 main()中通过 pA 调用类 B 中定义的参数表为 空的函数 func() : pA->func(); 是否正确? 答:(正确/不正确) 问题 3:(本小题 10 分)如果要记录已尼创建的 A 类的实例(对象)的个数,我们可以借助 于类的静态成员。修改上面类 A 的定义,使得它包含一个私有的静态成员 object_count,记 录属于该类的对象的个数,然后为类 A 增加必要的成员函数,使得下面的程序: void main() { A *pA=new A[3]; cout<<”There are ”<<pA->GetObjectCount()<<” objects”<<endl; delete []pA; cout<<”There are ”<<A::GetObjectCount()<<” objects”<<endl; } 得到的输出为: There are 3 objects There are 0 objects 在下面写出类 A 的定义(将所有的函数成员实现写在类定义体中): 在下面写出初始化类的静态成员 object_count 的语句: 五、(本题共 9 分)
下面的程序定义了一个简单的 SmallInt类,用来表示从-128到127之间的整数。类的唯 的数据成员val存放一个-128到127(包含-128和127这两个数)之间的整数,为了方 类 Smallint还重载了一些运算符。阅读 SmallInt的定义,回答题目后面的问题 class SmallInt( Smallint(int i=o) 重载插入和抽取运算符 friend ostream &operator<<(ostream&os, const SmallInt &si) friend istream &operator>>(istream &is, SmallInt &si) ∥重载算术运算符 SmallInt operator+(const Smallint &sifreturn SmallInt( val+si. val); j SmallInt operator-(const SmallInt &sifreturn SmallInt(val-si. val); SmallInt operator*(const SmallInt &si)return SmallInt(val *si. val); 3 SmallInt operator/(const SmallInt &si)return SmallInt( val/si. val); ∥重载比较运算符 en: Cool operator=( const SmallInt &si)(return(val=si. val), Smallint SmallInt(int 1) while(i>127) i-=256 while(i<-128) +=256 ostream &operato stream &os const smallInt &si os<<(int )si. val eturn os. istream &operator>>(istream &is, SmallInt &si) Int tmp, Is>>tmp, Si=SmallInt(tmp) return Is 问题1:(本小题4分)上面的类定义中,重载的插入运算符和抽取运算符被定义为类的友 元函数,能不能将这两个运算符定义为类的成员函数?如果能,写出函数原型,如果不能, 说明理由 问题2:(本小题5分)为类 SmallInt增加一个重载的运算符+=’,函数原型如下: class SmallInt( public SmallInt &operator +=(const SmallInt &si) ∥其它函数 private 该函数将返回对当前对象的引用。如:
下面的程序定义了一个简单的 SmallInt 类,用来表示从-128 到 127 之间的整数。类的唯一 的数据成员 val 存放一个-128 到 127(包含-128 和 127 这两个数)之间的整数,为了方便, 类 SmallInt 还重载了一些运算符。阅读 SmallInt 的定义,回答题目后面的问题。 class SmallInt{ public: SmallInt(int i=0); //重载插入和抽取运算符 friend ostream &operator<<(ostream&os,const SmallInt &si); friend istream &operator>>(istream &is, SmallInt &si); //重载算术运算符 SmallInt operator+(const SmallInt &si){return SmallInt(val+si.val);} SmallInt operator-(const SmallInt &si){return SmallInt(val-si.val);} SmallInt operator*(const SmallInt &si){return SmallInt(val*si.val);} SmallInt operator/(const SmallInt &si){return SmallInt(val/si.val);} //重载比较运算符 bool operator==(const SmallInt &si){return (val==si.val);} private: char val; }; SmallInt::SmallInt(int i) { while(i>127) i-=256; while(i<-128) i+=256; val=i; } ostream &operator<<(ostream &os,const SmallInt &si) { os<<(int)si.val; return os; } istream &operator>>(istream &is,SmallInt &si) { int tmp; is>>tmp; si=SmallInt(tmp); return is; } 问题 1:(本小题 4 分)上面的类定义中,重载的插入运算符和抽取运算符被定义为类的友 元函数,能不能将这两个运算符定义为类的成员函数?如果能,写出函数原型,如果不能, 说明理由。 答: 问题 2:(本小题 5 分)为类 SmallInt 增加一个重载的运算符’+=’,函数原型如下: class SmallInt{ public: SmallInt &operator +=(const SmallInt &si); //其它函数…… private: char val; }; 该函数将返回对当前对象的引用。如: