zoukankan      html  css  js  c++  java
  • 四则运算2

    要求:

    悲催的二柱子接到了老师要求给软件增加一些小小的功能,具体要求如下:

    1、除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性);

    2、一次出的题目避免相互重复;

    3、可定制出题的数量。

    设计思想:

         程序的主要设计思想为用字符串数组保存生成的运算题,将操作数采用单独算法处理,然后进行类型转换和操作符一起存入数组中,鉴于字符串的特性,可以对字符串的长度进行随意添加而不必考虑长度问题,最后进行字符串数组的输出产生客户要求的运算题;

    源程序代码:

    #include<stdlib.h>
    #include<conio.h>
    #include<time.h>
    #include<iostream>
    #include<string>
    #include<cstring>
    #include<iomanip>
    using namespace std;
    bool ruguochongfu(int CurLocation,string a[])//是否重复
    {
        for(int p=0;p<CurLocation;p++)
        {
            for(int q=0;a[p][q]!='' && a[CurLocation][q]!='';q++)
            {    
                if(a[p][q]!=a[CurLocation][q])
                    p++;
                if(a[p][q]==''&&a[CurLocation][q]=='')
                        return true;
            }
        }
        return false;
    }
    void Digit(int Intshuliang,int Floshuliang,string a[],int Location,int ruguoDecimal,int Random)//数字转变为字符
    {
        if(ruguoDecimal==1)
        {
            if(Random==1)
            {
                a[Location]+='0';
                a[Location]+='.';
                if(Intshuliang==0)
                {
                    Floshuliang++;
                }
                a[Location]+=(char)(Floshuliang%10+48);
                if(Floshuliang%100/10!=0)
                a[Location]+=(char)(Floshuliang%100/10+48);
                if(Floshuliang/100!=0)
                a[Location]+=(char)(Floshuliang/100+48);
            }
            else
            {
                if(Intshuliang/100!=0)
                {
                    a[Location]+=(char)(Intshuliang/100+48);
                }
                if(Intshuliang%100/10!=0)
                {
                    a[Location]+=(char)(Intshuliang%100/10+48);
                }
                if(Intshuliang==0)
                {
                    Intshuliang++;
                }
                a[Location]+=(char)(Intshuliang%10+48);
            }
        }
        else
        {
            if(Intshuliang/100!=0)
            {
                a[Location]+=(char)(Intshuliang/100+48);
            }
            if(Intshuliang%100/10!=0)
            {
                a[Location]+=(char)(Intshuliang%100/10+48);
            }
            if(Intshuliang==0)
            {
                    Intshuliang++;
            }
    
            a[Location]+=(char)(Intshuliang%10+48);
        }
    }
    void DealDigit(string a[],int p,int range,int IfNegative,int IfFraction,int FenZi,int ruguoDecimal,int DecDig)
    {
        int RandomNum1=(int)rand()%100/50;//是否产生负数的随机数
        int RandomNum2=(int)rand()%100/50;//是否产生分数的随机数
        int RandomNum3=(int)rand()%DecDig;//小数的随机数
        int RandomNum4=(int)rand()%100/50;//是否产生小数
        FenZi=(int)rand()%range;//分子
        int z=(int)rand()%range;//分母
        if(IfNegative==1)//随机生成数字
        {
            if(RandomNum1==1&&RandomNum2==1)//随机生成负分数
            {
                a[p]+='(';
                a[p]+='-';
                Digit(FenZi,0,a,p,0,0);
                a[p]+='/';
                Digit(z,0,a,p,0,0);
                a[p]+=')';
            }
            else if(RandomNum1==1&&RandomNum2!=1)//负数
            {
                a[p]+='(';
                a[p]+='-';
                Digit(FenZi,RandomNum3,a,p,ruguoDecimal,RandomNum4);
                a[p]+=')';
            }
            else//数字默认为正数
            {
                Digit(FenZi,RandomNum3,a,p,ruguoDecimal,RandomNum4);
            }
        }
        else//正数
        {
            if(IfFraction==1)//随机生成正分数
            {
                if(RandomNum2==1)
                {
                    a[p]+='(';
                    Digit(FenZi,0,a,p,0,0);
                    a[p]+='/';
                    Digit(z,0,a,p,0,0);
                    a[p]+=')';
                }
            }
            else//默认为正数
            {
                Digit(FenZi,RandomNum3,a,p,ruguoDecimal,RandomNum4);
            }
        }
    }
    /*IfIncMD是否有乘除,range数值范围,IfIncBrackets是否有括号,IfNeg加减是否允许有负数,IfRem除法是否允许有余数
      IfFraction是否支持分数,IfDec是否支持小数,DecDig设置小数范围*/
    void Deal(int QstNum,string a[],int IfIncMD,int range,int IfIncBrackets,int IfNegative,int IfRemainder,int IfFraction,int ruguoDecimal,int DecDig)
    {
        for(int p=0;p<QstNum;p++)
        {
            int count=0;
            int FirstNum=0,SecNum=0;//生成的相邻的两个操作数
            int RandomNum1,RandomNum2,RandomNum3,RandomNum4;
            int OperandNum=(int)rand()%10/5+2;//操作数的个数,属于二元或三元运算
            int Brackets=(int)rand()%100/50;//随机生成括号
            int z;//分母
            if(Brackets==1&&count==0&&OperandNum>2&&IfIncBrackets==1)//判断是否生成括号
            {
                a[p]+="(";
                count++;
            }
            DealDigit(a,p,range,IfNegative,IfFraction,FirstNum,ruguoDecimal,DecDig);//生成第一个数        
            for(int q=1;q<OperandNum;q++)
            {
                int Operator=(int)rand()%100/25;//操作符的范围
                if(IfIncMD==0)
                    Operator/=2;//操作符范围设置只有"+-";
                switch(Operator)
                {
                case 0:
                    a[p]+='+';
                    DealDigit(a,p,range,IfNegative,IfFraction,SecNum,ruguoDecimal,DecDig);
                    break;
                case 1:
                    a[p]+='-';
                    DealDigit(a,p,range,IfNegative,IfFraction,SecNum,ruguoDecimal,DecDig);
                    break;
                case 2:
                    a[p]+='*';
                    DealDigit(a,p,range,IfNegative,IfFraction,SecNum,ruguoDecimal,DecDig);
                    break;
                case 3:
                    a[p]+='/';
                    RandomNum1=(int)rand()%100/50;//是否产生负数的随机数
                    RandomNum2=(int)rand()%100/50;//是否产生分数的随机数
                    RandomNum4=(int)rand()%100/50;//是否产生小数的随机数
                    RandomNum3=(int)rand()%DecDig;//小数的随机数
                    SecNum=(int)rand()%range;//分子
                    z=(int)rand()%range;
                    if(IfNegative==1)//随机生成数字
                    {
                        if(RandomNum1==1&&RandomNum2==1)//随机生成负分数
                        {
                            a[p]+='(';
                            a[p]+='-';
                            Digit(SecNum,0,a,p,0,0);
                            a[p]+='/';
                            Digit(z,0,a,p,0,0);
                            a[p]+=')';
                        }
                        else if(RandomNum1==1&&RandomNum2!=1)//负数
                        {
                            a[p]+='(';
                            a[p]+='-';
                            Digit(SecNum,RandomNum4,a,p,ruguoDecimal,RandomNum3);
                            a[p]+=')';
                        }
                        else//数字默认为正数
                        {
                            Digit(SecNum,DecDig,a,p,0,0);
                            if(IfRemainder==0)
                            {
                                if(IfIncBrackets==0)//当不生成括号时
                                {
                                    if(FirstNum%SecNum!=0)//除法有余数
                                    {
                                        Digit(SecNum,RandomNum4,a,p,ruguoDecimal,RandomNum3);
                                    }
                                }
                            }
                        }
                    }
                    else//正数
                    {
                        if(IfFraction==1)//随机生成正分数
                        {
                            if(RandomNum2==1)
                            {
                                a[p]+='(';
                                Digit(SecNum,0,a,p,0,0);
                                a[p]+='/';
                                Digit(z,0,a,p,0,0);
                                a[p]+=')';
                            }
                        }
                        else//默认为正数
                        {
                            Digit(SecNum,DecDig,a,p,ruguoDecimal,RandomNum3);
                            if(IfRemainder==0)
                            {
                                if(IfIncBrackets==0)//当不生成括号时
                                {
                                    if(FirstNum%SecNum!=0)//除法有余数
                                    {
                                        Digit(SecNum,RandomNum4,a,p,ruguoDecimal,RandomNum3);
    
                                    }
                                }
                            }
                        }
                    }
                    break;
                }
                if(Brackets==1&&count==1&&q==1)
                {
                    a[p]+=")";
                }
                FirstNum=SecNum;//将运算符左侧数置为FirstNum
            }
            a[p]+='=';
            a[p]+='';
            //判断是否重复,重复则重新生成
            if(ruguochongfu(p,a))
            {
                p--;
            }
        }
    }
    //输出字符串数组
    void Display(int QstNum,string a[],int ColumnNum,int HSpace)
    {
        int count1=0;
        int p;
        for(p=0;p<QstNum;p++)
        {
            cout<<setw(HSpace)<<a[p];
            count1++;
            if(count1%ColumnNum==0)
                cout<<endl;
            else
                cout<<'	';
        }
    }
    void main()
    {
        srand((unsigned)time(NULL));
        int p;
        do
        {
            system("mode con: cols=100 lines=40");
            system("cls");
            int QstNum,ColumnNum,IfIncMD,IfIncBrackets,range,HSpace,IfNeg,IfRem,IfFraction,IfDec,DecDig=10;
            string a[1000];//保存字符串的数组
            cout<<"请输入生成的四则运算题个数(1-1000):";
            cin>>QstNum;
            while(QstNum<0||QstNum>1000)
            {
                cout<<"请重新输入生成的四则运算题个数(1-1000):";
                cin>>QstNum;
            }
            cout<<"请输入生成的列数:(1-10)";
            cin>>ColumnNum;
            while(ColumnNum<1||ColumnNum>10)
            {
                cout<<"请重新输入生成的列数:(1-10列)";
                cin>>ColumnNum;
            }
            //是否有乘除法
            cout<<"是否有乘除法:(1/0)";
            cin>>IfIncMD;
            while(IfIncMD>1||IfIncMD<0)
            {
                cin>>IfIncMD;
            }
            //是否允许支持小数
            cout<<"是否允许支持小数(输入1则支持,0则不支持)";
            cin>>IfDec;
            while(IfDec!=1&&IfDec!=0)
            {
                cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
                cin>>IfDec;
            }
            if(IfDec==1)
            {
                cout<<"小数数值范围:(精确到千分位,百分位,十分位,输入1000,100或10)";
                cin>>DecDig;
                while(DecDig!=10&&DecDig!=100&&DecDig!=1000)
                {
                    cout<<"请输入10,100,或1000:";
                    cin>>DecDig;
                }
            }
            //整数数值范围
            cout<<"整数数值范围:(1000以内,100以内,10以内)";
            cin>>range;
            while(range!=10&&range!=100&&range!=1000)
            {
                cout<<"请输入10,100,或1000:";
                cin>>range;
            }
            //是否支持括号
            cout<<"是否随机生成括号:";
            cin>>IfIncBrackets;
            while(IfIncBrackets!=1&&IfIncBrackets!=0)
            {
                cout<<"请输入1或0:(1随机生成括号,0不随机生成括号)";
                cin>>IfIncBrackets;
            }
            //设置运算题间距
            cout<<"每行运算题的间距:(1-15)";
            cin>>HSpace;
            while(HSpace<1||HSpace>15)
            {
                cout<<"请输入数值在1-15范围内:";
                cin>>HSpace;
            }
            //加减是否支持负数的存在
            cout<<"加减是否允许有负数的存在(输入1则允许,0则不允许)";
            cin>>IfNeg;
            while(IfNeg!=1&&IfNeg!=0)
            {
                cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
                cin>>IfNeg;
            }
            //除法是否允许有余数的存在
            cout<<"除法是否允许有余数的存在(输入1则允许,0则不允许)";
            cin>>IfRem;
            while(IfRem!=1&&IfRem!=0)
            {
                cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
                cin>>IfRem;
            }
            //整数除法是否允许有分数的存在
            cout<<"整数除法是否允许有分数的存在(输入1则允许,0则不允许)";
            cin>>IfFraction;
            while(IfFraction!=1&&IfFraction!=0)
            {
                cout<<"请输入1或0(输入1则允许否则不允许)"<<endl;
                cin>>IfFraction;
            }
            /*IfIncMD是否有乘除,range数值范围,IfIncBrackets是否有括号,IfNeg加减是否允许有负数,IfRem除法是否允许有余数
               IfFraction是否支持分数,IfDec是否支持小数,DecDig设置小数范围*/
            Deal(QstNum,a,IfIncMD,range,IfIncBrackets,IfNeg,IfRem,IfFraction,IfDec,DecDig);
            Display(QstNum,a,ColumnNum,HSpace);
            cout<<endl;
            cout<<"是否继续生成运算题(输入1则生成否则不生成)";
            cin>>p;
            while(p!=1&&p!=0)
            {
                cout<<"请输入1或0(输入1则生成否则不生成)"<<endl;
                cin>>p;
            }
        }while(1==p);
    }

    截图:

    心得:

    程序越到后期越难以更改,往往牵一发而动全身,由此对程序维护有了深刻的认识;编写过程中有遇到困难,在同学及百度君的帮助下解决,堆加功能任务令人头疼,程序还有很多不足之处

  • 相关阅读:
    Shell脚本中$0、$#、$@等的意义
    shell脚本中常见的一些特殊符号和作用详解
    shell脚本中的反引号,单引号,双引号与反斜杠
    Shell中反引号(`)与$()用法的区别
    自己在linux上编译、链接、动态库和静态库的学习笔记
    让ie6 7 8 9支持原生html5 websocket
    解决浏览器不兼容websocket
    WebSocket兼容到低版本浏览器
    UART和RS232/RS485的关系,RS232与RS485编程
    TTL和RS232之间的详细对比
  • 原文地址:https://www.cnblogs.com/1756696425ss/p/10227197.html
Copyright © 2011-2022 走看看