码迷,mamicode.com
首页 > 其他好文 > 详细

四则运算3

时间:2016-03-19 17:59:12      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

小组成员:刘伟 ,李晨  (http://www.cnblogs.com/jiajun1/p/5295364.html )

这周老师在前两周的基础上又增加了一些要求
1.可以判断答案的正确与否
2.程序必须能处理四则运算的混合算式
这次的作业我们封装了几个子函数,
1.随机数函数:把取值范围按最大最小值传递给函数就会返回一个符合要求的随机数(前两周的作业就已经存在随机数生成函数)
2.计算函数:把运算符和操作数传递给函数就会返回运算的的结果(根据运算需要新添加到的子函数)
3.题目生成函数:把要生成题目的要求传递给该函数就会返回一个符合要求的运算式
                      这个函数主要包括:运算式的输出,括号的运算,乘除的运算,加减的运算
主函数主要进行数据的输入和结果正确的判定
程序的主要思路还是用数组,3个数为一个单位,这次因为需要运算出得数,所以用了两个数组a,b。其中a为整型数组,b为double型数组,经过运算的得数因为有可能是小数所以用b来储存得数。
改程序的缺点
   1.目前还不支持分数的运算(思路是用结构体)
   2.两个连续的除法需要括号(思路是初始化数组完成后加判断语句增加括号时间原因暂时无法实现)
#include<iostream>
#include<string>
#include<stdlib.h>
#include<time.h>
using namespace std;
int randnum2(int min,int max)   //获得随机数
{
   int ranum=0;
   ranum=rand(); 
   while(ranum>max)
   { 
      ranum%=max;//保证min<b<max
      if(ranum<min)
      {
        ranum=rand();
      }
   }
   return ranum;
}
double answer(int ope,double num1,double num2)
{
    double ans=0;
    if(ope==0)
    {
        ans=num1+num2;
    }
    if(ope==1)
    {
        ans=num1-num2;
    }
    if(ope==2)
    {
        ans=num1*num2;
    }
    if(ope==3)
    {
        ans=num1/num2;
    }
    return ans;
}
double  question(int max,int min,int numam)
{
    int a[100],i=2,j=0,num=0;
    double b[100];
    string str="+-*/";
    num=randnum2(i,numam);
    i=0;
    while(i<=num*3)                  // 初始化数组
    {
        a[i]=randnum2(min,max);
        b[i]=a[i];
        i++;
    }
    while(j<=num*3)
    {
        a[j]%=4;//运算符
        a[j+1]%=2;//括号
        if(a[j+1]==1)
        {
           a[j+4]=-1;
        }
        j+=3;
    } 

    //测试
    int t=0;
    //测试1111111111111111
    i=0;
    j=1; 
    while(j<=num*3)                            //输出式子
    { 
        if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)cout<<"(";
        cout<<a[j+1];
        if(a[j-3]==1&&j>3&&a[j-1]!=2&&a[j-1]!=3)cout<<")";
        if(j<(num*3-3))cout<<str[a[j+2]];
        j+=3;
    }
    
    j=1;
    while(j<=num*3-3)                          //计算括号
    { 
        if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)
        { 
           b[j+1]=answer(a[j+2],b[j+1],b[j+4]);
           a[j+1]=b[j+1];
           for(int i=j+2;i<num*3-3;i++)
           {
              a[i]=a[i+3];
              b[i]=b[i+3];  
           }
           num-=1;
        }
        j+=3;
    }
    j=1; 
    while(j<=num*3-3)                                //计算乘除
    { 
        if(a[j+2]==2||a[j+2]==3)
        {
          
           b[j+1]= answer(a[j+2],b[j+1],b[j+4]);
           for(int i=j+2;i<num*3-3;i++)
           {
              a[i]=a[i+3];
              b[i]=b[i+3];
           }
           num-=1;
           j-=3;
        }
        j+=3;
    }
    j=1; 
    double ans=0,m=0;
    while(j<=num*3)
    { 
        m=b[j+1];
        if(a[j+2]==1)
        {
             ans=ans-m;
        }
        else
        {
            ans=ans+m;
        }
        j+=3;
    }
    return ans;
}
int main()
{
  int quam=5,max=9, min=3,numam=5;
                //输入生成题目的条件
     cout<<"一共出几道题:";
     cin>>quam;
     cout<<"最多几个数(10个数之间):";
     cin>>numam;
     cout<<"数值范围:\n最大值:";
     cin>>max;
     cout<<"最小值:";
     cin>>min;
               //结束输入生成题目的条件
    int i=1;
    double ansin;
    while(quam--)                            //循环一次生成一道题
    {
     cout<<"No."<<i++<<":";   //题目计数器
     double ans=question( max, min,numam);
     cout<<"=";
     cin>>ansin;
     cout<<"你输入的数为:"<<ansin<<endl;
     ansin=ansin-ans;
     if(ansin<0)
     {
        ansin=-ansin;
     }
     if(ansin<0.1)
     {
         cout<<"good!!"<<endl;
     }
     else
     {
        cout<<"回答错误!!!正确答案为:"<<ans<<endl;
     }
  }
  return 0;
}

  

实验结果:

1.生成3道最多5个数取值范围在2~9之间的四则运算式

技术分享

2.生成3道最多6个数取值范围在4~9之间的四则运算式

技术分享

 

四则运算3

标签:

原文地址:http://www.cnblogs.com/Lw-1573/p/5295741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!