1. 程式人生 > >WordCount擴充套件與優化

WordCount擴充套件與優化

合作者: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的功能有了更加全面的瞭解與掌握,也對單元測試有了更深的瞭解。