软件工程作业2

GitHub地址:https://github.com/dog-bear/Count

1、项目要求

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 返回更复杂的数据 (实现)

2、psp表

*PSP2.1* *Personal Software Process Stages* *预估耗时(分钟)* *实际耗时(分钟)*
Planning 计划 45 20
·Estimate · 估计这个任务需要多少时间 45 20
Development 开发 705 482
· Analysis · 需求分析 (包括学习新技术) 180 75
· Design Spec · 生成设计文档 10 10
·Design Review · 设计复审 (和同事审核设计文档) 15 25
·Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 12
· Design · 具体设计 30 20
· Coding · 具体编码 200 165
· Code Review · 代码复审 60 55
· Test · 测试(自我测试,修改代码,提交修改) 200 120
Reporting 报告 120 70
· Test Report · 测试报告 40 25
·Size Measurement · 计算工作量 40 25
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 40 20
合计 870 572

3、解题思路

把功能分成5个模块,分模块编写,然后main函数组合起来。首先要先去找c语言文件的读入,以及如何在行内进行一个准确的判断(为-a准备),-s主要是学会把握句柄然后进行当前目录下的查找。围绕这些网上查找接口函数和实现思路。

4、设计实现过程

一共5个功能模块函数和一个main主函数。可以用字符查找函数对词函数先进行一个空判定。返回复杂数据的代码行也可以用字符查找进行判定。注释行用到了两个标记进行确认。

5、代码说明

统计字符数

利用非字符进行排查和判定。

//字符统计 
int charcount(char *file)
{
	 int c=0;
	 FILE *fp;
     char a;
	 fp=fopen(file,"r");
	 while(!feof(fp))
	 {
		 a=fgetc(fp);
		    if(a!=' '&&a!='\n'&&a!='\t')
               c++;
     }
     fclose(fp);
     c--;
     return c;
 }

统计词数

用到一个标记t,当标记遇到字符是会判定1,若是遇到非字符时候,判定为1,则词数增加,而且判定归0。

//词数统计
int wordcount(char *file)
{
	 int w=0;
	 FILE *fp;
	 char a;
	 int t=0;
	 fp=fopen(file,"r");
	 if (charcount(file)==0)
         w=0;  
	 else
	 {
		 while(!feof(fp))
		 {
			 a=fgetc(fp);
			 if(a==' '||a=='\n'||a=='\t'||a==EOF){
			 	if(t==1){
			 		w++;
			 		t=0;
			 	}
			 } 
	         else t=1;
		 }
	 }
	 fclose(fp);
	 return w;
}

统计行数

根据换行符进行判定。

//行数统计
int linecount(char *file)  
{
	 int l=0;
	 FILE *fp;
     fp=fopen(file,"r");
	 char a;
	 while(!feof(fp))
	 {
		 a=fgetc(fp);
		    if(a=='\n')
               l++;
	 }
	 fclose(fp); 
     l++;
	 return l;
}

寻找目录下符合条件文件

//寻找目录下txt,cpp文件
int searchfile(void)
{
    struct _finddata_t fileinfo;
    long fHandle;
    int t=0;
	
       if( (fHandle=_findfirst( "*txt", &fileinfo )) == -1L ) 
		{
        printf( "当前目录下没有txt文件\n");
		
		}
    else
    do{
		 t++;
		printf("找到文件:%s\n", fileinfo.name);
	}while (_findnext(fHandle,&fileinfo)==0);
	
    _findclose(fHandle);

    printf("txt文件数量:%d\n",t);
    return 0;
}

返回复杂数据

首先以换行符进行区分,遇到一个换行符或者终止符进行一次判定。

若是遇到字符行,则判定为代码行。

若遇到‘/’两次出现,则认定为注释行。

其余为空行。

//返回更多数据 
int LineData(char *file){
	
	FILE *fp;
    fp=fopen(file,"r");
	char a;
	int tag=0,tag2=0,Blank_line=0,Code_Line=0,Comment_Line=0;
	
	while(!feof(fp)){
		a=fgetc(fp);
		if(a=='\n'||a==EOF){
			if(tag==1)
				Code_Line++;
			if(tag==2)
				Comment_Line++;
				tag2=0;
			if(tag==0)
				Blank_line++;
			tag=0;
				
		}else{
			if(a!=' '&&a!='\n'&&a!='\t'&&a!='{'&&a!='}'){
				if(a=='/'){
					if(tag2==1)
						tag=2;
					tag2=1;
				} 
				if(tag!=2)
					tag=1; 
			} 

		}
	}
	fclose(fp);
	printf("空行数为:%d\n",Blank_line);
	printf("代码行数为:%d\n",Code_Line);
	printf("注释行数为:%d\n",Comment_Line);
	return 	Blank_line+Code_Line+Comment_Line;
}

main函数

//主函数 
int main (int argc, char *argv[])
{
	int i;
	for(i=1;i

6、测试运行

空文件

软件工程作业2_第1张图片

只有一个字符的文件

软件工程作业2_第2张图片

只有一个词的文件

软件工程作业2_第3张图片

只有一行的文件

软件工程作业2_第4张图片

本程序源文件

软件工程作业2_第5张图片

7、项目小结

1、github运用不熟练,下载安装耗去了一部分时间。

2、对psp开发感觉不适应,做的准备工作太多,到实际开发上不能应用起来。

3、测试和修改次数过多,初版代码错误地方太多。还是准备不够充分,心态容易急躁。

你可能感兴趣的:(软件工程作业2)