设计一个管理系统实现对学生的基本信息(至少包括姓名、学号、性别、出生日期、宿舍号年龄(通过计算得到)的管理;),具有数据的录入、显示、保存、查询(按学号查查询或姓名查询)、修改和删除等功能。
一.问题描述
c++设计一个管理系统实现对学生基本信息(至少包括姓名,学号,性别,出生日期,宿舍号, 龄(通过计算得到) 的管理; 具有数据的录入、显示、保存、查询(按学号或姓名查询)、 修改和删除等功能。
二.基本要求
数据的录入:允许用户输入学生信息,包括姓名、学号、性别、出生日期、宿舍号等信息。
数据的显示:可以通过界面将学生信息以表格形式显示出来。
数据的保存:在录入或修改学生信息后,需要将信息保存到文件中,以便下次打开程序时可以继续使用。
查询功能:允许用户通过学号或姓名查询学生信息,并以表格形式显示查询结果。
修改功能:允许用户修改已有的学生信息,并将修改后的信息保存到文件中。
删除功能:允许用户删除已有的学生信息,并将删除后的信息保存到文件中。
需要注意的是,为了实现上述功能,本系统需要进行一些计算和处理。例如,需要根据出生日期计算学生的年龄,以及在录入或修改学生信息时要判断数据格式是否正确、数据是否合法等。
三.需求分析
在进行需求分析时,我们需要详细描述系统所需实现的功能和使用到的技术,确定系统的输入和输出,以及考虑可能出现的特殊情况和异常处理等。
本系统需要实现以下功能:
(1)数据的录入
用户可以通过界面输入学生信息,包括姓名、学号、性别、出生日期、宿舍号等信息,并进行合法性判断。若数据格式不正确或数据有误,则程序需要给出相应提示信息并要求用户重新输入。
(2)数据的显示
系统可以将已有的学生信息以表格形式显示出来,包括姓名、学号、性别、出生日期、宿舍号以及计算得到的年龄等信息。
(3)数据的保存
在录入或修改学生信息后,程序需要将信息保存到文件中。为了保证程序正确运行,保存的文件格式需要严格满足要求。
(4)查询功能
用户可以通过学号或姓名查询学生信息,并以表格形式显示查询结果。同时,程序还需要对查询结果进行合法性判断,如信息不存在时给出相应提示信息。
(5)修改功能
允许用户修改已有的学生信息,并将修改后的信息保存到文件中。
(6)删除功能
允许用户删除已有的学生信息,并将删除后的信息保存到文件中。
四.概要设计
在进行概要设计时,我们需要确定系统的组成结构和功能模块,设计必要的数据结构和算法,并规划程序的控制流程和操作流程等。
本系统可以分为以下几个模块:
数据输入模块:负责接收用户输入的学生信息,并进行验证和合法性判断。
数据处理模块:负责对输入的学生信息进行计算、处理和保存,包括年龄的计算、信息的录入、修改和删除等。
数据输出模块:负责将处理后的学生信息以表格形式输出,包括查询结果的显示和保存的文件格式处理。
在程序的框架设计中,可以采用面向对象的思想设计一个学生类,其中包括姓名、学号、性别、出生日期、宿舍号等属性及相应的操作函数。同时需要建立一个学生信息管理类,用于对学生信息进行管理、存储、读取和操作等。
五.详细设计
在进行详细设计时,我们需要进一步设计程序的模块间接口、数据结构和算法等,并进行模块的编码和单元测试。
(1)数据输入模块
输入模块需要定义一个函数,用于接收用户输入的学生信息,参数为学生信息管理类的对象。在函数内部,需要按照一定的格式提示用户输入学生信息,并进行数据格式验证和合法性判断等。如果输入数据有误,则需要返回相应的错误信息。如果输入数据正确,则需要将学生信息添加到学生信息管理类的实例中。
示例函数框架:
void InputStudentInfo(StudentManagement& management){ //提示用户输入学生信息 //接收用户输入学生信息 //进行数据格式验证和合法性判断 //如果输入数据有误,返回错误信息 //将学生信息添加到学生信息管理类实例中 }
(2)数据处理模块
数据处理模块需要定义一个学生信息管理类,包括添加学生、修改学生、删除学生和查询学生等操作方法,同时还需要对学生的年龄进行计算和处理。
示例类框架:
class StudentManagement { public: void AddStudent(Student student); //添加学生 void ModifyStudent(Student student); //修改学生信息 void DeleteStudent(Student student); //删除学生 void QueryStudentByNum(std::string num); //按学号查询学生信息 void QueryStudentByName(std::string name); //按姓名查询学生信息 void ShowAllStudentInfo(); //显示所有学生信息 void SaveToFile(std::string filename); //将学生信息保存到文件中 void ReadFromFile(std::string filename); //从文件中读取学生信息 private: std::vector<Student> students; //存储学生信息的容器 }; class Student { public: std::string name; //学生姓名 std::string num; //学生学号 std::string gender; //学生性别 std::string birth; //学生出生日期(格式为yyyy-mm-dd) std::string room; //学生宿舍号 int age; //学生年龄 }; //计算学生年龄的函数 int CalculateAge(std::string birth) { //计算学生年龄并返回 }
(3)数据输出模块
数据输出模块需要定义一个函数,用于将学生信息以表格形式输出,包括查询结果的显示和保存的文件格式处理。
示例函数框架:
void OutputStudentInfo(Student student){ //将学生信息以表格形式输出 } void SaveStudentInfoToFile(std::vector<Student> students, std::string filename){ //将学生信息保存到文件中(可以先将学生信息转化为字符串格式,再写入文件中) }
六.调试分析
在完成程序编写后,需要进行测试和调试,确保程序的正确性和稳定性。在测试和调试时,需要注意以下事项:
对于各个模块,需要进行单元测试,确保每个模块的功能正确无误。同时,需要进行集成测试和系统测试,测试整个程序的功能。
针对可能出现的特殊情况和异常情况,需要进行相应的处理和测试,例如非法输入、文件无法读取、文件不存在等。
建议使用调试工具对程序进行调试,遇到问题及时进行排查和解决。
七.用户使用说明
对于使用本系统的用户,需要提供相应的使用说明,包括如何使用各个功能模块、如何输入和处理数据、如何保存和读取文件等。
示例使用说明:
输入学生信息:
在主界面中,选择“输入学生信息”按钮即可进入输入界面,按照提示输入学生的姓名、学号、性别、出生日期、宿舍号等信息,并点击“确认”按钮,系统将自动将学生信息保存到文件中。
查询学生信息:
在主界面中,选择“查询学生信息”按钮即可进入查询界面,在查询界面中输入学生的学号或姓名,并点击“查询”按钮,系统将查询结果以表格形式显示出来。如果查询结果不存在,系统会给出相应的提示信息。
修改学生信息:
在主界面中,选择“修改学生信息”按钮即可进入修改界面,在修改界面中输入学生的学号或姓名,并输入需要修改的信息,最后点击“确认”按钮,系统将自动将修改后的学生信息保存到文件中。
删除学生信息:
在主界面中,选择“删除学生信息”按钮即可进入删除界面,在删除界面中输入学生的学号或姓名,并点击“删除”按钮,系统将自动将删除后的学生信息保存到文件中。
八.测试结果
测试结果表明,本系统具备良好的功能和用户体验,能够有效地管理学生信息,并在输入、查询、修改和删除等方面具有较高的准确性和稳定性。
九.程序设计总结
本程序采用了C++语言进行开发,使用了面向对象的思想,通过模块化设计和分层架构,实现了对学生信息的管理和操作。通过此次程序设计,我学习了C++的一些基础概念和语法,进一步提高了我的编程技能和实践能力。
十.参考文献
《C++ Primer》
《C++编程思想》
《C++程序设计》
《C++程序设计基础》
经过以上分析得到以下代码:
#include <iostream> #include <fstream> #include <string> #include <vector> #include <iomanip> using namespace std; struct Student { string name; string id; string gender; string dorm; int age; string birth; }; const string fileName = "students.txt"; vector<Student> readStudents() { vector<Student> students; ifstream infile(fileName); if (!infile) { cout << "无法打开文件 " << fileName << endl; return students; } string line; while (getline(infile, line)) { line += ","; Student s; size_t pos = 0; string token; int count = 0; while ((pos = line.find(',')) != string::npos) { token = line.substr(0, pos); switch (count) { case 0: s.name = token; break; case 1: s.id = token; break; case 2: s.gender = token; break; case 3: s.dorm = token; break; case 4: s.age = stoi(token); break; case 5: s.birth = token; break; } line.erase(0, pos + 1); count++; } students.push_back(s); } infile.close(); return students; } void saveStudents(vector<Student>& students) { ofstream outfile(fileName); if (!outfile) { cout << "无法打开文件 " << fileName << endl; return; } for (auto&& s : students) { outfile << s.name << ',' << s.id << ',' << s.gender << ',' << s.dorm << ',' << s.age << ',' << s.birth << endl; } outfile.close(); } void displayStudents(vector<Student>& students) { cout << setw(10) << "姓名" << setw(10) << "学号" << setw(5) << "性别" << setw(10) << "宿舍号" << setw(5) << "年龄" << setw(15) << "出生日期" << endl; for (auto&& s : students) { cout << setw(10) << s.name << setw(10) << s.id << setw(5) << s.gender << setw(10) << s.dorm << setw(5) << s.age << setw(15) << s.birth << endl; } } vector<Student> searchById(vector<Student>& students, string id) { vector<Student> result; for (auto&& s : students) { if (s.id == id) { result.push_back(s); } } return result; } vector<Student> searchByName(vector<Student>& students, string name) { vector<Student> result; for (auto&& s : students) { if (s.name == name) { result.push_back(s); } } return result; } void modifyStudent(vector<Student>& students, string id) { for (auto&& s : students) { if (s.id == id) { cout << "请输入新的姓名:"; getline(cin, s.name); cout << "请输入新的性别:"; getline(cin, s.gender); cout << "请输入新的宿舍号:"; getline(cin, s.dorm); cout << "请输入新的出生日期:"; getline(cin, s.birth); s.age = 2023 - stoi(s.birth.substr(0, 4)); cout << "修改成功!" << endl; return; } } cout << "没有找到学号为 " << id << " 的学生。" << endl; } void deleteStudent(vector<Student>& students, string id) { for (auto it = students.begin(); it < students.end(); it++) { if ((*it).id == id) { students.erase(it); cout << "删除成功!" << endl; return; } } cout << "没有找到学号为 " << id << " 的学生。" << endl; } void addStudent(vector<Student>& students) { Student s; cout << "请输入姓名:"; getline(cin, s.name); cout << "请输入学号:"; getline(cin, s.id); cout << "请输入性别:"; getline(cin, s.gender); cout << "请输入宿舍号:"; getline(cin, s.dorm); cout << "请输入出生日期(格式为YYYY-MM-DD):"; getline(cin, s.birth); s.age = 2023 - stoi(s.birth.substr(0, 4)); students.push_back(s); cout << "添加成功!" << endl; } void displayMenu() { cout << "请选择操作:" << endl; cout << "1. 查看所有学生信息" << endl; cout << "2. 按学号查询学生信息" << endl; cout << "3. 按姓名查询学生信息" << endl; cout << "4. 修改学生信息" << endl; cout << "5. 删除学生信息" << endl; cout << "6. 添加学生信息" << endl; cout << "0. 退出" << endl; cout << "请选择操作:"; } int main() { vector<Student> students = readStudents(); while (true) { displayMenu(); int choice; cin >> choice; cin.get(); switch (choice) { case 1: displayStudents(students); break; case 2: { cout << "请输入要查询的学号:"; string id; getline(cin, id); vector<Student> result = searchById(students, id); if (result.size() == 0) { cout << "没有找到学号为 " << id << " 的学生。" << endl; } else { cout << "查询结果:" << endl; displayStudents(result); } break; } case 3: { cout << "请输入要查询的姓名:"; string name; getline(cin, name); vector<Student> result = searchByName(students, name); if (result.size() == 0) { cout << "没有找到姓名为 " << name << " 的学生。" << endl; } else { cout << "查询结果:" << endl; displayStudents(result); } break; } case 4: { cout << "请输入要修改的学号:"; string id; getline(cin, id); modifyStudent(students, id); saveStudents(students); break; } case 5: { cout << "请输入要删除的学号:"; string id; getline(cin, id); deleteStudent(students, id); saveStudents(students); break; } case 6: addStudent(students); saveStudents(students); break; case 0: return 0; default: cout << "无效的选项,请重新输入。" << endl; } } return 0; }
代码可以添加更多功能,博主给大家一个参考,我们可以添加一些集体录入、宿舍人员查询、不分整体删除等等。希望大家可以完善。