• 随机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
        cout << "是否有括号,最多十个数(输入1,有括号;输入0,无括号)
    ";//f
        cout << "是否打印到文件(输入1,打印到文件;输入0,不打印到文件)
    ";//f1
        cout << "是否有乘除(输入1,有乘除;输入0,没有乘除)
    ";//f2
        cout << "请输入数值范围(0-?)
    ";//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);
        }
    }

    简单截取测试:

  • 相关阅读:
    Spring使用JDBC配置具名参数
    linux中的匿名管道和命名管道
    linux查看CPU信息
    磁盘阵列RAID原理、种类及性能优缺点对比
    SMP和MPP的优缺点
    Hadoop datablock size
    MySQL 高可用架构之MHA
    MySQL 高可用架构之MMM
    五大常见的MySQL高可用方案
    hive加载数据
  • 原文地址:https://www.cnblogs.com/linanil/p/5294189.html
Copyright © 2020-2023  润新知