#2018-2019-2 20175310實驗一《Java開發環境的熟悉》實驗報告 ##1、實驗步驟及內容 ###(一)、Java開發環境的熟悉-1 一、創建20175310exp1
的目錄 二、在20175310exp1
目錄下創建src
,bin
等目錄 三、javac,java的執行在20175310exp1
目錄html
###(二)、IDEA中調試設置條件斷點 一、建立HelloWorld
項目,新建「HelloJDB」類,輸入代碼。 二、設置斷點和單步運行。設置斷點只要在設置斷點的行號旁用鼠標單擊一下,如圖,在第5行設置一個斷點: java
三、單擊菜單「Run」->「Debug...」調試Java程序,咱們能夠看到程序停留在了第5行,以下圖所示: 學習
四、能夠經過條件斷點解決循環內部出現的問題。設置條件斷點,咱們在第9行左邊斷點處單擊鼠標右鍵,彈出斷點屬性框,咱們設置條件i==50
,以下圖所示: 測試
###(三)、練習:實現簡單四則運算(能支持分數,加減乘除,支持括號),並進行測試(正常狀況,異常狀況,邊界狀況) 代碼:設計
import java.util.Stack; import java.util.Scanner; public class sizeyunsuan { static Stack<Character> op = new Stack<>(); //計算後綴式的值 public static float calrp(String rp){//參數rp:後綴式 Stack<Float> v = new Stack<>(); char[] arr = rp.toCharArray(); int len = arr.length; for(int i = 0; i < len; i++){ Character ch = arr[i]; // 若是是操做數,則推到堆棧 if(ch >= '0' && ch <= '9') v.push(Float.valueOf(ch - '0')); // 若是是運算符,則計算結果 // 在堆棧中有前2個操做數的狀況下,將結果推送到堆棧中 else v.push(getv(ch, v.pop(), v.pop())); } return v.pop();//返回值return:表達式結果 } //將中綴式轉換爲後綴式 public static String getrp(String s){//參數s:中綴形式的字符串 char[] arr = s.toCharArray(); int len = arr.length; String out = ""; for(int i = 0; i < len; i++){ //從左到右掃描中綴式 char ch = arr[i]; if(ch == ' ') continue; if(ch >= '0' && ch <= '9') {// 若是是操做數,則直接輸出 out+=ch; continue; } if(ch == '+' || ch == '-'){//若是遇到「+」或「-」,則從堆棧中彈出運算符,直到遇到「(」,而後輸出,並進棧。 while(!op.empty() && (op.peek() != '(')) out+=op.pop(); op.push(ch); continue; } if(ch == '*' || ch == '/'){//若是是「*」或「/」,則退棧並輸出,直到優先級較低或「(」將運算符進棧 while(!op.empty() && (op.peek() == '*' || op.peek() == '/')) out+=op.pop(); op.push(ch); continue; } if(ch == '(') op.push(ch);//若是遇到「(」,則直接進棧 if(ch == ')'){ //若是遇到「)」一直退棧輸出,直到退到「(」,彈出「(」 while(!op.empty() && op.peek() != '(') out += op.pop(); op.pop(); continue; } } while(!op.empty()) out += op.pop(); return out;//返回值return:後綴形式的字符串 } public static Float getv(char op, Float f1, Float f2){ if(op == '+') return f2 + f1; else if(op == '-') return f2 - f1; else if(op == '*') return f2 * f1; else if(op == '/') return f2 / f1; else return Float.valueOf(-0); } public static void main(String[] args){ try{ Scanner reader=new Scanner(System.in); System.out.println("請輸入表達式:"); String exp=reader.nextLine(); System.out.println(calrp(getrp(exp))); } catch (Exception IOException) { System.out.println("輸入格式錯誤!"); } } }
測試運行結果: 調試
##2、實驗過程當中遇到的問題以及解決方案code
- 問題1: 參考了2016-2017-2 《Java 程序設計》課堂實踐項目這篇博客,看到老師的參考代碼,將
MyDC.java
和MyDCTester.java
兩個文件編譯運行以後發現,這個代碼只能實現表達式是後綴式的運算,當咱們輸入平時的運算式時提示出錯。 - 問題1解決方案: 須要把咱們平時使用的中綴式轉換爲後綴式(逆波蘭式),再對逆波蘭式進行計算結果,將中綴式轉換爲後綴式爲類
getrp
,代碼以下:
public static String getrp(String s){//參數s:中綴形式的字符串 char[] arr = s.toCharArray(); int len = arr.length; String out = ""; for(int i = 0; i < len; i++){ //從左到右掃描中綴式 char ch = arr[i]; if(ch == ' ') continue; if(ch >= '0' && ch <= '9') {// 若是是操做數,則直接輸出 out+=ch; continue; } if(ch == '+' || ch == '-'){//若是遇到「+」或「-」,則從堆棧中彈出運算符,直到遇到「(」,而後輸出,並進棧。 while(!op.empty() && (op.peek() != '(')) out+=op.pop(); op.push(ch); continue; } if(ch == '*' || ch == '/'){//若是是「*」或「/」,則退棧並輸出,直到優先級較低或「(」將運算符進棧 while(!op.empty() && (op.peek() == '*' || op.peek() == '/')) out+=op.pop(); op.push(ch); continue; } if(ch == '(') op.push(ch);//若是遇到「(」,則直接進棧 if(ch == ')'){ //若是遇到「)」一直退棧輸出,直到退到「(」,彈出「(」 while(!op.empty() && op.peek() != '(') out += op.pop(); op.pop(); continue; } } while(!op.empty()) out += op.pop(); return out;//返回值return:後綴形式的字符串 }
- 問題2: 沒有檢測輸入格式錯誤的功能
- 問題2解決方案: 將
catch
加入以後顯示沒有try
將catch
一塊兒加進去編譯成功,並且有檢測輸入格式錯誤的功能
##3、實驗總結 在拿到題目以後以爲挺簡單,沒什麼難度,可是開始作以後發現一點都不簡單,我整理了如下遇到的問題,個人設計思路主要分如下幾個步驟: 一、首先要能支持分數,所以輸入輸出的變量都應該設爲double型。 二、其次這是能支持括號的四則運算,因此不能直接用加減乘除,須要用到「棧」的知識。而棧以前沒有學過,只能參考老師、學長們的博客學習棧的用法。 三、老師博客中有寫過四則運算的代碼,可是那個輸入是後綴式,咱們習慣上用的是中綴式,參考了許多博客以後,我把將中綴式轉換成後綴式的代碼編寫出來。 總的來講,此次代碼編寫過程不是很順利,問題一個接着一個,有的時候解決了一個問題但又出現了新問題。此次的問題解決方式主要是參考別人寫的博客,學習了有關於「棧」和將中綴式轉換成後綴式這兩塊的寫法。 四、PSP時間htm
步驟 | 耗時(min) | 百分比 |
---|---|---|
需求分析 | 20 | 11% |
設計 | 30 | 17% |
代碼實現 | 75 | 44% |
測試 | 25 | 14% |
分析總結 | 20 | 11% |