28刘小虎C++实验3.docx
《28刘小虎C++实验3.docx》由会员分享,可在线阅读,更多相关《28刘小虎C++实验3.docx(17页珍藏版)》请在冰豆网上搜索。
28刘小虎C++实验3
实验3多态性
实验课程名:
高级语言程序设计Ⅱ
专业班级:
12网工2班学号:
201240420228姓名:
刘小虎
实验时间:
5-12.-5.19实验地点:
K4-201指导教师:
祁文青
3.1实验目的和要求
(1)了解多态性的概念。
(2)掌握运算符重载的基本方法。
(3)掌握虚函数的定义和使用方法。
(4)掌握纯虚函数和抽象类的概念和用法。
3.2实验内容与步骤
1.分析并调试下列程序,写出程序的输出结果,并解释输出结果。
//test5_1.cpp
#include
usingnamespacestd;
classB{
public:
virtualvoidf1(doublex)
{cout<<”B:
:
f1(double)”<}
voidf2(doublex)
{cout<<”B:
:
f2(double)”<<2*x<}
voidf3(doublex)
{cout<<”B:
:
f3(double)”<<3*x<}
}
classD:
publicB{
public:
virtualvoidf1(doublex)
{cout<<”D:
:
f1(double)”<}
voidf2(doublex)
{cout<<”D:
:
f2(double)”<<2*x<}
voidf3(doublex)
{cout<<”D:
:
f3(double)”<<3*x<}
};
intmain()
{Dd;
B*pb=&d;
D*pd=&d;
pb->f1(1.23);
pb->f1(1.23);
pb->f2(1.23);
pb->f3(1.23);
pb->f3(3.14);
return0;
}
解答:
2.编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。
要求将小时范围限制在大于等于0,分钟范围限制在0~59,秒钟范围限制在0~59秒。
【提示】
时间类Time{
public:
Time(inth=0,intm=0,ints=0);
Timeoperator+(Time&);
voiddisptime(string);
private:
inthourse;
intminutes;
intseconds;
};
、
解答:
代码如下
#include
#include
usingnamespacestd;
classTime
{
public:
Time(inth=0,intm=0,ints=0);
Timeoperator+(Time&);
voiddisplay(string);
private:
inthours;
intminutes;
intseconds;
};
Time:
:
Time(inth,intm,ints)
{
hours=h;
minutes=m;
seconds=s;
}
TimeTime:
:
operator+(Time&t1)
{
Timep;
p.seconds=seconds+t1.seconds;
inttemp=p.seconds;
p.seconds=temp%60;
p.minutes=minutes+t1.minutes+temp/60;
temp=p.minutes;
p.minutes=temp%60;
p.hours=hours+t1.hours+temp/60;
returnp;
}
voidTime:
:
display(strings)
{
cout<
"<"<}
intmain()
{
inth,m,s;
do
{
cout<<"输入第一个时间时分秒"<cin>>h>>m>>s;
}
while(h<0||m<0||m>59||s<0||s>59);
Timet(h,m,s);
do
{
cout<<"输入第二个时间时分秒"<cin>>h>>m>>s;
}
while(h<0||m<0||m>59||s<0||s>59);
TimeT(h,m,s),t_total;
t_total=t+T;
t_total.display("输出结果(时/分/秒):
");
cout<<"201240420228,刘小虎"<return0;
}
3.给出下面的抽象基类container;
classcontainer
{
protected:
doubleradius;
public:
container(doubleradius1);
virtualdoublesurface_area()=0;
virtualdoublevolume()=0;
};
要求建立3个继承container的派生类cube、sphere与cylinder,让每一个派生类都包含虚函数surface_area()和volume(),分别用来计算正方体、球体和圆柱体的表面积及体积。
要求写出主程序,应用C++的多态性,分别计算边长为6.0的正方体、半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。
解答:
代码如下
#include
usingnamespacestd;
#definePI3.1415927
classcontainer
{
protected:
doubleradius;
public:
container(doubleradius1){};
virtualdoublesurface_area()=0;
virtualdoublevolume()=0;
};
classcube:
publiccontainer
{
public:
cube(doubler):
container(r){radius=r;}
doublesurface_area()
{
return6*radius*radius;
}
doublevolume()
{
returnradius*radius*radius;
}
};
classsphere:
publiccontainer
{
public:
sphere(doubler):
container(r)
{
radius=r;
}
doublesurface_area()
{
return4*PI*radius*radius;
}
doublevolume()
{
return4*PI*radius*radius*radius/3;
}
};
classcylinder:
publiccontainer
{
protected:
doubleheight;
public:
cylinder(doubler,doubleh):
container(r)
{
radius=r;height=h;
}
doublesurface_area()
{
return2*PI*radius*radius+2*PI*radius*height;
}
doublevolume()
{
returnPI*radius*radius*height;
}
};
intmain()
{
cubea(6.0);
sphereb(5.0);
cylinderc(5.0,6.0);
cout<<"正方体表面积:
"<cout<<"正方体体积:
"<cout<<"球表面积:
"<cout<<"球体积:
"<cout<<"圆柱体表面积:
"<cout<<"圆柱体体积:
"<cout<<"201240420228,刘小虎"<return0;
}
4.编写一个程序,用于进行集合的并、差和交运算。
例如输入整数集合{954367}和{2469},计算出它们进行集合的并、差和交运算后的结果。
【提示】
i.可用以下表达式实现整数集合的基本运算:
s1+s2两个整数集合的并运算
s1-s2两个整数集合的差运算
s1*s2两个整数集合的交运算
ii.参考以下Set类的框架,用于完成集合基本运算所需的各项功能。
classset{
public:
set:
:
set();
voidset:
:
input(intd);
intset:
:
length();
intset:
:
getd(inti);
voidset:
:
disp();
setset:
:
operator+(sets1);
setset:
:
operator-(sets1);
setset:
:
operator*(sets1);
setset:
:
operator=(sets1);
protected:
intlen;
ints[MAX];
};
解答:
代码如下:
#include
#include
usingnamespacestd;
voidjiao(charjiHe1[],intcount1,charjiHe2[],intcount2);
voidbing(charjiHe1[],intcount1,charjiHe2[],intcount2);
voidcha(charjiHe1[],intcount1,charjiHe2[],intcount2);
voiddiKaEr(charjiHe1[],intcount1,charjiHe2[],intcount2);
voidoutput(chara[],intn);
#defineN50
intmain()
{
intchoice;
cout<<"1.交集"<cout<<"2.并集"<cout<<"3.差集"<cout<<"4.笛卡尔集"<cin>>choice;
if(choice==1){
charjiHe1[N],jiHe2[N];
intcount1,count2;
cout<<"请输入集合1数的个数";
cin>>count1;
cout<<"请输入集合1的元素"<for(inti=0;icin>>jiHe1[i];
cout<<"请输入集合2数的个数";
cin>>count2;
cout<<"请输入集合2的元素"<for(intj=0;jcin>>jiHe2[j];
jiao(jiHe1,count1,jiHe2,count2);
}
elseif(choice==2){
charjiHe1[N],jiHe2[N];
intcount1,count2;
cout<<"请输入集合1数的个数";
cin>>count1;
cout<<"请输入集合1的元素"<for(inti=0;icin>>jiHe1[i];
cout<<"请输入集合2数的个数";
cin>>count2;
cout<<"请输入集合2的元素"<for(intj=0;jcin>>jiHe2[j];
bing(jiHe1,count1,jiHe2,count2);
}
elseif(choice==3){
charjiHe1[N],jiHe2[N];
intcount1,count2;
cout<<"请输入集合1数的个数";
cin>>count1;
cout<<"请输入集合1的元素"<for(inti=0;icin>>jiHe1[i];
cout<<"请输入集合2数的个数";
cin>>count2;
cout<<"请输入集合2的元素"<for(intj=0;jcin>>jiHe2[j];
cha(jiHe1,count1,jiHe2,count2);
}
elseif(choice==4){
charjiHe1[N],jiHe2[N];
intcount1,count2;
cout<<"请输入集合1数的个数";
cin>>count1;
cout<<"请输入集合1的元素"<for(inti=0;icin>>jiHe1[i];
cout<<"请输入集合2数的个数";
cin>>count2;
cout<<"请输入集合2的元素"<for(intj=0;jcin>>jiHe2[j];
diKaEr(jiHe1,count1,jiHe2,count2);
}
elsereturn0;
system("pause");
return0;
}
voidjiao(charjiHe1[],intcount1,charjiHe2[],intcount2)
{
intnum=0;
chara[N];
for(inti=0;ifor(intj=0;j{
if(jiHe1[i]==jiHe2[j])
a[num++]=jiHe1[i];
}
sort(a,a+num);
cout<<"交集为:
";
output(a,num);
}
voidbing(charjiHe1[],intcount1,charjiHe2[],intcount2)
{
intnum1=0;
intcount=0;
charb[N];
for(inti=0;i{
b[num1++]=jiHe1[i];
}
for(intj=0;jfor(intk=0;k{
if(jiHe2[j]!
=jiHe1[k]){
count++;
}
if(count==count1){
b[num1++]=jiHe2[j];
}
}
count=0;
}
sort(b,b+num1);
cout<<"并集为:
";
output(b,num1);
}
voidoutput(chara[],intn)
{
cout<<"{";
for(inti=0;icout<cout<cout<<"}";
cout<}
voidcha(charjiHe1[],intcount1,charjiHe2[],intcount2)
{
charc[N];
intnum1=0;
intnum=0;
for(inti=0;ifor(intj=0;jif(jiHe1[i]!
=jiHe2[j]){
num++;
}
if(num==count2){
c[num1++]=jiHe1[i];
}
}
num=0;
}
sort(c,c+num1);
cout<<"差集为:
";
output(c,num1);
}
voiddiKaEr(charjiHe1[],intcount1,charjiHe2[],intcount2)
{
cout<<"笛卡尔积为";
cout<<"{";
//cout<<"<";
for(inti=0;ifor(intj=0;jcout<<"<"<";
}
}
cout<<"}"<}
三、结论(写本次实验的收获)