一、 需求分析
用户:
小学、初中和高中数学老师;
功能:
1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
6、个人项目9月28日早上8点以前提交至各自负责的助教处。提交方式:工程文件打包,压缩包名为“几班+姓名.rar”。
附表-1:账户、密码
账户类型 |
账户 |
密码 |
备注 |
小学 |
张三1 |
123 |
|
张三2 |
123 |
|
|
张三3 |
123 |
|
|
初中 |
李四1 |
123 |
|
李四2 |
123 |
|
|
李四3 |
123 |
|
|
高中 |
王五1 |
123 |
|
王五2 |
123 |
|
|
王五3 |
123 |
|
附表-2:小学、初中、高中题目难度要求
|
小学 |
初中 |
高中 |
|
难度要求 |
+,-,*./ |
平方,开根号 |
sin,cos,tan |
|
备注 |
只能有+,-,*./和() |
题目中至少有一个平方或开根号的运算符 |
题目中至少有一个sin,cos或tan的运算符 |
|
二、 项目流程图
三、 代码分析
代码一共分为三个部分:Login.h、Manage.h和main.cpp。
1.代码模块结构非常清晰,层次明显。
队友把整个工程分为三个模块,分别是用户登录(定义类别函数,生成初始用户表单并进行匹配,同时设置登录界面),用户操作(获取操作数值,获取随机操作,获取操作符,生成单个问题表达式,分别生成小学、初中、高中试卷,创建文件夹以及txt文件,切换试卷类型)。这些都基本吻合“高内聚,低耦合”。结构逻辑非常清晰,通俗易懂。
2.代码性能好,效率比较高
队友代码是按照老师下发的代码规范书写的,在各个模块分别对应各种情况处理的不同的if-else语句以及for循环写入试卷题目,switch语句利用随机数来确定各个符号的使用情况,以及while循环实现登录状态下的重复造作,代码逻辑十分清晰。对各种随机组成的式子做出了归纳条件并总结起来,使用rand函数来进行随机操作,更加方便简洁。
3.部分设计构思巧妙,让人眼前一亮
队友在生成题目的模块,相对于我随机数以及符号都是随机生成的情况,自己利用生成随机数的区间精妙设计了各个情况的符号,并且将小学、初中、高中部分的生成试卷模块分开,非常别致且透彻,有利于自己控制各个情况的试卷题目。
4.注释详尽,益于读者理解
队友在各个代码块都有进行注释,这是一个良好的习惯。对于读者来说,注释能让人快速准确的理解作者所要表达的意思。对于作者,注释也能让自己的逻辑更加清晰。
5.随机操作符的设计
队友对于产生随机操作符的思路是:使用rand函数并对操作符的总个数来求余,然后根据余数来判断到底是哪一个操作符,彻底贯彻随机的概念。
四、 项目总结
1、已实现:
(1)账户登陆:对账户输入用户名、密码的匹配判断,不匹配的正确提示;
(2)题目数目:用户登陆后,对输入题目生成数范围是否合法的检测,不合格的正确提示;
(3)题目切换:用户登陆后,对出题年级的切换,输入不正确的提示;
(4)账户题目保存:一个账户生成一个文件夹,不同年级按照难度要求生成输入数目的题目,以“年-月-日-时-分-秒.txt”的形式保存在对应账户的文件夹内;
(5)账户题目查重:同一个账户的卷子中的题目与以前的已生成的卷子中的题目不重复。
(6)生成的试卷题目每题之间有空行;
(7)运算中括号位置随机生成;
(8)初中题目符合出题要求,包括根号或平方;
(9)高中题目符合出题要求,包括sin、cos或者tan;
2、未实现:
(1)生成题目查重功能,虽然一般来说随机生成的题目不会重复,但是实现一下更好。
总体来说,队友的代码值得我的学习和反复推敲,就是有一些小问题,如果用户过多(同时密码不统一的情况下),一一列举表单是比较麻烦的。当登录情况下,出题页面如果输入yes直接就退出了系统,我觉得这里可以优化一下,毕竟我们可以用鼠标或者快捷指令直接退出程序,我们这里设置可以使得用yes指令不是退出程序,而是退回到登录页面。同时,根据随机数值的取值范围生成符号,虽然让人感觉逻辑非常清晰并且可控,但是却不能生成各个情况的题目,相对来说压缩了题库的范围,当用户多了的时候,这样往往就容易带来不利的后果。同时代码过于冗杂,因为小学、初中、高中的题目都包含了相同的部分,模块化虽然更利于同伴来看懂代码,但是重复的操作会使得代码冗长,同时也消耗了不必要的内存与时间,需要避免代码重复性高,模块杂糅。我们会在接下来的结对项目中扬长避短!写出更好的代码。整体来看全部代码的模块性是非常清晰的,增强了其复用性,并且功能都全部实现。配以详细的注释代码的可读性很高,作者对于类以及随机数的运用也都十分熟练。代码语句的书写规范,逻辑结构也很清晰。虽有些代码块仍可简化,但总体来说还是一份优秀的代码。