項目的gitee地址:https://gitee.com/ITtoto/WordCount
開發語言:C語言
PSP2.1表格
PSP2.1 |
PSP階段 |
預估耗時 (分鍾) |
實際耗時 (分鍾) |
Planning |
計划 |
20 |
16 |
· Estimate |
· 估計這個任務需要多少時間 |
30 |
27 |
Development |
開發 |
120 |
160 |
· Analysis |
· 需求分析 (包括學習新技術) |
20 |
18 |
· Design Spec |
· 生成設計文檔 |
20 |
0 |
· Design Review |
· 設計復審 (和同事審核設計文檔) |
30 |
0 |
· Coding Standard |
· 代碼規范 (為目前的開發制定合適的規范) |
20 |
0 |
· Design |
· 具體設計 |
30 |
50 |
· Coding |
· 具體編碼 |
100 |
150 |
· Code Review |
· 代碼復審 |
20 |
0 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
10 |
20 |
Reporting |
報告 |
20 |
13 |
· Test Report |
· 測試報告 |
10 |
2 |
· Size Measurement |
· 計算工作量 |
20 |
5 |
· Postmortem & Process Improvement Plan |
· 事后總結, 並提出過程改進計划 |
10 |
15 |
|
合計 |
480 |
476 |
WordCount需求說明
WordCount的需求可以概括為:對程序設計語言源文件統計字符數、單詞數、行數,統計結果以指定格式輸出到默認文件中,以及其他擴展功能,並能夠快速地處理多個文件。
可執行程序命名為:wc.exe,該程序處理用戶需求的模式為:
wc.exe [parameter] [input_file_name]
存儲統計結果的文件默認為result.txt,放在與wc.exe相同的目錄下。
基本功能
wc.exe -c file.c //返回文件 file.c 的字符數wc.exe -w file.c //返回文件 file.c 的單詞總數wc.exe -l file.c //返回文件 file.c 的總行數wc.exe -o outputFile.txt //將結果輸出到指定文件outputFile.txt
注意:
空格,水平制表符,換行符,均算字符。
由空格或逗號分割開的都視為單詞,且不做單詞的有效性校驗,例如:thi#,that視為用逗號隔開的2個單詞。
-c, -w, -l參數可以共用同一個輸入文件,形如:wc.exe –w –c file.c 。
-o 必須與文件名同時使用,且輸出文件必須緊跟在-o參數后面,不允許單獨使用-o參數。
參數及其約定如下:
參數名字 |
參數意義 |
用法示例 |
-c[必選] |
文件的字符數 |
示例:wc.exe -c file.c [表示返回文件file.c的字符數,並存儲在result.txt中] |
-w[必選] |
文件單詞總數 |
示例:wc.exe -w file.c [表示返回文件file.c的單詞數,並存儲在result.txt中] |
-l[必選] |
文件行數 |
示例:wc.exe -l file.c [表示返回文件file.c的總行數,並存儲在result.txt中] |
-o[必選] |
輸出文件名 |
示例:wc.exe –c file.c -o outfile.txt [表示返回文件file.c的字符數,並存儲在outfile.txt中]
|
基本思路
根據C語言寫的小程序,三個功能,分別輸出文件的字符數、行數和單詞數,每個功能寫一個函數,在總函數中具體寫輸出格式,在具體函數中進行具體編碼。代碼中肯定要進行文件流的一些具體方法,fopen和fwrite等函數也會用到。在做這個的時候,我不想什么炫技的方法,指向一步一步的簡單的做下來,所以if else就是一個很好的分類方法了,只要肯分,所有的命令肯定都規規矩矩的一個一個的都能實現,關鍵就是要看細節代碼的部分了,不過對於分揀劉的操作,其實說到底就是那幾部,沒什么難的。。
詳細設計 :
本次實現使用C語言,使用vs2013進行開發。
設置基礎功能有三個類charcount、wordcount和linecount三個類分別對應的事字符數、單詞數和行數的統計,最后一個main類收尾,代碼如下:
字符數類:
1 int charcount(char file[]){ 2 FILE *fp= NULL; 3 int ccount = 0; 4 char c; 5 if (fopen_s(&fp, file, "r")){ 6 printf("找不到文件\n"); 7 exit(-1); 8 } 9 c = fgetc(fp); 10 while (c != EOF){ 11 c = fgetc(fp); 12 ccount++; 13 } 14 fclose(fp); 15 return ccount; 16 }
單詞數類:
1 int wordcount(char file[]){ 2 FILE *fp = NULL; 3 int wcount = 0; 4 char c; 5 if (fopen_s(&fp, file, "r")){ 6 printf("找不到文件\n"); 7 exit(-1); 8 } 9 c = fgetc(fp); 10 while (c != EOF){ 11 if (c >= 'a'&&c <= 'z' || c >= 'A'&&c <= 'Z' || c >= '0'&&c <= '9'){ 12 while (c >= 'a'&&c <= 'z' || c >= 'A'&&c <= 'Z' || c >= '0'&&c <= '9' || c == '_'){ 13 c = fgetc(fp); 14 } 15 wcount++; 16 c = fgetc(fp); 17 } 18 c = fgetc(fp); 19 } 20 fclose(fp); 21 return wcount; 22 }
行數類:
1 int linecount(char file[]){ 2 FILE *fp = NULL; 3 int lcount = 0; 4 char c; 5 if (fopen_s(&fp, file, "r")){ 6 printf("找不到文件\n"); 7 exit(-1); 8 } 9 c = fgetc(fp); 10 while (c != EOF){ 11 if (c == '\n'){ 12 lcount++; 13 c = fgetc(fp); 14 } 15 else 16 { 17 c = fgetc(fp); 18 } 19 } 20 fclose(fp); 21 return lcount+1; 22 }
main類:
1 int main(){ 2 char order[100], file[100]; 3 printf("輸入命令:c:字符數 l:行數 w:單詞數 q:退出 \n"); 4 while (1){ 5 printf("請輸入用戶命令: wc.exe -"); 6 scanf_s("%s", &order,100); 7 if (order[0] == 'c'){ 8 printf("請輸入文件名: "); 9 scanf_s("%s", &file,100); 10 printf("文件的字符數為: %d\n", charcount(file)); 11 continue; 12 } 13 if (order[0] == 'w'){ 14 printf("請輸入文件名: "); 15 scanf_s("%s", &file, 100); 16 printf("文件的單詞數為: %d\n", wordcount(file)); 17 continue; 18 } 19 if (order[0] == 'l'){ 20 printf("請輸入文件名: "); 21 scanf_s("%s", &file, 100); 22 printf("文件的行數為: %d\n", linecount(file)); 23 continue; 24 } 25 if (order[0] == 'q'){ 26 break; 27 } 28 } 29 return 0; 30 }
測試設計:
總結:
剛拿到作業題的時候感覺頭皮發麻,完全不知道從哪里下手,又要從文件流入手,又要兼顧命令,還要將結果輸出到1個新文件中,還有寫博客和一些亂七八糟的東西。無法下手,不過將老師的作業要求全部讀了一遍之后,更讓人迷糊了,所以干脆都不管了,只是將代碼方面的設計下來之后,感覺剩下來的東西也就不是那么讓人感到恐懼了,慢慢的也就熟悉上了,編碼方面的問題雖然有時候會卡一會,不過通過查找網上的資料和詢問同學之后也就搞定了都。感覺這次的作業讓我適應了將來工作的一個流程,還有和網上程序員打交道的途徑,提前將基礎都打好很有利於我們將來的社會工作,我認為這次作業很有意義!