当前位置:文档之家› 面向对象方法学试题及答案

面向对象方法学试题及答案

C++程序设计试题(下)样卷(卷面50分)(考试用时100分钟)一、选择题(每题1分,共5分)1.设计一个自定义类时,需要在屏幕上显示或向文件写入类对象的数据,最佳选择方法是。

A.为屏幕显示和文件写入各自设计一个成员函数。

B.为屏幕显示和文件写入统一设计一个成员函数。

C.重载插入运算符(<<)。

D.重载提取运算符(>>)。

2.关于异常处理,那些说法是错误的。

A.在C++程序中,由throw表达式抛出异常,而该表达式应直接或间接地被包含在try块中。

B.当抛出异常后,寻找匹配的catch子句有固定的过程:逆着程序函数的调用链返回,称为栈展开(Stack Unwinding)。

C.当某条语句抛出异常时,跟在其后的语句将被跳过,但析构函数仍然执行,所以应该在析构函数中释放资源。

D.catch子句实际是一个特殊的函数。

3.下列关于动态资源分配的说法中错误的是。

A.动态分配的资源不仅包括内存,还包括文件。

B.动态内存分配的优点在于可以随时给数组分配所需的内存而不会失败。

C.动态分配的资源通常要求在析构函数中释放。

D.对含有动态分配的数据成员的类对象应该采用深复制。

4.下列有关模板的描述那些是错误的。

A.模板把数据类型作为一个设计参数,称为参数化程序设计。

B.模板参数除模板类型参数外,还有非类型参数。

C.类模板与模板类是同一概念。

D.使用时,模板参数与函数参数相同,是按位置而不是名称对应的。

5.关于多态,下面那些说法是正确的。

A.多态分静态的(编译时)和动态的(运行时)。

B.运行时的多态与类的层次结构有关。

C.在基类定义了虚函数后,在派生类中重新定义时可以不加关键字virtual。

D.仅使用虚函数并不能实现运行时的多态性,还必须采用指针或引用来调用才能真正实现运行时的多态性。

二、填空题(每空0.5分,共5分)1.有标准字符串类string对象str,str1,str2。

对其字符元素的访问可用两种方式:str[i]和str.at(i)。

两者的区别是(1)。

str1+=str2 实现的运算是(2)。

str.substr(pos,length1) 实现的运算是(3)。

2.C/C++中的多维数组用的是一个(4)的定义,即多维数组的基本定义是(5)构成的数组,三维数组的元素是(6)。

3.单链表的结点包含两个域:(7)和(8)。

使用链表的最大的优点是(9),即使是动态数组也做不到这一点。

4.纯虚函数定义时在函数参数表后加=0,它表明程序员对函数体不定义,其本质是将指向函数体的指针定为(10)。

三、阅读程序段(每题4分,共16分)1.写出下面的程序输出的数据,这是什么图形?int main(){int a[10][11]={0,1},i,j;for(i=1;i<10;i++)for(j=1;j<=i+1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j];for(i=0;i<10;i++){for(j=1;j<=i+1;j++) cout<<a[i][j]<<'\t';cout<<endl;}return 0;}2.写出下列程序的输出结果,并做简单的说明。

class Student{string coursename; //课程名int classhour; //学时int credit; //学分public:Student(){coursename="#";classhour=0;credit=0;}virtual void Calculate(){credit=classhour/16;}void SetCourse(string str,int hour){coursename=str;classhour=hour;}int GetHour(){return classhour;}void Print(){cout<<coursename<<'\t'<<classhour<<"学时"<<'\t'<<credit<<"学分"<<endl;}};class GradeStudent:public Student{public:GradeStudent(){};void Calculate(){SetCredit(GetHour()/20);}};int main(){Student s,*ps;GradeStudent g;s.SetCourse("英语",80);g.SetCourse("英语",80);ps=&s;ps->Calculate();ps->Print();ps=&g;ps->Calculate();ps->Print();return 0;}3.写出该程序的输出结果,并说明该类的定义中top和maxSize的意义。

template<typename T>class Stack{int top;T *elements;int maxSize;public:Stack(int=30);~Stack(){delete[] elements;}void Push(const T &data);T Pop();};template<typename T> Stack<T>::Stack(int maxs){maxSize=maxs;top=-1;elements=new T [maxSize];}template<typename T> void Stack<T>::Push(const T &data){elements[++top]=data;}template<typename T> T Stack<T>::Pop(){return elements[top--];}int main(){int i;char a[5]={'k','c','a','t','s'};Stack<char>cstack();for(i=0;i<5;i++) cstack.Push(a[i]);for(i=0;i<5;i++) cstack.Pop());return 0;}4.写出下列程序的输出结果,指出错误所在;将A的析构函数改为虚函数结果又如何?class A{int *p;public:A(){p=new int[3];cout<<”A().”;}~A(){delete[]p;cout<<”~A().\n”;}}class B:public A{int *q;public:B(){q=new int[256];cout<<”B(). ”;}~B(){delete[]q;cout<<”~B().”;}}int main(){int i;for(i=0;i<3;i++){A*r=new B; //重复创建动态对象delete r;//重复释放动态对象}}四、填空,完善程序(每空1.5分,共24分)1.对半查找递归算法,x为定值,算法作为升序有序表(ordered list)模板类的成员函数。

其中T为模板类型参数,sixe代表有序表中数组slist元素的个数。

小于比较运算符(<)在具体的类中重载。

template <typename T,int size> int Orderedlist<T,size>::Binarysearch(T & x,const int low,const int high){int mid=-1;if (low<=high){mid=(low+high)/2;if (slist[mid]<x) mid=Binarysearch(x, (1) );else if (x<slist[mid]) mid=Binarysearch(x, (2) );}return (3) ;}2.冒泡排序算法,作为Orderedlist<T,size>类的成员函数。

last 是有序表元素个数。

template <typename T,int size> void Orderedlist<T,size>::BubbleSort(){bool noswap; //交换标志int i,j;T temp;for (i=0;i<last;i++){noswap= (4) ;for (j= (5) ; (6) ; (7) ){ //从下往上冒泡 if (slist[j]<slist[j-1]){temp=slist[j];slist[j]=slist[j-1];slist[j-1]=temp;noswap= (8) ;}}if (noswap) break ;}}3.用虚函数来实现辛普生法求函数的定积分。

在梯形法中是用直线来代替曲边梯形的曲边,在辛普生法中是用抛物线来代替,得出的公式为(区间必须为偶数n 个相等区间)。

⎰--+++++++++∆≈ba n n n y y y y y y y y x dx x f )](2)(4[31)(2421310class Simpson{double Intevalue,a,b; //Intevalue 积分值,a 积分下限,b 积分上限 public :virtual double fun(double x)=0; //被积函数声明为纯虚函数Simpson(double ra=0,double rb=0){a=ra;b=rb;Intevalue=0;}void Integrate(){double dx;int i;dx=(b-a)/2000;Intevalue= (9) ;for(i=1;i<2000;i+=2) Intevalue+=4*fun( (10) );for(i=2;i<2000;i+=2) Intevalue+=2*fun( (10) );Intevalue*=dx/3;}void Print(){cout<<"积分值="<<Intevalue<<endl;}};class A:public Simpson{public:A(double ra,double rb):Simpson(ra,rb){};double fun(double x){ (11) ;} //以sin(x)作为被积函数};int main(){A a1(0.0,3.1415926535/2.0);Simpson *s=&a1;s->Integrate(); //动态s->Print();return 0;}4.单链表的结点采用类Node,以链表类List为友元类,List可直接访问Node 的私有成员。

相关主题