C++实现简易选课系统:面向对象设计与核心逻辑解析
本文提供一套完整的C++简易选课系统源码,基于控制台交互界面。系统利用面向对象特性(OOP)构建课程、教师、学生及助教模型,通过结构体与类封装数据,使用全局数组模拟数据库。主要功能包括:读取外部TXT配置初始化数据、教师开设/删除课程、学生查看课表及选课退课、以及多角色登录验证逻辑。代码未依赖外部图形库,适合学习C++基础语法、字符串处理及简单架构设计。
核心结构与角色设计
该系统采用面向对象的编程范式,将业务实体抽象为不同的类,并通过公有继承(Public Inheritance)复用代码。主要涉及四个核心类:Course、Person及其子类 teacher、student,以及多重继承的 TeachingAssistant(助教)。
1. 数据模型定义
目的: 建立内存中的数据结构,用于暂存从文件读取的学生、教师和课程信息。
关键类解析:
Course:包含课程ID、名称、学分及HaveSet标志位。只有当HaveSet为真时,该课程才对学生可见可选。Person:基类,包含姓名和年龄等公共属性。teacher:继承自Person,增加教师ID、授课数量限制及TeachCourse数组记录已授课程。student:继承自Person,增加学号、密码、最少选修数要求及mycourse数组记录已选课程。TeachingAssistant:同时继承自teacher和student,具备双重身份,既可以是选课主体,也可协助教师。
// 全局数据存储,模拟小型数据库
Course AllList[200]; // 最大支持200门课程
teacher A_T[200]; // 最大支持200位教师
student A_S[2000]; // 最大支持2000名学生
TeachingAssistant A_TA[2500];
2. 初始化与文件IO
入口: 系统启动时的 Pre() 函数。
动作: 利用 freopen("date.txt","r",stdin) 重定向标准输入,从文本文件中批量读取课程、教师和学生数据至全局数组。
注意: 这种直接重定向的标准输入方式在后续需要切换回控制台交互时,必须使用 freopen("CON","r",stdin) 恢复,否则程序会一直尝试读取文件导致阻塞或错误。
功能模块操作流程
第1步:主菜单与角色登录
目的: 区分用户身份,进入对应的子系统。
操作逻辑:
- 学生/助教入口: 输入学号和密码。系统进行遍历匹配,若密码错误超过3次则退出。验证通过后,根据
who参数(0为学生,1为助教)调用SelectSytem或TASystem。 - 教师入口: 输入教师ID。系统校验ID范围后,直接进入
Setcourse流程,赋予其课程管理权限。
第2步:教师管理课程
目的: 激活可用课程池,让学生能够选择。
操作说明:
- 设置课程: 教师在列表中选择一个未被设置的课程ID。系统检查该教师剩余可授课额度(
Len - now_have),若额度充足且课程空闲,则更新AllList[CID].HaveSet = 1。 - 删除课程: 教师取消某门已授课程。系统将该课程从
TeachCourse数组中移除,并将末尾元素前移填补空缺,同时将全局课程的HaveSet置为0。
第3步:学生选课与课表查看
目的: 完成学生学业规划及进度管理。
操作说明:
- 选课: 输入课程ID。条件判断:1. 课程已被老师设置;2. 学生尚未选择该课程。满足则加入
mycourse数组并计数。 - 退课: 在“我的课表”页面输入要删除的课程ID。系统同样采用末尾替换法删除数组元素,保持数据紧凑。
- 学分判定: 每次操作后,系统对比
courseCount与LeastNum,提示是否满足最低学分要求。
运行环境与测试数据
代码编译需支持 C++ 标准库。由于使用了 _sleep 和 system("cls"),该程序主要在 Windows 环境下(如 MSVC 或 MinGW)运行最佳。Linux/macOS 下需修改头文件为 #include <unistd.h> 并使用 sleep(0.5) 及 system("clear")。
配套的测试数据文件格式如下(需在程序同级目录创建 date.txt):
/* date.txt 格式说明 */
// 第一行:课程总数
10
// 接下来N行:课程ID 课程名 学分
1 Media_English 2
...
// 下一部分:教师总数
5
// 接下来M行:姓名 年龄 编号 需授课数
Harry_potter 35 1 2
...
// 最后部分:学生总数
2
// 接下来K行:姓名 入学年份 学号 密码
Jack 2021 2021001 123456!
以上就是C++简易选课系统设计的详细内容,更多关于C++面向对象课程设计资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













