GitHub地址:https://github.com/Aabon00/wordcountgit
PSP2.1表格github
PSP2.1數組 |
PSP階段函數 |
預估耗時學習 (分鐘)測試 |
實際耗時編碼 (分鐘)spa |
Planning.net |
計劃設計 |
20 | 25 |
· Estimate |
· 估計這個任務須要多少時間 |
15 | 10 |
Development |
開發 |
500 | 600 |
· Analysis |
· 需求分析 (包括學習新技術) |
60 | 90 |
· Design Spec |
· 生成設計文檔 |
30 | 40 |
· Design Review |
· 設計複審 (和同事審覈設計文檔) |
30 | 20 |
· Coding Standard |
· 代碼規範 (爲目前的開發制定合適的規範) |
20 | 10 |
· Design |
· 具體設計 |
40 | 30 |
· Coding |
· 具體編碼 |
500 | 600 |
· Code Review |
· 代碼複審 |
20 | 15 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
30 | 40 |
Reporting |
報告 |
20 | 20 |
· Test Report |
· 測試報告 |
20 | 20 |
· Size Measurement |
· 計算工做量 |
15 | 30 |
· Postmortem & Process Improvement Plan |
· 過後總結, 並提出過程改進計劃 |
15 | 10 |
合計 |
1335 | 1560 |
解題思路:構建實現各個功能的函數,基本功能有統計文本單詞數、字符數和行數,擴展功能有統計註釋行數、空行數和代碼行數。詢問同窗得知main(argc,**argv)函數中的參數argv爲功能名或文本名,而argc爲這些的個數。由此可依據輸入的各個參數判斷各個功能名是否出現並依據這個判斷是否調用相應函數。獲得對應的數據後按照規範輸出便可。查詢資料也能學到對文件夾的讀操做和寫操做。
程序實現過程:
程序包含以下幾個函數:
對於基本功能:
CountChars()統計文本的字符數;
WordLine()統計一行的單詞數;
CountWords()統計文本的單詞數,調用了函數WordLine();
CountLines()統計文本行數;
對於擴展功能,僅實現了-a的功能:
rem()去掉某一字符;
BlaLine()統計空行數,調用了函數rem();
ExLine()統計註釋行數,本程序僅支持行註釋;
CodeLine()統計文本代碼行數,調用了函數rem();
代碼說明:
//統計一行單詞個數 int WordLine(const char *szLine) { int n=0; int flag=0; for(int i=0;i<strlen(szLine)-1;i++) { if(*(szLine+i)==' '||*(szLine+i)==',') { flag=0; } else { if(flag==0) { flag=1; n++; } } } return n; } //統計文本單詞個數 int CountWords(char *szFile) { int n=0; FILE *fp; char buffer[1024]; if ((fp=fopen(szFile,"r"))==NULL) { return -1; } while (!feof(fp)) { if (fgets(buffer, sizeof(buffer),fp)!=NULL&&buffer[0]!='\0') n+=WordLine(buffer); } fclose(fp); return n; }
統計文本單詞個數不妨一行行地統計。函數WordLines()即統計一行單詞的個數,先設一個標記flag=0,循環逐個讀入一行的字符,爲空格或逗號時將flag置爲0;不爲空格或逗號時,將flag置爲1並計數n加1;最後返回n的值即爲一行的單詞個數。CountWords()函數中聲明一個文件指針,打開szFile文件,fgets()讀取文件中的一行,而後調用WordLine()函數直到文件結尾。
//去掉字符串中的某些字符 int rem(char *r,char ex) { char data[100]={0}; strcpy(data,r); int i=0,j=0; for(;data[i]!='\0';i++) { if(data[i]!=ex) data[j++]=data[i]; } data[j]='\0'; strcpy(r,data); } //統計文本代碼行數 int CodeLine(char *szFile) { int n=0; FILE *fp; char buffer[1024]; if ((fp=fopen(szFile,"r"))==NULL) { return -1; } while (!feof(fp)) { fgets(buffer,sizeof(buffer),fp); rem(buffer,' '); rem(buffer,'\t'); rem(buffer,'\n'); if(strlen(buffer)>1&&strncmp(buffer,"//",2)!=0) n++; } fclose(fp); return n; }
由需求可知一行的可見字符長度大於1且開頭無「//」字符時爲代碼行。則可先將一行中的空格、換行符、Tab符去掉,並用strncmp()函數判斷一行的起始是否「//」。rem()函數即是消去字符串中的某個字符。聲明一個數組保存一行的字符串,for循環至字符串結尾,循環中依次將不等於ex的字符傳入到數組中,最後用strcpy()函數將數組傳入到指針參數裏。CodeLine()函數中相似CountWords的作法依次讀取文件的一行調用rem()函數並用strlen()函數計算字符長度而後判斷起始是否「//」,若長度大於1且不爲「//」,則計數n+1.
測試設計過程:
測試須要覆蓋程序中全部可執行語句,因此要儘可能測試出程序功能的問題。主要風險有:註釋行,空行代碼行的斷定。程序的基本功能有:統計文件的字符個數、單詞個數、行數。還須要測試文件是否存在,功能參數混用等狀況
(1)測試功能-w
輸入:wc.exe -w test.c
(2)測試功能-l
輸入:wc.exe -l test.c
(3) 測試功能-c
輸入:wc.exe -c test.c
(4) 測試功能-o
輸入:wc.exe -w test.c -o result.txt
(5)測試擴展功能-a
輸入:wc.exe -a test.c
(6)功能混用
輸入:wc.exe -w -l -c -a test.c -o result.txt
(7)測試打亂文件名輸入位置
輸入:wc.exe test.c -w -c -a -l -o result.txt
(8)測試文件名不存在的狀況
輸入:wc.exe -w -c -a testno.c
(9)測試輸入參數不存在的狀況
輸入:wc.exe -w -y -a test.c
(10)測試文件名不存在的狀況
輸入:wc.exe -w -a -l -c test.c -o out.txt
參考文獻:
https://blog.csdn.net/Athenaer/article/details/7876614
http://blog.csdn.net/yhawaii/article/details/7361302
http://blog.csdn.net/hancunai0017/article/details/7032383