多态和继承(2)——多重继承、子类互为友元

完成“学生cpp成绩计算”之后,修改Person和Student类,各自增加两个无参构造函数。
/*仍以Person类为基础,建立一个派生类Teacher,增加以下成员数据:
int ID;//教师工号
Student stu[100];//学生数组
int count;//学生数目,最多不超过100
float cpp_average;//班级cpp平均分
增加以下成员函数:
Teacher类的参数化构造函数
void Add (Student & stu1)//在学生数组中增加一个学生记录
void average();//计算当前班级cpp平均成绩cpp_average
void print()//输出当前班级学生的信息
//其中学生记录中cpp_score和cpp_grade输出保留一位小数
//当前班级cpp_average输出保留一位小数;
//输出格式如下:
//第一行:教师工号 教师姓名 班级学生数 cpp_average
//第二行至第count+1行每一行输出一个学生的信息,每一行格式
// 学生学号 学生姓名 cpp_grade
//cpp_grade保留一位小数
生成上述类并编写主函数,根据输入的教师基本信息,建立一个教师对象,根据输入的每一条学生基本信息,建立一个学生对象,计算学生cpp总评成绩并且加入学生数组中,由教师对象计算班级cpp平均成绩,并输出班级学生的全部信息。
输入格式: 测试输入包含一个测试用例,该测试用例的第一行输入教师的基本信息(教师姓名 教师工号 年龄),第二行开始输入班级内学生信息,每个学生基本信息占一行(学生姓名 学号 年龄 cpp成绩 cpp考勤),最多不超过100行,当读入0时输入结束。
输入样例:
Michale 901 30
Bob 10001 18 75.9 4
Alice 10002 18 66.0 3
Anna 10003 19 87.0 5
Sam 10004 18 90.0 5
Mike 10005 17 95.0 5
0
输出样例:
901 Michale 5 83.3
10001 Bob 76.3
10002 Alice 65.4
10003 Anna 88.3
10004 Sam 91.0
10005 Mike 95.5*/

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;


class Person{
protected:
	string name;
	int age;
public:
	Person(string p_name,int p_age);
	Person(){
		name="0";
		age=0;

	}
	void display();
};
void Person::display(){
	cout<<name<<":"<<age<<endl;

}
Person::Person(string p_name,int p_age){
	name=p_name;
	age=p_age;
}

class teacher;

class student:public Person{
private:
	int ID;
	float cpp_score;
	float cpp_count;
	float cpp_grade;
public:
	friend teacher;
	student(){
		
		ID=0;
		cpp_score=0;
		cpp_count=0;
		cpp_grade=0;

	}

	student(string name,int age,int ID1,float cpp_score1,float cpp_count1):Person(name,age){
	ID=ID1;
	cpp_score=cpp_score1;
	cpp_count=cpp_count1;
	cpp_grade=cpp_score1*0.9+cpp_count1*2;
	}
	void print();};


/*student::student(string name,int age,int ID1,float cpp_score1,float cpp_count1):Person(name,age){
	ID=ID1;
	cpp_score=cpp_score1;
	cpp_count=cpp_count1;
	cpp_grade=cpp_score1*0.9+cpp_count1*2;
}*/
void student::print(){
	
	cout<<ID<<" "<<name<<" "<<setiosflags(ios::fixed);
	cout.precision(1);
	cout<<cpp_grade<<endl;

}



class teacher:public Person{
private:
	int ID;
	student stu[100];
	int count;
	float cpp_average;//班级cpp平均分
public:
	friend student;
	teacher(string name,int age,int ID1,int count1):Person(name,age){
		int i=0;
		ID=ID1;
		
		count=count1;
		
	}
	

	void average();
	void Add(student &stu1);
	void print();

//其中学生记录中cpp_score和cpp_grade输出保留一位小数
//当前班级cpp_average输出保留一位小数;

};
void teacher::average(){
	int i;
	float sum=0;
	for(i=0;i<count;i++)
		sum+=stu[i].cpp_grade;
	cpp_average=sum/count;
}
void teacher::Add(student &stu1){
	stu[count++]=stu1;
}
void teacher::print(){
	cout<<ID<<" "<<name<<" "<<count<<" "<<setiosflags(ios::fixed);
	cout.precision(1);
	cout<<cpp_average<<endl;

	int i;
	for(i=0;i<count;i++)
		stu[i].print();
}


int main(){
	string name1;
	int ID1,age1,count1;
	float score1,grade1;
	student acc[101];
	cin>>name1>>ID1>>age1;
	count1=0;
	teacher t(name1,age1,ID1,count1);
	
	while(cin>>name1){
		
		if(name1=="0")
			break;
		else{
			cin>>ID1>>age1>>score1>>count1;
			student s(name1,age1,ID1,score1,count1);
			t.Add(s);}
	}
	t.average();
	t.print();
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值