WordCount擴充套件與優化
阿新 • • 發佈:2018-10-31
合作者:201631062327,201631062128
碼雲地址:https://gitee.com/LIUJIA6/WordCount3
一:專案說明
本次專案是在上次作業WorldCount的基礎上,利用結對程式設計的思想,完成對WorldCount專案的功能擴充套件
-s 遞迴處理目錄下符合條件的檔案。(實現)
-a 返回更復雜的資料(程式碼行 / 空行 / 註釋行)。(實現)
空行:本行全部是空格或格式控制字元,如果包括程式碼,則只有不超過一個可顯示的字元,例如“{”。
其中,程式碼行:本行包括多於一個字元的程式碼。
空 行:本行全部是空格或格式控制字元,如果包括程式碼,則只有不超過一個可顯示的字元,例如“{”。
註釋行:本行不是程式碼行,並且本行包括註釋。一個有趣的例子是有些程式設計師會在單字元後面加註釋。[file_name]: 檔案或目錄名,可以處理一般萬用字元。
二:部分程式碼
基礎功能:測試返回單詞數,字元數,行數
int countw(char *file)//返回檔案詞的數目 { FILE *f; f=fopen(file,"r"); char ch; if(NULL==(f=fopen(file,"r"))) { printf("檔案"); } else while(!feof(f)) { ch=fgetc(f); if((ch >= 'a'&&ch <= 'z')||(ch>='A'&&ch<='Z')||ch=='_') aword=1; else if (aword) { cword++; aword=0; } } fclose(f); printf("單詞數:%d ",cword); } int countc(char *file) //返回檔案的字元數 { FILE *f; f = fopen(file, "r"); char a; if(NULL==(f=fopen(file,"r"))) { printf("file is NULL"); } else while (!feof(f)) { a=fgetc(f); if (a != ' '&&a != '\n'&&a != '\t') cchar++; } fclose(f);printf("字元數:%d ",cchar); } int countl(char *file) //返回檔案的行數 { FILE *f; f = fopen(file, "r"); int cline = 0; char a; if(NULL==(f=fopen(file,"r"))) {printf("file is NULL");} else while(!feof(f)) { a=fgetc(f); if(a=='\n'||a=='\t') cline++; } fclose(f);printf("行數:%d ",cline); return 1; }
拓展功能:測試返回程式碼行,註釋行,空行和txt檔案數
int count_blankline(char *file) //返回檔案的空行數 { FILE *f; int b_num = 0; int ch_num = 0; char ch; f = fopen(file, "r"); if(NULL==(f=fopen(file,"r"))) { printf("file is NULL"); } else while (!feof(f)) { ch= fgetc(f); if (ch=='\n'){ if (ch_num<= 1) b_num++; ch_num = 0; } else if (ch!=' '&&ch!='\t'&&ch!='}') ch_num++; else if(ch=='}')b_num++; } fclose(f);printf("空行數:%d ",b_num); } int count_noteline(char *file) //返回檔案的註釋行數 { FILE *f; int ch_num = 0;int note_num=0; char ch; f=fopen(file, "r"); if(NULL==(f=fopen(file,"r"))) { printf("檔案不存在"); } else while (!feof(f)) { ch= fgetc(f); if(ch=='\n'){if(ch_num==2) note_num++; ch_num=0;} else if(ch=='/') ch_num++; else if(ch_num==1){if(ch=='/') ch_num++;} } fclose(f); printf("註釋行:%d ",note_num); } int count_codeline(char *file)//返回檔案的程式碼行數 { int ch_num = 0; int code_num=0; FILE *f; int tag=0; int flag=0; char a; f = fopen(file, "r"); if(NULL==(f=fopen(file,"r"))) {printf("檔案不存在");} else while (!feof(f)) { a=fgetc(f); if(flag==2) { flag=0;tag++;} else{ if(a=='\n'&&ch_num>1) {code_num++; ch_num=0; } else if(a != ' '&&a != '\n'&&a != '\t'&&a!='/') { ch_num++;} else if(a=='/'){ flag++;} } } fclose(f); printf("程式碼行數:%d ",code_num-tag); } int searchfile(void) //尋找資料夾中的txt檔案 { struct _finddata_t filefind; long handle; int t=0; if( (handle=_findfirst( "d:\\wordcount\\*txt", &filefind)) == -1L ) { printf( "沒找到txt檔案\n"); } else do{ t++; printf("找到檔案:%s\n", filefind.name); }while (_findnext(handle,&filefind)==0); _findclose(handle); printf("txt檔案數量:%d\n",t); return 0; }
三:單元測試
由於本次專案採用傳統的C語言,就沒有很好的工具可供使用。於是我們就手寫了部分功能的單元測試(單元測試大同小異,選了幾個單元進行測試)。
首先是字元數統計的測試
int countc(char *file); int main () { FILE *fpt; char filename[30]; printf("輸入測試檔案\n"); scanf("%s",&filename) ; fpt=fopen(filename, "rb"); countc(filename); return 0; }
輸入正確的txt檔名,輸出結果如下
然後是註釋行統計的測試
int count_noteline(char *file); int main () { FILE *fpt; char filename[30]; printf("輸入測試檔案\n"); scanf("%s",&filename) ; fpt=fopen(filename, "rb"); count_noteline(filename); return 0; }
同樣,測試結果如下
四:總結
通過這次的結隊程式設計合作,瞭解到了在團隊合作時應該具備的基本素質,需要和隊友及時溝通,完成程式碼的結合配對。同時本次過程中對WordCount的功能有了更加全面的瞭解與掌握,也對單元測試有了更深的瞭解。