【软件工程基础】结对项目-单词计数

一.github项目地址

https://github.com/zealyoung/WordCountProject

二.PSP预估时间(实际时间在文章结尾给出)

PSP2.1Personai软件流程阶段预估耗时(分钟)
规划计划60
发展开发300
分析需求分析(包括学习新技术)180

设计规格

生成设计文档120
设计回顾设计复审60
编码标准代码规范60
设计具体设计120
编码具体编码300
代码审查代码复审120
测试测试(自我测试,修改代码,提交修改)600
报告报告180
测试报告测试报告120
尺寸测量计算工作量60

尸检及过程

改进计划

事后总结,并提供过程改进计划120
 合计2400

三,设计思路

共分为基本功能、扩展功能和高级功能三部分,由命令行参数进行控制

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);

函数调用图如下:

四.代码说明

我主要负责基本功能实现及主函数的编写和界面,因此主要说明负责部分,扩展功能将由队友博客给出。

	if (strcmp(argv[1], "-s") == 0)
	{
		char type[100] = { 0 };
		char *path = NULL;
		char p;
		if (argv[1][1] == 's')
		{
			p = argv[2][1];
			path = _getcwd(NULL, 0);    //获取当前工作环境
			strcpy_s(type, strlen(argv[3]) + 1, argv[3]);
			Search(path, type, p);
			p = 0;
		}
	}
FILE* stream;
errno_t err;

int CountCharacter(char file[])
{
	int character_num = 0;
	char ch;
	err = freopen_s(&stream, file, "r", stdin);
	while ((ch = getchar()) != EOF)
	{
		if (ch != ' ' && ch != '\n' &&ch != '\t')
		{
			character_num++;
		}
	}
	fclose(stdin);
	return character_num;
}

int CountWord(char file[])
{
	int word_num = 0;
	int word = 0;
	char ch;
	err = freopen_s(&stream, file, "r", stdin);
	while ((ch = getchar()) != EOF)
	{
		if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || ch == '_')
		{
			word = 1;
		}
		else
		{
			if (word == 1)
			{
				word_num++;
				word = 0;
			}
		}
	}
	fclose(stdin);
	return word_num;
}

int CountLine(char file[])
{
	int line_num = 0;
	char ch;
	err = freopen_s(&stream, file, "r", stdin);
	while ((ch = getchar()) != EOF)
	{
		if (ch == '\n')
		{
			line_num++;
		}
	}
	fclose(stdin);
	return line_num;
}

基本功能较为简单,没有需要特别说明的内容。

	if (strcmp(argv[1], "-s") == 0)
	{
		char type[100] = { 0 };
		char *path = NULL;
		char p;
		if (argv[1][1] == 's')
		{
			p = argv[2][1];
			path = _getcwd(NULL, 0);    //获取当前工作环境
			strcpy_s(type, strlen(argv[3]) + 1, argv[3]);
			Search(path, type, p);
			p = 0;
		}
	}

主函数的-s调用部分,当输入-s时,将-s后的参数记录,例如输入为-s -a *.txt时, 记录-a,同时获取程序所在的目录,将路径记录,调用Search()递归函数,实现功能,需要说明的是,使用时须将要处理的文件与程序放在同一目录下。

	else if (strcmp(argv[1], "-x") == 0)
	{
		// 调用带有图形界面的程序
		ShellExecuteA(NULL, "open", "Interface.exe", NULL, NULL, SW_SHOW);
	}

主函数的-x调用部分,程序将直接调用Interface.exe程序,打开图形界面程序。

{
		// 调用文件
		char filename[100];
		memset(filename, 0, sizeof(filename));
		strcpy_s(filename, argv[2]);
		int flag = CheckFlieName(filename);

		// 检查文件
		if (flag == -1)
		{
			printf("文件不存在!请重新输入!");
			return 0;
		}
		if (flag == -2)
		{
			printf("文件无访问权限,请检查文件权限!");
			return 0;
		}

		// 处理统计
		if (strcmp(argv[1], "-c") == 0 || strcmp(argv[1], "-w") == 0
			|| strcmp(argv[1], "-l") == 0 || strcmp(argv[1], "-a") == 0)
		{
			CommandProcessing(argv[1], filename);
		}

		// 用于在界面程序中直接执行
		else if (strcmp(argv[1], "GUI") == 0)
		{
			printf("字符数:  %d\n", CountCharacter(filename));
			printf("单词数:  %d\n", CountWord(filename));
			printf("行数:  %d\n", CountLine(filename));
			CountComplex(filename);
		}
		else printf("命令有误,请重新输入");
	}

主函数的基本处理部分,处理统计部分调用CommandProcessing(argv[1], filename)以输出结果,最下面的一段代码是用于调用界面程序时的输出,界面程序的argv[1]已经默认为GUI。

五.程序测试

BIN文件下所有文件:

进入命令行界面开始测试:

-c -w -l -a -s测试结果如下:

-x命令测试如下:

因程序没有足够大的测试集,所以无法完成性能分析。

六.项目总结

       本次项目是结对项目,由两个人共同进行完成,虽然可以分工写代码,但实际上难度更大了,需要事先明确好程序整体的设计思路,确定函数及变量名的统一命名,在写完各自的模块进行整合时,也会出现各种各样的问题,拖慢进度,我们在本次项目中所遇到的最大问题是递归处理文件,以前未接触过,在网上也是查询了许多资料,队友也写了好多版本的递归处理,但每次都会出现问题,最终通过不断的发现错误,找寻错误的原因,再加以改正,解决了递归处理文件的问题,项目的多数是在都是在debug,也反映出了我们的编程水平不够成熟,仍需努力。

七.PSP实际用时

PSP2.1Personai软件流程阶段预估耗时(分钟)
规划计划60
发展开发300
分析需求分析(包括学习新技术)300

设计规格

生成设计文档120
设计回顾设计复审60
编码标准代码规范60
设计具体设计120
编码具体编码360
代码审查代码复审120
测试测试(自我测试,修改代码,提交修改)480
报告报告180
测试报告测试报告60
尺寸测量计算工作量60

尸检及过程

改进计划

事后总结,并提供过程改进计划180
 合计2280

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值