实现Word Count 统计字符数、单词数、行数,
基于C实现Word Count ---系统分析与设计课程个人项目作业
1. 项目地址:
[gitee地址] (https://gitee.com/little-baby/WordCount-by-C )
2. 项目简介
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
3. 项目要求
- 可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
- wc.exe [parameter] [input_file_name]
- 存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。
4. 需求分析
- 根据输入显示出给定文件的大致信息,具体包括字符数、单词数、行数(基本功能),显示注释行、空行...(扩展功能) 、以图形界面展示信息(高级功能).
- 根据用户的输入选择目标文件,根据用户的输入判定是否生成新输出文件.
- 具体说明如下:
- 用户在命令行运用如下格式命令执行程序:wc.exe [ 参数 ] 输入文件名 [ -o ] 输出文件名.
- 对于参数选项具体说明:至少存在一项(-w :统计文件,-l 统计行数,-c :统计字符).
- 对于输入文件名选项具体说明:不可省略.
- -o选项具体说明:可省略.
- 对输出文件名选项具体说明:可省略,但倘若出现,前面一定跟着输出"-o"参数.
5. PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟 ) |
---|---|---|---|
Planning | 计划 | 100 | 55 |
Estimate | 估计这个任务需要多少时间 | 60 | 30 |
Development | 开发 | 100 | 180 |
Analysis | 需求分析 (包括学习新技术) | 90 | 80 |
Design Spec | 生成设计文档 | 60 | 45 |
Design Review | 设计复审 (和同事审核设计文档) | 45 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 25 | 15 |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 60 | 120 |
Code Review | 代码复审 | 20 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 45 | 90 |
Reporting | 报告 | 60 | 75 |
Test Report | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 30 | 35 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 60 |
合计 | 815 | 975 |
6. 具体实现过程
-6.1 所需要解决的几个关键问题??
- 对于在命令行的读取输入,读取出输入信息
- 如何识别参数,即识别所输入的不同的参数
- 对于不同参数,如何调用调用实现所要达到的功能
-6.2 可行的几个解决方案
① 参见C语言命令行参数的使用
② 借助C语言库函数strcmp与指定的字符串进行比较
③ 由上可知,当识别出不同的参数时,直接调用不同的函数即可.
7. 部分实现代码
- 文件操作
char* filename(int argc,char** arg) //返回文件名
{
int i=0;
char* name;
for(i=1;i<argc;i++)
{
if(strcmp(arg[i],"-l")&&strcmp(arg[i],"-w")&&strcmp(arg[i],"-c"))
{
return arg[i];
}
}
}
void openfile(int argc,char** arg) //打开文件
{
char *name=filename(argc,arg);
fp = fopen(name,"r");
}
- 统计行数
void LineCount(int argc,char** arg,char* filename) //统计行数
{
char c;
openfile(argc, arg);
while(!feof(fp))
{
c=fgetc(fp);
if(c=='\n')
{
hang_num++;
}
}
FILE* fp1 = fopen( filename,"a+");
fprintf( fp1,"行数%d\n",hang_num+1);
fclose(fp);
fclose( fp1 );
}
- 统计字符
void CharCount(int argc,char** arg,char* filename) // 统计字符
{
char c;
openfile(argc, arg);
while(!feof(fp))
{
c=fgetc(fp);
if(c!='\n')
{
number++;
}
}
FILE* fp1 = fopen( filename,"a+");
fprintf( fp1,"字符数%d\n",number);
fclose(fp);
fclose( fp1 );
}
- 统计单词
void WordCount(int argc,char** arg,char* filename ) //统计单词
{
char c;
openfile(argc, arg);
while(!feof(fp))
{
c=fgetc(fp);
if( c == '\n' || c == ' ')
{
count++;
}
}
FILE* fp1 = fopen( filename,"a+");
fprintf( fp1,"词数%d\n",number);
fclose(fp);
fclose( fp1 );
}
- 显示顺序与输入参数的次序无关
void handle(int argc,char** arg)
{
int i=1;
char* filename ="result.txt";
bool IshaveParameter[10]={false};
for(i = 1;i < argc; i++)
{
if(!strcmp(arg[i],"-w"))
{
IshaveParameter[0]=true;
}
else if(!strcmp(arg[i],"-c"))
{
IshaveParameter[1]=true;
}
else if (!strcmp(arg[i],"-l"))
{
IshaveParameter[2]=true;
}
}
for(i = 1;i < argc; i++)
{
if(!strcmp(arg[i],"-o"))
{
filename = arg[ i + 1 ];
}
}
for(i = 0;i < argc;i ++ )
{
if(i==0&&IshaveParameter[i]==true)
{
CharCount(argc, arg,filename);
}
else if(i==1&&IshaveParameter[i]==true)
{
WordCount(argc, arg,filename);
}
else if(i==2&&IshaveParameter[i]==true)
{
LineCount(argc, arg,filename);
}
}
}
8. 程序测试
- 涉及多项统计,如同时需要统计字符、单词和行数,则按照字符-->单词-->行数-->代码行数/空行数/注释行的顺序,依次分行显示。
-
显示顺序与输入参数的次序无关。
-
生成文件result.txt:
-
例如:
wc.exe -l -w -c file.c,则统计file.c中的字符数和行数,输出结果保存在result.txt中,内容格式如下:
-
9. 总结
- 对于这次小项目,比我想象的要复杂的多,对于整个开发流程不熟悉,开始没有把时间分配好,导致后期大量的时间花在需求以及调试上面;对于程序来说,难度不是太大,主要是学习了很多的编程开发工具和习惯,让我真正体会到了软件开发绝对不仅仅是写代码。(没写说明文档,我上午写的,下午自己都不知道是什么东西了,还有为了节省时间,没有写单元测试,导致后面改错花了数倍于测试的时间,很难受......)