C++06年高级语言程序设计(二)试题及答案_第1页
C++06年高级语言程序设计(二)试题及答案_第2页
C++06年高级语言程序设计(二)试题及答案_第3页
C++06年高级语言程序设计(二)试题及答案_第4页
C++06年高级语言程序设计(二)试题及答案_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

成绩第1页(共10页成绩上海大学上海大学2006~2007学年春季学期试卷课程名:高级语言程序设计(二)课程号:08305002学分:4应试人声明:我保证遵守《上海大学学生手册》中的《上海大学考场规则》,如有考试违纪、作弊行为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。应试人应试人学号应试人所在院系题号一(15)二(20)三(25)四(20)五(20)得分一、判断题。对真命题在题后括号内打“√”,对假命题打“×”

(每小题1分,共15分)。1. 类是对象的抽象,而对象是类的具体实例。(√)2. 创建类的对象时,系统将自动调用构造函数或者复制构造函数。(√)3. 在任何情况下,C++系统总是会给类提供默认的构造函数。(×)4. 析构函数可以被重载。(×)5. 对于局部自动对象,先构造的对象后析构,后构造的对象先析构。(√)6. 类的常量数据成员的初始化必须采用冒号语法。(√)7. 可以显式调用某个对象的析构函数来销毁该对象。(×)8. C++类中的所有成员函数(包括静态成员函数)的形式参数中均包含一个隐含的指向本类对象的指针参数this。(×)9. 创建元素个数为3的对象数组时,将调用3次构造函数。(√)10.运算符重载不能改变运算符的运算优先级、结合方向。(√)11.一般应将插入运算符“<<”、抽取运算符“>>”重载为友元函数。(√)12.派生类继承了基类的所有数据成员、所有成员函数(包括构造函数等)。(×)13.含有纯虚函数的类为抽象类。可以创建抽象类的对象。(×)14.派生类的成员函数可以访问基类部分的所有(包括受保护的、私有的)数据成员和成员函数。(×)15.创建派生类的对象时,先调用基类的构造函数,再调用组合成员的构造函数,最后执行派生类构造函数体的语句。(√)得得分第2页(共10页)得分得分二、填空题(共20分)1.(5分)完成如下交换两个实参值的函数模板。template<typenameT>voidswap(①_Ta,②_Tb___){③_Ttemp__________;temp=a;a=b;b=temp;}2.(6分)用如下结构体类型structNode{intx;Node*next;};的变量构成单向链表。设链表首结点的地址为head,又假定链表中的所有结点均为堆结点,填空完成如下释放链表所有结点的函数。voidFreeList(Node*&head){④Node__*p;while(⑤head!=NULL_){p=head;head=⑥head->next;deletep;}}3.(每空1分,共9分)C++语言提供了3中继承:公用继承、保护继承、私有继承。在基类中,数据成员的访问属性有公用的(public)、受保护的(protected)、私有的(private),这些属性在派生类中是怎样的?请在下表中填写public,protected,private或者不可访问。表1.基类成员在派生类中的访问属性继承方式基类成员属性公用继承保护继承私有继承publicpublicprotectedprivateprotectedprotectedprotectedprivateprivate不可访问不可访问不可访问第3页(共10页)得分得分三、阅读理解(共25分)。1.(10分,每行1分)有如下程序,写出该程序的运行结果。#include<iostream>#include<iomanip>usingnamespacestd;classTime{public: Time(inthour=0,intminute=0,intsecond=0) { h=hour;m=minute;s=second; } voidSet(inthour=0,intminute=0,intsecond=0) { h=hour;m=minute;s=second; } Time&operator++() { if(++s==60) { s=0;m++; if(m==60) { m=0;h++; if(h==24)h=0; } } return*this; } Timeoperator++(int) { Timetemp(*this); ++(*this); returntemp; } friendostream&operator<<(ostream&output,constTime&time) { output<<setfill(’0’)<<setw(2)<<time.h<<’:’ <<setw(2)<<time.m<<’:’ <<setw(2)<<time.s<<setfill(’’); returnoutput; }protected: inth,m,s;};第4页(共10页)intintmain()

{ //将对应的程序行的输出结果写在横线上

Timet; t.Set(23,59,59);

cout<<++t<<endl; ①__00:00:00______ cout<<t<<endl; ②__00:00:00______ t.Set(10,20,30);

cout<<t++<<endl; ③__10:20:30______ cout<<t<<endl; ④__10:20:31______ t.Set(10,20,30);

cout<<++++t<<endl; ⑤__10:20:32______ cout<<t<<endl; ⑥__10:20:32______ t.Set(10,20,30);

cout<<(++t)++<<endl; ⑦__10:20:31______ cout<<t<<endl; ⑧__10:20:32______ t.Set(10,20,30);

cout<<++(t++)<<endl; ⑨__10:20:31______ cout<<t<<endl; ⑩__10:20:31______ return0;

}2.(15分,每行1分)有如下程序,写出该程序的运行结果。#include<iostream>usingnamespacestd;classSample{public: Sample(intx=0,inty=0) { a=x;b=y; cout<<"Construct("<<a<<","<<b<<")"<<endl; } Sample(constSample&s) { a=s.a;b=s.b; cout<<"Copyconstruct("<<a<<","<<b<<")"<<endl; } ~Sample() { cout<<"Destruct("<<a<<","<<b<<")"<<endl; }

第5页(共10页) Sample& Sample&operator=(constSample&s) { a=s.a;b=s.b; cout<<"Assign("<<a<<","<<b<<")"<<endl; return*this; } friendostream&operator<<(ostream&output,constSample&s) { output<<"("<<s.a<<","<<s.b<<")"; returnoutput; }private: inta,b;};Sample&f(Samples,Sample*ps,Sample&rs){ cout<<"Inf()..."<<endl; rs=*ps=s; returnrs;}intmain() //将对应的程序行的输出结果写在横线上(部分输出结果已填){ Samples1(2,3), ⑴_Construct(2,3)______s2(5,8), ⑵_Construct(5,8)_____s3(10,20), ⑶_Construct(10,20)___s4=s3; ⑷_Copyconstruct(10,20) cout<<”Callingf()...”<<endl; Callingf()... f(s1,&s2,s3); ⑸_Copyconstruct(2,3)_ Inf()... ⑹_Assign(2,3)________ ⑺_Assign(2,3)________ ⑻_Destruct(2,3)______ cout<<”Returntomain()...”<<endl; Returntomain()... cout<<s1<<endl; ⑼_(2,3)_______________ cout<<s2<<endl; ⑽_(2,3)_______________ cout<<s3<<endl; ⑾_(2,3)_______________ cout<<”Exitting...”<<endl; Exitting... return0; ⑿_Destruct(10,20)____} ⒀_Destruct(2,3)______ ⒁_Destruct(2,3)______ ⒂_Destruct(2,3)______第6页(共10页)四、分析程序。根据如下程序,填表并指出程序的运行结果(四、分析程序。根据如下程序,填表并指出程序的运行结果(共20分)。#include<iostream>#include<string>usingnamespacestd;classStudent //声明一个抽象类{public: Student(stringid="00000000",stringname="NoName"):Id(id),Name(name),Credit(0),Tuition(0){}//构造函数 voidSet(doublecredit){Credit=credit;} virtualvoidComputeTuition()=0; //纯虚函数 voidShow() //非虚函数 { cout<<Id<<""<<Name <<",学分:"<<Credit<<",学费:"<<Tuition; }protected: stringId,Name; //Id表示学号,Name表示姓名 doubleCredit,Tuition; //Credit表示学分,Tuition表示学费};classUndergraduate:publicStudent //派生本科生类{public: Undergraduate(stringid="00000000",stringname="NoName",stringspecialty="NoSpecialty"):Student(id,name),Specialty(specialty){}//构造函数 virtualvoidComputeTuition() //虚函数,计算学费 {Tuition=100*Credit; //本科生每学分100元} voidShow() //非虚函数 { Student::Show(); cout<<",专业:"<<Specialty<<endl; }protected: stringSpecialty; //Specialty表示专业};得分第7页(共10页)classclassPostgraduate:publicStudent //派生硕士研究生类{public: Postgraduate(stringid="00000000",stringname="NoName",stringadvisor="NoTutor") :Student(id,name),Advisor(advisor){} //构造函数 virtualvoidComputeTuition() //虚函数,计算学费 { Tuition=200*Credit; //硕士研究生每学分200元 } voidShow() //非虚函数 { Student::Show(); cout<<",导师:"<<Advisor<<endl; }protected: stringAdvisor; //Advisor表示导师};voidfinancialOffice(Student*ps,doublecredit){ //定义财务处办公室操作 ps->Set(credit); //修改学分 ps->ComputeTuition(); //计算学费 ps->Show();cout<<endl;}intmain(){ UndergraduateZhang("07120001","张三","计算机科学与技术"); PostgraduateLi("07130001","李四","王五"); financialOffice(&Zhang,20); Zhang.Show(); financialOffice(&Li,12); Li.Show(); Student*s1=newUndergraduate("07140001","Tom","ComputerScience"); Student*s2=newPostgraduate("07150001","Jerry","Snoopy"); Undergraduate*p1=(Undergraduate*)s1; Postgraduate*p2=(Postgraduate*)s2; financialOffice(s1,25); s1->Show();cout<<endl; p1->Show(); financialOffice(s2,18); s2->Show();cout<<endl; p2->Show(); deletep1; deletep2; return0;}第8页(共10页)1.(6分)分析函数1.(6分)分析函数voidfinancialOffice(Student*ps,doublecredit);体中所调用的3个函数的特性。在下表中打“√”表示对应的函数有此特性;不做记号或者打“×”表示对应的函数无此特性。函数特性派生类的函数直接继承覆盖所继承的函数派生类中完成定义静态关联动态关联Set√√ComputeTuition√√Show√√2.(4分)在主函数中,如下4行语句(编行号便于叙述):(1)Student*s1=newUndergraduate("07140001","Tom","ComputerScience");(2)Student*s2=newPostgraduate("07150001","Jerry","Snoopy");(3)Undergraduate*p1=(Undergraduate*)s1;(4)Postgraduate*p2=(Postgraduate*)s2;哪些是类型的自动转换,哪些是类型的强制转换,请填下表,记号同上。语句是否有自动转换是否有强制转换(1)√(2)√(3)√(4)√3.(10分)写出程序运行的结果。07120001张三,学分:20,学费:200007120001张三,学分:20,学费:2000,专业:计算机科学与技术07130001李四,学分:12,学费:240007130001李四,学分:12,学费:2400,导师:王五07140001Tom,学分:25,学费:250007140001Tom,学分:25,学费:250007140001Tom,学分:25,学费:2500,专业:ComputerScience07150001Jerry,学分:18,学费:360007150001Jerry,学分:18,学费:360007150001Jerry,学分:18,学费:3600,导师:Snoopy第9页(共10页)得分得分五、编程题。下面是人民币类classRMB;的声明,共有10个成员函数。请在类体声明外完成尚未完成的8个成员函数的定义,可利用已定义的2个成员函数(每个函数2.5分,共20分)。【注意】例如:对人民币金额12345分,应按123,4,5分别存放在数据成员yuan,jiao,fen中。输出结果为¥123元4角5分。#include<iostream>usingnamespacestd;classRMB{public: RMB(intx=0); //实参x以“分”为单位 voidSet(intx=0); //重新设置金额,以“分”为单位 intGet()const; //获取当前金额,以“分”为单位 RMB&operator++(); //前增量运算,增加1分 RMB&operator--(); //前减量运算,减少1分 RMBoperator++(int); //后增量运算,增加1分 RMBoperator--(int); //后减量运算,减少1分 RMB&operator+=(constRMB&r); //迭代赋值(加并赋值) friendRMBoperator+(constRMB&r1,constRMB&r2); //两

温馨提示

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

评论

0/150

提交评论