随机30道小学计算题02(修改)

Posted anill

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机30道小学计算题02(修改)相关的知识,希望对你有一定的参考价值。

由于上周作业实在存在许多问题,所以这周重新写了代码。

这次代码和上次完全不一样,将生成的算式保存在数组里了。

1.避免重复(通过for循环一个一个比较字符串)
2.定制数量/打印方式(循环次数提出来作为变量/ 打印到文件通过引用函数实现)
3.控制参数
  是否有乘除(rand()%4改成%2,)
  是否有括号,最多十个数(完成,随机生成插入括号的位置,不过只能插入一个括号就是)
  数值范围(random(x)中x作为变量)
  加减有无负数(通过计算结果,调用函数,返回bool判断)
  除法有无余数(通过计算结果,调用函数,返回bool判断)

 

还是存在一些问题,比如:规范用户输入,括号只能插入一个。但是比上次好多了,慢慢改吧。

#include<iostream>
#include<time.h>
#include<string>
#include <sstream>
#include <stdlib.h>
#include<fstream>
#include<cmath>
#define random(x)(rand()%x)
using namespace std;

bool jsResult(string i1,int a,int b)
{
    int result = a;
    bool bol=true;

    if (i1 == "-")
    {
        result = result - b;
        if (result < 0)
        {
            bol = false;
        }
    }

    if (i1 == "/")
    {
        result = result % b;
        if (result != 0)
        {
            bol = false;
        }
    }
    return bol;
}
void printfile(int n,string s[])//打印到文件
{
    int i;
    ofstream outfile;
    outfile.open("e://2.txt");
    for (i = 0; i < n; i++)
    {
        outfile << s[i] << endl;
    }
    outfile.close();
}
string fuhao(int f2)//随机符号
{
    
    string p;
    int i;
    if (f2 == 1)
    {
        i = rand() % 4;
    }
    if (f2 == 0)
    {
        i = rand() % 2;
    }
    switch (i)
    {
        case 0:p = "+"; break;
        case 1:p = "-"; break;
        case 2:p = "*"; break;
        case 3:p = "/"; break;
    }
    return p;
}
int main()
{
    srand((unsigned)time(NULL));
    int a, b, c, d=10, e, i=0, k,ii=0,nn,pp,result=0;
    stringstream s1, s2, s3, s4, s5;
    string s, ss, p, i1, i2,re[100];
    bool bol=true;

    int n,f1,f2,f3 ,f;
    cout << "输入生成数量\n";//n
    cout << "是否有括号,最多十个数(输入1,有括号;输入0,无括号)\n";//f
    cout << "是否打印到文件(输入1,打印到文件;输入0,不打印到文件)\n";//f1
    cout << "是否有乘除(输入1,有乘除;输入0,没有乘除)\n";//f2
    cout << "请输入数值范围(0-?)\n";//f3
    cin >> n;
    cin >> f;
    cin >> f1;
    cin >> f2;
    cin >> f3;
    //n = 10; f = 1; f1 = 1; f2 = 1; f3 = 100;
beg:
    for (nn = 0; nn < n; nn++)
    {
        
        i = rand() % 9;
        i = i + 1;//防止随机出0
            
        a = random(f3); 
        s1 << a;
    
        
        s = s1.str();
        if (f == 0 )//无括号
        {
            
            for (k = 0; k < i; k++)
            {
                beg1:
                i1 = fuhao(f2);
                b = random(f3);
                if ((i1 == "/")&&(b==0))//除数不为0
                {
                
                    pp = rand() % 3;
                    switch (pp)
                    {
                        case 0:i1 = "+"; break;
                        case 1:i1 = "-"; break;
                        case 2:i1 = "*"; break;
                    }
                    
                }
                bol = jsResult(i1, a, b);
                if (bol==false)
                {
                    goto beg1;
                }
                

                s2 << b;
                s = s + i1 + s2.str();
                s2.str("");    
                
                
            }
            re[nn] = s; 
        
            s1.str("");
            //cout << re[nn] << endl;

            //cout << s<<endl;
        }

/////////////////////////////////////////////////////////////////////////////////
        if (f == 1)//有括号
        {
            int k1 = 100, k2 = 100;

            while (i < 2)//至少三个才有括号,所以小于三个就接着随机直到合法
            {
                i = rand() % 10;
            }
            while (k1>i - 2)
            {
                k1 = rand() % i + 1;
            }
            while (k2 <= k1 || k2>i - 1)
            {
                k2 = (rand() % i) + 1;
            }

            for (k = 0; k < i; k++)
            {
               
                string str[100];
                
                c = random(f3);
                
                i2 = fuhao(f2);
            
                if ((i2 == "/") && (c == 0))//除数不为0
                {
                    pp = rand() % 3;
                    switch (pp)
                    {
                        case 0:i1 = "+"; break;
                        case 1:i1 = "-"; break;
                        case 2:i1 = "*"; break;
                    }

                }
                s3 << c;
                str[k] = s3.str();
                if (k == k1)
                {
                    str[k] = "(" + str[k];

                }
                if (k == k2)
                {
                    str[k] = str[k] + ")";

                }
                
                s = s + i2 + str[k];
                s3.str("");

            }
            re[nn] = s;
            s1.str("");
            //cout << re[nn] << endl;
    
        }
    }
///////////////////////////////////////    
    int n1=n;
    for (e = 0; e < n1; e++)
    {
        if (re[e] == re[n1])//重复
        {
            goto beg;//重头开始
        }
        else
        {
            n1 = n1 - 1;//不重复,比下一个
            e = e - 1;

            if (n1 == 1)//比完了
            {
                goto p;//输出
            }
        }
    }
    p:
    for (nn = 0; nn < n; nn++)
    {
        cout << re[nn] << endl;
    }
////////////////////////////////////////////////////
    if (f1 == 1)//打印到文件
    {
        printfile(n,re);
    }
}

 

简单截取测试:

技术分享

技术分享

技术分享

 

 

 

 

技术分享

以上是关于随机30道小学计算题02(修改)的主要内容,如果未能解决你的问题,请参考以下文章

修改随机产生300道四则运算题(限制:小学水平)

小学二年级四则运算题

30道四则运算随机题之02

四则运算随机题30道代码

小学生四则运算出题系统——计应193许颖然

生成300道小学四则运算题