首页 > 其他 > 详细

实现自动生成30道四则运算题目(3)

时间:2016-03-19 16:27:03      阅读:195      评论:0      收藏:0      [点我收藏+]

 
这周老师在前两周的基础上又增加了一些要求
1.可以判断答案的正确与否
2.程序必须能处理四则运算的混合算式
这次的作业我们封装了几个子函数,
1.随机数函数:把取值范围按最大最小值传递给函数就会返回一个符合要求的随机数(前两周的作业就已经存在随机数生成函数)
2.计算函数:把运算符和操作数传递给函数就会返回运算的的结果(根据运算需要新添加到的子函数)
3.题目生成函数:把要生成题目的要求传递给该函数就会返回一个符合要求的运算式
                      这个函数主要包括:运算式的输出,括号的运算,乘除的运算,加减的运算
主函数主要进行数据的输入和结果正确的判定
程序的主要思路还是用数组,3个数为一个单位,这次因为需要运算出得数,所以用了两个数组a,b。其中a为整型数组,b为double型数组,经过运算的得数因为有可能是小数所以用b来储存得数。
改程序的缺点
   1.目前还不支持分数的运算(思路是用结构体)
   2.两个连续的除法需要括号(思路是初始化数组完成后加判断语句增加括号时间原因暂时无法实现)
  1 #include<iostream>
  2 #include<string>
  3 #include<stdlib.h>
  4 #include<time.h>
  5 using namespace std;
  6 int randnum2(int min,int max)   //获得随机数
  7 {
  8    int ranum=0;
  9    ranum=rand(); 
 10    while(ranum>max)
 11    { 
 12       ranum%=max;//保证min<b<max
 13       if(ranum<min)
 14       {
 15         ranum=rand();
 16       }
 17    }
 18    return ranum;
 19 }
 20 double answer(int ope,double num1,double num2)
 21 {
 22     double ans=0;
 23     if(ope==0)
 24     {
 25         ans=num1+num2;
 26     }
 27     if(ope==1)
 28     {
 29         ans=num1-num2;
 30     }
 31     if(ope==2)
 32     {
 33         ans=num1*num2;
 34     }
 35     if(ope==3)
 36     {
 37         ans=num1/num2;
 38     }
 39     return ans;
 40 }
 41 double  question(int max,int min,int numam)
 42 {
 43     int a[100],i=2,j=0,num=0;
 44     double b[100];
 45     string str="+-*/";
 46     num=randnum2(i,numam);
 47     i=0;
 48     while(i<=num*3)                  // 初始化数组
 49     {
 50         a[i]=randnum2(min,max);
 51         b[i]=a[i];
 52         i++;
 53     }
 54     while(j<=num*3)
 55     {
 56         a[j]%=4;//运算符
 57         a[j+1]%=2;//括号
 58         if(a[j+1]==1)
 59         {
 60            a[j+4]=-1;
 61         }
 62         j+=3;
 63     } 
 64 
 65     //测试
 66     int t=0;
 67     //测试1111111111111111
 68     i=0;
 69     j=1; 
 70     while(j<=num*3)                            //输出式子
 71     { 
 72         if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)cout<<"(";
 73         cout<<a[j+1];
 74         if(a[j-3]==1&&j>3&&a[j-1]!=2&&a[j-1]!=3)cout<<")";
 75         if(j<(num*3-3))cout<<str[a[j+2]];
 76         j+=3;
 77     }
 78     
 79     j=1;
 80     while(j<=num*3-3)                          //计算括号
 81     { 
 82         if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)
 83         { 
 84            b[j+1]=answer(a[j+2],b[j+1],b[j+4]);
 85            a[j+1]=b[j+1];
 86            for(int i=j+2;i<num*3-3;i++)
 87            {
 88               a[i]=a[i+3];
 89               b[i]=b[i+3];  
 90            }
 91            num-=1;
 92         }
 93         j+=3;
 94     }
 95     j=1; 
 96     while(j<=num*3-3)                                //计算乘除
 97     { 
 98         if(a[j+2]==2||a[j+2]==3)
 99         {
100           
101            b[j+1]= answer(a[j+2],b[j+1],b[j+4]);
102            for(int i=j+2;i<num*3-3;i++)
103            {
104               a[i]=a[i+3];
105               b[i]=b[i+3];
106            }
107            num-=1;
108            j-=3;
109         }
110         j+=3;
111     }
112     j=1; 
113     double ans=0,m=0;
114     while(j<=num*3)
115     { 
116         m=b[j+1];
117         if(a[j+2]==1)
118         {
119              ans=ans-m;
120         }
121         else
122         {
123             ans=ans+m;
124         }
125         j+=3;
126     }
127     return ans;
128 }
129 int main()
130 {
131   int quam=5,max=9, min=3,numam=5;
132                 //输入生成题目的条件
133      cout<<"一共出几道题:";
134      cin>>quam;
135      cout<<"最多几个数(10个数之间):";
136      cin>>numam;
137      cout<<"数值范围:\n最大值:";
138      cin>>max;
139      cout<<"最小值:";
140      cin>>min;
141                //结束输入生成题目的条件
142     int i=1;
143     double ansin;
144     while(quam--)                            //循环一次生成一道题
145     {
146      cout<<"No."<<i++<<":";   //题目计数器
147      double ans=question( max, min,numam);
148      cout<<"=";
149      cin>>ansin;
150      cout<<"你输入的数为:"<<ansin<<endl;
151      ansin=ansin-ans;
152      if(ansin<0)
153      {
154         ansin=-ansin;
155      }
156      if(ansin<0.1)
157      {
158          cout<<"good!!"<<endl;
159      }
160      else
161      {
162         cout<<"回答错误!!!正确答案为:"<<ans<<endl;
163      }
164   }
165   return 0;
166 }

 

实验结果:

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

技术分享

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

技术分享

注:结队开发组员:刘伟

     博客园地址:http://www.cnblogs.com/Lw-1573/ 

实现自动生成30道四则运算题目(3)

原文:http://www.cnblogs.com/jiajun1/p/5295364.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!