四则运算结对编程

算法设计思路:
(1)需要生成 300 道四则运算练习题,设置循环次数为 300 。
(2)利用随机数生成函数,生成 100 以内的操作数。在 C++ 中可借助头文件的rand()函数实现,为确保每次运行生成不同序列,用头文件获取当前时间作为rand()的种子(srand(static_cast(time(nullptr))); )。
(3))核心计算函数 calculate 负责根据运算优先级计算表达式 num1 op1 num2 op2 num3 的结果。
先对第一个运算符 op1 进行判断处理:
若 op1 为 * ,则将 intermediateResult(初始值为 num1 )乘以 num2 。
若 op1 为 / ,先检查 num2 是否为 0 ,若不为 0 ,则将 intermediateResult(当前结果) 除以 num2 ;若为 0 ,直接返回 -1 表示该表达式因除数为 0 无法计算。
若 op1 为 + ,则将 intermediateResult 加上 num2 。
若 op1 为 - ,则将 intermediateResult 减去 num2 。
接着对第二个运算符 op2 进行类似处理,依据 op2 是 *、/、+、- 分别执行相应运算,得到最终计算结果。
(4)得到计算结果后,先判断结果是否为 -1(表示除数为 0 等无效情况 ),并且检查结果是否在 0 到 1000 之间(通过 checkAnswerRange 函数 )。
若结果有效且在范围内,输出题目并提示用户输入答案。用户输入答案后,将输入的字符串通过 stringToDouble 函数转换为数字,与正确结果进行比较,输出回答正确或错误及正确答案等提示信息。

程序代码:

点击查看代码
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <sstream>

// 检查答案是否在0到1000之间
bool checkAnswerRange(double result) {
    return result >= 0 && result <= 1000;
}

// 计算表达式的值,考虑运算优先级
double calculate(double num1, char op1, double num2, char op2, double num3) {
    double intermediateResult = num1;
    // 先处理第一个运算符
    if (op1 == '*') {
        intermediateResult *= num2;
    }
    else if (op1 == '/') {
        if (num2 == 0) {
            return -1;
        }
        intermediateResult /= num2;
    }
    else if (op1 == '+') {
        intermediateResult += num2;
    }
    else if (op1 == '-') {
        intermediateResult -= num2;
    }

    // 再处理第二个运算符
    if (op2 == '*') {
        intermediateResult *= num3;
    }
    else if (op2 == '/') {
        if (num3 == 0) {
            return -1;
        }
        intermediateResult /= num3;
    }
    else if (op2 == '+') {
        intermediateResult += num3;
    }
    else if (op2 == '-') {
        intermediateResult -= num3;
    }

    return intermediateResult;
}

// 将字符串转换为数字
double stringToDouble(const std::string& str) {
    std::istringstream iss(str);
    double num;
    iss >> num;
    return num;
}

int main() {
    srand(static_cast<unsigned int>(time(nullptr)));
    int count = 0;
    while (count < 300) {
        // 生成100以内的数字
        double num1 = static_cast<double>(rand() % 101);
        double num2 = static_cast<double>(rand() % 101);
        double num3 = static_cast<double>(rand() % 101);

        // 随机选择两个运算符
        int op1Index = rand() % 4;
        int op2Index = rand() % 4;
        char operators[] = { '+', '-', '*', '/' };
        char op1 = operators[op1Index];
        char op2 = operators[op2Index];

        double result = calculate(num1, op1, num2, op2, num3);

        if (result != -1 && checkAnswerRange(result)) {
            std::cout << num1 << " " << op1 << " " << num2 << " " << op2 << " " << num3 << " = ";
            std::string userInput;
            std::cin >> userInput;
            double userAnswer = stringToDouble(userInput);

            if (userAnswer == result) {
                std::cout << "回答正确!" << std::endl;
            }
            else {
                std::cout << "回答错误,正确答案是: " << result << std::endl;
            }
            count++;
        }
    }
    system("pause");
    return 0;
}

运行截图:





体会:
在设计 calculate 函数时,需要严格遵循四则运算的优先级规则,先处理乘除,再处理加减。锻炼了我的逻辑思维能力,需要仔细考虑不同运算符组合下的计算顺序,确保计算结果的正确性。通过不断调试和优化代码,逐渐掌握了如何在程序中实现复杂的运算逻辑。
使用随机数生成操作数和运算符来生成练习题,同时要筛选出结果在有效范围内且无除数为 0 情况的题目。这需要综合考虑多个因素,如随机数的生成范围、结果的合理性判断等,培养了我从实际问题出发,设计合理算法来解决问题的能力。
在编写代码过程中,出现了各种错误,如运算符优先级出错、加减法运算错误、除数为 0 导致的程序异常等。通过调试工具和输出中间结果,逐步排查错误,定位到问题所在的代码行。这让我学会了如何有效地调试代码,提高了发现和解决问题的效率。当发现代码存在逻辑错误时,需要重新审视算法设计,对代码逻辑进行优化和改进。例如,在最初的 calculate 函数实现中,加减法运算逻辑存在问题,经过多次思考,修改和调试,最终设计出了正确的计算逻辑。这一过程让我明白,编程是一个不断迭代和优化的过程,需要耐心和细心。
在程序中增加了用户输入答案并检查正确性的功能,这就需要考虑用户输入的各种情况,如输入非数字字符串等。通过将用户输入作为字符串读取并转换为数字,避免了一些输入格式问题。同时,及时给用户反馈回答很有必要。这让我认识到在编程中要充分考虑用户的需求和使用场景,设计出友好的交互界面和反馈机制。
总的来说这次编程作业让我收获良多,付出的时间和汗水定会让我在以后摘得胜利的果实。
——————(由于特殊原因,此次编程作业由2352213独自完成)

posted @ 2025-04-17 16:17  爱情悬崖  阅读(17)  评论(0)    收藏  举报