上海大学C++学年冬.docx
《上海大学C++学年冬.docx》由会员分享,可在线阅读,更多相关《上海大学C++学年冬.docx(25页珍藏版)》请在冰豆网上搜索。
上海大学C++学年冬
上海大学2011~2012学年冬季学期试卷A
课程名:
面向对象程序设计A课程号:
学分:
5
一.选择(18分,其中1-7每小题2分,8-11每小题1分)
1.[](多选)C++语言编程的优势是
A.是一种面向对象的语言,而生成的代码运行时开销小。
B.是一种面向过程的语言,用自顶向下设计方法进行设计。
C.易学易用,比用VB,Delphi,java语言编程容易些。
D.是强大的专业级的编程语言,最适合开发系统级软件。
2.[]以下表述错误的是:
A.面向对象的程序设计工作包括通用算法、类、消息、类之间关联、组件等设计。
B.C++语言中类和对象是完全相同的概念。
C.封装意味着对象内部是如何工作的对客户端来说是不可见的。
D.多态性成员函数意味着其虚函数调用的入口地址是运行期绑定。
E.面向对象的编程,要执行一个任务有两种方式:
客户/服务器模式和委托/事件模式。
F.Windows编程是一种事件机制的编程。
3.[]名空间的用途是
A.防止标识符冲突,提供标识符的组织方式B.表达标识符间的继承关系C.表示变量
4.[](多选)要设计一个汽车制造调度系统,好的做法是:
A.构建Name类,Automobile类,BuildEngine类,Machine类,Work类。
B.构建Automobile类,Engine类,PaintMachine类,Machine类,Worker类。
C.Automobile类含有Engine类型的成员变量。
D.Machine类作为PaintMachine类的基类。
E.Worker类作为Name类的派生类。
5.[](多选)以下代码错误的是:
A.voidfunc(int&c);B.inta;int&c=a;C.int&func();D.inta;int&c;
E.virtualvoidh();
6.[](多选)已有以下定义,为派生类CD定义构造函数,正确的实现代码是:
classCB{….public:
CB();CB(string);CB(constBase&);protected:
string_name;};
classCD:
publicCB{...};
A.CD:
:
CD(){CB();}B.CD:
:
CD(strings):
CB(s){}
C.CD:
:
CD(){}D.CD:
:
CD(constCB&b):
CB(b){}
7.[](多选)有以下定义,结果为true的表达式是
classCB{virtualvoidm(){…}};classCD:
publicCB{};
CB*pb=newCD;CD*pd=(CD*)pb;
A.typeid(pb)==typeid(pd)B.typeid(pb)==typeid(CB*)
C.typeid(pb)==typeid(CD*)D.typeid(*pb)==typeid(CB)
E.typeid(*pd)==typeid(CD)F.typeid(pd)==typeid(CB*)
8.[]重载操作符>>从输入流中读取数据到CMy类型的对象中正确的设计是:
A.istream&operator>>(istream&in,CMy&obj);B.istream&operator>>(istreamin,CMyobj);
C.istream&operator>>(istream&in,CMyobj);D.istreamoperator>>(istreamin,CMyobj);
9.[]从键盘输入数据到变量x,应用标准C++库编程,正确的是:
A.cout>>x;B.std:
cin<C.std:
:
cin>>x;
D.usingnamespacestd;cin<
10.[]设计一个函数,功能是使调用者的两整型变量数据交换,其函数原型应该是:
A.voidsa,intb);B.voidswap(&intx,&inty);
C.intsa);D.voids&a,int&b);
11.[]动态分配n个整数的内存空间,C++编程方法是:
A.int*p=newint[n*sizeof(int)];B.inta[]=newint[n];
C.int*p=newint[n];D.inta[n];
二.填空((27分,其中每小题1分)
1.面向对象程序设计语言的主要特征是_______________________________________
2.函数参数的设计其数据传递有三种方式,分别是传__2.1___、传___2.2___、传___2.3_____
3.修改下面代码的错误第___3.1___行代码改写为_____3.2______
int&db1(inti)//1
{
intj=2*i;//2
returnj;//3
}
4.设计一个函数encode,功能是对字符串加密,你设计的函数原型(接口)是:
___4.1_____________
其中相关参数和返回的说明:
________4.2_______________
5.已有定义:
classBC{public:
intb;}};classDC:
publicBC{public:
intd;};
BC*pb=newDC;
所创建的DC对象有___5.1__个成员变量,现要对其中成员变量d赋值为1,代码是____5.2_____
6.设计一个两个开关都能任意控制一个楼道电灯的监控器Windows应用程序,样例如下图界面。
完成你的解决方案(注:
可随意用英文中文表述):
系统采用VisualStudioC++开发平台的什么项目类型框架编程______6.1__。
界面显示的对话框从____6.2___类派生,它包含两个逻辑开关,一个逻辑电灯,在什么地方初始化它们:
_______6.3______
逻辑开关类,包含那些含义的成员变量怎么关联逻辑电灯:
_____6.4______,
包含那些含义的成员函数:
______6.5_______
逻辑电灯类,怎么关联电灯图标:
____6.6___________
包含那些意义的成员函数:
______6.7_____________
对话框中订阅什么事件来操作(调用)逻辑开关的push函数:
_____6.8__
7.实现下面的类
classCPerson
{
protected:
stringname;
public:
voidsetname(stringname){_____7.1___=name;}
stringgetname(){returnname;}
};
classCWorker:
________7.2____________
{
doublescore;
public:
______7.3_____(){}//构造函数
______7.4____{setname(name);}//构造函数
______7.5____{}//析构函数
intcompareScore(CWorker&worker)
{
if(this->scoreelseif(_____________7.6_____________)return1;
elsereturn0;
}
doublegetscore(){returnscore;}
voidsetscore(doublescore){this->score=score;}
};
改写getscore成员函数为外联式实现_______7.7______________________________
改写setscore成员函数为外联式实现____________7.8_______________________
8.填空使下述代码显示D:
:
m
#include
classB
{public:
________________
};
classD:
publicB
{public:
voidm(){cout<<”D:
:
m()”<};
voidmain()
{Dd1;B*p=&d1;p->m();
}
三.阅读程序(15分,每小题3分)
1.写出输出结果:
_____________________________
classContainer
{
enum{MaxSize=5};
intarray[MaxSize];
intn;
public:
Container(){n=0;}
voidappend(inta)
{
if(n{
array[n]=a;
n++;
}
else
throw"越界";
}
};
2.写出输出结果:
_____________________________
#include#include#includeusingnamespacestd;
intmain(intargc,char*argv[])
{
stringstr="李伟102000.00";
istringstreamistm(str);
stringname;intage;doublesalary;
istm>>name>>age>>salary;
doubler=10;
salary+=age*r;
ostringstreamostm;
ostm<<"姓名"<cout<return0;
}
3.下面的程序,用标号共标记了6个断点,写出程序先后运行到断点的标号序列(写法举例:
1,3,3)4,________________3.1_______
输入数据100200的运行结果:
____3.2______
classIEventHandle
{public:
virtualvoidOnMouseDown(intx,inty)=0;//1
};
classCRecv:
publicIEventHandle
{public:
virtualvoidOnMouseDown(intx,inty)
{
cout<<"x="<}
};
classMouse
{intx;inty;
IEventHandle*pSink;
public:
Mouse(intx,inty,IEventHandle*pSink)
{
this->x=x;this->y=y;this->sink=sink;//3
}
voidfireEvent()
{
pSink->OnMouseDown(x,y);
}
};
voidmain()
{CRecvrecv;//4
inta,b;cin>>a>>b;//5
Mousemouse(a,b,&recv);
mouse.fireEvent();
}
4.学生数据库查询打印程序,写出输出结果:
__________________________
数据文件DBData.txt中有数据如下:
Student020001张三
Student010002李四
Score数学02000180
Score数学01000270
Score物理01000260
Score政治02000190
intmain()
{
CAppapp;
app.ReadDatabase("DBData.txt");
app.Report();
return0;
}
classCStudent
{
mapcourseScores;
public:
stringm_name;
stringm_ID;
CStudent(){}
CStudent(stringid,stringname)
{
m_ID=id;m_name=name;
}
voidsetCourseScore(stringcourseName,intscore)
{
courseScores[courseName]=score;
}
voidprintScore()
{
for(map:
:
iteratorp=courseScores.begin();p!
=courseScores.end();p++)
{
cout<first<<"\t"<second<}
}
};
classCApp
{dequem_stus;
CStudent*findStudent(stringid)
{
for(inti=0;i{
CStudent&stu=m_stus[i];
if(stu.m_ID==id)
return&stu;
}
returnNULL;
}
public:
voidReadDatabase(constchar*);
voidReport();
};
voidCApp:
:
Report()
{
cout<<"\t成绩表"<deque:
:
iteratorit;
for(it=m_stus.begin();it!
=m_stus.end();it++)
{
CStudent&stu=*it;
cout<stu.printScore();
}
}
voidCApp:
:
ReadDatabase(constchar*)
{
ifstreami);
while(ifile)
{
stringtype;
ifile>>type;
if(type=="Student")
{
stringid,name;
ifile>>id>>name;
CStudentstu(id,name);
m_stus.push_back(stu);
}
elseif(type=="Score")
{
stringid,courseName;
intscore;
ifile>>courseName>>id>>score;
CStudent*pStu=findStudent(id);
if(pStu!
=NULL)
pStu->setCourseScore(courseName,score);
}
}
}
四.改错(对有标号的行,有错标记X,无错标记√)(20分,每小题0.5分)
classA
{public:
virtualvoidv(intx)=0;//1
}//2
classB:
A//3
{
intx;staticints;constintc;
protect:
//4
voidprotectedFunc(inta)
{x=s*a;}//5
public:
B():
c(0),x(0){}//6
B(inta)
{x=a;c=0;}//7
~B(){}//8
voidpublicFunc(inta)
{this->protectedFunc(a);}//9
int&getX()
{return&x;}//10
voidsameNameFunc(inta)
{cout<staticvoidstaticSetS(inta)
{s=x;}//12
intgetS()
{returnthis->s;}//13
virtualvoidv(inta)
{cout<<"B"<};
intB:
:
s=0;//15
voidg(B*pB){}
voidD:
:
publicDFunc()//21
{B:
:
publicFunc(0);//22
protectedFunc
(1);//23
}
classD:
publicB//16
{int*p;
public:
intd;
D():
p=NULL{}//17
DC(inta){BC(a);p=NULL;}//18
virtual~D(){}//19
virtualvoidv(inta)
{cout<<"D"<voidsameNameFunc(constchar*s)
{cout<
voidset(int*p)
{x=*p;}//20
voidpublicDFunc();
};
intmain()
{Aobj=newA;//24
Ddc;
dc.sameNameFunc(10);//25
dc.sameNameFunc("abc");//26
int&x=dc.getX();//27
Bbc;//28
bc.protectedFunc
(1);//29
A*pa=newD
(2);//30
pa.v
(1);//31
deletepa;//32
D*pdc=dc;//33
B*pb=&dc;//34
B:
:
staticSetS
(2);//35
D*pdc=dynamic_cast(pb);//36
pdc=(D*)pb;//37
pdc->v(inta);//38
pdc->d=1;//39
g(&dc);//40
}
五.程序设计(20分,每小题10分
1.设计一个模板函数,在数组中查找数据,并编写main函数测试它。
其模板函数函数名SeqSearch
2.使用C++标准库,采用面向对象的方法设计一个程序,读证券交易行情文件,输出一个按收盘价由小到大排序的的报表
数据文件stock.txt格式如下
代码开盘价收盘价成交量
数据文件样例:
6000283.003.102900000
60017110.109.5023000
6009006.006.20300000
0008254.104.025000
输出结果样例:
6000283.003.102900000
0008254.104.0025000
60017110.109.5023000
6000283.003.102900000
-----------------------------------------------------完----------------------------------------------------------------------
上海大学2011~2012学年冬季学期答卷
小题
第一题选择题18%
1-7每小题2分,8-11每小题1分
1
AD
2
B
3
A
4
BCD
5
DE
6
BCD
7
BE
8
A
9
C
10
D
11
C
小计:
小题
第二题填空题27%
每小题1分
1
封装,继承,多态
2.1
值
2.2
地址
2.3
引用
小题
第二题填空题
3.1
2
3.2
staticintj=2*i;或int&j=*newint;
4.1
voidencode(char*sEnText,constchar*sText,constchar*sKey);
4.2
sEnText:
加密后的文本,sTex:
待加密的文本,sKey:
密钥,返回空
5.1
2
5.2
DC*pdc=(DC*)pb;pdc->d=1;或DC*pdc=static_cast(pb);pdc->d=1;
6.1
MFC应用(注:
只要含MFC给分)
6.2
CDialog
6.3
OnInitDialog或对话框初始化的地方
6.4
亮熄状态、逻辑灯对象的指针
6.5
Push(或:
按动操作函数)
6.6
包含一个成员变量指向类型CStatic对象图标(电灯)
6.7
setOnOff(或设置亮熄状态的函数)
6.8
WM_MOUSEDOWN或鼠标按下消息)
7.1
this->name
7.2
publicCPe