C++实验4.docx
- 文档编号:28630566
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:20
- 大小:65.38KB
C++实验4.docx
《C++实验4.docx》由会员分享,可在线阅读,更多相关《C++实验4.docx(20页珍藏版)》请在冰豆网上搜索。
C++实验4
《C++面向对象程序设计》实验报告
实验序号:
4 实验项目名称:
多态性
学 号
姓 名
专业
实验地点
指导教师
吴芸
实验时间
2013-5-16
一、实验目的及要求
(1)了解多态性的概念;
(2)掌握运算符重载的基本方法;
(3)掌握虚函数的定义和使用方法;
(4)掌握纯虚函数和抽象类的概念和用法
二、实验设备(环境)及要求
MicorsoftVisualC++6.0
三、实验内容与步骤(题目、算法和结果描述)
1、分析并调试下列程序,写出程序的输出结果,并解释输出结果。
#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(intx) {cout<<"D: : f2(int)"<<2*x< voidf3(doublex) {cout<<"D: : f3(double)"< }; intmain() {Dd; B*pb=&d; D*pd=&d; pb->f1(1.23); pd->f1(1.23); pb->f2(1.23); pb->f3(1.23); pd->f3(3.14); return0; } 【运行结果截图】: 【运行结果分析】: 函数f1()被定义为虚函数,所以执行pb->f1(1.23)语句时,程序根据指针pb所指向的的实际对象,调用该对象的成员函数。 而f2()和f3()只是普通的成员函数,不管pb指向哪个对象,程序pb->f2(1.23)和pb->f3(1.23)调用的都是基类中定义的的函数。 2、编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。 【要求】: 将小时范围限制在大于等于0,分钟范围限制在0~59分,秒钟范围限制在0~59秒。 【提示】: 时间类Time的参考框架如下: classTime{ public: Time(inth=0,intm=0,ints=0); Timeoperator+(Time&); voiddisptime(string); private: inthourse; intminuters; intseconds; }; 【运行结果截图】: 3、给出下面的抽象基类container。 classcontainer{ protected: doubleradius; public: container(doubleradius); virtualdoublesurface_area()=0; virtualdoublevolume()=0; }; 建立3个继承container的派生类cube、sphere与cylinder,让每一个派生类都包含虚函数surface_area()和volume(),分别用来计算正方体、球体和圆柱体的表面积及体积。 【要求】: 写出主程序,用于C++的多态性,分别计算边长为6.0的正方体、半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。 【运行结果截图】: 4、编写程序,用于进行集合的并、差和交运算。 例如输入整数集合{954367}和{2469},计算出它们进行集合的并、差和交运算后的结果。 1)可以用以下表达式实现整数集合的运算: s1+s2两个整数集合的并运算 s1-s2两个整数集合的差运算 s1*s2两个整数集合的交运算 【Set类的框架】: classSet { public: voidinput(int); intlength(); voiddisp(); Setoperator+(Sets1); Setoperator-(Sets1); Setoperator*(Sets1); private: intlen; ints[MAX]; intm[MAX]; }; voidSet: : input(intd)//输入数组长度的函数 { inti; len=d; cout<<"输入集合元素"< "; for(i=0;i cin>>s[i]; s[i]='\0'; } intSet: : length()//求数组长度的函数 { inti=0; while(m[i]! ='\0') i++; returni; } voidSet: : disp()//输出最后结果的函数 { inti; intk=length(); for(i=0;i cout< cout< } SetSet: : operator+(Sets1)//并运算 { inti,j; intt=s1.len;//防止s1.len的值在下面的运算中被改变 intk=len;//防止len的值在下面的运算中被改变 for(i=0;i m[i]=s[i]; for(i=0;i s1.m[i]=s1.s[i]; for(i=0;i for(j=0;j if(m[i]==s1.m[j]) { for(;j s1.m[j]=s1.m[j+1]; t--; } for(j=0;j { m[k]=s1.m[j]; k++; } m[k]='\0';//用于判断数组长度 return*this; } SetSet: : operator-(Sets1)//差运算 { inti,j; intk=len;//防止len的值在下面的运算中被改变 intt=s1.len;//防止s1.len的值在下面的运算中被改变 for(i=0;i m[i]=s[i]; for(i=0;i s1.m[i]=s1.s[i]; for(i=0;i for(j=0;j if(s1.m[i]==m[j]) { for(;j m[j]=m[j+1]; k--; } m[k]='\0';//用于判断数组长度 return*this; } SetSet: : operator*(Sets1)//并运算 { inti,j; inta[MAX],k=0; for(i=0;i m[i]=s[i]; for(i=0;i s1.m[i]=s1.s[i]; for(i=0;i for(j=0;j if(m[i]==s1.m[j]) { a[k]=m[i]; k++; } for(i=0;i m[i]=a[i]; m[k]='\0';//用于判断数组长度 return*this; } 【运行结果截图】: 四、分析与讨论(记录实验过程中出现的主要问题和心得体会) 五、教师评语 签名: 日期: 成绩 附: 程序源代码 1、 #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(intx) {cout<<"D: : f2(int)"<<2*x< voidf3(doublex) {cout<<"D: : f3(double)"< }; intmain() {Dd; B*pb=&d; D*pd=&d; pb->f1(1.23); pd->f1(1.23); pb->f2(1.23); pb->f3(1.23); pd->f3(3.14); return0; } 2、 #include #include usingnamespacestd; classTime { public: Time(inth=0,intm=0,ints=0); Timeoperator+(Time&); voiddisptime(string); private: inthourse; intminuters; intseconds; }; Time: : Time(inth,intm,ints) { hourse=h; minuters=m; seconds=s; } TimeTime: : operator+(Time&a) { Timetemp; temp.seconds=(seconds+a.seconds)%60; temp.minuters=(minuters+a.minuters+(seconds+a.seconds)/60)%60; temp.hourse=hourse+a.hourse+(minuters+a.minuters+(seconds+a.seconds)/60)/60; returntemp; } voidTime: : disptime(stringstr) { cout< cout< } voidinput(int&h,int&m,int&s)//引用 { cout<<"输入时间: "; cin>>h>>m>>s; while(m<0||m>59||s<0||s>59) { cout<<"******输入时间有误! 请重新输入! ******"< cout<<"输入时间: "; cin>>h>>m>>s; } } intmain() { inth1,m1,s1,h2,m2,s2; input(h1,m1,s1); input(h2,m2,s2); TimeA(h1,m1,s1),B(h2,m2,s2),C; C=A.operator+(B); C.disptime("时间相加后的结果为: "); return0; } 3、 #include usingnamespacestd; constdoublepi=3.1416; classcontainer { protected: doubleradius; public: container(double); virtualdoublesurface_area()=0; virtualdoublevolume()=0; }; container: : container(doubler) { radius=r; } classcube: publiccontainer { public: cube(double); doublesurface_area(); doublevolume(); }; cube: : cube(doubler): container(r) { } doublecube: : surface_area() { cout<<"正方体的表面积为: "<<6*radius*radius< return0.0; } doublecube: : volume() { cout<<"正方体的体积为: "< return0.0; } classsphere: publiccontainer { public: sphere(double); doublesurface_area(); doublevolume(); }; sphere: : sphere(doubler): container(r) { } doublesphere: : surface_area() { cout<<"球体的表面积为: "<<4*pi*radius*radius< return0.0; } doublesphere: : volume() { cout<<"球体的体积为: "<<(4*pi*radius*radius*radius)/3< return0.0; } classcylinder: publiccontainer { public: cylinder(double,double); doublesurface_area(); doublevolume(); protected: doublehigh; }; cylinder: : cylinder(doubler,doubleh): container(r) { high=h; } doublecylinder: : surface_area() { cout<<"圆柱体的表面积为: "<<2*pi*radius*radius+2*pi*radius*high< return0.0; } doublecylinder: : volume() { cout<<"圆柱体的体积为: "< return0.0; } intmain() { container*ptr; cubeob1(6.0); sphereob2(5.0); cylinderob3(5.0,6.0); ptr=&ob1; ptr->surface_area(); ptr->volume(); ptr=&ob2; ptr->surface_area(); ptr->volume(); ptr=&ob3; ptr->surface_area(); ptr->volume(); return0; } 4、 #include usingnamespacestd; constintMAX=100; classSet { public: voidinput(int); intlength(); voiddisp(); Setoperator+(Sets1); Setoperator-(Sets1); Setoperator*(Sets1); private: intlen; ints[MAX]; intm[MAX]; }; voidSet: : input(intd)//输入数组长度的函数 { inti; len=d; cout<<"输入集合元素"< "; for(i=0;i cin>>s[i]; s[i]='\0'; } intSet: : length()//求数组长度的函数 { inti=0; while(m[i]! ='\0') i++; returni; } voidSet: : disp()//输出最后结果的函数 { inti; intk=length(); for(i=0;i cout< cout< } SetSet: : operator+(Sets1)//并运算 { inti,j; intt=s1.len;//防止s1.len的值在下面的运算中被改变 intk=len;//防止len的值在下面的运算中被改变 for(i=0;i m[i]=s[i]; for(i=0;i s1.m[i]=s1.s[i]; for(i=0;i for(j=0;j if(m[i]==s1.m[j]) { for(;j s1.m[j]=s1.m[j+1]; t--; } for(j=0;j { m[k]=s1.m[j]; k++; } m[k]='\0';//用于判断数组长度 return*this; } SetSet: : operator-(Sets1)//差运算 { inti,j; intk=len;//防止len的值在下面的运算中被改变 intt=s1.len;//防止s1.len的值在下面的运算中被改变 for(i=0;i m[i]=s[i]; for(i=0;i s1.m[i]=s1.s[i]; for(i=0;i for(j=0;j if(s1.m[i]==m[j]) { for(;j m[j]=m[j+1]; k--; } m[k]='\0';//用于判断数组长度 return*this; } SetSet: : operator*(Sets1)//并运算 { inti,j; inta[MAX],k=0; for(i=0;i m[i]=s[i]; for(i=0;i s1.m[i]=s1.s[i]; for(i=0;i for(j=0;j if(m[i]==s1.m[j]) { a[k]=m[i]; k++; } for(i=0;i m[i]=a[i]; m[k]='\0';//用于判断数组长度 return*this; } intmain() { intn; SetA,B,C; cout<<"建立含有几个元素的A集合: "; cin>>n; A.input(n); cout<<"建立含有几个元素的B集合: "; cin>>n; B.input(n); C=A+B; cout<<"A+B为: "; C.disp(); C=A-B; cout<<"A-B为: "; C.disp(); C=A*B; cout<<"A*B为: "; C.disp(); return0; } 5、 6、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实验