6-1 多重继承派生类构造函数 (10分)
根据所给的基类Student和Teacher,定义Graduate类
#include
#include
using namespace std;
class Teacher
{public:
Teacher(string nam,int a,string t)
{name=nam;
age=a;
title=t;}
void display()
{cout<<“name:”<
protected:
string name;
int age;
string title;
};
class Student
{public:
Student(string nam,char s,float sco)
{name1=nam;
sex=s;
score=sco;}
void display1()
{cout<<“name:”<
protected:
string name1;
char sex;
float score;
};
/* 请在这里填写答案 */
裁判测试程序样例:
int main( )
{Graduate grad1(“Wang-li”,24,‘f’,“assistant”,89.5,1234.5);
grad1.show( );
return 0;
}
输出样例:
name:Wang-li
age:24
sex:f
score:89.5
title:assistant
wages:1234.5
#include
#include
using namespace std;
class Teacher //声明Teacher(教师)类
{
public: //公用部分
Teacher(string nam,int a,string t) //构造函数
{
name=nam; age=a; title=t;}
void display() //输出教师有关数据
{
cout<<"name:"<<name<<endl;
cout<<"age"<<age<<endl;//LHL
cout<<"title:"<<title<<endl; }
protected: //保护部分
string name;
int age;
string title;}; //职称
class Student //声明类Student(学生)
{
public:
Student(string nam,char s,float sco)
{
name1=nam; sex=s; score=sco;} //构造函数
void display1() //输出学生有关数据
{
cout<<"name:"<<name1<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl; }
protected: //保护部分
string name1;//LHL
char sex;
float score; }; //成绩
class Graduate:public Teacher,public Student //声明多重继承的派生类Graduate
{
public:
Graduate(string nam,int a,char s,string t,float sco,float w):
Teacher(nam,a,t),Student(nam,s,sco),wage(w) {
}
void show( ) //输出人员的有关数据
{
cout<<"name:"<<name<<endl;//LHL
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
cout<<"title:"<<title<<endl;//LHL
cout<<"wages:"<<wage<<endl; }
private:
float wage; }; //工资
int main( )
{
Graduate grad1("Wang-li",24,'f',"assistant",89.5,1234.5);
grad1.show( );
return 0; }
返回
7-1 学生CPP成绩计算 (20分)
给出下面的人员基类框架:
class Person {
protected:
string name;
int age;
public:
Person();
Person (string p_name, int p_age);
void display () {cout<
};
建立一个派生类student,增加以下成员数据:
int ID;//学号
float cpp_score;//cpp上机成绩
float cpp_count;//cpp上机考勤
float cpp_grade;//cpp总评成绩
//总评成绩计算规则:cpp_grade = cpp_score * 0.9 + cpp_count * 2;
增加以下成员函数:
student类的无参构造函数
student类的参数化构造函数//注意cpp_grade为上机成绩和考勤的计算结果
void print()//输出当前student的信息
//其中cpp_grade输出保留一位小数
//输出格式为ID name cpp_grade
生成上述类并编写主函数,根据输入的学生基本信息,建立一个学生对象,计算其cpp总评成绩,并输出其学号、姓名、总评成绩。
输入格式: 测试输入包含若干测试用例,每个测试用例占一行(学生姓名 学号 年龄 cpp成绩 cpp考勤)。当读入0时输入结束,相应的结果不要输出。
输入样例:
Bob 10001 18 75.5 4
Mike 10005 17 95.0 5
0
输出样例:
10001 Bob 75.9
10005 Mike 95.5
#include
#include
using namespace std;
class Person {
protected:
char *name;
int age;
public:
Person(){
//默认构造函数
name=new char[20];
age=18;//LHL
strcpy(name,"Bob");
}
Person (char *p_name, int p_age){
//含参的构造函数
name=new char[20];
strcpy(name,p_name);
age=p_age;
}
void display ()
{
cout<<name;
}
};
class Student:public Person{
//公有继承Person基类
char *ID;//学号//LHL
float cpp_score;//cpp上机成绩
float cpp_count;//cpp上机考勤
float cpp_grade;//cpp总评成绩
public:
Student():Person(){
//默认构造函数
ID=new char[20];//学号
strcpy(ID,"0");
cpp_score=0;//cpp上机成绩
cpp_count=0;//cpp上机考勤
cpp_grade=0;//cpp总评成绩
}
Student(char *n,char *i,int a,float s,float c):Person(n,a){
//含参的构造函数
ID=new char[20];
strcpy(ID,i);
cpp_count=c;
cpp_score=s;
}
void print(){
//输出当前student的信息//LHL
cout<<ID<<" ";
display();
printf(" %.1f\n",cpp_score*0.9+cpp_count*2-0.01);
}
};
int main(void)
{
char name[20],num[20];
float s,c;
int a;
while(1)
{
scanf("%s",name);
if(name[0]=='0')
break;
scanf("%s %d %f %f",num,&a,&s,&c);//LHL
Student obj(name,num,a,s,c);
getchar();
obj.print();
}
}
7-2 一个基类Person的多个派生类 (20分)
题目内容:
已知基类Person的定义如下:
class Person
{
protected:
string Name;
char Sex;
int Age;
public:
void Register(string name, int age, char sex);
void ShowMe();
};
请先完成Person类的定义,然后通过继承的方法建立两个派生类,其中
派生类Teacher:
1.新增的数据成员有:
string Dept; //工作单位
int Salary; //工资
2.新增的成员函数有:
构造函数,并使用基类的Register
3.重写的成员函数有: void ShowMe() //显示数据成员信息,并使用基类的ShowMe
派生类Student:
1.新增的数据成员有:
string ID; //学号
string ClassId; //班级
2.新增的成员函数有:
Student(string name,int age,char sex,string id,string classid);
3.重写的成员函数有: void ShowMe() //显示数据成员信息,并使用基类的ShowMe
在主程序中分别建立两个派生类对象,利用已有的成员函数分别显示两个派生类对象的数据成员。
输入格式:
教师对象的初始化参数
学生对象的初始化参数
输出格式:
请参考输出样例严格按照格式输出教师对象和学生对象的详细信息
输入样例:
在这里给出一组输入。例如:
张弓长 38 m 信息学院 6300
李木子 21 f 170001 计算机01
输出样例:
在这里给出相应的输出。例如:
姓名 张弓长
性别 男
年龄 38
工作单位 信息学院
月薪 6300
学号 170001
姓名 李木子
性别 女
年龄 21
班级 计算机01
#include
#include //LHL
using namespace std;
class Person
{
protected:
char Name[10];
char Sex;
int Age;
public:
void Register(char *name,int age,char sex)
{
strcpy(Name, name);
Sex = sex;//LHL
Age = age;
}
void ShowMe()
{
cout<<"姓名 "<<Name<<endl;
if(Sex == 'm')
{
cout<<"性别 "<<"男"<<endl;
}
else
{
cout<<"性别 "<<"女"<<endl;
}
cout<<"年龄 "<<Age<<endl;
}
};//LHL
class Teacher:public Person
{
private:
char Dept[20];
int Salary;
public:
Teacher(char *name,int age,char sex,char *dept,int salary)
{
Register(name,age, sex);
strcpy(Dept, dept);
Salary = salary;
}
void ShowMe()
{
Person::ShowMe();
cout<<"工作单位 "<<Dept<<"\n"<<"月薪 "<<Salary<<endl;
}
};
class Student:public Person
{
//LHL
private:
char ID[12];
char Class[12];
public:
Student(char *name,int age,char sex, char *id,char *classid)
{
Register(name,age, sex);
strcpy(ID, id);
strcpy(Class, classid);
}
void ShowMe()
{
cout<<"学号 "<<ID<<endl;
Person::ShowMe();
cout<<"班级 "<<Class<<endl;
}
};
int main()
{
char tname[10],sname[10],tsex,ssex,dept[20],id[12],_class[12];
int tage,sage,salary;
cin>>tname>>tage>>tsex>>dept>>salary;
Teacher t(tname,tage,tsex,dept,salary);
cin>>sname>>sage>>ssex>>id>>_class;
Student s(sname, sage, ssex, id, _class);
t.ShowMe();
s.ShowMe();
return 0;
}
7-3 两点间距离计算 (25分)
给出下面的一个基类框架:
class Point_1D
{ protected:
float x;//1D 点的x坐标
public:
Point_1D(float p = 0.0);
float distance(const Point_1D & p2);
}
以Point_1D为基类建立一个派生类Point_2D,增加一个保护数据成员:
float y;//2D平面上点的y坐标
以Point_2D为直接基类再建立一个派生类Point_3D,增加一个保护数据成员:
float z;//3D立体空间中点的z坐标
生成上述类并编写主函数,根据输入的点的基本信息,建立点对象,并能计算该点到原点的距离。
输入格式: 测试输入包含若干测试用例,每个测试用例占一行(点的类型(1表示1D点,2表示2D点,3表示3D点) 第一个点坐标信息(与点的类型相关) 第二个点坐标信息(与点的类型相关))。当读入0时输入结束,相应的结果不要输出。
输入样例:
在这里给出一组输入。例如:
1 -1 0
2 3 4 0 0
3 1 2 2 0 0 0
0
输出样例:
在这里给出相应的输出。例如:
Distance from Point -1 to Point 0 is 1
Distance from Point (3,4) to Point (0,0) is 5
Distance from Point (1,2,2) to Point (0,0,0) is 3
#include
#include
using namespace std;
class Point_1D
{
protected:
float x;//1D 点的x坐标
public:
Point_1D(){
//默认构造函数
x=0;
}
void setx(){
//LHL
cin>>x;
}
void distancex(const Point_1D & p2){
printf("Distance from Point %g to Point %g is %g\n",x,p2.x,fabs(x-p2.x));
}
};
class Point_2D: protected Point_1D{
protected:
float y;
public:
Point_2D(){
//默认构造函数
y=0;
}
void setxy(){
cin>>x>>y;
}
void distancexy(const Point_2D & p2){
printf("Distance from Point(%g,%g) to Point(%g,%g) is %g\n",x,y,p2.x,p2.y,sqrt((x-p2.x)*(x-p2.x)+(y-p2.y)*(y-p2.y)));
}
};
class Point_3D: protected Point_2D{
protected:
float z;
public:
Point_3D(){
z=0;//LHL
}
void setxyz(){
cin>>x>>y>>z;
}
float distancexyz(const Point_3D & p2){
printf("Distance from Point(%g,%g,%g) to Point(%g,%g,%g) is %g\n",x,y,z,p2.x,p2.y,p2.z,sqrt((x-p2.x)*(x-p2.x)+(y-p2.y)*(y-p2.y)+(z-p2.z)*(z-p2.z)));
}
};
int main(void)
{
int a;
while(scanf("%d",&a)&&a)//输入
{
switch(a)
{
case 1:{
Point_1D p1,p2;
p1.setx();//LHL
p2.setx();
p1.distancex(p2);
}
break;
case 2:
{
Point_2D p3,p4;
p3.setxy();
p4.setxy();
p3.distancexy(p4);
}
break;
case 3:{
Point_3D p5,p6;
p5.setxyz();
p6.setxyz();
p5.distancexyz(p6);
}
break;//LHL
}
}
}
7-4 多边形周长计算(继承) (25分)
给出下面的多边形基类框架:
class polygon
{ protected:
int number;//边数,最多不超过100条边
private:
int side_length[100];//边长数组
public:
polygon();//构造函数根据需要重载
int perimeter();//计算多边形边长
void display();//输出多边形边数和周长
}
建立一个派生类rectangle(矩形),增加以下数据成员:
int height;
int width;
增加以下成员函数:
rectangle类的无参和参数化构造函数
int perimeter();//计算矩形边长
void display();//输出多边形边数和周长
建立一个派生类equal_polygon(等边多边形),增加以下数据成员:
int side_len;
增加以下成员函数:
equal_polygon类的无参和参数化构造函数
int perimeter();//计算等边多边形边长
void display();//输出多边形边数和周长
生成上述类并编写主函数,根据输入的多边形信息,相应建立一个多边形类对象或矩形类对象或等边多边形类对象,计算每一个多边形的周长并且输出其边数和周长。
输入格式: 测试输入包含一个测试用例,该测试用例的第一行输入多边形的个数n,接下来n行每一行给出一个多边形的基本信息,每行的第一个数字为当前多边形的类型,0为一般多边形,后面跟随m个数字为m条边的边长,-1为一般多边形边长输入结束标志,1为矩形,后面跟随两个数字,分别为height和width,2为等边多边形,后面跟随两个数字为等边多边形的边数和边长。
输入样例:
3
0 32 54 76 88 24 -1
1 32 54
2 3 32
输出样例:
5 274
4 172
3 96
#include
using namespace std;//LHL
class polygon{
protected:
int number;//边数,最多不超过100条边
private:
int side_length[100];//边长数组//LHL
public:
polygon(){
//构造函数根据需要重载
int i=0;
number=0;
for(i=0;i<100;i++)
side_length[i]=0;
}
polygon(int n,int *s){
int i=0;
number=n;
for(i=0;i<n;i++)
side_length[i]=s[i];
}
int perimeter(){
//计算多边形边长
int i,sum=0;
for(i=0;side_length[i];i++)
sum+=side_length[i];
return sum;
}
void display(){
//输出多边形边数和周长
cout<<number<<" "<<perimeter()<<endl;
}
};
class rectangle{
int height;
int width;//LHL
public:
rectangle(){
height=0;
width=0;
}
rectangle(int h,int w){
height=h;
width=w;
}
int perimeter(){
//计算矩形边长
return (height+width)*2;
}
void display(){
//输出多边形边数和周长
cout<<4<<" "<<perimeter()<<endl;
}
};
class qual_polygon:public polygon{
int side_len;
public:
qual_polygon():polygon(){
//类的无参和参数化构造函数
side_len=0;
}
qual_polygon(int n,int s){
//LHL
number=n;
side_len=s;
}
int perimeter(){
//计算等边多边形边长
return number*side_len;
}
void display(){
//输出多边形边数和周长
cout<<number<<" "<<perimeter()<<endl;
}
};
int main(void)
{
int n,i,a,b,c,d,e,f,g,s[100]={
0};
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a);//LHL
switch(a)
{
case 0:{
c=0;
while(1){
scanf("%d",&b);
if(b==-1)
break;
s[c++]=b;
}
polygon ob0(c-1,s);
ob0.display();
}break;
case 1:{
scanf("%d %d",&d,&e);
rectangle ob1(d,e);
ob1.display();
}break;//LHL
case 2:{
scanf("%d %d",&f,&g);
qual_polygon ob2(f,g);
ob2.display();//LHL
}break;
}
}
}
函数第一题目:这一题的graduate需要继承teacher ,student,在graduate的构造函数中需要加入teacher和student的初始化,最后输出即可
第一题:这一题需要用到循环和结束条件的判断,当输入为0是退出循环,其中中总成绩的计算方法为上机成绩0.9+上机成绩2,还有输出总成绩需要保留一位小数
第二题:这一题可以使用虚函数showme,这样层次更清楚,这题看似很长,其实只是把简单的问题重复了一下,把老师和学生的函数,用基类person按题目要求写出即可
第三题:这一题与实验7的那一题差不多,只不过,这个是到原点,那个是到任意点,创建完两个点,最后调用其中一个点的计算函数,同时把另一个点重命名,并且定位常数,这样就防止数据别更改,传入这个点的计算函数中,计算,输出即可,这一题的输出尤其是要考虑空格
第四题:这一的难点是计算一般多边形的周长,这里需要定义一个数组,储存一般多边形的边长的长度,而且要把指针传入到一般多边形函数中去,一般多边形的polygon最特殊,把数组的地址传入,然后遍历,存到函数的数组中去,主函数中用if判断图形的类型