结对编程之队友代码分析
项目需求简述:
项目名称:中小学数学卷子自动生成程序
用户:小学、初中和高中数学老师。
功能:
1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量:”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3、题目数量的有效输入范围是“10-30”(含10,30),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
队友代码分析:
下面就是对队友代码的研究和一些分析,经过这两天的分析,大致感觉下来队友的从代码的构建,到代码的重用性性都不错。
队友使用c++语言完成整个项目,同时从代码中不难看出作者有很强的面向对象编程思想。
整个过程流畅清晰,层次简明,命名易懂,同时对于每一个方法、类、都著有简单明了的注释,可读性非常好!
首先作者通过一个小学考试类(class PrimaryTest)来实现对与小学难度题目的生成,后又有两个类(高中类和初中类)对于小学类进行了继承。
附代码:
//小学类 class PrimaryTest { private: char oper[4] = { '+','-','*','/' }; int NumOfQue; //题目个数 string *questions; //存储题目 public: PrimaryTest(int num) :NumOfQue(num) { newques(); } void newques(); //为存储题目的数组分配空间并初始化 void makeques(); //构造题目的过程,调用changeques()函数 void changeques(int); //构造第i道题目 string getques(int); //用于外部访问第i道题目 void replace(int, string); //外部更改第i道题目 void output(ofstream &); //输出questions int getNumOfQue() { return NumOfQue; } //外部访问题目数量 ~PrimaryTest(void) { delete[]questions; } }; //初中类,公有继承自小学 class JuniorTest :public PrimaryTest { private: string oper1[2] = { "^0.5","^2" }; int NumOfQue; //题目的数量 public: JuniorTest(int num) :PrimaryTest(num) { NumOfQue = num; } void addsign(); //向小学生成的题目中添加oper1中的字符串 }; //高中类,公有继承自小学 class SeniorTest :public PrimaryTest { private: string oper2[3] = { "sin","cos","tan" }; int NumOfQue; public: SeniorTest(int num) :PrimaryTest(num) { NumOfQue = num; } void addsign(); //向小学生成的题目中添加oper2中的字符串 };
两个子类通过addsign()方法通过对于问题字符串的修改(添加根号、平方以及三角函数)实现对于生成题目难度的改正。具体方法实现不在粘贴。
最后主函数用于提示用户提示用户操作,整个过程简洁明了,基本无问题。
不过在整个体验和分析过程中发现两处不足:
其一:发现遍历作者的生成题目部分代码,发现作者小偷了一下懒,没有考虑解决生成的问题是否重复的问题。对于生成后的题目字符串没有再检验是否会重复。
其二如下:
while (1) { cin >> changeornot; if (changeornot == 'Y') { return 0; } else if (changeornot == 'N') { break; } else cout << "请输入'Y'或者'N':"; }
这只是其中一小段代码,整个代码大致有两三处如此的代码,个人认为可以将cin放入while判断内如 while (cin >> changeornot) ,可以有效减少代码行数!不过这只是个人代码习惯问题,无伤大雅。
整体代码还是非常优秀的,给人的感觉非常好,还分了很多文件来写不同的东西,棒!!
(Class.h编写三个类以及方法声明,fun.h编写所有方法实现,information.h用于存放用户账号密码)
总结:整个代码阅读体验应该算是不错了,而且和队友的想法基本差不多,一拍即合,期待和队友擦出更多火花了!冲鸭!
2018.9.27
感谢某软件1602班提供代码的作者同学