软件工程个人作业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

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

原文地址:https://www.cnblogs.com/liying123/p/5322491.html