網址:https://github.com/3216005214/wc.exe wc項目要求 wc.exe 是一個常見的工具,它能統計文本文件的字元數、單詞數和行數。這個項目要求寫一個命令行程式,模仿已有wc.exe 的功能,並加以擴充,給出某程式設計語言源文件的字元數、單詞數和行數。 實現一個統計 ...
網址:https://github.com/3216005214/wc.exe
wc項目要求
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 文件的代碼行數、空行數、註釋行數。
已實現wc項目要求
1、計算文件字元數
2、計算文件單詞數
3、計算文件行數
4、計算文件空行數
遇到的困難及解決辦法
▪ 困難描述
大學前兩年對課程學習的疏忽,對c語言的知識的記憶已經大大減少,以至於老師要求我們做這個單人項目的時候,心裡是慌的,因為對c語言等編程的不熟悉,所以我要花幾天時間重新把丟下的知識重新拾取回來,所以,我也就比別人的時間要更緊張。首先我先做了下嘗試,嘗試用JAVA和C語言寫這個項目,最後還是選擇了C語言。在寫代碼的過程中,有許多新的函數未接觸過,需要花時間去瞭解。還有github的使用方法也不是太瞭解,也要花時間去做。對於傳參的形式也是想了很久,做出了很多嘗試。
▪ 做過哪些嘗試
對於要重拾C語言知識這件事情,幸好大一的時候買了一本較為詳細的C語言教科書,幫助我能更快的把丟下的知識拿回來。當演算法真的不懂的時候,到網上參考了一些代碼,然後把它理解為自己的東西再寫到自己的代碼中。在把第一個基本功能寫出的時候,運行的時候發現總是只能讀取文件中的第一個字元,通過不斷的檢查,嘗試,終於才可以正確的實現計算字元數的功能。對於傳參形式,首先嘗試用了指針,然後發現行不通(可能以我現在水平不能很好的使用這種方法),最後用了數組,選擇了一種比較簡單的方式。在函數的選擇方面,也是一個一個認為可以實現的函數去嘗試(雖然最後沒有用到多少函數)
▪ 是否解決
拓展功能的註釋行和代碼行的計數演算法尚未解決,空行的計數方法存在缺陷。基本功能已實現。
▪ 有何收穫
瞭解並基本掌握關於處理文件的演算法函數
重拾C語言相關知識
認識到需要不斷鞏固知識的重要性
關鍵代碼及說明
int main(){//主函數 char input[10],File[200]; while(1){ printf("請輸入用戶命令:wc.exe-"); scanf("%s",&input); if(input[0]=='c'){ printf("請輸入文件名:"); scanf("%s",&File); int charcount=0; charcount=CharCount(File); printf("文件的字元數為:%d\n",charcount); continue; } if(input[0]=='w'){ printf("請輸入文件名:"); scanf("%s",&File); int wordcount=0; wordcount=WordCount(File); printf("文件的詞數為:%d\n",wordcount); continue; } if(input[0]=='l'){ printf("請輸入文件名:"); scanf("%s",&File); int linecount=0; linecount=LineCount(File); printf("文件的行數為:%d\n",linecount); continue; } if(input[0]=='a'){ printf("請輸入文件名:"); scanf("%s",&File); ComplexCount(File); continue; } } system("pause"); return 0; }
主函數:運用傳參的方法
int CharCount(char file[]){//字元數統計函數 FILE *pf=NULL; int ccount=0; pf=fopen(file,"r"); if(pf==NULL){ printf("尋找文件失敗\n"); exit(-1); } char mychar; mychar = fgetc(pf); while(mychar!=EOF){ mychar = fgetc(pf); ccount++; } fclose(pf); return ccount; }
字元統計函數:在每次讀取文件中的字元時,ccount+1
int WordCount(char file[]){//單詞數統計函數 FILE *pf=NULL; int wcount=0; pf=fopen(file,"r"); if(pf==NULL){ printf("尋找文件失敗\n"); exit(-1); } char mychar; mychar = fgetc(pf); while(mychar!=EOF){ if(mychar>='a'&&mychar<='z'||mychar>='A'&&mychar<='Z'||mychar>='0'&&mychar<='9'){ while(mychar>='a'&&mychar<='z'||mychar>='A'&&mychar<='Z'||mychar>='0'&&mychar<='9'||mychar=='_'){ mychar=fgetc(pf); } wcount++; mychar=fgetc(pf); } mychar=fgetc(pf); } fclose(pf); return wcount; }
單詞統計函數
int LineCount(char file[]){//行數統計函數 FILE *pf=NULL; int lcount=0; pf=fopen(file,"r"); if(pf==NULL){ printf("尋找文件失敗\n"); exit(-1); } char mychar; mychar = fgetc(pf); while(mychar!=EOF){ if(mychar=='\n'){ lcount++; mychar = fgetc(pf); } else{ mychar = fgetc(pf); } } fclose(pf); return lcount+1; }
行數統計函數
int ComplexCount(char file[]){ FILE *pf=NULL; int spacecount=0; pf=fopen(file,"r"); if(pf==NULL){ printf("尋找文件失敗\n"); exit(-1); } char mychar; mychar = fgetc(pf); while(mychar!=EOF){ if(mychar=='\n'){ mychar=fgetc(pf); if(mychar=='\n' ){ spacecount++; mychar=fgetc(pf); } } else if(mychar=='}'){ mychar=fgetc(pf); if(mychar=='\n'){ spacecount++; mychar=fgetc(pf); } } else mychar=fgetc(pf); } printf("文件空行數為%d\n",spacecount); return 0; }
空行統計函數:該演算法有缺陷,不嚴謹
測試結果
PSP
PSP2.1 |
Personal Software Process Stages |
預估耗時(分鐘) |
實際耗時(分鐘) |
Planning |
計劃 |
30 |
30 |
· Estimate |
· 估計這個任務需要多少時間 |
24*60 |
2*24*60 |
Development |
開發 |
10*60 |
12*60 |
· Analysis |
· 需求分析 (包括學習新技術) |
15 |
10 |
· Design Spec |
· 生成設計文檔 |
5 |
5 |
· Design Review |
· 設計覆審 (和同事審核設計文檔) |
10 |
10 |
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
15 |
15 |
· Design |
· 具體設計 |
30 |
60 |
· Coding |
· 具體編碼 |
5*60 |
5*60 |
· Code Review |
· 代碼覆審 |
15 |
30 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
15 |
15 |
Reporting |
報告 |
20 |
30 |
· Test Report |
· 測試報告 |
15 |
20 |
· Size Measurement |
· 計算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
15 |
15 |
合計 |
|
2535 |
4150 |