四则运算出题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] = 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 | 修改博客 | 写博客并发布 |