第八周作业 结对编程
结对同学学号 : 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;
}



浙公网安备 33010602011771号