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] = rnd.Next(num_min, num_max);
448 }
449 }
450 }
451 if (word_fs == "N")
452 {
453 for (int i1 = 0; i1 < num_topic; i1++)
454 {
455 if (Operator[i1, 0] == 2 && Data[i1, 0] < Data[i1, 1])
456 {
457 num_milde = Data[i1, 1];
458 Data[i1, 1] = Data[i1, 0];
459 Data[i1, 0] = num_milde;
460
461 }
462 }
463 }
464
465 if (word_ch == "Y")
466 {
467
468 if (word_ys == "N")
469 {
470
471 for (int i2 = 0; i2 < num_topic; i2++)
472 {
473
474 if (Operator[i2, 0] == 4)
475 {
476
477 num_milde = Data[i2, 0] % Data[i2, 1];
478 while (num_milde != 0)
479 {
480 Data[i2, 1] = rnd.Next(1, Data[i2, 0]+1);
481 num_milde = Data[i2, 0] % Data[i2, 1];
482 }
483 }
484 }
485 }
486
487 }
488
489 if (word_k == "Y")
490 {
491 for (int j1 = 0; j1 < num_topic; j1++)
492 {
493 for (int j2 = 0; j2 < num_number - 2; j2++)
494 {
495 kuohao[j1, j2] = rnd.Next(0, 2);
496 }
497 kuohao[j1, num_number - 2] = 0;
498 kuohao[j1, num_number - 1] = 0;
499 }
500 }
501 path = @"1.txt";
502 StreamWriter strm1 = File.CreateText(path);
503 for (int x1 = 0; x1 < num_topic; x1++)
504 {
505 for (int x2 = 0; x2 < num_number; x2++)
506 {
507 if (kuohao[x1, x2] == 1)
508 {
509 strm1.Write("(");
510 strm1.Write(Data[x1, x2]);
511 if (Operator[x1, x2] != 5)
512 {
513 if (Operator[x1, x2] == 1)
514 {
515 strm1.Write("+");
516 }
517 if (Operator[x1, x2] == 2)
518 {
519 strm1.Write("-");
520 }
521 if (Operator[x1, x2] == 3)
522 {
523 strm1.Write("*");
524 }
525 if (Operator[x1, x2] == 4)
526 {
527 strm1.Write("/");
528 }
529
530 }
531
532 }
533 else
534 {
535 strm1.Write(Data[x1, x2]);
536 if (Operator[x1, x2] != 5)
537 {
538 if (Operator[x1, x2] == 1)
539 {
540 strm1.Write("+");
541 }
542 if (Operator[x1, x2] == 2)
543 {
544 strm1.Write("-");
545 }
546 if (Operator[x1, x2] == 3)
547 {
548 strm1.Write("*");
549 }
550 if (Operator[x1, x2] == 4)
551 {
552 strm1.Write("/");
553 }
554
555 }
556 else
557 {
558 for (int x3 = 0; x3 < num_number; x3++)
559 {
560 if (kuohao[x1, x3] == 1)
561 {
562 strm1.Write(")");
563 }
564 }
565 strm1.Write("=");
566
567 }
568 }
569 }
570 strm1.WriteLine();
571 }
572 strm1.Close();
573 StreamReader strm2 = File.OpenText(path);
574 string s_mid = "";
575 char[] strr = new char[size];
576 double answer;
577 double right;
578 int right_an=0;
579 int wrong_an=0;
580 for (int o = 0; o < num_topic; o++)
581 {
582 s_mid = strm2.ReadLine();
583 strr = s_mid.ToCharArray(0, s_mid.Length);
584 Console.WriteLine(s_mid);
585 right = jisuan_ma(strr);
586 Console.WriteLine("请输入答案:");
587 answer = Convert.ToDouble(Console.ReadLine());
588 if (answer == right)
589 {
590 Console.WriteLine("回答正确!");
591 right_an++;
592 }
593 else
594 {
595 Console.WriteLine("回答错误!正确答案为:{0}",right);
596 wrong_an++;
597 }
598 }
599 Console.WriteLine("本次答题共计正确:{0}道题,错误{1}道题!", right_an, wrong_an);
600 }
601 }
602 }
5、运行结果

6、工作照片:


项目记录日志(单位:小时(h)):
| 听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总计 | |
|
周一 |
2 | 2 | 1 | 0.5 | 5.5 |
|
周二 |
0 | 2 | 1 | 0 | 3 |
|
周三 |
0 | 4 | 0 | 0.5 | 4.5 |
|
周四 |
2 | 3 | 1 | 0 | 6 |
|
周五 |
0 | 6 | 0 | 1.5 | 7.5 |
|
周六 |
0 | 1 | 0 | 0 | 1 |
|
周总计 |
4 | 18 | 3 | 2.5 | 27.5 |
时间记录日志(单位:min):
| 日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
| 星期一 | 14:00 | 15:50 | 10(课间) | 100 | 听课 | 软件工程上课 |
| 19:30 | 21:40 | 0 | 130 | 搜集资料,编程 | 探讨四则运算3的程序的思路并找资料 | |
| 星期二 | 19:30 | 21:30 | 0 | 120 | 编程 | 四则运算2的程序 |
| 星期三 | 14:00 | 15:00 | 0 | 60 | 编程 | 四则运算3的程序 |
| 19:00 | 21:30 | 0 | 150 | 编程 | ||
| 星期四 | 14:00 | 15:50 | 10(课间) | 100 | 听课 | 软件工程上课 |
| 19:30 | 21:50 | 0 | 100 | 编程 | 四则运算2的程序 | |
| 星期五 | 14:00 | 17:00 | 0 | 180 | 编程 | 四则运算3的程序 |
| 18:00 | 21:00 | 0 | 120 | 编程 | 四则运算3的程序 | |
| 星期六 | 10:00 | 12:00 | 20(洗漱) | 100 | 修改,调试 | 四则运算3程序进行修改、调试 |
| 14:00 | 15:40 | 100 | 修改博客 | 写博客并发布 |
队友地址:http://www.cnblogs.com/mengyinianhua/
来源:https://www.cnblogs.com/wangyw/p/5295243.html