1. 程式人生 > >wc項目記錄

wc項目記錄

計數 分析 per 能夠 javascrip 規範 什麽 c項目 字節

1、Github項目地址:https://github.com/3116004700/ruanjiangongcheng
2、預估時間見PSP表格。
3、解題思路描述:
在看到這個項目的時候我就想到了利用java裏面的IO流來實現這個項目,統計文件中的字符數、單詞數、和行數,統計行數可以選擇利用bufferreader來按行讀出文件中的內容,設置一個變量來統計行數,直到整個文件全部讀完;字符數可以通過字節流進行統計,相對來說也比較簡單,這個項目相對而言難點我認為是對於單詞的界定,究竟滿足什麽條件才算一個完整的單詞,這是需要仔細考慮的,我最先想到的就是利用空格來界定單詞,但是這種方法誤差太大,不可能做到精確統計,然後就是想到了正則表達式,但是由於正則表達式之前沒有接觸過,對於我來說還是一個陌生的知識,這是需要我去學習的內容。
我的想法是先通過簡單的邏輯判斷大致上實現功能,然後通過對正則表達式的學習逐步實現相對而言比較精確的統計。
4、設計實現過程:
這個項目我分了兩個類,一個是statistics類,裏面有存放字符數、單詞數、行數的變量以及相應統計字符數、單詞數、行數的方法;另一個類是一個測試類,裏面有一個測試的test方法和main函數,test方法功能就是對用戶輸入的文件路徑、選擇輸出的內容進行判斷,並且通過傳參的方式將用戶數據傳到statistics類的方法中,main方法就是調用test方法,作為一個程序入口的存在。
5、代碼說明:
主要的代碼部分就是三個統計方法:
(1)統計字符數的方法-charSum()
設計思路:因為是要統計字符數,所以我選擇采用字節流來完成這個方法,一個字符一個字符的讀,讀出一個判斷一個,直到文件全部讀完。
具體實現:

    int charSum(String fName){
    int flag;
    int num = 0;
    on_off = true;
    File file = new File(fName);
    FileReader fr = null;
    try {
        fr = new FileReader(file);//采用字節流讀文件的內容
    } catch (FileNotFoundException e) {
        // TODO 自動生成的 catch 塊
        //e.printStackTrace();
        System.out.println("文件路徑輸入有誤");
        on_off = false;
    }
    if(on_off){
        try {
        while((flag=fr.read())!=-1){//讀出一個字節便判斷一下,只要不為空,num++
            num++;
        }
        } catch (IOException e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
        return num;
    }else{
        return -1;
    }
}

? (2)統計單詞的方法-wordSum()
設計思路:使用bufferreader緩沖流來讀,按行讀入,然後使用正則表達式進行單詞的判斷。
具體實現:

       int wordSum(String fName){
    on_off = true;
    int num = 0;
    String str = null;
    String s = "\\d+.\\d+|\\w+";//用來界定單詞的通配符
    Pattern  pattern=Pattern.compile(s);  
    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(fName);
    } catch (FileNotFoundException e2) {
        // TODO 自動生成的 catch 塊
        //e2.printStackTrace();
        System.out.println("文件路徑輸入有誤");
        on_off = false;
    }
    if(on_off){
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        try {
            while((str = bufferedReader.readLine()) != null)
            {
                  Matcher  ma=pattern.matcher(str); 
                   while(ma.find()){ 
//                      if(num%10 == 0 &&num>1)System.out.println();
//                      System.out.print(ma.group()+" ");  //可以選擇將所有的單詞打印輸出。
                        num++;
                    }  
            }
        } catch (IOException e1) {
            // TODO 自動生成的 catch 塊
            e1.printStackTrace();
        } 
        return num;
    }else{
        return -1;
    }
}

? (3)統計行數的方法-rowSum()
設計思路:這個方法相對來說比較簡單,與wordSum()的讀入方法相同,按行讀入,每次讀入時進行計數,直到全部的行全部讀完。
具體實現:

  int rowSum(String fName){
    on_off = true;
    String flag = null;
    int num = 0;
    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(fName);
    } catch (FileNotFoundException e2) {
        // TODO 自動生成的 catch 塊
        //e2.printStackTrace();
        System.out.println("文件路徑輸入有誤");
        on_off = false;
    }
    if(on_off){
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        try {
            while((flag = bufferedReader.readLine()) != null)//對讀入的每一行進行判斷是否為空行,如果不是,則num++
            {
                num++;
            }
        } catch (IOException e1) {
            // TODO 自動生成的 catch 塊
            e1.printStackTrace();
        }
        return num;
    }else{
        return -1;
    }

}

? (4)其他代碼的說明:
因為不是主要的實現代碼,在這裏簡單的說明一下,就不貼出了,完整的源代碼已經上傳GitHub,鏈接地址開頭已經給出。
除了以上的統計方法,源文件裏還有一個choose()方法,這個方法的目的就是對用戶的輸入數據進行處理,通過參數的方式傳到相應的方法中去,使得程序能夠運行起來。還有一點就是choose()方法和三個主要的統計方法都寫了異常處理機制,針對用戶的輸入數據不符合規範的問題,沒有簡單的拋出異常,而是通過提示用戶輸入有誤,並且回調choose()方法使用戶重新輸入,增強了用戶的體驗。

6、測試運行:

測試文件:
技術分享圖片
(1)測試統計字符數:
技術分享圖片
(2)測試統計單詞數(為了效果明顯,將所有的單詞全都打印了):
技術分享圖片
(3)測試統計行數:
技術分享圖片
7、各部分預計耗費時間和實際耗費時間:

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 40 60
· Estimate · 估計這個任務需要多少時間 50 70
Development 開發 700 800
· Analysis · 需求分析 (包括學習新技術) 30 70
· Design Spec · 生成設計文檔 20 120
· Design Review · 設計復審 (和同事審核設計文檔) 60 150
· Coding Standard · 代碼規範 (為目前的開發制定合適的規範) 30 30
· Design · 具體設計 40 50
· Coding · 具體編碼 210 200
· Code Review · 代碼復審 30 30
· Test · 測試(自我測試,修改代碼,提交修改) 100 00
Reporting 報告 60 90
· Test Report · 測試報告 30 30
· Size Measurement · 計算工作量 30 30
· Postmortem & Process Improvement Plan · 事後總結, 並提出過程改進計劃 20 30
合計 1200 1500

8、代碼覆蓋率:

技術分享圖片

9、項目小結:

這次項目只完成了基本的部分,因為之前一直在學JavaScript,對java的掌握並不是很好,也算是通過這個項目對java的知識的重新學習。這個項目的實現並不難,主要是IO流與正則表達式的使用,采用控制臺輸出的方式顯示結果,省掉了GUI的設計過程。

雖然項目不大,但是學習了如何從零開始一個項目,並且對每個階段的時間進行記錄,同時學會了使用GitHub來記錄項目開發過程,這是之前沒有接觸過的,能更清晰的看到自己的項目改動記錄。

wc項目記錄