四则运算出题3

Posted David~Wang

tags:

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

1、题目要求:

    在之前自动出题程序的基础之上,添加新的功能:

        ①能判断用户的输入答案是否正确,正确与否,给出提示,若错误,显示正确答案;

        ② 能处理四则运算的混合算式。

2、实现思路:

     出题思路不变,对原来程序生成的算式文本,进行读取每一个算式并进行计算,若输入的答案与结果相等,即计算正确。

3、思路整理(实现步骤):

     出题步骤不变,每一行读取生成的算式文本,将其中的算式作为char数组保存,将char数组用栈保存,利用栈来决定计算顺序并计算出结果。

4、源代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.IO;
  6 
  7 namespace siz
  8 {
  9     class Program
 10     {
 11         static int top;
 12         static int x1, y1;
 13         static int size = 256;
 14         static string [] s=new string[size];
 15 
 16         static double jisuan_ma(char [] str)
 17         {
 18             int l;
 19             double right1;
 20             int k=0;
 21             char ww;
 22             string []str1=new string[size];
 23             string []post=new string[size];
 24     
 25             l=str.Length;
 26             for (int i=0;i<l;i++)
 27             {
 28                 ww=str[i];
 29 
 30                 switch (ww)
 31                 {
 32                     case =:
 33                     str1[k]="=";
 34                     k++;
 35                     break;
 36                     case (:
 37                     str1[k]="(";
 38                     k++;
 39                     break;
 40                     case +:
 41                     str1[k]="+";
 42 
 43                     k++;
 44                     break;
 45                     case -:
 46                     str1[k]="-";
 47                     k++;
 48                     break;
 49                     case *:
 50                     str1[k]="*";
 51                     k++;
 52                     break;
 53                     case /:
 54                     str1[k]="/";
 55                     k++;
 56                     break;
 57                     case ):
 58                     str1[k]=")";
 59                     k++;
 60                     break;
 61 
 62                     default:
 63                     for (int ss=i;;ss++)
 64                     {
 65 
 66                         if (str[ss]==0)
 67                         {
 68                             str1[k]+="0";
 69                         }
 70                         else if (str[ss]==1)
 71                         {
 72                             str1[k]+="1";
 73                         }
 74                         else if (str[ss]==2)
 75                         {
 76                             str1[k]+="2";
 77                         }
 78                         else if (str[ss]==3)
 79                         {
 80                             str1[k]+="3";
 81                         }
 82                         else if (str[ss]==4)
 83                         {
 84                             str1[k]+="4";
 85                         }
 86                         else if (str[ss]==5)
 87                         {
 88                             str1[k]+="5";
 89                         }
 90                         else if (str[ss]==6)
 91                         {
 92                             str1[k]+="6";
 93                         }
 94                         else if (str[ss]==7)
 95                         {
 96                             str1[k]+="7";
 97                         }
 98                         else if (str[ss]==8)
 99                         {
100                             str1[k]+="8";
101                         }
102                         else if (str[ss]==9)
103                         {
104                             str1[k]+="9";
105                         }
106                         else
107                         {
108                             i=ss-1;
109                             break;
110                         }
111                     }
112                     k++;
113                     break;
114 
115                 }
116             }
117             right1=mid_post(str1,post);
118             return right1;
119         }
120         static void clearstack()//初始化栈
121         {
122             top = -1;
123         }
124         static int emtystack()//判断栈是否为空
125         {
126             if (top < 0)
127             {
128                 return 1;
129             }
130             else
131             {
132                 return 0;
133             }
134         }
135         static string gettop()//得到栈顶元素
136         {
137             if(emtystack()==1)
138             {
139                 return null;
140             }
141             else
142             {
143                 return s[top];
144             }
145         }
146         static void Push(string mid_v)//压栈
147         {
148             if(top>=size-1)
149             {
150 
151             }
152             else
153             {
154                 top++;
155                 s[top]=mid_v;
156             }
157         }
158         static string pop()//出栈
159         {
160             if(emtystack()==1)
161             {
162                 return null;
163             }
164             else
165             {
166                 top--;
167                 return s[top+1];
168             }
169         }
170         static int precede(string x,string y)//判断优先级
171         {
172             
173             if (x=="=")
174             {
175                 x1=0;
176             }
177             if (x=="(")
178             {
179                 x1=1;
180             }
181             if (x=="+")
182             {
183                 x1=2;
184             }
185             if (x=="-")
186             {
187                 x1=2;
188             }
189             if (x=="*")
190             {
191                 x1=3;
192             }
193             if (x=="/")
194             {
195                 x1=3;
196             }
197 
198             if (y=="=")
199             {
200                 y1=0;
201             }
202             if (y=="+")
203             {
204                 y1=2;
205             }
206             if (y=="-")
207             {
208                 y1=2;
209             }
210             if (y=="*")
211             {
212                 y1=3;
213             }
214             if (y=="/")
215             {
216                 y1=3;
217             }
218             if (y=="(")
219             {
220                 y1=4;
221             }
222             if (x1>=y1)
223             {
224                 return 1;
225             } 
226             else
227             {
228                 return 0;
229             }
230         }
231         static double mid_post(string []str,string []post)//
232         {
233             double right;
234             int i = 0, j = 0;
235             string x;
236             clearstack();
237             Push("=");
238             do 
239             {
240                 x=str[i++];
241                 if (x=="=")
242                 {
243                     while (emtystack()==0)
244                     {
245                         post[j++]=pop();
246                     }
247                 }
248                 else if (x==")")
249                 {
250                     while (gettop()!="(")
251                     {
252                         post[j++]=pop();
253                     }
254                     pop();
255                 }
256                 else if (x=="+"||x=="-"||x=="*"||x=="/"||x=="(")
257                 {
258                     while (precede(gettop(),x)==1)
259                     {
260                         post[j++]=pop();
261                     }
262                     Push(x);
263                 }
264                 else
265                 {
266                     post[j++]=x;
267                 }
268         
269             } while (x!="=");
270             
271             right = postcount(post);
272             return right;
273         }
274         static double postcount(string []post)//计算
275         {
276             int i=0;
277             double z,a,b;
278     
279             clearstack();
280             string x;
281             string xx;
282             while (post[i]!="=")
283             {
284                 
285                 x=post[i];                                                          
286                 if (x=="+")
287                 {
288                     b = (double)Convert.ToSingle(pop());
289                     a = (double)Convert.ToSingle(pop());
290                     z=a+b;
291                     xx = z.ToString();
292                     Push(xx);
293                 }
294                 else if (x=="-")
295                 {
296                     b = (double)Convert.ToSingle(pop());
297                     a = (double)Convert.ToSingle(pop());
298                     z=a-b;
299                     xx=z.ToString();
300                     Push(xx);
301                 }
302                 else if (x=="*")
303                 {
304                     b = (double)Convert.ToSingle(pop());
305                     a = (double)Convert.ToSingle(pop());
306                     z=a*b;
307                     xx=z.ToString();
308                     Push(xx);
309                 }
310                 else if (x=="/")
311                 {
312                     b = (double)Convert.ToSingle(pop());
313                     a = (double)Convert.ToSingle(pop());
314                     z=a/b;
315                     xx=z.ToString();
316                     Push(xx);
317                 }
318                 else
319                 {
320                     Push(x);
321                 }
322                 i++;
323             }
324             if (emtystack() == 0)
325             {
326                 x=gettop();
327                 b = (double)Convert.ToSingle(pop());
328                 return b;
329             }
330             else
331             {
332                 return 0;
333             }
334         }
335         static Random rnd = new Random();
336         static void Main(string[] args)
337         {
338             String path;
339             int num_min, num_max;//数据范围的上限和下限
340             int num_topic;//题目个数
341             int num_number;//表达式所含数字个数
342             int num_milde;
343             String word_ch;//判断乘除
344             String word_ys = "N";//判断余数
345             String word_k = "N";//判断括号
346             String word_fs = "N";//判断有无负数
347 
348 
349             Console.WriteLine("请输入题目个数:");
350             num_topic = Convert.ToInt32(Console.ReadLine());
351 
352             Console.WriteLine("请输入表达式所含数字个数:");
353             num_number = Convert.ToInt32(Console.ReadLine());
354 
355             Console.WriteLine("请输入范围下限:");
356             num_min = Convert.ToInt32(Console.ReadLine());
357 
358             Console.WriteLine("请输入范围上限:");
359             num_max = Convert.ToInt32(Console.ReadLine());
360 
361             Console.WriteLine("是否有乘除(Y/N):");
362             word_ch = Console.ReadLine();
363 
364             if (num_number == 2)
365             {
366                 if (word_ch == "Y")
367                 {
368                     Console.WriteLine("是否有余数(Y/N):");
369                     word_ys = Console.ReadLine();
370                 }
371                 if (num_min >= 0)
372                 {
373                     Console.WriteLine("是否有负数(Y/N):");
374                     word_fs = Console.ReadLine();
375                 }
376 
377             }
378             else
379             {
380                 Console.WriteLine("是否有括号(Y/N):");
381                 word_k = Console.ReadLine();
382             }
383 
384             int[,] Data = new int[num_topic, num_number];//保存数据
385 
386             int[,] Operator = new int[num_topic, num_number];//保存运算符
387 
388             int[] Data_first = new int[num_topic];//保存每个表达式的首个字符
389 
390             int[,] kuohao = new int[num_topic, num_number];
391             if (word_ch == "Y")
392             {
393                 for (int ii = 0; ii < num_topic; ii++)
394                 {
395                     for (int jj = 0; jj < num_number - 1; jj++)
396                     {
397                         Operator[ii, jj] = rnd.Next(1, 5);
398                     }
399                     Operator[ii, num_number - 1] = 5;
400                 }
401             }
402             else
403             {
404                 for (int i = 0; i < num_topic; i++)
405                 {
406                     for (int j = 0; j < num_number - 1; j++)
407                     {
408                         Operator[i, j] = rnd.Next(1, 3);
409                     }
410                     Operator[i, num_number - 1] = 5;
411                 }
412 
413             }
414 
415 
416             Data_first[0] = rnd.Next(num_min, num_max);//以第一个操作数的不同来使表达式不会重复
417 
418             for (int s = 1; s < num_topic; s++)
419             {
420                 Data_first[s] = rnd.Next(num_min, num_max);
421                 for (int h = 0; h < s - 1; h++)
422                 {
423                     if (Data_first[s] == Data_first[h])
424                     {
425                         s--;
426                     }
427                 }
428             }
429             for (int x = 0; x < num_topic; x++)
430             {
431                 Data[x, 0] = Data_first[x];
432                 for (int y = 1; y < num_number; y++)
433                 {
434                     if (Operator[x, y - 1] == 4)
435                     {
436                         for (; ; )
437                         {
438                             Data[x, y] = rnd.Next(num_min, num_max);
439                             if (Data[x, y] != 0)
440                             {
441                                 break;
442                             }
443                         }
444                     }
445                     else
446                     {
447                         Data[x, y] =以上是关于四则运算出题3的主要内容,如果未能解决你的问题,请参考以下文章

小学生四则运算出题系统——计应193许颖然

四则运算出题程序的分析与设计

四则运算 出题项目

网页版的四则运算出题

四则运算出题4

《结对-四则运算出题器-测试过程》