结对编程-个人项目:中小学试卷生成程序-队友代码分析
首先,让我们先来了解一下这个项目的需求:
(1)命令行输入用户名和密码(空格隔开),若匹配,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
(2)登录系统后,提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中中的一个,用户输入所需出题数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
(3)题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
(4)在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出题数量,系统新设置的类型进行出题;
(5)生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
然后我们再看向其代码,按需求来分析:
(1)用户登录界面:
没有采用一些容器的方式来储存用户数据,而是简单地使用if语句来选择判定已知的9位老师的登录信息,这使得代码更加简洁易懂化,在全部信息已知的情况下,这种风格更加高效;
这里采用了一个简单的login类来储存用户名、密码、学校类型信息,并用成员函数完成登录界面,使得程序模块化,并很好的建立了数据的封装性;
(2)用户类型切换界面:
全项目最简单的部分,通过与用户交互来再次确定当前登录教师的学校类型,直接采用了“一问一答”的对话模式,通过分支语句执行程序流程的中断部分;
(3)题目生成:
题目生成算法是这个项目的重难点,作者分析思路趋近于题目思路,首先随机确定算式的操作数数目,然后使用操作数数目控制循环次数,每次循环中,向算式中添加进一项,
而对于这一项的难度级别,作者则设置了一个函数来生成各个难度级别的该项,然后将其添加进入算式中,全过程中操作数的值由随机数确定,非常精巧实用。这里作者使用stringstream流来储存问题,
方便了对于字符串类型的合并操作。
(4)题目保存:
作者使用了文件流ofstream来向文件中写入题目而不是输出到显示屏,操作简单易懂,并且贴切题目的要求;
对于文件的命名方法,作者调用了获取时间的函数gmtime(),将其返回值用sprintf函数调整至符合需求文档的命名格式,并配合ofstream文件流完美打开。
代码风格分析:从项目工程来看,作者将其分为3个大部分,分别是main、Login、CreateTest,main负责总局部署调用,Login编写用户登录部分与基础数据结构,CreateTest编写系统功能管理部分与主要算法,并且Login、CreateTest有各自的头文件来辅助编码,所有的行为函数全部都是.h文件中声明的类的成员函数,这样使用条例清晰、编码流畅,各部分给人的可读性较强。
Bug测试:
(1)对于输入题目数量时,某些意想不到的输入会带来死循环(比如输入字母);
(2)对于难度级别的处理过于草率,没有考虑到高中的题目也应当包含初中级别的运算,而只是暴力的使用switch语句进行了分支处理。

浙公网安备 33010602011771号