一、需求分析
二、功能分析
根据需求分析,可以得出该项目所需的功能:
三、设计实现
四、测试运行
如下图所示,当n=50时,循环产生50个算式,学生可输入答案,与result文件中的正确答案对比是否正确。
五、核心代码
/** * 提前将 符号的优先级定义好 */ private static final Map<Character, Integer> basic = new HashMap<Character, Integer>(); static { basic.put(‘-‘, 1); basic.put(‘+‘, 1); basic.put(‘*‘, 2); basic.put(‘/‘, 2); basic.put(‘(‘, 0); }
/** * 得到计算式的字符串 */ public String getString() { String[] operate = new String[] { "+", "-", "*", "/" }; int[] number = new int[101]; for (int i = 0; i <= 100; i++) number[i] = i; int[] type = new int[3]; for (int i = 0; i < 3; i++) type[i] = i; Random r = new Random(); int t = type[r.nextInt(3)]; if (t == 0){ String str1 = operate[r.nextInt(4)]; String str2 = operate[r.nextInt(4)]; if (str1.equals(str2)) return null; else return number[r.nextInt(101)] + str1 + number[r.nextInt(101)] + str2 + number[r.nextInt(101)]; } else if (t == 1){ String str1 = operate[r.nextInt(4)]; String str2 = operate[r.nextInt(4)]; String str3 = operate[r.nextInt(4)]; if(str1.equals(str2)&&str1.equals(str3)) return null; else return number[r.nextInt(101)] + str1 + number[r.nextInt(101)] + str2 + number[r.nextInt(101)] + str3 + number[r.nextInt(101)]; } else{ String str1 = operate[r.nextInt(4)]; String str2 = operate[r.nextInt(4)]; String str3 = operate[r.nextInt(4)]; String str4 = operate[r.nextInt(4)]; if(str1.equals(str2)&&str1.equals(str3)&&str1.equals(str4)) return null; else return number[r.nextInt(101)] + str1 + number[r.nextInt(101)] + str2 + number[r.nextInt(101)] + str3 + number[r.nextInt(101)] + str4 + number[r.nextInt(101)]; } }
/** * 将 中缀表达式 转化为 后缀表达式 */ public String toSuffix(String infix) { if(infix==null) return null; List<String> queue = new ArrayList<String>();// 定义队列 用于存储 数字 以及最后的 后缀表达式 List<Character> stack = new ArrayList<Character>();// 定义栈 用于存储 运算符,最后stack中会被 弹空 char[] charArr = infix.trim().toCharArray();// 字符数组 用于拆分数字或符号 String standard = "*/+-()"; // 判定标准 将表达式中会出现的运算符写出来 char ch = ‘&‘;// 在循环中用来保存 字符数组的当前循环变量的 这里仅仅是初始化一个值 没有意义 int len = 0;// 用于记录字符长度 【例如100*2,则记录的len为3 到时候截取字符串的前三位就是数字 for (int i = 0; i < charArr.length; i++) {// 开始迭代 ch = charArr[i]; // 保存当前迭代变量 if (Character.isDigit(ch)) { // 如果当前变量为 数字 len++; } else if (Character.isLetter(ch)) {// 如果当前变量为 字母 len++; } else if (ch == ‘.‘) {// 如果当前变量为 . 会出现在小数里面 len++; } else if (Character.isSpaceChar(ch)) {// 如果当前变量为 空格 支持表达式中有空格出现 if (len > 0) {// 若为空格 代表 一段结束 ,就可以往队列中 存入了 【例如100 * 2 100后面有空格 // 就可以将空格之前的存入队列了】 queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i)));// 往队列存入截取的字符串 len = 0;// 长度置空 } continue;// 如果空格出现,则一段结束 跳出本次循环 } else if (standard.indexOf(ch) != -1) { // 如果是上面标准中的 任意一个符号 if (len > 0) { // 长度也有 queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i)));// 说明符号之前的可以截取下来做数字 len = 0;// 长度置空 } if (ch == ‘(‘) {// 如果是左括号 stack.add(ch);// 将左括号 放入栈中 continue; // 跳出本次循环 继续找下一个位置 } if (!stack.isEmpty()) {// 如果栈不为empty int size = stack.size() - 1;// 获取栈的大小-1 即代表栈最后一个元素的下标 boolean flag = false; while (size >= 0 && ch == ‘)‘ && stack.get(size) != ‘(‘) { queue.add(String.valueOf(stack.remove(size))); size--; } while (size >= 0 && !flag && basic.get(stack.get(size)) >= basic.get(ch)) { queue.add(String.valueOf(stack.remove(size))); size--; } } if (ch != ‘)‘) { stack.add(ch); } else { stack.remove(stack.size() - 1); } } if (i == charArr.length - 1) { if (len > 0) { queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len + 1, i + 1))); } int size = stack.size() - 1; while (size >= 0) { queue.add(String.valueOf(stack.remove(size))); size--; } } } return queue.stream().collect(Collectors.joining(",")); }
原文:https://www.cnblogs.com/onemorerun/p/13803618.html