C++|【20分】A. OOP 学生综合评价(虚函数和多态)

文章描述了一个C++编程问题,要求设计一个学生类(Student)作为基类,包含姓名、类别、课程成绩等属性,以及两个派生类(Undergraduate和Postgraduate)。派生类根据不同的成绩标准计算成绩等级。给定一组输入数据,程序需输出学生的信息和成绩等级。
摘要由CSDN通过智能技术生成


一、题目描述

定义学生类框架如下:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Z1Jxxx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值