实验三类与对象的程序设计班级12电信实验班姓名顾慧群学号2012339960003一、实验目的掌握二元运算符和一元运算符的重载;了解运算符重载的功能;理解面向对象设计中的多态性熟悉类虚函数的在程序设计中的运用二、实验内容实验1:请你设计一个n维向量类,要求达到如下目的:1.类能够实现两个向量的和、差、点积,分别用+,-,*来实现(即要实现运算符的重载);2.类能够实现求分量的运算,使用运算[]来实现;3.n的值为3;4.请你自定义你的测试代码,能够分别测试上述功能。实验2:将书中的例5-9中的圆类改为椭圆类,圆柱类改为椭圆柱类,达到与原例相似的功能,即可以对椭圆求面积,对椭圆柱求表面积和体积,以及显示相关类信息等。三、程序代码实验1:#includeiostreamusingnamespacestd;intn;classVectors{public:inti;doubledata[100];voidsetData(){//输入n维向量for(i=0;in;i++)cindata[i];}Vectorsoperator+(Vectorsa){//用“+”实现n维向量加法运算Vectorsc;for(inti=0;in;i++)c.data[i]=data[i]+a.data[i];returnc;}Vectorsoperator-(Vectorsa){//用“-”实现n维向量减法运算Vectorsc;for(inti=0;in;i++)c.data[i]=data[i]-a.data[i];returnc;}frienddoubleoperator*(Vectorsa,Vectorsb){//用“*”实现n维向量点积运算doublec=0;for(inti=0;in;i++)c=c+a.data[i]*b.data[i];returnc;}doubleoperator[](inti){//用“[]”实现n维向量取分量运算returndata[i-1];}voiddisplay(Vectorsa){//输出加、减后的向量for(inti=0;in;i++)couta.data[i];coutendl;}voiddisplay(doublex){//输出向量点积运算、取分量运算后的结果coutxendl;}};intmain(){Vectorsa,b;cout向量维数n=;cinn;coutA向量:;a.setData();coutB向量:;b.setData();cout向量之和:;a.display(a+b);cout向量之差:;a.display(a-b);cout向量的点积:;a.display(a*b);inti;coutA向量分量:endl;for(i=1;i=n;i++)couta[i];coutendl;coutB向量分量:endl;for(i=1;i=n;i++)coutb[i];coutendl;cout请输入要求A向量的第几个分量i=;cini;coutA[i]=a[i]endl;cout请输入要求B向量的第几个分量i=;cini;coutB[i]=b[i]endl;return0;}实验2:#includeiostream.h#includeiomanip.h#includecmathclassShape{public:virtualdoublearea()const{return0.0;}//面积计算virtualdoublevolume()const{return0.0;}//体积计算virtualvoidprintShapeName()const=0;//打印形状名称virtualvoidprint()const=0;//打印面积、体积等相关信息};classPoint:publicShape{//Point类以Shape类为基类private:intx,y;//point的坐标值public:Point(int=0,int=0);//构造函数,将坐标初始化为(0,0)voidsetPoint(inta,intb){//设置点的坐标值x=a;y=b;}intgetx()const{returnx;}//返回横坐标值intgety()const{returny;}//返回纵坐标值virtualvoidprintShapeName()const{coutPoint:;}//重定义纯虚函数virtualvoidprint()const{cout'['x,y']';}};Point::Point(inta,intb){setPoint(a,b);}classOval:publicPoint{//Oval类以Point类为基类private:doublelaxis,raxis;//椭圆的半长轴和半短轴public:Oval(doublea=0.0,doubleb=0.0,intx=0,inty=0);voidsetAxis(doublea,doubleb){laxis=ab?a:b;raxis=ab?a:b;}doublegetlaxis()const{returnlaxis;}//返回半长轴的值doublegetraxis()const{returnraxis;}//返回半短轴的值virtualdoublearea()const{return3.14159*laxis*raxis;}//返回椭圆的面积virtualvoidprintShapeName()const{coutOval:;}virtualvoidprint()const{Point::print();cout;laxis=laxis;raxis=raxis;}};Oval::Oval(doublea,doubleb,intx,inty):Point(x,y){setAxis(a,b);}classCylindroid:publicOval{//Cylindroid类以Oval类为基类private:doubleheight;//椭圆柱的高度public:Cylindroid(doubleh=0.0,doublelaxis=0.0,doubleraxis=0.0,intx=0,inty=0);voidsetHeight(doubleh){height=h0?h:0;}doublegetheight(){returnheight;}virtualdoublearea()const{//该函数运用到求椭圆的周长,椭圆周长的计算运用的是估算公式doublem,n,s;m=1.5*(getlaxis()+getraxis());n=sqrt(getlaxis()*getraxis());s=3.14159*(m-n);return2*Oval::area()+height*s;}virtualdoublevolume()const{//返回椭圆柱的体积returnOval::area()*height;}virtualvoidprintshapename()const{coutcylindroid:;}virtualvoidprint()const{Oval::print();cout;height=height;}};Cylindroid::Cylindroid(doubleh,doublelaxis,doubleraxis,intx,inty):Oval(laxis,raxis,x,y){setHeight(h);}voidvpf(constShape*bptr){//利用基类shape的指针做接口访问派生类bptr-printShapeName();//打印对象所在的类名bptr-print();//打印对象的数据成员cout\narea=bptr-area()\nvolume=bptr-volume()\n\n;//输出对象的面积和体积}voidvrf(constShape&bref){//利用基类shape的引用做接口访问派生类,功能同vpf函数bref.printShapeName();bref.print();cout\narea=bref.area()\nvolume=bref.volume()\n\n;}intmain(){coutsetiosflags(ios::fixed|ios::showpoint)setprecision(2);//设置数据输出格式,保留小数点后两位有效数字Pointpoint(7,11);Ovaloval(5,4,22,8);Cylindroidcylindroid(10,5,4,10,10);Shape*arrayofshapes[3];//定义基类对象的指针数组arrayofshapes[0]=&point;arrayofshapes[1]=&oval;arrayofshapes[2]=&cylindroid;cout------通过基类指针访问虚函数--------endl;for(inti=0;i3;i++)vpf(arrayofshapes[i]);cout------通过基类引用访问虚函数--------endl;for(intj=0;j3;j++)vrf(*arrayofshapes[j]);return0;}四、运行结果实验1:实验2:五、实验心得通过本次实验,我基本掌握二元运算符和一元运算符的重载,理解了面向对象设计中的多态性,并熟悉了类虚函数的在程序设计中的运用。写实验2时,题目给出的例子是例5-10,是错的,我根据题目的意思,感觉是例5-9,就按照例5-9写了。计算椭圆和和椭圆柱时求椭圆的周长,上网查了计算公式。