西安交大C++程序设计第九章作业.docx
- 文档编号:27663902
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:25
- 大小:193.88KB
西安交大C++程序设计第九章作业.docx
《西安交大C++程序设计第九章作业.docx》由会员分享,可在线阅读,更多相关《西安交大C++程序设计第九章作业.docx(25页珍藏版)》请在冰豆网上搜索。
西安交大C++程序设计第九章作业
西安交通大学实验报告
课程__计算机程序设计__实验名称__继承__第1页共页
系别__________实验日期2014年5月日
专业班级_____组别_____________实验报告日期2014年月日
姓名_________学号__报告退发(订正、重做)
同组人_________________________________教师审批签字
一、实验目的
熟练继承的用法,进一步训练类的编程,并练习不同继承方式下对基类的成员的访问的控制。
二、实验内容
(一)第一题:
从类Person中派生出一个教师类,新增的属性有:
专业、职称和主讲课程(一门),并为这些属性定义相应的方法。
1.源程序代码:
#include
usingnamespacestd;
classPerson
{
protected:
char*Name;
charSex;
intAge;
public:
Person()
{
Name="csj";
Sex='M';
Age=18;
}
Person(char*name,charsex,intage)
{
Register(name,sex,age);
}
~Person()
{
delete[]Name;
}
voidRegister(char*name,charsex,intage)
{
intm=strlen(name);
Name=newchar[m+1];
strcpy(Name,name);
Sex=sex;;
Age=age;
}
voidprint()
{
cout<<"姓名:
"< "< "< } }; classTeacher: publicPerson { protected: char*zhuanye; char*zhicheng; char*course; public: Teacher(); Teacher(char*,char,int,char*,char*,char*); voidRegister(char*,char,int,char*,char*,char*); ~Teacher(); voidprint(); }; Teacher: : Teacher() { Person: : Register("罗先觉",'M',61); strcpy(zhuanye,"电气工程及其自动化"); strcpy(zhicheng,"教授"); strcpy(course,"电路"); } Teacher: : Teacher(char*name,charsex,intage,char*zy,char*zc,char*cor) { Register(name,sex,age,zy,zc,cor); } voidTeacher: : Register(char*name,charsex,intage,char*zy,char*zc,char*cor) { Person: : Register(name,sex,age); zhuanye=newchar[strlen(zy)+1]; strcpy(zhuanye,zy); zhicheng=newchar[strlen(zc)+1]; strcpy(zhicheng,zc); course=newchar[strlen(cor)+1]; strcpy(course,cor); } Teacher: : ~Teacher() { delete[]zhuanye; delete[]zhicheng; delete[]course; } voidTeacher: : print() { cout<<"姓名: "< "< "< "< "< } intmain() { Personperson; ("csj",'M',18); (); Teacherteacher("lll",'M',56,"math","jiaoshou","gaoshu"); (); ("某某",'M',58,"数学","教授","高等数学"); (); return0; } 2.实验结果: (二)第二题: 第二题: 许多研究生既有学生的属性,又有教师的属性。 试通过多重继承说明一个研究生类。 1.源程序代码: 验结果: (三)第三题: 修改例9-5,从Point类中派生出一个Line类。 Line类增加一个数据成员EndPoint计算线的长度。 试比较一下与直接使用Point类来构造Line类的不同之处。 1.源程序代码: (用了三个文件) 验结果: 四、第四题: 从Date类和Time类派生出一个DateAndTime类,修改相应的成员函数,当时间递增到新的一天时,能够修改日期值。 1.程序源代码: #include #include usingnamespacestd; classDate { protected: intyear,month,day; public: Date(inta,intb,intc) { year=a; month=b; day=c; } voidinit(intyy,intmm,intdd); voidprint_ymd(); }; voidDate: : init(intyy,intmm,intdd) {month=(mm>=1&&mm<=12)mm: 0; year=(yy>=1900&&yy<=2100)yy: 1900; day=(dd>=1&&dd<=31)dd: 1; }; voidDate: : print_ymd() {cout< classTime { protected: inthour,minute,second; public: Time(inth,intm,ints) { hour=h,minute=m,second=s; } voidRegister(inth=0,intm=0,ints=0) { hour=h,minute=m,second=s; } voidShowme_hms() { cout<<""< } }; classDateAndTime: publicDate,publicTime { public: DateAndTime(inta=1900,intb=1,intc=1,intd=0,inte=0,intf=0): Date(a,b,c),Time(d,e,f){} voidinput(intyy,intmm,intdd,inth,intm,ints) { hour=h,minute=m,second=s; month=mm; year=yy; day=dd; } voidNormal() { intn; if(second>=60) { n=second/60;second=second%60;minute=minute+n; } if(second<0) { n=second/60+1;second=second%60+60;minute=minute-n; } if(minute>=60) { n=minute/60;minute=minute%60;hour=hour+n; } if(minute<0) { n=minute/60+1;minute=minute%60+60;hour=hour-n; } if(hour>=24) { n=hour/24;hour=hour%24;day=day+n; } if(hour<0) { n=hour/24+1;hour=hour%24+24;day=day-n; } if(day>=30) { n=day/30;day=day%30;month=month+n; } if(day<0) { n=day/30+1;day=day%30+30;month=month-n; } if(month>=12) { n=month/12;month=month%12;year=year+n; } if(month<0) { n=month/12+1;month=month%12+12;year=year-n; } } voidadd(DateAndTime&d) { year=year+; month=month+; day=day+; hour=hour+; minute=minute+; second=second+; } voidsub(DateAndTime&d) { year=; month=; day=; hour=; minute=; second=; } voidshow() { Normal(); print_ymd(); Showme_hms(); } }; voidmain() { DateAndTimed1,d2; cout<<"初始化: \n"; (); (); (2014,5,23,22,4,50); (0,0,0,6,58,29); cout<<"第一个时间: \n"; (); cout<<"第二个时间: \n"; (); cout<<"第一个时间第二个时间相加为: \n"; (d2); (); } 2.实验结果: 五、第五题: 采用继承方式定义一个三层生日蛋糕类,不论基类还是派生类都至少包含5个函数: 构造函数、设置数据成员函数、求蛋糕体积、运算符>重载函数、输出生日祝词与蛋糕形状函数。 并编写主函数测试各成员函数。 继承方式如下: 首先定义圆柱体形状蛋糕类,只有3个数据成员,半径、高、生日祝词。 然后派生出圆柱体_方柱体蛋糕类,即在圆柱体形状上增加方柱体形状。 假定方柱体的正方形面积小于圆柱体的圆形面积,注意方柱体的高与正方形的边长不一定相等。 再用圆柱体_方柱体蛋糕类派生出圆柱体_方柱体_菱形体蛋糕类,即在方柱体形状上增加菱形柱体形状。 假定菱形柱体的菱形面积小于方柱体的正方形面积。 提示: ①运算符>重载指两个蛋糕对象的体积大小。 ②基类和派生类数据成员不能定义为public。 ③设置数据成员函数、求蛋糕体积、求蛋糕表面积函数、输出生日祝词与蛋糕形状函数均为同名重载函数,例如分别采用函数名为init()、volume()、area()、output()。 程序运行参考图如下: (红颜色的功能下一章实验完成) #include #include #include usingnamespacestd; classyuan { protected: doubler,h1; charll[20]; public: yuan(doublea,doubleb,char*str) {r=a; h1=b; strcpy(ll,str);} voidinit(doublea,doubleb,char*str) {r=a; h1=b; strcpy(ll,str);} doublevolume() {return*r*r*h1;} doublearea() {return2**r*(r+h1);} voidoutput() { cout<<"蛋糕祝词: "< cout<<"圆柱形蛋糕信息如下: "< cout<<"半径: "< "< "< "< } }; classfang: publicyuan { protected: doubleaa,h2; public: fang(doublea,doubleb,char*str,doublec,doubled): yuan(a,b,str) { aa=c; h2=d;} voidinit(doublea,doubleb,char*str,doublec,doubled) {yuan: : init(a,b,ll); aa=c; h2=d;} doublevolume() {returnaa*aa*h2;} doublearea() {returnaa*aa*2+4*aa*h2;} voidoutput() { yuan: : output(); cout<<"方柱形蛋糕信息如下: "< cout<<"边长: "< "< cout<<"体积: "< "< } }; classling: publicfang { protected: doublecz,dz,h3; public: ling(doublea,doubleb,char*str,doublec,doubled,doublee,doublef,doubleg): fang(a,b,str,c,d) { cz=e; dz=f; h3=g;} voidinit(doublea,doubleb,char*str,doublec,doubled,doublee,doublef,doubleg) {fang: : init(a,b,str,c,d); cz=e; dz=f; h3=g;} doublevolume() {returncz*dz*h3*;} doublearea() {returncz*dz+4**sqrt(cz*cz+dz*dz)*h3;} voidoutput() { fang: : output(); cout<<"菱柱形蛋糕信息如下: "< cout<<"菱形长轴: "< "< "< cout<<"体积: "< "< cout<<"总体积为: "< : volume()+fang: : volume()+volume()<<"总表面积: "< : area()+fang: : area()+area()< } }; voidmain() { charzc[31]; doublea,b,c,d,e,f,g; lingcake(0,0,"",0,0,0,0,0); cout<<"请输入蛋糕的: 祝词,半径高,方形边长高,菱形长轴短轴高\n"; (zc,30); cin>>a>>b>>c>>d>>e>>f>>g; (a,b,zc,c,d,e,f,g); (); } 3.问题分析: 六、第六题: (必做题)设计定义100位的十进制整数类,成员函数至少应有构造函数、加法函数、减法函数、输出大整数函数,并编写主函数加以测试。 提示: (1)在类中定义三个数据成员,存放正整数成员intnum[100],存放正负符号成员charsign,存放整数实际长度成员intlen; (2)在构造函数中,先将整个数组中100个元素赋0。 然后通过大整数的字符串给数组num[100]中每个数组元素赋值,即要转换赋值。 例如大整数字符串为"-4587",num[99]=‘5’-‘0’+0;num[98]=‘6’-‘0’+0;.......,sign=‘-’;len=16。 1.源程序代码: #include #include #include #include usingnamespacestd; classczs { intnum[100]; intlen; charsign; public: czs() { for(inti=0;i<100;i++) num[i]=0; len=0; sign=''; } voidset(char*str) { if(str[0]=='-') { str++; sign='-';} elseif(str[0]=='+') { str++; sign='';} len=strlen(str); for(inti=100-len;i<100;i++) num[i]=str[i+len-100]-'0'; } voidshow() { cout< for(inti=100-len;i<100;i++) cout< cout< } voidadd(czs&a) { if(sign== { intb=max(len,; for(inti=99;i>100-b;i--) { num[i]=num[i]+[i]; num[i-1]=num[i-1]+num[i]/10; num[i]=num[i]%10; } num[100-b]=num[100-b]+[100-b]; } else { if(len> for(inti=99;i>=len;i--) { num[i]=num[i][i]; if(num[i]<0) { num[i]=num[i]+10; num[i-1]--; } } elseif(len< { sign=; for(inti=99;i>=len;i--) { num[i]=[i]-num[i]; if(num[i]<0) { num[i]=num[i]+10; [i-1]--; } } } else { intb=0; for(inti=100-len;i<100;i++) if(num[i]! =[i]) { if(num[i]<[i]) b=1; break; } if(b) { sign=; for(inti=99;i>=len;i--) { num[i]=[i]-num[i]; if(num[i]<0) { num[i]=num[i]+10; [i-1]--; } } } else { for(inti=99;i>=len;i--) { num[i]=num[i][i]; if(num[i]<0) { num[i]=num[i]+10; num[i-1]--; }} } } } } voidminus(czsa) { if(sign! = { intb=max(len,; for(inti=99;i>100-b;i--) { num[i]=num[i]+[i]; num[i-1]=num[i-1]+num[i]/10; num[i]=num[i]%10; } num[100-b]=num[100-b]+[100-b]; } else { if(len> for(inti=99;i>=len;i--) { num[i]=num[i][i]; if(num[i]<0) { num[i]=num[i]+10; num[i-1]--; } } elseif(len< { if(sign='') sign='-'; else sign=''; for(inti=99;i>=len;i--) { num[i]=[i]-num[i]; if(num[i]<0) { num[i]=num[i]+10; [i-1]--; } } } else { intb=0; for(inti=100-len;i<100;i++) if(num[i]! =[i]) { if(num[i]<[i]) b=1; break; } if(b) { if(sign='') sign='-'; else sign=; for(inti=99;i>=len;i--) { num[i]=[i]-num[i]; if(num[i]<0) { num[i]=num[i]+10;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安 交大 C+ 程序设计 第九 作业