结对编程——小学生四则运算

发布时间 2023-04-09 17:18:10作者: 希望分能高

一、实验准备

  本次实验的内容是结对编程,我和2152426一起组队完成这次实验。

  实验的具体题目是小学生四则运算,其具体要求如下:

  1. 多种实现方式(C/C++C#/VB.net/Java等)
  2. 两个运算符,100 以内的数字,不需要写答案需要检查答案是否正确,并且保证答案在 0..100 之间
  3. 尽可能多的设置一些条件
  我们在语言上选择了c语言。由于实验课的时间并不是很充裕,我们尚有一大部分实验内容未完成,而为了更好的体验本次实验的意义以及减少沟通成本、提高实验效率,于是我们选择继续在课后线下面对面一起完成这次实验。

二、实验过程

  实验的流程我们采用的是他先编程,我在旁审核代码,再交换角色,我编程,他审核。我们小组选择在编码结束后,再提出审核意见,主要原因如下:1.不打断编码人的思路和节奏,提高实验效率2.审核人可以完整清晰的看到编码人的流程。

  1.首先是他进行完整编码,以下是他编写的代码及运行结果:

  源码:

#include<bits/stdc++.h>
using namespace std;
int  r[302], s[302];
int res[302];

int getRand(int a,int b);
int main(){
    for(int i =1;i<=75;i++){
        r[i]  = getRand(0,50);
        s[i] = getRand(0,50);
        res[i] = r[i] + s[i];
        printf("\t(%d)%d+%d = \t",i,r[i],s[i]);
        if(i%25 == 0){
            cout<<"\t"<<endl;
        }
    }
    for(int i = 76;i<=150;i++){
        r[i]  = getRand(0,100);
        s[i] = getRand(0,100);
        res[i] = r[i] - s[i];
        printf("\t(%d)%d-%d = \t",i,r[i],s[i]);
        if(i%25 == 0){
            cout<<"\t"<<endl;
        }
    }
    for(int i = 151;i<=225;i++){
        r[i]  = getRand(1,15);
        s[i] = getRand(0,20);
        res[i] = r[i] * s[i];
            printf("\t(%d)%d*%d = \t",i,r[i],s[i]);
        if(i%25 == 0){
            cout<<"\t"<<endl;
        }
    }
    for(int i = 226;i<=300;i++){
        r[i]  = getRand(0,30);
        s[i] = getRand(1,8);
        res[i] = r[i] / s[i];
            printf("\t(%d)%d/%d = \t",i,r[i],s[i]);
        if(i%25 == 0){
            cout<<"\t"<<endl;
        }
    }

    while(1){
        int n,i;
        cout<<"请输入题号(输入0退出程序!): ";
        cin>>n;
        if(n == 0){
            break;
        } 
        if(n >= 1 && n <= 75){
            printf("\t%d+%d = \t",r[n],s[n]);
        }else if( n>= 76 && n<=150){
            printf("\t%d-%d = \t",r[n],s[n]);
        }else if(n>= 151 && n<=225){
            printf("\t%d*%d = \t",r[n],s[n]);
        }else if(n>= 226 && n<=300){
            printf("\t%d/%d = \t",r[n],s[n]);
        }
        cout<<"请输入答案:";
        cin>>i;
        if(i == res[n]){
            cout<<"\t\t\t正确!"<<endl;
        } 
        else {
            cout<<"\t\t\t错误!"<<endl;
        } 
    }
}

int getRand(int a,int b){
    return (rand()%(b - a + 1)) + a;
} 

  运行及测试结果:

 

 

   2.我的审核建议及收获

  建议:

  从源码和运行及测试结果中可以看出,我的搭档很好的完成了题目的要求。而美中不足的有两点:1.对于题目中随机数字的范围存在一定的局限性,比如在加法中,他将两个随机加数的范围设置为[0,50],虽然这样很好的满足了题目所给的条件,最后的和不会大于100,但是却忽略了一个加数大于50,一个加数小于50,相加小于100的情况,这样使得用户小学生在练习题目时,对于这一数字范围内的运算得不到练习;2.程序输出时的排版设计的不够合理,会随着输出框的大小改变而改变。在上图中也可以看到,存在几行的排版异常。

  收获:

  同时,我也从他的整个编码流程中学习到了很多:1.良好的规划使得编码事半功倍。在开始编程前,他会先理清整个思路和流程,再根据自己的思路开始编码。刚开始我还嫌他准备工作理思路麻烦,这种简单的程序直接上手就好了,但当他理好思路开始编码后我才发现,他编码非常高效速度,出的错也很少。这也就让我意识到做好良好的准备工作的必要性。2.良好的书写代码习惯可以增加代码的可读性,方便阅读者理解,这一点可以从源码中看出来。

  改进:

  在收到我的审核意见后,我的搭档对源码进行了修改,得到如下改进运行结果:

  3.互换角色,以下是我进行的编码及运行结果:

  源码:

#include<bits/stdc++.h>
using namespace std;
int  r[302], s[302];
int res[302];
//函数声明 
int getRand(int a,int b);
void initial();
void add();
void subtract();
void multiply();
void divide();


int main(){
    initial();
}


//初始化 
void initial(){
    add();
    subtract();
    multiply();
    divide();
    while(1){
        int n,i;
        cout<<"请输入题号(输入0退出程序!): ";
        cin>>n;
        if(n == 0){
            break;
        } 
        if(n >= 1 && n <= 75){
            printf("\t%d+%d = \t",r[n],s[n]);
        }else if( n>= 76 && n<=150){
            printf("\t%d-%d = \t",r[n],s[n]);
        }else if(n>= 151 && n<=225){
            printf("\t%d*%d = \t",r[n],s[n]);
        }else if(n>= 226 && n<=300){
            printf("\t%d/%d = \t",r[n],s[n]);
        }
        cout<<"请输入答案:";
        cin>>i;
        if(i == res[n]){
            cout<<"\t\t\t正确!"<<endl;
        } 
        else {
            cout<<"\t\t\t错误!"<<endl;
        } 
    }
}
//生成随机数 
int getRand(int a,int b){
    return (rand()%(b - a + 1)) + a;
} 
//加法 
void add(){
    for(int i =1;i<=75;i++){
        r[i]  = getRand(0,100);
        s[i] = getRand(0,100-r[i]);
        res[i] = r[i] + s[i];
        printf("\t(%d)%d+%d = \t",i,r[i],s[i]);
        if(i%5==0)  printf("\n");
        if(i%75 == 0){
            cout<<"\t"<<endl;
        }
    }
}
//减法 
void subtract(){
    for(int i = 76;i<=150;i++){
        r[i]  = getRand(0,100);
        s[i] = getRand(0,r[i]);
        res[i] = r[i] - s[i];
        printf("\t(%d)%d-%d = \t",i,r[i],s[i]);
        if(i%5==0)  printf("\n");        
        if(i%75 == 0){
            cout<<"\t"<<endl;
        }
    }
}
//乘法 
void multiply(){
        for(int i = 151;i<=225;i++){
        r[i]  = getRand(1,100);
        s[i] = getRand(0,100/r[i]);
        res[i] = r[i] * s[i];
        printf("\t(%d)%d*%d = \t",i,r[i],s[i]);
        if(i%5==0)  printf("\n");        
        if(i%75 == 0){
            cout<<"\t"<<endl;
        }
    }
}
//除法 
void divide(){
    for(int i = 226;i<=300;i++){
        r[i]  = getRand(0,100);
        res[i] = r[i] / s[i];
        printf("\t(%d)%d/%d = \t",i,r[i],s[i]);
        if(i%5==0)  printf("\n");    
        if(i%75 == 0){
            cout<<"\t"<<endl;
        }
    }
}

  运行及测试结果:  

  4.我搭档的审核建议及收获

  (以下是从我搭档的视角陈述)

  建议:

  首先是流程上,尽管这是一个比较简单的程序,但是他在看了我编程一遍后还耗费了比较久的时间,除了他的习惯语言是java以外,最主要的原因是他的编码习惯相对来说不是很好。他在看了一遍题目以后就开始编程,一边编一边回过头来看题目,然后补充代码再继续,一遍遍的审题就很浪费时间,而且其中对于细节上把控的不到位,也导致经常出错,编译不通过。但是总体上从结果来说还是很好的,完成了题目要求,呈现的也很清晰明朗,代码中也加了注释,使得阅读代码更加方便。没什么需要改进的。

  收获:

  在审核完他的代码之后,我的收获也很多。首先是学习到了他的一种编码习惯,功能都用函数实现,再将功能函数进行封装,在主函数中只需要调用封装函数就行了,使得主函数简洁明了,这主要体现出了他的java编码习惯,良好的封装保护数据,这也是我之前未深入了解的,通过学习这个也能使得我加深对java的理解。其次是他的另一个编码习惯,在编码时加注释,无论是对于他人的阅读还是日后自己的阅读,加注释都是一种非常好的办法。

  

 

三、实验体会及总结

  本次结对编程实验对于我们两个人来说都是收获满满。

  所谓三人行必有我师焉,在之前的学习过程中,我们学习编程的途径主要是通过上课、自己上网这两种途径,所以我们在这上面的思维是相对狭窄的,仅仅局限于自己的所学。而个体是多样的,不同个体之间的碰撞,不同个体之间的交流能够为对方打开自己未曾涉猎而对方又了解的方面领域。比如在这次实验中,我通过审核我搭档的编码,明白了工欲善其事必先利其器,在编码前做好充分的规划,可以使得后续的编码有条不紊的进行;我搭档通过我的编码习惯,更理解了java的封装思想以及注释的好处。同时这也是一次团队合作,除了编码和审核,我们还有对这个题目的讨论,提出自己的理解和思路,一起探讨如何更好的实现某个功能,使用什么算法时间空间上更好。

  总之,这次实验不仅仅是课程的一次作业实验,更是让我们理解到结对编程的目的和好处的一次有意义的实验。在以后的编程生涯中,我们会经历很多团队形式的结对,我们要择其善者而从之,其不善者而改之,这样自己的编程能力和水平才会不断提升。