四则运算出题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的主要内容,如果未能解决你的问题,请参考以下文章