1. 程式人生 > >軟工作業1:wc.exe項目開發(java)

軟工作業1:wc.exe項目開發(java)

代碼行數 學習正則表達式 default man 控制字符 min 目的 若有 多個

Github地址:https://github.com/Zzhaomin/learngit

項目相關要求 :

wc.exe 是一個常見的工具,它能統計文本文件的字符數、單詞數和行數。這個項目要求寫一個命令行程序,模仿已有wc.exe 的功能,並加以擴充,給出某程序設計語言源文件的字符數、單詞數和行數。

實現一個統計程序,它能正確統計程序文件中的字符數、單詞數、行數,以及還具備其他擴展功能,並能夠快速地處理多個文件。


具體功能要求
程序處理用戶需求的模式為:

wc.exe [parameter] [file_name]

基本功能列表:

wc.exe -c file.c //返回文件 file.c 的字符數(實現)

wc.exe -w file.c //返回文件 file.c 的詞的數目 (實現)

wc.exe -l file.c //返回文件 file.c 的行數(實現)

擴展功能:
-s 遞歸處理目錄下符合條件的文件。
-a 返回更復雜的數據(代碼行 / 空行 / 註釋行)。(實現)

空行:本行全部是空格或格式控制字符,如果包括代碼,則只有不超過一個可顯示的字符,例如“{”。

代碼行:本行包括多於一個字符的代碼。

註釋行:本行不是代碼行,並且本行包括註釋。一個有趣的例子是有些程序員會在單字符後面加註釋:

} //註釋
在這種情況下,這一行屬於註釋行。

[file_name]: 文件或目錄名,可以處理一般通配符。

高級功能:

-x 參數。這個參數單獨使用。如果命令行有這個參數,則程序會顯示圖形界面,用戶可以通過界面選取單個文件,程序就會顯示文件的字符數、行數等全部統計信息。

需求舉例:
   wc.exe -s -a *.c

返回當前目錄及子目錄中所有*.c 文件的代碼行數、空行數、註釋行數。

遇到的困難及解決方法

  • 困難描述

1. 一開始接觸到題目時,就不知道如何輸入命令和文件路徑

2.對如何運用正則表達式去統計單詞數這一方面不太懂

3.不懂得如何寫測試單元

  • 做過哪些嘗試

1.百度搜索,然後看到了一些關於輸入命令,空格,然後再輸入文件路徑,拆分成兩部分使用的方法

2.收集一些關於正則表達式的學習資料,認真學習正則表達式

3.百度搜索如何寫單元測試,以及問同學

  • 是否解決

困難描述中的1、2兩個困難都解決了,但困難描述3中如何寫好單元測試還沒有解決,寫的單元測試有錯

  • 有何收獲

1.重溫了很多關於java的內容,例如輸入輸出流、switch等。

2.對正則表達式有一定的了解;懂得寫一些比較簡單的表達式

3.雖然單元測試沒有寫正確,但在嘗試過程中也了解了單元測試的重要性。

設計實現過程

接收控制臺輸入,判斷命令和文件路徑是否正確,然後用switch語句讀取命令,判斷命令,調用各類方法。

技術分享圖片

代碼說明

1.實現返回文件字符數目的功能

逐行讀取文件,累加每一行的長度,直到文件被讀取完。

//統計字符數目
    public static int cCount() throws IOException {
         cCount = 0;
         File file = new File(File);
         FileInputStream fis = new FileInputStream(file);
         InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
         BufferedReader br = new BufferedReader(isr);
         String line = "";
         while ((line = br.readLine()) != null) {
             cCount  += line.length();
         }
         return cCount; 
    }

2.實現返回文件詞數的功能

逐行讀取文件,去除每一行起始和結束的空格,然後用split("\\s+").length統計詞數

  //統計詞的數目
    public static int wCount() throws IOException {
         wCount = 0;
        File file = new File(File);
           FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        StringBuffer sb = new StringBuffer();
        String line = "";
        while ((line = br.readLine()) != null) {
            sb.append(line);
            line = line.trim();//刪除起始和結尾的空格
            wCount = sb.toString().split("\\s+").length;
        }
        return wCount;
    }

3.實現返回文件總行數的功能

逐行讀取文件,每讀取一行,行數+1,直到讀取完文件。

 //統計行數總數
    public static int lCount() throws IOException {
        lCount = 0;
        File file = new File(File);
           FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        StringBuffer sb = new StringBuffer();
        String line = "";
        while ((line = br.readLine())!= null) {
            lCount = lCount +1;
        }
        return lCount;
    }

4.實現統計代碼行數、空白行數、註釋行數的功能

逐行讀取文件,根據判斷line是否為空或長度是否小於等於1,為空或長度小於等於1空白行加1,判斷行裏是否連續出現//,若有註釋行加1,其他情況代碼行加1,一直讀完整個文件

//統計代碼行數、空白行數、註釋行數
    public static void moreLineCount() throws IOException {
        codeLineCount = 0;
        nullLineCount = 0;
        noteLineCount = 0;
        File file = new File(File);
           FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        StringBuffer sb = new StringBuffer();
        String line = "";
        while ((line = br.readLine()) != null) {
             if (line == "" || line.length() <= 1) {
                 nullLineCount =  nullLineCount + 1;
                 continue;
             }
             int a = line.indexOf("/");//返回第一次出現的指定子字符串在此字符串中的索引。
             int b = line.substring(a + 1).indexOf("/");
             if (b == 0) {
                 noteLineCount++;
                 continue;
             }            
             codeLineCount++;
        }
    }

5.main方法

判斷輸入的文件路徑是否有誤,沒有就用switch調用方法得出相應的輸出

public static void main(String[] args) throws IOException {
        // TODO 自動生成的方法存根
        System.out.print("wc.exe ");
        Scanner s = new Scanner(System.in);
        command = s.nextLine();
        string = command.split(" ");
        string1 = string[0];
        File = string[1];
        
        File file = new File(File);
        if (file.exists()) {
          switch(string1) {
            case "-c" :
                System.out.println("字符數目 :" + cCount());
                break;
            case "-w" :
                System.out.println("詞的數目 :" + wCount());
                break;
            case "-l" :
                System.out.println("行數數目 : " + lCount());
                break;
            case "-a" :
                moreLineCount();
                System.out.println("代碼行數 : " + codeLineCount);
                System.out.println("空白行數 : " + nullLineCount);
                System.out.println("註釋行數 : " + noteLineCount);
                break;
            default : System.out.println("沒有此命令");
           }
        }
        else {
            System.out.println("文件路徑輸入有誤或者文件路徑不存在");
       }
        
    }

測試運行

1.空白文件測試結果

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

測試結果正確

2.只有一個字符的文件測試結果

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

3.一個源文件的測試結果

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

PSP表格

PSP2.1

Personal Software Process Stages

預估耗時(分鐘)

實際耗時(分鐘)

Planning

計劃

20

20

· Estimate

· 估計這個任務需要多少時間

20

15

Development

開發

300 250

· Analysis

· 需求分析 (包括學習新技術)

300 350

· Design Spec

· 生成設計文檔

60 30

· Design Review

· 設計復審 (和同事審核設計文檔)

60 20

· Coding Standard

· 代碼規範 (為目前的開發制定合適的規範)

40 30

· Design

· 具體設計

60 70

· Coding

· 具體編碼

300 400

· Code Review

· 代碼復審

100 120

· Test

· 測試(自我測試,修改代碼,提交修改)

200 300

Reporting

報告

120 180

· Test Report

· 測試報告

60 60

· Size Measurement

· 計算工作量

60 70

· Postmortem & Process Improvement Plan

· 事後總結, 並提出過程改進計劃

30 40

合計

1730 1955


項目小結

1.對於java語言比較陌生,很多知識點都忘了,這次任務對於我來說有很大的難度,最終能把項目做出來還是很開心的

2.很多時候都是靠百度來解決問題,明確到搜索資料的重要性

3.對於Git、GitHub有了初步的了解。在初次建庫上傳代碼時,出現了很多問題。一開始用命令行不成功,後來在eclispe裏安裝插件進行上傳也是失敗了,最後又嘗試用命令行上傳成功了

4.對於單元測試還是不懂。

軟工作業1:wc.exe項目開發(java)