软件开发与创新作业1-逆向-学生选课系统

来源:https://github.com/CurtainXT/Student_Management_System
运行环境:Visual Studio 2022

运行结果:



主要代码:

点击查看代码
#include"StuManage.h"/*-------------------------------学生工具组--------------------------------*/
// 查看备选课程信息
void StudentModuleTools::CheckOptionalCourses(const CourseData& data)
{// 用于保存所有可以选择的课程信息CourseData temp;for (size_t i = 0; i < data.data.size(); i++){if (!data.data[i].isFull()){temp.data.push_back(data.data[i]);}}std::cout << std::endl;std::cout << "可以选择的课程有:" << std::endl;// 打印所有可选课程信息for (size_t i = 0; i < temp.data.size(); i++){std::cout << temp.data[i].GetCourseNum()<< " "<< temp.data[i].GetCourseName()<< " "<< temp.data[i].GetCourseCredit()<< " "<< temp.data[i].GetTeacherName()<< std::endl;}
}// 按照课程编号选课
void StudentModuleTools::SelectCourse(CourseData& cData, StudentCourseData& scData, const Student& user)
{std::cout << std::endl;std::cout << "请输入课程编号" << std::endl;std::string courseNumTemp;std::cin >> courseNumTemp;std::cin.get();for (size_t i = 0; i < cData.data.size(); i++){// 查找该课程编号if (cData.data[i].GetCourseNum() == courseNumTemp){// 验证该课程是否已满if (!cData.data[i].isFull()){// 查找到该用户的学生选课数据StudentCourse* user_sc = NULL;for (size_t c = 0; c < scData.data.size(); c++){if (scData.data[c].GetID() == user.GetID()){// 如果找到了,添加引用user_sc = &(scData.data[c]);}}// 检查选课是否重复bool isSelected = false;for (size_t i = 0; i < user_sc->selectedCourses.size(); i++){// 如果要选择的课程已经被选择if (courseNumTemp == (*user_sc).selectedCourses[i].GetCourseNum()){isSelected = true;}}// 如果没有重复if (!isSelected){std::cout << "已选择课程:" << std::endl;std::cout << cData.data[i].GetCourseNum()<< " "<< cData.data[i].GetCourseName()<< std::endl;// 将课程的已选人数加一cData.data[i].AddOnePopulation();// 将学生选课的总选课数加一user_sc->AddOneSeletedCourseNum();// 在学生课程数据中添加该选课信息user_sc->selectedCourses.push_back(cData.data[i]);}else{std::cout << "该课程已经被选择过了" << std::endl;break;}}else{std::cout << "该课程已满" << std::endl;break;}}}
}// 查看已选课程信息和累计学分
void StudentModuleTools::CheckSelected_n_totalCred(const StudentCourseData& scData, const Student& user)
{// 查找到该用户的学生选课数据const StudentCourse* user_sc = NULL;for (size_t c = 0; c < scData.data.size(); c++){if (scData.data[c].GetID() == user.GetID()){// 如果找到了,添加引用user_sc = &(scData.data[c]);}}if (user_sc == NULL){std::cout << "未找到该学生的选课信息!" << std::endl;return;}else{std::cout << "你的已选课程有:" << std::endl;if (user_sc->selectedCourses.size() == 0){std::cout << "你还没有进行任何选课!" << std::endl;}else{for (size_t i = 0; i < user_sc->selectedCourses.size(); i++){std::cout << user_sc->selectedCourses[i].GetCourseNum() << " "<< user_sc->selectedCourses[i].GetCourseName() << std::endl;}std::cout << "总共学分为:" << user_sc->GetTotalCredits() << std::endl;}}
}/*-------------------------------管理员工具组--------------------------------*/
// 增加学生信息
void ManagerModuleTools::Manage_Add(StudentData& sData, StudentCourseData& scData)
{// 想用户获取信息std::cout << "请输入要添加的学生信息:" << std::endl;std::string data1;std::string data2;std::string data3;std::string data4;std::string data5;std::cout << "请输入专业:";std::cin >> data1;std::cout << "请输入班级:";std::cin >> data2;std::cout << "请输入学号:";std::cin >> data3;std::cout << "请输入姓名:";std::cin >> data4;std::cout << "请输入登录密码:";std::cin >> data5;std::cin.get();// 将获得的信息用于构造新的数据对象Student stemp(data1, data2, data3, data4, data5);StudentCourse sctemp(data1, data2, data3, data4);// 将新数据添加到数据容器中sData.data.push_back(stemp);scData.data.push_back(sctemp);std::cout << "添加成功!" << std::endl;
}// 删除学生信息
void ManagerModuleTools::Manage_Delete(StudentData& sData, StudentCourseData& scData, CourseData& cData)
{while (true){std::string stuID;std::cout << "请输入要删除学生的学号:" << std::endl;std::cin >> stuID;std::cin.get();bool is_stu_success = false;bool is_sc_success = false;for (size_t i = 0; i < sData.data.size(); i++){if (sData.data[i].GetID() == stuID){// 删除学生数据auto iter = sData.data.begin() + i;sData.data.erase(iter);is_stu_success = true;break;}}for (size_t i = 0; i < scData.data.size(); i++){if (scData.data[i].GetID() == stuID){// 存储课号std::vector<std::string> courseNums;// 删除之前修改他已选课程的选课人数数据for (int c = 0; c < scData.data[i].GetSelectedCourseNum(); c++){//拿到所有已选课的课号courseNums.push_back(scData.data[i].selectedCourses[c].GetCourseNum());}for (size_t r = 0; r < courseNums.size(); r++){// 将课程的已选人数减一for (size_t d = 0; d < cData.data.size(); d++){if (courseNums[r] == cData.data[d].GetCourseNum()){cData.data[d].MinusOnePopulation();break;}}}// 删除学生选课数据auto iter = scData.data.begin() + i;scData.data.erase(iter);is_sc_success = true;break;}}if (is_stu_success && is_sc_success){std::cout << "成功删除学生信息!" << std::endl;break;}else{std::cout << "未找到该学生信息,请重新输入!" << std::endl;}}
}// 修改学生信息
void ManagerModuleTools::Manage_Change(StudentData& sData, CourseData& cData, StudentCourseData& scData)
{// 找到该用户Student* p_stemp = NULL;StudentCourse* p_sctemp = NULL;while (true){std::cout << "请输入想要修改的学生的学号" << std::endl;std::string stuID;std::cin >> stuID;std::cin.get();bool is_stu_find = false;bool is_sc_find = false;// 找到学生数据for (size_t i = 0; i < sData.data.size(); i++){if (stuID == sData.data[i].GetID()){is_stu_find = true;p_stemp = &(sData.data[i]);break;}}// 找到学生选课数据for (size_t i = 0; i < scData.data.size(); i++){if (stuID == scData.data[i].GetID()){is_sc_find = true;p_sctemp = &(scData.data[i]);// 修改数据之前,先将原数据的选课记录删除std::vector<std::string> courseNums; // 存储课号// 删除之前修改他已选课程的选课人数数据for (int c = 0; c < p_sctemp->GetSelectedCourseNum(); c++){//拿到所有已选课的课号courseNums.push_back(scData.data[i].selectedCourses[c].GetCourseNum());}for (size_t r = 0; r < courseNums.size(); r++){// 将课程的已选人数减一for (size_t d = 0; d < cData.data.size(); d++){if (courseNums[r] == cData.data[d].GetCourseNum()){cData.data[d].MinusOnePopulation();break;}}}break;}}// 确认是否找到了用户if (is_stu_find && is_sc_find){break;}else{std::cout << "没有找到该用户,请重新输入" << std::endl;}}std::cout << "请输入修改以后的数据" << std::endl;std::string data1;std::string data2;std::string data3;std::string data4;std::string data5;std::cout << "请输入专业:";std::cin >> data1;std::cout << "请输入班级:";std::cin >> data2;std::cout << "请输入学号:";std::cin >> data3;std::cout << "请输入姓名:";std::cin >> data4;std::cout << "请输入登录密码:";std::cin >> data5;std::cout << "修改成功!" << std::endl;Student stemp(data1, data2, data3, data4, data5);StudentCourse sctemp(data1, data2, data3, data4);*p_stemp = stemp;*p_sctemp = sctemp;
}// 查找学生信息
void ManagerModuleTools::Manage_CheckStudentData(const StudentData& sData)
{while (true){// 是查看全部还是查看个别std::cout << "A - 查看全部" << std::endl;std::cout << "B - 查看单个" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){for (size_t i = 0; i < sData.data.size(); i++){std::cout << sData.data[i].GetMajor()<< " "<< sData.data[i].GetClassNum()<< " "<< sData.data[i].GetID()<< " "<< sData.data[i].GetName()<< " "<< sData.data[i].GetPassword()<< std::endl;}break;}else if (a == 'B' || a == 'b'){std::cout << "请输入要查找的学生学号" << std::endl;std::string stuID;std::cin >> stuID;std::cin.get();// 找到该用户const Student* p_temp = NULL;while (true){bool is_find = false;for (size_t i = 0; i < sData.data.size(); i++){if (stuID == sData.data[i].GetID()){is_find = true;p_temp = &(sData.data[i]);}}if (is_find){break;}else{std::cout << "没有找到该用户,请重新输入" << std::endl;}}std::cout << "专业:" << p_temp->GetMajor()<< std::endl<< "班级:" << p_temp->GetClassNum()<< std::endl<< "学号:" << p_temp->GetID()<< std::endl<< "姓名:" << p_temp->GetName()<< std::endl<< "登录密码:" << p_temp->GetPassword();break;}else{std::cout << "请输入正确字符!" << std::endl;}}
}// 增加课程信息
void ManagerModuleTools::Manage_Add(CourseData& cData)
{std::string data1;std::string data2;int data3;int data4;int data5 = 0;std::string data6;std::cout << "输入新课程课号" << std::endl;;std::cin >> data1;std::cout << "输入新课程名称" << std::endl;std::cin >> data2;std::cout << "输入新课程学分" << std::endl;std::cin >> data3;std::cout << "输入新课程人数上限" << std::endl;std::cin >> data4;std::cout << "输入新课程授课老师" << std::endl;std::cin >> data6;std::cin.get();cData.data.push_back(Course(data1, data2, data3, data4, data5, data6));std::cout << "添加成功!" << std::endl;
}//// 删除课程信息
void ManagerModuleTools::Manage_Delete(CourseData& cData, StudentCourseData& scData)
{std::cout << "输入要删除课程的课程号" << std::endl;std::string courseNum;std::cin >> courseNum;std::cin.get();// 删除所有学生选课中本课程的记录for (size_t i = 0; i < scData.data.size(); i++){// 如果该学生选了课if (scData.data[i].GetSelectedCourseNum() > 0){// 查找其中是否有该课程for (size_t c = 0; c < scData.data[i].selectedCourses.size(); c++){// 如果有,删除选课记录if (courseNum == scData.data[i].selectedCourses[c].GetCourseNum()){auto iter = scData.data[i].selectedCourses.begin() + c;scData.data[i].selectedCourses.erase(iter);scData.data[i].MinusOneSeletedCourseNum();break;}}}}// 在课程数据容器中找到该课程for (size_t i = 0; i < cData.data.size(); i++){if (courseNum == cData.data[i].GetCourseNum()){// 删除它auto iter = cData.data.begin() + i;cData.data.erase(iter);break;}}std::cout << "删除成功!" << std::endl;
}// 修改课程信息
void ManagerModuleTools::Manage_Change(CourseData& cData, StudentCourseData& scData)
{// 找到该课程Course* p_ctemp = NULL;while (true){std::cout << "请输入想要修改的课程编号:" << std::endl;std::string courseNum;std::cin >> courseNum;std::cin.get();bool is_course_find = false;// 找到课程数据for (size_t i = 0; i < cData.data.size(); i++){if (courseNum == cData.data[i].GetCourseNum()){is_course_find = true;p_ctemp = &(cData.data[i]);break;}}// 修改课程信息std::string data1;int data2;bool is_find = false;do{std::cout << "选择要修改的课程信息" << std::endl;std::cout << "A - 课程编号" << std::endl;std::cout << "B - 课程名称" << std::endl;std::cout << "C - 学分" << std::endl;std::cout << "D - 授课老师" << std::endl;char a = std::cin.get();std::cin.get();switch (a){case 'A':case 'a':std::cout << "请输入新的课程编号" << std::endl;std::cin >> data1;std::cin.get();p_ctemp->SetCourseNum(data1);is_find = true;break;case 'B':case 'b':std::cout << "请输入新的课程名称" << std::endl;std::cin >> data1;std::cin.get();p_ctemp->SetTeacherName(data1);is_find = true;break;case 'C':case 'c':std::cout << "请输入新的学分" << std::endl;std::cin >> data2;std::cin.get();p_ctemp->SetCourseCredit(data2);is_find = true;break;case 'D':case 'd':std::cout << "请输入新的授课老师" << std::endl;std::cin >> data1;std::cin.get();p_ctemp->SetTeacherName(data1);is_find = true;break;default:std::cout << "请输入正确字符";break;}} while (!is_find);// 找到学生选课数据中的所有本课程for (size_t i = 0; i < scData.data.size(); i++){// 该学生有选课if (scData.data[i].GetSelectedCourseNum() > 0){// 查找是否选了该课程for (size_t c = 0; c < scData.data[i].selectedCourses.size(); c++){// 如果选了if (scData.data[i].selectedCourses[c].GetCourseNum() == courseNum){// 更新课程数据的修改scData.data[i].selectedCourses[c] = Course(p_ctemp->GetCourseNum(), p_ctemp->GetCourseName(), p_ctemp->GetCourseCredit(), p_ctemp->GetTeacherName());break;}}}}// 确认是否找到了用户if (is_course_find){break;}else{std::cout << "没有找到该用户,请重新输入" << std::endl;}}
}// 查看课程信息
void ManagerModuleTools::Manage_CheckCourseData(const CourseData& cData)
{const Course* p_ctemp = NULL;while (true){// 是查看全部还是查看个别std::cout << "A - 查看全部" << std::endl;std::cout << "B - 查看单个" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){for (size_t i = 0; i < cData.data.size(); i++){std::cout << cData.data[i].GetCourseNum()<< " "<< cData.data[i].GetCourseName()<< " "<< cData.data[i].GetCourseCredit()<< " "<< cData.data[i].GetCourseLimit()<< " "<< cData.data[i].GetCoursePop()<< " "<< cData.data[i].GetTeacherName()<< std::endl;}break;}else if (a == 'B' || a == 'b'){std::cout << "请输入想要查找的课程编号:" << std::endl;std::string courseNum;std::cin >> courseNum;std::cin.get();bool is_course_find = false;// 找到课程数据for (size_t i = 0; i < cData.data.size(); i++){if (courseNum == cData.data[i].GetCourseNum()){is_course_find = true;p_ctemp = &(cData.data[i]);break;}}std::cout << "课程编号:" << p_ctemp->GetCourseNum()<< std::endl<< "课程名称:" << p_ctemp->GetCourseName()<< std::endl<< "学分:" << p_ctemp->GetCourseCredit()<< std::endl<< "人数上限:" << p_ctemp->GetCourseLimit()<< std::endl<< "已选人数:" << p_ctemp->GetCoursePop()<< std::endl<< "教师名称:" << p_ctemp->GetTeacherName()<< std::endl;break;}else{std::cout << "请输入正确字符!" << std::endl;}}
}// 查看选课信息
void ManagerModuleTools::Manage_CheckStudentCourseData(const StudentCourseData& scData)
{while (true){std::cout << "你想进行那种查询?" << std::endl;std::cout << "A - 按照课程查询所有学生" << std::endl;std::cout << "B - 按照学生查询所有选课" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){// 按照课程查询所有学生std::cout << "请输入课程编号:" << std::endl;std::string courseNum;std::cin >> courseNum;std::cin.get();// 临时存储所有已选该课程的学生信息std::vector<StudentCourse> scTempData;for (size_t i = 0; i < scData.data.size(); i++){// 该学生有选课if (scData.data[i].GetSelectedCourseNum() > 0){for (size_t c = 0; c < scData.data[i].selectedCourses.size(); c++){// 如果说找到了该课程if (scData.data[i].selectedCourses[i].GetCourseNum() == courseNum){scTempData.push_back(scData.data[i]);break;}}}}// 输出所有找到的学生信息std::cout << "选择了该课程的学生有:" << std::endl;if (scTempData.size() == 0){std::cout << "目前还无人选择该课程" << std::endl;}else{for (size_t i = 0; i < scTempData.size(); i++){std::cout << scTempData[i].GetID()<< " "<< scTempData[i].GetName()<< std::endl;}}break;}else if (a == 'B' || a == 'b'){// 按照学生查询所有选课std::cout << "请输入学号:" << std::endl;std::string stuID;std::cin >> stuID;std::cin.get();// 查找到该学生的学生选课数据for (size_t i = 0; i < scData.data.size(); i++){if (scData.data[i].GetID() == stuID){std::cout << scData.data[i].GetID() << " " << scData.data[i].GetName()<< " "<< "已选择的课程有:"<< std::endl;if (scData.data[i].selectedCourses.size() == 0){std::cout << "该同学还未进行任何选课" << std::endl;}else{for (size_t c = 0; c < scData.data[i].selectedCourses.size(); c++){std::cout << scData.data[i].selectedCourses[i].GetCourseNum() << " " << scData.data[i].selectedCourses[i].GetCourseName() << std::endl;}}}}break;}else{std::cout << "请输入正确字符!" << std::endl;}}
}/*-------------------------------程序逻辑组--------------------------------*/
// 登录身份判定
bool Log()
{std::cout << "欢迎使用学生系统!" << std::endl;std::cout << "请根据您的身份输入‘A’或‘B’:" << std::endl;std::cout << "A - 我是学生" << std::endl;std::cout << "B - 我是管理员" << std::endl;// 选择身份while (true){char a = std::cin.get();if (a == 'A' || a == 'a'){return 1;}else if (a == 'B' || a == 'b'){return 0;}else{std::cout << "请输入正确的字符" << std::endl;std::cin.get();}}
}// 登录系统
bool Register(const StudentData& sData, const ManagerData& mData, const User* (*user))
{//根据选择结果来调用相应的登录系统模块bool isStudent = Log();if (isStudent){// 传递登录时填写的用户信息*user = StudentRegister(sData);}else{// 传递登录时填写的用户信息*user = ManagerRegister(mData);}return isStudent;
}// 学生登录模块
const Student* StudentRegister(const StudentData& data)
{std::cout << "你好, 请输入学号:" << std::endl;std::string stuID;  //用于临时存储学号信息std::cin >> stuID;const Student* temp;// 查找该学生temp = FindStudent(stuID, data);std::cout << "请输入登录密码:" << std::endl;while (true){std::string password;std::cin >> password;std::cin.get();// 验证密码if (Verification(*temp, password)){std::cout << "欢迎进入学生系统!" << std::endl;break;}else{std::cout << "密码错误,请重新输入" << std::endl;}}return temp;
}// 管理员登录模块
const Manager* ManagerRegister(const ManagerData& data)
{const Manager* temp;std::cout << "您好,请输入用户名:" << std::endl;// 查找该管理员temp = FindManager(data);std::cout << "请输入密码" << std::endl;while (true){std::string password;std::cin >> password;std::cin.get();// 验证密码if (Verification(data, password)){std::cout << "欢迎进入管理员系统!" << std::endl;break;}else{std::cout << "密码错误,请重新输入" << std::endl;}}return temp;
}// 验证学生密码
bool Verification(const Student& user, const std::string password)
{if (user.GetPassword() == password){return true;}else{return false;}
}// 验证管理员密码
bool Verification(const ManagerData& data, const std::string password)
{std::vector<std::string> passwords;auto end = data.data.end();for (auto i = data.data.begin(); i < end; i++){if (i->GetPassword() == password){return true;}}return false;
}// 查找学生是否存在
const Student* FindStudent(const std::string temp, const StudentData& data)
{// 用于返回值const Student* stemp = NULL;while (true){bool is_find = false;auto end = data.data.end();for (auto i = data.data.begin(); i < end; i++){if (i->GetID() == temp){stemp = &(*i);is_find = true;std::cout << "你好 " + i->GetName() << std::endl;break;}}if (is_find){return stemp;}else{std::cout << "没有找到该用户,请重新输入" << std::endl;}}
}// 查找管理员是否存在
const Manager* FindManager(const ManagerData& data)
{const Manager* mtemp = NULL;while (true){std::string temp;std::cin >> temp;bool is_find = false;auto end = data.data.end();for (auto i = data.data.begin(); i < end; i++){if (i->GetName() == temp){mtemp = &(*i);is_find = true;std::cout << "你好 " + i->GetName() << std::endl;break;}}if (is_find){return mtemp;}else{std::cout << "没有找到该管理员,请重新输入" << std::endl;}}}// 学生系统选项
void StudentSystem(StudentModuleTools tools, CourseData& cData, StudentCourseData& scData, Student s)
{while (true){std::cout << "请选择你接下来的操作:" << std::endl;std::cout << "A - 查看备选课程信息" << std::endl;std::cout << "B - 按照课程编号选课" << std::endl;std::cout << "C - 查看已选课程信息和累计学分" << std::endl;std::cout << "D - 退出系统" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){tools.CheckOptionalCourses(cData);}else if (a == 'B' || a == 'b'){tools.SelectCourse(cData, scData, s);}else if (a == 'C' || a == 'c'){tools.CheckSelected_n_totalCred(scData, s);}else if (a == 'D' || a == 'd'){break;}else{std::cout << "请输入正确的字符" << std::endl;}std::cout << std::endl;}
}// 管理员系统选项
void ManagerSystem(ManagerModuleTools tools, StudentData& sData, ManagerData& mData, CourseData& cData, StudentCourseData& scData, Manager m)
{while (true){std::cout << "请选择你接下来的操作:" << std::endl;std::cout << "A - 增加数据" << std::endl;std::cout << "B - 删除数据" << std::endl;std::cout << "C - 修改数据" << std::endl;std::cout << "D - 查看数据" << std::endl;std::cout << "E - 退出" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){// 增加数据while (true){std::cout << "请选择你接下来的操作:" << std::endl;std::cout << "A - 增加学生数据" << std::endl;std::cout << "B - 增加课程数据" << std::endl;std::cout << "C - 返回上一步" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){tools.Manage_Add(sData, scData);}else if (a == 'B' || a == 'b'){tools.Manage_Add(cData);}else if (a == 'C' || a == 'c'){break;}else{std::cout << "请输入正确的字符" << std::endl;}std::cout << std::endl;}}else if (a == 'B' || a == 'b'){// 删除数据while (true){std::cout << "请选择你接下来的操作:" << std::endl;std::cout << "A - 删除学生数据" << std::endl;std::cout << "B - 删除课程数据" << std::endl;std::cout << "C - 返回上一步" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){tools.Manage_Delete(sData, scData, cData);}else if (a == 'B' || a == 'b'){tools.Manage_Delete(cData, scData);}else if (a == 'C' || a == 'c'){break;}else{std::cout << "请输入正确的字符" << std::endl;}std::cout << std::endl;}}else if (a == 'C' || a == 'c'){// 修改数据while (true){std::cout << "请选择你接下来的操作:" << std::endl;std::cout << "A - 修改学生数据" << std::endl;std::cout << "B - 修改课程数据" << std::endl;std::cout << "C - 返回上一步" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){tools.Manage_Change(sData, cData, scData);}else if (a == 'B' || a == 'b'){tools.Manage_Change(cData, scData);}else if (a == 'C' || a == 'c'){break;}else{std::cout << "请输入正确的字符" << std::endl;}std::cout << std::endl;}}else if (a == 'D' || a == 'd'){// 查看数据while (true){std::cout << "请选择你接下来的操作:" << std::endl;std::cout << "A - 查看学生数据" << std::endl;std::cout << "B - 查看课程数据" << std::endl;std::cout << "C - 查看学生选课数据" << std::endl;std::cout << "D - 返回上一步" << std::endl;char a = std::cin.get();std::cin.get();if (a == 'A' || a == 'a'){tools.Manage_CheckStudentData(sData);}else if (a == 'B' || a == 'b'){tools.Manage_CheckCourseData(cData);}else if (a == 'C' || a == 'c'){tools.Manage_CheckStudentCourseData(scData);}else if (a == 'D' || a == 'd'){break;}else{std::cout << "请输入正确的字符" << std::endl;}std::cout << std::endl;}}else if (a == 'E' || a == 'e'){break;}else{std::cout << "请输入正确的字符" << std::endl;}std::cout << std::endl;}
}

原作者将学生选课系统做的十分完善,尤其是管理员系统部分
功能可由下图简要展示:

运行中发现的bug及修改:
1.学生或管理员身份进入时学号输入错误后会一直循环

修改前相关代码:(此处只展示学生部分,管理员部分同理)

点击查看代码
// 学生登录模块
const Student* StudentRegister(const StudentData& data)
{std::cout << "你好, 请输入学号:" << std::endl;std::string stuID;  //用于临时存储学号信息std::cin >> stuID;const Student* temp;// 查找该学生temp = FindStudent(stuID, data);std::cout << "请输入登录密码:" << std::endl;while (true){std::string password;std::cin >> password;std::cin.get();// 验证密码if (Verification(*temp, password)){std::cout << "欢迎进入学生系统!" << std::endl;break;}else{std::cout << "密码错误,请重新输入" << std::endl;}}return temp;
}// 查找学生是否存在
const Student* FindStudent(const std::string temp, const StudentData& data)
{// 用于返回值const Student* stemp = NULL;while (true){bool is_find = false;auto end = data.data.end();for (auto i = data.data.begin(); i < end; i++){if (i->GetID() == temp){stemp = &(*i);is_find = true;std::cout << "你好 " + i->GetName() << std::endl;break;}}if (is_find){return stemp;}else{std::cout << "没有找到该用户,请重新输入" << std::endl;}}
}

修改后运行结果:

修改后相关代码:

点击查看代码
// 学生登录模块
const Student* StudentRegister(const StudentData& data)
{const Student* temp = NULL;do{std::cout << "你好, 请输入学号:" << std::endl;std::string stuID;  //用于临时存储学号信息std::cin >> stuID;// 查找该学生temp = FindStudent(stuID, data);} while (temp==NULL);std::cout << "请输入登录密码:" << std::endl;while (true){std::string password;std::cin >> password;std::cin.get();// 验证密码if (Verification(*temp, password)){std::cout << "欢迎进入学生系统!" << std::endl;break;}else{std::cout << "密码错误,请重新输入" << std::endl;}}return temp;
}// 查找学生是否存在
const Student* FindStudent(const std::string temp, const StudentData& data)
{// 用于返回值const Student* stemp = NULL;while (true){bool is_find = false;auto end = data.data.end();for (auto i = data.data.begin(); i < end; i++){if (i->GetID() == temp){stemp = &(*i);is_find = true;std::cout << "你好 " + i->GetName() << std::endl;break;}}if (is_find){return stemp;}else{std::cout << "没有找到该用户,请重新输入" << std::endl;return NULL;}}
}

2.管理员查看学生选课时输出错误信息

修改前相关代码:

点击查看代码
// 查找到该学生的学生选课数据
for (size_t i = 0; i < scData.data.size(); i++)
{if (scData.data[i].GetID() == stuID){std::cout << scData.data[i].GetID() << " " << scData.data[i].GetName()<< " "<< "已选择的课程有:"<< std::endl;if (scData.data[i].selectedCourses.size() == 0){std::cout << "该同学还未进行任何选课" << std::endl;}else{for (size_t c = 0; c < scData.data[i].selectedCourses.size(); c++){std::cout << scData.data[i].selectedCourses[i].GetCourseNum() << " " << scData.data[i].selectedCourses[i].GetCourseName() << std::endl;}}}
}
修改后运行结果:

修改后相关代码:

点击查看代码
// 查找到该学生的学生选课数据
for (size_t i = 0; i < scData.data.size(); i++)
{if (scData.data[i].GetID() == stuID){std::cout << scData.data[i].GetID() << " " << scData.data[i].GetName()<< " "<< "已选择的课程有:"<< std::endl;if (scData.data[i].selectedCourses.size() == 0){std::cout << "该同学还未进行任何选课" << std::endl;}else{for (size_t c = 0; c < scData.data[i].selectedCourses.size(); c++){std::cout << scData.data[i].selectedCourses[c].GetCourseNum() << " " << scData.data[i].selectedCourses[c].GetCourseName() << std::endl;}}}
}

功能添加
注意到学生系统的功能十分少,操作十分受限,所以为学生系统添加了删除选课的功能
运行结果:

修改后相关代码:

点击查看代码
class StudentModuleTools
{
public:// 查看备选课程信息void CheckOptionalCourses(const CourseData& data);// 按照课程编号选课void SelectCourse(CourseData& cData, StudentCourseData& scData, const Student& user);// 查看已选课程信息和累计学分void CheckSelected_n_totalCred(const StudentCourseData& scData, const Student& user);// 删除选课void DeleteCourse(CourseData& cData, StudentCourseData& scData, const Student& user);
};
点击查看代码
// 删除选课
void StudentModuleTools::DeleteCourse(CourseData& cData, StudentCourseData& scData, const Student& user)
{std::cout << std::endl;std::cout << "请输入要删除的课程编号" << std::endl;std::string courseNumTemp;std::cin >> courseNumTemp;std::cin.get();// 查找到该用户的学生选课数据StudentCourse* user_sc = NULL;for (size_t c = 0; c < scData.data.size(); c++){if (scData.data[c].GetID() == user.GetID()){user_sc = &(scData.data[c]);}}if (user_sc == NULL){std::cout << "未找到该学生的选课信息!" << std::endl;return;}// 查找要删除的课程bool isFound = false;for (size_t i = 0; i < user_sc->selectedCourses.size(); i++){if (user_sc->selectedCourses[i].GetCourseNum() == courseNumTemp){isFound = true;// 将课程的已选人数减一for (size_t j = 0; j < cData.data.size(); j++){if (cData.data[j].GetCourseNum() == courseNumTemp){cData.data[j].MinusOnePopulation();break;}}// 删除学生选课数据中的课程auto iter = user_sc->selectedCourses.begin() + i;user_sc->selectedCourses.erase(iter);user_sc->MinusOneSeletedCourseNum();std::cout << "已成功删除课程:" << courseNumTemp << std::endl;break;}}if (!isFound){std::cout << "未找到该课程!" << std::endl;}
}

总结:
看由别人完成的项目的代码十分具有挑战性,需要去推敲各变量的作用以及作者设计时的思路,在运行的过程中可以发现原作者虽然功能十分完善却仍会出现一些bug,有些功能也可以添加以更加完善作者的项目,总之去理解作者代码、发现bug以及添加功能的过程都让我收货颇多,看着项目的逐渐完善自己也十分有成就感

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888607.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JEXL 入门实战

JEXL 是一个在 Java 中实现动态表达式和脚本功能的库,本文主要介绍其基本概率和使用。 1、背景 在软件开发中,动态执行表达式是一项非常重要的能力。特别是在动态规则处理、配置文件解析以及灵活的业务逻辑实现等场景下,使用一种能够在运行时解析和执行表达式的工具显得尤为…

Octopus游戏服务器框架

Octopus一个跨平台的lua游戏服务器开发框架,该框架代码采用C++编写,开发者只需要调用SDK提供的接口函数和绑定对应的回调函数即可。框架在逻辑层表现为单线程的开发模式,使开发者更加易使用,易调试,易维护,易扩展,同时确保有快速的响应能力。 框架使用面向对象的开发模式…

【蓝牙小程序】实现简易table表格

Demo效果图 正文 由于需要开发小程序,前端又是自己弄,类似table的标签也没有,后来看到小程序文档中推荐使用flex布局,就把css中的flex布局学了一遍,效果还行,大家将就看一下table.wxml <view class="table"><view class="tr bg-w"><…

工程管理(二)

工程模板介绍 DevEco Studio支持多种品类的应用/元服务开发,预置丰富的工程模板,可以根据工程向导轻松创建适应于各类设备的工程,并自动生成对应的代码和资源模板。同时,DevEco Studio还提供了多种编程语言供开发者进行应用/元服务开发,包括ArkTS、JS和C/C++。工程模板支持…

工程管理(一)

APP包结构 在进行应用/元服务开发前,开发者应该掌握应用/元服务的逻辑结构。 应用/元服务发布形态为APP Pack(Application Package),它是由一个或多个HAP(Harmony Ability Package)包以及描述APP Pack属性的pack.info文件组成。 一个HAP在工程目录中对应一个Module,它是…

包和抽象类介绍--java进阶day02

1.package包导包第二点需要注意 a包和b包都存有Student类,c包存有测试类,我们在c中创建Student对象,系统会询问你要哪个包的Student类,并自动帮你导包.在导完a包的学生类后,想要再次导入b包的学生类就不能再像之前那样导了全类名导包 通过带包名将b包重复的学生类导入2.抽…

2025.2.23(二进制等等)

平常我们生活使用的是十进制,在计算机中常用二进制等。 二进制是用0,1表示,逢二进1. 啊啊啊好难表达。 例如2在二进制中为10.哎上图片。。。。除2取余法,哎呀,不管了看图

Deveco Studio下载

Deveco Studio最新版本-下载中心根据自己的操作系统下载合适的版本即可 Windows环境 运行环境要求 为保证DevEco Studio正常运行,建议电脑配置满足如下要求:操作系统:Windows10 64位、Windows11 64位 内存:16GB及以上 硬盘:100GB及以上 分辨率:1280*800像素及以上安装Dev…

第一次作业—软件二次开发

一.项目来源 本次作业的项目来源是https://blog.csdn.net/m0_65636467/article/details/128069045?sharetype=blog&shareId=128069045&sharerefer=APP&sharesource=2301_80676751&sharefrom=link中的第7个C语言超市收款系统 二.运行环境和运行结果 1.运行环境…

《痞子衡嵌入式半月刊》 第 118 期

痞子衡嵌入式半月刊: 第 118 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

【牛客训练记录】牛客周赛 Round 82

训练情况赛后反思 C题没想明白,但是发现了数列一定是不增加的,另外第一次出现的数字,那个位置就必须是那个数字,剩下可能是乘法原理之类的东西吧,但是没做出来 A题 判断字符串第一位和最后一位是否一致即可点击查看代码 #include <bits/stdc++.h> // #define int lo…

【Atcoder训练记录】AtCoder Beginner Contest 394

训练情况赛后反思 没在赛时打的,只做了签到TAT A题 统计字符串中 2 的数量,最后去掉其他的,只输出 2点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;void solve(){string s; cin>>s;int ans = 0;for(int …