核对项目(WordCount)

一.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上。

七.实际时间
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值