个人项目:中小学数学卷子自动生成程序-队友代码测评

结对编程-队友代码分析

上一周,我们完成了个人项目编程。在经过对队友代码的分析,我感触颇深,觉得非常有必要来写一篇文章分析一下队友的代码,我是用的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函数随机出现,、避免代码重复性高,模块杂糅。我们会在接下来的结对项目中扬长避短!写出更好的代码。

原文地址:https://www.cnblogs.com/w-t-f-k/p/11551804.html

时间: 2024-07-29 06:55:00

个人项目:中小学数学卷子自动生成程序-队友代码测评的相关文章

中小学数学卷子自动生成程序分析

结对编程对方个人项目分析 个人项目:中小学数学卷子自动生成程序 用户:小学.初中和高中数学老师. 功能: 1.命令行输入用户名和密码,两者之间用空格隔开(程序预设小学.初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学.初中和高中三个选项中的一个.否则提示“请输入正确的用户名.密码”,重新输入用户名.密码: 2.登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学.初中和高中三

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

每个人都弄了一个个人项目,然后结队,编程实现更多功能. 程序要求用户预设账号登录后可以选择自动生成不同数量(10-30道).不同难度(小学.初中.高中)的数学卷子到txt文本中. 通读项目需求,本次程序主要难点集中在题目严谨的数学逻辑与随机出题的结合以及出题不重复的实现. 下面简单分析一下李同学的工程编写优缺点: 优点: 文件路径使用相对路径.文件路径具有相对路径和绝对路径两种形式,而绝对路径可能会使得程序的可重用性差,使得在别的终端上不能运行,而在程序中使用相对路径则会变的有极强的适应性,包括

中小学数学卷子自动生成程序-结对编程之队友代码分析

一.编程语言:C++ 二.代码解读与分析: 1. 项目逻辑 通过输入信息与数组中存储账户信息比对完成用户登录.根据不同的类型要求生成相应类型的试卷并查重.将生成题目以指定的形式存放在指定文件夹下.过程中可切换试卷类型. 2.函数功能说明 int main():主函数负责调用各个功能函数,将各个功能模块按照项目实际的使用情况与应用逻辑结合适当的提示性信息进行组织和套用. void SetPrimary(int n):生成小学类型的试卷. void SetMiddle(int n):生成初中类型的试

中小学数学卷子自动生成程序——结对分析

在上一周的个人项目中队友用的是C++,代码运行正常,且基本实现了需求文档的要求,然后关于她的代码,我觉得有很多可以借鉴的地方,也有一些需要改进的地方. 优点: 1.总体结构很清楚,思路清晰.从登录到功能切换,从试卷生成到题目生成,以及重复性检测,每一步都有对应的函数代码,思路清晰,逻辑清楚. 2.代码的编写基本符合规范要求,且注释基本到位,可读性强.例如在前面的主要函数声明中注释很清楚地标明清楚了函数的作用,函数基本命名符合规范,可以根据名字而知其意,变量命名也基本符合规范,这一点我得向她学习.

中小学数学卷子自动生成程序: 结对编程对方代码分析

需求分析: 1.命令行输入用户名和密码,两者之间用空格隔开(程序预设小学.初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学.初中和高中三个选项中的一个.否则提示“请输入正确的用户名.密码”,重新输入用户名.密码: 2.登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学.初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题.每道题目的操作

中小学数学卷子自动生成 - 结对项目wjy的代码分析

[实现思路] 命令行输入用户名和密码,匹配试卷难度,每个类的账号只能生成当前难度下的试卷: 根据试卷难度生成题目,主要是随机生成操作数的个数,每个操作数的形式,两个操作符之间的操作符,最后是随机生成括号,因为设计题目的合理性,所以在写随机生成的时候需要考虑到各种可能的情况: 最后生成的试卷以“年-月-日-时-分-秒.txt”命名方式生成到以用户名命名的文件夹中. [函数结构] public static void main(String[] args) static void init() st

中小学数学试卷自动生成程序-对张凯翔同学代码的评价

张凯翔的优点: 面向对象编程,结构清晰,修改难度小 生成了UI界面,清晰美观 相比张惟盛的代码生成的题目更加科学,比如会在平方和开方的部分增加括号,以确保意义明确 相较于C语言,采用了更加方便的Java,调用函数以及捕获异常,确保了程度的稳定性 张凯旋的缺点: 代码习惯有点问题,杂乱且缺少注释 虽然采用了全随机生成运算符的方式,但在某些算式中也会出现无意义的括号,比如在正常的加减乘除中,第一个为乘法,已经是优先的但是还是会添加无意义的括号,有瑕疵 缺少了对同一老师的不同试卷进行题目查重的步骤,虽

结对编程——基于JAVA开发的中小学生数学试卷自动生成程序

这两个星期,我和马同学一起参与了基于个人项目的中小学生数学试卷的自动生成程序结对编程项目.结对编程的实现是基于个人编程的,不过由于我是用c++而同伴是用的PYTHON商量之后我们决定用JAVA从头开始写.原本打算使用mvc框架来完成这个项目,但是由于对其使用不够熟悉,最后还是没怎么能用上. 这次项目我负责的是前端部分,前端部分做起来还是挺麻烦的,我们使用的是java来完成这个项目,对于UI界面我们使用了jframe来编写,在项目过程中遇到几个很莫名奇妙的bug,原本是用阿里云短信服务返回的验证码

个人项目评测——中小学数学卷子生成

结对编程中双方互相审查代码是一个相互学习的过程,从对方的代码中可以学到一些想不到的新的想法.正所谓孔子说的“三人行,必有我师焉”. 优点: 1.建立一个用户类,将对用户的登录.切换.生成试卷.输出文件等操作封装到类中,具有良好的封装性和可扩展性. class User { private: string Passward; int Number; string Name; string Type; string folderPath; string Path; ofstream Paper; s