WordCount个人项目
项目码云地址:https://gitee.com/floweror/first_homework/tree/master/homework
1.项目需求
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
wc.exe [parameter] [input_file_name]
存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。
2.基本功能
wc.exe -c file.c //返回文件 file.c 的字符数(已实现)
wc.exe -w file.c //返回文件 file.c 的单词总数(已实现)
wc.exe -l file.c //返回文件 file.c 的总行数(已实现)
wc.exe -o outputFile.txt //将结果输出到指定文件outputFile.txt(未实现)
注意:
空格,水平制表符,换行符,均算字符。
由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
-c, -w, -l参数可以共用同一个输入文件,形如:wc.exe –w –c file.c 。
-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。
3.项目psp表格
PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
60 | 100 |
· Estimate |
· 估计这个任务需要多少时间 |
两天 | 一天半 |
Development |
开发 |
一天 | 一天 |
· Analysis |
· 需求分析 (包括学习新技术) |
180 | 240 |
· Design Spec |
· 生成设计文档 |
50 | 60 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 | 30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 | 60 |
· Design |
· 具体设计 |
100 | 120 |
· Coding |
· 具体编码 |
240 | 260 |
· Code Review |
· 代码复审 |
30 | 50 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 | 60 |
Reporting |
报告 |
140 | 100 |
· Test Report |
· 测试报告 |
50 | 30 |
· Size Measurement |
· 计算工作量 |
40 | 60 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 | 60 |
4.代码分析
(1)主函数分析:在主函数中分别调用统计字符函数,统计单词数函数,统计行数函数,用switch语句获得用户输入的操作
关键代码如下:
while(1){ printf("请输入用户命令:wc.exe-"); scanf("%s",&input); switch(input){ case 'c': printf("请输入文件名:"); scanf("%s",&File); charcount=CharCount(File); printf("文件的字符数为:%d\n",charcount); break; case 'w': printf("请输入文件名:"); scanf("%s",&File); wordcount=WordCount(File); printf("文件的词数为:%d\n",wordcount); break; case 'l': printf("请输入文件名:"); scanf("%s",&File); wordcount=WordCount(File); printf("文件的行数为:%d\n",wordcount); break; default:exit(0); break; } }
(2)统计字符函数
char charnum; //查询文件 FILE *pf=NULL;//定义一个文件指针 遍历文件 int ccount=0; pf=fopen(file,"r");//只以读的方式打开文件 if(pf==NULL){ printf("寻找文件失败\n"); exit(-1); } //统计字符数 charnum = fgetc(pf);//文件指针pf指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节 while(charnum!=EOF){ charnum = fgetc(pf); ccount++; } fclose(pf);//关闭文件
(3)统计单词数函数
FILE *pf=NULL; pf=fopen(file,"r"); if(pf==NULL){ printf("寻找文件失败\n"); exit(-1); } charnum = fgetc(pf); while(charnum!=EOF){ if(charnum>='a'&&charnum<='z'||charnum>='A'&&charnum<='Z'||charnum>='0'&&charnum<='9'){ while(charnum>='a'&&charnum<='z'||charnum>='A'&&charnum<='Z'||charnum>='0'&&charnum<='9'||charnum=='_'){ charnum=fgetc(pf); } wcount++; charnum=fgetc(pf); } charnum=fgetc(pf); } fclose(pf);
(4)统计行数函数
FILE *pf=NULL; int lcount=0; pf=fopen(file,"r"); if(pf==NULL){ printf("寻找文件失败\n"); exit(-1); } charnum = fgetc(pf); while(charnum!=EOF){ if(charnum=='\n'){ lcount++; charnum = fgetc(pf); } else{ charnum = fgetc(pf); } } fclose(pf); return lcount+1;
5.测试结果
6.心得体会
这是我的第一篇博客,按照老师的要求把代码传到了码云上面去,了解了许多课堂之外的东西。刚开始我本来是想用java语言来实现这个功能,但是经过一番尝试之后,
还是觉得这几个基本的功能用C语言来实现是最简单的,只需要熟悉C语言文件操作以及某些函数对字符的操作就可以了。经过这个项目,我重新回顾了一边C语言并且第
一次使用C语言操作本地的目录文件,同时也将上课的内容转变成了行动,完成了一个项目从0到1的过程,从预估,尝试,设计,发开,测试过了一遍简单的软件开发流程。
7.参考文件链接
(1)C语言文件操作函数大全:https://blog.csdn.net/weibo1230123/article/details/79110542
(2)参考代码:http://www.cnblogs.com/abc123def456/archive/2018/09/15/9649762.html