题目
用线性同余法生成随机数序列的公式为:
rk= (multiplier * (rk-1) + increment) % modulus
序列中的每个数rk都可以由它的前一个数rk-1计算出来.
例如, 如果有:
rk = (25173 *(rk-1) + 13849) % 65536
则可以产生65536个各不相同的整型随机数. 设计一个函数作为随机数生成器, 生成1位或2位的随机数.
利用这个随机数生成器, 编写一个小学生学习四则运算的练习程序.
要求:
1.可以进行难度选择,一级难度只用1位数, 二级难度用2位数
2.可以选择运算类型,包括加、减、乘、除等
3.给出错误提示
4.可以统计成绩
5.产生随机数的那个函数
函数头: int Rand(int low, int high); //生成指定范围的随机数
函数体的实现: 先声明静态变量, 不赋初值, 然后对该变量使用线性同余法公式, 直到该变量满足大于等于low, 小于high, 然后返回该变量.
6.测试用例保证不会出现除数为0
7.样例输入/输出见下, 首先有正整数T, 代表小学生想要练习T组四则运算, 每组开始之前小学生先选择难度(1代表一级难度 2代表二级难度)和运算符(+ - * /), 每组四则运算都有10道题, 每次小学生算错程序需要提示小学生:“Your calculation is wrong, 正确运算”, 每组结束给出小学生的最终得分.
分析
1.首先分析题目大意,可以得知程序设计有几大模块功能:随机数生成,出题,结果检查。
2.第一个函数Rand用于生成指定范围内的随机数。它使用了一个静态变量 seed 来保存随机数生成器的种子,并根据线性同余法生成伪随机数。具体的生成算法是 seed = (multiplier * seed + increment) % modulus,其中 multiplier、increment 和 modulus 是预先定义好的常数。然后返回在指定范围内的随机数。
2.第二个函数check用于返回bool来判断结果的正确性。
3.第三个函数执行一次运算,从用户出接收出题的level和运算类型,给出相应的题目,最后调用check判断对错返回分数。
整体代码
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int Rand (int low,int high){
static int seed = time(0);
const int multiplier =25173;
const int increment =13849;
const int modulus =65536;
seed = (multiplier*seed +increment)%modulus;
return low +seed%(high-low);
}
bool check (int num1,int num2,char op,int result){
switch(op){
case '+':return num1+num2==result;
case '-': return num1-num2==result;
case '*': return num1*num2==result;
case '/': return num2 != 0 && num1 / num2 == result;break;
default : return false;
}
}
int caculate (int level,char operation){
int score =0;
for(int i=0;i<10;i++){
int num1,num2;
if(level==1){
num1=Rand(1,10);
num2 =Rand(1,10);
}
else{
num1=Rand(10,100);
num2=Rand(10,100);
}
int result;
switch (operation){
case '+': result =num1+num2;break;
case '-':result =num1-num2;break;
case '*':result = num1*num2;break;
case '/':
if(num2==0){cout<<"除数不能为零"<<endl;continue;}
result =num1/num2;break;
}
cout<<num1<<operation<<num2<<"=";
int answer;
cin>>answer;
if(check(num1,num2,operation,answer)){
cout <<"正确!"<<endl;
score+=10;
}
else{cout<<"错误!正确答案是: "<<result<<endl;}
}
return score;
}
int main(){
int t;
cout<<"做多少套:";
cin>>t;
for(int T=0;T<t;T++){
int level;char operation;
cout<<"选择难度等级(1~2)为:";
cin>>level;
cout<<"选择练习运算为:";
cin>>operation;
int score = caculate(level,operation);
cout<<"你的得分是:"<<score<<endl;
}
}