7-3 学生cpp成绩统计 (30 分)
完成“学生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时输入结束。
输入样例:
Mike 901 30
Bob 10001 18 75.9 4
Anna 10003 19 87.0 5
0
输出样例:
901 Michale 2 82.3
10001 Bob 76.3
10003 Anna 88.3
我的代码:
#include<iostream>
#include<math.h>
#include<string>
#include<iomanip>
using namespace std;
class Person
{
public:
string name;
int age;
public:
Person()
{}
Person(string P_name, int p_age);
void display()
{
cout << name << ":" << age << endl;
}
};
class student :public Person
{
public:
int ID;//学号
float cpp_score;//cpp上机成绩
float cpp_count;//cpp上机考勤
float cpp_grade;//cpp总评成绩
//总评成绩计算规则:cpp_grade = cpp_score * 0.9 + cpp_count * 2;
public:
student()
{}
student(string name, int ID, int age, float cpp_score, float cpp_count, float cpp_grade)
{
this->name = name;
this->ID = ID;
this->age = age;
this->cpp_score = cpp_score;
this->cpp_count = cpp_count;
this->cpp_grade = cpp_grade;
}
void print()
{
cout << ID << " " << name << " ";
printf("%.1f", cpp_grade);
cout << endl;
}
//其中cpp_grade输出保留一位小数
//在C++中输出一位小数需要搭配:#include<iomanip>(需要头文件)
setprecison函数是指设置输出的精度;
例如:float a=2017.666;
cout<<setprecison(5)<<a;
这里会输出2017.7注意这里会四舍五入
如果setprecision里的参数小于整数位数,将以指数形式输出;
例如:
float a=123.666
cout<<setprcision(2)<<a;
将输出1.2e+002;
setiosflag(ios::fixed)是指以固定的浮点显示,当setiosflags(ios::fixed)和setprecision(n)l两个一起用时,就表示保留n为小数输出
//输出格式为ID name cpp_grade
};
class Teacher :public Person
{
public:
int ID;//教师工号
student stu[100];//学生数组
int count;//学生数目,最多不超过100
float cpp_average;//班级cpp平均分
public:
Teacher()
{}
Teacher(string name, int ID, int age, float cpp_average)
{
this->name = name;
this->ID = ID;
this->age = age;
this->cpp_average = cpp_average;
}
// Teacher类的参数化构造函数
int Add(student& stu1)
{/*int i=0;
for(i;i<100&&stu[i].name[0]!='0';i++)
{cin>>stu[i].name>>stu[i].ID>>stu[i].age>>stu[i].cpp_score>>stu[i].cpp_count;
stu[i].cpp_grade=stu[i].cpp_score*0.9+stu[i].cpp_count*2;*/
}//在学生数组中增加一个学生记录
void average()
{
float Zong=0;
for (int i = 0; i <= count; i++)
Zong += stu[i].cpp_grade;
cpp_average=Zong / count;
}//计算当前班级cpp平均成绩cpp_average
void print();
//输出当前班级学生的信息
//其中学生记录中cpp_score和cpp_grade输出保留一位小数
//当前班级cpp_average输出保留一位小数;
//输出格式如下:
//第一行:教师工号 教师姓名 班级学生数 cpp_average
//第二行至第count+1行每一行输出一个学生的信息,每一行格式
// 学生学号 学生姓名 cpp_grade
//cpp_grade保留一位小数
};
void Teacher::print()
{
cout << ID << " " << name << " " << count << " "<<cpp_average << endl;
for (int i = 0; i < count ;i++)
{
cout << stu[i].ID << " " << stu[i].name << " " << setiosflags(ios::fixed)<< setprecision(1)<<stu[i].cpp_grade << " " << endl;
}
}
int main()
{
;
Teacher b;
b.count = 0;
cin >> b.name>>b.ID>>b.age;
for (int i = 0; i < 100; i++,b.count++)
{
cin >> b.stu[i].name;
if (b.stu[i].name == "0")
break;
cin >> b.stu[i].ID >> b.stu[i].age >> b.stu[i].cpp_score >> b.stu[i].cpp_count;
b.stu[i].cpp_grade = b.stu[i].cpp_score * 0.9 + b.stu[i].cpp_count * 2;
}
b.average();
b.print();
}