1.本周继续编写代码,使代码支持分数类计算
2.相关过程截图
a.下图是上周编写的生成题目的类,不能运行。
下图是本周更新的代码,能够支持分数的产生,红色框内为主要更改区域
html
b.下图是代码中题目转后缀表达式的部分代码及运行结果截图
java
c.下图是代码中后缀表达式计算结果的部分代码及运行结果截图
编程
3.关键代码解释数组
在题目中生成真分数及包含真分数的题目转换为后缀表达式dom
1.关于题目转换成后缀表达式的解决思路
题目转换成后缀表达式的原理是,如图:
这个要求的难点在于拿扫描到的操做符与栈顶的操做符比较优先级,高则进栈,低则输出栈顶元素并将扫描到的操做符压进栈里。
解决思路:
a.老师给的思路是编写一个数组,里面存放着操做符的优先级比较,而后在调用的时候用于比较。
b.对于老师给的思路,有一些不是很懂的地方。首先是存放操做符优先级比较的二维数组不太会编,而后就是具体调用时的代码实现不是很清楚。因此我转换了一下思路,从原理的本质上思考了一下:题目要求的四则运算只要求加减乘除四个操做符(由于咱们组不用实现括号的产生),只有四个操做符的比较,经过if语句多判断几回就OK了。首先判断拿到的操做符是否是乘除一级的,若是是,则判断栈顶的操做符是否是加减,是则外面的优先级高,不然外面优先级低;若是拿到的操做符是加减一级的,则优先级确定低于栈顶元素优先级。从而达到了判断优先级的目的。code
第一部分:生成题目 //负责人:侯泽洋htm
import java.util.Stack; import java.util.Random; import java.util.ArrayList; import java.util.Scanner; class Questions { ArrayList<Object> array = new ArrayList<Object>(); Random generator = new Random(); char[] newchar = {'+', '-', '*', '/'}; protected int number; int NUM; public Questions() { number = 0; } public Object getQuestion(int num) { int num1 = num; while (num > 0) { int figure = (int) generator.nextInt(9) + 1; array.add(figure); number = (int) (Math.random() * 4); array.add(newchar[number]); num--; } String obj = ""; while (num < 2 * num1) { obj += array.get(num); num++; } int other = (int) generator.nextInt(9) + 1; array.add(other); obj += other + "="; return obj; } }
第二部分:题目运算 //负责人:周亚杰,侯泽洋对象
//生成后缀表达式 public class Calculations { public static void main(String[] args) { Questions questions=new Questions(); Stack stack = new Stack(); Scanner Scan=new Scanner(System.in); char c; int count=0,answer; char[] operation = new char[100]; String str = (String) questions.getQuestion(3); System.out.println("请回答如下问题:\n"+str); System.out.println("请输入你的答案:"); answer=Scan.nextInt(); for (int i = 0; i < str.length(); i++) { c = str.charAt(i); if (c >= '0' && c <= '9') { operation[i] = c; count++; } else { if (c == '*' || c == '/') { if (stack.empty()) { stack.push((char) c); } else if ((char) stack.peek() == '*' || (char) stack.peek() == '/') { operation[i] = (char) stack.pop(); stack.push(c); } else stack.push(c); } else if (c == '+' || c == '-') { if (stack.empty()) { stack.push(c); } else if ((char) stack.peek() == '+' || (char) stack.peek() == '-') { operation[i] = (char) stack.pop(); stack.push(c); } else { operation[i] = (char) stack.pop(); stack.push(c); } } else stack.push(c); } } int num = stack.size(); for (int a = 0; a < num; a++) { operation[str.length() + a] = (char) stack.pop(); }
//后缀表达式计算 //负责人:周亚杰 Stack<Integer> stack1 = new Stack<Integer>(); int m, n, sum,num1=str.length()+(str.length()-count); for (int b = 0; b <= num1; b++) { if (operation[b] >= '0' && operation[b] <= '9') stack1.push((int) operation[b]-48); else { if (operation[b] == '+') { m = stack1.pop(); n = stack1.pop(); sum = n + m; stack1.push(sum); } else if (operation[b] == '-') { m = stack1.pop(); n = stack1.pop(); sum = n- m; stack1.push(sum); } else if (operation[b] == '*') { m = stack1.pop(); n = stack1.pop(); sum = n * m; stack1.push(sum); } else if (operation[b] == '/') { m = stack1.pop(); n = stack1.pop(); sum = n / m; stack1.push(sum); } else if (operation[b] == ' ') continue; } } if ((int)stack1.peek()==answer) System.out.println("恭喜你答对了!"); else System.out.println("很遗憾,答错了!答案是:"+stack1.peek()); } }
周亚杰:50%
侯泽洋:50%blog