软工WordCount作业
GitHub:https://github.com/Wamelon/wc
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 文件的代码行数、空行数、注释行数。
PSP
设计过程:本项目一共分成了四个模块:分别是字符统计模块、单词统计模块、行数统计模块和综合统计模块,综合统计模块包括代码行、空行和注释行的统计。
字符统计:依次访问文本文件中的每个字符,统计变量依次加1,直到文本结束
单词统计:统计以字母和下划线组成,且首字母不为下划线的所有单词。
行数统计:模块行数初始化为1,依次访问文本文件中的字符,遇到换行符依次加1,直到文本结束
综合统计:实现对空行,代码行和注释行的统计。
关键代码:
void CharCount(); //字符统计函数 void WordCount(); //单词统计函数 void LineCount(); //行数统计函数 void Muiltiple(); //综合统计函数,包括代码行,空行,注释行
字符统计
void CharCount() //字符统计函数 { FILE *fp; int c = 0; char ch; if((fp = fopen("file.c","r")) == NULL) { printf("file read failure."); } ch = fgetc(fp); while(ch != EOF) { c ++; ch = fgetc(fp); } printf("char count is :%d.\n",c); fclose(fp); }
单词统计
void WordCount() //单词统计函数 { FILE *fp; int w = 0; char ch; if((fp = fopen("file.c","r")) == NULL) { printf("file read failure."); } ch = fgetc(fp); while(ch != EOF) { if ((ch >= 'a'&&ch <= 'z')||(ch >= 'A'&&ch <='Z')||(ch >= '0'&&ch <= '9')) { while ((ch >= 'a'&&ch <= 'z')||(ch >= 'A'&&ch <= 'Z')||(ch >= '0'&&ch <= '9')||ch == '_') { ch = fgetc(fp); } w ++; ch = fgetc(fp); } else { ch = fgetc(fp); } } printf("word count is :%d.\n",w); fclose(fp); }
行数统计:
void LineCount() //行数统计函数 { FILE *fp; int l = 1; char ch; if((fp = fopen("file.c","r")) == NULL) { printf("file read failure."); } ch = fgetc(fp); while(ch != EOF) { if (ch == '\n') { l ++; ch = fgetc(fp); } else { ch = fgetc(fp); } } printf("line count is :%d.\n",l); fclose(fp); }
综合统计:
void Muiltiple() //综合统计函数,包括代码行,空行,注释行 { FILE *fp; char ch; int c=0,e=0,n=0; if((fp = fopen("file.c","r")) == NULL) { printf("file read failure."); } ch = fgetc(fp); while(ch != EOF) { if (ch == '{'||ch == '}') { e ++; ch = fgetc(fp); } else if (ch == '\n') { ch = fgetc(fp); while(ch == '\n') { e ++; ch = fgetc(fp); } } else if (ch == '/') { ch = fgetc(fp); if (ch == '/') while(ch != '\n') { ch = fgetc(fp); } n ++; ch = fgetc(fp); } else { c ++; while (ch != '{'&&ch != '}'&&ch != '\n'&&ch != '/'&&ch != EOF) { ch = fgetc(fp); } } } printf("code line count is :%d.\n",c); printf("empt line count is :%d.\n",e); printf("note line count is :%d.\n",n); fclose(fp); }
总模块:对命令行参数中字符串数组进行判断,第一个字符串数组为程序名,若第二个字符串为“-c”、“-w”、“-l”、“-a”,且第三个字符串数组为file.c,则依次调用CharCount、WordCount、LineCount、Muiltiple函数以实现对字符数、单词数、行数和空行数、代码行数和注释行数的统计。
int main(int argc,char *argv[]) { if ((strcmp(argv[1], "-c") == 0) && (strcmp(argv[2], "file.c") == 0)) { CharCount(); } if ((strcmp(argv[1], "-w") == 0) && (strcmp(argv[2], "file.c") == 0)) { WordCount(); } if ((strcmp(argv[1], "-l") == 0) && (strcmp(argv[2], "file.c") == 0)) { LineCount(); } if ((strcmp(argv[1], "-a") == 0) && (strcmp(argv[2], "file.c") == 0)) { Muiltiple(); } return 0; }
测试运行:
小结:本次项目仍有没能实现的功能,wc.exe -s递归处理目录下符合条件的文件和wc.exe -x 显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。对于递归处理目录下符合的文件功能,暂时还没有能够很好解决的思想,所以等待下次作业的完善。