目录
一、 问题描述 3
1.1系统基本信息 3
1.1.1用户信息 3
1.1.2学生基本信息 3
1.1.3教师基本信息 3
1.1.4课程基本信息 3
1.1.5课程成绩信息 3
1.2功能要求 3
1.2.1用户管理 3
1.2.2学生基本信息管理 3
1.2.3教师基本信息管理 3
1.2.4课程基本信息管理 3
1.2.5教务管理 3
1.2.6查询 4
二、 系统要求 4
2.1用户管理 4
2.1.1用户权限设置 4
2.1.2用户登录 4
2.1.3修改初始密码 4
2.2学生基本信息管理 4
2.2.1录入学生基本信息 4
2.2.2删除学生基本信息 4
2.2.3查询学生基本信息 4
2.3教师基本信息管理 4
2.3.1录入教师基本信息 4
2.3.2删除教师基本信息 5
2.3.3查询教师基本信息 5
2.4课程信息管理 5
2.4.1录入课程基本信息 5
2.4.2删除课程基本信息 5
2.4.3查询课程基本信息 5
2.5教务管理 5
2.5.1生成学生选课信息 5
2.5.2教师根据课程代码,录入所任课程的学生成绩 5
2.6查询 5
2.6.1学生查询基本信息和成绩
2.6.2教师查询基本表信息和学生成绩 5
三、 设计思路 5
3.1系统实现 5
3.2系统功能设计思路 5
四、 系统功能模块图 6
4.1系统总模块图 6
4.2各个子模块图 6
4.2.1系统管理员模块中的子模块 6
4.2.2教师模块中的子模块 7
4.2.3学生模块中的子模块 8
五、 系统流程图 9
六、 测试和调试过程 11
7.1教师功能 15
7.1.1教师-录入成绩信息 16
7.1.2教师-查询成绩信息 17
七、 总结 17
八、 存在缺陷及优化方向 17
九、 程序代码 17
九、 参考文献 17
一、问题描述
现要求设计一个教务管理系统,包括如下系统基本信息和系统基本功能。
1.1系统基本信息
1.1.1用户信息:用户名,用户密码,用户权限。
用户分三类:系统管理员(具有各类信息录入、删除、查询权限权限);
教师(具有录入所承担课程和查询指定课程的成绩数据的权限);
学生(具有查询本人的成绩信息和基本信息)。
1.1.2学生基本信息:学号、姓名、性别、专业班级、出生年月、政治面貌、家庭住址。
1.1.3教师基本信息:工号、姓名、性别、所属学院、出生年月、政治面貌、职称。
1.1.4课程信息:课程代码、课程名称、学分数、任课教师工号。
1.1.5成绩信息:课程代码、课程名称、课程学分、学号、成绩。
1.2功能要求
1.2.1用户管理
用户权限设置。
用户登录。
修改初始密码。
1.2.2学生基本信息管理
录入:要求检验学号不能重复。
删除:删除指定学号的学生基本信息。
查询:按学号查询学生基本信息;
生成全部学生信息。
1.2.3教师基本信息管理(同2)
录入:要求检验工号不能重复。
删除:删除指定工号的教师基本信息。
查询:按工号查询教师基本信息;
生成全部课程信息。
1.2.4课程管理
录入:要求检验课程编码不能重复。
删除:删除指定的课程编码的课程基本信息。
查询:按课程编码查询课程信息;
生成全部课程信息。
1.2.5教务管理
(a)生成学生选课信息
(b)管理学生选课功能
(c) 教师根据课程代码,录入所任课程的学生成绩。
1.2.6查询:
学生查询成绩;
教师按课程编码查询全体成绩;
教师按学生学号查询单个学生成绩。
二、系统要求
系统基本信息要求如上,现主要详细介绍下系统功能要求。
系统功能要求:
2.1用户管理
2.1.1用户权限设置
用户分三类——管理员、教师、学生。管理员有四个权限,分别是个人和全体信息查询,学生基本信息管理,教师基本信息管理,课程基本信息管理;教师有两个权限:个人信息查询,学生和课程成绩管理;学生有三个权限:个人信息查询,选课,成绩查询。
2.1.2用户登录
三类用户都可以登录系统,只是每类用户登录系统后能进行的操作有所不同。每个用户登录系统时都要输入用户名和密码,系统会自动判断用户名和密码是否正确,只有输入正确用户名和密码的用户才能登录本系统并能进行相应操作,否则系统要显示错误信息,并提示用户重新输入。
2.1.3修改初始密码
每类用户都能查询自己的信息并能重置密码等属性。
2.2学生基本信息管理
管理员能对学生基本信息管理,包括以下功能:
2.2.1录入:要求检验学号不能重复。
系统管理管理员能录入学生信息,通过调用函数实现并要求该函数在录入重复学号学生时输出提示信息。
录入后实现学号排序。
2.2.2删除:删除指定学号的学生基本信息
系统管理员能删除指定学号的学生,同时删除包含该学生的一切信息,通过调用函数实现该功能;学号不存在时会提示。
删除后实现学号排序。(有点多余)
2.2.3查询:按学号查询学生基本信息;
直接查询全部学生信息。
2.3教师基本信息管理
教师基本信息由管理员管理,包括以下功能:
2.3.1录入:要求检验工号不能重复
系统管理员有录入教师基本信息的功能且录入时检查工号是否重复,当工号重复时,教师基本信息不能被录入且输出提示信息。
录入后实现工号排序。
2.3.2删除:删除指定工号的教师基本信息
系统管理员能删除指定工号的教师基本信息,并删除关于该教师的相关信息。
删除后实现工号排序。(多余)
2.3.3查询:按工号查询教师基本信息
管理员能按工号查询教师基本信息,不存在该教师时系统 输出错误提示信息;
生成全部教师信息。
2.4课程管理
课程管理能实现如下功能:
2.4.1录入:要求检验课程编码不能重复
管理员可以向系统中录入新课程信息,如被录入的课程信息已存在,系统应输出错误提示信息。
录入后按课程代码实现课程排序。
2.4.2删除:删除指定的课程编码的课程基本信息并删除相关信息。
管理员可以删除系统中指定的课程。
删除后按课程代码实现课程排序。(多余)
2.4.3查询:按课程编码查询课程信息。
管理员都能按课程编码查询课程信息。
2.5教务管理
2.5.1生成学生选课信息
2.5.2教师根据课程代码,录入所任课程的学生成绩。
2.5.3选课功能管理(开启/关闭选课功能)
2.6查询
2.6.1学生查询成绩
2.6.2教师按课程查询全体成绩;
教师按学号查询个人成绩。
三、设计思路
3.1系统由6个类[1]]和main()函数及界面函数用户函数等实现[3]。
具体为:学生功能类、教师功能类、学生管理类、课程管理类和用户类(基类),成绩类(详见“六、类的成次图”); main()函数。
3.2系统功能设计思路如下(详细流程见系统功能功能模块图和系统流程图)
系统基本信息由6个类的私有属性表现,系统的基本功能由各个类的成员函数实现。
所有函数由main()函数调用以实现系统功能。
四、系统功能模块图
4.1系统总模块图
4.2各个子模块图
4.2.1系统管理员模块中的子模块
图4-3
4.2.2教师模块中的子模块
4.2.3学生模块中的子模块
五、系统流程图
六、测试和调试过程
功能太多,挑选部分测试:
(其他功能会在答辩时展示,如学生选课功能和选课后同一课程内学生学号排序功能)
1.学生基本信息和成绩查询:
2.教师部分主要功能
3.管理员学生管理界面(教师和课程略)
4.管理员录入信息功能
录入前
录入后(实现了排序)
5.选课信息(2017100刚录入未选课)
七、个人总结
1.制作了头文件大纲和总体思路,进行了代码整合,完成了界面优化,函数封装,文件读写、部分功能新增测试、主函数编写和成绩类实现编写等。
2.遇到的问题及解决方法:
(1)返回上一层:
构造了两个思路,一是采用goto语句,二是利用循环。但由于goto语句很容易混乱,造成代码可读性差,还可能会出现一些 不可预知的错误,所以放弃了goto语句,采用了循环。
(2)文件读写问题:
原计划是采用二进制读写,但由于利用c字符串远不如利用string方便,所以采用了文本输入输出。
这里还有一个问题,就是怎么从一个有多行数据的文件中一次读取一行数据,然后在重新开始读取的时候,读取的是下一行数据。对于文本文件,每一次重新开始读取都是从第一行开始,在这里困惑了很久。最终使用了getline(cin, temp, ‘n’)实现了外界行数和内部行数的同步。
(3)文件内容修改问题:
由于采用文本文件输入输出,所以在删除信息时,采取的并非是删除文件中的某一行,而是覆盖的方法。
(4)编写过程中,程序曾多次出现崩溃,原因如下:
1.在输入数字的时候输入了字符或字符串。
2.动态数组越界。
3.利用courseName(get来的)给课程成绩文本文件命名时出现未知故障程序无法运行,原因未知。
又采用了itoa将序号转为字符,但部分编译器不支持;
最后采用了stream string,将课程序号转化为字符串的一部分给成绩文本文件命名,可继续
(5)其他的都是小问题,比较容易解决。
4.写一个程序,尤其是多人合作写一个大型程序,最重要的便是框架,因为框架搭好每个人各司其职便会轻松很多。否则由于各人风格不同、变量命名风格不同,最后的整合费时费力,还可能会出现新的问题。而多花些时间搭框架则会避免很多东西,让后面的工作变得比较轻松。
5函数封装很重要:
(1)很多程序中的错误在函数封装以后很容易找出来,锁定位置。
(2)使主函数变得简短,方便程序的编写。
(3)更利于团队之间的分工。
(4)函数封装以后,使用函数时,只需要知道接口就可以了,很方便
(5)提高了程序运行的安全性和可移植性
(6)实现模块化编程,容易找出代码中错误的地方并进行修改。
(7)提高代码的保密性
6.写比较大的项目时需要有团队合作和明确分工。如果没有团队合作,没有思维的碰撞,一个人很难产生解决困难问题的灵感还要写很多重复性的代码,还要去花费大量精力测试软件,过程中很容易出现问题;如果没有明确分工,极大可能会出现两人工作重复的事情,间接的增大了工作量。
6.做任何一个项目,无论大小,都需要耐心、细心和信心。
每一次编译都有很多错误,这让人很崩溃,然后要根据编译器的提示找出这些错误,还要一个一个想办法修改,直到最后编译通过,如果没有足够的耐心,根本无法沉下心来去修改那密密麻麻的错误提示。尤其要命的是逻辑错误,根本不知道哪里有问题,只能去寻找是最有可能引发程序奔溃的地方,先一部分一部分调试,再一行一行调试,到最终锁定目标,每一个引起程序崩溃的地方都要停留很久,这些如果没有足够的耐心,很难坚持下去。
其次是细心。粗心是编程中最应该改掉的毛病。在系统编写过程中,很多次因为某个变量名未修正(由于代码重复性,相同代码一般是复制粘贴再修改成想要的结果)而引起运行结果不对,在函数未封装之前,不会出现变量未定义的提示,这时候就会一遍遍看这些代码,有时候甚至会用几个小时,到最后发现错误的时候才恍然大悟:原来是这样的。但其实如果细心一点,这种情况根本不会发生,会节约大量时间,加速任务进程。所以,细心真的很重要。
最后是信心。其实每一次看到程序运行时崩溃或者根本不能与运行或者密密麻麻的错误提示或者运行结果不是自己想象的那样,内心都是很崩溃的。感觉任务就像是一座根本无法翻过的大山,想着这么多错误改怎么办。可是其实做完之后就会发现,不过一个小土包尔。每时每刻都要有相信自己的心态,并带着这种心态去做每一件事。不会还可以学嘛。
八、缺陷及优化方向
1.在输入数字进行相应操作时,输入字符程序会崩,建议将数字向字符方向优化
2.未实现联网数据共通
3.没有实现二进制读取
4.没有实现学生年级学院划分,选课无限制
5.管理员删除学生或者教师信息或者课程信息时,无法同步到成绩信息里
6.部分功能冗余,部分函数调用多余,可删去
7.发行的管理员账号若增加或减少还需要修改源代码,无法在功能界面实现
(为了确保各类信息不会被恶意篡改,未开启管理员账号注册功能)
8.部分重复性函数未改成复用函数,部分函数未改成析构函数