结对编程——四则运算题目生成程序

发布时间 2023-04-08 22:42:22作者: 汪金涛

在本次结对编程中,我和2152618徐成阳一起完成了四则运算题目生成程序的编写,在这次结对编程中收获良多。在一起完成一个项目时,首先应该进行明确的分工,根据自己的特长进行分工可以大大提高效率,结对编程可以培养我们团队合作的意识,让我们更好地完成工作。以下是程序的源代码:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

enum enOp {
    Add, Minus, Multiply, Divide
};

//将 枚举类型转换为字符类型,以便输出。
char enum2char(enOp op) {
    switch (op) {
        case Add:
            return '+';
        case Minus:
            return '-';
        case Multiply:
            return '*';
        case Divide:
            return '/';
    }
    return ' ';
}

//检查生成计算式的正确与否。其中 减法结果不能为负数,除法结果不能为小数。
bool checkFormula(int left, int right, int middle, enOp op1, enOp op2) {
    if (op1 == Add) {
        if (op2 == Add)
            return true;
        if (op2 == Minus) {
            if (left + middle < right)
                return false;
            else
                return true;
        }
        if (op2 == Multiply)
            return true;
        else {
            if (right == 0)
                return false;
            return true;
        }

    }
    if (op1 == Minus) {
        if (op2 == Add) {
            if (left < middle)
                return false;
            else
                return true;
        }
        if (op2 == Minus) {
            if (left < middle)
                return false;
            if (left - middle < right)
                return false;
            else
                return true;
        }
        if (op2 == Multiply) {
            if (left < middle * right)
                return false;
            else
                return true;
        } else {
            if (right == 0)
                return false;
            if (left < middle / right)
                return false;
            else
                return true;
        }
    }
    if (op1 == Multiply) {
        if (op2 == Add)
            return true;
        if (op2 == Minus) {
            if (right * middle < right)
                return false;
            else
                return true;
        }
        if (op2 == Multiply)
            return true;
        else {
            if (right == 0)
                return false;
            return true;
        }
    }
    if (op1 == Divide) {
        if (op2 == Add) {
            if (middle == 0)
                return false;
            else
                return true;
        }
        if (op2 == Minus) {
            if (middle == 0)
                return false;
            if (left / middle < right)
                return false;
            else
                return true;
        }
        if (op2 == Multiply) {
            if (middle == 0)
                return false;
            else
                return true;
        } else {
            if (middle == 0)
                return false;
            if (right == 0)
                return false;
            return true;
        }
    }
}


//依据给定操作符,生成符合条件的表达式。
void getFormula(int *left, int *right, int *middle, enOp op1, enOp op2) {
    for (;;) {
        *left = 1 + rand() % 100;
        *middle=1 + rand() % 100;
        *right = 1 + rand() % 100;
        if (checkFormula(*left, *right, *middle, op1, op2))
            break;
    }
}

int main() {
    int Num;
    cout << "请输入生成题目数量:";
    cin >> Num;
//左侧数
    int left[Num];
//右侧数
    int right[Num];
//中间数
    int middle[Num];
//操作符 +-*/
    enOp op1[Num];
    enOp op2[Num];
    cout << "正在生成,请稍等。" << endl;
//随机种子
    srand(time(nullptr));
//开始生成计算表达式。
    for (int i = 0; i < Num; i++) {
//操作符
        op1[i] = enOp(rand() % 4);
        op2[i] = enOp(rand() % 4);
        getFormula(&left[i], &middle[i], &right[i], op1[i], op2[i]);
    }

    cout << "生成计算式完成,开始答题!" << endl;
//输出表达式,让用户答题
    for (int i = 0; i < Num; i++) {
//输出表达式
        cout << left[i] << ' ' << enum2char(op1[i]) << ' ' << middle[i] << enum2char(op2[i]) << right[i] << " = "
             << endl;
    }
}