四则运算3

Posted John_Wang7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四则运算3相关的知识,希望对你有一定的参考价值。

先附代码:

  1 // 按要求随机生成四则运算  王世强 2015/3/15  
  2 #include<iostream>
  3 #include<stdlib.h>
  4 #include<iomanip>
  5 #include<time.h>  
  6 #include<stdio.h> 
  7 #include"math.h"  
  8 #define true 1   
  9 #define false 0   
 10 #define OPSETSIZE 7  
 11 #define random() (rand()%100000)  
 12 #include"string.h"   
 13 typedef int Status;
 14 using namespace std;   
 15   
 16 unsigned char Prior[7][7] =  
 17 { // 运算符优先级表   
 18     // ‘+‘ ‘-‘ ‘*‘ ‘/‘ ‘(‘ ‘)‘ ‘#‘    
 19     /*‘+‘*/>,>,<,<,<,>,>,  
 20     /*‘-‘*/>,>,<,<,<,>,>,  
 21     /*‘*‘*/>,>,>,>,<,>,>, 
 22     /*‘/‘*/>,>,>,>,<,>,>,
 23     /*‘(‘*/<,<,<,<,<,=, , 
 24     /*‘)‘*/>,>,>,>, ,>,>,
 25     /*‘#‘*/<,<,<,<,<, ,=, 
 26 };   
 27   
 28 typedef struct StackChar  
 29 {  
 30     char c;   
 31     struct StackChar *next;   
 32 }SC;       //StackChar类型的结点SC  
 33   
 34 typedef struct StackFloat  
 35 {  
 36     float f;   
 37     struct StackFloat *next;   
 38 }SF;       //StackFloat类型的结点SF  
 39   
 40 SC *Push(SC *s,char c)          //SC类型的指针Push,返回p  
 41 {  
 42     SC *p=(SC*)malloc(sizeof(SC));   
 43     p->c=c;   
 44     p->next=s;   
 45     return p;   
 46 }   
 47   
 48 SF *Push(SF *s,float f)        //SF类型的指针Push,返回p  
 49 {  
 50     SF *p=(SF*)malloc(sizeof(SF));   
 51     p->f=f;   
 52     p->next=s;   
 53     return p;   
 54 }   
 55  
 56 SC *Pop(SC *s)    //SC类型的指针Pop  
 57 {  
 58     SC *q=s;   
 59     s=s->next;   
 60     free(q);   
 61     return s;   
 62 }   
 63   
 64 SF *Pop(SF *s)      //SF类型的指针Pop  
 65 {  
 66     SF *q=s;   
 67     s=s->next;   
 68     free(q);   
 69     return s;   
 70 }   
 71   
 72 float Operate(float a,unsigned char theta, float b)      //计算函数Operate  
 73 {  
 74     switch(theta)  
 75     {  
 76     case +: return a+b;   
 77     case -: return a-b;   
 78     case *: return a*b;   
 79     case /: return a/b;   
 80     default : return 0;   
 81     }   
 82 }   
 83   
 84 char OPSET[OPSETSIZE]={+,-,*,/,(,),#};   
 85   
 86 Status In(char Test,char *TestOp)  
 87 {  
 88     int Find=false;   
 89     for (int i=0; i< OPSETSIZE; i++)  
 90     {  
 91         if(Test == TestOp[i])  
 92             Find= true;   
 93     }   
 94     return Find;   
 95 }   
 96   
 97 Status ReturnOpOrd(char op,char *TestOp)  
 98 {   
 99     for(int i=0; i< OPSETSIZE; i++)  
100     {  
101         if (op == TestOp[i])  
102             return i;  
103     }  
104 }  
105   
106 char precede(char Aop, char Bop)  
107 {   
108     return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];   
109 }   
110   
111 float EvaluateExpression(char* MyExpression)  
112 {   
113     // 算术表达式求值的算符优先算法  
114     // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合   
115     SC *OPTR=NULL;       // 运算符栈,字符元素   
116     SF *OPND=NULL;       // 运算数栈,实数元素   
117     char TempData[20];   
118     float Data,a,b;   
119     char theta,*c,Dr[]={#,\0};   
120     OPTR=Push(OPTR,#);   
121     c=strcat(MyExpression,Dr);   
122     strcpy(TempData,"\0");//字符串拷贝函数   
123     while (*c!= # || OPTR->c!=#)  
124     {   
125         if (!In(*c, OPSET))  
126         {   
127             Dr[0]=*c;   
128             strcat(TempData,Dr);           //字符串连接函数   
129             c++;   
130             if (In(*c, OPSET))  
131             {   
132                 Data=atof(TempData);       //字符串转换函数(double)   
133                 OPND=Push(OPND, Data);   
134                 strcpy(TempData,"\0");   
135             }   
136         }   
137         else    // 不是运算符则进栈   
138         {  
139             switch (precede(OPTR->c, *c))  
140             {  
141             case <: // 栈顶元素优先级低   
142                 OPTR=Push(OPTR, *c);   
143                 c++;   
144                 break;   
145             case =: // 脱括号并接收下一字符   
146                 OPTR=Pop(OPTR);   
147                 c++;   
148                 break;   
149             case >: // 退栈并将运算结果入栈   
150                 theta=OPTR->c;OPTR=Pop(OPTR);   
151                 b=OPND->f;OPND=Pop(OPND);   
152                 a=OPND->f;OPND=Pop(OPND);   
153                 OPND=Push(OPND, Operate(a, theta, b));   
154                 break;   
155             } //switch  
156         }   
157     } //while   
158     return OPND->f;   
159 } //EvaluateExpression  
160 
161 //符号生成
162 char create_symbol(int n)
163 {
164     int n1,j;    
165     char symbol[1];
166     if(n==0)
167     {
168         n1=2;
169     }
170     else if(n=1)
171     {
172         n1=4;
173     }
174     j=random()%n1;
175     if(j==0) symbol[0]=+;
176     else if(j==1) symbol[0]=-;
177     else if(j==2) symbol[0]=*;
178     else symbol[0]=/;
179     return symbol[0];      
180  } 
181  //把数字转换成字符串型
182  string int_string(int number)
183  {
184     char str[200];
185     itoa(number,str,10);
186     string str_=str;
187     return str_; 
188   } 
189   //真分数合成一个字符串
190  string combination1(string str1,string str2,char k) 
191  {
192      string equation;
193      equation=(+str1+k+str2+);
194      return equation;
195  } 
196  //新生成一个数
197 string create_num(int proper_fs,int range)
198 { 
199     int num,num1,num2,fs;
200     string str_num,str_num1,str_num2;
201       num=random()%range+1;
202     str_num=int_string(num);
203     if(proper_fs==1)
204     {
205         fs=random()%3;
206         if(fs==1)//判断是否生成真分数  
207         {    
208             for(;;)
209             {
210                 num1=random()%range+1;
211                  num2=random()%range+1;
212                 if(num1<num2) break;
213             }
214             str_num1=int_string(num1);
215             str_num2=int_string(num2);
216             str_num=combination1(str_num1,str_num2,/);
217         }
218     }
219     return str_num; 
220   } 
221  //运算式转换成一个字符串
222  string combination(string str1,string str2,char k) 
223  {
224      string equation;
225      equation=str1+k+str2;
226      return equation;
227  }
228 
229 //得出正确答案 
230 float get_ans(string str)
231 {
232     int len;
233     float ans;
234     len=str.length();
235     char num[len];
236     for(int j=0;j<len;j++)
237     {
238         num[j]=str[j];
239     }
240     //用堆栈解决。。。 
241     ans=EvaluateExpression(num);
242     return ans;
243 } 
244  //主函数 
245 int main()
246 {
247     srand((int)time(NULL));  //设置时间种子 ,使得程序每次运行的结果都不同 
248     int num1,num2,num3,num4,count,n,change,amount,shuchu,range,j,repeat=0,bracket,proper_fs;
249     string str_num1,str_num2,temp;
250     float Answer,InputAns;
251     cout<<"有无乘除法?1有,0没有:"<<endl;
252     cin>>n;
253     cout<<"是否有括号?1有,0没有:"<<endl;
254     cin>>bracket; 
255     cout<<"是否有真分数?1有,0没有:"<<endl;
256     cin>>proper_fs; 
257     cout<<"请输入数字范围:"<<endl;
258     cin>>range; 
259     cout<<"请输入出题数量:"<<endl;
260     cin>>amount; 
261     string Equation[amount];
262     char symbol;
263     cout<<amount<<"道四则运算题如下:"<<endl; 
264     for(int i=0;i<amount;i++)
265     {    
266         count=random()%3+2;
267         str_num1=create_num(proper_fs,range);
268         str_num2=create_num(proper_fs,range);
269         symbol=create_symbol(n);
270         Equation[i]=combination(str_num1,str_num2,symbol);
271         if(count>2)
272         {
273             for(count;count>2;count--)
274             {
275                 symbol=create_symbol(n);
276                 str_num1=Equation[i];
277                 if(bracket==1)
278                 {
279                     change=random()%3;
280                     if(change==0)
281                     {
282                        str_num1=(+str_num1+);
283                      }
284                 } 
285                 symbol=create_symbol(n);
286                 str_num2=create_num(proper_fs,range);    
287                 change=random()%2;
288                 if(change==0)
289                 {
290                     temp=str_num1;
291                     str_num1=str_num2;
292                     str_num2=temp;
293                 }                
294                 Equation[i]=combination(str_num1,str_num2,symbol);
295             }
296         }
297         //判断是否重复
298          for(j=0;j<i;j++)
299          {
300              if(Equation[j]==Equation[i])
301              {
302                 i=i-1;
303                 repeat=1;
304                 break;
305              }
306          }
307          if(repeat!=1)//若不重复,则输出 
308          {     
309             cout<<Equation[i]<<"=";
310             //判断结果是否正确
311             cin>>InputAns;
312             Answer=get_ans(Equation[i]);
313             Answer*=100;
314             int temp=(int)Answer;
315             Answer=((double)temp)/100.00;
316             if(InputAns==Answer)
317             {
318                 cout<<"回答正确!"; 
319             }
320             else
321             {
322                 cout<<"回答错误!正确答案为";
323                 cout<<setprecision(2)<<fixed<<Answer;
324             } 
325             cout<<endl;
326          }
327     }
328 }

 

以上是关于四则运算3的主要内容,如果未能解决你的问题,请参考以下文章

Python 3学习笔记

如何在 python 中并行化以下代码片段?

20个简洁的 JS 代码片段

获取 badarith,[erlang,'+',[error,0],[],同时使用 Erlang 片段在 TSUNG 中执行算术运算

20194626 自动生成四则运算题第一版报告

20个简洁的 JS 代码片段