zoukankan      html  css  js  c++  java
  • 课后实验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.无乘除无括号:无负数

    四、项目计划日志

    五、时间记录日志

    六、缺陷记录日志

      

      

  • 相关阅读:
    Grodno 2015 (Urozero May 2015 Day 5) D Triangles
    Flea Circus(Project Euler 213)
    Prime triplets (Project Euler 196)
    ACM 博弈(难)题练习 (第二弹)
    Crosses Puzzles zoj 4018 (zju校赛)
    Petrozavodsk Summer-2015. Ivan Smirnov Contest 1 B Bloom
    ACM 博弈(难)题练习 (第一弹)
    2017 ACM区域赛(南宁站) 参赛流水账
    2017 CCPC 杭州 流水账
    2017 ACM区域赛(西安) 参赛流水账
  • 原文地址:https://www.cnblogs.com/haoying1994/p/5268739.html
Copyright © 2011-2022 走看看