2021-04-21

本文介绍了如何在C++中扩展Person和Student类,创建Teacher派生类,用于管理教师信息、学生数组及计算平均成绩。通过实例展示了如何输入教师和学生数据,计算cpp总评成绩,更新学生数组,并输出班级信息,包括学生ID、姓名、cpp_grade和班级平均分cpp_average。
摘要由CSDN通过智能技术生成

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();

    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

md zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值