课后实验2--四则运算2

一、设计思想

1.在结构方面,将题目拆分开来,一共有四个部分,首先是只有加减法,其次是既有加减法也有乘除法,再其次是加减乘除都有,还有括号,最后是加减乘除没有括号。

2.在功能方面 

题目避免重复这部分,实现思想是当两个式子长度相同时,利用循环令第一个数字不重复,以避免式子出现重复。题目可定制部分,数量由用户自己输入,通过随机数函数实现每个式子的长短变化以及数字和符号的随机性。输出方式可分为屏幕输出和文件输出,其中文件输出需要用到ofstream输出流来实现。 数值范围部分,由用户自己规定数值范围,由随机数函数产生在这个范围内的整数或小数,来参与运算。

3.结构的四个模块具体实现如下,只有加减法:当只有加减法出现时,由随机数函数决定加减符号,在这一模块中考虑加减有无负数的问题,当出现减号时,判断两边大小关系,令左边大于右边,实现相减无负数的功能。加减乘除无括号的情况:在加减乘除无括号出现的情况下,由随机数函数决定加减乘除符号,考虑除数不为零的情况,以及除数是否有余数,没有余数时,考虑数字都是整数的情况,利用判断被除数与随机数余数是否为零来确定除数,以实现余数为零。加减乘除有括号,没有乘除有括号:左右括号相等以及括号位置出现借助于随机数来实现。

4.缺陷是只在无括号无乘除时,两数相减无负数,在其他情况下由于其它符号影响不知道怎么判断。除法没有余数的情况也是在有乘除无括号时判断,因为在有括号时要考虑优先关系,自己想不出来解决方法,所以这两个功能覆盖不全面,还有就是未能计算出结果。

二、实验代码

//HaoYing 2016.3.7 信1301-2班 20132919
//课堂实验2--四则运算2
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<fstream>
using namespace std;

ofstream ofile("c:calculate.txt",ios::trunc);//若输出到文件,则输出到c:calculate.txt中

void jiajian(int type,int choose)//输出加减符号的函数
{
    if(choose==0)
    {
        if(type==1)
        {
            cout<<"+";
        }
        else
            ofile<<"+";
    }
    else
    {
        if(type==1)
        {
            cout<<"-";
        }
        else
            ofile<<"-";
    }
}
void chengchu(int type,int choose)//实现输出乘除符号的函数
{
    if(choose==0)
    {
        if(type==1)
        {
            cout<<"*";
        }
        else
            ofile<<"*";
    }
    else
    {
        if(type==1)
        {
            cout<<"/";
        }
        else
            ofile<<"/";
    }
}
void kuohao1(int type)//实现输出左括号的函数
{
    if(type==1)
    {
        cout<<"(";
    }
    else
        ofile<<"(";
}
void kuohao2(int type)//实现输出右括号的函数
{
    if(type==1)
    {
        cout<<")";
    }
    else
        ofile<<")";
}
void main()
{

    double n[10];//用来存放每道题的数字
    srand((int)time(NULL));//变换随机数
    int next,down,up,minus,remainder,bracket,have,edg,length,length1,length2,length3,output,choose,choose1=1,p2,p1;
    int i,j,k,k1,k2,m;//i,j,k用于循环计数器,k1,k2分别为左括号计数器和右括号计数器,m为输出选择控制器
    cout<<"请设置题数:";
    cin>>next;//实现可定制功能
    cout<<"请设置打印方式:1.屏幕显示  2.保存到文件夹  ";
    cin>>output;//实现打印方式功能
    cout<<"请设置是否有乘除法:1.是  2.否  ";
    cin>>have;//实现是否有乘除法功能
    cout<<"请设置是否有括号:1.是  2.否  ";
    cin>>bracket;//实现是否有括号功能
    cout<<"请设置数值范围,依次输入下限和上限:";
    cin>>down;
    cin>>up;
    if(have==1&&bracket==2)
    {
        cout<<"请设置除法是否有余数:1.是  2.否  ";
        cin>>remainder;
    }
    if(have==2&&bracket==2)
    {
        cout<<"请设置加减法是否有负数:1.是  2.否  ";
        cin>>minus;//实现加减法是否有负数的功能
    }
    if(output==2)
    {
        if(!ofile.is_open())
        {
            cout<<"打开文件失败!"<<endl;
        }
        cout<<"已经成功保存到了C盘的calculate.txt中!"<<endl;
    }
    double p[1000];
    int q[1000];
    for(j=0;j<next;j++)//四则运算的题数为next的值
    {
        length=2+(rand()%100)%8;
        q[j]=length;
        length1=length-2;//括号的对儿数最大值
        for(i=0;i<length;i++)
        {
            edg=(rand()%100)%2;
            if(remainder==2)//如果要求除法没有余数
                n[i]=down+rand()%(up-down);
            else
            {
                if(edg==0)
                    n[i]=down+rand()%(up-down);//随机整数范围【down,up】
                else
                    n[i]=(down+rand()%((up-1)-down))+rand()%100/100.0;//随机数范围【down,up】的随机小数
            }
            p[j]=n[0];
        }
        for(k=0;k<j;k++)//避免题目重复
        {
            if(q[k]==q[j])
            {
                if(edg==0)
                    p[j]=down+rand()%(up-down);//随机整数范围【down,up】
                else
                    p[j]=(down+rand()%((up-1)-down))+rand()%100/100.0;//随机数范围【down,up】的随机小数
            }
                break;
        }
        n[0]=p[j];
        if(have==2&&bracket==2)//如果只有加减法
        {
            if(output==1)
            {
                cout<<n[0];
            }
            else
                ofile<<n[0];
            for(i=1;i<length;i++)
            {
                choose=(rand()%100)%2;
                if(choose1==0)
                {
                    jiajian(output,0);
                    choose1=1;
                }
                else
                    jiajian(output,choose);    
                if(minus==2)//设置加减法没有负数
                {
                    if(choose==1)
                    {
                        if(n[i]>n[i-1])
                        {
                            if(n[i-1]==down||(n[i-1]-down)<1)
                                n[i]=down;
                            else
                                n[i]=down+rand()%(int(n[i-1])-down);
                            choose1=0;
                        }
                    }
                }
                if(output==1)
                {
                    cout<<n[i];
                }
                else
                    ofile<<n[i];
            }
            if(output==1)
            {
                cout<<"="<<endl;
            }
            else
                ofile<<"="<<endl;
        }
        else if(have==1&&bracket==2)//有乘除无括号
        {
            if(output==1)
            {
                cout<<n[0];
            }
            else
                ofile<<n[0];
            for(i=1;i<length;i++)
            {
                if((rand()%100)%2==0)
                {
                    choose=(rand()%100)%2;
                    jiajian(output,choose);
                }
                else
                {
                    choose=(rand()%100)%2;
                    chengchu(output,choose);
                    if(n[i]==0)
                        n[i]=1+rand()%(up-1);
                    if(remainder==2)//如果设置除法没有余数,则令被除数为除数的整数倍即可
                    {
                        if(choose==1)
                        {
                            if(n[i-1]==1)
                                n[i]=1;
                            else
                            {
                                p2=int(n[i-1]);
                                p1=1+rand()%(p2-1);
                                while(p2%p1!=0)
                                {
                                    p1=1+rand()%(p2-1);
                                }
                                n[i]=p1;
                            }
                        }
                    }
                }
                if(output==1)
                {
                    cout<<n[i];
                }
                else
                    ofile<<n[i];
            }
            if(output==1)
            {
                cout<<"="<<endl;
            }
            else
                ofile<<"="<<endl;
        }
        else if(have==1&&bracket==1)//有乘除有括号
        {
            k1=0,k2=0;
            length2=1+rand()%(length-1);//左括号数
            length3=length2;//右括号数
            if((rand()%100)%2==0&&length!=2)
            {
                if(output==1)
                {
                    cout<<"("<<n[0];
                }
                else
                    ofile<<"("<<n[0];
                k1++;
            }
            else
                if(output==1)
                {
                    cout<<n[0];
                }
                else
                    ofile<<n[0];
               for(i=1;i<length;i++)
            {     
                m=(rand()%100)%3;
                if((rand()%100)%2==0)
                {
                    choose=(rand()%100)%2;
                    jiajian(output,choose);
                }
                else
                {
                    choose=(rand()%100)%2;
                    chengchu(output,choose);
                }
                if(m==0&&i!=length-1)
                {
                    if(k1<=length2)
                    {
                        if(output==1)
                        {
                            cout<<"("<<n[i];
                        }
                        else
                            ofile<<"("<<n[i];
                        k1++;
                    }
                    else
                    {
                        if(output==1)
                        {
                            cout<<n[i];
                        }
                        else
                            ofile<<n[i];
                    }
                }
                else if(m==1&&k1!=0)
                {
                    if(k2<=length3)
                    {
                        if(output==1)
                        {
                            cout<<n[i];
                        }
                        else
                            ofile<<n[i];
                        if(k1>k2)
                        {
                            for(k=0;k<k1-k2;k++)
                            {
                                if(output==1)
                                {
                                    cout<<")";
                                }
                                else
                                    ofile<<")";
                            }
                            k2=k2+k;
                        }
                    }
                    else
                    {
                        if(output==1)
                        {
                            cout<<n[i];
                        }
                        else
                            ofile<<n[i];
                    }
                }
                else
                {
                    if(output==1)
                    {
                        cout<<n[i];
                    }
                    else
                        ofile<<n[i];
                    if(k1>k2)
                    {
                        for(k=0;k<k1-k2;k++)
                        {
                            if(output==1)
                            {
                                cout<<")";
                            }
                            else
                                ofile<<")";
                        }
                        k2=k2+k;
                    }
                }
            }
            if(output==1)
            {
                cout<<"="<<endl;
            }
            else
                ofile<<"="<<endl;
        }
        else//没有乘除有括号
        {
            k1=0,k2=0;//k1,k2分别为左括号计数器和右括号计数器
            length2=1+rand()%(length-1);//左括号数
            length3=length2;//右括号数
            if((rand()%100)%2==0&&length!=2)
            {
                if(output==1)
                {
                    cout<<"("<<n[0];
                }
                else
                    ofile<<"("<<n[0];
                k1++;
            }
            else
                if(output==1)
                {
                    cout<<n[0];
                }
                else
                    ofile<<n[0];
               for(i=1;i<length;i++)
            {     
                m=(rand()%100)%3;
                choose=(rand()%100)%2;
                jiajian(output,choose); 
                if(m==0&&i!=length-1)
                {
                    if(k1<=length2)
                    {
                        if(output==1)
                        {
                            cout<<"("<<n[i];
                        }
                        else
                            ofile<<"("<<n[i];
                        k1++;
                    }
                    else
                    {
                        if(output==1)
                        {
                            cout<<n[i];
                        }
                        else
                            ofile<<n[i];
                    }
                }
                else if(m==1&&k1!=0)
                {
                    if(k2<=length3)
                    {
                        
                        if(output==1)
                        {
                            cout<<n[i];
                        }
                        else
                            ofile<<n[i];
                        if(k1>k2)
                        {
                            for(k=0;k<k1-k2;k++)
                            {
                                if(output==1)
                                {
                                    cout<<")";
                                }
                                else
                                    ofile<<")";
                             }
                            k2=k2+k;
                        }
                    }
                    else
                    {
                        if(output==1)
                        {
                            cout<<n[i];
                        }
                        else
                            ofile<<n[i];
                    }
                }
                else
                {
                    if(output==1)
                    {
                        cout<<n[i];
                    }
                    else
                        ofile<<n[i];
                    if(k1>k2)
                    {
                        for(k=0;k<k1-k2;k++)
                        {
                            if(output==1)
                            {
                                cout<<")";
                            }
                            else
                                ofile<<")";
                        }
                        k2=k2+k;
                    }
                }
            }
            if(output==1)
            {
                cout<<"="<<endl;
            }
            else
                ofile<<"="<<endl;
        }
   }
   ofile.close();
}

三、实验截图

屏幕显示时
1.有乘除无括号:有余数

2.有乘除无括号:无余数

3.无乘除有括号

4.无乘除无括号:无负数

5.无乘除无括号:有负数

输出到文件时

1.有乘除有括号

2.有乘除无括号:有余数

3.有乘除无括号:无余数

4.无乘除有括号

5.无乘除无括号:有负数

6.无乘除无括号:无负数

四、项目计划日志

五、时间记录日志

六、缺陷记录日志

 

 

  

  

转载于:https://www.cnblogs.com/haoying1994/p/5268739.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值