C++大作业——学生选课系统
C++大作业——学生选课系统
- 前言
- 1.系统概述
- 2.系统设计
- 2.1概要设计
- 2.2详细设计
- 2.2.1学生类和课程类模块设计
- 2.2.2文件信息读取和录入模块设计
- 2.2.3增删改查模块设计
- 2.2.4登入模块设计
- 2.2.5选课模块设计
- 2.2.6退选模块设计
- 3.完整代码
- 4.总结与展望
- 4.1设计总结
- 4.2设计展望
前言
本次课程设计是我第一次独自完成这样一个相对完整的项目,收获很多。但是我更想说一下本次设计中存在的不足。
首先就是在最初设计课程类和学生类时,没有考虑的那么全面,导致出现了很多冗余的接口,和公有私有混着用的情况。其次就是,虽然是用C++写的,却没有把封装体现出来,使用了很多friend友元函数也破坏了类的封装效果。
由于我最开始是在Linux系统上编写的代码,没有装中文包,所以很多注释和输出语句都是用英文写的。后来又转到Windows下的VS环境下编程,也写了一些中文的语句。导致会有中英文混用的情况,可能会影响观感。
在学习这个系统之前,建议先把学生成绩管理系统熟练掌握,掌握最基本的增删改查操作,我在本文中就不再赘述了,把重点放在选课和退选的功能讲解上。
在最后面,我也会把整个项目代码都放出来,大家可以拿去在自己的电脑上运行,应付下作业铁定是没问题的(手动狗头)。
1.系统概述
本系统是学生选课系统,主要是实现大学生的选课需求。进入系统,需要先选择用户(学生或管理员),选择管理员,需要输入对应的密码。选择完身份后,进入主菜单,会出现两个子菜单,学生菜单和课程菜单,选择相应的选项,就会进入相应的菜单,其中0选项是返回上级目录。
进入课程菜单,会看到增删改查相应的操作,还有显示全部课程信息。其中,学生用户没有对课程进行增删改的权利。管理员是超级用户,有所有操作的权利。里面的细节我们在模块的具体实现时再说。
进入学生菜单,也会看到增删改查相关的操作,还有显示全部学生的信息。不同的是,学生菜单中可以进行选课和退选的相关操作。学生用户只有查看信息,选课退选的权利,没有增删改的权利。具体细节也是放在模块中详谈。
2.系统设计
2.1概要设计
2.2详细设计
2.2.1学生类和课程类模块设计
int flag = 0; // default is student class Course { public: friend void Input_course(vector& cour); friend void Delete_course(vector& cour); friend void Modify_course(vector& cour); friend void Lookup_course(vector& cour); friend void Show_course(vector& cour); friend void Add_course(vector& cour); friend int Read_course(vector& cour); friend void Write_course(vector& cour, int n); const char* c_id() { return id; } const char* c_name() { return name; } const bool c_nature() { return nature; } Course() : id("None") , name("None") , count(0) {} public: char id[20]; char name[20]; private: bool nature; // 0 indicates elective and 1 indicates compulsory int hour; // class time int credir; // credit public: int count; // count of student 0-60 }; class Student { public: friend void Input_stu(vector& stu); friend void Delete_stu(vector& stu); friend void Modify_stu(vector& stu); friend void Lookup_stu(vector& stu); friend void Add_stu(vector& stu); friend void Show_stu(vector& stu); friend int Read_stu(vector& stu); friend void Write_stu(vector& stu, int n); friend void Select(vector& cour, vector& stu); friend void Deselect(vector& cour, vector& stu); public: char _id[20]; char _class[20]; char _name[20]; Course _cour_compulsory[2]; Course _cour_elective[1]; int _num_compulsory = 0; int _num_elective = 0; }; vector cour; vector stu;
在这个模块中,我设计了两个类来分别存储学生和课程的信息。课程的相关信息包括,课程编号、课程名、课程类型(选修/必修)、学时、学分、以及选课人数。其中规定,每门课选课人数最多不超过60人。还设计了一个构造函数,将课程的编号和课程名都定义为None。
学生类中,相关信息包括,学号、班级、姓名、所选择的必修课信息、所选的选修课信息、所选必修课数量、所选选修课数量。其中规定,每名学生所选必修课不超过两门,选修课不超过一门。
在接下来的增删查改操作中,我使用了全局变量cour,和stu这两个动态数组来分别存储课程和学生。其中全局变量flag是一个确定身份状态的变量,默认是0,学生用户。1是超级用户。
2.2.2文件信息读取和录入模块设计
void Write_course(vector& cour, int n) { fstream myfile; myfile.open("course.txt", ios::out | ios::binary); if (!myfile) { cout myfile cour.clear(); // clear fstream myfile; myfile.open("course.txt", ios::in | ios::binary); if (!myfile) { cout myfile temp.id temp.name temp.nature temp.hour temp.credir temp.count; cour.push_back(temp); // push_back } myfile.close(); return n; } // 学生数据的文件操作 void Write_stu(vector fstream myfile; myfile.open("student.txt", ios::out | ios::binary); if (!myfile) { cout myfile stu.clear(); // clear fstream myfile; myfile.open("student.txt", ios::in | ios::binary); if (!myfile) { cout myfile temp._id temp._class temp._name temp._cour_compulsory[0].id temp._cour_compulsory[0].name temp._cour_compulsory[1].id temp._cour_compulsory[1].name temp._cour_elective[0].id temp._cour_elective[0].name temp._num_compulsory temp._num_elective; stu.push_back(temp); // push_back } myfile.close(); return n; } system("cls"); cour.clear(); int i = 0; char sign = '0'; Course temp; cout loop: cout c++; if (!strcmp(temp.id, cour[i - c].id)) { cout system("cls"); int n = Read_course(cour); int i = 0; char id[20]; cout cout if (cour[i].count) { cout cour.erase(cour.end() - 1); Write_course(cour, n - 1); cout system("cls"); int n = Read_course(cour); // count of course char id[20]; int i = 0; cout cout if (cour[i].count) { cout Write_course(cour, n); cout system("cls"); int n = Read_course(cour); int i = 0; char id[20]; cout cout cout system("cls"); int n = Read_course(cour); cout cout system("cls"); int n = Read_course(cour); char sign = '0'; Course temp; cout loop: cout c++; if (!strcmp(temp.id, cour[n - c].id)) { cout system("cls"); stu.clear(); int i = 0; char sign = ''; Student temp; cout loop: cout c++; if (!strcmp(temp._id, stu[i - c]._id)) { cout system("cls"); int n = Read_stu(stu); int m = Read_course(cour); // number of course int i = 0; char id[20]; cout cout while (stu[i]._num_compulsory 0) { stu[i]._num_compulsory--; int c = 0; while (c