结对编程:简单四则运算软件
Posted torrero
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对编程:简单四则运算软件相关的知识,希望对你有一定的参考价值。
在软件工程综合实现专题课上,杨雨婷与邻宿舍的雨晨同学约定结对写程序。经过一个忙碌的周末,我们于周日晚上正式开始讨论。
项目要求与背景
小学老师要每周给同学出三百道四则运算练习题。要求算式包含两个运算符,数字在100以内,答案在0~100之间。后续有了新的要求:1.题目避免重复。2.可拓展性。3.可定制(数量/打印方式)4.具体定制(是否有乘除法,是否有括号,数值范围,加减有负数,除法是否有余数,是否支持分数,打印每行的间隔可调整。)
项目编程过程
最初我们写了一个简单代码,也就是317版本,之后在它的基础上增删改,依次完善了一下细节功能:
1.可定制算式数量
2.可选择是否有乘除法
3.换行打印
4.题目不重复
5.打印用户做题的正确率
估计时间 | 实际完成时间 | |
不需要写运算答案时 | 10分钟 | 30分钟 |
需要写答案时 | 1小时 | 2小时 |
有新的要求时 | 3小时 | 4小时 |
驾驶员 | 领航员 | |
前期 | 雨晨 | 杨雨婷 |
中期 | 杨雨婷 | 雨晨 |
后期 | 雨晨 | 杨雨婷 |
功能 | |
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<<"= "; cin>>e; cout<<a<<"-"<<b<<"= "; cin>>f; cout<<a<<"x"<<b<<"= "; cin>>g; cout<<a<<"/"<<b<<"= "; cin>>h; if(e==a+b) cout<<"第1题正确! "; else cout<<"第1题错误! " ; if(f==a-b) cout<<"第2题正确! "; else cout<<"第2题错误! " ; if(g==a*b) cout<<"第3题正确! "; else cout<<"第3题错误! " ; if(h==a/b) cout<<"第4题正确! "; else cout<<"第4题错误! " ; }
#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<<" "; 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<<" "; } if(o<16&&o!=7) cout<<" "; else cout<<" "; for(i=n+m;i<2*n+m;i++) { cout<<a[i]<<"-"<<b[i]<<"= "; if((i-n-m+1)%4==0) cout<<" "; } if(o<16) cout<<" "; else cout<<" "; 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<<" "; } if(o<16) cout<<" "; else cout<<" "; for(i=3*n+m;i<4*n+m;i++) { cout<<a[i]<<"/"<<b[i]<<"= "; if((i-3*n-m+1)%4==0) cout<<" "; } if(o<15) cout<<" "; else cout<<" "; } 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<<" "; } if(o<7) cout<<" "; else cout<<" "; for(i=n+m;i<2*n+m;i++) { cout<<a[i]<<"-"<<b[i]<<"= "; if((i-n-m+1)%4==0) cout<<" "; } if(o<7) cout<<" "; else cout<<" "; } cout<<" "<<"请输入答案: "; for(i=0;i<o;i++) { cin>>k[i]; } for(i=0;i<o;i++) { if(k[i]==e[i]) { cout<<"第"<<i+1<<"正确! "; l++; } else cout<<"第"<<i+1<<"错误! 正确答案是:"<<e[i]<<" "; } cout<<"正确率为"<<l/o*100<<"% "; }
#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<<" "; 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<<" "; } if(o<16&&o!=7) cout<<" "; else cout<<" "; for(i=n+m;i<2*n+m;i++) { cout<<a[i]<<"-"<<b[i]<<"= "; if((i-n-m+1)%4==0) cout<<" "; } if(o<16) cout<<" "; else cout<<" "; 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<<" "; } if(o<16) cout<<" "; else cout<<" "; for(i=3*n+m;i<4*n+m;i++) { cout<<a[i]<<"/"<<b[i]<<"= "; if((i-3*n-m+1)%4==0) cout<<" "; } if(o<15) cout<<" "; else cout<<" "; } 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<<" "; } if(o<7) cout<<" "; else cout<<" "; for(i=n+m;i<2*n+m;i++) { cout<<a[i]<<"-"<<b[i]<<"= "; if((i-n-m+1)%4==0) cout<<" "; } if(o<7) cout<<" "; else cout<<" "; } cout<<" "<<"请输入答案: "; for(i=0;i<o;i++) { cin>>k[i]; } for(i=0;i<o;i++) { if(k[i]==e[i]) { cout<<"第"<<i+1<<"正确! "; l++; } else cout<<"第"<<i+1<<"错误! 正确答案是:"<<e[i]<<" "; } cout<<"正确率为"<<l/o*100<<"% "; }
项目的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版本 定制含乘除法的运算(实现了避免题目重复)
心得体会
第一次与同学进行两人结对编程,感觉很新奇,合作需要二人的相互配合、理解与沟通。我在这次结对编程的过程中,通过观察队友的优点,意识到了自己的不足之处。在两个人的观察下,在代码中发现新的问题,然后解决它,完善它,一点点进步。我们的项目虽然并不完美,还有许多地方需要完善。但在结对编程的过程中,我们收获了很多比结果更重要的东西。(杨雨婷)
这是时隔多久的结对编程,和同伴一起编程能够有更多的想法,当我独自没有办法解决时,有一个很好的伙伴就能一起想办法解决问题。一起编程也更加轻松自在,独自一人对这电脑啪啪敲代码难免会有些无聊。两人一起不光效率提高,而且还能随时交流想法,使得程序更加完善。即使偶尔会出现想法相左的情况,经过讨论,便能得出一个更加完善的解决方案。在程序出现错误时,两人一起验证,也能使得错误能够尽快被修正。总而言之,结对编程是能够更好地完成工作,这也是难忘的一次编程体验。(雨晨)
以上是关于结对编程:简单四则运算软件的主要内容,如果未能解决你的问题,请参考以下文章