第八周作业 结对编程

结对同学学号 : 2352511

作业要求

小学老师要每周给同学出300道四则运算练习题。
这个程序有很多种实现方式:
C/C++
C#/VB.net/Java
Excel
Unix Shell
Emacs/Powershell/Vbscript
Perl
Python
两个运算符,100 以内的数字,不需要写答案。
需要检查答案是否正确,并且保证答案在 0..1000 之间
尽可能地多设置一些条件
请两位同学以结对编码(一个同学coding,另一个同学在旁边审核代码,之后再交换角色)的方式完成本次实验,并把算法设计思路、程序代码、运算结果、结对编程作业体会等截屏发到其中一位同学的博客上,并在博客中体现另一位同学的学号(仅学号不体现姓名)
博客发表(新随笔)截止时间:第9周4月18日周五上课之前


#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <string>
#include <stack>

// 生成随机数,范围在min到max之间(包含min和max)
int generateRandomNumber(int min, int max) {
    return rand() % (max - min + 1) + min;
}

// 生成随机运算符
char generateRandomOperator() {
    int opIndex = rand() % 4;
    switch (opIndex) {
    case 0: return '+';
    case 1: return '-';
    case 2: return '*';
    case 3: return '/';
    default: return '+';
    }
}

// 将整数转换为字符串
std::string itoa(int num) {
    if (num == 0) {
        return "0";
    }
    std::string result;
    bool isNegative = num < 0;
    if (isNegative) {
        num = -num;
    }
    while (num > 0) {
        result = static_cast<char>(num % 10 + '0') + result;
        num /= 10;
    }
    if (isNegative) {
        result = "-" + result;
    }
    return result;
}

// 判断字符是否为运算符
bool isOperator(char c) {
    return c == '+' || c == '-' || c == '*' || c == '/';
}

// 计算两个数的运算结果
int calculate(int num1, char op, int num2) {
    switch (op) {
    case '+': return num1 + num2;
    case '-': return num1 - num2;
    case '*': return num1 * num2;
    case '/': 
        if (num2 != 0) {
            return num1 / num2;
        }
        cout<<"有道理"<<endl;
        // 如果除数为0,返回一个特殊值,这里假设为 -1
        return -1; 
    default: return -1;
    }
}

// 将中缀表达式转换为后缀表达式
std::vector<std::string> infixToPostfix(const std::string& infix) {
    std::stack<char> opStack;
    std::vector<std::string> postfix;
    std::string numStr;

    for (size_t i = 0; i < infix.size(); ++i) {
        if (isdigit(infix[i])) {
            numStr += infix[i];
            if (i == infix.size() - 1 || (!isdigit(infix[i + 1]) &&!isOperator(infix[i + 1]))) {
                postfix.push_back(numStr);
                numStr.clear();
            }
        } else if (infix[i] == '(') {
            opStack.push(infix[i]);
        } else if (infix[i] == ')') {
            while (!opStack.empty() && opStack.top() != '(') {
                postfix.push_back(itoa(opStack.top()));
                opStack.pop();
            }
            opStack.pop(); // 弹出 '('
        } else if (isOperator(infix[i])) {
            while (!opStack.empty() && 
                   (opStack.top() == '*' || opStack.top() == '/') && 
                   (infix[i] == '+' || infix[i] == '-')) {
                postfix.push_back(itoa(opStack.top()));
                opStack.pop();
            }
            opStack.push(infix[i]);
        }
    }

    while (!opStack.empty()) {
        postfix.push_back(itoa(opStack.top()));
        opStack.pop();
    }

    return postfix;
}

// 计算后缀表达式的结果
int evaluatePostfix(const std::vector<std::string>& postfix) {
    std::stack<int> numStack;

    for (size_t i = 0; i < postfix.size(); ++i) {
        if (postfix[i].size() == 1 && isOperator(postfix[i][0])) {
            int num2 = numStack.top(); numStack.pop();
            int num1 = numStack.top(); numStack.pop();
            int result = calculate(num1, postfix[i][0], num2);
            if (result == -1) {
                return -1; // 处理除数为0的情况
            }
            numStack.push(result);
        } else {
            numStack.push(atoi(postfix[i].c_str()));
        }
    }

    return numStack.top();
}

int main() {
    srand(static_cast<unsigned int>(time(NULL)));
    const int totalProblems = 300;
    std::vector<std::string> problems;
    std::vector<int> correctAnswers;

    for (int i = 0; i < totalProblems; ++i) {
        int num1 = generateRandomNumber(1, 100);
        int num2 = generateRandomNumber(1, 100);
        int num3 = generateRandomNumber(1, 100);
        char op1 = generateRandomOperator();
        char op2 = generateRandomOperator();
        std::string problem;

        // 生成不同的表达式组合
        int expressionType = rand() % 2;
        if (expressionType == 0) {
            problem = itoa(num1) + " " + op1 + " " + itoa(num2) + " " + op2 + " " + itoa(num3);
        } else {
            problem = "(" + itoa(num1) + " " + op1 + " " + itoa(num2) + ") " + op2 + " " + itoa(num3);
        }

        std::vector<std::string> postfix = infixToPostfix(problem);
        int answer = evaluatePostfix(postfix);

        // 检查答案是否正确且在0到1000之间
        while (answer < 0 || answer > 1000 || (op1 == '/' && num2 == 0) || (op2 == '/' && num3 == 0)) {
            num1 = generateRandomNumber(1, 100);
            num2 = generateRandomNumber(1, 100);
            num3 = generateRandomNumber(1, 100);
            op1 = generateRandomOperator();
            op2 = generateRandomOperator();
            if (expressionType == 0) {
                problem = itoa(num1) + " " + op1 + " " + itoa(num2) + " " + op2 + " " + itoa(num3);
            } else {
                problem = "(" + itoa(num1) + " " + op1 + " " + itoa(num2) + ") " + op2 + " " + itoa(num3);
            }
            postfix = infixToPostfix(problem);
            answer = evaluatePostfix(postfix);
        }

        problems.push_back(problem);
        correctAnswers.push_back(answer);
    }

    // 输出练习题

    for (int i = 0; i < totalProblems; ++i) {
        std::cout << problems[i] << " = " << std::endl;
    }

    // 检查用户输入的答案
    for (int i = 0; i < totalProblems; ++i) {
        int userAnswer;
        while (true) {
            std::cout << "请输入 " << problems[i] << " 的答案: ";
            if (std::cin >> userAnswer) {
                goto lab;
            }
            std::cin.clear();
            std::cin.ignore(1000, '\n');
            std::cout << "输入无效,请输入一个整数!" << std::endl;
        }
        lab:
        if (userAnswer == correctAnswers[i]) {
            std::cout << "回答正确!" << std::endl;
        } else {
            std::cout << "回答错误,正确答案是 " << correctAnswers[i] << std::endl;
        }
    }

    return 0;
}

posted @ 2025-04-11 14:23  rookie486  阅读(13)  评论(0)    收藏  举报