WC

Guithub项目地址

 https://github.com/Laa-L/WordCount

项目相关要求

  •  题目描述

Word Count
1. 实现一个简单而完整的软件工具(源程序特征统计程序)。
2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。

  • 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 文件的代码行数、空行数、注释行数。

  •  关键代码
// 字符统计
int char_count(FILE *fp)
{
int count = 0; // 初始化字符数为0
while (!feof(fp))
{
if (fgetc(fp) == '\n') // 不计换行符
continue;
count++; // 累计字符
}
printf("字符总数:%d\t", --count);
return count;
}
// 单词统计
int word_count(FILE *fp)
{

int count; // 文件单词总数
count = 0;
char ch;
char a_ch = '#'; // 文件指针前一个字符
while (!feof(fp))
{
ch = fgetc(fp);
if (IsLetter(ch) && !IsLetter(a_ch) && a_ch != '.' && a_ch != '_') // 前一个字符不是字母也不是'.'和‘_’
count++; // 该字符为新单元首字符 
a_ch = ch; // 下移检查
}
printf("单词总数:%d\t", count);
return count;
}
// 行数统计
int line_count(FILE *fp)
{
int count = 0; // 初始化行数为0
while (!feof(fp))
{
if (fgetc(fp) == '\n') // 遇到换行符即为一行结束
count++;
}
printf("行总数:%d\t", count);
return count;
}
// 主函数
int main() 
{
char command[100]; // 输入的命令
char *sub_com[2]; // 字符指针数组存放分割的得到的命令参数和文件路径
char* next_token = NULL;
FILE *fp = NULL;
func_list(); // 调用函数显示基本功能列表
printf("请按以上格式输入命令(输入“end”退出)...\n");
cin.get(command, 100); // 接收命令gets(command);//
while (strcmp(command, "end") != 0) {
sub_com[0] = strtok_s(command + 8, " ", &next_token); // 以空格字符分割命令,第一次得到命令参数
sub_com[1] = strtok_s(NULL, " ", &next_token); // 再次分割得到文件路径// 打开文件
errno_t err;
if ((err = fopen_s(&fp, sub_com[1], "r")))
{
printf("文件打开错误\n");
exit(0);
}

// 按匹配命令参数调用不同的函数
switch (*sub_com[0]) {
case 'c':
char_count(fp); // 调用字符统计函数
break;
case 'w':
word_count(fp); // 调用单词统计函数
break;
case 'l':
line_count(fp); // 调用行统计函数
break;
default:
printf("命令参数错误!\n");
break;
}
printf("\n");
// 关闭文件 
if (fclose(fp) == EOF)
{
printf("文件关闭错误\n");
exit(0);
}
next_token = NULL;
printf("请按enter键继续...\n");
getchar();
getchar();
printf("请按以上格式输入命令(输入“end”退出)...\n");
cin.get(command, 100); 
}
getchar();
printf("按Enter键退出程序!\n");
getchar();
return 0;
}
  • 回归测试

     

     

     

     

     

     


     

 

posted @ 2020-03-18 21:15  ;-D  阅读(219)  评论(0)    收藏  举报