GitHub代碼鏈接 1.項目相關要求 •基本功能列表: -c 統計文件中字元的個數 -w 統計文件中的詞數 -l 統計文件中的行數 •拓展功能: -a 統計文件中代碼行數、註釋行數、空行 2.PSP2.1 PSP2.1 Personal Software Process Stages 預估耗時(小 ...
1.項目相關要求
•基本功能列表:
-c 統計文件中字元的個數
-w 統計文件中的詞數
-l 統計文件中的行數
•拓展功能:
-a 統計文件中代碼行數、註釋行數、空行
2.PSP2.1
PSP2.1 |
Personal Software Process Stages |
預估耗時(小時) |
實際耗時(小時) |
Planning |
計劃 |
1.0 | 1.5 |
· Estimate |
· 估計這個任務需要多少時間 |
0.5 | 1 |
Development |
開發 |
30 | 40 |
· Analysis |
· 需求分析 (包括學習新技術) |
0.5 | 1 |
· Design Spec |
· 生成設計文檔 |
0.5 | 0.6 |
· Design Review |
· 設計覆審 (和同事審核設計文檔) |
0.5 | 0.2 |
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
0.5 | 0.5 |
· Design |
· 具體設計 |
1 | 1.5 |
· Coding |
· 具體編碼 |
30 | 40 |
· Code Review |
· 代碼覆審 |
1 | 2 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
0.5 | 1 |
Reporting |
報告 |
0.5 | 0.5 |
· Test Report |
· 測試報告 |
0.5 | 0.5 |
· Size Measurement |
· 計算工作量 |
0.5 | 0.5 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
0.5 | 1 |
合計 |
39 | 52 |
3.解題思路
首先需要讀取文件,然後通過命令 計算出字元、詞、行、空行、註釋行、代碼行。
基礎功能部分:讀取文件後,將讀取的文件轉換成數組的形式,然後每生成一個數組,就是一行。其中,數組的長度就是字元數。利用正則表達式,判斷詞的開頭結尾,進行計數。
拓展功能部分:利用正則表達式判斷是否是註釋行。數組長度為0或1為空行。然後代碼行=總行數-空行-註釋行
4.流程圖
5.代碼實現
字元數
public static void charNum()throws Exception { //文件導入 Scanner input = new Scanner(System.in); System.out.println("please input path:"); String path = input.next(); int countChar = 0; InputStreamReader isr = new InputStreamReader(new FileInputStream(path)); BufferedReader br = new BufferedReader(isr); while(br.read()!=-1)//read()=-1代表數據讀取完畢 { String s = br.readLine(); countChar += s.length();//字元個數就是字元長度 } isr.close();//關閉文件 System.out.println("字元個數 "+countChar); }
詞數
public static void wordNum()throws Exception {Scanner input = new Scanner(System.in); System.out.println("please input path:"); String path = input.next(); int countword = 0; InputStreamReader isr = new InputStreamReader(new FileInputStream(path)); BufferedReader br = new BufferedReader(isr); while(br.read()!=-1)//read()=-1代表數據讀取完畢 { String s = br.readLine(); Pattern p = Pattern.compile("\\b[A-Za-z]+\\b");//創建以字母為開頭或結尾的模板 Matcher m = p.matcher(s.toString()); while(m.find()) { countword++; } } isr.close();//關閉文件 System.out.println("單詞個數 "+countword );
行數
public static void lineNum()throws Exception {Scanner input = new Scanner(System.in); System.out.println("please input path:"); String path = input.next(); int countline = 0; int countcommentline = 0; InputStreamReader isr = new InputStreamReader(new FileInputStream(path)); BufferedReader br = new BufferedReader(isr); while(br.read()!=-1)//read()=-1代表數據讀取完畢 { String s = br.readLine(); countline++;//因為是按行讀取,所以每次增加一即可計算出行的數目 } isr.close();//關閉文件 System.out.println("行數 "+countline); }
空行,註釋行,代碼行
public static void alllineNum()throws Exception {Scanner input = new Scanner(System.in); System.out.println("please input path:"); String path = input.next(); int countline = 0; int countcommentline = 0; int countblankline = 0; int codeNum=0; InputStreamReader isr = new InputStreamReader(new FileInputStream(path)); BufferedReader br = new BufferedReader(isr); while(br.read()!=-1)//read()=-1代表數據讀取完畢 { String s = br.readLine(); if(s.length()<=1) { countblankline++; } Pattern p = Pattern.compile("((/)|(/\\*+)|((^\\s)*\\*)|((^\\s)*\\*+/))+");//創建以註釋符為開頭或結尾的模板 Matcher m = p.matcher(s.toString()); while(m.find()) { countcommentline++; } countline++;//因為是按行讀取,所以每次增加一即可計算出行的數目 } isr.close();//關閉文件 codeNum=countline-countcommentline-countblankline; System.out.println("行數 "+countline); System.out.println("註釋行 "+countcommentline ); System.out.println("空行數 "+countblankline); System.out.println("代碼行 "+codeNum); }
main函數
public static void main(String[] args) throws Exception { String bString = null; System.out.println("請輸入命令 "); Scanner ms= new Scanner(System.in); if (ms.hasNext()) { bString = ms.next(); } if (bString.equals("-c")) { s.charNum(); } if (bString.equals("-w")) { s.wordNum(); } if (bString.equals("-l")) { s.lineNum(); } if (bString.equals("-b")) { s.blanklineNum(); } if (bString.equals("-a")) { s.alllineNum(); } }
6.測試運行
7. 項目總結
通過這次項目,我發現自己知識體系有所欠缺,通過學習書本,和上網查詢,請教同學得以解決。也學習到了許多新的知識。