四则运算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);
}

截图:

心得:

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

原文地址:https://www.cnblogs.com/1756696425ss/p/10227197.html