四则运算进化版

一、题目要求:

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<<"\t"<<"\t";
            }
            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<<"\t"<<"\t";
            }
            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

 

posted on 2016-03-12 13:11  0嘉嘉1  阅读(147)  评论(1编辑  收藏  举报