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