题目:
小学老师要每周给同学出300道四则运算练习题。
–这个程序有很多种实现方式:
C/C++
C#/VB.net/Java
Excel
Unix Shell
Emacs/Powershell/Vbscript
Perl
Python
–两个运算符,100 以内的数字,不需要写答案。
–需要检查答案是否正确,并且保证答案在 0..100 之间
–尽可能地多设置一些条件
编码过程
对于这一题目我选择了使用C++来将其实现。在这个程序中,我首先定义了两个函数generateRandomNumber和generateRandomQuestion,用于生成随机数和随机的四则运算题。对于除法,我们确保除数不为0,并且结果为整数。然后,我们使用std::map来存储生成的运算题及其答案。接下来,我们生成一些运算题并输出。最后,我们询问用户给出答案,答案正确则结束,错误则生成正确答案
代码

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

// 生成一个在指定范围内的随机数  
int generateRandomNumber(int min, int max) {
    return min + rand() % (max - min + 1);
}

// 生成一个随机的四则运算题,并确保答案在0到100之间  
std::string generateRandomQuestion() {
    int num1, num2;
    char operatorChar;
    do {
        num1 = generateRandomNumber(1, 99); // 确保我们不会生成100,以便加法或乘法不会超出范围  
        switch (rand() % 4) {
        case 0: // 加法  
            num2 = generateRandomNumber(1, 100 - num1); // 确保答案在0到100之间  
            operatorChar = '+';
            break;
        case 1: // 减法  
            num2 = generateRandomNumber(1, num1); // 确保不会得到负数答案  
            operatorChar = '-';
            break;
        case 2: // 乘法  
            num2 = generateRandomNumber(1, 100 / num1); // 确保答案在0到100之间  
            operatorChar = '*';
            break;
        case 3: // 除法  
            do {
                num2 = generateRandomNumber(1, num1); // 确保除数不为0,且被除数足够大以产生有效整数结果  
            } while (num1 % num2 != 0); // 确保结果为整数  
            operatorChar = '/';
            break;
        }
    } while ((operatorChar == '-' && num1 == num2) || // 排除减法结果为0的情况  
        (operatorChar == '*' && num1 * num2 > 100) || // 排除乘法结果大于100的情况  
        (operatorChar == '/' && num1 / num2 == 0)); // 排除除法结果为0的情况  

    std::string question = std::to_string(num1) + " " + operatorChar + " " + std::to_string(num2) + " = ?";
    return question;
}

int main() {
    std::srand(static_cast<unsigned int>(std::time(0))); // 初始化随机数生成器  

    std::string question = generateRandomQuestion();
    std::cout << question << std::endl;

    int answer;
    std::cout << "请输入你的答案: ";
    std::cin >> answer; // 读取用户输入的答案  

    // 解析运算题并计算正确答案  
    std::size_t pos = question.find('=');
    if (pos != std::string::npos) {
        std::string expression = question.substr(0, pos); // 获取运算符和操作数部分  
        std::istringstream iss(expression); // 创建istringstream对象  
        int num1, num2;
        char op;
        iss >> num1 >> op >> num2; // 从istringstream中提取操作数和运算符  

        int correctAnswer;
        switch (op) {
        case '+':
            correctAnswer = num1 + num2;
            break;
        case '-':
            correctAnswer = num1 - num2;
            break;
        case '*':
            correctAnswer = num1 * num2;
            break;
        case '/':
            if (num2 != 0) {
                correctAnswer = num1 / num2;
            }
            else {
                std::cerr << "错误:除数不能为0" << std::endl;
                return 1; // 提前退出程序  
            }
            break;
        default:
            std::cerr << "错误:未知的运算符" << std::endl;
            return 1; // 提前退出程序  
        }

        // 检查用户答案是否正确  
        if (answer == correctAnswer) {
            std::cout << "恭喜你,答案正确!" << std::endl;
        }
        else {
            std::cout << "很遗憾,答案错误。正确答案是: " << correctAnswer << std::endl;
        }
    }
    else {
        std::cerr << "错误:无法解析题目表达式" << std::endl;
        return 1; // 提前退出程序  
    }

    return 0;
}

运行结果


实验总结
本次实验的目的是通过编程实现一个简单的算术问答程序,该程序能够生成随机算术题,接收用户输入的答案,并判断答案是否正确。在实验过程中,我遇到了几个关键问题和挑战,并逐一解决了它们。首先,我遇到了关于std::istringstream未定义的问题。这是由于我忘记了包含必要的头文件。在加入这个头文件之后,程序成功地识别了std::istringstream类,并能够利用它来从字符串中提取整数和运算符。其次,在尝试将用户输入的字符串转换为整数时,我遇到了类型不匹配的错误。这是因为std::cin默认读取的是字符串,而我想要将它直接赋值给整数变量。为了解决这个问题,我使用了std::cin >> answer来读取用户输入的整数,而不是直接赋值。在解析算术表达式并计算正确答案时,我使用了std::istringstream来逐个提取操作数和运算符。这个过程涉及到对输入字符串的分割和解析,确保每个部分都被正确地提取和处理。然后,我根据运算符执行相应的计算,得出正确答案。最后,我编写了代码来比较用户输入的答案和程序计算出的正确答案,并输出相应的结果。如果答案正确,程序会输出恭喜信息;如果答案错误,程序会输出错误信息和正确答案。通过这次实验,我不仅加深了对C++中字符串流和类型转换的理解,还学会了如何编写一个简单的问答程序。同时,我也意识到在编程过程中,仔细检查和调试代码的重要性,以及正确处理输入和输出数据的关键性。在未来的学习和实践中,我将继续探索更多关于字符串处理和算术运算的编程技巧,并努力提高自己的编程能力和问题解决能力。我相信通过不断的实践和学习,我能够编写出更加复杂和实用的程序。