专题资料(2021-2022年)《面向对象程序设计》期末考核试题样例及解答.doc
面向对象程序设计期末考核试题样例及解答 一、单项选择(每小题1分,12小题,共12分) 1. C+源程序文件的缺省扩展名为( )。 A. cpp B. exe C. obj D. lik 2. x>0 | y=5的相反表达式为( )。A. x<=0 | y!=5 B. x<=0 && y!=5C. x>0 | y!=5 D. x>0 && y=5 3. 在下面的字符数组定义中,有语法错误的是( )。 A. char a20=“abcdefg”; B. char a=“x+y=55.”; C. char a15; D. char a10=5; 4. 以下正确的函数原型语句是( )。 A. double fun(int x,int y) B. double fun(int x;int y) C. double fun(int,int); D. double fun(int x,y); 5. 在下面存储类中,( )的对象不是局部变量。 A. 外部静态类 B. 自动类 C. 函数形参 D. 寄存器类 6. 假定有“struct BOOKchar title40; float price; BOOK *book=new BOOK;”,则正确的语句是( )。 A. strcpy(book->title,”Wang Tao”); B. strcpy(book.title,”Wang Tao”); C. strcpy(*book.title,”Wang Tao”); D. strcpy(*book)->title,”Wang Tao”); 7. 软件产品所具有的全部或部分地再用于新的应用的能力称为该软件的( )。 A. 可维护性 B. 可复用性 C. 兼容性 D. 正确性 8. 在多文件结构的程序中,通常把含有main()函数的文件称为( )。 A. 主文件 B. 实现文件 C. 程序文件 D. 头文件 9. 在一个用链表实现的队列类中,假定每个结点包含的值域用elem表示,包含的指针域用next表示,链队的队首指针用elemHead表示,队尾指针用elemTail表示,若链队为空,则进行插入时必须把新结点的地址赋给( )。 A. elemHead B. elemTail C. elemHead和elemTail D. elemHead或elemTail 10. 假定AB为一个类,则执行 “AB a, b(2), c3, *p=&a;”语句时共调用该类无参构造函数的次数为( )。 A. 5 B. 6 C. 3 D. 4 11. 引入友元的主要目的是为了( )。 A. 增强数据安全性 B. 提高程序的可靠性 C. 提高程序的效率和灵活性 D. 保证类的封装性 12. 如果是类B在类A的基础上构造,那么,就称( )。 A. 类A为基类或父类,类B为超类或子类 B. 类A为基类、父类或超类,类B为派生类或子类 C. 类A为派生类,类B为基类 D. 类A为派生类或子类,类B为基类、父类或超类 二、填空(每空1分,15小题,共18分) 1. C+语言是在_语言的基础上发展起来的。 2. 假定x=5,y=6,则执行表达式y*=x+计算后,x和y的值分别为_和_。 3. 假定x是一个逻辑量,则x && false的值为_。 4. 在if语句中,每个else关键字与它前面同层次并且最接近的_关键字相配套。 5. 一个二维字符数组a1020能够存储_个字符串,每个字符串的长度至多为_。 6. 局部变量具有局部生存期,存放在内存的_区中。 7假定p所指对象的值为25,p+1所指对象的值为42,则执行*(p+)或*p+运算后,p所指对象的值为_。 8. 已知语句“cout<<s;”的输出是“apple”,则执行语句“cout<<s+2;”的输出结果为_。 9. 面向对象软件开发的生命周期分为三个阶段,即分析、_和_。 10. 若采用p->abc(y)表达式调用一个成员函数,在成员函数中使用的_就代表了类外的p指针。 11当用户为一个类定义有_时,则系统不会为该类再自动生成一个默认构造函数。 12假定用户为类AB定义了一个构造函数"AB(int aa, int bb):a(aa),b(bb)",则定义该类的对象时,有_种定义格式。 13假定用户只为类AB定义了一个构造函数"AB(int aa, int bb=0) a=aa; b=bb;",则定义该类的对象时,其实参表中至少带有_个实参。 14. 在重载一个单目运算符时,参数表中没有参数,说明该运算符函数只能是类的_。 15. 若要保证一个公共的基类在派生类中只产生一个基类子对象,则必须都以_的方式继承它。 三、程序填充。对程序、函数或类中划有横线的位置,根据题意按标号把合适的内容填写到程序下面相应标号的后面(每小题6分,3小题,共18分) 1. 把从键盘上输入的一个大于等于3的整数分解为质因子的乘积。如输入24时得到的输出结果为“2 2 2 3”,输入50时得到的输出结果为“2 5 5”,输入37时得到的输出结果为“37”。 #include<iostream.h> void main() int x; cout<<"请输入一个整数,若小于3则重输:" do cin>>x; while(_(1)_); int i=2; do while(_(2)_) cout<<i<<' ' x/=i; _(3)_; while(i<x); if(x!=1) cout<<x; cout<<endl; (1) (2) (3) 2. 假定有定义为“struct NODEint data; NODE* next;”,下面算法根据table数组中的n个元素建立一个表头指针为L的链表,链表中结点值的顺序与数组元素值的顺序正好相反。 void f6(NODE*& L, int table, int n) L=NULL; if(n<=0) return; int i=0; NODE* p; while(_(1)_) p=new NODE; p->data=_(2)_; p->next=L; _(3)_; i+; (1) (2) (3) 3. 已知一个利用数组实现栈的类定义如下: const int ARRAY_SIZE=10; class Stack public: void Init() top=-1; /初始化栈为空 void Push(int newElem); /向栈中压入一个元素 int Pop(); /从栈顶弹出一个元素 bool Empty() /判栈空 return top=-1; int Depth() return top+1; /返回栈的深度 void Print(); /按照后进先出原则依次输出栈中每个元素, /直到栈空为止 private: int elemARRAY_SIZE; /用于保存栈元素的数组 int top; /指明栈顶元素位置的指针 ; void Stack:Push(int newElem) if(_(1)_) cout<<"栈满!"<<endl; exit(1); /中止运行 _(2)_; elemtop=_(3)_; (1) (2) (3) 四、写出程序或程序段的运行结果(每小题6分,3小题,共18分) 1. #include<iostream.h> void main() int x=5; switch(2*x-3) case 4: cout<<x<< ; case 7: cout<<2*x+1<< ; case 10: cout<<3*x-1<< ; break; default: cout<<"default"<<endl; cout<<"switch end."<<endl; 2. #include<iostream.h> void main() int i,j,len3; char a38="year","month","day" for(i=0;i<3;i+) for(j=0;j<8;j+) if(aij='0') leni=j;break; cout<<ai<<":"<<leni<<endl; 3. #include <iostream.h> #include <string.h> class Point int x,y; public: Point(int x1=0, int y1=0) :x(x1), y(y1) cout<<"Point:"<<x<<' '<<y<<'n' Point() cout<<"Point des!n" ; class Text char text100;/文字内容 public: Text(char * str) strcpy(text,str); cout<<"Text con!n" Text()cout<<"Text des!n" ; class CircleWithText : public Point,public Text public: CircleWithText(int cx,int cy, char *msg): Point(cx,cy),Text(msg) cout<<"Point with Text con!n" CircleWithText() cout<<"Point with Text desn" ; void main() CircleWithText cm(3,4,"hello"); 五、指出程序或函数的功能(每小题6分,2小题,共12分) 1. double f1(double a, double b, char op) switch(op) case +: return a+b; case -: return a-b; case *: return a*b; case /: if(b=0) cout<<"divided by 0!"<<endl; exit(1); else return a/b; default: cout<<"operator error!"<<endl; exit(1); 功能: 2. IntNode* FindMax(IntNode *f) if(!f) return NULL; IntNode *p=f; f=f->next; while(f) if(f->data>p->data) p=f; f=f->next; return p; 假定IntNode的类型定义为: struct IntNode int data; /结点值域 IntNode* next; /结点指针域 ; 功能: 六、程序改错。请根据程序或函数模块的功能改写个别地方的错误(每小题6分,共6分)。 在下面的定义中,NODE是链表结点的结构,appendToList则是一函数,其功能是:在list所指向的链表的末尾添加一个新的值为x的结点,并返回表头指针。函数中有两处错误,指出错误所在行的行号并提出改正意见。 struct NODE int data; NODE *next; ; NODE* appendToList(NODE *list, int x) /1行 NODE *p=new int; /2行 p->data=x; /3行 p->next=NULL; /4行 if(list=NULL) return p; /5行 NODE *p1=list; /6行 while(p1->next!=NULL) p1=p1->next; /7行 p1=p; /8行 return list; 错误行的行号为_和_。 分别改正为_和_。 七、编程(每小题8分,2小题,共16分) 1. 编一程序求出满足不等式的最小n值并输出。 2. 根据下面类中MaxMin 函数成员的原型和注释写出它的类外定义。 class AA int* a; int n; int MS; public: void InitAA(int aa, int nn, int ms) if(nn>ms) cout<<"Error!"<<endl; exit(1); MS=ms; n=nn; a=new intMS; for(int i=0; i<MS; i+) ai=aai; int MaxMin(int& x, int& y); /从数组a的前n个元素中求出 /最大值和最小值,并分别由引用参数x和y带回, /同时若n大于0则返回1,否则返回0。 ; 试题参考解答: 一、单项选择 1. A 2. B 3. D 4. C 5. A 6. A 7. B 8. A 9. C 10. D 11. C 12. B 二、填空 1. C 2. 6 30 3. false (或0) 4. if 5. 10 19 6. 栈 7. 25 8. ple 9. 设计 实现 10. this 11. 构造函数 12. 1 13. 1 14. 成员函数 15. 虚基类 三、程序填充 1. (1) x<3 (或x<=2) (2) x%i=0 (3) i+ (或+i或i=i+1或i+=1) 2. (1) i<n (2) tablei (3) L=p 3. (1) top=ARRAY_SIZE-1 (或Depth()=ARRAY_SIZE) (2) top+(或+top) (3) newElem 四、写出程序或程序段的运行结果 1. 11 14 switch end. 2. year:4 month:5 day:3 3. Point:3 4 Text con! Point with Text con! Point with Text des Text des! Point des! 五、指出程序或函数的功能 1. 以参数a和b为运算对象,以参数op为四则算术运算符,求出运算结果并返回。 2. 从表头指针f指向的、由IntNode类型的结点所构成的链表中查找出data域的值最大的结点并返回指向该结点的指针。 六、程序改错。请根据程序或函数模块的功能改写个别地方的错误。 错误行的行号: 2 8 分别改正为: NODE *p=new NODE; p1->next=p; 七、编程 #include<iostream.h> void main() int i=0; double s=0; while(s<5) s+=double(1)/+i; cout<<"n="<<i<<endl; 若采用for循环编写程序,则如下所示: #include<iostream.h> void main() int i; double s=0; for(i=1; s<5; i+) s+=1.0/i; cout<<"n="<<i-1<<endl; /注意:此i-1的值为所求的n值 2int AA:MaxMin(int& x, int& y) int mx,my; mx=my=a0; for(int i=1; i<n; i+) if(ai>mx) mx=ai; if(ai<my) my=ai; x=mx; y=my; if(n>0) return 1; else return 0; 9