#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
struct Student {
std::string name;
int id;
int age;
std::string grade;
std::string classNumber;
};
class StudentManagementSystem {
private:
std::vector<Student> students;
auto findStudent(int id) -> decltype(students.begin()) {
return std::find_if(students.begin(), students.end(),
[&](const Student& student) { return student.id == id; });
}
auto findStudentByName(const std::string& name) -> decltype(students.begin()) {
return std::find_if(students.begin(), students.end(),
[&](const Student& student) { return student.name == name; });
}
public:
void addStudent(const Student& student) {
students.push_back(student);
}
bool deleteStudent(int id) {
auto it = findStudent(id);
if (it != students.end()) {
students.erase(it);
return true;
}
return false;
}
bool deleteStudentByName(const std::string& name) {
auto it = findStudentByName(name);
if (it != students.end()) {
students.erase(it);
return true;
}
return false;
}
void setBackgroundBlue() {
std::cout << "\033[44m";
}
void displayStudents() const {
for (const auto& student : students) {
std::cout << "姓名: " << student.name << ", 学号: " << student.id << ", 年龄: " << student.age
<< ", 年级: " << student.grade << ", 班级: " << student.classNumber << std::endl;
}
}
void saveToFile(const std::string& filename) const {
std::ofstream file(filename);
for (const auto& student : students) {
file << student.name << "," << student.id << "," << student.age << "," << student.grade << "," << student.classNumber << std::endl;
}
}
void loadFromFile(const std::string& filename) {
std::ifstream file(filename);
std::string line;
while (std::getline(file, line)) {
std::istringstream iss(line);
std::string name, idStr, ageStr, grade, classNumber;
std::getline(iss, name, ',');
std::getline(iss, idStr, ',');
std::getline(iss, ageStr, ',');
std::getline(iss, grade, ',');
std::getline(iss, classNumber, ',');
int id = std::stoi(idStr);
int age = std::stoi(ageStr);
students.push_back({ name, id, age, grade, classNumber });
}
}
void displayMenu() {
void setBackgroundBlue();
std::cout << "███████╗██╗ ██╗███████╗██████╗ ██████╗ ███╗ ██╗███████╗\n";
std::cout << "██╔════╝██║ ██║██╔════╝██╔════╝██╔════╝ ████╗ ██║██╔════╝\n";
std::cout << "███████╗███████║█████╗ ██████╔██║ ██╔██╗ ██║███████╗\n";
std::cout << "╚════██║██╔══██║██╔══╝ ██╔════╝██║ ██║╚██╗██║╚════██║\n";
std::cout << "███████║██║ ██║███████╗██║ ╚██████╗██║ ╚████║███████║\n";
std::cout << "╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═════╝╚═╝ ╚═══╝╚══════╝\n";
std::cout << "\n";
std::cout << "\n";
cout << "██████████████████████████████████████████████████████████████████████████████" << endl;
cout << "█〓〓〓〓〓〓〓〓〓〓 学 生 管 理 系统 〓〓〓〓〓〓〓〓〓〓█"<< endl;
cout << "█〓〓〓〓〓〓〓★★★ ++++++++++++++ ★★★〓〓〓〓〓〓〓█ " << endl;
cout << "█〓〓〓〓〓〓〓〓〓★ 1. 添加学生 ★〓〓〓〓〓〓〓〓〓█\n";
cout << "█〓〓〓〓〓〓〓〓〓★ 2. 通过学号删除学生 ★〓〓〓〓〓〓〓〓〓█\n";
cout << "█〓〓〓〓〓〓〓〓〓★ 3. 通过姓名删除学生 ★〓〓〓〓〓〓〓〓〓█\n";
cout << "█〓〓〓〓〓〓〓〓〓★ 4. 显示学生名单 ★〓〓〓〓〓〓〓〓〓█\n";
cout << "█〓〓〓〓〓〓〓〓〓★ 5. 保存学生信息到文件 ★〓〓〓〓〓〓〓〓〓█\n";
cout << "█〓〓〓〓〓〓〓〓〓★ 6. 从文件加载学生信息 ★〓〓〓〓〓〓〓〓〓█\n";
cout << "█〓〓〓〓〓〓〓〓〓★ 0. 退出程序 ★〓〓〓〓〓〓〓〓〓█\n";
cout << "██████████████████████████████████████████████████████████████████████████████" << endl;
}
void handleChoice(StudentManagementSystem& sms, char choice) {
Student student;
int idToDelete;
std::string nameToDelete;
switch (choice) {
case '1':
std::cout << "输入学生姓名: ";
std::cin >> student.name;
std::cout << "输入学生学号: ";
std::cin >> student.id;
std::cout << "输入学生年龄: ";
std::cin >> student.age;
std::cout << "输入学生年级: ";
std::cin >> student.grade;
std::cout << "输入学生班级: ";
std::cin >> student.classNumber;
sms.addStudent(student);
break;
case '2':
std::cout << "输入要删除的学生学号: ";
std::cin >> idToDelete;
std::cout << "正在删除学生学号 '" << idToDelete << "'..." << std::endl;
if (sms.deleteStudent(idToDelete)) {
std::cout << "学生学号 '" << idToDelete << "' 删除成功。" << std::endl;
}
else {
std::cout << "未找到学生学号 '" << idToDelete << "'。" << std::endl;
}
break;
case '3':
std::cout << "输入要删除的学生姓名: ";
std::cin >> nameToDelete;
std::cout << "正在删除学生姓名 '" << nameToDelete << "'..." << std::endl;
if (sms.deleteStudentByName(nameToDelete)) {
std::cout << "学生姓名 '" << nameToDelete << "' 删除成功。" << std::endl;
}
else {
std::cout << "未找到学生姓名 '" << nameToDelete << "'。" << std::endl;
}
break;
case '4':
std::cout << "当前学生名单:" << std::endl;
sms.displayStudents();
break;
case '5':
sms.saveToFile("students.txt");
std::cout << "学生信息已保存到 students.txt。" << std::endl;
break;
case '6':
std::cout << "从文件中加载学生信息..." << std::endl;
sms.loadFromFile("students.txt");
std::cout << "加载的学生名单:" << std::endl;
sms.displayStudents();
break;
case '0':
std::cout << "退出程序。" << std::endl;
break;
default:
std::cout << "无效的选择,请重试。" << std::endl;
}
}
};
int main() {
StudentManagementSystem sms;
char choice;
do {
sms.displayMenu();
std::cout << "请输入你的选择: ";
std::cin >> choice;
sms.handleChoice(sms, std::tolower(choice));
} while (choice != '0');
return 0;
}
这个学生管理系统是一个基于控制台的简单应用程序,它允许用户通过一系列菜单选项来管理学生信息。以下是该系统的运行结果和功能的介绍:
运行结果
-
菜单显示:
当程序运行时,它首先会显示一个菜单,列出了所有可用的选项。这个菜单包括一个标题和几个带有编号的选项,用户可以通过输入相应的数字来选择他们想要执行的操作。 -
用户交互:
用户根据菜单提示输入他们的选择。根据输入的选择,程序会要求用户输入必要的信息(例如,添加学生时需要输入学生的姓名、学号、年龄、年级和班级),或者执行相应的操作(例如,删除学生、显示学生名单、保存或加载学生信息)。 -
操作反馈:
对于每个操作,程序都会提供反馈。例如,当添加或删除学生时,它会确认操作是否成功。当保存或加载学生信息时,它会通知用户文件操作的结果。 -
退出程序:
用户可以通过选择菜单中的“0”选项来退出程序。程序会关闭,不会留下任何未保存的数据(除非用户之前已经选择将数据保存到文件中)。
功能介绍
-
添加学生:
允许用户输入一个新的学生的详细信息,并将其添加到系统中。这些信息包括姓名、学号、年龄、年级和班级。 -
通过学号删除学生:
允许用户通过输入学生的学号来删除该学生的信息。如果找到了具有该学号的学生,则将其从系统中删除。 -
通过姓名删除学生:
与通过学号删除学生类似,但这次是通过输入学生的姓名来删除。 -
显示学生名单:
在控制台上列出系统中所有学生的详细信息。这对于查看当前已添加的学生非常有用。 -
保存学生信息到文件:
将学生信息保存到一个名为“students.txt”的文件中。这样,即使程序关闭,用户也可以保留他们的数据。 -
从文件加载学生信息:
从“students.txt”文件中读取学生信息,并将其加载到系统中。这对于恢复之前保存的数据非常有用。 -
退出程序:
允许用户退出程序。
注意事项
- 该系统是基于控制台的,因此它使用标准输入和输出来与用户交互。
- 它使用ASCII艺术来创建菜单,这可能会在某些终端或字体设置下看起来不太清晰。
- 它将数据保存在一个简单的文本文件中,这意味着数据格式是易于阅读和编辑的,但也可能更容易受到损坏或篡改。
- 该系统没有实现用户身份验证或权限管理,因此任何能够访问程序的人都可以执行所有操作。在实际应用中,这可能需要额外的安全措施。