任务描述
设计一个学生成绩管理系统,包括以下功能:
- 添加学生信息
- 删除学生信息
- 修改学生信息
- 查询学生信息
- 统计班级平均分、最高分、最低分
- 输出全班学生成绩
编程要求
- 学生信息包括姓名、学号、语文、数学、英语三门课程成绩
- 使用STL库的容器存储学生信息
- 实现类的继承与派生,派生出普通学生和优等生两个类,优等生的计算方法和普通学生不同
- 使用多态性和虚函数实现成绩计算方法的动态绑定
根据提示,在右侧编辑器补充代码,完成以上要求。
测试说明
平台会对你编写的代码进行测试:
测试输入:无(已在主函数给出测试集)
预期输出: 班级平均分:255.5
最高分:271
最低分:240
姓名:张三 学号:001 语文成绩:90 数学成绩:80 英语成绩:70
...
姓名:王二 学号:...
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <limits.h>
using namespace std;
// 学生类
class Student {
public:
virtual void calculateScore() = 0; // 计算总分和平均分的虚函数
virtual void printInfo() = 0; // 输出学生信息的虚函数
string name; // 学生姓名
string id; // 学号
int score_chinese; // 语文成绩
int score_math; // 数学成绩
int score_english; // 英语成绩
int score_total; // 总分
double score_average; // 平均分
};
// 普通学生类
class OrdinaryStudent : public Student {
public:
void calculateScore() override { // 重写虚函数
score_total = score_chinese + score_math + score_english;
score_average = score_total / 3.0;
}
void printInfo() override { // 重写虚函数
cout << "姓名:" << name << " 学号:" << id << " 语文成绩:" << score_chinese
<< " 数学成绩:" << score_math << " 英语成绩:" << score_english << endl;
}
};
// 优等生类
class ExcellentStudent : public Student {
public:
void calculateScore() override { // 重写虚函数
score_total = score_chinese * 0.8 + score_math * 1.2 + score_english * 1.0;
score_average = score_total / 3.0;
}
void printInfo() override { // 重写虚函数
cout << "姓名:" << name << " 学号:" << id << " 语文成绩:" << score_chinese
<< " 数学成绩:" << score_math << " 英语成绩:" << score_english << endl;
}
};
// 学生成绩管理系统类
class ScoreManager {
public:
void addStudent(Student* student) { // 添加学生信息
students.push_back(student);
}
void deleteStudent(int index) { // 删除学生信息
if (index >= 0 && index < students.size()) {
students.erase(students.begin() + index);
}
}
void modifyStudent(int index, Student* student) { // 修改学生信息
if (index >= 0 && index < students.size()) {
students[index] = student;
}
}
void queryStudent(string id) { // 查询学生信息
for (int i = 0; i < students.size(); i++) {
if (students[i]->id == id) {
students[i]->printInfo();
}
}
}
void calculateScore() { // 计算班级平均分、最高分、最低分
//========begin========
if (students.empty()) {
cout << "No students available." << endl;
return;
}
double totalScore = 0.0;
int highestScore = INT_MIN;
int lowestScore = INT_MAX;
for (int i = 0; i < students.size(); ++i) {
students[i]->calculateScore();
totalScore += students[i]->score_total;
if (students[i]->score_total > highestScore) {
highestScore = students[i]->score_total;
}
if (students[i]->score_total < lowestScore) {
lowestScore = students[i]->score_total;
}
}
double averageScore = totalScore / students.size();
cout << "班级平均分:" << averageScore << endl;
cout << "最高分:" << highestScore << endl;
cout << "最低分:" << lowestScore << endl;
//=========end=========
}
void printAllStudents() { // 输出全班学生成绩
for (int i = 0; i < students.size(); i++) {
students[i]->calculateScore();
students[i]->printInfo();
}
}
private:
vector<Student*> students; // 使用STL库的容器存储学生信息
};
int main() {
ScoreManager manager;
OrdinaryStudent* student1 = new OrdinaryStudent();
student1->name = "张三";
student1->id = "001";
student1->score_chinese = 90;
student1->score_math = 80;
student1->score_english = 70;
manager.addStudent(student1);
ExcellentStudent* student2 = new ExcellentStudent();
student2->name = "李四";
student2->id = "002";
student2->score_chinese = 85;
student2->score_math = 90;
student2->score_english = 95;
manager.addStudent(student2);
manager.calculateScore();
manager.printAllStudents();
manager.deleteStudent(0);
manager.modifyStudent(0, student2);
manager.queryStudent("002");
delete student1;
delete student2;
return 0;
}