结对编程

一、实验目的

     本次学习的任务是通过两人结对编程的方式,来体会团队合作的过程。整个任务是由2152222和我共同完成。具体是编写一个出四则运算的程序。

     要求如下:

  • 小学老师要每周给同学出300道四则运算练习题
  • 这个程序有很多种实现方式:
C/C++
C#/VB.net/Java
Excel
Unix Shell
Emacs/Powershell/Vbscript
Perl
Python
  •  一或两个运算符(a+b或a+b+c),100以内的数字,不需要写答案。

  • 需要检查答案是否正确,并且保证答案在0...100之间
  • 尽可能地多设置一些条件

 

二、实验具体内容与过程

编写语言:C++

实现功能:

  • 系统能够生成运算的答案来与用户输入的答案进行核对
  • 每次出一道题来让用户做计算
  • 能够判断用户输入答案的对错,如果错误则显示正确的答案
  • 两个数作四则运算和三个数作四则运算均实现
  • 能够统计正确的次数

编写大致过程:

      在整个程序的编写过程中,我和同伴不断交流讨论,一个人进行编写,另外一个人在旁边复审,然后过一段时间进行角色互换,通过这种方式完成了本次的学习任务。在程序中,我们通过使用随机数求余的方式来随机生成运算数和运算符。由于运算符有四个,因此同伴提出用随机数对四求余加上最小运算符的ASCII码值来生成运算符并存入字符变量中,但是四个运算符的ASCII码并不是相邻的,因此这种方式具有一定的复杂性。我提出直接对四求余,其数字结果与运算符一一对应,这或许是一种更为简单的处理方式。

      此外,由于每次生成的算式结果不一定在0-100以内,因此我们要对结果进行判断。当我想要解决300次循环,每次都能成功生成算式输出的问题时,想要在for(i=0-300)的循环里添加一个while循环来判断每次运算结果,却不知道该怎么处理首次循环的时候,同伴针对性地提出了do while的结构,令我拍手叫好,从而能够正确地处理这个问题。诸如此类的情况还有很多。

 

代码:

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<math.h>
using namespace std;

//我编写
double Calc_two(int x,int y,char Operator) 
{
    switch(Operator) 
    {
        case '+':return (double)x+y;
                 break;
        case '-':return (double)x-y;
                 break;
        case '*':return (double)x*y;
                 break;
        case '/':return (double)x/y;
                 break;
    }
    return -1;
}

void Calc_twonum()
{
    srand(time(NULL));
    int i,op,x,y;
    double key;double ans;
    int correct_count=0;int total_count=0;
    for(i=0;i<300;i++)
    {
        
        do
        {
            op=rand()%4;//0代表+,1代表-,2代表*,3代表/ 
            x = rand() % 100 + 1; // 生成1到100之间的随机整数
            y = rand() % 100 + 1;
            switch(op)
            {
                case 0:
                        key=Calc_two(x,y,'+');
                    if(key>0&&key<100)cout<<x<<"+"<<y<<"="<<endl;
                        else continue;
                    break;
                case 1:
                    key=Calc_two(x,y,'-');
                    if(key>0&&key<100)cout<<x<<"-"<<y<<"="<<endl;
                        else continue;
                    break;
                case 2:
                    key=Calc_two(x,y,'*');
                    if(key>0&&key<100)cout<<x<<"*"<<y<<"="<<endl;
                        else continue;
                    break;
                case 3:
                    key=Calc_two(x,y,'/');
                    if(key>0&&key<100)cout<<x<<"/"<<y<<"="<<endl;
                        else continue;
                        break;
            }
        }while(key>100||key<0);
        key = round(key * 100);
        key = key / 100;
        cout<<"请输入答案:";
        cin>>ans;
        if (ans == key)
        {
            correct_count++;
            cout<<"回答正确!"<<endl<<endl;
        }
        else 
        {
            cout<<"回答错误!正确答案是:"<<key<<endl<<endl;
        }
    }
}

//同伴编写
double Calc_three(int x,int y,int z,char operator1,char operator2) 
{
    switch(operator1) 
    {
        case '+':
            
            if(operator2=='+')     return (double)x+y+z;
            if(operator2=='-')  return (double)x+y-z;
            if(operator2=='*')  return (double)y*z+x;
            if(operator2=='/')  return (double)y/z+x;
            break;
        case '-':
            if(operator2=='+') return (double)x-y+z;
            if(operator2=='-') return (double)x-y-z;
            if(operator2=='*') return (double)-y*z+x;
            if(operator2=='/') return (double)-y/z+x;
            break;
        case '*':
            if(operator2=='+') return (double)x*y+z;
               if(operator2=='-') return (double)x*y-z;
               if(operator2=='*') return (double)x*y*z;
            if(operator2=='/') return (double)x*y/z;
            break;
        case '/':
            if(operator2=='+') return (double)x/y+z;
            if(operator2=='-') return (double)x/y-z;
            if(operator2=='*') return (double)x/y*z;
            if(operator2=='/') return (double)x/y/z;
            break;
    }
    return -1;
}

void Calc_threenum()
{
    srand(time(NULL)); // 用当前时间作为随机数种子
    int i,op1,op2,x,y,z;
    double key;double ans;
    int correct_count=0;int total_count=0;
    for(i=0;i<300;i++)
    {
        
        do
        {
            //cout<<i<<endl;
            op1=rand()%4;op2=rand()%4;//0代表+,1代表-,2代表*,3代表/ 
            //cout<<op1<<" "<<op2<<endl;
            x = rand() % 100 + 1; // 生成1到100之间的随机整数
            y = rand() % 100 + 1;
               z = rand() % 100 + 1;
            //cout<<x<<" "<<y<<" "<<z<<endl;
            switch(op1)
            {
                case 0:
                    if(op2==0)
                    {
                        key=Calc_three(x,y,z,'+','+');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"+"<<y<<"+"<<z<<"="<<endl;
                        else continue;    
                    }
                    if(op2==1)
                    {
                        key=Calc_three(x,y,z,'+','-');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"+"<<y<<"-"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==2)
                    {
                        key=Calc_three(x,y,z,'+','-');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"+"<<y<<"-"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==3)
                    {
                        key=Calc_three(x,y,z,'+','*');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"+"<<y<<"*"<<z<<"="<<endl;
                        else continue;
                    }
                    break;
                case 1:
                    if(op2==0)
                    {
                        key=Calc_three(x,y,z,'-','+');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"-"<<y<<"+"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==1)
                    {
                        key=Calc_three(x,y,z,'-','-');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"-"<<y<<"-"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==2)
                    {
                        key=Calc_three(x,y,z,'-','*');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"-"<<y<<"*"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==3)
                    {
                        key=Calc_three(x,y,z,'-','/');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"-"<<y<<"/"<<z<<"="<<endl;
                        else continue;
                    }
                    break;
                case 2:
                    if(op2==0)
                    {
                        key=Calc_three(x,y,z,'*','+');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"+"<<y<<"*"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==1)
                    {
                        key=Calc_three(x,y,z,'*','-');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"*"<<y<<"-"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==2)
                    {
                        key=Calc_three(x,y,z,'*','*');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"*"<<y<<"*"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==3)
                    {
                        key=Calc_three(x,y,z,'*','/');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"*"<<y<<"/"<<z<<"="<<endl;
                        else continue;
                    }
                    break;
                case 3:
                    if(op2==0)
                    {
                        key=Calc_three(x,y,z,'/','+');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"/"<<y<<"+"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==1)
                    {
                        key=Calc_three(x,y,z,'/','-');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"/"<<y<<"-"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==2)
                    {
                        key=Calc_three(x,y,z,'/','*');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"/"<<y<<"*"<<z<<"="<<endl;
                        else continue;
                    }
                    if(op2==3)
                    {
                        key=Calc_three(x,y,z,'/','/');
                        //cout<<"key="<<key<<endl;
                        if(key>0&&key<100)cout<<x<<"/"<<y<<"/"<<z<<"="<<endl;
                        else continue;
                    }
                    break; 
            }
        }while(key>100||key<0);
        key = round(key * 100);
        key = key / 100;
        cout<<"请输入答案:";
        cin>>ans;
        if (ans == key)
        {
            correct_count++;
            cout<<"回答正确!"<<endl<<endl;
        }
        else 
        {
            cout<<"回答错误!正确答案是:"<<key<<endl<<endl;
        }
    }
}

int main()
{
    //Calc_threenum();
    Calc_twonum();
    return 0;
}

 

运行结果:

 

 

 

 三、博客体会

我:通过本次结对编程的学习,我体会到了分工协作和团队意识的重要性。在写代码的时候,如果发现了错误或者是不清楚的地方,我们会及时互相提醒进行检查,整合不同意见。通过和同伴的共同努力,我们一起解决了许多遇到的困难。同时在编程过程中对部分内容的不熟悉,如operator是一个标识符,不能将其设置为变量名等,解决这些问题花费了我一定的时间,使整个编程过程变慢下来,希望今后自己可以变得更加熟练。

同伴:我发现与同伴的交流可以促进我的一些想法,因为不断交流编写检查讨论的过程其实就是两个人的思维在碰撞的过程。而且,通过这次实践,我对结对编程的意义有了更好的体会。这种编程方式的效率比起一个人编程提高了不少,而且这种方式能够促进两个人共同进步,对两个人都有很大的益处,也让我明白了团队合作的重要性。我相信在以后的编程实践中,我会更加注重团队合作,充分发挥每个人的优势,共同创造出更加优秀的成果。

由于时间仓促,我们的程序还有很多不完善的地方,并且可以添加很多功能,比如完善用户的界面,每道题可以随机两个数或者三个数,每做一道题显示做题数和正确数,每页显示二十道题,用清屏实现换页功能等,但主要功能已经实现,只要再花一些时间,把界面做的整齐一些,调用主要功能,相信一定能够实现一个很完善的实用性很强的程序。

posted @ 2023-04-09 17:37  nwcaiuehch  阅读(29)  评论(0)    收藏  举报