结对编程队友代码分析
Github代码链接
项目实现功能
-
登入系统
如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码
-
根据账号类型进行出题
题目数量10~30,-1则退出
- 为小学出题,参数:生成题目数量
- 根据题目数量出题
- 目的操作数为1~5个,操作数取值在1~100
- 涉及运算+,-,*,/
- 为初中出题,参数:生成题目数量
- 根据题目数量出题
- 目的操作数为1~5个,操作数取值在1~100
- 涉及运算+,-,*,/;再加上至少一个平方或开根号的运算符
3. 为高中出题,参数:生成题目数量
- 根据题目数量出题
- 目的操作数为1~5个,操作数取值在1~100
- 涉及运算+,-,*,/,平方,开根号;题目中至少有一个sin,cos或tan的运算符
-
在登入状态下,可以进行账户切换
在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
-
生成的题目以txt文件形式保存
1、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
优点分析
-
代码变量命名符合规范。全局变量使用了g_xxx命名,局部变量使用了m_xxx命名。可以很清楚每个参数的作用域。
string g_type; //当前生成试卷的类型(小学、初中、高中) int g_opernum; //每道题目的操作数的个数 int g_oper; //操作数本身 int g_number; //试卷内题目的数量(取值范围10~30) string g_path; //保存生成文件的路径 string g_checkpath; //每个账户的查重文件路径 bool g_signflag = 0; //登录标志位,为0则为未登录;为1则为已登录 int g_i; //当前为第g_i个用户登录
-
代码的函数命名符合规范。每个函数都由一个动词加上名词组成,可以很清楚的知道每个函数的基本功能。
void SignIn(); //用于用户登入。 void AskType(); //询问当前需要出题的类型。 void MakePaper(); //生成试卷。 void InitUser(); //初始化用户信息。 void MainFace(); //生成主界面 void MakeFilePath(); //生成文件路径 bool IsRepetitive(string exercise, string filepath); //判断这道题目是否重复的函数
-
代码的逻辑清晰,排版工整。例如在MakePaper()函数中,先调用SignIn()进行用户登入;再调用MakeFilePath()获取这个用户所对应文件夹路径,并且转到这个文件夹下;再根据老师的类型(小学,初中,高中)生成相应的一道题目;调用IsRepetitive()进行题目查重。
-
生成题目部分函数,编写的很巧妙。对于初中和高中的题目,先对每个操作数加上平方、开方或是三角函数,然后再将它们用四个运算符连接成一道题目。
-
用户交互功能优秀。在运行代码时,有清晰的操作介绍和操作反馈。还能在同一个页面框内,不显示上一条指令,仅显示当前操作,如下图从登入到生成题目:
缺点分析
-
所有的代码,都放在了一个cpp文件中。并没有进行封装,代码的测试与维护性较差。
-
函数的模块化不足。例如MakePaper()函数,达到了278行之多。而这个函数的功能也冗杂,把为小学、初中、高中出题目的操作放在了一起。应该先分别实现为小学、初中、高中出题,然后在MakePaper()函数中调用它们。
-
生成的小部分题目有些歧义。例如下图中出现的题目12-74-cos12/45,cos部分是cos(12/45)还是cos(12)/45没表达清楚。
- 一个不算是缺点的缺点。包含了两个仅在windows平台才有的头文件<io.h>、<direct.h>,使得该代码在Linux,mac平台无法直接运行,不利于该代码的移植。
总结
在本次项目实现中,在对比了方浩楠同学的代码后,发现我没有在用户交互方面下功夫。导致这个出题程序的用户用户体验可能不太好,在之后的编程中我应该完善这一方面。