LHL PTA 实验8. 继承(二)

LHL’PTA 实验8. 继承(二)

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:”< cout<<“age”< cout<<“title:”< }
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:”< cout<<“sex:”< cout<<“score:”< }
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判断图形的类型

你可能感兴趣的:(LHL'PTA,编程语言,c++)