随机生成小学算式1.0

优点:

1.由用户决定算式的数量以及难度(通过改变运算数的范围以及运算符的数量);

2.支持用户输入答案并判断是否正确;

3.给出正确答案并输出用户得分;

4.支持小数结果和整数结果;

缺点:

1.暂不支持生成括号;

2.暂不支持分数结果;

主要方法:

1.每生成一个随机运算数后,生成一个运算符(+-*/),最后一个随机运算数生成后不再生成运算符,一边生成一边输出,这样就产生了一个算式。

2.在算式生成的过程中,利用一个float栈和一个char栈将算式转换成后缀表达式,再进行计算。

3.算式生成完成的同时,对该算式的计算也完成,将正确的结果存储在一个float数组中。

测试结果如下:

源代码如下:

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <stack>
#include <math.h>
#define random(x) (rand()%x+1)//产生大于0,小于或等于某一给定最大值的随机数
using namespace std;

int GetP(char a)
{//定义优先级
if(a==‘+‘||a==‘-‘)
return 0;
else if(a==‘*‘||a==‘/‘)
return 1;
}

float calculate(float a, float b, char v)
{//用于中间计算
switch(v)
{
case ‘+‘:return b+a;
case ‘-‘:return b-a;
case ‘*‘:return b*a;
case ‘/‘:return b/a;
}
}

void Transform(stack<float> *A, stack<char> *B,char Oper)
{
float a,b;//中间变量,用于计算
char v;//中间变量,用于计算
if(Oper==0)
{
while(B->empty()!=1)
{
a = A->top();
A->pop();
b = A->top();
A->pop();

v = B->top();
B->pop();

A->push( calculate(a,b,v) );
}
}
else
{
if( B->empty()==1 || GetP(B->top()) < GetP(Oper) )
{
B->push(Oper);
}
else
{
a = A->top();
A->pop();
b = A->top();
A->pop();
v = B->top();
B->pop();
A->push( calculate(a,b,v) );
Transform(A, B,Oper);
}
}
}

int main()
{

stack<float> Operands;//浮点数型栈,存储操作数
stack<char> Operators; //字符型栈,存储操作符
stack<float> *p1;
stack<char> *p2;
p1=&Operands;
p2=&Operators;

int EqNum;//算式的数量
int Max;//算式中运算数的最大值
int OpNum;//每个算式中运算符的数量

int Score=0;//记录用户得分
float RightAnswer[20];//记录算式的正确答案
float Answer[20];//记录用户的答案
char Oper=0;//记录中间操作符

cout << "Please input the amount of equations." << endl;
cin >> EqNum;
cout << "Please input the range of the numbers in your equation." << endl << "For example: 10" << endl;
cin >> Max;
cout << "Please input the amount of operators in each equation." << endl << "No more than ten." << endl;
cin >> OpNum;
if(OpNum>10)
{
cout << "The amount of operators is out of range, please try again." << endl;
cin >> OpNum;
}

int i,j;
srand( (int) time(0) );
float a,b;//中间变量,用于计算
char v;//中间变量,用于计算

for(i=0;i<EqNum;i++)
{
for(j=0;j<OpNum;j++)
{
p1->push(random(Max));
cout << p1->top() << " ";
switch(random(4))
{
case 1:Oper=‘+‘;break;
case 2:Oper=‘-‘;break;
case 3:Oper=‘*‘;break;
case 4:Oper=‘/‘;break;
}
cout << Oper << " ";
Transform(p1, p2,Oper);
Oper=0;
}
p1->push(random(Max));
cout << p1->top() << endl;
Transform(p1, p2,Oper);
RightAnswer[i]=p1->top();
p1->pop();
}

cout << "Do you want to deal with them?\nInput Y or N" << endl;
char Order;
cin >> Order;
if(Order==‘Y‘)
{
cout << "Please input your answer. Your answer should be integer or with two decimal palces." << endl << "For example: 25 7.64" << endl ;
for(i=0;i<EqNum;i++)
{
cin >> Answer[i];
if( fabs(RightAnswer[i]-Answer[i]) < 0.01 )
{
Score++;
}
}
cout << "The right answers are : ";
for(i=0;i<EqNum;i++)
{
cout << RightAnswer[i] << " ";
}
cout << endl << "With a precision of two decimal palces, your score is: "<< Score << endl;
}
else
{
cout << "The right answers are : ";
for(i=0;i<EqNum;i++)
{
cout << RightAnswer[i] << " ";
}
}
return 0;
}

时间: 2024-10-11 13:36:26

随机生成小学算式1.0的相关文章

个人项目-随机生成四则运算

本周做的是一个自己单独完成的小程序,用来随机生成小学四则运算的题目. 看到这个题目时,头脑有大概的一个编写代码的思路,但都言万事开头难,到真正开始的时候却不知从何下手.于是采取老师的建议参考别人的代码,然后再自己做修改.我在百度上搜索了实现该题目的代码,最终我采用的是百度知道的知道行家ahulxh老师的代码,该代码是在Windows系统上运行,开发环境为visaul c++ 6.0.首次运行老师的代码时出现了一个bug,显示的原因是缺少头文件#include<stdio.h>,修改以后再次运行

随机生成30个四则运算算式

package classWork;import java.lang.Math;public class MathTest1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub for(int i = 0;i < 30;i++) { int firNum = (int)(1 + Math.random()*98);//生成1到99的随机数 int se

随机生成一份试卷,试卷的种类分为单选、多选、判断三种题型。nodejs6.0 mysql

背景:从数据库中,随机生成一份试卷,试卷的种类分为单选.多选.判断三种题型. 首先我需要生成随机数id(在这之前我需要知道数据库中各个题型的题数,这样我才能设置随机数),并依据生成的随机数id,去查找对应的题目.而在js的数组操作中,有filter.splice.concat.every.find等等.我需要从数据库中取出特定的数据,而我返回的是一组对象,那么我需要过滤出特定的部分. 代码如下: var danxuan = getRandomNum(danxuan_count,20);var d

转:在0~N(不包括N)范围内随机生成一个长度为M(M &lt;= N)且内容不重复的数组

1. 最朴素暴力的做法. void cal1() { int i = 0, j = 0, num = 0; int result[M]; result[0] = rand() % N; //第一个肯定不重复, 直接加进去 for (i = 1; i < M; i++) //获得剩下的(M-1)个随机数 { num = rand() % N; //生成0 ~ N之间的随机数字 for (j = 0; j < i; j++) { if (num == result[j]) //如果和result数

【JavaScript】随机生成10个0~100的数字

随机生成10个0~100不重复的数字(包含0和100): 需要用到的知识点:随机数 去重 下面放代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script> // 定义声明一个数组, 放随机生成的10个数字 var arr = []; for(var

C语言实现随机生成0或1

rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数.如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的.srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的"随机".通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列.

随机生成0到n之间的m个数

分析:使用knuth算法: void PutRand(int n,int m) { srand(time(NULL)); for (int i=0;i<n;i++) { if(rand()%(n-i)<m) { cout<<i<<endl; m--; } } } 证明: 1.当i=0时,则生成的随机数是0,1,2...n-1之间的数,共n个:这是0被选到的概率为m/n. 2.当i=1时,生成的随机数是0,1,2...n-2之间的数,共n-1个:假设上次0被选到,那么这次

自动生成小学四则运算题目(Python实现)

Github项目地址: https://github.com/pirigg/- 题目描述: 通过python语言编写一个能够自动生成小学四则运算的程序(注意是给小学生用的,要是结果出现负数的话他们会很迷茫的!),同时,除了整数外,还要支持真分数的四则运算. Psp表格: PSP2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min) Planning 计划 50 60 Estimate 估计这个任务需要多少时间,并规划大致工作步骤 20 30 Analysis 需求分析 (包

个人项目——四则运算题目的随机生成

任务:实现一个自动生成小学四则运算题目的命令行程序. 一.时间预估及实际花费时间 PSP2.1 Personal Software Process Stages Time Planning 计划 · Estimate · 估计这个任务需要多少时间 15h Development 开发 · Analysis · 需求分析 (包括学习新技术) 2h · Design Spec · 生成设计文档 0.5h · Design Review · 设计复审 (和同事审核设计文档) 0.5h · Coding