軟工作業1:wc.exe項目開發(java)
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)