wc項目記錄
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項目記錄