学生成绩管理系统
一、系统需求分析
一个巨大的学校有数以万计的教工、学生和相应的资料需要管理。一个好的学生成绩管理系统可以协助管理员管理巨大的数据库,允许管理员、教师跟学生这三种用户登录进行相应的操作。
管理员具有管理数据库的一切权限。管理员负责录入可以使用本系统的用户名单,赋予他们使用权限,分发初始密码;可以重置用户密码,也可以修改自己的登录密码;可以以任意用户用身份登录进行管理与操作。为了保护用户隐私,不允许批量导出用户信息。对于管理员账户,提供功能如下:
- 添加用户:可以赋予用户登录系统的权限;
- 修改用户信息:可以修改已经加入系统的用户姓名、编号,重置密码等;
- 删除已有用户:可以删除已经加入系统的用户资料;
- 修改管理员登录密码:修改自己的登录密码。
教师可以录入学生的成绩,修改自己录入的成绩,删除自己录入的成绩,修改自己的登录密码等。为了保护用户隐私,不允许批量导出学生成绩信息。对于教师账户,提供功能如下:
- 录入学生成绩:录入自己执教的科目的成绩;
- 修改学生成绩:修改自己录入的成绩;
- 删除学生成绩:删除自己录入的成绩;
- 修改登录密码:修改自己的登录密码。
学生可以查询自己的成绩,修改自己的登录密码等。为了保护用户隐私,不允许查询他人的成绩。对于教师账户,提供功能如下:
- 查询成绩:列表显示现有成绩信息,包括科目、分数、负责的教师;
- 修改登录密码:修改自己的登录密码。
广大老师和同学可以通过这一系统安全方便地管理成绩。程序数据结构非常紧凑,可以存储海量数据,满足大学等专业院校的数据规模需求。总之,利用这一学生成绩管理系统,可以满足各种用户的需求,实现对学生成绩的管理工作。
二、总体设计
系统提供三种账户:管理员、教师和学生。
管理员具有最高权限并且是唯一的,初始密码默认为password,需要及时修改,否则整个数据库将暴露在风险之中。管理员负责赋予用户权限,分发初始密码;一旦用户忘记密码,还可以帮用户重置密码;管理员可以以任意用户用身份登录进行管理与操作,对数据库的细节进行维护。教师可以录入、修改、删除自己负责的科目成绩;学生可以查询自己的成绩。
学生成绩管理系统中功能模块图:
三、详细设计
用户分为4类,其继承关系如下:
学生成绩管理系统各功能模块的实现:
- 管理员登录
- 教师登录
- 学生登录
四、系统调试
调试过程中最大的Bug还是出在数据IO上。由于每次读取的内容长度并不能保证固定,因此必须先读取数据长度,然后根据读取结果确定读取的内容长度。测试中发现,数据文件如果不用”r+b”模式打开读取,会在数据库体积较大(大概几百字节)导致异常。这是之前没有注意到的。
为了测试系统对海量数据的处理能力,我随机生成了15000个左右的教师和50000个左右的学生供系统读取,顺带测试数据库大小。测试结果显示,系统可以流畅地读取数万条用户记录,生成的数据库文件大小为2.5M左右。这与每个对象的数据成员大小息息相关,即每条用户信息平均占用大概32字节的空间。按此,每个成绩信息占用大概64字节,即使按照每人附带10科的成绩,总的大小也不会超过~10M的数量级。这一规模的数据大致相当于我校目前的人数规模,可以保证满足实际应用需求。
其他的问题主要有登录信息的初始化与保存。为了保证密码的安全性,输入密码的UI我采用了监视键盘输入的方式,不会将明文显示在屏幕上。但同时带来的问题就是多字节字符的读取问题:getch()无法读取多字节字符,这就意味着汉字无法输入。当然,对于密码这种东西可以将输入进行限制,剔除无效字符;但用户名就无法进行实时监视输入,导致的问题就是输入用户名的时候不能退出,必须输错然后报错退出……
五、结果分析
在源代码的组织上,仍将源代码与工程文件分开保存,这样既便于跨平台编译,又利于保证安全防止误操作。类的定义单独保存为类名为文件名的.h和.cpp中,且头文件使用编译头保护,既避免了重复编译又减少了编译的工作量。
在数据的组织上,为每个类设置IO函数,保证了数据结构的稳定读写。
在代码的细节上,根据Google C风格指引的建议,没有使用C风格的流IO。对于异常处理,我也根据Google的建议没有采用C++风格的try-throw-catch结构,而是对于可以预见的非致命错误进行提示后继续运行,对于不可预见的致命性错误使用printf输出后暂停程序。调试中并没有因为异常处理带来额外的麻烦,大部分的错误提示也都没有出现。
编译环境的选择。使用的是Code::Blocks+TDM64 GCC。64位编译器,但加了-m32参数,编译结果为32位程序,在Windows 8 x64上编译并测试运行通过。调用了非标准库函数,使用VS特别是老的VS编译不保证通过。
六、总结
这个系统应该说比人事管理系统更加复杂,因为有账户系统、大量的数据处理。经过这些天的Debug,在消灭代码中种种不足的同时更增加了C++编程的经验。感谢老师为大家提供了这样一个提高自己的机会!