项目1: WordCount (单词计数)
1.1 项目要求
wc.exe是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc exe的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
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 -1 file.c
//返回文件file.c的行数
//返回文件file.c的字符数
wc.exe -W file.c
//返回文件file.c 的词的数目
wc.exe -1 file.c
//返回文件file.c的行数
扩展功能:
-s:递归处理目录下符合条件的文件。
-a:返回更复杂的数据(代码行/空行/注释行)。
-s:递归处理目录下符合条件的文件。
-a:返回更复杂的数据(代码行/空行/注释行)。
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
高级功能:
-x参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
需求举例:
wC.exe -s -a *.c
返回当前目录及子目录中所有*.c文件的代码行数、空行数、注释行数。
-x参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
需求举例:
wC.exe -s -a *.c
返回当前目录及子目录中所有*.c文件的代码行数、空行数、注释行数。
1.2标准测试集, 正确性和速度评比
以子目录的形式把目前所有同学的程序都集中在一个总的测试目录下,作为测试集合。然后大家看看各自的程序要花多少时间才能正确并且较快地完成任务。在这里,同学们要记下满足了标准测试集之后,每人实际花费的时间[实际值],并且按照附录中PSP的表格统计自己在软件开发的各个阶段所花费的时间。
以子目录的形式把目前所有同学的程序都集中在一个总的测试目录下,作为测试集合。然后大家看看各自的程序要花多少时间才能正确并且较快地完成任务。在这里,同学们要记下满足了标准测试集之后,每人实际花费的时间[实际值],并且按照附录中PSP的表格统计自己在软件开发的各个阶段所花费的时间。
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
FILE *f;
int countw(char v3[100])
{
f = fopen(v3, "r");
int cword = 0;
char a;
while (!feof(f))
{
a = fgetc(f);
if (a == ' ' || a == '\n' || a == '\t' || a == ',' || a == '.' || a == '!' || a == '=' || a == ';')
cword++;
}
printf("word numbers is %d", cword);
fclose(f);
return 1;
}
int countc(char v3[100])
{
f = fopen(v3, "r");
int cchar = 0;
char a;
while (!feof(f))
{
a = fgetc(f);
if (a != ' '&&a != '\n'&&a != '\t')
cchar++;
}
cchar--;
printf("char numbers is %d", cchar);
fclose(f);
return 1;
}
int countl(char v3[100])
{
f = fopen(v3, 'r');
int cline = 0;
char a;
while (!feof(f))
{
a = fgetc(f);
if (a == '\n')
cline++;
}
cline++;
printf("line numbers is %d", cline);
fclose(f);
return 1;
}
int counta(char v3[100])
{
f = fopen(v3, "r");
int ca1 = 0,ca2 = 0,ca3 = 0;
int c1, c2, c3;
int flag = 0;
char a;
while (!feof(f))
{
c1 = 0;
c2 = 0;
c3 = 0;
while (!feof(f))
{
flag = 0;
a = fgetc(f);
if (a == ' ' || a == '\t')
c2++;
else if (a == '\n')
{
if (c1 == 0 && c3 == 0)
ca2++;
else ca1++;
}
else if (a == '\\')
{
a = fgetc(f);
if (a == '\\')
c3++;
if (c1 == 0 || c1 == 1)
{
ca3++;
while (!feof(f))
{
a = fgetc(f);
if (a == '\n')
break;
}
flag = 1;
break;
}
}
}
}
if (flag == 0)
if (c1 == 0)
c2++;
else c1++;
printf("代码行数:%d", ca1);
printf("空行数:%d", ca2);
printf("注释行数:%d", ca3);
}
int countx(char v3[100])
{
}
int main()
{
char v1[100], v2[100], v3[100];
int i, j, k;
while (scanf("%s%s%s",&v1, &v2, &v3)!=EOF);
{
if (!strcmp(v2, '-c'))
conutc();
else if (!strcmp(v2, '-w'))
countw(v3);
else if (!strcmp(v2, '-l'))
countl(v3);
else if (!strcmp(v2, '-a'))
counta(v3);
else if (!strcmp(v2, '-x'))
countx(v3);
}
}
GitHub:https://github.com/yjsnpi1919/Testandhomework
单词计数项目PSP表格:
总结:
未能实现图形界面以及递归处理功能。主要是由于开始对新知识学习难度估计不足以及对时间的把控不够,以至于未能达到预期的效果。