结对编程:简单四则运算软件

在软件工程综合实现专题课上,杨雨婷与邻宿舍的雨晨同学约定结对写程序。经过一个忙碌的周末,我们于周日晚上正式开始讨论。

项目要求与背景

小学老师要每周给同学出三百道四则运算练习题。要求算式包含两个运算符,数字在100以内,答案在0~100之间。后续有了新的要求:1.题目避免重复。2.可拓展性。3.可定制(数量/打印方式)4.具体定制(是否有乘除法,是否有括号,数值范围,加减有负数,除法是否有余数,是否支持分数,打印每行的间隔可调整。)

项目编程过程

 

最初我们写了一个简单代码,也就是317版本,之后在它的基础上增删改,依次完善了一下细节功能:

 

1.可定制算式数量

 

2.可选择是否有乘除法

 

3.换行打印

 

4.题目不重复

 

5.打印用户做题的正确率

 

项目完成时间
 估计时间实际完成时间
不需要写运算答案时10分钟30分钟
需要写答案时1小时2小时
有新的要求时3小时4小时

 

角色分工
 驾驶员领航员
前期雨晨杨雨婷
中期杨雨婷雨晨
后期雨晨杨雨婷

 

 

3个版本的代码区别
 功能
3.17版本随机生成两个100以内的数字,分别进行加减乘除,算式换行打印。
3.18版本随机生成定制的数量的算式,可以选择是否有乘除法,算式可以换行打印,算式可能重复。
3.19版本随机生成定制的数量的算式,可以选择是否有乘除法,算式可以换行打印,算式不会重复,打印用户做题的正确率。

 

项目代码

#include<iostream>
using namespace std;
#include<stdlib.h>
#include<time.h>
#include<cstdlib>
 #define random(x) (rand()%x)
int main()
{
    int a,b,e,f,g,h;
    srand((int)time(0));
    a=random(100);
    b=random(100);
    while((a+b>100)||(a-b<0)||(a*b>100)||(a%b!=0))
    {    
        a=random(100);
        b=random(100);
    } 
    cout<<a<<"+"<<b<<"=\n";
    cin>>e;
    cout<<a<<"-"<<b<<"=\n";
    cin>>f;
    cout<<a<<"x"<<b<<"=\n";
    cin>>g;
    cout<<a<<"/"<<b<<"=\n";
    cin>>h;
    if(e==a+b)
        cout<<"第1题正确!\n";
    else
        cout<<"第1题错误!\n" ; 
    if(f==a-b)
        cout<<"第2题正确!\n";
    else
        cout<<"第2题错误!\n" ;
    if(g==a*b)
        cout<<"第3题正确!\n";
    else
        cout<<"第3题错误!\n" ; 
    if(h==a/b)
        cout<<"第4题正确!\n";
    else
        cout<<"第4题错误!\n" ; 
}
View Code(3.17被淘汰的旧版本1)
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)
int main()
{
int a[1000],b[1000],e[1000],k[1000],n,m,o,t,i,j;
double l=0;
srand((int)time(0));
cout<<"请输入生成题目数量:";
cin>>o;
cout<<"请问是否有乘除法(1为有,0为无):";
cin>>t;
cout<<"\n";
if(t==1)
{
m=o%4;
n=o/4;
for(i=0;i<n+m;i++)               
{
a[i]=random(100);
b[i]=random(100);
while((a[i]+b[i]>100))
{ 
a[i]=random(100);
b[i]=random(100);
} 
e[i]=a[i]+b[i];
}
for(i=n+m;i<2*n+m;i++)        
{
a[i]=random(100);
b[i]=random(100);
while((a[i]-b[i]<0))
{ 
a[i]=random(100);
b[i]=random(100);
} 
e[i]=a[i]-b[i];
} 
for(i=2*n+m;i<3*n+m;i++)         
{
a[i]=random(100);
b[i]=random(100);
while((a[i]*b[i]>100))
{ 
a[i]=random(100);
b[i]=random(100);
} 
e[i]=a[i]*b[i];
}
for(i=3*n+m;i<4*n+m;i++)            
{
a[i]=random(100);
b[i]=random(100);
while((a[i]%b[i]!=0)||a[i]==0||b[i]==0)
{ 
a[i]=random(100);
b[i]=random(100);
} 
e[i]=a[i]/b[i];
}
for(i=0;i<n+m;i++)                       
{
cout<<a[i]<<"+"<<b[i]<<"=   ";
if((i+1)%4==0)
cout<<"\n"; 
} 
if(o<16&&o!=7)
cout<<"\n\n";
else
cout<<"\n";
for(i=n+m;i<2*n+m;i++)
{
cout<<a[i]<<"-"<<b[i]<<"=  ";
if((i-n-m+1)%4==0)
cout<<"\n"; 
}
if(o<16)
cout<<"\n\n";
else
cout<<"\n";
for(i=2*n+m;i<3*n+m;i++)
{
cout<<a[i]<<"x"<<b[i]<<"=  ";
if((i-2*n-m+1)%4==0)
cout<<"\n"; 
}
if(o<16)
cout<<"\n\n";
else
cout<<"\n";
for(i=3*n+m;i<4*n+m;i++)
{
cout<<a[i]<<"/"<<b[i]<<"=  ";
if((i-3*n-m+1)%4==0)
cout<<"\n"; 
}
if(o<15)
cout<<"\n\n";
else
cout<<"\n";

}
else
{
m=o%2;
n=o/2;
for(i=0;i<n+m;i++)
{
a[i]=random(100);
b[i]=random(100);
while((a[i]+b[i]>100))
{ 
a[i]=random(100);
b[i]=random(100);
} 
e[i]=a[i]+b[i];
}
for(i=n+m;i<2*n+m;i++)
{
a[i]=random(100);
b[i]=random(100);
while((a[i]-b[i]<0))
{ 
a[i]=random(100);
b[i]=random(100);
} 
e[i]=a[i]-b[i];
}

for(i=0;i<n+m;i++)                       
{
cout<<a[i]<<"+"<<b[i]<<"=  ";
if((i+1)%4==0)
cout<<"\n"; 
} 
if(o<7)
cout<<"\n\n";
else
cout<<"\n";
for(i=n+m;i<2*n+m;i++)
{
cout<<a[i]<<"-"<<b[i]<<"=  ";
if((i-n-m+1)%4==0)
cout<<"\n";
}
if(o<7)
cout<<"\n\n";
else
cout<<"\n";
} 
cout<<"\n"<<"请输入答案:\n";
for(i=0;i<o;i++)
{
cin>>k[i];
}
for(i=0;i<o;i++)
{
if(k[i]==e[i])
{
cout<<""<<i+1<<"正确!\n";
l++;
}

else
cout<<""<<i+1<<"错误! 正确答案是:"<<e[i]<<"\n";
}
cout<<"正确率为"<<l/o*100<<"%\n";
} 
View Code(3.18被淘汰的旧版本2)
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)
int main()
{
int a[1000],b[1000],e[1000],k[1000],n,m,o,t,i,j;
double l=0;
srand((int)time(0));
cout<<"请输入生成题目数量:";
cin>>o;
cout<<"请问是否有乘除法(1为有,0为无):";
cin>>t;
cout<<"\n";
if(t==1)
{
m=o%4;
n=o/4;
for(i=0;i<n+m;i++)               
{
a[i]=random(100);
b[i]=random(100);
while((a[i]+b[i]>100))
{ 
a[i]=random(100);
b[i]=random(100);
} 
for(j=0;j<i;j++)
{
if(a[i]==a[j]&&b[i]==b[j])
{
a[i]=random(100);
b[i]=random(100);
}
}
e[i]=a[i]+b[i];
}
for(i=n+m;i<2*n+m;i++)        
{
a[i]=random(100);
b[i]=random(100);
while((a[i]-b[i]<0))
{ 
a[i]=random(100);
b[i]=random(100);
} 
for(j=0;j<i;j++)
{
if(a[i]==a[j]&&b[i]==b[j])
{
a[i]=random(100);
b[i]=random(100);
}
}
e[i]=a[i]-b[i];
} 
for(i=2*n+m;i<3*n+m;i++)         
{
a[i]=random(100);
b[i]=random(100);
while((a[i]*b[i]>100))
{ 
a[i]=random(100);
b[i]=random(100);
} 
for(j=0;j<i;j++)
{
if(a[i]==a[j]&&b[i]==b[j])
{
a[i]=random(100);
b[i]=random(100);
}
}
e[i]=a[i]*b[i];
}
for(i=3*n+m;i<4*n+m;i++)            
{
a[i]=random(100);
b[i]=random(100);
while((a[i]%b[i]!=0)||a[i]==0||b[i]==0)
{ 
a[i]=random(100);
b[i]=random(100);
} 
for(j=0;j<i;j++)
{
if(a[i]==a[j]&&b[i]==b[j])
{
a[i]=random(100);
b[i]=random(100);
}
}
e[i]=a[i]/b[i];
}
for(i=0;i<n+m;i++)                       
{
cout<<a[i]<<"+"<<b[i]<<"=   ";
if((i+1)%4==0)
cout<<"\n"; 
} 
if(o<16&&o!=7)
cout<<"\n\n";
else
cout<<"\n";
for(i=n+m;i<2*n+m;i++)
{
cout<<a[i]<<"-"<<b[i]<<"=  ";
if((i-n-m+1)%4==0)
cout<<"\n"; 
}
if(o<16)
cout<<"\n\n";
else
cout<<"\n";
for(i=2*n+m;i<3*n+m;i++)
{
cout<<a[i]<<"x"<<b[i]<<"=  ";
if((i-2*n-m+1)%4==0)
cout<<"\n"; 
}
if(o<16)
cout<<"\n\n";
else
cout<<"\n";
for(i=3*n+m;i<4*n+m;i++)
{
cout<<a[i]<<"/"<<b[i]<<"=  ";
if((i-3*n-m+1)%4==0)
cout<<"\n"; 
}
if(o<15)
cout<<"\n\n";
else
cout<<"\n";

}
else
{
m=o%2;
n=o/2;
for(i=0;i<n+m;i++)
{
a[i]=random(100);
b[i]=random(100);
while((a[i]+b[i]>100))
{ 
a[i]=random(100);
b[i]=random(100);
} 
e[i]=a[i]+b[i];
}
for(i=n+m;i<2*n+m;i++)
{
a[i]=random(100);
b[i]=random(100);
while((a[i]-b[i]<0))
{ 
a[i]=random(100);
b[i]=random(100);
} 
e[i]=a[i]-b[i];
}

for(i=0;i<n+m;i++)                       
{
cout<<a[i]<<"+"<<b[i]<<"=  ";
if((i+1)%4==0)
cout<<"\n"; 
} 
if(o<7)
cout<<"\n\n";
else
cout<<"\n";
for(i=n+m;i<2*n+m;i++)
{
cout<<a[i]<<"-"<<b[i]<<"=  ";
if((i-n-m+1)%4==0)
cout<<"\n";
}
if(o<7)
cout<<"\n\n";
else
cout<<"\n";
} 
cout<<"\n"<<"请输入答案:\n";
for(i=0;i<o;i++)
{
cin>>k[i];
}
for(i=0;i<o;i++)
{
if(k[i]==e[i])
{
cout<<""<<i+1<<"正确!\n";
l++;
}

else
cout<<""<<i+1<<"错误! 正确答案是:"<<e[i]<<"\n";
}
cout<<"正确率为"<<l/o*100<<"%\n";
} 
View Code(3.19最新版本)

 

项目的bug与修复

这次编写程序的过程中遇到了许多问题,以下将一一列出:
1.随机数有问题
在最初的程序中,我们采用的random函数只能随机一次,之后再执行程序数据也不会改变。多次检查发现这一问题后,上网了解了有关random函数的相关资料,在开头添加了
time.h 使得random可以随机多个随机数。期间我们还考虑了rand函数,不过考虑到便利性以及程序的复杂程度,最终还是采用了random函数作为生成随机数的函数。

2.随机数的存放
起初我们建立一共建立了六个数组用于存放随机数及其计算结果,后四个数组e[1000],f[1000],g[1000],h[1000]分别存放了加减乘除四种运算的结果。后来发现这样会使得程序变得复杂且有无意义的重复,经过讨论及调试后将计算结果整合在了一个数组中,使得后续编写程序也变得相对简单。

3.随机数的限制
我们对于随机数的限制包括——相加结果不大于100,相减结果不为负数,相乘结果不大于100,相除没有余数。这些条件由一个while判断,且错误的使用了&&符号,导致随机出来的数据与我们预期的大相径庭,而且一些符合其他限制而不符合另一些限制的随机也会被排除,导致随机数数量下降。之后我们将其分开,加法有加法的随机数限制,以此类推,不光解决了出来数据不符合限制的问题,也使得数字更为丰富。

4.答案有误
在添加校对答案这一功能时,我们发现明明输入的结果正确,显示的却是“第x题错误!”这一情况,在对函数进行反复排查之后,发现是for循环中i的数据有误这一微小错误,导致输入的数据与存放的答案对不上号,将其改正后,该功能便能正常使用。

项目中有待改进的问题

在功能方面,在具体定制中只实现了其中一个功能,还有很多可以继续增加的功能。

在软件方面,我们只是编了一个C++的源代码,并没有生成一个软件可供用户使用。

在性能方面,我们的代码还需要完善,解决偶尔无法生成运算式而直接结束的问题。

运行截图

2019-03-17

3.17版本 不可定制是否有乘除法的运算:

 

 

2019-03-18

3.18版本 定制不含乘除法的运算:

 

3.18版本 定制含乘除法的运算(未实现题目避免重复):

 

2019-03-19

3.19版本 定制含乘除法的运算(实现了避免题目重复

心得体会

第一次与同学进行两人结对编程,感觉很新奇,合作需要二人的相互配合、理解与沟通。我在这次结对编程的过程中,通过观察队友的优点,意识到了自己的不足之处。在两个人的观察下,在代码中发现新的问题,然后解决它,完善它,一点点进步。我们的项目虽然并不完美,还有许多地方需要完善。但在结对编程的过程中,我们收获了很多比结果更重要的东西。(杨雨婷)

这是时隔多久的结对编程,和同伴一起编程能够有更多的想法,当我独自没有办法解决时,有一个很好的伙伴就能一起想办法解决问题。一起编程也更加轻松自在,独自一人对这电脑啪啪敲代码难免会有些无聊。两人一起不光效率提高,而且还能随时交流想法,使得程序更加完善。即使偶尔会出现想法相左的情况,经过讨论,便能得出一个更加完善的解决方案。在程序出现错误时,两人一起验证,也能使得错误能够尽快被修正。总而言之,结对编程是能够更好地完成工作,这也是难忘的一次编程体验。(雨晨)

 

转载于:https://www.cnblogs.com/torrero/p/10562188.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值