结对编程-队友代码分析

上一周,我们完成了个人项目编程。在经过对队友代码的分析,我感触颇深,觉得非常有必要来写一篇文章分析一下队友的代码,我是用的java,而队友用的c++,以下开始正文!

-------------------------------------------------------------------------------

项目需求简述:

个人项目:中小学数学卷子自动生成程序

用户:

小学、初中和高中数学老师。

功能:

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月17日早上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的运算符

-------------------------------------------------------------------------------

下面就开始对队友的代码进行简要分析:

1.代码模块结构非常清晰,层次明显。

队友把整个工程分为几个模块,大致是用户登录(其中确定试卷类型),获取操作数值,获取随机操作,获取操作符,生成单个问题表达式,生成试卷,切换试卷类型等等。这些都基本吻合“高内聚,低耦合”。结构逻辑非常清晰,通俗易懂。

2.代码性能好,效率比较高

在仔细品味队友代码的过程中,一些小细节让我感触很深。比如下面单个问题生成模块中,针对不同操作数,队友采用了不同的if-else语句来限定条件。对各种随机组成的式子做出了归纳条件并总结起来,使用rand函数来进行随机操作,更加方便简洁。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

for(int i=0;i<g_num;i++)//创建试卷

                {

                    int temp,tpp;

                    string Que[g_num];

                    string nstr1,nstr2,nstr3,nstr4,nstr5,nstr6;

                    char rtemp1[20],rtemp2[20],rtemp3[20],rtemp4[20],rtemp5[20],rtemp6[20];

                    sprintf(rtemp1,"%d",rand()%100);

                    sprintf(rtemp2,"%d",rand()%100);

                    sprintf(rtemp3,"%d",rand()%100);

                    sprintf(rtemp4,"%d",rand()%100);

                    sprintf(rtemp5,"%d",rand()%100);

                    sprintf(rtemp6,"%d",rand()%100);

                    nstr1=rtemp1;

                    nstr2=rtemp2;

                    nstr3=rtemp3;

                    nstr4=rtemp4;

                    nstr5=rtemp5;

                    nstr6=rtemp6;

                   

                  

                   

                        if(g_OpeNum()==1) Que[i]=nstr1+GetOperator()+nstr2;

                        else if(g_OpeNum()==2)

                        {

                           tpp=rand()%100;

                            temp=tpp%3;

                            if(temp==0) Que[i]="("+nstr1+mGetOperator()+GetOperator()+nstr2+")"+GetOperator()+nstr3;

                            else if(temp==1)  Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+")";

                            else if(temp==2)  Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+nstr3;

                        }

                        else if(g_OpeNum()==3)

                        {

                        tpp=rand()%100;

                            temp=tpp%6;

                            if(temp==0)  Que[i]="("+nstr1+GetOperator()+nstr2+")"+GetOperator()+nstr3+GetOperator()+nstr4;

                            else if(temp==1) Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+")"+GetOperator()+nstr4;

                            else if(temp==2) Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+"("+nstr3+GetOperator()+nstr4+")";

                            else if(temp==3) Que[i]="("+nstr1+GetOperator()+nstr2+GetOperator()+nstr3+")"+GetOperator()+nstr4;

                            else if(temp==4) Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+")";

                            else if(temp==5) Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+nstr4;

                              

                       }

                        else if(g_OpeNum()==4)

                        {

                            tpp=rand()%100;

                            temp=tpp%10;

                            if(temp==0) Que[i]="("+nstr1+GetOperator()+nstr2+")"+GetOperator()+nstr3+GetOperator()+nstr4+GetOperator()+nstr5;

                            else if(temp==1) Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+")"+GetOperator()+nstr4+GetOperator()+nstr5;

                            else if(temp==2) Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+"("+nstr3+GetOperator()+nstr4+")"+GetOperator()+nstr5;

                             else if(temp==3) Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+"("+nstr4+GetOperator()+nstr5+")";

                            else if(temp==4) Que[i]="("+nstr1+GetOperator()+nstr2+GetOperator()+nstr3+")"+GetOperator()+nstr4+GetOperator()+nstr5;

                            else if(temp==15) Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+")"+GetOperator()+nstr5;

                            else if(temp==6) Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+"("+nstr3+GetOperator()+nstr4+GetOperator()+nstr5+")";

                            else if(temp==7) Que[i]="("+nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+")"+GetOperator()+nstr5;

                            else if(temp==18) Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+GetOperator()+nstr5+")";

                            else if(temp==9) Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+GetOperator()+nstr5;

                        }

                       else if(g_OpeNum()==5)

                       {

                            tpp=rand()%100;

                            temp=tpp%15;

                            if(temp==0) Que[i]="("+nstr1+GetOperator()+nstr2+")"+GetOperator()+nstr3+GetOperator()+nstr4+GetOperator()+nstr5+GetOperator()+nstr6;

                            else if(temp==1) Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+")"+GetOperator()+nstr4+GetOperator()+nstr5+GetOperator()+nstr6;

                            else if(temp==2)Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+"("+nstr3+GetOperator()+nstr4+")"+GetOperator()+nstr5+GetOperator()+nstr6;

                            else if(temp==3)Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+"("+nstr4+GetOperator()+nstr5+")"+GetOperator()+nstr6;

                            else if(temp==4)Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+GetOperator()+"("+nstr5+GetOperator()+nstr6+")";

                            else if(temp==5)Que[i]="("+nstr1+GetOperator()+nstr2+GetOperator()+nstr3+")"+GetOperator()+nstr4+GetOperator()+nstr5+GetOperator()+nstr6;

                            else if(temp==6)Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+")"+GetOperator()+nstr5+GetOperator()+nstr6;

                            else if(temp==7)Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+"("+nstr3+GetOperator()+nstr4+GetOperator()+nstr5+")"+GetOperator()+nstr6;

                            else if(temp==8)Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+"("+nstr4+GetOperator()+nstr5+GetOperator()+nstr6+")";

                            else if(temp==9)Que[i]="("+nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+")"+GetOperator()+nstr5+GetOperator()+nstr6;

                            else if(temp==10)Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+GetOperator()+nstr5+")"+GetOperator()+nstr6;

                            else if(temp==11)Que[i]=nstr1+GetOperator()+nstr2+GetOperator()+"("+nstr3+GetOperator()+nstr4+GetOperator()+nstr5+GetOperator()+nstr6+")";

                            else if(temp==12) Que[i]="("+nstr1+GetOperator()+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+GetOperator()+nstr5+")"+GetOperator()+nstr6;

                            else if(temp==13)Que[i]=nstr1+GetOperator()+"("+nstr2+GetOperator()+nstr3+GetOperator()+nstr4+GetOperator()+nstr5+GetOperator()+nstr6+")";

                            else if(temp==14)Que[i]="("+nstr1+GetOperator()+nstr2+GetOperator()+nstr3+")"+GetOperator()+nstr4+GetOperator()+nstr5+GetOperator()+nstr6;

                        }

                        string s[g_num];

                        int flag=0,j;

                        for(j=0;j<g_num;j++)//在总题库中查重

                        {

                            if(Que[i]==Que[j]&&i!=j)

                            {

                            flag=1;

                            i--;

                            break;

                           }

                        }

                        if(flag==0)

                        {

                        if(ofile.is_open())

                                 ofile<<i+1<<". "<<Que[i]<<"="<<endl<<endl; //输入到对应TXT

                         }

                        else i--;

                   

                }

3.部分设计构思巧妙,让人眼前一亮

队友在生成题目的模块,巧妙地设计了一个题库,既能为后面检查是否有重复题目做准备,而且这个题库我们可以为后续结对编程开发项目做准备-我们可以从题库中出题!这直接提供了一个好的思路,队友巧妙的构思让我非常钦佩!代码包含在上一个for循环里。

4.注释详尽,益于读者理解

队友在各个代码块都有进行注释,这是一个良好的习惯。对于读者来说,注释能让人快速准确的理解作者所要表达的意思。对于作者,注释也能让自己的逻辑更加清晰。

5.随机操作符的设计

队友对于产生随机操作符的思路是:使用rand函数并对操作符的总个数来求余,然后根据余数来判断到底是哪一个操作符,彻底贯彻随机的概念。

1

2

3

4

5

6

7

8

9

100

11

12

13

1

string hOP() //获取随机操作

{

                    string g_hOp;

                    int tp=rand()%100;

                    int temp=tp%3;

                    if(temp==0)

                    {

                        g_hOp="sin";

                   }

                   else if(temp==1)

                    {

                        g_hOp="cos";

                   }

                   else if(temp==2)

                    {

                        g_hOp="tan";

                   }

                    return g_hOp;

}  

   总而言之,队友的代码写的还可以,就是有一些小问题,比如当操作数等于12345的不同情况下,采用一一列举法来对括号的位置进行总结,过于繁琐,可以让括号也基于rand函数随机出现,、避免代码重复性高,模块杂糅。我们会在接下来的结对项目中扬长避短!写出更好的代码。

01-13 22:53