结对编程初体验——四则运算
实验要求:
小学老师要每周给同学出300道四则运算练习题。 这个程序有很多种实现方式: C/C++ C#/VB.net/Java Excel Unix Shell Emacs/Powershell/Vbscript Perl Python 两个运算符,100 以内的数字,不需要写答案。 需要检查答案是否正确,并且保证答案在 0..1000 之间 尽可能地多设置一些条件 请两位同学以结对编码(一个同学coding,另一个同学在旁边审核代码,之后再交换角色)的方式完成本次实验。这次试验由我和另一个同学(学号2352217完成)。
算法设计思路:
题目生成逻辑:
随机数生成:使用 rand() 生成3个100以内的操作数 (num1, num2, num3) 和2个运算符 (op1, op2)。
运算顺序处理:根据运算符优先级(乘除 > 加减)调整计算顺序:
若 op1 是乘除,先计算 num1 op1 num2,再与 num3 进行 op2 运算。
若 op2 是乘除且 op1 是加减,先计算 num2 op2 num3,再与 num1 进行 op1 运算。
结果验证:
通过 while 循环确保结果在 0-1000 之间,否则重新生成题目。
除法处理:
避免除零与小数结果:当运算符为除法时,调整被除数为除数的倍数:
若 op1 是除法,强制 num1 = num2 * k(k 为随机整数),确保整除。
若 op2 是除法,调整 num3 为 num2 的因数,但实现逻辑较复杂且存在潜在问题。
用户交互:
输出题目后读取用户输入,立即反馈正确性,并统计正确题数。
通过 while 循环来判断输入是否为数字,不是的话则让用户重新输入。
程序代码
#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
char oplist[4]={'+','-','*','/'};
int CulculationResult(int num1,int num2,int op){
switch(op){
case 0:
return num1+num2;
case 1:
return num1-num2;
case 2:
return num1*num2;
case 3:
return num1/num2;
}
}
bool Calculate(){
int num1,num2,num3;
int op1,op2;
int result = -1;
int answer;
while(result<0||result>1000){
num1 = rand()%100+1;
num2 = rand()%100+1;
num3 = rand()%100+1;
op1 = rand()%4;
op2 = rand()%4;
if(op1==3&&op2==3){
num2 = rand()%40+1;
num1 = num2*(rand()%10+1);
for(int i=2;i<=num1/num2;i++){
if(num1/num2%i==0){
cout<<num3<<endl;
int ran=rand()%2;
if(ran==1){
break;
}
}
}
}
else if(op1==3){
num2 = rand()%10+1;
num1 = num2*(rand()%10+1);
}
else if(op2==3){
if(op1!=2){
num3 = rand()%10+1;
num2 = num3*(rand()%10+1);
}
else{
for(int i=2;i<=num1*num2;i++){
if(num1*num2%i==0){
cout<<num3<<endl;
int ran=rand()%2;
if(ran==1){
break;
}
}
}
}
}
if(op1>=2){
result = CulculationResult(num1,num2,op1);
result = CulculationResult(result,num3,op2);
}
else if(op1<2&&op2>=2){
result = CulculationResult(num2,num3,op2);
result = CulculationResult(num1,result,op1);
}
}
cout<<num1<<oplist[op1]<<num2<<oplist[op2]<<num3<<"=";
cin>>answer;
if(answer==result){
cout<<"回答正确!"<<endl;
return true;
}
else{
cout<<"回答错误!正确答案是"<<result<<endl;
return false;
}
}
int main(){
srand((unsigned)time(NULL));
int correct = 0;
for(int i=0;i<3;i++){
if(Calculate()){
correct+=1;
}
}
cout<<"正确题数:"<<correct<<endl;
return 0;
}
运算结果截图

结对编程体会
2352217:
在开发这个四则运算程序的过程中,我们最深刻的体会就是算法优化需要双方的深入讨论。特别是在处理除法运算时,我们遇到了几个关键问题:
1.除数为零的边界情况
2.整数除法的结果不为整数
我们在共同思考后得出了较为完善的解决方案:通过确保被除数是除数的整数倍来避免小数结果。我们共同设计了以下处理逻辑:
1.当出现除法运算时,先随机生成除数(1-10)
2.再生成对应的被除数(除数的整数倍)
这种协同思考的过程让我们意识到,好的算法设计往往需要兼顾功能实现和边界处理,而结对编程正是实现这一目标的最佳方式。
2352212:
在实现用户交互功能时,我们经历了多次迭代优化:
1.输入验证的完善:
最初版本没有处理非数字输入,经过讨论增加了输入错误处理,最终实现了健壮的用户输入验证。
2.运算优先级处理:
我最初使用简单的顺序计算,搭档指出需要遵循数学运算优先级,我们共同设计了基于优先级的计算逻辑。
这些改进都是在编程过程中通过即时讨论实现的。我们深刻体会到,结对编程不仅能减少错误,更能显著提升代码质量。特别是在处理复杂逻辑时,两个人的思维碰撞往往能产生更优的解决方案。
浙公网安备 33010602011771号