第八周结对编程实验-四则运算
本次实验通过结对编程的方式,使用c++语言初步实现了比较简单的四则运算题目生成的程序。(同学A:2311422,同学B:2352110)
本次实验的实验要求:
1.两个运算符,100 以内的数字,不需要写答案。
2.需要检查答案是否正确,并且保证答案在 0-1000 之间。
3.尽可能地多设置一些条件。
基于上述要求,我和我的结对伙伴共同完成了如下程序:
点击查看代码
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int answer[5];
int random1() {
return rand() % 101;
}
bool check(int num1, int num2, int num3, char op1, char op2, int index) {
if (op1 == op2) return false;
bool firstHigher = (op1 == '*' || op1 == '/');
bool secondHigher = (op2 == '*' || op2 == '/');
int result;
if (secondHigher && !firstHigher) {
if (op2 == '-' && num2 < num3) return false;
if (op2 == '/' && (num3 == 0 || num2 % num3 != 0)) return false;
int subResult;
switch(op2) {
case '+': subResult = num2 + num3; break;
case '-': subResult = num2 - num3; break;
case '*': subResult = num2 * num3; break;
case '/': subResult = num2 / num3; break;
default: return false;
}
if (op1 == '-' && num1 < subResult) return false;
if (op1 == '/' && (subResult == 0 || num1 % subResult != 0)) return false;
switch(op1) {
case '+': result = num1 + subResult; break;
case '-': result = num1 - subResult; break;
case '*': result = num1 * subResult; break;
case '/': result = num1 / subResult; break;
default: return false;
}
} else {
if (op1 == '-' && num1 < num2) return false;
if (op1 == '/' && (num2 == 0 || num1 % num2 != 0)) return false;
int temp;
switch(op1) {
case '+': temp = num1 + num2; break;
case '-': temp = num1 - num2; break;
case '*': temp = num1 * num2; break;
case '/': temp = num1 / num2; break;
default: return false;
}
if (op2 == '-' && temp < num3) return false;
if (op2 == '/' && (num3 == 0 || temp % num3 != 0)) return false;
switch(op2) {
case '+': result = temp + num3; break;
case '-': result = temp - num3; break;
case '*': result = temp * num3; break;
case '/': result = temp / num3; break;
default: return false;
}
}
if (result >= 0 && result <= 1000) {
answer[index] = result;
return true;
}
return false;
}
void cal(int time) {
char operators[] = {'+', '-', '*', '/'};
for (int i = 0; i < time;) {
char op1, op2;
do {
op1 = operators[rand() % 4];
op2 = operators[rand() % 4];
} while (op1 == op2);
int a = random1(), b = random1(), c = random1();
if (check(a, b, c, op1, op2, i)) {
cout << a << op1 << b << op2 << c << endl;
i++;
}
}
}
int main() {
srand(time(0));
int choice;
while(1){
cout << "小朋友,先做5道四则运算练习题,请将答案以空格分开:" << endl;
cal(5);
for (int i = 0; i < 5; i++) {
int ans;
cin >> ans;
if (ans == answer[i]) {
cout << "小朋友你做对了!太厉害了!!!" << endl;
} else {
cout << "答错了,正确答案是:" << answer[i] << endl;
}
}
cout<<"小朋友还想练习吗? 0退出 1继续"<<endl;
cin>>choice;
if(!choice){
return 0;
}
else{
continue;
}
}
return 0;
}

本次程序的设计思路及过程:
在实验过程中,我们起初只是实现了任意数量题目的随机生成,当时暂时没有考虑到实验要求中第二点的约束,导致生成的算数题目计算结果过大。之后,B同学和我商讨过后,写出了check()函数来过滤掉那些不满足实验要求的算数题目。通过程序的多次运行,我发现我们程序所生成的算数题目每次都是一样的(生成的都是伪随机数),之后我通过查阅资料,对这一问题进行了解决。最后,我们商讨并编写了检验用户结果正误的代码,并且考虑到题目数量的问题,我们最终决定每次只生成5道题目供用户回答并实时反馈每道题目的正误,同时用户回答完五道题目之后可以选择退出或继续写5道题。
对结对编程利弊的思考:
我和B同学认为结对编程有很多好处,比如我们在编程的过程中能够实时发现一些编程的错误并及时修改,另外两人代码的结合能够提升程序的质量,还能够增强自身交流沟通的能力、增强团队协作水平。同时,通过本次结对编程,我和B同学都学到了一些编程的技巧和经验。总之,本次结对编程的实验对我们提升很大,结对编程本身也具有很多好处。

浙公网安备 33010602011771号