四则运算进化版

一、题目要求:

1、题目避免重复;

2、可定制(数量/打印方式);

3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、

否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;

二、设计思想

1、题目避免重复

(1)调用随机函数发生器,将生成的运算式用数组存储,将新的运算式与已生成式子做比较,若相同则不输出,不同则输出

2、可定制(数量/打印方式)

(1)提示用户输入题目数量,打印方式,从键盘输入

3、(1)是否有乘除法

在输入之前提示用户是否有乘除法,若没有,则只输出加减法

(2)是否有括号

(3)数值范围

由用户设置数值范围,如果输入不合法,提示输入错误,请重新输入,在随机生成数中保证随机数在用户设置的数值范围

(4)加减有无负数

如果没有负数,比较生成的两个数,保证做减法时被减数不小于减数

(5)乘除有无余数

首先判断除数是否为零,若为零则终止,若不为零则继续。对做除法的两个操作数做取余运算,若为零则没有余数

三、原程序代码

#include<iostream.h>
#include<stdlib.h>
#include<time.h>
void display(int number,int l,int mul,int num,int neg,int remainder)//打印方式控制输出列数
{
    int a[1000],b[1000],c[1000];
    int m;//控制题目避免重复
    int t;//中间变量
    for(int i=0;i<number;i++)//随机两个生成运算操作数
    { 
        m=1;//初始化
        a[i]=rand()%num;
        b[i]=rand()%num;
        if(mul==0)//没有乘除法
        {   
            c[i]=rand()%2;//随机生成0-1的数字,分别表示加减
        }
        if(mul==1)//有乘除法
        {
            c[i]=rand()%4;//随机生成0-3的数字,分别表示加减乘除
        }
        for(int j=0;j<i;j++)
        {
            if(a[j]==a[i]&&b[j]==b[i]&&c[j]==c[i])//比较新生成的操作数与原来的是否相同
            {
                i=i-1;
                m=0;
            }
        }
        while(m)//若不同则输出
        {
            switch(c[i])
            {
            case 0:
                cout<<a[i]<<"+"<<b[i]<<"=";break;
            case 1:
                if(neg==0)//减法没有负数
                {
                    if(a[i]<b[i])
                    {
                        t=a[i];
                        a[i]=b[i];
                        b[i]=t;
                    }
                    cout<<a[i]<<"-"<<b[i]<<"=";break;
                }
                else
                {
                    cout<<a[i]<<"-"<<b[i]<<"=";break;
                }
            case 2:
                cout<<a[i]<<"*"<<b[i]<<"=";break;
            case 3:
                if(b[i]==0)//分母为零则不计入总数
                {  
                    i=i-1;break;
                }
                else if(remainder==0)//除法没有余数
                {
                    if(a[i]%b[i]==0)
                    {
                        cout<<a[i]<<"/"<<b[i]<<"=";break;
                    }
                    else
                    {
                        i=i-1;break;
                    }
                }
                else if(remainder==1)//除法有余数
                {
                    if(a[i]%b[i]!=0)
                    {
                        cout<<a[i]<<"/"<<b[i]<<"=";break;
                    }
                    else
                    {
                        i=i-1;break;
                    }
                }
            }
            if((i+1)%l==0)
            {
                cout<<endl;
            }
            else
            {
                cout<<" "<<" ";
            }
            break;//跳出循环
        }
    }
}
void main()
{
    int number;//题目数量
    int l;//输出的列数
    int mul;//乘除法
    int num;//数值范围
    int neg;//负数
    int remainder;//余数
    srand((unsigned) time(NULL));//调用随机函数发生器
    cout<<"---------------------------------"<<endl;
    cout<<"            四则运算             "<<endl;
    cout<<"---------------------------------"<<endl;
    cout<<"请输入要打印的题目数量:"<<endl;
    cin>>number;
    cout<<"请输入要输出的列数(1-10):"<<endl;
    cin>>l;
    cout<<"是否有乘除法(0表示没有;1表示有)"<<endl;
    cin>>mul;
    if(mul==1)
    {
        cout<<"除法有无余数(0表示没有;1表示有)"<<endl;
        cin>>remainder;
    }
    cout<<"请输入正整数的数值范围(即最大数):"<<endl;
    cin>>num;
    cout<<"减法有无负数(0表示没有;1表示有)"<<endl;
    cin>>neg;
    display(number,l,mul,num,neg,remainder);
}

程序截图

#include<iostream.h>
#include<stdlib.h>
#include<time.h>
void display(int number,int l,int mul,int num,int neg,int remainder)//打印方式控制输出列数
{
    int a[1000],b[1000],c[1000];
    int m;//控制题目避免重复
    int t;//中间变量
    for(int i=0;i<number;i++)//随机两个生成运算操作数
    { 
        m=1;//初始化
        a[i]=rand()%num;
        b[i]=rand()%num;
        if(mul==0)//没有乘除法
        {   
            c[i]=rand()%2;//随机生成0-1的数字,分别表示加减
        }
        if(mul==1)//有乘除法
        {
            c[i]=rand()%4;//随机生成0-3的数字,分别表示加减乘除
        }
        for(int j=0;j<i;j++)
        {
            if(a[j]==a[i]&&b[j]==b[i]&&c[j]==c[i])//比较新生成的操作数与原来的是否相同
            {
                i=i-1;
                m=0;
            }
        }
        while(m)//若不同则输出
        {
            switch(c[i])
            {
            case 0:
                cout<<a[i]<<"+"<<b[i]<<"=";break;
            case 1:
                if(neg==0)//减法没有负数
                {
                    if(a[i]<b[i])
                    {
                        t=a[i];
                        a[i]=b[i];
                        b[i]=t;
                    }
                    cout<<a[i]<<"-"<<b[i]<<"=";break;
                }
                else
                {
                    cout<<a[i]<<"-"<<b[i]<<"=";break;
                }
            case 2:
                cout<<a[i]<<"*"<<b[i]<<"=";break;
            case 3:
                if(b[i]==0)//分母为零则不计入总数
                {  
                    i=i-1;break;
                }
                else if(remainder==0)//除法没有余数
                {
                    if(a[i]%b[i]==0)
                    {
                        cout<<a[i]<<"/"<<b[i]<<"=";break;
                    }
                    else
                    {
                        i=i-1;break;
                    }
                }
                else if(remainder==1)//除法有余数
                {
                    if(a[i]%b[i]!=0)
                    {
                        cout<<a[i]<<"/"<<b[i]<<"=";break;
                    }
                    else
                    {
                        i=i-1;break;
                    }
                }
            }
            if((i+1)%l==0)
            {
                cout<<endl;
            }
            else
            {
                cout<<" "<<" ";
            }
            break;//跳出循环
        }
    }
}
void main()
{
    int number;//题目数量
    int l;//输出的列数
    int mul;//乘除法
    int num;//数值范围
    int neg;//负数
    int remainder;//余数
    srand((unsigned) time(NULL));//调用随机函数发生器
    cout<<"---------------------------------"<<endl;
    cout<<"            四则运算             "<<endl;
    cout<<"---------------------------------"<<endl;
    cout<<"请输入要打印的题目数量:"<<endl;
    cin>>number;
    cout<<"请输入要输出的列数(1-10):"<<endl;
    cin>>l;
    cout<<"是否有乘除法(0表示没有;1表示有)"<<endl;
    cin>>mul;
    if(mul==1)
    {
        cout<<"除法有无余数(0表示没有;1表示有)"<<endl;
        cin>>remainder;
    }
    cout<<"请输入正整数的数值范围(即最大数):"<<endl;
    cin>>num;
    cout<<"减法有无负数(0表示没有;1表示有)"<<endl;
    cin>>neg;
    display(number,l,mul,num,neg,remainder);
}

日期 听课 编程 阅读资料 网上查找 总计
星期一 120 20 50 50 240
星期二   50   50 100
星期三          
星期四 120 70     190
星期五          
星期六   120   100 220
星期日   120     120
总计 240      

870

原文地址:https://www.cnblogs.com/0jiajia1/p/5268477.html