西安交大C++程序设计第九章作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安交大C++程序设计第九章作业(总20页)
本页仅作为文档封面,使用时可以删除
This document is for reference only-rar21year.March
西安交通大学实验报告
课程__计算机程序设计__实验名称__继承__第 1 页共页
系别____ ______ 实验日期 2014 年 5 月日
专业班级__ ___组别_____________ 实验报告日期 2014 年月日
姓名___ ______学号_ _ 报告退发 ( 订正、重做 )
同组人_________________________________ 教师审批签字
一、实验目的
熟练继承的用法,进一步训练类的编程,并练习不同继承方式下对基类的成员的访问的控制。
二、实验内容
(一)第一题:从类Person中派生出一个教师类,新增的属性有:专业、职称和主讲课程(一门),并为这些属性定义相应的方法。
1.源程序代码:
#include<iostream>
using namespace std;
class Person
{
protected:
char *Name;
char Sex;
int Age;
public:
Person()
{
Name="csj";
Sex='M';
Age=18;
}
Person(char *name,char sex,int age)
{
Register(name,sex,age);
}
~Person()
{
delete []Name;
}
void Register(char *name,char sex,int age)
{
int m=strlen(name);
Name=new char[m+1];
strcpy(Name,name);
Sex=sex;;
Age=age;
}
void print()
{
cout<<"姓名:"<<Name<<"\t性别:"<<Sex<<"\t年龄:"<<Age<<endl;
}
};
class Teacher:public Person
{
protected:
char *zhuanye;
char *zhicheng;
char *course;
public:
Teacher();
Teacher(char*,char,int,char*,char*,char*);
void Register(char*,char,int,char*,char*,char*);
~Teacher();
void print();
};
Teacher::Teacher()
{
Person::Register("罗先觉",'M',61);
strcpy(zhuanye,"电气工程及其自动化");
strcpy(zhicheng,"教授");
strcpy(course,"电路");
}
Teacher::Teacher(char *name,char sex,int age,char *zy,char *zc,char *cor)
{
Register(name,sex,age,zy,zc,cor);
}
void Teacher::Register(char *name,char sex,int age,char *zy,char *zc,char *cor) {
Person::Register(name,sex,age);
zhuanye=new char[strlen(zy)+1];
strcpy(zhuanye,zy);
zhicheng=new char[strlen(zc)+1];
strcpy(zhicheng,zc);
course=new char[strlen(cor)+1];
strcpy(course,cor);
}
Teacher::~Teacher()
{
delete []zhuanye;
delete []zhicheng;
delete []course;
}
void Teacher::print()
{
cout<<"姓名:"<<Name<<"\t性别:"<<Sex<<"\t年龄:"<<Age<<"\t 专业"<<zhuanye<<"\t职称:"<<zhicheng<<"\t主讲课程:"<<course<<endl;
}
int main()
{
Person person;
("csj",'M',18);
();
Teacher teacher("lll",'M',56,"math","jiaoshou","gaoshu");
();
("某某",'M',58,"数学","教授","高等数学");
();
return 0;
}
2.实验结果:
(二)第二题:第二题:许多研究生既有学生的属性,又有教师的属性。
试通过多重继承说明一个研究生类。
1.源程序代码:
验结果:
(三)第三题:修改例9-5,从Point类中派生出一个Line类。
Line 类增加一个数据成员EndPoint计算线的长度。
试比较一下与直接使用Point类来构造Line类的不同之处。
1.源程序代码:(用了三个文件)
验结果:
四、第四题:从Date类和Time类派生出一个DateAndTime类,修改相应的成员函数,当时间递增到新的一天时,能够修改日期值。
1.程序源代码:
#include<iostream>
#include<cmath>
using namespace std;
class Date
{
protected:
int year,month,day;
public:
Date(int a,int b,int c)
{
year=a;
month=b;
day=c;
}
void init(int yy,int mm,int dd);
void print_ymd();
};
void Date::init(int yy,int mm,int dd)
{ month=(mm>=1&&mm<=12) mm:0;
year=(yy>=1900&&yy<=2100) yy:1900;
day=(dd>=1&&dd<=31) dd:1;
};
void Date::print_ymd()
{ cout<<year<<"-"<<month<<"-"<<day;}
class Time
{
protected:
int hour,minute,second;
public:
Time(int h,int m,int s)
{
hour=h,minute=m,second=s;
}
void Register(int h=0,int m=0,int s=0)
{
hour=h,minute=m,second=s;
}
void Showme_hms()
{
cout<<" "<<hour<<"小时"<<minute<<"分钟"<<second<<"秒
"<<endl;
}
};
class DateAndTime:public Date,public Time
{
public:
DateAndTime(int a=1900,int b=1,int c=1,int d=0,int e=0,int
f=0):Date(a,b,c),Time(d,e,f){}
void input(int yy,int mm,int dd,int h,int m,int s)
{
hour=h,minute=m,second=s;
month=mm;
year=yy;
day=dd;
}
void Normal()
{
int n;
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;
}
}
void add(DateAndTime &d)
{
year=year+;
month=month+;
day=day+;
hour=hour+;
minute=minute+;
second=second+;
}
void sub(DateAndTime&d)
{
year=;
month=;
day=;
hour=;
minute=;
second=;
}
void show()
{
Normal();
print_ymd();
Showme_hms();
}
};
void main()
{
DateAndTime d1,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<iostream>
#include<cstring>
#include<cmath>
using namespace std;
class yuan
{
double r,h1;
char ll[20];
public:
yuan(double a,double b,char *str)
{r=a;
h1=b;
strcpy(ll,str);}
void init(double a,double b,char *str)
{r=a;
h1=b;
strcpy(ll,str);}
double volume()
{return *r*r*h1;}
double area()
{return 2**r*(r+h1);}
void output()
{
cout<<"蛋糕祝词:"<<ll<<endl;
cout<<"圆柱形蛋糕信息如下:"<<endl;
cout<<"半径:"<<r<<" 高:"<<h1<<" 体积:"<<volume()<<" 表面积:"<<area()<<endl;
}
};
class fang:public yuan
{
protected:
double aa,h2;
public:
fang(double a,double b,char *str,double c,double d):yuan(a,b,str)
{
aa=c;
h2=d;}
void init(double a,double b,char *str,double c,double d)
{yuan::init(a,b,ll);
aa=c;
h2=d;}
double volume()
{return aa*aa*h2;}
double area()
{return aa*aa*2+4*aa*h2;}
void output()
yuan::output();
cout<<"方柱形蛋糕信息如下:"<<endl;
cout<<"边长:"<<aa<<" 高:"<<h2<<endl;
cout<<"体积:"<<volume()<<" 表面积:"<<area()<<endl;
}
};
class ling:public fang
{
protected:
double cz,dz,h3;
public:
ling(double a,double b,char *str,double c,double d,double e,double f,double g):fang(a,b,str,c,d)
{
cz=e;
dz=f;
h3=g;}
void init(double a,double b,char *str,double c,double d,double e,double
f,double g)
{fang::init(a,b,str,c,d);
cz=e;
dz=f;
h3=g;}
double volume()
{return cz*dz*h3*;}
double area()
{return cz*dz+4**sqrt(cz*cz+dz*dz)*h3;}
void output()
{
fang::output();
cout<<"菱柱形蛋糕信息如下:"<<endl;
cout<<"菱形长轴:"<<cz<<" 短轴:"<<dz<<" 高:"<<h3<<endl;
cout<<"体积:"<<volume()<<" 表面积:"<<area()<<endl;
cout<<"总体积为:"<<yuan::volume()+fang::volume()+volume()<<" 总表面积:"<<yuan::area()+fang::area()+area()<<endl;
}
};
void main()
{
char zc[31];
double a,b,c,d,e,f,g;
ling cake(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],存放正负符号成员char sign,存放整数实际长度成员int
len;(2)在构造函数中,先将整个数组中100个元素赋0。
然后通过大整数的字符串给数组num[100]中每个数组元素赋值,即要转换赋值。
例如大整数字符串为"-4587",num[99]=‘5’-‘0’+0;num[98]=‘6’-‘0’+0;.......,sign=‘-’;len=16。
1.源程序代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
class czs
{
int num[100];
int len;
char sign;
public:
czs()
{
for(int i=0;i<100;i++)
num[i]=0;
len=0;
sign=' ';
}
void set(char *str)
{
if(str[0]=='-')
{
str++;
sign='-';}
else if(str[0]=='+')
{
str++;
sign=' ';}
len=strlen(str);
for(int i=100-len;i<100;i++)
num[i]=str[i+len-100]-'0';
}
void show()
{
cout<<sign;
for(int i=100-len;i<100;i++)
cout<<num[i];
cout<<endl;
}
void add(czs &a)
{
if(sign==
{
int b=max(len,;
for(int i=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(int i=99;i>=len;i--)
{
num[i]=num[i][i];
if(num[i]<0)
{
num[i]=num[i]+10;
num[i-1]--;
}
}
else if(len<
{
sign=;
for(int i=99;i>=len;i--)
{
num[i]=[i]-num[i];
if(num[i]<0)
{
num[i]=num[i]+10;
[i-1]--;
}
}
}
else
{
int b=0;
for(int i=100-len;i<100;i++)
if(num[i]!=[i])
{
if(num[i]<[i])
b=1;
break;
}
if(b)
{
sign=;
for(int i=99;i>=len;i--)
{
num[i]=[i]-num[i];
if(num[i]<0)
{
num[i]=num[i]+10;
[i-1]--;
}
}
}
else
{
for(int i=99;i>=len;i--)
{
num[i]=num[i][i];
if(num[i]<0)
{
num[i]=num[i]+10;
num[i-1]--;
}}
}
}
}
}
void minus(czs a)
{
if(sign!=
{
int b=max(len,;
for(int i=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(int i=99;i>=len;i--)
{
num[i]=num[i][i];
if(num[i]<0)
{
num[i]=num[i]+10;
num[i-1]--;
}
}
else if(len<
{
if(sign=' ')
sign='-';
else
sign=' ';
for(int i=99;i>=len;i--)
{
num[i]=[i]-num[i];
if(num[i]<0)
{
num[i]=num[i]+10;
[i-1]--;
}
}
}
else
{
int b=0;
for(int i=100-len;i<100;i++)
if(num[i]!=[i])
{
if(num[i]<[i])
b=1;
break;
}
if(b)
{
if(sign=' ')
sign='-';
else
sign=;
for(int i=99;i>=len;i--)
{
num[i]=[i]-num[i];
if(num[i]<0)
{
num[i]=num[i]+10;
[i-1]--;
}
}
}
else
{
for(int i=99;i>=len;i--)
{
num[i]=num[i][i];
if(num[i]<0)
{
num[i]=num[i]+10;
num[i-1]--;
}}
}
}
}
}
};
void main()
{
char a[100],c[100],b[100];
czs d,e,f;
cout<<"请输入三个数:"<<endl;
cin>>a>>b>>c;
(a);
(b);
(c);
cout<<"前两个数的和为:"<<endl;
(e);
();
cout<<"前两个数的和减去第三个数为:"<<endl;
(f);
();
}
2.实验结果:。