第八周结对编程实验-四则运算

本次实验通过结对编程的方式,使用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同学都学到了一些编程的技巧和经验。总之,本次结对编程的实验对我们提升很大,结对编程本身也具有很多好处。

posted @ 2025-04-13 11:35  _老爹古董店  阅读(68)  评论(0)    收藏  举报