软件设计报告
一.总体设计
1.分析软件需求
教务管理系统是基于c++技术面向管理人员,教职工和学生的一体化管理系统.管理人员可以在教务管理系统进行人员管理,课程管理以及生成课表等活动,教师可以在教务管理系统进行成绩录入与保存,排序成绩以及统计等活动,学生可以在教务管理系统进行选退课,查看课表与搜索课程等活动.
2.设计软件总体架构
软件首先由一个登录页面构成,用户在选择正确的身份登录入口后输入正确的账号密码进入相应页面,并在页面选择自己所需功能
软件总体框图如下:
二.模块设计
1.登录模块设计
登录模块由五个函数主要组成 :
1.showMenu
主菜单
2.login
登录函数 检测账号密码的正确性
3.login_adm
管理员登录页面
4.login_stu
学生登录页面
5.login_tea
教职工登录页面
具体模块设计如下:
showMenu()
{
//提示选择登录账号类型opt
//将opt传给login 进入login函数
login()
{
//创建一个父类指针
//根据opt确定登录账号类型 并选择相应文件进行匹配操作
//提示用户输入账号密码
//若不正确 则重新输入
//若正确 则利用多态思想创建一个相应对象(),让父类指针指向这个对象 同时将success置为true
// 将父类指针传入给对应的login_stu login_adm login_tea函数并进入
login_adm()
{
//展示功能菜单
//根据用户的选择进行相应功能实现
}
login_stu()
{
//展示功能菜单
//根据用户的选择进行相应功能实现
}
login_tea()
{
//展示功能菜单
//根据用户的选择进行相应功能实现
}
//销毁创建对象
//如果success标记为true 代表登录成功 break到主页面
//如果success标记为false 提示账号密码输入错误 重新输入
}
}
2.课程模块设计
课程模块主要有两个结构体四个函数一个数组组成:
1.结构体cou
维护没有学生信息的课程信息
2.结构体icou
维护有学生信息的课程信息
3.函数get_cou()
从文件中读取 所有cou信息
4.函数get_icou()
从文件中读取 所有icou信息
5.函数get_icou(int,string)
从文件中读取 所有用户相关icou信息
6.函数showtime()
向用户展示数字与时间的索引关系
7.数组timemap[]
函数get_time(string)
利用数字索引到string类型的时间
具体模块设计如下:
struct cou
{
//课程名称 课程时间 课程地点 课程id号 课程教师姓名 课程教师id号
};
struct icou
{
//学生姓名 学生id号 课程名称 课程时间 课程地点 课程id号 课程教师姓名 课程教师id号 学生成绩
};
//get_cou() 与 get_icou()
{
//建立一个vector容器
//利用for循环读取对应信息
//返回vector
}
get_icou(int,string)
{
//建立一个vector容器
//根据int 判断对应类型 学生or教师
//如果学生id和教师id匹配
//将课程信息放入vector容器内
//返回vector容器
}
string timemap[]={"星期一上午",星期一下午"....};
string get_time(string time)
{
return timemap[time(string类型存储的数字)](数字类型索引到的时间);
}
(insert)管理员 学生 教师的父类person类
lass person
{
//登录页面函数show() 纯虚函数 子类必须重写
//三个public信息:姓名 账号 密码
}
3.管理员模块设计
管理员模块由十一个函数和两个vector容器主要组成:
1.adm()
无参构造函数
2.adm(string, string, string)
有参构造函数
3.~adm()
析构函数
4.show()
展示菜单
5.addperson()
人员添加
6.deleteperson()
人员删除
7.showperson()
人员查询
8.addcourse()
课程添加
9.deletecourse()
课程删除
10.showcourse()
课程查询
11.get(string)
得到到所有人
1.vector<basic> persons
记录所有人员信息 (注:basic 为结构体 有三个成员变量 分别是 姓名 账号 密码)
2.vector<cou> course
记录所有课程信息
具体模块设计如下:
//(insert)
void get(string filename)//获取所有人员信息
{
//清除persons容器
//根据filename将相应类型人员读入到persons容器中
}
bool cmp(cou a, cou b)//对课程按照id进行排序
{
//返回 a的id<b的id;
}
login_adm()
{
admin->show() //展示管理员功能菜单
//用户输入选择opt
if(opt==1)
{
//进入人员添加函数addperson()
void addperson()
{
//用户选择是否需要使用showtime()函数查看数字与时间索引关系
//用户输入添加人员数量cnt
while(cnt--)
{
//用户输入添加人员类型,程序根据类型选择对应文件写入
//用户输如姓名
//利用get数组更新人员信息到persons容器中,防止未及时更新的人员数据与待添加的人员数据产生冲突
//用户输入账号
//for循环遍历persons容器进行账号判重 如果重复 重新输入
//如果不重复 输入密码
//将用户信息写入到对应文件中
}
}
}
else if(opt==2)
{
//进入人员删除函数deleteperson()
void deleteperson()
{
//设置一个bool类型的st数组,利用memset函数将st数组初始化为0 表示都未被删除
//用户输入注销人员数量cnt
while(cnt--)
{
//用户输入删除人员类型 根据人员类型选择相关文件读入
//利用get函数将人员相关信息读入到persons容器里
//用户输入待删除人员账号
//for循环遍历persons容器,如果发现有人员账号和待删除账号相同 //则将该账号在persons下标在st数组对应的key值置为true,表示已经删除
//将在persons下标在st数组对应key值为false的利用trunc从头写入相关文件
}
}
}
else if(opt==3)
{
//进入人员查询函数showperson()
void showperson()
{
//用户输入查询人员类型
//根据类型get(string)函数读入相关人员信息至persons容器中
//遍历persons容器输出人员信息
}
}
else if(opt==4)
{
//进入课程添加函数addcourse
void addcourse()
{
//根据用户选择是否调用showtime()函数来查看数字与时间的索引关系
//读入用户需要添加课程数量cnt
while(cnt--)
{
//让用户输入课程信息
//利用get_cou()函数更新course容器内的课程信息
//遍历course容器 检查是否存在课程冲突 冲突情况有两种 1:课程id相同 2:课程时间与地点均相同
//有冲突 重新输入 无冲突 将对应信息写到文件中
}
}
}
else if(opt==5)
{
//进入课程删除函数deletecourse()
void deletecourse()
{
//设置一个bool类型的st数组,利用memset函数将st数组初始化为0 表示都未被删除
//用户输入删除课程数量cnt
while(cnt--)
{
//利用showcourse()函数展示所有课程
//用户输入课程id
//将这个id所对应的bool数组的key值置为true
//将在course下标在st数组对应key值为false的利用trunc从头写入相关文件
}
}
}
else if(opt==6)
{
//进入课程展示函数 showcourse()
void showcouse()
{
//利用get_cou()函数将课程信息读入到course容器中
//将course内课程信息按照id号升序排序
//for循环遍历course输出信息
}
}
}
4.学生模块设计
学生模块由九个函数和一个vector容器主要组成
1.stu()
无参构造函数
2.stu(string,string,string)
有参构造函数
3.~stu()
析构函数
4.show()
展示菜单
5.queryscore()
查询成绩
6.queryclass()
查询课表
7.xuanke()
选课
8.tuike()
退课
9.searchke()
课程搜索 支持模糊搜索
1.vector<icou>
维护学生的已选课信息
具体模块设计如下:
//(insert)
bool cmp0(icou a,icou b)//将同学上课时间按照时间生序排序
{
//return a的时间大小<b的时间大小(数值);
}
bool cmp1(cou a,cou b)
{
//return a的id大小<b的id大小(数值);
}
login_stu()
{
student->show();//展示学生功能菜单
//用户输入选择opt
if(opt==1)
{
//进入查询成绩函数queryscore();
void queryscore()
{
//利用get_icou(int,string)传入同学类型:1 同学id
//读入同学选课信息后遍历icourse容器输入同学成绩
}
}
else if(opt==2)
{
//进入查询课表函数queryclass()
void queryclass()
{
//利用get_icou()函数读入同学选课信息到icourse容器中
//将课程按照时间升序排序并输出
}
}
else if(opt==3)
{
//进入选课函数xuanke()
xuanke()
{
//利用get_cou函数读入所有课程信息到course容器中
//将所有课程信息按照id号升序排序并输出
//读入学生选课数量cnt
while(cnt--)
{
//读入学生需要选择的课程编号myid
//创建是否找到课程标记 has_find 和选课是否冲突标记 success
//has_find为false 表示未找到 success标记为true 表示未冲突
for()//遍历course容器 即遍历所有课程信息
{
if(course[i].id == myid)
{
//has_find标记置为true
//利用get_icou函数更新icourse容器
for()//遍历icourse容器 即遍历学生所有已选课信息
{
//检查是否存在时间冲突
//如果存在冲突 success标记置为true
//提醒学生存在冲突
}
}
//如果has_find为true 表示找到课程 直接break
}
}
if(!has_find) //提示学生没找到
else if(success)//找到且无冲突
{
//提醒用户成功
//并将信息写入相关文件
}
}
}
else if(opt==4)
{
//进入退课函数tuike()
void tuike()
{
//利用get_icou()函数将所有选课信息读入到alls中
//利用get_icou(string,int)函数读入学生选课信息并展示
//设立bool数组st 初始化为false 表示所有课程都未被退
//读入学生退课数量cnt
while(cnt--)
{
//读入学生退课id myid
//利用get_icou()函数读入学生选课信息到icourse()容器中
//for()遍历icourse 找到和myid 相等的课程id
//提醒学生该课程已被删除 将该课程的st标记置为true
//fot()遍历alls将st标记为false的课程写入文件
}
}
}
else if(opt==5)
{
//进入课程搜索searchke()
//(insert) 创建一个类型pair<int,cou> PIS cou表示课程信息
//int表示搜索课程名与已有课程名的最长连续子串长度
// 创建一个vector<PIS> temp容器来存储上述信息
void searchke()
{
//利用get_icou()函数更新所有课程信息 到icourse容器
//读入学生要搜索的信息 name
//for()遍历icourse容器
//利用KMP算法求出 name 与每个 icourse[i].name 的最大连续子串长度
//如果最大连续子串长度不为0 就把这个长度信息和课程信息 更新到temp容器中
//将temp容器按照以最大子串匹配长度为第一关键字,课程姓名为第二关键字升序排序
//如果temp为空 提示学生没有找到
//否则 逆序输入temp相关信息
}
}
}
5.教师模块设计
教师模块由八个函数和一个vector容器主要组成
1.tea()
无参构造函数
2.tea(string name, string id, string pwd)
有参构造函数
3.~tea()
无参析构函数
4.show()
展示菜单
5.addscore()
成绩录入
6.sortscore()
成绩排序
7.sumscore()
成绩统计
8.queryclass()
教师课表查询
9.vector<icou> icourse
教师需要上的课
具体模块设计如下:
login_tea()
{
teacher->show()//展示教师功能菜单
//用户输入选择opt
if(opt==1)
{
//进入成绩录入函数addcourse()
void addcourse()
{
//创建容器alls,将所有学生的选课信息读入到alls中
//将alls按照课程名称字典序生序排序
//for()遍历alls 如果课程教师id与该教师id相同,则提示教师修改成绩
//教师输入成绩 我们将alls里的对应信息修改
//修改完毕后将alls重新写入文件
}
}
else if(opt==2)
{
//进入成绩排序函数sortscore()
void sortscore()
{
//利用get_icou(int,string)函数 传入参数为2 代表教师 传入string为教师id
//读取与该教师相关的课程信息到icourse容器中
//将容器以课程姓名为第一关键字 学生成绩为第二关键字
//for()循环遍历输出相关信息
}
}
else if(opt==3)
{
//进入成绩统计函数sumscore()
void queryclass()
{
//利用get_icou(int,string)函数 传入参数为2 代表教师 传入string为教师id
//读取与该教师相关的课程信息到icourse容器中
//输入icourse容器的大小,即为教师打分数量
//for()循环遍历统计挂科(成绩小于60分)和优秀人数(成绩大于等于90分)并输出
}
}
else if(opt==4)
{
//进入查看教师课表函数queryclass()
void queryclass()
{
//原理类似学生课表函数,不再赘述.
}
}
}