这个项目我是用jsp+servlet实现的web端程序,我主要实现了多个运算符的多项式生成、以及选择生成的类型是加减法、乘除法或者是混合运算,支持括号、支持判断对错以及计分。程序的核心内容就是随机生成一个运算式,并且还要将算式的答案计算出来,因为是多个运算符,所以存在运算优先级的情况。
关于随机生成运算式的方法中,主要通过随机数和循环的结合来实现生成的项数,而各个运算符也是通过随机的方式生成,在涉及除法时为了避免除数为0,所以增加了一个判定条件。
1 public Vector<String> randomQuestion() { 2 Vector<String> group = new Vector<String>(); 3 Random random = new Random(); 4 5 int symbleNum = random.nextInt(3) + 1;// 生成式子项数 6 7 double num1 = random.nextInt(10) + 1;// 第一项 8 9 StringBuffer str = new StringBuffer();// 每个式子的String形式 10 11 Vector<Object> shizi = new Vector<Object>();// 将式子存放进向量用以计算 12 13 shizi.add(num1); 14 str.append((int) num1); 15 /* 16 * 随机生成算式 17 */ 18 while (symbleNum > 0) { 19 double num2; 20 int symble; 21 num2 = random.nextInt(10) + 1; 22 symble = random.nextInt(5); 23 24 if (symble == 0) { 25 str.append(new String("+" + (int) num2)); 26 shizi.add("+"); 27 shizi.add(num2); 28 } else if (symble == 1) { 29 str.append(new String("-" + (int) num2)); 30 shizi.add("-"); 31 shizi.add(num2); 32 } else if (symble == 2) { 33 str.append(new String("x" + (int) num2)); 34 shizi.add("*"); 35 shizi.add(num2); 36 } else if (symble == 3 && num2 != 0) { 37 38 if (((num2 % 2 == 0) || (num2 % 5 == 0)) && (num2 % 3 != 0)) { 39 str.append(new String("÷" + (int) num2)); 40 shizi.add("/"); 41 shizi.add(num2); 42 } else 43 symbleNum++; 44 } else if (symbleNum > 1) { 45 int k1 = random.nextInt(10) + 1; 46 int k2 = random.nextInt(10) + 1; 47 int f = random.nextInt(2); 48 if (f == 1) { 49 str.append(new String("+" + (int)num2 + "x(" + k1 + "+" + k2 50 + ")")); 51 52 shizi.add("+"); 53 double rs = k1 + k2; 54 rs = rs * num2; 55 shizi.add(rs); 56 } else { 57 str.append(new String("+" + (int)num2 + "x(" + k1 + "-" + k2 58 + ")")); 59 shizi.add("+"); 60 double rs = k1 - k2; 61 rs = rs * num2; 62 shizi.add(rs); 63 } 64 symbleNum -= 2; 65 66 } else { 67 str.append(new String("+" + (int) num2)); 68 shizi.add("+"); 69 shizi.add(num2); 70 } 71 symbleNum--; 72 } 73 74 double result = calculate(shizi); 75 group.add(new String(str)); 76 group.add(new String("" + result)); 77 System.out.println(str); 78 return group; 79 80 }
对于多项式的运算,我首先在生成多项式的时候就将生成的式子的每一项以及运算符通过向量存放,然后将向量传递到处理结果的方法中,遍历向量,将向量中的乘除法先处理,形成一个新的只含加减法的算式,然后依次计算,最后求出结果
1 public double calculate(Vector<Object> shizi) { 2 double result = 0; 3 /* 4 * 消除式子中的乘除法 5 */ 6 for (int i = 0; i < shizi.size(); i++) { 7 if (shizi.get(i) == "*" || shizi.get(i) == "/") { 8 double num1, num2; 9 10 num1 = (double) shizi.get(i - 1); 11 num2 = (double) shizi.get(i + 1); 12 if (shizi.get(i) == "*") 13 result = num1 * num2; 14 else if (shizi.get(i) == "/") 15 result = num1 / num2; 16 /* 17 * 将乘除法两端的数值计算后用以置换原式中的算式 18 */ 19 shizi.set(i - 1, result); 20 shizi.remove(i + 1); 21 shizi.remove(i); 22 i--; 23 } 24 } 25 /* 26 * 依次将式子中的项计算 27 */ 28 for (int i = 0; i < shizi.size(); i++) { 29 if (shizi.get(i) == "+" || shizi.get(i) == "-") { 30 double num1, num2; 31 num1 = (double) shizi.get(i - 1); 32 num2 = (double) shizi.get(i + 1); 33 if (shizi.get(i) == "+") 34 result = num1 + num2; 35 else if (shizi.get(i) == "-") 36 result = num1 - num2; 37 /* 38 * 同上 39 */ 40 shizi.set(i - 1, result); 41 shizi.remove(i + 1); 42 shizi.remove(i); 43 i--; 44 } 45 } 46 47 return result; 48 49 }
项目gethub地址:https://github.com/1850252892/ChildEducation.git