软件工程个人作业2

狂风中的少年 提交于 2020-03-16 17:27:12

1》题目要求:

可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:

1、题目避免重复;
2、可定制(数量/打印方式);
3、可以控制下列参数:

*是否有乘除法;
*是否有括号(最多可以支持十个数参与计算);
*数值范围;
*加减有无负数;
*除法有无余数!
 
2》设计思想:
这次编程主要是在上一次的基础之上,作进一步的要求,然后实现不同方式的输出。
1)题目避免重复的实现:先定义三个数组,然后再循环时将产生的运算符和两个运算数(随机产生的三个数)存入数组,每进行一次循环,就将数组中的数和前面的相比,如果两个运算符和运算数都和前面某一组数相等,那么重新产生一组随机数,实现避免重复。
2)可定制的实现:打印数量,就是输入一个数,然后进行该数次循环,然后输出。打印方式主要是可以在屏幕上输出,也可以实现输出到一个记事本文件中,这用到了输入输出流 的知识。
3)1.是否有乘除法,用if语句实现,如果有乘除法,则进一步选择是否有余数,我的程序是对有余数的选择直接输出,如果没有余数,就是被除数减去余数在输出。
2.数值范围:可以定义一个数s,用随机数rand()%s 就是产生1~s的随机数。
3.加减法无负数,就是保证后一个数比前一个数大,有负数,在其中加入负号。
 
ps:是否括号功能较难,暂时还未实现
 
源代码:
 

//四则运算2
//2016 3 14 Sunzhe
#include<fstream>
#include<iostream>
using namespace std;


void chengchufa(int m,int s)
{
  int v;
  int j[100],k[100],l[100];//用于检查重复的数组
  cout<<"请输入选择:1.有余数 2.无余数:"<<endl;
  cin>>v;
  for(int i=0;i<m;i++)
  {
    int n=rand()%4; //产生随机数,运算符
    int a=rand()%s;//产生1~s随机数
    int b=rand()%s;//产生1~s随机数
    j[i]=n;
    k[i]=a;
    l[i]=b;
    for(int r=i-1;r>=0;r--)//向前检查重复,如果重复则重新生成
    {
      if(j[r]==j[i]&&k[r]==k[i]&&l[r]==l[i])
      {
          int n=rand()%4; //产生随机数,运算符
          int a=rand()%s;//产生1~s随机数
          int b=rand()%s;//产生1~s随机数
       }
    }


    if(n==0)

    {
      cout<<a<<"+"<<b<<"="<<endl;
    }
    else if(n==1){
      cout<<a<<"-"<<b<<"="<<endl;
    }
    else if(n==2){
      cout<<a<<"*"<<b<<"="<<endl;
    }
    else{
      if(a<b)//实现被除数比除数大
      {
        int w;
        w=a;
        a=b;
        b=w;
      }
      if(b==0)
      {
        b++;
      }
      if(v==1)//有余数
      {
        cout<<a<<"/"<<b<<"="<<endl;
      }
      if(v==2)
      {
        a=a-a%b;
        cout<<a<<"/"<<b<<"="<<endl;
      }
    }
  }
}

void jiajianfa(int m,int s){

    int u;
    int j[100],k[100],l[100];//用于检查重复的数组
    cout<<"请输入选择:1有负数 2无负数"<<endl;
    cin>>u;
    for(int i=0;i<m;i++)
    {
      int n=rand() %2;//产生随机数,运算符的

      int a=rand()%s;//产生1~s随机数
      int b=rand()%s;//产生1~s随机数
      j[i]=n;
      k[i]=a;
      l[i]=b;
      for(int r=i-1;r>=0;r--)
      {
        if(j[r]==j[i]&&k[r]==k[i]&&l[r]==l[i])
        {
            int n=rand()%4; //产生随机数,运算符
            int a=rand()%s;//产生1~s随机数
            int b=rand()%s;//产生1~s随机数
        }
      }

      if(u==1) //有负数
      {
        if(n==0)
        {
            cout<<"(-"<<a<<")+"<<b<<"="<<endl;
        }
        else
        {
            cout<<a<<"-"<<b<<"="<<endl;
        }
      }
      if(u==2)//无负数
      {
          if(a<b)//实现减法无负数
          {
            int w;
            w=a;
            a=b;
            b=w;
          }
          if(n==0)
          {
              cout<<a<<"+"<<b<<"="<<endl;
          }
          else
          {
              cout<<a<<"-"<<b<<"="<<endl;
          }
      }
    }

}
void dayinfangshi(int m,int s){
    int t;
    cout<<"请输入选择1.在屏幕输出2.在文件输出"<<endl;
    cin>>t;
    if(t==1)
    {
      for(int i=0;i<m;i++)
      {
        int n=rand()%4; //产生随机数,运算符
        int a=rand()%s;//产生1~s随机数
        int b=rand()%s;//产生1~s随机数

        if(n==0){
          cout<<a<<"+"<<b<<"="<<endl;
        }
        else if(n==1){
          cout<<a<<"-"<<b<<"="<<endl;
        }
        else if(n==2){
          cout<<a<<"*"<<b<<"="<<endl;
        }
        else{
          if(a<b)//实现被除数比除数大
          {
            int w;
            w=a;
            a=b;
            b=w;
          }
          if(b==0)
          {
            b++;
          }
          cout<<a<<"/"<<b<<"="<<endl;
        }
      }
     }
     if(t==2)
    {
        ofstream outfile("f1.dat",ios::out);//定义文件流对象,打开磁盘文件f1.dat
        if(! outfile) //如果打开失败返回0值
        {
            cerr<<"open error!"<<endl;
            exit(1);
        }
        for(int i=0;i<m;i++)
        {
            int n=rand()%4; //产生随机数,运算符
            int a=rand()%s;//产生1~s随机数
            int b=rand()%s;//产生1~s随机数

            if(n==0){
              outfile<<a<<"+"<<b<<"="<<endl;
            }
            else if(n==1){
              outfile<<a<<"-"<<b<<"="<<endl;
            }
            else if(n==2){
              outfile<<a<<"*"<<b<<"="<<endl;
            }
            else{
              if(a<b)//实现被除数比除数大
              {
                int w;
                w=a;
                a=b;
                b=w;
              }
              if(b==0)
              {
                b++;
              }
              outfile<<a<<"/"<<b<<"="<<endl;
            }
        }
        outfile.close();
    }
}

void main()
{
  int x;//进行选择的数
  q:cout<<"请选择要进行的运算:1.整数运算 2.真分数运算 3.退出程序"<<endl;
  cin>>x;
  switch(x)
  {
    case 1://进行整数的运算
    {
      int m;//题目的数量
      cout<<"请输入想打印的数量:"<<endl;
      cin>>m;


      int s;//数值范围
      cout<<"请输入想要计算的数值范围(1~ 你输入的数):"<<endl;
      cin>>s;
      int t;
      cout<<"请输入选择:"<<endl;
      cout<<"1.有乘除法"<<endl;
      cout<<"2.无乘除法"<<endl;
      cout<<"3.打印方式"<<endl;
      cin>>t;
      if(t==1){//有乘除法
        chengchufa(m,s);

      }
      if(t==2)//无乘除法
      {
        jiajianfa(m,s);
      }
      if(t==3)
      {
        dayinfangshi(m,s);
      }
    goto q;
    }
    case 2:
    {
      for(int i=0;i<30;i++)
      {
          int c=rand()%100;//产生1~100随机数
          int d=rand()%100;//产生1~100随机数
          int e=rand()%100;//产生1~100随机数
          int f=rand()%100;//产生1~100随机数


          //保证为真分数
          if(c>d)
          {
            int t;
            t=d;
            d=c;
            c=t;
          }
          if(e>f)
          {
            int s;
            s=f;
            f=e;
            e=s;
          }
          if(d==0){d++;} //分母不为零
          if(f==0){f++;} //分母不为零
          //约分化为最简
          for(int a=c;a>0;a-- )
          {
            if(c%a==0&&d%a==0)
            {
              c=c/a;
              d=d/a;
              break;
            }
          }
          for(int b=e;b>0;b-- )
          {
            if(e%b==0&&f%b==0)
            {
              e=e/b;
              f=f/b;
              break;
            }
          }

          int n=rand() %4; //产生运算符的随机数

        if(n==0){
          cout<<c<<"/"<<d<<"+"<<e<<"/"<<f<<"="<<endl;
        }
        else if(n==1){
          cout<<c<<"/"<<d<<"-"<<e<<"/"<<f<<"="<<endl;
        }
        else if(n==2){
          cout<<c<<"/"<<d<<"*("<<e<<"/"<<f<<")="<<endl;
        }
        else
        {
          cout<<c<<"/"<<d<<"/("<<e<<"/"<<f<<")="<<endl;
        }
    }
    goto q;
  }
  case 3:
  {
    exit(0);
  }

 }
}

 

3》运行结果截图:

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!