西安交大C++程序设计第八章作业_第1页
西安交大C++程序设计第八章作业_第2页
西安交大C++程序设计第八章作业_第3页
西安交大C++程序设计第八章作业_第4页
西安交大C++程序设计第八章作业_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西安交通大学实验报告课程_计算机程序设计_实验名称_类与对象_第 1 页 共 47 页系 别_ _ _ 实 验 日 期 2014 年 5 月 17 日专业班级_ _组别_ 实 验 报 告 日 期 2014 年 5 月 18日姓 名_ _学号_ _ 报 告 退 发 ( 订正 、 重做 )同 组 人_ 教 师 审 批 签 字 一、 实验目的掌握构造函数、析构函数的用法、类中数据对象初始化的不同方法。二、实验内容 (一)第一题: 设计并测试一个名为Ellipse的椭圆类,其属性为其圆心坐标及半长轴和半短轴的长度。设计一个构造函数对这些属性进行初始化,并通过成员函数计算椭圆的面积。1.源程序代码:#i

2、ncludeusing namespace std;class Ellipsedouble a,b,x,y,s;public:Ellipse();Ellipse(double,double,double,double);void init(double,double,double,double);void calculate();void print();Ellipse:Ellipse()a=8;b=5;x=3.2;y=9.6;Ellipse:Ellipse(double m,double n,double p,double q)init(m,n,p,q);void Ellipse:calcu

3、late()s=x*y*3.;void Ellipse:print()cout中心坐标为:(x,y)n;cout面积为:sendl;void Ellipse:init(double m,double n,double p,double q)a=m;b=n;x=p;y=q;int main()Ellipse ellipse1,ellipse2(2.5,3.2,4.5,5.4);/依次为a,b,x,y;cout预设的是:a=8;b=5;x=3.2;y=9.6;n;cout输入的是:ellipse1,ellipse2(2.5,3.2,4.5,5,4);n;double x,y,a,b;cout输入之

4、前的值:endlellipse1:n;ellipse1.calculate();ellipse1.print();coutellipse2:n;ellipse2.calculate();ellipse2.print();coutxy;coutab;cout写入后的结果:n;coutellipse2:n;ellipse2.init(a,b,x,y);ellipse2.calculate();ellipse2.print();return 0;2.实验结果:(二)第二题: 仿照Date类设计一个Time类,设计多个重载的构造函数,可以设置时间、进行时间的加减运算,按照可能的格式输出时间。1.源程序

5、代码:#includeusing namespace std;class Timeint hour,minute,second;public:Time();Time(int,int,int);void init(int,int,int);void plus(Time& t);/由此可以引用另一Time类中的成员void minus(Time& t);void print_hms();void print_hsm();void print_mhs();void print_msh();void print_shm();void print_smh();Time:Time(int h,int m,

6、int s)init(h,m,s);Time:Time()hour=12;minute=0;second=0;void Time:init(int h,int m,int s)second=s%60;minute=(m+s/60)%60;hour=(h+m/60)%24;void Time:plus(Time& t)hour=hour+t.hour;minute=minute+t.minute;second=second+t.second;init(hour,minute,second);void Time:minus(Time& t)int sum=(second+60*minute+360

7、0*hour)-(t.second+60*t.minute+t.hour*3600);second=sum%60;minute=(sum/60)%60;hour=(sum/3600)%24;init(hour,minute,second);void Time:print_hms()couthour-minute-secondendl;void Time:print_hsm()couthour-second-minuteendl;void Time:print_mhs()coutminute-hour-secondendl;void Time:print_msh()coutminute-seco

8、nd-hourendl;void Time:print_shm()coutsecond-hour-minuteendl;void Time:print_smh()coutsecond-minute-hourendl;int main()Time time1,time2(12,34,56);int h,m,s,h2,m2,s2;cout初始按照时分秒输出:n;time1.print_hms();time2.print_hms();couthms;time1.init(h,m,s);cout输入时间为:n;cout 时分秒:;time1.print_hms();cout 时秒分:;time1.pr

9、int_hsm();cout 分时秒:;time1.print_mhs();cout 分秒时:;time1.print_msh();cout 秒时分:;time1.print_shm();cout 秒分时:;time1.print_smh();couth2m2s2;time2.init(h2,m2,s2);couti;cout运算结果为:;switch(i)case +:time1.plus(time2);time1.print_hms();break;case -:time1.minus(time2);time1.print_hms();break;default:coutERROR!n;r

10、eturn 0;2.实验结果:(1)输入秒大于60,两时间相加大于24小时:(2)相减,时分秒相互有影响:(3)输入运算类型异常:(3)问题分析:功能:能够以各种形式输出时间;对输入的时间能够进行进位化简处理,即输入超出范围时自动进位,如输入78秒,则能变为18同时分钟数加1;对于加法能够实现24小时循环,即超过24小时时变为(第二天)0小时;对于减法也能够实现时分秒联动。不足之处:不能实现减法的循环。即:如果一个小的时间减去一个大的时间,会输出负数。当然这只是说相减应该到前一天的情况。在一天内是能实现时分秒的变化的。如12:34:56减去8:56:57,则能够输出时间为3:37:59.另外,

11、没有考虑输入小于0的可能。(三)第三题: 创建一个Rational类,执行带分数的算术运算。用两个整数的私有成员分别表示有理数的分子、分母。提供构造函数初始化类,构造函数保证分数已为最简形式。同时也提供无参数的构造函数,默认分子为0,分母为1。提供6个公开的方法:相加、相减、相乘、相除、以a/b的形式显示有理数、以浮点数的形式显示有理数。1.源程序代码: #include#includeusing namespace std;class Rationalint n,d;/n为分子,d为分母public:Rational();/默认初始Rational(int,int);/初始化void ini

12、t(int,int);/赋值函数void simplify();void plus(Rational& ra);/加法void minus(Rational& ra);/减法void multiply(Rational& ra);/乘法int divide(Rational& ra);/除法void print_youli();/有理数输出void print_fudian();/浮点输出;Rational:Rational()/默认初始n=0;d=1;Rational:Rational(int nu,int de)/nu是分子,de是分母init(nu,de);/初始化void Ration

13、al:simplify()/化简函数int i,m;/定义变量i,m,i用来逐个上升至分子分母中较小者逐个判断是否为公约数,m用来记录公约数do/循环m=1;for(i=1;i=fabs(n*1.0)&i1);void Rational:init(int nu,int de)/存入第一个分数n=nu;d=de;simplify();void Rational:plus(Rational& ra)n=n*ra.d+d*ra.n;d=d*ra.d;simplify();void Rational:minus(Rational& ra)n=n*ra.d-d*ra.n;d=d*ra.d;simplif

14、y();void Rational:multiply(Rational& ra)n=n*ra.n;d=d*ra.d;simplify();int Rational:divide(Rational& ra)if(ra.n=0)coutERROR!;return 0;n=n*ra.d;d=d*ra.n;simplify();return 1;void Rational:print_youli()coutn/d;void Rational:print_fudian()coutn*1.0/d;int main()Rational rational1,rational2(1,2);int nu1,de1

15、,nu2,de2;cout初始值:nrational1:n有理数:;rational1.print_youli();cout 浮点型:;rational1.print_fudian();coutnrational2:n有理数:;rational2.print_youli();cout 浮点型:;rational2.print_fudian();coutn输入初始值:n;coutnu1de1;if(de1=0)coutERROR!n;return 0;rational1.init(nu1,de1);coutnu2de2;if(de2=0)coutERROR!n;return 0;rational

16、2.init(nu2,de2);cout输入的是:nrational1:;rational1.print_youli();cout rational2:;rational2.print_youli();couti;switch(i)case +:rational1.plus(rational2);break;case -:rational1.minus(rational2);break;case *:rational1.multiply(rational2);break;case /:if(rational1.divide(rational2)=0)/经验:这里首先执行了simplify操作,

17、故非零时可以输出结果!/判断是否可以进行除法的操作return 0;break;default:coutERROR!n;return 0;cout计算结果为:;rational1.print_youli();cout 即:;rational1.print_fudian();coutendl;return 0;2.实验结果:(1)相加:(2)相减:(3)相乘:(4)相除:(5)化简功能:(6)分母为0: (6)除数为0:(7)运算符异常:(3)问题分析:功能:能够实现化简功能,包括对输入的两个分数及其计算结果;进行加减乘除运算输出结果;判断输入的分数是否合理即分母是否为0;判断除法是否能够进行即

18、除数是否为0;判断运算类型是否合理。收获:从if(rational1.divide(rational2)=0)return 0;break;一句可以看出:if中的语句首先被执行,然后判断返回值是否合理,因此,当结果非0时能够cout。(四)实验题目四:完善PPT汽车类,增加数据成员10个曲目库,增加下列成员函数:构造函数、析构函数、斜线下降运动函数、倒车函数、选播歌曲函数。选播歌曲函数具体要求:先显示所有歌曲名称,用户选1或2或3.,播放序号的歌曲。 1.程序源代码:#include#include#pragma comment(lib,winmm.lib)using namespace st

19、d;class automobilechar type20;/车的类型char color20;/车的颜色float price;/车的价格int carry_weight;/载重量int carry_customer;/载客量char *song_db10;/定义十个歌的名称指针public:/automobile(char *t,char *c,float pri,int cw,int cc)/构造函数,*t为类型;*c为颜色;pri为价格cw为载重;cc为载客set_data(t,c,pri,cw,cc);/set_data为输入以上数据的函数song_db0=C:Once.mp3;so

20、ng_db1=C:一念执着.mp3;song_db2=C:爱的罗曼斯.mp3;song_db3=C:梁祝.mp3;song_db4=C:安妮的仙境.mp3;song_db5=C:谜底.mp3;song_db6=C:如果没有明天.mp3;song_db7=C:纯音乐.mp3;song_db8=C:小夜曲.mp3;song_db9=C:虫儿飞.mp3;automobile()/析构函数coutNow clearing up the data.n;/析构函数void show_song_db()/展示音乐名称/cout可选歌曲如下:n;for(int i=0;i10;i+)/逐个展示couti:so

21、ng_dbiendl;void set_data(char *t,char *c,float pri,int cw,int cc);/输入信息void movecar(int k);/车水平移动void moveback();/倒车void horming(int num);/发声void downcar();/下降void movedowncar();/斜运动void chosemusic(int i);/选歌void play_mp3(int i);/放音乐char *show_type()return type;/显示类型;void automobile:set_data(char *t

22、,char *c,float pri,int cw,int cc)/输入信息/strcpy(type,t);/strcpy(color,c);/price=pri;/carry_weight=cw;/carry_customer=cc;/void automobile:movecar(int k)/coutntype水平直线运动:endl;/for(int i=0;i60;i+)/cout o_o;/Sleep(300/k);/coutbbb;/void automobile:moveback()coutntype倒车:endl;cout ;int i;for(i=0;i60;i+)/cout

23、o_o ;/Sleep(100);/coutbbbbbbb;/void automobile:downcar()/垂直下降运动coutntype垂直下降运动:endl;/for(int i=0;i10;i+)/couto_o;/Sleep(100);/coutbbb ;/coutendl;/void automobile:movedowncar()/斜下降couttype斜下降运动:n;for(int i=0;i30;i+)cout ;for(int j=0;ji;j+)coutbb;couto_o ;Sleep(100);coutbbbbbb n;void automobile:hormin

24、g(int num)/for(int i=0;inum;i+)/couttypeendl;/cout007di.endl;/Sleep(1000);/void automobile:play_mp3(int i)/char *pstr=song_dbi; char str100=play ;/play后有空格strcat(str,pstr);/couta; /输入任何字符结束播放/int main()/automobile changan(changan,red,4,4,4);/changan.show_song_db();/automobile nison(ford,blue,4,4,4);

25、/nison.set_data(dazhong,white,5,3); /测试设置初始数据函数nison.horming(5); /测试鸣笛函数nison.movecar(3); /测试水平直线运动nison.moveback();nison.movedowncar();nison.downcar();/测试垂直下降运动int i;couti;while(i9)couti;nison.play_mp3(i); /测试播放mp3歌曲函数return 0;/2实验结果:显示可选曲目:水平运动、倒车:斜向下运动:垂直下降:选择曲目、播放、按任意键结束播放、析构函数执行:输入曲目序号有误:(3)问题分

26、析:功能:展示曲目;水平、倒车、斜向下、竖直运动;选歌:如果所输入不在范围内则重新输入。不足:本来想做一个能够自动播放下一首歌曲的程序,但没能做到,如果不输入则程序不会终止。五、第五题:设计定义圆管类,成员函数至少应有构造函数、计算容积函数、计算总体积函数、计算重量函数、计算表面积函数、输出函数和析构函数,并编写主函数加以测试。1.源程序代码:#includeusing namespace std;class tubedouble r1,r2,h,p;/r1为内径,r2为外径,h为长度,p为密度public:tube()/构造函数r1=12;r2=15;h=100;p=5;tube()cout

27、Now clearing up data.n;void init(double,double,double,double);void rongji();/容积void surface();/表面积void weight();/重量void volume();/体积void print();/输出;void tube:init(double a,double b,double c,double d)r1=a;r2=b;h=c;p=d;void tube:rongji()double s=3.14*r1*r1*h;couts;void tube:volume()double s=3.14*r2*r

28、2*h;couts;void tube:surface()double s=2*3.14*(r1+r2)*h;couts;void tube:weight()double s=p*3.14*(r2*r2-r1*r1)*h;couts;void tube:print()cout内径:r1 外径:r2 高:h 密度:pendl;int main()tube tube;cout初始值为:n;tube.print();double a,b,c,d;coutabcd;while(a=b|a=0|b=0|c=0|d=0)coutabcd;tube.init(a,b,c,d);cout输入的是:n;tube

29、.print();cout体积为:;tube.volume();coutn容积为:;tube.rongji();coutn表面积为:;tube.surface();coutn重量为:;tube.weight();coutendl;return 0;2.实验结果:(1)内径不可以大于等于外径:(2)任意参数不能为负数或0:(3)问题分析:关于体积的定义不会很清楚,在此按照整个管外径所占体积来算,而不是外减内。六、第六题:在上周实验定义二元一次方程组类中,增加构造函数、相加函数、相减函数,仍然保持原来求根函数、输出该二元一次方程组函数,并编写主函数测试各成员函数。提示:两个二元一次方程组对应相加和

30、对应相减仍然是一个二元一次方程组,相加函数原型如下:fun add ( fun F1 ) fun是你定义的二元一次方程组类,F1是方程组类的对象,函数体中将本类中的6个系数与F1中6个系数相加,再赋值给本类中6个系数,形成新的二元一次方程组。1.源程序代码:#includeusing namespace std;class equation/定义方程类double a,b,c,d,e,f;double x,y;public:equation()a=1;b=1;c=1;d=1;e=2;f=3;void Register(double A,double B,double C,double D,do

31、uble E,double F);/输入函数void plus(equation& eq);void minus(equation& eq);int examine();/检验函数,检查系数是否能够确定唯一解void result();/计算函数void print();/输出函数;void equation:Register(double A,double B,double C,double D,double E,double F)a=A;b=B;c=C;d=D;e=E;f=F;void equation:plus(equation& eq)a=a+eq.a;b=b+eq.b;c=c+eq.

32、c;d=d+eq.d;e=e+eq.e;f=f+eq.f;void equation:minus(equation& eq)a=a-eq.a;b=b-eq.b;c=c-eq.c;d=d-eq.d;e=e-eq.e;f=f-eq.f;int equation:examine()if(a*e-b*d=0)return 0;return 1;void equation:result()x=(c*e-b*f)/(a*e-b*d);y=(a*f-c*d)/(a*e-b*d);void equation:print()coutx=x,y=yendl;int main()double A1,B1,C1,D1

33、,E1,F1,A2,B2,C2,D2,E2,F2;equation equation1,equation2;coutA1B1C1D1E1F1;equation1.Register(A1,B1,C1,D1,E1,F1);while(equation1.examine()=0)/若系数不符合要求,提示重新输入coutA1B1C1D1E1F1;equation1.Register(A1,B1,C1,D1,E1,F1);equation1.result();cout结果:n;equation1.print();coutA2B2C2D2E2F2;equation2.Register(A2,B2,C2,D

34、2,E2,F2);while(equation2.examine()=0)/若系数不符合要求,提示重新输入coutA2B2C2D2E2F2;equation2.Register(A2,B2,C2,D2,E2,F2);char i;couti;switch(i)case +: equation1.plus(equation2); break;case -:equation1.minus(equation2);break;default:coutERROR!n;return 0;break;while(equation1.examine()=0)coutERROR!n;return 0;equat

35、ion1.result();equation1.print();return 0;2.实验结果:(1)输入的方程系数不合理(无法确定唯一解):(2)方程相加减之后不合理:(3)运算符不合理:3.问题分析:功能:判断输入的方程是否有唯一解;判断运算后的方程是否有唯一解;输出计算结果。不足:由于嫌麻烦,没有设计判断到底是有无穷解还是无解的程序。七、第七题:设计定义机器人类,数据成员:姓名,年龄,一个整数,5个汉字的数组;函数成员:构造函数,析构函数,整数翻译函数,写汉字函数,判整数类别函数。整数翻译函数指给定任意整数,输出英文念法,例如:参数是245,英文输出two hundred forty f

36、ive。写汉字函数指给定一个汉字,屏幕输出这个汉字,如汉字“曲”,该机器人至少会写5个汉字。判整数类别函数指给定某个整数,输出是奇偶数、素数、递增数、回文数。1.源程序代码:#includeusing namespace std;void tra(int n);/翻译函数int huiwen(int n);/回文数判断函数int sushu(int a);/素数判断函数int dizeng(int n);/递增数判断函数class robot/定义类char name20;int age;int num;char *word5;public:robot()/构造函数strcpy(name,RO

37、BOT);age=4;num=100;word0=交;word1=大;word2=电;word3=脑;word4=城;robot(char *na,int a,int n);robot()/析构函数coutNow cleaning up the data.n;void init(char *na,int a,int n);/输入void print()coutname:nametage:agetnumber:numendl;void translate();/翻译void write(char *m);/写汉字void judge();/判整数类别函数;robot:robot(char *na

38、,int a,int n)init(na,a,n);void robot:init(char *na,int a,int n)strcpy(name,na);age=a;num=n;void robot:translate()tra(num);void robot:write(char *m)int t=0;for(int i=0;i5;i+)if(strcmp(m,wordi)=0)coutwordi;t+;if(t=0)coutSorry,Im too foolish to write it.n;void robot:judge()cout该数是:;if(sushu(num)=1)cout

39、素数. ;if(huiwen(num)=1)cout回文数.;if(dizeng(num)=1)cout递增数.;if(num/2=num/2.0)cout偶数;elsecout奇数;coutn;int main()robot Robot1,Robot2(csj,4,);cout未输入时:nRobot1:;Robot1.print();Robot1.translate();cout判断结果: ;Robot1.judge();coutRobot2:;Robot2.print();Robot2.translate();char x20;char y10;int a,b;coutx;cinab;Ro

40、bot1.init(x,a,b);Robot1.print();Robot1.judge();Robot1.translate();couty;Robot1.write(y);coutendl;return 0;/翻译:void tra(int n)if(n=0)/对于输入,输出zerocout=1;m+)/求得所输入数n的位数mx=x/10;int a=m/3,b=m%3;int *num=new int3*(a+1);int j;for(j=0,x=n;j=0;i-)/由高位到低位,每三位一循环if(num3*i+20)/3i+2位cout*(u+num3*i+2-1) hundred ;if(num3*i+1=1)/3i+1位为时,根据i位输出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论