西安交大C++程序设计第八章作业.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流西安交大C+程序设计第八章作业.精品文档.西安交通大学实验报告课程_计算机程序设计_实验名称_类与对象_第 1 页 共 47 页系 别_ _ _ 实 验 日 期 2014 年 5 月 17 日专业班级_ _组别_ 实 验 报 告 日 期 2014 年 5 月 18日姓 名_ _学号_ _ 报 告 退 发 ( 订正 、 重做 )同 组 人_ 教 师 审 批 签 字一、 实验目的掌握构造函数、析构函数的用法、类中数据对象初始化的不同方法。二、实验内容 (一)第一题: 设计并测试一个名为Ellipse的椭圆类,其属性为其圆心坐标及半长轴和半短轴的长度。设计一个构造函数对这些属性进行初始化,并通过成员函数计算椭圆的面积。1.源程序代码:#include<iostream>using 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:calculate()s=x*y*3.1415926;void Ellipse:print()cout<<"中心坐标为:("<<x<<","<<y<<")n"cout<<"面积为:"<<s<<endl;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<<"输入之前的值:"<<endl<<"ellipse1:n"ellipse1.calculate();ellipse1.print();cout<<"ellipse2:n"ellipse2.calculate();ellipse2.print();cout<<"请输入中心坐标:"cin>>x>>y;cout<<"请输入半长短轴:"cin>>a>>b;cout<<"写入后的结果:n"cout<<"ellipse2:n"ellipse2.init(a,b,x,y);ellipse2.calculate();ellipse2.print();return 0;2.实验结果:(二)第二题: 仿照Date类设计一个Time类,设计多个重载的构造函数,可以设置时间、进行时间的加减运算,按照可能的格式输出时间。1.源程序代码:#include<iostream>using 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,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+3600*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()cout<<hour<<"-"<<minute<<"-"<<second<<endl;void Time:print_hsm()cout<<hour<<"-"<<second<<"-"<<minute<<endl;void Time:print_mhs()cout<<minute<<"-"<<hour<<"-"<<second<<endl;void Time:print_msh()cout<<minute<<"-"<<second<<"-"<<hour<<endl;void Time:print_shm()cout<<second<<"-"<<hour<<"-"<<minute<<endl;void Time:print_smh()cout<<second<<"-"<<minute<<"-"<<hour<<endl;int main()Time time1,time2(12,34,56);int h,m,s,h2,m2,s2;cout<<"初始按照时分秒输出:n"time1.print_hms();time2.print_hms();cout<<"请输入时间(时、分、秒):n"cin>>h>>m>>s;time1.init(h,m,s);cout<<"输入时间为:n"cout<<" 时分秒:"time1.print_hms();cout<<" 时秒分:"time1.print_hsm();cout<<" 分时秒:"time1.print_mhs();cout<<" 分秒时:"time1.print_msh();cout<<" 秒时分:"time1.print_shm();cout<<" 秒分时:"time1.print_smh();cout<<"请输入第二个时间:"cin>>h2>>m2>>s2;time2.init(h2,m2,s2);cout<<"请选择运算类型:"char i;cin>>i;cout<<"运算结果为:"switch(i)case '+':time1.plus(time2);time1.print_hms();break;case '-':time1.minus(time2);time1.print_hms();break;default:cout<<"ERROR!n"return 0;2.实验结果:(1)输入秒大于60,两时间相加大于24小时:(2)相减,时分秒相互有影响:(3)输入运算类型异常:(3)问题分析:功能:能够以各种形式输出时间;对输入的时间能够进行进位化简处理,即输入超出范围时自动进位,如输入78秒,则能变为18同时分钟数加1;对于加法能够实现24小时循环,即超过24小时时变为(第二天)0小时;对于减法也能够实现时分秒联动。不足之处:不能实现减法的循环。即:如果一个小的时间减去一个大的时间,会输出负数。当然这只是说相减应该到前一天的情况。在一天内是能实现时分秒的变化的。如12:34:56减去8:56:57,则能够输出时间为3:37:59.另外,没有考虑输入小于0的可能。(三)第三题: 创建一个Rational类,执行带分数的算术运算。用两个整数的私有成员分别表示有理数的分子、分母。提供构造函数初始化类,构造函数保证分数已为最简形式。同时也提供无参数的构造函数,默认分子为0,分母为1。提供6个公开的方法:相加、相减、相乘、相除、以a/b的形式显示有理数、以浮点数的形式显示有理数。1.源程序代码: #include<iostream>#include<cmath>using namespace std;class Rationalint n,d;/n为分子,d为分母public:Rational();/默认初始Rational(int,int);/初始化void init(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 Rational:simplify()/化简函数int i,m;/定义变量i,m,i用来逐个上升至分子分母中较小者逐个判断是否为公约数,m用来记录公约数do/循环m=1;for(i=1;i<=fabs(n*1.0)&&i<=fabs(d*1.0);i+)if(n%i=0&&d%i=0)m=i;n=n/m;d=d/m;while(m>1);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;simplify();void Rational:multiply(Rational& ra)n=n*ra.n;d=d*ra.d;simplify();int Rational:divide(Rational& ra)if(ra.n=0)cout<<"ERROR!"return 0;n=n*ra.d;d=d*ra.n;simplify();return 1;void Rational:print_youli()cout<<n<<"/"<<d;void Rational:print_fudian()cout<<n*1.0/d;int main()Rational rational1,rational2(1,2);int nu1,de1,nu2,de2;cout<<"初始值:nrational1:n有理数:"rational1.print_youli();cout<<" 浮点型:"rational1.print_fudian();cout<<"nrational2:n有理数:"rational2.print_youli();cout<<" 浮点型:"rational2.print_fudian();cout<<"n输入初始值:n"cout<<"rational1:"cin>>nu1>>de1;if(de1=0)cout<<"ERROR!n"return 0;rational1.init(nu1,de1);cout<<"rational2:"cin>>nu2>>de2;if(de2=0)cout<<"ERROR!n"return 0;rational2.init(nu2,de2);cout<<"输入的是:nrational1:"rational1.print_youli();cout<<" rational2:"rational2.print_youli();cout<<"n请选择要对之进行的运算类型:"char i;cin>>i;switch(i)case '+':rational1.plus(rational2);break;case '-':rational1.minus(rational2);break;case '*':rational1.multiply(rational2);break;case '/':if(rational1.divide(rational2)=0)/经验:这里首先执行了simplify操作,故非零时可以输出结果!/判断是否可以进行除法的操作return 0;break;default:cout<<"ERROR!n"return 0;cout<<"计算结果为:"rational1.print_youli();cout<<" 即:"rational1.print_fudian();cout<<endl;return 0;2.实验结果:(1)相加:(2)相减:(3)相乘:(4)相除:(5)化简功能:(6)分母为0: (6)除数为0:(7)运算符异常:(3)问题分析:功能:能够实现化简功能,包括对输入的两个分数及其计算结果;进行加减乘除运算输出结果;判断输入的分数是否合理即分母是否为0;判断除法是否能够进行即除数是否为0;判断运算类型是否合理。收获:从if(rational1.divide(rational2)=0)return 0;break;一句可以看出:if中的语句首先被执行,然后判断返回值是否合理,因此,当结果非0时能够cout。(四)实验题目四:完善PPT汽车类,增加数据成员10个曲目库,增加下列成员函数:构造函数、析构函数、斜线下降运动函数、倒车函数、选播歌曲函数。选播歌曲函数具体要求:先显示所有歌曲名称,用户选1或2或3.,播放序号的歌曲。 1.程序源代码:#include<iostream>#include<windows.h>#pragma comment(lib,"winmm.lib")using namespace std;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"song_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()/析构函数cout<<"Now clearing up the data.n"/析构函数void show_song_db()/展示音乐名称cout<<"可选歌曲如下:n"for(int i=0;i<10;i+)/逐个展示cout<<i<<":"<<song_dbi<<endl;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,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)/cout<<"n"<<type<<"水平直线运动:"<<endl;/for(int i=0;i<60;i+)/cout<<" "<<"o_o"/Sleep(300/k);/cout<<"bbb"/void automobile:moveback()cout<<"n"<<type<<"倒车:"<<endl;cout<<" "int i;for(i=0;i<60;i+)/cout<<"o_o"<<" "/Sleep(100);/cout<<"bbbbbbb"/void automobile:downcar()/垂直下降运动cout<<"n"<<type<<"垂直下降运动:"<<endl;/for(int i=0;i<10;i+)/cout<<"o_o"/Sleep(100);/cout<<"bbb"<<" "/cout<<endl;/void automobile:movedowncar()/斜下降cout<<type<<"斜下降运动:n"for(int i=0;i<30;i+)cout<<" "for(int j=0;j<i;j+)cout<<"bb"cout<<"o_o"<<" "Sleep(100);cout<<"bbbbbb"<<" n"void automobile:horming(int num)/for(int i=0;i<num;i+)/cout<<type<<endl;/cout<<'007'<<"di."<<endl;/Sleep(1000);/void automobile:play_mp3(int i)/char *pstr=song_dbi; char str100="play "/play后有空格strcat(str,pstr);/cout<<str;/mciSendStringA(str,NULL,0,NULL);/Windows API VC2008调用此函数/mciSendString(str,NULL,0,NULL);/Windows API VC6.0调用此函数char a;/cin>>a; /输入任何字符结束播放int main()/automobile changan("changan","red",4,4,4);/changan.show_song_db();/automobile nison("ford","blue",4,4,4);/nison.set_data("dazhong","white",200000,5,3); /测试设置初始数据函数nison.horming(5); /测试鸣笛函数nison.movecar(3); /测试水平直线运动nison.moveback();nison.movedowncar();nison.downcar();/测试垂直下降运动int i;cout<<"请选择:"cin>>i;while(i<0|i>9)cout<<"ERROR!input again!"cin>>i;nison.play_mp3(i); /测试播放mp3歌曲函数return 0;/2实验结果:显示可选曲目:水平运动、倒车:斜向下运动:垂直下降:选择曲目、播放、按任意键结束播放、析构函数执行:输入曲目序号有误:(3)问题分析:功能:展示曲目;水平、倒车、斜向下、竖直运动;选歌:如果所输入不在范围内则重新输入。不足:本来想做一个能够自动播放下一首歌曲的程序,但没能做到,如果不输入则程序不会终止。五、第五题:设计定义圆管类,成员函数至少应有构造函数、计算容积函数、计算总体积函数、计算重量函数、计算表面积函数、输出函数和析构函数,并编写主函数加以测试。1.源程序代码:#include<iostream>using namespace std;class tubedouble r1,r2,h,p;/r1为内径,r2为外径,h为长度,p为密度public:tube()/构造函数r1=12;r2=15;h=100;p=5;tube()cout<<"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;cout<<s;void tube:volume()double s=3.14*r2*r2*h;cout<<s;void tube:surface()double s=2*3.14*(r1+r2)*h;cout<<s;void tube:weight()double s=p*3.14*(r2*r2-r1*r1)*h;cout<<s;void tube:print()cout<<"内径:"<<r1<<" 外径:"<<r2<<" 高:"<<h<<" 密度:"<<p<<endl;int main()tube tube;cout<<"初始值为:n"tube.print();double a,b,c,d;cout<<"请输入圆管的内径、外径、高度、密度:n"cin>>a>>b>>c>>d;while(a>=b|a<=0|b<=0|c<=0|d<=0)cout<<"ERROR!Input again:"cin>>a>>b>>c>>d;tube.init(a,b,c,d);cout<<"输入的是:n"tube.print();cout<<"体积为:"tube.volume();cout<<"n容积为:"tube.rongji();cout<<"n表面积为:"tube.surface();cout<<"n重量为:"tube.weight();cout<<endl;return 0;2.实验结果:(1)内径不可以大于等于外径:(2)任意参数不能为负数或0:(3)问题分析:关于体积的定义不会很清楚,在此按照整个管外径所占体积来算,而不是外减内。六、第六题:在上周实验定义二元一次方程组类中,增加构造函数、相加函数、相减函数,仍然保持原来求根函数、输出该二元一次方程组函数,并编写主函数测试各成员函数。提示:两个二元一次方程组对应相加和对应相减仍然是一个二元一次方程组,相加函数原型如下: fun add ( fun F1 ) fun是你定义的二元一次方程组类,F1是方程组类的对象,函数体中将本类中的6个系数与F1中6个系数相加,再赋值给本类中6个系数,形成新的二元一次方程组。1.源程序代码:#include<iostream>using 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,double 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.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()cout<<"x="<<x<<",y="<<y<<endl;int main()double A1,B1,C1,D1,E1,F1,A2,B2,C2,D2,E2,F2;equation equation1,equation2;cout<<"请输入第一个方程的系数A1,B1,C1,D1,E1,F1:n"cin>>A1>>B1>>C1>>D1>>E1>>F1;equation1.Register(A1,B1,C1,D1,E1,F1);while(equation1.examine()=0)/若系数不符合要求,提示重新输入cout<<"输入错误,请重新输入:n"cin>>A1>>B1>>C1>>D1>>E1>>F1;equation1.Register(A1,B1,C1,D1,E1,F1);equation1.result();cout<<"结果:n"equation1.print();cout<<"请输入第二个方程的系数A2,B2,C2,D2,E2,F2:n"cin>>A2>>B2>>C2>>D2>>E2>>F2;equation2.Register(A2,B2,C2,D2,E2,F2);while(equation2.examine()=0)/若系数不符合要求,提示重新输入cout<<"输入错误,请重新输入:n"cin>>A2>>B2>>C2>>D2>>E2>>F2;equation2.Register(A2,B2,C2,D2,E2,F2);char i;cout<<"选择运算类型:"cin>>i;switch(i)case '+': equation1.plus(equation2); break;case '-':equation1.minus(equation2);break;default:cout<<"ERROR!n"return 0;break;while(equation1.examine()=0)cout<<"ERROR!n"return 0;equation1.result();equation1.print();return 0;2.实验结果:(1)输入的方程系数不合理(无法确定唯一解):(2)方程相加减之后不合理:(3)运算符不合理:3.问题分析:功能:判断输入的方程是否有唯一解;判断运算后的方程是否有唯一解;输出计算结果。不足:由于嫌麻烦,没有设计判断到底是有无穷解还是无解的程序。七、第七题:设计定义机器人类,数据成员:姓名,年龄,一个整数,5个汉字的数组;函数成员:构造函数,析构函数,整数翻译函数,写汉字函数,判整数类别函数。整数翻译函数指给定任意整数,输出英文念法,例如:参数是245,英文输出two hundred forty five。写汉字函数指给定一个汉字,屏幕输出这个汉字,如汉字“曲”,该机器人至少会写5个汉字。判整数类别函数指给定某个整数,输出是奇偶数、素数、递增数、回文数。1.源程序代码:#include<iostream>using 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,"ROBOT");age=4;num=100;word0="交"word1="大"word2="电"word3="脑"word4="城"robot(char *na,int a,int n);robot()/析构函数cout<<"Now cleaning up the data.n"void init(char *na,int a,int n);/输入void print()cout<<"name:"<<name<<"tage:"<<age<<"tnumber:"<<num<<endl;void translate();/翻译void write(char *m);/写汉字void judge(