《面向对象方法与C++》作业.docx
《《面向对象方法与C++》作业.docx》由会员分享,可在线阅读,更多相关《《面向对象方法与C++》作业.docx(15页珍藏版)》请在冰豆网上搜索。
《面向对象方法与C++》作业
《面向对象方法与C++》作业
一、填空题
1.若char*string=”test”;则如果要输出指针值,正确的语句是。
2.在重载“[]”运算符时,必须使用函数重载。
3.当用public继承时,基类的public成员成为派生类的成员,基类的protected成员成为派生类的成员。
4.可以赋给指针的唯一整数是。
5.在重载“=”运算符时,必须使用函数重载。
6.以下程序:
intc=10;
cout.flags(ios:
:
hex|ios:
:
showbase);
cout<的输出结果是。
7.当用private继承时,基类的public成员和protected成员都将成为派生类的成员。
8.在main函数中出现的以下语句:
max=Max(a,Max(b,c));是一个函数调用的语句。
9.头文件声明和定义了重要的文件处理操作服务。
10.关键字表示类的静态成员。
11.当一个成员函数定义在类的声明外部时,函数名之前要加上名称和运算符。
12.在C++中,虚基类的引入是为了实现继承。
二、判断题
1.在以下语句中:
cin>>XXXX;
XXXX必须是一个变量名,而不能是一个任意表达式。
()
2.以下声明将不会导致编译错误。
()
enumGradeType{'A','B','C','D','E','F'};
3.在C++里,派生类的构造函数先于其基类的构造函数执行。
()
4.C++中的所有函数都是传值调用。
()
5.在类time中声明如下的函数原型:
void~time();()
6.以下程序:
classCA
{public:
virtualvoiddis()=0;};
classCB:
publicCA
{public:
voidset(intm){k=m;}
protected:
intk;
};
voidmain()
{CBb;}
是正确的。
()
7.函数模板能够定义一个在不同数据类型基础上完成同一任务的函数。
()
8.以下语句:
char*string=”test”;
delete[]string;是正确的。
()
9.一个有指针数据成员的类必须要包含的成员函数有:
初始化构造函数,析构函数,拷贝构造函数和赋值运算符函数。
()
10.抽象基类中的所有虚函数都要声明为纯虚函数。
()
11.以下语句:
char*string=newchar[10];
strcpy(string,”test”);//…
delete[]string;是正确的。
()
12.枚举类型变量的值可以直接进行输入、输出。
()
三、读程题
1.下面程序在执行过程中,若顺序输入十个整数:
12345678910,其结果是什么。
#include
classstack;
classnode{
intdata;
node*prev;
public:
node(intd,node*n){data=d;prev=n;}
friendclassstack;
};
classstack{
node*top;
public:
stack(){top=0;}
voidpush(inti){
node*n=newnode(i,top);top=n;}
intpop(){
node*t=top;
if(top){
top=top->prev;intc=t->data;
deletet;returnc;}
return0;}
};
voidmain(){
intc;stacks;
for(inti=0;i<10;i++)
{cin>>c;s.push(c);}
for(i=0;i<10;i++)
cout<cout<
2.
#include
#include
classIncrement{
public:
Increment(int=0,int=1);
voidaddIncrement()
{count+=increment;}
voidprint()const;
private:
intcount;
constintincrement;};
Increment:
:
Increment(intc,inti):
increment(i)
{count=c;}
voidIncrement:
:
print()const{
cout<<"count="<cout<<"increment="<voidmain(){
Incrementobject(65,7);
cout<<"before:
"<object.print();
for(intj=0;j<3;j++){
object.addIncrement();
cout<<"after:
"<object.print();}}
3.
#include
classpoint{
staticintcount;
floatxcoord,ycoord;
public:
point(floatx=0,floaty=0)
{xcoord=x;ycoord=y;count++;}
staticintgetcount()
{returncount;}
~point()
{count--;}};
intpoint:
:
count=0;
voidmain(){
cout<:
getcount()<<"";
point*p,a(32.98,-4.71),b,c;
cout<:
getcount()<<"";
cout<p=newpoint[100];
cout<:
getcount()<<"";
delete[]p;
cout<:
getcount()<4.
#include
classTest{
staticintcount;
public:
Test(){++count;}
~Test(){--count;}
staticintgetCount(){returncount;}};
intTest:
:
count=0;
voidmain(){
cout<:
getCount();
Testt,tab[5],*p;
cout<<'\t'<:
getCount();
p=newTest[10];
cout<<'\t'<:
getCount();
delete[]p;
cout<<'\t'<:
getCount()<5.
#include
#include
templateclassvector{
T*v;intsz;
public:
vector(ints=100){
v=newT[sz=s];}
vector(constvector&vv){
sz=vv.sz;v=newT[sz];}
vector&operator=(constvector&vv){
if(&vv!
=this){
delete[]v;
sz=vv.sz;
v=newT[sz];
for(inti=0;iv[i]=vv.v[i];}
return*this;}
~vector(){delete[]v;}
T&operator[](inti){
if(i<0||i>=sz){cerr<<"Error\n";exit
(1);}
returnv[i];}};
voidmain(){
vectorv(10),u(v);
for(inti=0;i<10;i++)
v[i]=3*i+1;
u=v;
for(i=0;i<=10;i++)
cout<
四、编程题
1.请完成以下程序:
设计一个学生类,其属性有学号、姓名、性别、年龄和C++成绩,并定义相应操作,重载析取符(>>)和插入符(<<)以支持I/O操作。
在main函数中定义学生对象数组,对于学生对象数组从磁盘文件“student.txt”进行输入,最后以学号n为参数在数组中查找学号为n的学生,并显示该生的全部信息。
#include<_____1_____>
#include
#include
classstudent{
_____2_____;
charname[20],sex;
intage;
floatscore;
public:
student(){}
student(intnu,char*na,charse,intag,_____3_____sc){
num=nu;strcpy(name,na);
sex=se;age=ag;score=sc;}
intgetn(){
returnnum;}
friendistream&operator>>(istream&s,student&st){
s>>st.num>>st.name>>st.sex>>st.age>>st.score;
return_____4_____;}
friendostream&operator<<(_____5_____s,conststudent&st){
s<""<returns;}};
constintm=300;
_____7_____main(){
students[m];
ifstreamf("____8_____");
inti=0;
while(!
f.eof())
f>>s[__9__];
intn,flag=1;
cout<<"Entern:
";
_____10_____;
for(intj=0;j
if(s[j].getn()==n){flag=0;cout<<"找到了:
"<
if(flag==1)cout<<"没找到。
\n";
}
2.请完成以下复数类的设计,复数类对象的创建及使用。
#include<____1____>
#include
#include
classcomplex{
doublerpart,ipart;
doubleabs()const;
doublenorm()const;
public:
complex(doubler=0,doublei=0){
_____2_____;ipart=i;}
complexoperator-();
friendcomplexoperator+(constcomplex&,constcomplex&);
friendcomplexoperator-(constcomplex&,constcomplex&);
friendcomplexoperator*(constcomplex&,constcomplex&);
friendcomplexoperator/(constcomplex&,constcomplex&);
friend___3___operator>(constcomplex&,constcomplex&);
friendintoperator>=(constcomplex&,constcomplex&);
friendintoperator<(constcomplex&,constcomplex&);
friendintoperator<=(constcomplex&,constcomplex&);
friendintoperator==(constcomplex&,constcomplex&);
friendintoperator!
=(constcomplex&,constcomplex&);
friendistream&operator>>(istream&si,complex&c){
si>>c.rpart>>c.ipart;
returnsi;}
friendostream&operator<<(ostream&so,constcomplex&c){
so<<'('<_____4_____;}};
doublecomplex:
:
abs()const{
returnsqrt(rpart*rpart+_____5_____);}
doublecomplex:
:
norm()const{
return(rpart*rpart+ipart*ipart);}
complexcomplex:
:
operator-(){
returncomplex(-rpart,-ipart);}
complexoperator+(constcomplex&c1,constcomplex&c2){
returncomplex(c1.rpart+c2.rpart),c1.ipart+c2.ipart);}
complexoperator-(constcomplex&c1,constcomplex&c2){
returncomplex(_____6_____,c1.ipart-c2.ipart);}
complexoperator*(constcomplex&c1,constcomplex&c2){
returncomplex(c1.rpart*c2.rpart-c1.ipart*c2.ipart,
c1.rpart*c2.ipart+c1.ipart*c2.rpart);}
complexoperator/(constcomplex&c1,constcomplex&c2){
complexres;
doubled=c2.norm();
if(d!
=0){
res.rpart=(c1.rpart*c2.rpart+c1.ipart*c2.ipart)/d;
res.ipart=(c1.ipart*c2.rpart-c1.rpart*c2.ipart)/d;}
else{cerr<<"diveby0.\n";exit
(1);}
___7___;}
intoperator>(constcomplex&c1,constcomplex&c2){
returnc1.abs()>c2.abs();}
intoperator>=(constcomplex&c1,constcomplex&c2){
return_____8_____;}
intoperator<(constcomplex&c1,constcomplex&c2){
returnc1.abs()intoperator<=(constcomplex&c1,constcomplex&c2){
returnc1.abs()<=c2.abs();}
intoperator==(constcomplex&c1,constcomplex&c2){
returnc1.rpart==c2.rpart&&c1.ipart==c2.ipart;}
intoperator!
=(constcomplex&c1,constcomplex&c2){
return_____9______||c1.ipart!
=c2.ipart;}
voidmain(){
___10___c1(1,2),c2(3,4),c3;
cin>>c3;cout<c3=-c1*2+c2/c3*c1-6;
cout<if(c1>c2)cout<elsecout<cin>>c1>>c2>>c3;
cout<3.有一家医院的门诊记录如下所示,已知该记录存放在一个”patient.dat”文件中,请编写一个程序,帮助医生计算一下每一位病人平均血压。
病人的编号病人血压的测量次数病人血压各次测量的结果
1001510012090110100
10022100120
1003390120130
10044807090100
10053120135110
┆┆┆
4.请完成以下集合类的设计,集合类对象的创建及使用。
#include
constintmaxcard=20;
classset{
intelems[maxcard],card;
public:
set(){card=____1____;}
friendbooloperator&(int,set);
friendbooloperator==(set,set);
friend___2___operator!
=(set,set);
friendsetoperator+(set,set);
friendsetoperator+(set,int);
friendsetoperator-(set,int);
___3___setoperator*(set,set);
friendbooloperator<(set,set);
friendbooloperator<=(set,set);
friendostream&operator<<(ostream&out,constset&s)
{out<for(inti=0;iout<return____4____;}};
booloperator&(inte,sets){
for(inti=0;iif(s.elems[i]==e)
returntrue;
return____5_____;}
booloperator==(sets1,sets2){
if(s1.card!
=s2.card)returnfalse;
for(inti=0;iif(!
(s1.elems[i]&s2))returnfalse;
returntrue;}
booloperator!
=(sets1,sets2)
{return!
(s1==s2)?
true:
false;}
setoperator+(sets,inte)
{setres=s;
if(s.cardif(!
(e&s))res.elems[res.card++]=e;
returnres;}
setoperator+(sets1,sets2)
{setres=s1;
for(inti=0;ires=res+s2.elems[i];
returnres;}
setoperator-(sets,inte)
{setres=s;
if(!
(e&s))returnres;
for(inti=0;iif(s.elems[i]==e)
for(;i_____7______;
returnres;}
setoperator*(sets1,sets2){
_____8______;
for(inti=0;ifor(intj=0;jif(s1.elems[i]==s2.elems[j])
{res.elems[res.card++]=____9_____;break;}
returnres;}
booloperator<=(sets1,sets2){
if(s1.card>s2.card)returnfalse;
for(inti=0;iif(!
(s1.elems[i]&s2))returnfalse;
returntrue;}
booloperator<(sets1,sets2){
returns1.cardtrue:
false;}
voidmain(){set______10_______;
for(inti=0;i<100;i++)s1=s1+i;
cout<if(s1!
=s2)cout<<"\nTrue\n";elsecout<<"\nFalse\n";
s2=s1;cout<if(s1==s2)cout<<"\nTrue\n";elsecout<<"\nFalse\n";
for(i=0;i<20;i++)s1=s1-i;
cout<s3=s1*s2;cout<if(s1if(s1+s2<=s3)cout<<"\nTrue\n";elsecout<<"\nFalse\n";}
5.完成以下程序。
#include
#include