2018-2019-2 20175310實驗一《Java開發環境的熟悉》實驗報告

#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.javaMyDCTester.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%
相關文章
相關標籤/搜索