- 小学老师要每周给同学出300道四则运算练习题。
–这个程序有很多种实现方式:
C/C++
C#/VB.net/Java
Excel
Unix Shell
Emacs/Powershell/Vbscript
Perl
Python
–两个运算符,100 以内的数字,不需要写答案。
–需要检查答案是否正确,并且保证答案在 0..100 之间
–尽可能地多设置一些条件
- 也可以让同学们自选一个小应用程序进行结对编程的开发
- 请两位同学以结对编码(一个同学coding,另一个同学在旁边审核代码,之后再交换角色)的方式完成本次实验,并把程序、运算结果、博客体会等截屏发到其中一位同学的博客上,并在博客中体现另一位同学的学号(仅学号不体现姓名)
结对同学学号:2252527
在我开始编程的时候,我首先先想的是先编写一个生成一个0-100的随机数的函数generateRandomNumber(),这先需要引入
再然后就是随机生成一个运算符的函数generateRandomOperator()了,这个我最先想的是先生成一个数组,这个数组内有加减乘除这四个运算符,然后通过rand()函数随机生成一个数再%4,这样就可以随机选择数组内的加减乘除了,但是后面发现了一个问题就没有采用这个方式,这个问题待会再讲,再然后需要一个函数来判断结果是否在0-100之间的整数,这个非常简单,只需要让answer>=0,<=100并且%1==0就好了.
接下来就是main()函数的内容,就是先用前面的生成随机数的函数generateRandomNumber()随机生成两个数,然后再用generateRandomOperator()随机生成一个运算符,再规定它们的运算结果不能超过100和小于0,并且必须是整数就ok了,然后就是用户输入答案,答案正确就显示回答正确,答案错误就显示回答错误并显示正确答案,这些没什么好说的,在编写完程序后结果大概就是这个样子
在我编写随机数的时候,我的搭档给了我一个建议,他说在编写随机数生成的程序时,通常会使用一个种子来初始化随机数生成器。种子是一个起始值,用于确定随机数序列的起始状态。如果不使用种子或者每次都使用相同的种子,那么每次运行程序生成的随机数序列都会是相同的,这样就失去了随机性。
使用当前时间作为种子是一种常见的做法,因为时间是一个变化的值,每次运行程序时都会有所不同,这样可以确保每次生成的随机数序列都是不同的,增加了随机性。
我觉得他说的非常有道理,于是我在主函数main()中添加了srand(time(0))这行代码,这需要引入一个新的头文件
最后,我再来解释一下为什么我不采用原来生成随机运算符的方法,因为在我运行程序之后我发现大多数题目好像都是加法和减法,乘法和除法比较少见,我觉得这是因为在生成乘法的时候,随机生成的数的乘积很容易超过100从而并没有显示,同理除法也是一样的,除出来的很可能并不是整数而被抛弃,于是我就想能不能提高乘法和除法的运算出现的频率?我看到了我的随机生成数的函数generateRandomNumber()的区间正好是0-100,于是我就取了个巧,让它来帮我决定生成运算符的概率,我让它随机生成一个数,然后因为这个数是随机的,它取到小于等于20的数的概率是20%,我就可以当rand()<=20的时候取'+',这样取到加号的概率就是20%,同理这样可以控制每个运算符出现的概率,这样我就可以提高生成乘法和除法的概率了.
最后,我也要感谢我的搭档,在我犯错误的时候能够提醒我并改正.
代码如下
点击查看代码
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
// 生成随机数
int generateRandomNumber(int min, int max) {
return rand() % (max - min + 1) + min; // 生成 min 到 max 之间的随机数
}
// 生成随机运算符
char generateRandomOperator() {
int randNum = generateRandomNumber(1, 100); // 生成1到100之间的随机数
// 根据随机数的值确定运算符的选择概率
if (randNum <= 20) { // 20% 的概率选择 +
return '+';
}
else if (randNum <= 40) { // 20% 的概率选择 -
return '-';
}
else if (randNum <= 70) { // 30% 的概率选择 *
return '*';
}
else { // 剩余 30% 的概率选择 /
return '/';
}
}
// 检查答案是否在0到100之间并且为整数
bool isValidAnswer(int answer) {
return answer >= 0 && answer <= 100 && answer % 1 == 0;
}
int main() {
srand(time(0)); // 使用当前时间作为随机数种子
for (int i = 0; i < 300; ++i) {
int num1, num2;
char op;
do {
num1 = generateRandomNumber(0, 100); // 生成0到100之间的数
num2 = generateRandomNumber(0, 100); // 生成0到100之间的数
op = generateRandomOperator();
} while ((op == '+' && num1 + num2 > 100) || // 加法结果不能超过100
(op == '-' && num1 - num2 < 0) || // 减法结果不能是负数
(op == '*' && num1 * num2 > 100) || // 乘法结果不能超过100
(op == '/' && (num1 % num2 != 0 || num2 == 0 || num1 / num2 > 100))); // 除数与被除数之间是倍数关系,且除法结果不超过100
// 输出题目
cout << "题目 " << i + 1 << ": " << num1 << " " << op << " " << num2 << " = ?" << endl;
// 输入答案
int userAnswer;
cout << "请输入答案:";
cin >> userAnswer;
// 计算正确答案
int correctAnswer;
switch (op) {
case '+':
correctAnswer = num1 + num2;
break;
case '-':
correctAnswer = num1 - num2;
break;
case '*':
correctAnswer = num1 * num2;
break;
case '/':
correctAnswer = num1 / num2;
break;
}
// 检查答案是否正确
if (userAnswer == correctAnswer && isValidAnswer(userAnswer)) {
cout << "回答正确!" << endl;
}
else {
cout << "回答错误!正确答案是:" << correctAnswer << endl;
}
cout << endl;
}
return 0;
}