ADD file via upload

main
prjuvme2c 3 months ago
parent c43a9c437d
commit d67d3cea47

@ -0,0 +1,243 @@
#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";
}
Loading…
Cancel
Save