一.github地址 :https://github.com/zealyoung/WordCountProject
二.psp预估时间:
三.设计思路
在数独生成上,具体的实现过程如下:
共分为基本功能、扩展功能和高级功能三部分,由命令行参数进行控制
wc.exe [parameter] [file_name]
wc.exe -c file.c // 返回文件的字符数
wc.exe -w file.c // 返回文件的单词数
wc.exe -l file.c // 返回文件的行数
-s 递归处理目录下符合条件的文件
-a 返回更复杂的数据
-x 调用界面程序
我们首先对功能进行分析,设计了程序流程图:
为了后续的进行,我们对函数的命名进行了统一
//检查文件是否存在
int CheckFlieName(char filename[]);
//处理命令行指令
void CommandProcessing(char order[], char filename[]);
// -c 返回文件字符数
int CountCharacter(char file[]);
// -w 返回文件单词数
int CountWord(char file[]);
// -l 返回文件行数
int CountLine(char file[]);
// -a 返回文件空白行数、代码行数及注释行数
void CountComplex(char file[]);
// 返回空白行个数
int Blankline(char file[]);
// 返回注释行个数
int Noteline(char file[]);
// 返回代码行个数
int Codeline(char file[]);
//改变目录的函数
void ChangeDirectory(char *Addr, char *filename, int flag);
//递归处理
void Search(char *FileAddr, char *type, char c);
函数调用关系图如下:
四.代码说明
我主要负责的是扩展功能的实现。
空白行的代码如下:
int Blankline(char file[])
{
int a_n = 0,ch_n = 0;
char ch;
err1 = freopen_s(&stream1, file, "r", stdin);
while ((ch = getchar()) != EOF)
{
if(ch == '\n')
{
if (ch_n <= 1)
a_n++;
ch_n = 0;
}
else if(ch!=' '&&ch!='\t')
ch_n++;
}
fclose(stdin);
return a_n;
}
注释行的代码如下:
int Noteline(char file[])
{
int ch_n = 0,b_n = 0;
char ch;
err1 = freopen_s(&stream1, file, "r", stdin);
while ((ch = getchar()) != EOF)
{
if(ch == '\n')
{
if(ch_n >= 2)
b_n++;
ch_n = 0;
}
else if(ch == '/')
ch_n++;
else if(ch_n == 1 && ch != '/')
ch_n = 0;
}
fclose(stdin);
return b_n;
}
代码行由总行数减去空白行和注释行所得
int Codeline(char file[])
{
int line = CountLine(file);
int blank = Blankline(file);
int note = Noteline(file);
int c_n = line - blank - note;
return c_n;
}
对于递归处理目录下的子文件,其中ChangeDirectory是自己定义的一个改变目录的函数:
struct _finddata_t file; //定义结构体变量
long long handle;
char *local;
FILE *pf = NULL;
char cFileAddr[300];
strcpy_s(cFileAddr, strlen(FileAddr) + 1, FileAddr);
int len3 = strlen(cFileAddr);
strcat_s(cFileAddr, len3 + 4, "*.*");
handle = _findfirst(cFileAddr, &file);//查找所有文件
if (handle == -1)//如果handle为-1, 表示当前目录为空。
return;
if (file.attrib &_A_SUBDIR) //是目录
{
if (file.name[0] != '.')
{
memset(strrchr(cFileAddr, '\\') + 1, 0, sizeof(file.name));
ChangeDirectory(cFileAddr, file.name, 1);
Search(cFileAddr, type, c);
ChangeDirectory(cFileAddr, file.name, 0);
}
else if (file.attrib &_A_ARCH) {
local = strrchr(file.name, '.');
if (!strcmp(local, type + 1)) {
memset((cFileAddr + strlen(cFileAddr) - 3), 0, sizeof(3));
strcat_s(cFileAddr, file.name);
printf("文件位置为:\n %s\n", cFileAddr);
if (c == 'c')
printf("字符数:%d\n", CountCharacter(cFileAddr));
if (c == 'w')
printf("单词数:%d\n", CountWord(cFileAddr));
if (c == 'l')
printf("行数:%d\n", CountLine(cFileAddr));
if (c == 'a')
CountComplex(cFileAddr);
ChangeDirectory(cFileAddr, file.name, 0);
}
五.程序测试
BIN文件下的所有程序
运行-c ,-l,-w,-a,-s所得结果如下:
运行-x所得如下
六.项目总结
这一次的项目由双人完成,因此在前期我们就进行了分工,进行了思路分析,对函数命名进行了统一。但是在整合阶段,我们仍然遇到了问题。在这一次的项目里,最大的问题就是对目录下的文件进行递归处理。经过查找各种资料,最后也是实现了这一功能。除此之外,我们也花费了较多的时间在debug上。
七.实际时间