You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
student-grade-manager/C++ student-grade-manager.cpp

243 lines
7.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <limits>
using namespace std;
struct Student {
string id;
string name;
vector<float> scores;
float total;
};
// 输入学生信息
// 添加总分计算函数
void calculateTotal(Student& s) {
s.total = s.scores[0] + s.scores[1] + s.scores[2];
}
// 修改输入学生信息函数
// 新增学号输入函数
void inputStudentId(Student& s) {
while(true) {
cout << "输入学号: ";
cin >> s.id;
if(s.id.find_first_not_of("0123456789") == string::npos) break;
cout << "学号必须为纯数字,请重新输入!\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
}
// 修改后的学生信息输入
void inputStudentInfo(Student& s) {
cout << "输入姓名: ";
cin >> s.name;
s.scores.resize(3);
cout << "输入语文成绩: ";
cin >> s.scores[0];
cout << "输入数学成绩: ";
cin >> s.scores[1];
cout << "输入英语成绩: ";
cin >> s.scores[2];
calculateTotal(s);
}
// 前向声明printStudent函数
void printStudent(const Student& s);
// 学生管理系统类
class StudentManager {
private:
vector<Student> students;
public:
// 添加学生(修复丢失的成员函数)
void addStudent() {
Student s;
// 学号验证循环
do {
inputStudentId(s);
auto exist = find_if(students.begin(), students.end(),
[&](const Student& stu){ return stu.id == s.id; });
if (exist == students.end()) break;
cout << "学号已存在,请重新输入!\n";
} while(true);
// 输入其他信息
inputStudentInfo(s);
students.push_back(s);
cout << "添加成功!\n";
}
// 显示全部学生(始终按学号排序)
// 显示全部学生
void displayAll() {
if (students.empty()) {
cout << "当前没有学生记录\n";
return;
}
// 创建临时副本进行排序
vector<Student> temp = students;
sort(temp.begin(), temp.end(), [](const Student& a, const Student& b) {
// 修改为升序排列:先比长度,短的在前;长度相同按字典序升序
if (a.id.length() != b.id.length())
return a.id.length() < b.id.length();
return a.id < b.id;
});
for_each(temp.begin(), temp.end(), printStudent);
}
// 按总分排序(不修改原始数据)
void sortByTotal() {
if(students.empty()) {
cout << "当前没有学生记录\n";
return;
}
vector<Student> temp = students;
sort(temp.begin(), temp.end(),
[](const Student& a, const Student& b){ return a.total > b.total; });
cout << "=== 总分排序结果 ===\n";
for_each(temp.begin(), temp.end(), printStudent);
}
// 删除学生
void deleteStudent(const string& id) {
auto it = find_if(students.begin(), students.end(),
[&](const Student& s){ return s.id == id; });
if (it != students.end()) {
students.erase(it);
cout << "删除成功\n";
} else {
cout << "未找到该学生\n";
}
}
// 修改学生信息
// 修正修改学生信息逻辑
// 修改学生信息
void modifyStudent(const string& id) {
auto it = find_if(students.begin(), students.end(),
[&](const Student& s){ return s.id == id; });
if (it != students.end()) {
Student original = *it; // 保存完整原始数据
// 输入学号并进行验证
inputStudentId(*it);
// 检查学号是否重复(排除自己)
if (it->id != original.id) {
auto conflict = find_if(students.begin(), students.end(),
[&](const Student& s){ return s.id == it->id && &s != &(*it); });
if (conflict != students.end()) {
cout << "错误:学号已存在!\n";
*it = original; // 恢复全部原始数据
return;
}
}
// 输入其他信息
inputStudentInfo(*it);
cout << "修改成功\n";
} else {
cout << "未找到该学生\n";
}
}
// 新增查询学生函数
void queryStudent(const string& id) {
auto it = find_if(students.begin(), students.end(),
[&](const Student& s){ return s.id == id; });
if (it != students.end()) {
printStudent(*it);
} else {
cout << "未找到学号为 " << id << " 的学生\n";
}
}
};
// 修改菜单界面
void showMenu() {
cout << "\n====== 学生成绩管理系统 ======\n"
<< "1. 添加学生\n"
<< "2. 显示所有学生\n"
<< "3. 按总分排序\n"
<< "4. 删除学生\n"
<< "5. 修改学生信息\n"
<< "6. 查询学生信息\n" // 新增菜单项
<< "0. 退出\n"
<< "=============================\n"
<< "请选择操作: ";
}
int main() {
StudentManager manager;
int choice = -1; // 初始化为非0值
string tmpId;
do {
showMenu();
if (!(cin >> choice)) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "请输入数字选项!" << endl;
choice = -1; // 重置为无效值
continue;
}
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 统一处理换行符
switch(choice) {
case 1:
manager.addStudent();
break;
case 2:
manager.displayAll();
break;
case 3:
manager.sortByTotal();
break;
case 4:
cout << "输入要删除的学号: ";
cin >> tmpId;
manager.deleteStudent(tmpId);
break;
case 5:
cout << "输入要修改的学号: ";
cin >> tmpId;
manager.modifyStudent(tmpId);
break;
case 6:
cout << "输入要查询的学号: ";
cin >> tmpId;
manager.queryStudent(tmpId);
break;
case 0:
cout << "感谢使用,再见!\n";
break;
default:
cout << "无效输入,请重新选择!\n";
// 删除此处的ignore已在主循环统一处理
}
} while(choice != 0); // 只有当明确输入0时退出
return 0;
}
// 后续补充printStudent的具体实现
void printStudent(const Student& s) {
cout << "学号: " << s.id
<< "\t姓名: " << s.name
<< "\t总分: " << s.total
<< " (语文:" << s.scores[0]
<< " 数学:" << s.scores[1]
<< " 英语:" << s.scores[2] << ")\n";
}