• 软件工程个人作业03


    设计思路:

    定义两个数组number[1000],oper[1000]分存储数字和运算符,利用随机数函数随机的为numberoper数组分配整数和运算符

    Int Puanduan()用来判断计算结果是否正确,正确返回1,错误返回0

    利用for循环找到除号首先进行运算把结果保存到与字符序号相同的numberi】数组中并把poeri】变为加号,把number[i+1]变为0;最后从左到右算一遍加减运算

    MainCpp

    //四则运算

    //李营;201429302016/3/21

    #include "Arithmetic.h"

    int main()

    {

        P:

        Arithmetic A;//声明对象

        int N;//存储打印的题目数量

        int M;//存储参与混合运算的数字个数

        int n,m,f,o,p;

        cout<<"><><><><><><><><><><><><><><><"<<endl;

        cout<<"><      请选择模式:        ><"<<endl;

        cout<<"><       1为整数;           ><"<<endl;

        cout<<"><      2为假分数;          ><"<<endl;

        cout<<"><     3有括号运算          ><"<<endl;

        cout<<"><   4混合运算答题模式      ><"<<endl;

        cout<<"><><><><><><><><><><><><><><><"<<endl;

        cin>>n;

        cout<<"生成f值以内的运算题目(输入f值):"<<endl;

        cin>>f;

        if(n==1||n==2)

        {

            cout<<"请输入要打印的题目数量:"<<endl;

            cin>>N;

            cout<<"有无乘除运算?(1没有,2有):"<<endl;

            cin>>m;

            cout<<"加减运算有无负数?(1没有,2)"<<endl;

            cin>>o;

            cout<<"除法有无余数?(1没有,2有)"<<endl;

            cin>>p;

        }

        if(n==4)

        {

            cout<<"请输入参与混合运算的数字个数:"<<endl;

            cin>>M;

        }

        switch(n)

        {

            case 1:

                {A.Intnumber(N,m,f,o,p);break;}

            case 2:

                {A.Mixnumber(N,m,f,o);break;}

            case 3:

                {A.Havespace(f,N);}

            case 4:

                {A.CeShi(M,f);}

            default:

                {

                    cout<<"请按要求输入啦,亲!"<<endl;

                    goto P;

                }

         }

         goto P;

         return 0;

    }

    .h文件

    #pragma once

    #include<iostream>

    using namespace std;

    class Arithmetic

    {

    protected:

        int a,b,c,d,y,m;

    public:

        Arithmetic(void);

        ~Arithmetic(void);

        int Intnumber(int N,int m,int F,int O,int P);//整数函数

        int Mixnumber(int N,int m,int F,int O);//分数算式函数

        int show1(int y,int a,int b,int o,int P);//显示函数1

        int show2(int y,int a,int b,int c,int d);//显示函数2

        int Havespace(int F,int N);//有括号运算函数

        int CeShi(int N,int f);//产生测试题目函数

        char Operator();//产生运算符

        int PanDuan(float dd,int N,int number[1000],char oper[1000]);//d:传递用户输入的答案;N:传递用户所选混合运算的整数个数

    };

    Arithmetic.cpp文件

    #include "Arithmetic.h"

    Arithmetic::Arithmetic(void)

    {

    }

    Arithmetic::~Arithmetic(void)

    {

    }

    int Arithmetic::Intnumber(int N,int m,int F,int O,int P)

    {

        for(int i=0;i<N;i++)

        {

               a=rand()%F;

               b=rand()%F;

               if(m==1)

               { y=rand()%2;}

               else if(m==2)

               { y=rand()%4;} //判断是否有乘除

               if(b==0||(a==b&&b==c)) //避免重复且除数不为0

                 {

                    i--;

                 }        

                else

                 {

                    show1(y,a,b,O,P);

                 }

               if((i+5)%4==0)

               {

                    cout<<endl;

               }

        }

        return 0;

    }

    int Arithmetic::Mixnumber(int N,int m,int F,int O)

    {

        for(int i=0;i<N;i++)

        {

             a=rand()%F;

             b=rand()%F;

             if(m==1)

               { y=rand()%2;}

             else if(m==2)

               { y=rand()%4;} //判断是否有乘除

             c=rand()%100;

             d=rand()%100;

                if(b==0||b>=a||d>=c||(a==b&&b==c)) //确保假分数避免重复且除数不为0

                {

                    i--;

                }

                else

                {

                    show2(y,a,b,c,d);

                }

            }

       return 0;

    }

    int Arithmetic::show1(int y,int a,int b,int o,int p)

    {

          if(y==0)

            {

               if(o==1)//判断有无负数

                 {cout<<a<<"+"<<b<<"=   ";}

               else

                  {

                    if(rand()%3==0)//随机确定负号位置

                      {cout<<"(-"<<a<<")+"<<b<<"=   ";}

                    if(rand()%3==1)

                      {cout<<a<<"+(-"<<b<<")=   ";}

                    else

                      {cout<<"(-"<<a<<")+(-"<<b<<")=   ";}

                  }

            }

          else if(y==1)//判断有无负数

            {

                if(o==1)//随机确定负号位置

                  {cout<<a<<"-"<<b<<"=   ";}

                else

                  {

                    if(rand()%3==0)

                      {cout<<"(-"<<a<<")-"<<b<<"=   ";}

                    if(rand()%3==1)

                      {cout<<a<<"-(-"<<b<<")=   ";}

                    else

                      {cout<<"(-"<<a<<")-(-"<<b<<")=   ";}

                  }

            }

          else if(y==2)

            { cout<<a<<"*"<<b<<"=   ";}

          else

            if(p==1)//判断是否要求有余数

            {

                if(a%b!=0)

                {a=(a-a%b);}//确保没有余数

                cout<<a<<"/"<<b<<"=   ";

            }

            else

            {

                if(b==1)

                {b=b+1;}

                if(a%b==0)

                {a=(a+rand()%b);}//确保有余数

                cout<<a<<"/"<<b<<"=   ";

            }

        return 0;

    }

    int Arithmetic::show2(int y,int a,int b,int c,int d)

    {

        if(y==0)

          {cout<<"("<<a<<"/"<<b<<")+("<<c<<"/"<<d<<")="<<endl;}

        else if(y==1)

          { cout<<"("<<a<<"/"<<b<<")-("<<c<<"/"<<d<<")="<<endl;}

        else if(y==2)

          {  cout<<"("<<a<<"/"<<b<<")*("<<c<<"/"<<d<<")="<<endl; }

         else

          {cout<<"("<<a<<"/"<<b<<")/("<<c<<"/"<<d<<")="<<endl; }

        

        return 0;

    }

    int Arithmetic::Havespace(int F,int N)

    {

        

        for(int i=0;i<N;i++)

        {

            char s;

            int n=rand()%4;

            if(n==0)

            {s='+';}

            else if(n==1)

            {s='-';}

            else if(n==2)

            {s='*';}

            else

            {s='/';}

        cout<<"("<<rand()%F<<s<<rand()%F<<")"<<s<<"("<<rand()%F<<s<<rand()%F<<")="<<endl;

        }

        return 0;

    }

    char Arithmetic::Operator()//随机产生运算符

    {

        char c;//存储运算符

        int r;

        r=rand()%4;

        if(r==0)

        {

            c='+';

        }

        else if(r==1)

        {

            c='-';

        }

        else if(r==2)

        {

            c='*';

        }

        else

        {

            c='/';

        }

        return c;

    }

    int Arithmetic::CeShi(int N,int f)//实现混合运算式的输出

    {

        int n=0;//用来计算作对数目

        for(int i=0;i<30;i++)//循环生成30道题目

        {

            int N1=N-1;//运算符个数

            char oper[1000];//用来存储运算符

            int number[1000];//用来存储参与运算的随机数

            for(int i=0;i<N;i++)//对参与运算的数依次赋值

            {

                number[i]=(rand()%f);

                if(number[i]==0)

                {

                    i--;

                }

            }

             for(int i=0;i<N-1;i++)//对参与运算的运算符依次赋值

            {

                oper[i]=Operator();

            }

            oper[N-1]='=';

            for(int i=0;i<N;i++)//输出每一个混合运算式

            {

                int m;

                if(((oper[i]=='/')&&(oper[i-1]!='/'))||((oper[i]=='/')&&(oper[i-1]=='/')&&(oper[i-2]=='/')))

                //解决连续除号的如何加括号

                {

                    cout<<"(";

                    m=i;        

                }

                cout<<number[i];

                if(i==(m+1)&&oper[m]=='/')//后括号的输出

                {

                    cout<<")";

                }

                cout<<oper[i];

            }

            cout<<"?";

            float D;//用来存储用户输入的答案

            cin>>D;

            n=n+PanDuan(D,N,number,oper);

        }

        cout<<"您答对了"<<n<<"道题目"<<endl;

        return 0;

    }

    int Arithmetic::PanDuan(float dd,int N,int number[1000],char oper[1000])//判断混合运算用户单是否正确

    {

            int n=0;//用来返回用户答案是否正确如正确返回1,错误返回0

            for(int i=0;i<N;i++)

            {

                if(oper[i]=='/')

                {  

                   number[i+1]=(number[i])/(number[i+1]);

                   oper[i]='+';

                   number[i]=0;

                }

            }

            for(int i=0;i<N;i++)

            {

                if(oper[i]=='*')

                {  

                   number[i+1]=(number[i])*(number[i+1]);

                   oper[i]='+';

                   number[i]=0;

                }

            }

            float sum=number[0];

            for(int i=0;i<(N-1);i++)

            {

                if(oper[i]=='+')

                {  

                   sum=sum+number[i+1];

                }

                else

                {

                   sum=sum-number[i+1];

                }

            }

            if(dd==sum)

            {

                n=1;

                cout<<"正确!";

            }

            else

            {

                cout<<"错误!";

            }

            cout<<endl;

            return n;

    }

    程序截图:

     

    编程总结分析:

       不要上来就写代码,一定要分析好,但也不要分析的太过细致入微,首先是功能的实现,然后在做优化。不要想着一簇而就,比如不会混合运算的,自己便首先完成了简单的两个数的四则运算的输出及计算,要从自己会的出发循序渐进。另外在程序编译运行过程中发现方法体功能写的尽量单纯一点,能够避免大量的代码重写。在程序调试过程中出现了死循环,在一顿查找后才发现,原来是自己变量的定义出现了问题,把存储用户输入答案的变量设成了整形,进而在用户输入小数是出现了bug,从中认识到严谨的重要性。另外在这个较大(对于本人而言)程序编写过程中,我似乎明白了写单元测试的重要性。

                                                周活动总结表

                                      姓名:李营                                                日期:2016/3/26

    日期

    任务

    听课(min

    编写程序(min

    阅读课本

    准备考试

    整理并发布作业

    日总计(min

    周日

    周一

    100

    120

    220

    周二

    周三

    150

    150

    周四

    周五

    60

    60

    周六

    120

    120

    周总计

    100

    270

    450

                                              阶段时间和效率:

                              不包括本周的累计时间:

    总计

    100

    270

    120

    390

    平均

    100

    270

    120

    390

    最大

    100

    270

    120

    390

    最小

    100

    270

    120

    390

                              全部周的累积时间:

    总计

    200

    540

    180

    120

    840

    平均

    100

    270

    90

    120

    420

    最大

    100

    270

    120

    120

    450

    最小

    100

    270

    60

    120

    390

                                              时间记录日志

                                  学生:李营                      日程:20016/3/19

                                  教师:王建民                                          课程;软件工程概论

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

    3/21

    8:00

    9:50

    10

    100

    听课

    王老师讲课

    1430

    16:50

    20

    120

    编写程序(二柱子)

    ,打水,聊天

    作业

    3/23

    14:00

    16:40

    10

    150

    编写程序(利用数组解决了就安吉算出答案的问题,打水

    作业

    3/25

    14:00

    15:00

    120

    阅读大道至简

    作业

    3/26

    9:30

    11:30

    120

    编写程序(对程序稍加完善),整理提交作业

    作业

                                              缺陷记录日志

                                  学生:李营

                                  日期:2016/3/26

                                  教员:王建民

                                  程序号:2

    日期

    编号

    类型

    引入阶段

    排除阶段

    修复时间

    修复缺陷

    3/21

    1

    a

    编码

    编码

    1min

    注释时多注释了一个“}

    2

    b

    编译运行

    编译运行

    1min

    不能正确的输出答案

    3/23

    3

    c

    编码

    编码

    1min

    忘记了关闭上一次的运行窗口造成程序报错为找不到保存路径

  • 相关阅读:
    Activiti 整合的小插曲
    IDEA 提示找不到 javax 等 tomcat 的相关包
    一些好用的 Oracle 批处理和语句
    Oracle 日志报错导致的 “没有登录” 问题
    WebPack 从安装到闲置
    CHENEY-YANG'S BLOG(cheney-yang)
    Java基础知识常识总结
    激活Navicat
    IDEA文件头版权模板
    关于Spring框架中StringUtils常用/易误用方法解析
  • 原文地址:https://www.cnblogs.com/liying123/p/5322491.html
Copyright © 2020-2023  润新知