基于C++实现(控制台)学生选课系统【100010750】
学生选课系统
此系统用于管理学生选课,服务于高校学生和教师。为学生提供了进行选课、
根据需求查询课程、查询选课结果、删除选课结果和个人信息管理等功能。为教师提供了查看选课情况、删除选课、统计选课信息、课程管理、个人信息管理等功能。该系统实现了选课的电子化,能够较为高效地管理在校学生的选课信息。
该系统主要服务于学生和教师两类人群。学生使用该系统,首先需要按照系统提示输入规定格式的学号和正确的密码。若学生无此系统的账号,可以选择“注册”选项以完成注册。完成登录后,系统显示“学生选课”、“查询课程”、“查询选课结果”、“删除选课结果”、“个人信息管理”、“退出登录”六个选项。选择“学生选课”选项,系统会显示全部课程及其相关信息,学生应输入相应课程编号以完成选课。选择
“查询课程”选项,系统会提供根据课程名、开课学院、课余量、选课人数查看课程,学生根据自己的需求选择查询方式。选择“查询选课结果”,学生可以查看到曾经选修过的课程。选择“删除选课结果”,学生可在未开课之前删除自己的选课。选择“个人信息管理”,学生对个人信息中的电话、密码及邮箱进行修改。
教师使用该系统,首先也需完成登录或注册。登录成功后,可进行选课管理、
课程管理、信息管理。教师可查看开设的课程、查询学生信息、删除人数少于 30 的课程、统计课程数目和排序课程。可查询、添加、修改课程和在选课开始前删除课程。在信息管理模块中,教师可以修改自己的密码和邮箱。
模块图如下:
接口定义规范
根据模块的具体功能用英文命名接口,两个单词之间使用英文下划线分隔。
例如用于显示学生界面主菜单的接口命名为 student_mainmenu。
系统的数据结构描述
主要使用 MySQL 数据库存储该系统所需的数据。通过三张表分别存储学生、
教师、课程的相关信息。存储学生信息的表命名为 students,其中存储学生的学号、学院、专业、姓名、性别、电话、密码、邮箱和选课;存储教师信息的表命名为 teachers,其中包含教师的工号、学院、姓名、密码和邮箱;存储课程信息的表命名为 classes,其中包含课程编号、开课学院、课程名称、学分、学时、课程性质、开课教师、开课时间、结课时间、上课时间段、上课地点、限制人数、已选人数、教材信息和课程简介。具体信息如下 ER 图:
其中学生和教师的密码以 base64 加密的形式进行存储,其他信息均明文存储。通过引用头文件 <mysql.h>、以字符串的形式编写和储存 SQL 语句、引用头文件中的相关函数,以实现对数据库的连接和操作。
除此之外,首次运行该程序时会首先运行配置程序,需要用户输入数据库的相关信息,如端口号,用户名,密码等以连接数据库。用户输入的这些信息则通过文件储存。
系统的开发环境及运行环境描述开发环境:硬件环境:
组内成员 2 人使用 Intel Core 平台笔记本、1 人使用 AMD Ryzen 平台笔记本、 1 人使用 AMD Ryzen 桌面平台进行开发,兼容性良好。
软件环境:
整个系统在 64 位 Windows 10(保持自动更新)的 Visual Studio 2019
Community (16.7.2)的环境下开发。
系统环境变量在安装 MySQL 时添加 %MYSQL_HOME%=D:\mysql-8.0.21-winx64。
VS 开 发 采 用 Debug x64 环 境 : 预 处 理 器 定 义 添 加
_CRT_SECURE_NO_WARNINGS 以使用 gets 等被 VS 认为内存不安全的函数;
包含目录添加%MYSQL_HOME%\include;库目录添加%MYSQL_HOME%\lib;
调试环境为 PATH=%MYSQL_HOME%\bin;;警告等级为/W3 时代码最终 0 error,0warning。
编译导出时采用 Release x64 环境,设置同上。
系统默认编码为 GB2312,代码保存编码为带 BOM 的 UTF-8,MySQL 默认编码为 utf8,中文兼容性良好。
运行环境:
详见测试报告。
模块详细设计
int main_entrance():
该模块主要功能为显示主菜单,让用户输入一个数字以选择自己的身份,根据用户具体选择的身份再进入到教师或学生登录界面。无传入值,传出值为 0。
若用户未按照要求输入相应的值,程序会给出提示并且要求用户重新输入。
void student_login():
该模块主要功能为完成学生的登录或注册。首先在控制台显示一个菜单,要
求学生选择需要进行的操作(登录/注册/返回上层)。若学生用户选择登录选项,系统会提示学生用户输入学号并检查输入的格式是否正确。学生用户输入正确格式的学号之后,系统提示学生用户输入密码,并将学生用户输入的密码与储存在数据库中的正确密码比对,若相同,则进入到学生的主界面,若输入密码与数据库中的密码不一致,则提示学生用户密码不正确,此时学生用户可以继续输入密码或返回上一级,其中学号和密码均以字符串的形式存储;若学生用户选择注册选项,程序进入 student_register()模块;若学生用户选择返回上层,程序再次进入 main_entrance()模块。
此模块无传入、返回值,若学生用户未按照规定要求输入,程序会给出提示
并要求学生用户重新输入。
void student_mainmenu():
该模块主要功能为显示学生的主菜单,提示学生用户输入相应选项并对学生用户的输入进行处理。进入该模块,首先在控制台输出学生主菜单,包含 6 个选项,分别为 ① 学生选课,② 查询课程,③ 查询选课结果,④ 删除选课结果,⑤ 个人信息管理,⑥ 退出登录。然后提示学生用户输入相应的整数。若学生用户选择
①,系统进入 student_select_course()模块;若学生用户选择 ②,系统进入 student_query_course()模块;若学生用户选择 ③,系统进入 student_query_result() 模块;若学生用户选择 ④,系统进入 student_delete_course()模块;若学生用户选择 ⑤,系统进入 student_manage_info()模块;若学生用户选择 ⑥,系统再次返回 main_entrance()模块。
此模块无传入、返回值,若学生用户未按照规定要求输入,程序会给出提示并要求学生用户重新输入。
void student_register():
该模块主要功能使完成学生的注册。首先让学生用户输入学号,系统首先会判断学生用户的输入是否符合规定格式,若不符合规定格式,则要求学生用户重新输入。之后系统会将学生用户输入的学号与在数据库中已有的学号对比,若发现与数据库中已有的学号重复,则提示学生用户该学号以注册,并重新获取输入。接收到符合要求的学号之后,系统会继续要求学生用户输入密码、学院、专业、姓名、性别、电话、邮箱。其中输入性别、电话、邮箱时,系统均会判断输入是否符合规范。性别必须为男或女;电话必须为 11 位数字;邮箱必须***@***.***格式。学生用户的输入均以字符串的形式储存。
此模块无传入、返回值,若学生用户未按照规定要求输入,程序会给出提示并要求学生用户重新输入。
void student_select_course():
此模块主要功能为完成学生的选课。进入该模块,系统首先将所有课程的相关信息输出到控制台,并提示学生用户输入课程编号以完成选课,学生用户以字符串的形式输入课程编号后,系统首先进入 student_check_class_exist()模块以判断课程编号是否存在,然后从数据库中提取出该学生的选课情况,若该学生已选满三节课,则无法进行选课操作;若学生未选满三节课,则判断已选的课中是否与学生此次想选的课程重复,若有重复,则无法完成选课操作;之后系统会从数据库中提取出该课程的已选人数和限制人数,若已选人数与限制人数相等,说明此课程已满,无法选课。最后系统会进入 check_timeClash()模块以判断选的课程是否与已选课程有时间冲突,若时间上有冲突则无法完成选课。
若上述限制条件均满足,系统将学生用户输入的课程编号加入到数据库学生的相关信息中并提示学生用户选课成功。此模块无传入、返回值。
void student_query_course():
此模块主要功能是完成学生对课程的查询。进入该模块,系统首先在控制台输出菜单,让学生用户输入一个整数以选择查询方式,将学生用户的输入以整数形式储存。该菜单包括 6 个选项:① 根据课程名查询,② 根据开课学院查询,③ 根据课余量排序所有课程,④ 根据选课人数排序所有课程,⑤ 查看课程详细信息,⑥ 返回学生主菜单。若学生用户选择 ① 系统首先提示学生用户输入课程名称并接收学生用户的输入以字符串的形式储存。然后通过 SQL 语句在数据库中查询课程的
相应信息,并利用 print_class()模块将查询结果输出到控制台。若学生用户选择 ②,系统首先提示学生用户输入开课学院名称并接收学生用户的输入,以字符串的形式储存。然后通过 SQL 语句在数据库中查询课程的相应信息,并利用 print_class() 模块将查询结果输出到控制台。若学生用户选择 ③,系统通过 SQL 语句从数据库中按照(限制人数-已选人数)的大小排序取出课程并利用 print_class()模块将查询结果输出到控制台。若学生用户选择 ④ 系统通过 SQL 语句从数据库中按照已选的大小排序取出课程并利用 print_class()模块将查询结果输出到控制台。若学生用户选择 ⑤,系统将从数据库中查找出开课时间、结课时间、上课时间段、上课地点、限制人数、已选人数、教材信息、课程简介等课程详细信息,并利用 print_class() 模块将查询结果输出到控制台。若学生用户选择 ⑥,则返回主菜单。
此模块无传入、返回值,若学生用户未按照规定要求输入,程序会给出提示并要求学生用户重新输入。
void student_query_result():
此模块主要用于查询该学生用户的选课结果,通过 SQL 语句利用子查询从数据库中查找出相应信息,并利用 print_class()模块将查询结果输出到控制台。此模块无传入、返回值。
void student_delete_course():
此模块用于删除学生用户已选的课程。进入此模块后,系统首先从数据库中查找出此学生用户已选的课程及其相关信息并输出到控制台,随后提示学生用户输入课程编号,学生用户输入课程编号后,系统会自动判断学生用户是否选择了该课程和该课程是否已开课,若学生用户未选择该课程或该课程已开课,则提示学生用户删除课程失败。否则则通过 SQL 语句在数据库中删除相应信息并提示学生用户删除成功。该模块无传入和返回值。
void student_manage_info():
此模块用于学生用户的个人信息管理,进入该模块系统首先在控制台上显示菜单,提示用户选择需要修改的信息,用户按要求输入一个 1 至 4 之间的整数以修改自己的电话、密码、邮箱或返回上一级菜单。系统接受用户输入的电话、密码或邮箱,并将其储存在字符串中。然后通过 SQL 语句修改数据库中的对应信息。
此模块无传入、返回值,若用户未按照规定要求输入,程序会给出提示并要求学生用户重新输入。
void student_search_specific_imformation():
此模块用于查找并显示一门课的详细信息。进入该模块之后,系统首先通过 SQL 语句从数据库中找出所有课程的信息并输出到控制台,然后提示用户输入课程编号以查询该课程更详细的信息。将接收到的输入储存在字符串中,然后通过 SQL 语句在数据库中查找出该课程的开课时间,结课时间,上课时间段,上课地点,限制人数,已选人数,教材信息和课程简介并将其输出到控制台。此模块无传入、返回值,若用户输入错误的课程编号,程序会给出提示此课程不存在,并要求用户重新输入。
int student_check_class_exist(char* ) :
此模块用于检查用户输入的课程编号是否存在。该模块首先假设输入的课程存在,通过 SQL 语句在数据库中查找该课程的相应信息,并将查找出来的结果储存在结果集中,若结果集为空,则说明数据库中没有相应课程的信息,此时系统提示用户无此课程,并返回 1。若结果集不为空,则说明该课程存在,返回 0。
此模块接受一个指向字符的指针变量,使用时将字符数组的名称传入该模块。返回值为一个整数,即 1 或 0。
void print_class(char*):
此模块用于在控制台打印从数据库中取出的数据。传入以字符数组形式储存的 SQL 语句,无返回值。出于界面美观的需要,该模块会将查找结果的后八列删除后再显示在控制台。
int check_stuId(char* ) :
此模块用于检查学生输入的学号是否符合 10 位数字的的正确格式。传入以字符数组形式储存学号,首先以 while 循环遍历整个字符数组,得到该字符数组的大小,若大小不为 10,则表明学号格式错误。若大小为 10,再次遍历整个数组,判断其中每个字符是否在 0 至 9 之间,若所有字符都在 0 至 9 之间,则说明学号格式正确。
该模块须接收一个指向字符的指针,返回 0 或 1,返回 0 表示学号不符合规定,返回 1 表示学号格式正确。
int check_phone(char* ) :
此模块用于检查电话是否符合 11 位数字的的正确格式。传入以字符数组形式储存电话,首先以 while 循环遍历整个字符数组,得到该字符数组的大小,若大小不为 11,则表明电话格式错误。若大小为 11,再次遍历整个数组,判断其中每个字符是否在 0 至 9 之间,若所有字符都在 0 至 9 之间,则说明电话格式正确。该模块须接收一个指向字符的指针,返回 0 或 1,返回 0 表示电话不符合规定,返回 1 表示电话格式正确。
int check_email(char* ) :
此模块用于检查邮箱是否符合***@***.***的格式。传入用户输入的邮箱,首先通过 while 循环遍历,得到该字符数组的大小,规定长度不能超过 50,若超过 50,则格式错误。随后判断该字符数组第一个和最后一个字符,若第一个字符为“@” 或最后一个字符为“.”,则格式错误。随后再次遍历整个字符串,用两个数组分别储存“@”和“.”在字符数组中的序号,用两个整数分别储存“@”和“.”的数量。随后判断,若“.”在“@”前,则格式错误;若“@”或“.”的数量不为 1,则格式错误。
该模块须接收一个指向字符的指针,返回 0 或 1,返回 0 表示邮箱不符合规定,返回 1 表示邮箱格式正确。
int check_classId(char* ) :
此模块用于检查课程编号是否符合 6 位数字的的正确格式。传入以字符数组形式储存课程编号,首先以 while 循环遍历整个字符数组,得到该字符数组的大小,若大小不为 6,则表明课程编号格式错误。若大小为 6,再次遍历整个数组,判断其中每个字符是否在 0 至 9 之间,若所有字符都在 0 至 9 之间,则说明课程编号格式正确。
该模块须接收一个指向字符的指针,返回 0 或 1,返回 0 表示课程编号不符合规定,返回 1 表示课程编号格式正确。
void teacher_login();
该模块主要功能为完成教师的登录或注册。首先在控制台显示一个菜单,要求教师选择需要进行的操作(登录/注册/返回上层)。若用户选择登录选项,系统会提示用户输入教师工号并检查输入的格式是否正确。用户输入正确格式的之后,系统提示用户输入密码,并将用户输入的密码通过 SQL 语句与储存在数据库中的正确密码比对,若相同,则进入到教师的主界面,若输入密码与数据库中的密码不一致,则提示用户密码不正确,此时用户可以重新输入用户名与密码或返回上一级,其中用户名和密码均以字符串的形式存储;若用户选择注册选项,程序进入 teacher_reg()模块;若用户选择返回上层,程序再次进入 main_entrance()模块。此模块无传入、返回值,若用户未按照规定要求输入,程序会给出提示并要求用户重新输入。
void teacher_reg();
该模块主要功能使完成教师的注册。首先让用户输入教师工号,系统首先会判断用户的输入是否符合规定格式,若不符合规定格式,则要求用户重新输入。之后系统会通过 SQL 语句将用户输入的工号与在数据库中已有的工号对比,若发现与数据库中已有的工号重复,则提示用户该工号以注册,并重新获取输入。接收到符合要求的工号之后,系统会继续要求用户输入密码、学院、姓名、邮箱。其中输入邮箱时,系统均会判断输入是否符合规范。邮箱必须***@***.***格式。用户的输入均以字符串的形式储存。
此模块无传入、返回值,若用户未按照规定要求输入,程序会给出提示并要求用户重新输入。
void teacher_mainmenu();
该模块主要功能为显示教师的主菜单,提示用户输入相应选项并对用户的输入进行处理。进入该模块,首先在控制台输出教师主菜单,包含 4 个选项,分别为 ① 选课管理,② 课程管理,③ 信息管理,④ 退出登录。然后提示用户输入相应的整
数。若用户选择 ①,系统进入 teacher_select_managemenu 模块;若用户选择 ②,系 统 进 入 teacher_course_managemenu() 模 块 ; 若 用 户 选 择 ③ , 系 统 进 入
teacher_manage_info()模块;若用户选择 ④,系统再次返回 main_entrance()模块。此模块无传入、返回值,若用户未按照规定要求输入,程序会给出提示并要求用户重新输入。
void teacher_select_managemenu();
该模块主要功能为显示教师选课管理功能的菜单,提示用户输入相应选项并对用户的输入进行处理。进入该模块,首先在控制台输出教师选课管理菜单,包含 6 个选项,分别为 ① 查看开设的课程,② 查询学生信息,③ 删除课程(选课结束后),④ 统计课程数目,⑤ 排序课程,⑥ 退出登录。然后提示用户输入相应的整数。若用户选择 ①,系统进入 teacher_mycourse()模块;若用户选择 ②,系统进入 teacher_findcourse()模块;若用户选择 ③,系统进入 teacher_30delete()模块;若用户选择 ④,系统进入 teacher_totalcourse()模块;若用户选择 ⑤,系统进入 teacher_sortcourse()模块;若用户选择 ⑥,系统再次返回 teacher_mainmenu()模块。
此模块无传入、返回值,若用户未按照规定要求输入,程序会给出提示并要求用户重新输入。
void teacher_mycourse();
该模块主要功能为查询教师自己开设过的课程的选课情况及其详细信息,提示用户输入相应选项并对用户的输入进行处理。进入该模块之后,系统首先通过 SQL 语句从数据库中找出所有当前登录的教师开设过得课程的信息并输出到控制台,然后提示用户输入课程编号以查询该课程更详细的信息。将接收到的输入储存在字符串中,然后通过 SQL 语句在数据库中查找出该课程的开课时间,结课时间,上课时间段,上课地点,限制人数,已选人数,教材信息和课程简介并将其输出到控制台。
此模块无传入、返回值,若用户输入错误的课程编号,程序会给出提示此课程不存在,并要求用户重新输入。
void teacher_findcourse();
该模块主要功能为根据学生姓名或/和课程名称查询学生信息,提示用户输入相应选项并对用户的输入进行处理。进入该模块之后,首先在控制台输出选择菜单,包含 3 个选项,分别为 ① 根据课程名称查询,② 根据学生姓名查询,③ 返回上一级菜单。然后提示用户输入相应的整数。如果用户选择 ①,则提示用户输入课程名称查询已选择课程的所有学生信息,将接收到的输入储存在字符串中,然后通过 SQL 语句在数据库中查找出已选择课程的所有学生信息并将其输出到控制台。
如果用户选择 ②,则提示用户输入学生名称查询该学生信息,将接收到的输入储存在字符串中,然后通过 SQL 语句在数据库中查找出该学生信息并将其输出到控制台。如果用户选择 ③,则返回上一级菜单。
此模块无传入、返回值,若用户输入错误的课程名称或学生名称,程序会给出提示此课程或学生不存在,并要求用户重新输入。
void teacher_30delete();
此模块的主要功能是在选课结束后选择删除选课人数少于 30 人的相应课程,
提示用户输入相应选项并对用户的输入进行处理。进入该模块之后,首先通过 SQL 语句从数据库中找出所有当前登录的教师开设过得课程的信息并输出到控制台并判断选课是否结束,若选课未结束则输出语句告诉用户无法删除并在用户确认后返回上一菜单,若选课已结束输出选择菜单,包含 2 个选项,分别为 ① 进行课程的删除,② 返回上一级菜单。然后提示用户输入相应的整数。如果用户选择
①,则提示用户输入课程编号后通过 SQL 语句从数据库中找出相应课程信息输出到控制台,同时通过在数据库判断该课程选课人数是否超过 30 人,若超过则输出语句告诉用户无法删除并在用户确认后返回选择菜单,若未超过三十人则输出菜单询问用户是否删除(① 是/② 否),若用户选择 ① 则删除该课程及相应学生选课信息,若用户选择 ② 则返回选择菜单;如果用户选择 ②,则返回上一级菜单。
此模块无传入、返回值,若用户输入错误的课程编号,程序会给出提示此课程不存在,并要求用户重新输入。
void teacher_totalcourse();
此模块主要功能是统计教师自己开设过的课程数目。系统通过 SQL 语句从数据库中同级教师开设过的课程数目并将查询结果输出到控制台。此模块无传入、返回值。
void teacher_sortcourse();
此模块主要功能是按选课人数排序所有教师开设过的课程。系统通过 SQL 语句从数据库中按照已选的大小排序取出课程并利用 print_class()模块将查询结果输出到控制台。此模块无传入、返回值。
void teacher_course_managemenu();
该模块主要功能为显示教师课程管理功能的菜单,提示用户输入相应选项并对用户的输入进行处理。进入该模块,首先在控制台输出教师选课管理菜单,包含 5 个选项,分别为 ① 查询课程,② 添加课程,③ 修改课程,④ 删除课程(选课开始前),⑤ 退出登录。然后提示用户输入相应的整数。若用户选择 ①,系统进入 teacher_course_list()模块;若用户选择 ②,系统进入 teacher_course_add()模块;若用户选择 ③,系统进入 teacher_course_edit()模块;若用户选择 ④,系统进入 teacher_course_delete()模块;若用户选择 ⑤,系统再次返回 teacher_mainmenu() 模块。
此模块无传入、返回值,若用户未按照规定要求输入,程序会给出提示并要求用户重新输入。
void teacher_course_list();
该模块主要功能为查询所有课程及其详细信息,提示用户输入相应选项并对用户的输入进行处理。进入该模块之后,系统首先通过 SQL 语句从数据库中找出所有当前登录的教师开设过得课程的信息并输出到控制台,然后提示用户输入课程编号以查询该课程更详细的信息。将接收到的输入储存在字符串中,然后通过 SQL 语句在数据库中查找出该课程的开课时间,结课时间,上课时间段,上课地点,限制人数,已选人数,教材信息和课程简介并将其输出到控制台。
此模块无传入、返回值,若用户输入错误的课程编号,程序会给出提示此课程不存在,并要求用户重新输入。
void teacher_course_add();
此模块主要功能为完成教师添加课程的操作。教师进入该模块后首先选择开课时间,选择学年只需按一位 0-8 的数字即可,若按其他的键则提示重新输入,学期也只需按 1 或 2 自动输入为第一/二学期,输入后系统会自动格式化为 202*-202* 学年第*学期的格式,并且查找出当前学期该教师已经开设的选修课和必修课数量输出,接着提示输入需要开设必修课还是选修课,若已开设选修课数量大于等于 2,则无法继续开设选修课并提示本学期开设选修课已达上限。随后系统提示输入课程编号和名称,编号需要通过 10 位数字的检测,输入完之后会和数据库已有进行比较,若已存在则提示冲突。通过检验后继续提示输入课程学分和学时,允许一位小数,开课和结课周次为 1-20 间整数,若输入其他内容则提示重新输
入。随后系统自动格式化为 202*-202 学年第学期第周 周 :-*:*的时间格式,与后续输入的经过验证的上课地点、人数上限、简介、教材信息共同插入数据库的课程信息表内,并提示加课成功。
此模块无传入、返回值。
void teacher_course_edit();
此模块的主要功能是在修改课程。提示用户输入相应选项并对用户的输入进行处理。进入该模块之后,首先通过 SQL 语句从数据库中找出所有当前登录的教师开设过得课程的信息并输出到控制台并输出选择菜单,包含 2 个选项,分别为
① 进行课程的修改,② 返回上一级菜单。然后提示用户输入相应的整数。如果用户选择 ①,则提示用户输入课程编号后通过 SQL 语句从数据库中找出相应课程信息输出到控制台,并判断该课程是否有学生选课,若未有学生选课,则输出菜单询问用户修改对象(① 教材信息/② 课程简介/③ 限制人数/④ 返回上一级菜单),用户可根据需要输入整数值选择修改对象,并随后输入相应内容完成修改,其中若用户限制人数修改,则系统会先通过 SQL 语句从数据库中判断当前课程选课人数为 80 或
,而后输出菜单询问用户是否更改为另一数目,若用户选择是则修改为另一数目,选择否则返回上一菜单。修改完成经用户确认后即可后返回上一菜单。若已有学生选课,则系统会输出语句提示用户仅可修改限制人数,并先通过 SQL 语句从数据库中判断当前课程选课人数为 80 或 100,而后输出菜单询问用户是否更改为另一数目,若用户选择是则修改为另一数目,选择否则返回上一菜单。修改完成经用户确认后即可后返回上一菜单。
如果用户选择 ②,则返回上一级菜单。若用户未按照规定要求输入,程序会给出提示并要求用户重新输入。
void teacher_course_delete();
此模块的主要功能是在未开始选课时删除课程。提示用户输入相应选项并对用户的输入进行处理。进入该模块之后,首先通过 SQL 语句从数据库中找出所有当前登录的教师开设过得课程的信息并输出到控制台并判断选课是否开始,若选课开始则输出语句告诉用户无法删除并在用户确认后返回上一菜单,若选课未开始输出选择菜单,包含 2 个选项,分别为 ① 进行课程的删除,② 返回上一级菜单。
然后提示用户输入相应的整数。如果用户选择 ①,则提示用户输入课程编号后通过 SQL 语句从数据库中找出相应课程信息输出到控制台,并输出菜单询问用户是否删除(① 是/② 否),若用户选择 ① 则删除该课程,若用户选择 ② 则返回选择菜单;如果用户选择 ②,则返回上一级菜单。
此模块无传入、返回值,若用户输入错误的课程编号,程序会给出提示此课程不存在,并要求用户重新输入。
void teacher_manage_info();
此模块用于教师用户的个人信息管理,进入该模块系统首先在控制台上显示菜单询问用户修改对象(① 修改密码/② 修改邮箱/③ 返回上一级菜单),用户可根据需要输入整数值选择修改对象,并随后输入相应内容完成修改,系统接受用户输入的密码或邮箱,并将其储存在字符串中。然后通过 SQL 语句修改数据库中的对应信息。
此模块无传入、返回值,若用户未按照规定要求输入,程序会给出提示并要求学生用户重新输入。
int getState_selecting():
此模块主要功能为判断当前时间是否在选课时间内。函数开始先取得当前时间戳,与全局变量中的开始选课时间、结束时间进行比较,返回结果。
此模块无传入参数,返回整型数据,0 为未开始选课,1 为正在选课时间内,2 为选课时间已结束。
int getState_starting(char* sweek, char* stime)
此模块主要功能为判断当前所传入的课是否已开课。函数开始先通过字符串操作将开课时间的 202*-202 学年第学期第周、具体上课时间段 周 :-: 中的数据取出,比较学期,若学期相同,用周次和时间段加上全局变量中的本学期开课时间得到真实开课时间,并与当前时间进行比较,返回结果。
此模块传入开课时间字符串的指针、具体上课时间段字符串的指针,返回整型数据,0 为未开课,1 为已开课。
Int check_classClash(char* query)
此模块主要功能为传入 SQL 语句,进行数据库查询,若取到行数不为 0 则有结果,提示冲突并返回。
此模块传入 SQL 语句字符串指针,返回整型数据,0 为无冲突,1 为有冲突
int scanf_pw(char* str)
此模块主要功能为取代 scanf 来达到输入密码回显*,不显示明文的效果。函数使用_getch()来进行单个输入字符的获取并逐个加到所传入的字符串中,若遇到回车符则结束输入,若遇到退格与删除符首先判断是否已经到指针起始,若能回删,输出退格符、空格、退格符来替换原来回显的*,若输入字符超过 20 个或输入 ascii 码不在 40-126 的字符则不输入,不回显*。
void pw_encode(char* str)
此模块的功能为将字符串内的密码使用 base64 算法进行编码加密。编码原理为每个字节 8 位,每次取出 3 个字节,也就是 24 位。然后每次从此 24 位中取出 6 位,然后在前端补 2 位 0,组成新的 8 位,也就是一个字节。这样就将 3 个字节转换成了 4 个字节。由于前面两位都是 0,所以转换后的每个字节能表示的最大数字为 63,然后根据规范给出的 Base64 索引表,将 0-63 这 64 个数字转换成索引表里对应的字符,当最后取出 3 个字节不够时,不够的位置补 0,并且最后少一个字节时编码的最后加一个“=”,少两个字节时加两个"="。
此模块输入为待加密的字符串指针,直接对该字符串进行操作,无返回值。
void pw_encode(char* str)
此模块的功能为将字符串内的密码使用 base64 算法进行解码解密,还原为明文。为上一编码模块的逆过程。
此模块输入为待加密的字符串指针,直接对该字符串进行操作,无返回值。
int scanf_opt(int* optPtr, int optMin, int optMax)
此模块用于菜单选项的输入,避免只读取空格前内容造成错误输入可以正常运行的 BUG。利用 gets 读入,atoi 将输入转换为整型,若读入字符长度不为 1 或转换后的数不在指定范围则提示重新输入。
此模块输入为选项 option 指针,最小选项,最大选项,若成功返回整型数 1。
char* s_gets(char* str, int n)
此模块用于取代 scanf(“%s”,*)进行字符串输入。模块运用 fgets 从 stdin 读取输入,去掉结尾的回车符。若输入长度超过限制则当场提示用户重新输入再重新执行读取步骤。
此模块输入为待接受输入的字符串指针,整型允许的长度,返回输入后字符串指针,若超过限制则返回空指针。
void change_color(int,int)
此模块功能为更改输出信息的颜色,生效到下一次更改前。通过查询资料得知
SetConsoleTextAttribute 可以更改前景色和背景色且其第二参数前四位控制背景色,后四位控制字体色,故模块运用位运算将输入整数放到合适的位上进行更改。此模块输入为整型字体颜色,整型背景颜色代码,无返回值。
DWORD WINAPI SelectEventThreadLPVOID pM)
此模块功能为实现命令行对鼠标事件的响应,即可以正在命令行通过鼠标点击实现选择。此模块首先从外部读取全局变量中储存的数据以确定对鼠标事件做出响应的坐标范围,随后根据鼠标点击的具体坐标,通过 keybd_event 函数相应地模拟键盘输入。通过多线程原理实现鼠标点击功能
运行环境:
硬件环境:程序在 Intel Core 平台笔记本、AMD Ryzen 平台笔记本、AMD Ryzen 桌面平台测试运行通过,兼容性良好。
软件环境:本程序为 Windows 控制台应用,最终编译为 exe 可执行文件,程序在 64位 Windows 10(保持自动更新)下测试全部功能正常,win8.1 及以下没有条件进行兼容性测试,可能存在如鼠标点选功能无法使用的问题;程序在仅兼容 x86 应用的系统平台无法使用。软件运行无需本地数据库环境,可以使用远端上的 MySQL 服务端,但必须连接上数据库才能使用主体功能。
各功能运行结果、截图及说明:
首次运行程序时需要连接数据库,界面如下图所示
若用户的输入有问题,系统无法连接,会给出如下提示:
连接数据库成功后,根据系统提示设置当前学年、当前学期等时间条件,若用户不按要求输入,系统会给出提示并重新接收输入
首次运行程序完成配置后,进入到学生管理系统界面,首先需要用户点击按钮选择自己的身份
下图为对异常输入的处理
若用户选择学生,则系统进入学生界面,用户根据系统提示点击输入,若格式不正确,则重新输入
若用户选择“登录”选项,系统会要求输入学号,用户按照要求输入正确格式的已注册的学号后,再输入正确的密码以进入学生主界面
下图为学生主界面,根据提示点击输入想进行的操作
下图为对异常输入的处理
若用户选择“学生选课”,则进入学生选课界面:
若不在选课时间内则无法选课
下图为对异常输入的处理
若选课成功,系统会给出“选课成功”的提示
若在学生主界面点击选择“查询课程”,则进入查询课程界面
按课程名查询:
按学院查询:
按课余量查询:
按选课人数查询:
若在学生主页面选择查询选课结果,页面如下:
若在学生主界面选择删除选课结果,页面如下:
若已开课,则无法删除
无法删除不存在的课
删除成功后会给出提示
若在学生主界面选择个人信息管理,则页面如下:
按照规范修改电话
修改密码
按照规范修改邮箱
若在学生登录时点击选择“注册”,则界面如下,若输入异常,系统会给出提示并重新获取输入
若用户点击选择教师,则系统进入教师界面,用户根据系统提示点击输入,若格式不正确,则重新输入
若用户选择“登录”选项,系统会要求输入工号,用户按照要求输入正确格式的已注册的工号后,再输入正确的密码以进入教师主界面
下图为教师主菜单,根据提示点击或输入想进行的操作
以下是对异常输入的处理
若用户在教师主菜单中选择“选课管理”,则进入教师选课菜单,具体点击或输入操作以及异常输入提示如下所示
若用户在选课管理菜单中选择“查看开设课程”,则进入开设课程查询寻界面查询,具体输入操作以及异常输入提示如下所示
若用户在选课管理菜单中点击选择“查询学生信息”,则进入学生信息查询寻界面查询,具体点击或输入操作以及异常输入提示如下所示
“根据课程名查询”
“根据学生姓名查询
若用户在选课管理菜单中点击选择“删除课程(学生选课后)” 则进入学开设课程删除界面,具体输入操作以及异常输入提示如下所示
若选课结束后,选课人数超过三十人则不能进行课程的删除
若用户在选课管理菜单中选择“统计您自己开设过的课程数目”,则进入开设课程统计界面,如下
若用户在选课管理菜单中选择“按选课人数排序所有开设过的课程”,则进入开设课程排序界面,如下
若用户在主菜单中点击选择“课程管理”,则进入教师课程管理菜单,具体输入操作以及异常输入提示如下所示
若用户在课程管理菜单中选择“课程查询”,则进入课程查询界面,具体输入操作以及异常输入提示如下所示
若用户在课程管理菜单中选择“课程添加”,则进入课程添加界面,具体输入操作以及异常输入提示如下所示
若用户在课程管理菜单中选择“课程修改”,则进入课程修改界面,具体输入操作以及异常输入提示如下所示
已有学生选课的课程只能修改限制人数
未有学生选课的课程可以修改课程简介,教材信息与限制人数
若用户在课程管理菜单中选择“课程删除(选课开始前)”,则进入课程修改界面,具体输入操作以及异常输入提示如下所示
若选课已开始,无法删除课程
若选课未开始则可以进行课程的删除
若用户在教师主菜单中在选择“信息管理”,则进入教师修改菜单,具体输入操作以及异常输入提示如下所示
若在选择“密码”,则进入教师密码修改界面,具体输入操作以及异常输入提示如下所示
若在选择“邮箱”,则进入教师邮箱修改界面,具体输入操作以及异常输入提示如下所示
若在教师登录时选择“注册”,则进入教师注册界面,具体输入操作以及异常输入提示如下所示
♻️ 资源
大小: 7.97MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87430268
注:如当前文章或代码侵犯了您的权益,请私信作者删除!
相关文章
- C++ 获取系统文件夹路径
- C++ 获取系统版本
- 托管C++线程锁实现 c++11线程池
- C/C++日志写入系统log(/var/log/syslog)
- 【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)
- vs2008 C++创建和调用标准DLL
- mac/unix系统:C++实现一个端口扫描器
- 基于QT(C++)+Sqlite3实现单词消除游戏系统【100010741】
- 基于C++实现(控制台)通讯录系统【100010546】
- 基于C++实现(控制台)考试报名系统【100010511】
- 基于C++实现弹簧质点系统【100010397】
- 基于C++实现(控制台)学生通讯录系统【100010181】
- 基于C++实现(MFC)职工工作量统计系统【100010022】
- 【华为OD机试真题 java、python、c++、JsNode】区块链文件转储系统(100%通过+复盘思路)
- C/C++教程 第二十五章 —— Linux系统入门
- C++使用opencv遍历文件夹