C++冬.docx
《C++冬.docx》由会员分享,可在线阅读,更多相关《C++冬.docx(11页珍藏版)》请在冰豆网上搜索。
C++冬
上海大学2004-2005年冬季学期试卷
成绩
课程名:
面向对象程序设计C++学分:
5
学号:
姓名:
院系:
一.选择
1.[]使用标准C++库进行控制台的输入输出,要求声明:
A.#includeB.#include
usingnamespacestd;usingnamespacestd;
C.#includeD.#include
#usingnamespacestd;#definenamespacestd;
2.[]写一条语句,动态分配10个double空间的内存,地址赋给p:
A.doublep=newdouble;B.double*p=newdouble[10];
C.doublep=newdouble(10);D.double*p=malloc(sizeof(double)*10);
3.[](多选)要设计一个汽车制造调度系统,正确的是:
A.构造Automobile类,BuildEngine类,Machine类,Work类,Name类。
B.构造Automobile类,Engine类,PaintMachine类,Machine类,Worker类。
C.Automobile类含有Engine类型的成员变量。
D.PaintMachine类作为Machine类的基类。
E.变量MaryLeakey是Worker类的一个实例。
F.Worker类作为Name类的派生类。
4.[](多选)下面说法正确的有:
A.用class进行类的定义,类的成员在默认情况下是私有的。
B.C++语言的变量声明必须写在函数代码的开头地方。
C.一个抽象类,不能实例化。
D.类的构造函数返回类型是void
E.在类的成员变量是指针时,应该考虑设计一个拷贝构造函数。
F.类的静态成员函数不能访问非静态成员。
5.[]重载操作符>>从输入流中抽取数据到CMy类型的对象中正确的设计是
A.istreamoperator>>(istreamin,CMyobj);
B.istream&operator>>(istreamin,CMyobj);
C.istream&operator>>(istream&in,CMyobj);
D.istream&operator>>(istream&in,CMy&obj);
6.[]声明一组函数,函数签名有冲突的是
1)voidFunc(int*a);2)intFunc(int*p);
3)voidFunc(inta,intb);4)intFunc(int&a);
A.1)、2)B.1)、3)C.2)、4)D.都有
7.[](多选)对以下的函数声明,合法的调用方式有。
voidgetstr(string&buff,charterm=’\n’);
A.stringstr;getstr(str);B.stringbuff;getstr(&buff);
C.stringstr;getstr(str,‘\t’);D.char*buff=”abc”;getstr(buff,‘\t’);
8.[]用C++标准库连接字符串,字符串str初值”abcd”,然后连接串”efg”:
A.char*str=”abcd”;str+=”efg”;B.stringstr=”abcd”;str+=”efg”;
C.charstr[]=”abcd”;strcat(str,”efg”);D.charstr=”abcd”,str=str+”efg”;
二.填空
1.面向对象程序设计语言的主要特征是______________________________
2.C++标准模板库的名空间的名称是___________
3-7.复数类代码填空
classComplex
{doublereal;doubleimage;
public:
Complex(){}
Complex(doubler){_________________________}
Complex(doubler,doublei){____________________________}
___________________operator-(Complext,Complexu);
};
______________________operator-(Complext,Complexu)
{//复数减实现
return_________________________________________________
}
8-19.编写影片管理程序
#include
#include<___________>
usingnamespacestd;
classFilm
{
public:
Film(stringt,stringd){title=t;director=d;}
stringtitle;stringdirector;
_____________________________;//声明数据打印函数output
};
voidFilm:
:
output()//实现数据打印函数output
{cout<<”title:
”<
”<}
class____________________________//声明导演影片剪辑片类DirectorCut
{
public:
DirectorCut(stringt,stringd,stringc):
____________{changes=s;}
stringchanges;
voidoutput()
{_______________________________
cout<<”changes:
”<}
};
class______________________________//声明外国影片类ForeignFilm
{
public:
ForeignFilm(stringt,stringd,stringl):
Film(t,d){____________}
stringlanguage;
______________________//声明数据打印函数output
{Film:
:
output();
cout<<”language:
”<<_________________<}
};
voidmain()
{intselect;cin>>select;
Film*pFilm;
if(select==0)
pFilm=newFilm(“红高粱”,”张艺谋”);
elseif(select==1)//创建DirectorCut对象
__________DirectorCut(“xxx”,”xxxx”,”xxxxxx”);
else//创建ForeignFilm对象
____________________(“HarryPotter”,”xxxx”,”English”);
pFilm->output();
____________pFilm;//销毁对象
}
20-24在一个数组list中查找数据key,数组中元素的数据类型是摸板类型,设计其摸板函数。
成功返回其下标,否则返回-1。
template<_____________>
______find(___________________________)//查找key
{
for(__________________________)
if(list[i]==key)
returni;
______________;
}
三.阅读程序
1.写出输出结果:
________
voidmain()
{int*p1=newint;int*p2=newint;
if(p1==p2)
cout<<”p1与p2相等”<else
cout<<”p1与p2不相等”<}
2.写出输出结果:
________
classB
{protected:
virtualvoidf(){cout<<”B”<public:
voidg(){f();}
};
classD:
publicB
{protected:
virtualvoidf(){cout<<”D”<};
voidmain()
{Dd;d.g();}
3.写出输出结果:
________
doublesomefunc(intx,inty){if(y==0)throw“er:
分母是0”;returnx/y;}
voidmain()
{
try{cout<catch(char*e)
{cout<}
4.写出输出结果:
________
#include#includeusingnamespacestd;
voidprint(inti){cout<
voidmain()
{vectorv(5);
for(inti=0;i<5;i++)v[i]=2*i;
for_each(v.begin(),v.end(),print);
}
5.写出输出结果:
________
#includeusingnamespacestd;
classCB
{staticintn;inta;
public:
CB(){n++;a=1;}~CB(){n--;}
intgetN(){returnn;}intgetA(){returna;}
};
intCB:
:
n=0;
voidmain()
{CBb;CB*pb=newCB;
cout<getN()<<""<getA()<deletepb;
cout<}
6.写出下面程序有标号的代码行调用序列(写法举例:
(1),
(1),
(2),
(1))
_______________________________________________________________
7.
写出输出结果:
________________________________________________
#include#include#include#include
usingnamespacestd;
classCObj
{public:
CObj(){}CObj(stringtype){m_type=type;}
virtualvoidload(istream&in)
{in>>m_ID>>name;}//1
stringname;stringm_ID;stringm_type;
};
classCStudent:
publicCObj
{public:
CStudent():
CObj("CStudent"){}
virtualvoidload(istream&in);
voidsetCourseScore(stringcourseID,intscore)
{courseScores[courseID]=score;}
mapcourseScores;
};
voidCStudent:
:
load(istream&in)
{CObj:
:
load(in);
intn;in>>n;
for(inti=0;i{stringcourse;in>>course;intscore;in>>score;
setCourseScore(course,score);
}
}
classCCourse:
publicCObj
{public:
CCourse():
CObj("CCourse"){}
};
classCManage
{public:
~CManage()
{for(map:
:
iteratorp=m_AllObj.begin();p!
=m_AllObj.end();p++)
{CObj*pobj=p->second;deletepobj;}
m_AllObj.clear();
}
voidRead(constchar*filename)
{ifstreamifile(filename);
while(ifile)
{stringtype;ifile>>type;
CObj*pObj=0;
if(type=="CStudent")pObj=newCStudent;
elseif(type=="CCourse")pObj=newCCourse;
elsebreak;
pObj->load(ifile);m_AllObj[pObj->m_ID]=pObj;
}
}
voidReport(stringstudentID)
{try{CObj*pStu=m_AllObj[studentID];
CStudent*pStudent=dynamic_cast(pStu);
cout<name<<"成绩表"<map&courseScores=pStudent->courseScores;
for(map:
:
iteratorp=courseScores.begin();p!
=courseScores.end();p++)
{CObj*pCour=m_AllObj[p->first];
CCourse*pCourse=dynamic_cast(pCour);
cout<name<<"\t"<second<}
}catch(...)
{cout<<"此学生不存在,或数据库出错!
"<}
private:
mapm_AllObj;
};
voidmain()
{CManagemanage;
manage.Read("data.txt");//文件data.txt有数据,见后
manage.Report("020001");
}
数据文件data.txt中有数据如下:
CStudent020001张三2A00180A00270
CStudent010002李四3A00180A00270A00370
CCourseA001数学
CCourseA002物理
CCourseA003化学
四.对有标号的行,有错标记X,无错标记√,可以修改的修改。
classUnknown
{public:
virtualvoidv(intx)=0;//1
}//2
classBC:
publicUnknown//3
{public:
BC(){c=1;}//4
BC(inta){x=a;}//5_________________
void~BC(){}//6
int&X()
{returnx;}//7
staticvoidsetX(inta)
{x=a;}//8
intgetX()
{returnthis->x;}//9
staticvoidsetS(inta)
{s=a;}//10________________________
intgetS()
{returns;}//11____________________
virtualvoidv(inta)
{protectedFunc(a);}//12_______________________
voidm(inta)
{privateFunc(a);}//13____________________
private:
intx;staticints;constintc;
voidprivateFunc(inta){x=c*a;}
protected:
voidprotectedFunc(inta){x=s*a;}
};
classDC:
BC//14.___________________
{public:
DC(){}
DC(inta){BC(a);}//15
~DC(inta){}//16______________________
virtualvoidv(inta)
{privateFunc(a);}//17_________________
voidm(constchar*a);
};
voidDC:
:
m(constchar*a)//18._____________________
{BC:
:
m(0);//19
protectedFunc
(1);//20_________________________________
}
intBC:
:
s=0;//21
intmain()
{Unknownun;//22__________________
DCdc;
dc.m(10);//23.___________________
dc.m(“abc”);//24.__________________
intx=dc.getX();//25______________
BCbc;
bc.privateFunc
(1);//26_____________________
bc.protectedFunc
(1);//27______________________
BC:
:
m
(1);//28______________
Unknown*pb=newBC;
pb->v
(1);//29
deletepb;//30
DC*pdc1=newBC;//31
BC*pb2=&dc;//32
pb2->m
(2);//33
BC*pdc2=newDC;//34
DC*pdc2=dynamic_cast(pdc2);//35
}
四.设计类
1.设计栈Stack模板类,基本要求是要实现Push和Pop先进后出的操作,并编一个main()函数测试它。
2.设计一个类层次体系1)Person类,包括姓名、身份证号码。
2)CollegeStudent类,包括姓名、身份证号码、学校名称。
3)Profession类,包括姓名、身份证号码、学历、收入。
基本要求是提供访问其数据的成员函数,其他可任意发挥,并编一个main()函数测试。
/////////////////////////////////////////////////////完/////////////////////////////////////////////////