軟工作業(一):WC.exe
WC.exe(C語言實現)
github傳送門:https://github.com/JJYdesu/WC.git
項目要求
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 返回更復雜的數據 (未實現)
PSP
PSP2.1 |
Personal Software Process Stages |
預估耗時(分鐘) |
實際耗時(分鐘) |
Planning |
計劃 |
60 |
|
· Estimate |
· 估計這個任務需要多少時間 |
|
|
Development |
開發 |
1000 |
|
· Analysis |
· 需求分析 (包括學習新技術) |
300 |
|
· Design Spec |
· 生成設計文檔 |
40 |
|
· Design Review |
· 設計復審 (和同事審核設計文檔) |
40 |
|
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
60 |
|
· Design |
· 具體設計 |
60 |
|
· Coding |
· 具體編碼 |
360 |
|
· Code Review |
· 代碼復審 |
60 |
|
· Test |
· 測試(自我測試,修改代碼,提交修改) |
180 |
|
Reporting |
報告 |
60 |
|
· Test Report |
· 測試報告 |
60 |
|
· Size Measurement |
· 計算工作量 |
20 |
|
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
30 |
|
合計 |
|
|
解題思路
拿到題目後首先考慮的是用什麽編寫,由於我只會JAVA和C,因此給我的選項也不多,最後考慮到C的基礎比較紮實,就選擇了用C語言來實現。看完項目要求後,自然就會想到通過主函數調用幾個功能函數來實現相關要求。
設計實現過程
功能函數分別是字符數統計,詞數統計,行數統計以及處理目錄下符合條件的文件,最後再通過主函數調用實現其功能,其中詞數統計中調用了字符數統計函數,主要用於判斷文件中有無字符,有字符則開始統計詞數,無字符則直接輸出0。
代碼說明
頭文件
#include "stdio.h" #include "string.h" #include "stdlib.h" #include "io.h"
字符統計
int charcalculate(char *file) /*字符統計*/ { int c=0; FILE *fp; char a; fp=fopen(file,"r"); while(!feof(fp)) { a=fgetc(fp); if(a!=‘ ‘&&a!=‘\n‘&&a!=‘\t‘) c++; } fclose(fp); c--; return c; }
詞數統計
int wordcalculate(char *file) /*詞數統計*/ { int w=0; FILE *fp; char a; fp=fopen(file,"r"); if (charcalculate(file)==0) w=0; else { while(!feof(fp)) { a=fgetc(fp); if(a==‘ ‘||a==‘\n‘||a==‘\t‘) w++; } w++; } fclose(fp); return w; }
行數統計
int linecalculate(char *file) /*行數統計*/ { int l=0; FILE *fp; fp=fopen(file,"r"); char a; while(!feof(fp)) { a=fgetc(fp); if(a==‘\n‘||a==‘\t‘) l++; } l++; fclose(fp); return l; }
處理目錄下符合條件的文件
int searchfile(void) /*尋找目錄下txt文件*/ { //文件存儲信息結構體 struct _finddata_t fileinfo; //保存文件句柄 long fHandle; //文件數記錄器 int t=0; if( (fHandle=_findfirst( "F:\\Microsoft Visual Studio\\MyProjects\\WordCount\\Debug\\*txt", &fileinfo )) == -1L ) { printf( "當前目錄下沒有txt文件\n"); } else do{ t++; printf("找到文件:%s\n", fileinfo.name); }while (_findnext(fHandle,&fileinfo)==0); _findclose(fHandle); printf("txt文件數量:%d\n",t); return 0; }
主函數
int main (int argc, char *argv[]) /*主函數*/ { if(!strcmp(argv[1],"-c")) { printf("charnumber:%d\n",charcalculate(argv[2])); } else if(!strcmp(argv[1],"-w")) { printf("wordnumber:%d\n",wordcalculate(argv[2])); } else if (!strcmp(argv[1],"-l")) { printf("linenumber:%d\n",linecalculate(argv[2])); } else if(!strcmp(argv[1],"-s")) { searchfile(); } return 0; }
測試運行
測試文件與測試文件夾
程序運行結果
項目小結
軟工作業(一):WC.exe