生成四则运算2

//20133059 武于微 信1301-1班
#include<iostream>
#include<sstream>
#include<string>
#include<ctime>
#include<fstream>
#define size 10000
using namespace std;

string num_str(int i)    //将数字转换为字符串
{
    stringstream ss;
    ss<<i;
    return ss.str();
}

int Operator(int m)    //产生运算符
{
    int a,b;
    char oper;
    a=rand()%4;    //产生随机整数用于除四取余后进行四种运算符号和四种数的选择
    b=rand()%2;
    if(m==2)    //无乘除法情况
    {
        switch(b)    //用于加减运算两种符选择
        {
        case 0:
            oper='+';
            break;
        case 1:
            oper='-';
            break;
        default:
            break;
        }
    }
    if(m==1)    //有乘除法情况
    {
        switch(a)          //用于四则运算四种符号的选择
        {
        case 0:
            oper='+';
            break;
        case 1:
            oper='-';
            break;
        case 2:
            oper='*';
            break;
        case 3:
            oper='/';
            break;    
        default:
            break;
        }
    }
    return oper;
}

int operator1(char oper)    //随机生成运算符号判断
{
    int k;
    if(oper=='+')
    {
        k=1;
    }
    if(oper=='-')
    {
        k=2;
    }
    if(oper=='*')
    {
        k=3;
    }
    if(oper=='/')
    {
        k=4;
    }
    return k;
}

int Calculate1(int number,int value,int print)    //满足最多十个数值运算,无加减负数乘除余数限制
{
    int i,j,num1,num2,jishu,m,n;
    char oper1,op1,op2;
    string s_num1,s_num2,s_connect[size];
    ofstream outfile;    //定义ofstream类即输出文件流类对象outfile
    srand((unsigned)time(NULL));    //通过系统时间初始化随机数种子,若不设置则每次产生随机数相同
    cout<<"请选择运算是否有乘除法:1.有  2.没有"<<endl;  //乘除法选择
    cin>>m;
    if(print==2)    //文件打开
    {
        outfile.open("out.txt",ios::out);
        if(!outfile)    //打开错误,报错
        {
            cerr<<"open error!"<<endl;
            exit(0);
        }
    }
    for(i=0;i<number;i++)    //输出运算式数量循环
    {
        num1=rand()%value+1;
        num2=rand()%value+1;
        oper1=Operator(m);
        s_num1=num_str(num1);
        s_num2=num_str(num2);
        s_connect[i]=s_num1+oper1+s_num2;
        jishu=rand()%9+2;
        if(jishu>2)    //对随机生成运算式里数值个数判断
        {
            for(j=jishu;j>2;j--)     //两个数值以上运算式生成
            {
                s_num1=s_connect[i];
                oper1=Operator(m);
                num2=rand()%value+1;
                s_num2=num_str(num2);
                s_connect[i]=s_num1+oper1+s_num2;
            }
        }
        if(print==2)    //文件输出
        {
            outfile<<s_connect[i]<<"="<<endl;
        }
        else
        {
            cout<<s_connect[i]<<"="<<endl;    //dos界面输出
        }
    }
    if(print==2)
    {
        outfile.close();    //关闭文件
    }
    return 0;
}
int Calculate2(int number,int value,int print)    //三个数组成的运算式,有加减负数和乘除法限制
{
    int i,num1,num2,num3,k1,k2,num,m,negtive,remainder;
    char oper1,oper2;
    string s_num1,s_num2,s_num3,s_connect[size];
    ofstream outfile;    //定义ofstream类即输出文件流类对象outfile
    srand((unsigned)time(NULL));    //通过系统时间初始化随机数种子,若不设置则每次产生随机数相同
    cout<<"请选择运算时加减结果是否有负数:1.有  2.没有"<<endl;  //加减法有无负数选择
    cin>>negtive;
    cout<<"请选择运算是否有乘除法:1.有  2.没有"<<endl;  //乘除法选择
    cin>>m;
    if(m==1)
    {
        cout<<"请选择运算时除法是否有余数:1.有  2.没有"<<endl;  //除法有无余数选择
        cin>>remainder;
    }
    if(print==2)    //文件打开
    {
        outfile.open("out.txt",ios::out);
        if(!outfile)    //打开错误,报错
        {
            cerr<<"open error!"<<endl;
            exit(0);
        }
    }
    for(i=0;i<number;i++)    //输出运算式数量循环
    {
        num1=rand()%value+1;
        num2=rand()%value+1;
        num3=rand()%value+1;
        oper1=Operator(m);
        oper2=Operator(m);
        k1=operator1(oper1);
        k2=operator1(oper2);
        if(negtive==1&&m==2)    //加减有负数,无乘除法
        {
            oper1=Operator(m);
            oper2=Operator(m);
            k1=operator1(oper1);
            k2=operator1(oper2);
        }
        if(negtive==2&&m==2)    //加减无负数,无乘除法
        {
            oper1=Operator(m);
            oper2=Operator(m);
            k1=operator1(oper1);
            k2=operator1(oper2);
            if(k1==2)
            {
                for(;num1<num2;)
                {
                    num1=rand()%value+1;
                }
                num=num1-num2;
            }
            if(k1==1)
            {
                num=num1+num2;
            }
            if(k2==2)
            {
                for(;num<num3;)
                {
                    num3=rand()%value+1;
                }
            }
        }
        if(negtive==2&&m==1&&remainder==2)    //加减无负数,乘除法无余数
        {
            oper1=Operator(m);
            oper2=Operator(m);
            k1=operator1(oper1);
            k2=operator1(oper2);
            if(k1==4)
            {
                for(;num1%num2!=0;)
                {
                    num1=rand()%value+1;
                }
                num=num1/num2;
                if(k2==2)
                {
                    for(;num<num3;)
                    {
                        num3=rand()%value+1;
                    }
                }
            }
            if(k2==4)
            {
                for(;num2%num3!=0;)
                {
                    num2=rand()%value+1;
                }
                num=num2/num3;
                if(k1==2)
                {
                    for(;num1<num;)
                    {
                        num1=rand()%value+1;
                    }
                }
            }
            if(k1==4&&k2==4)
            {
                for(;num1%num2!=0;)
                {
                    num1=rand()%value+1;
                }
                num=num1/num2;
                for(;num%num3!=0;)
                {
                    num3=rand()%value+1;
                }
            }
        }
        if(negtive==1&&m==1&&remainder==2)    //加减无负数,乘除法无余数
        {
            if(k1==4)
            {
                for(;num1%num2!=0;)
                {
                    num1=rand()%value+1;
                }
            }
            if(k2==4)
            {
                for(;num2%num3!=0;)
                {
                    num2=rand()%value+1;
                }
            }
            if(k1==4&&k2==4)
            {
                for(;num1%num2!=0;)
                {
                    num1=rand()%value+1;
                }
                num=num1/num2;
                for(;num%num3!=0;)
                {
                    num3=rand()%value+1;
                }
            }
        }
        s_num1=num_str(num1);
        s_num2=num_str(num2);
        s_num3=num_str(num3);
        s_connect[i]=s_num1+oper1+s_num2+oper2+s_num3;
        if(print==2)    //文件输出
        {
            outfile<<s_connect[i]<<"="<<endl;
        }
        else
        {
            cout<<s_connect[i]<<"="<<endl;    //dos界面输出
        }
    }
    if(print==2)
    {
        outfile.close();    //关闭文件
    }
    return 0;
}

void main()
{
    int number,value,print,chose;
    cout<<"请输入运算题目数量:"<<endl;  //定制运算题目数量
    cin>>number;
    cout<<"请输入数值产生范围:"<<endl;    //选择数值产生范围
    cin>>value;
    cout<<"请选择运算题目打印方式: 1.dos界面打印 2.文件打印"<<endl;  //定制运算题目打印方式
    cin>>print;
    cout<<"请选择: 1.随机产生10个数以内的运算式,无加减负数乘除余数限制"<<endl;
    cout<<"        2.满足三个数值的运算式,有加减负数乘除余数限制"<<endl;
    cin>>chose;
    if(chose==1)
    {
        Calculate1(number,value,print);
    }
    if(chose==2)
    {
        Calculate2(number,value,print);
    }
}

运行结果截图:

 

题目:

1.题目避免重复
2.可定制(数量/打印方式)
3.可以控制下列参数:
是否有乘除法
是否有括号(最多可以支持十个数参与计算)
数值范围
加减结果有无负数
除法结果有无余数

思路:

1.设置主函数让用户选择题目数量,打印方式,由于刚开始大方向写的不对导致时间不够只写了Calculate2函数在三个数条件下满足的加减有无负数,有乘法并满足乘法有无余数的功能,Calculate1函数满足十个数以内随机四则运算
2.写一个数字转变成字符串的num_str函数,满足函数中运算式以字符串形式输出
3.写一个随机产生运算符的Operator函数,满足随机产生运算符
4.写一个随机生成运算符号判断的operator1函数,满足Calculate2中符号判断
5.Calculate1函数实现满足十个数以内随机四则运算,通过数字转变成字符串,以字符串的形式输出
6.Calculate2函数在三个数条件下满足的加减有无负数,有乘法并满足乘法有无余数的功能,通过if-else语句判断乘除符号和加减符号位置,完成相应功能
7.通过主函数来调用Calculate1,Calculate2完成功能

个人总结:

这次程序完成的很不理想,还有非常多的缺陷,同时也意识到自己的不足和差距,由于思路上自己没有好好明确做了非常多的无用功,浪费了很多时间,程序实现的功能也有很多不足之处,课余时间还会更加努力,来提高自己的编程能力

项目计划日志(单位:h)

 

听课

编写程序

阅读相关书籍

网上查找资料

日总计

周一

2

0

1

0

3

周二

0

0

1

0

1

周三

0

3

0

0

3

周四

2

5

1

1

9

周五

0

8

1

1

10

周六

0

5

1

1

4

周日

 

 

 

 

 

周总计

4

21

4

      3

32

 

时间记录日志:(单位:min:

日期

开始时间

结束时间

中断时间

净时间

活动

备注

星期一

1400

15:50

10

100

听课

软件工程

 

21:00

22:00

0

60

看书

构建之法

星期二

19:00

20:00

0

60

看书

C++

星期三

14:30

17:30

0

180

编程

四则运算2

构建之法

星期四

19:00

00:20

0

320

编程

四则运算2

阅读C++

星期五

15:00

23:00

60

420

编程

四则运算2

阅读C++

星期六

10:00

18:00

60

420

编程和写博客

四则运算2

 

 

 

 

 

 

 

posted @ 2016-03-12 17:59  微微芋头  阅读(292)  评论(1编辑  收藏  举报