一、题目描述
定义学生类框架如下:
class Student{
protected:
string name; //学生姓名
int type; //学生类别:1表示本科生,2表示研究生
int courses[3]; //3门课的成绩
string courseGrade; //成绩等级
public:
Student(string n,string t,int a1,int a2,int a3);//构造方法
virtual void calculateGrade()=0;//计算成绩等级
void print();//输出信息
}
要求如下:
1.请设计3个类,分别是学生类Student,本科生类Undergraduate,研究生类Postgraduate,其中Student类是基类,它包含基本的学生信息,如姓名、类别(本科生还是研究生)、所学课程(这里假定为3门课,用数组表示)成绩和成绩等级等;
2.Undergraduate类和Postgraduate都是Student类的派生类,它们之间的主要差别是计算3门课程平均成绩等级的方法有所不同,研究生的标准要比本科生的标准高一些,如下表所示:
3.以Student为基类,构建出Undergraduate、Postgraduate两个类。
4.要求主函数中有一个基类指针,生成基类动态数组,来接收子类对象。
二、输入与输出
1.输入
第一行表示测试次数。
从第二行开始,每个测试用例占一行,每行数据意义如下:学生姓名、学生类别(1为本科生,2为研究生)、3门课的成绩。
4
张三 1 30 45 50
李四 2 45 65 35
王五 1 66 77 88
赵刘 2 77 88 99
2.输出
学生姓名、类别、成绩等级
张三,本科生,不及格
李四,研究生,不及格
王五,本科生,良好
赵刘,研究生,良好
三、参考代码
#include <iostream>
#include <cmath>
#include <string>
#include <iomanip>
using namespace std;
class stu
{
protected:
string name;
int t;
int c[3];
string cg;
public:
stu() {}
stu(string n, int t1, int a1, int a2, int a3)
{
name = n;
t = t1;
c[0] = a1;
c[1] = a2;
c[2] = a3;
}
virtual void cal() = 0;
void pri()
{
cout << name << ",";
if (t == 1)
{
cout << "本科生,";
}
else
{
cout << "研究生,";
}
}
};
class un :virtual public stu
{
public:
un(){}
un(string n, int t1, int a1, int a2, int a3) :stu(n, t1, a1, a2, a3) {}
void cal()
{
int sum = (c[1] + c[2] + c[0]) / 3;
if (sum > 80 && sum <= 100)
{
cout << "优秀";
}
else if (sum > 70 && sum <= 80)
{
cout << "良好";
}
else if (sum > 60 && sum <= 70)
{
cout << "一般";
}
else if (sum > 50 && sum <= 60)
{
cout << "及格";
}
else if (sum <= 50)
{
cout << "不及格";
}
}
};
class post :virtual public stu
{
public:
post(string n, int t1, int a1, int a2, int a3) :stu(n, t1, a1, a2, a3) {}
void cal()
{
int sum = (c[1] + c[0] + c[2]) / 3;
if (sum > 90 && sum <= 100)
{
cout << "优秀";
}
else if (sum > 80 && sum <= 90)
{
cout << "良好";
}
else if (sum > 70 && sum <= 80)
{
cout << "一般";
}
else if (sum > 60 && sum <= 70)
{
cout << "及格";
}
else if(sum<=60)
{
cout << "不及格";
}
}
};
int main()
{
int sum;
cin >> sum;
string name;
int t;
int num1;
int num2;
int num3;
auto** b = new stu*[sum];
for (int i = 0; i < sum; i++)
{
cin >> name >> t >> num1 >> num2 >> num3;
if (t == 1) {
b[i] = new un(name, t, num1, num2, num3);
}
if (t == 2)
{
b[i] = new post(name, t, num1, num2, num3);
}
}
for (int i = 0; i < sum; i++)
{
b[i]->pri();
b[i]->cal();
cout << endl;
}
return 0;
}