C++ 实验45 软件143 142927 王浩鑫.docx
《C++ 实验45 软件143 142927 王浩鑫.docx》由会员分享,可在线阅读,更多相关《C++ 实验45 软件143 142927 王浩鑫.docx(17页珍藏版)》请在冰豆网上搜索。
C++实验45软件143142927王浩鑫
软件143142927王浩鑫第4,5次作业
实验四多态性
一、实验目的
1、掌握运算符重载的基本方法。
2、掌握友元运算符函数和成员运算符函数的使用方法及两者之间的不同。
3、学习虚函数的定义与使用方法。
4、了解静态多态性和动态多态性。
5、学习使用虚函数和继承实现动态多态性。
二、试验内容
1、编写一个程序,要求:
(1)生明一个类Complex(复数类),定义类Complex的两个对象c1和c2,对象c1通过构造函数直接指定复数的实部和虚部(类私有数据成员为double类型:
real和imag)为2.5及3.7,对象c2通过构造函数直接指定复数的实部和虚部为4.2及6.5;
(2)定义友元运算符重载函数,它以c1、c2对象为参数,调用该函数时能返回两个复数对象相加操作;
(3)定义成员函数print,调用该函数时,以格式“real+imagi”输出当前对象的实部和虚部,例如:
对象的实部和虚部分别是4.2和6.5,则调用print函数输出格式为:
4.2+6.5i;
(4)编写主程序,计算出复数对象c1和c2相加结果,并将其结果输出。
#include
classComplex{
private:
doublereal,imag;
public:
Complex(){}
Complex(doubler,doublei)
{real=r;imag=i;}
friendComplexoperator+(Complexa,Complexb);
voidprint()
{cout<};
Complexoperator+(Complexa,Complexb)
{Complexc;
c.real=a.real+b.real;
c.imag=a.imag+b.imag;
returnc;}
main()
{
Complexc1(2.5,3.7),c2(4.2,6.5),c3;
c3=c2+c1;
c3.print();
return0;
}
2、编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。
要求将小时范围限制在大于等于0,分钟范围限制在0~59分,秒钟范围限制在0~59秒。
#include
classTime
{
public:
Time(inth=0,intm=0,ints=0)
{hours=h;minutes=m;seconds=s;
}//构造函数
friendTimeoperator+(Time,Time);
voiddisptime()
{cout<}//显示时间函数
private:
inthours,minutes,seconds;
};
Timeoperator+(Timea,Timeb)
{Timec;
c.hours=a.hours+b.hours;
c.minutes=a.minutes+b.minutes;
c.seconds=a.seconds+b.seconds;
returnc;
}//运算符重载函数,实现两个时间的相加
main()
{
Timea(1,1,1),b(2,2,2),c;
c=a+b;
a.disptime();b.disptime();
cout<<"相加后得"<c.disptime();
return0;
}
3、用友元运算符函数或成员运算符函数,重载运算符“+”、“-”、“*”,实现对实验二中实现的矩阵类的对象的加、减、乘法。
#include
classJZ{
public:
JZ(intl,intw)
{length=l;width=w;
num=newint[length*width];
int*p=num;
for(inti=0;i*p++=0;
}
JZ()
{length=1;width=1;
num=newint[1];
}
voidsetJZ()
{
int*p=num;
cout<<"输入"<for(inti=0;icin>>*(p+i);
}
friendJZoperator+(JZa,JZb);
friendJZoperator-(JZa,JZb);
friendJZoperator*(JZa,JZb);
voiddispjz()
{
int*p=num;
for(inti=0;i{cout<<*(p+i)<<"";
if(i%width==(width-1))
cout<}
private:
intlength,width,*num;
};
JZoperator+(JZa,JZb)
{
if(a.width!
=b.width||a.length!
=b.length)
cout<<"不能相加";
elseif(a.width==b.width&&a.length==b.length)
{
JZc;
c.length=a.length;
c.width=a.width;
deletec.num;
c.num=newint[c.length*c.width];
int*p=c.num;
for(inti=0;i*(p+i)=*(a.num+i)+*(b.num+i);
returnc;}
}
JZoperator-(JZa,JZb)
{
if(a.width!
=b.width||a.length!
=b.length)
cout<<"不能相减";
elseif(a.width==b.width&&a.length==b.length)
{
JZc;
c.length=a.length;
c.width=a.width;
deletec.num;
c.num=newint[c.length*c.width];
int*p=c.num;
for(inti=0;i*(p+i)=*(a.num+i)-*(b.num+i);
returnc;
}
}
JZoperator*(JZa,JZb)
{
if(a.length!
=b.width)
cout<<"两矩阵不能相乘";
elseif(a.length==b.width)
{
JZc;
c.width=a.width;
c.length=b.length;
deletec.num;
c.num=newint[c.width*c.length];
int*p=c.num;
for(inti=0;i{*(p+i)=0;}
for(i=0;ifor(intj=0;jfor(intk=0;k*(p+c.length*i+j)+=*(a.num+a.length*i+k)**(b.num+b.length*k+j);
returnc;
}
}
main()
{
JZa(3,3),b(3,3),c,d,e;
a.setJZ();b.setJZ();
c=a-b;
cout<<"矩阵相减得:
"<c.dispjz();
d=a+b;
cout<<"矩阵相加得:
"<d.dispjz();
e=a*b;
cout<<"矩阵相乘得:
"<e.dispjz();
return0;
}
5、写一个程序,定义抽象类Container:
classContainer
{
protected:
doubleradius;
public:
Container(doubler);//抽象类Container的构造函数
virtualdoublesurface_area()=0;//纯虚函数surface_area
virtualdoublevolume()=0;//纯虚函数volume
};
【要求】
建立3个继承Container的派生类:
Sphere(球体)、Cylinder(圆柱体)、Cube(正方体),让每一个派生类都包含虚函数surface_area()和volume(),分别用来球体、圆柱体和正方体的表面积和体积。
要求写出主程序,应用C++的多态性,分别计算边长为6.0的正方体、半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。
#include
usingnamespacestd;
constdoublepai=3.1415926;
classContainer
{
protected:
doubleradius;
public:
Container(doubler)
{
radius=r;
}//抽象类Container的构造函数
virtualdoublesurface_area()=0;//纯虚函数surface_area
virtualdoublevolume()=0;//纯虚函数volume
};
classSphere:
publicContainer{
public:
virtualdoublesurface_area()
{
return(pai*4*radius*radius);
}
Sphere(doubler):
Container(r){}
virtualdoublevolume()
{
return(4*pai*radius*radius*radius/3);
}
};
classCylinder:
publicContainer{
private:
doubleh;
public:
virtualdoublesurface_area()
{
return(pai*radius*radius*2+2*pai*radius*h);
}
virtualdoublevolume()
{
return(pai*radius*radius*h);
}
Cylinder(doubler,doublehigh):
Container(r)
{
h=high;
}
};
classCube:
publicContainer{
public:
virtualdoublesurface_area()
{
return(radius*radius*6);
}
virtualdoublevolume()
{
return(radius*radius*radius);
}
Cube(doubler):
Container(r){}
};
main()
{
Cubea(6.0);
cout<<"正方体的面积为:
"<cout<<"正方体的体积为:
"<Cylinderb(5.0,6.0);
cout<<"圆柱体的表面积为:
"<cout<<"圆柱体的体积为:
"<Spherec(5.0);
cout<<"球体的表面积为:
"<cout<<"球体的体积为:
"<return0;
}
实验五模板与异常处理
一、实验目的
1、正确理解模板的概念。
2、掌握函数模板与类模板的声明和使用方法。
3、学习简单的异常处理方法。
二、实验内容
1、已知下列主函数:
intmain()
{
cout<cout<cout<return0;
}
声明求3个数中最小者的函数模板,并写出调用此函数模板的完整程序。
#include
usingnamespacestd;
template
Tmin(Ta,Tb,Tc)
{
Td;
d=(a
a:
b;
return(dd:
c;
}
intmain()
{
cout<cout<cout<return0;
}
2、编写一个求任意类型数组中最大元素和最小元素的程序,要求将求最大元素和最小元素的函数设计成函数模板,并写出调用此函数模板的完整程序,使得函数调用时,数组的类型可以是整型也可以是双精度类型。
#include
usingnamespacestd;
template
voidmaxmin(T*a,intn)
{
Tmin=*a,max=*a;
for(inti=1;i{
if(min>*(a+i))
min=*(a+i);
}
cout<<"最小数为"<for(i=1;i{
if(max<*(a+i))
max=*(a+i);
}
cout<<"最大数为"<}
main()
{
inta[5],i;
cout<<"input5整数:
"<for(i=0;i<5;i++)
cin>>*(a+i);
maxmin(a,5);
doubleb[5];
cout<<"input5双精度数:
"<for(i=0;i<5;i++)
cin>>*(b+i);
maxmin(b,5);
return0;
}
3、编写一个函数模板,使用冒泡排序将数组内容由小到大排列并打印出来,并写出调用此函数模板的完整程序,使得函数调用时,数组的类型可以是整型也可以是双精度型。
#include
usingnamespacestd;
template
voidpaixu(T*a,intn)
{
inti,j;
Tt;
for(i=0;i<10;i++)
for(j=0;jif(*(a+j)>*(a+j+1))
{
t=*(a+j);
*(a+j)=*(a+j+1);
*(a+j+1)=t;
}
cout<<"从小到大排序为:
"<for(i=0;icout<<*(a+i)<<"";
cout<<"\n";
}
main()
{
inta[5],i;
doubleb[5];
cout<<"输入5个整数:
"<for(i=0;i<5;i++)
cin>>*(a+i);
paixu(a,5);
cout<<"输入5个双精度数:
"<for(i=0;i<5;i++)
cin>>*(b+i);
paixu(b,5);
return0;
}
4、编写一个程序,求输入数的平方根。
设置异常处理,对输入负数的情况给出提示。
#include
#include
usingnamespacestd;
doublekaifang(inta)
{
if(a<0)
throw("error");
returnsqrt(a);
}
main()
{
for(;;)
{
try
{
cout<<"输入一个整数:
";
inta;
cin>>a;
cout<"<}
catch(char*)
{
cout<<"错误\n";
}
}
return0;
}