题目:
小学老师要每周给同学出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未定义的问题。这是由于我忘记了包含必要的头文件