结对编程初体验——四则运算

实验要求:
小学老师要每周给同学出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.运算优先级处理:
我最初使用简单的顺序计算,搭档指出需要遵循数学运算优先级,我们共同设计了基于优先级的计算逻辑。
这些改进都是在编程过程中通过即时讨论实现的。我们深刻体会到,结对编程不仅能减少错误,更能显著提升代码质量。特别是在处理复杂逻辑时,两个人的思维碰撞往往能产生更优的解决方案。

posted @ 2025-04-17 20:26  nmc686  阅读(41)  评论(0)    收藏  举报