#include #include #include #include #include // 基类 Student class Student { protected: std::string name; std::string id; float totalScore; public: Student(const std::string &name, const std::string &id) : name(name), id(id), totalScore(0.0f) {} virtual ~Student() {} virtual void calculateTotalScore() = 0; virtual void display() const = 0; const std::string &getName() const { return name; } const std::string &getId() const { return id; } float getTotalScore() const { return totalScore; } }; // 本科生类 Undergraduate class Undergraduate : public Student { private: float usualScore; float midtermScore; float finalScore; public: Undergraduate(const std::string &name, const std::string &id, float usual, float midterm, float final) : Student(name, id), usualScore(usual), midtermScore(midterm), finalScore(final) {} void calculateTotalScore() override { totalScore = usualScore * 0.3f + midtermScore * 0.3f + finalScore * 0.4f; } void display() const override { std::cout << "姓名: " << name << ", ID: " << id << ", 平时成绩: " << usualScore << ", 期中成绩: " << midtermScore << ", 期末成绩: " << finalScore << ", 总分: " << totalScore << std::endl; } }; // 研究生类 Graduate class Graduate : public Student { private: float writtenScore; float interviewScore; public: Graduate(const std::string &name, const std::string &id, float written, float interview) : Student(name, id), writtenScore(written), interviewScore(interview) {} void calculateTotalScore() override { totalScore = writtenScore * 0.7f + interviewScore * 0.3f; } void display() const override { std::cout << "姓名: " << name << ", ID: " << id << ", 笔试成绩: " << writtenScore << ", 面试成绩: " << interviewScore << ", 总分: " << totalScore << std::endl; } }; // 学生管理类 StudentManager class StudentManager { private: std::map students; public: void addStudent(Student *student) { students[student->getId()] = student; } void removeStudent(const std::string &id) { if (students.find(id) != students.end()) { delete students[id]; students.erase(id); std::cout << "学生 " << id << " 成功删除." << std::endl; } else { std::cerr << "学生 " << id << " 不存在." << std::endl; } } void queryStudent(const std::string &id) { if (students.find(id) != students.end()) { students[id]->display(); } else { std::cerr << "学生 " << id << " 不存在." << std::endl; } } void displayAllStudents() { for (const auto &pair : students) { pair.second->display(); } } void saveToFile(const StudentManager &manager, const std::string &filename) { std::ofstream outfile(filename); if (!outfile.is_open()) { std::cerr << "文件不存在" << std::endl; return; } for (const auto &pair : manager.students) { pair.second->display(); outfile << pair.second->getName() << "," << pair.second->getId() << "," << pair.second->getTotalScore() << std::endl; } outfile.close(); std::cout << "数据成功录入." << std::endl; } }; int main() { StudentManager manager; bool running = true; int choice; while (running) { std::cout << "学生成绩管理系统\n"; std::cout << "输入1以添加学生\n"; std::cout << "输入2以查询学生\n"; std::cout << "输入3以删除学生\n"; std::cout << "输入4以展示所有学生成绩\n"; std::cout << "输入5以保存数据\n"; std::cout << "输入6以退出\n"; std::cout << "请输入你的指令: \n"; std::cin >> choice; switch (choice) { case 1: { std::string name, id, type; float score1, score2, score3; std::cout << "输入学生姓名: "; std::cin >> name; std::cout << "输入学生ID: "; std::cin >> id; std::cout << "如果是本科生请输入u,研究生则输入g :"; std::cin >> type; if (type == "u" || type == "U") { std::cout << "输入平时成绩: "; std::cin >> score1; std::cout << "输入期中成绩: "; std::cin >> score2; std::cout << "输入期末成绩: "; std::cin >> score3; std::cout << "添加成功\n"<calculateTotalScore(); manager.addStudent(undergraduate); } else if (type == "g" || type == "G") { std::cout << "输入笔试成绩: "; std::cin >> score1; std::cout << "输入面试成绩: "; std::cin >> score2; std::cout << "添加成功\n"<calculateTotalScore(); manager.addStudent(graduate); } else { std::cerr << "不存在该类型. 请重试." << std::endl; } break; } case 2: { std::string id; std::cout << "输入需要查询的学生的ID: "; std::cin >> id; manager.queryStudent(id); break; } case 3: { std::string id; std::cout << "输入需要删除的学生的ID: "; std::cin >> id; manager.removeStudent(id); break; } case 4: { manager.displayAllStudents(); break; } case 5: { std::string filename; std::cout << "输入文件名称: "; std::cin >> filename; manager.saveToFile(manager, filename); break; } case 6: { running = false; std::cout << "正在退出" << std::endl; break; } default: { std::cout << "不存在该选项,请重试." << std::endl; } } } return 0; }