个人项目
个人项目
github地址:https://github.com/GMloria/GGMYING/blob/master/%E4%B8%AA%E4%BA%BA%E9%A1%B9%E7%9B%AE.cpp
一,题目要求
Word Count 1. 实现一个简单而完整的软件工具(源程序特征统计程序)。 2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。 3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
二,项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
三,.基本功能实现
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的词的数目
wc.exe -l file.c //返回文件 file.c 的行数
四,.扩展功能实现
-s 递归处理目录下符合条件的文件。
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注
五,基本思路
拿到题目后,说实话有点懵,完全不知道如何下手,项目内容在刚开始也没有完全的理解,在熟读了项目要求以及在网上搜索了wc项目之后,对于需求有了一定的了解,由于目前我的能力较弱,还没有掌握其他高级的语言,所以决定用c语言写该项目,确定了语言之后,我开始逐个功能函数进行写代码,进行调试,在功能函数中,通过对库函数的资料查阅,知道了fgetc(),fclose()等函数的原理,通过多次测试最后得到了结果。
六,设计实现过程
七,代码说明
统计字符数函数代码:
int charnum(char *filename) //统计字符数 { FILE *fp; char ch; int numc=0; fp=fopen(filename,"r"); ch = fgetc(fp); while(ch != EOF) { numc++; ch=fgetc(fp); } printf("该文件的字符数为:%d\n",numc); fclose(fp); return 0; }
统计行数函数:
int linenum(char *filename) //统计行数 { FILE *fp; char lp; int linenum = 0; fp = fopen(filename,"r"); lp = fgetc(fp); while(lp != EOF) { if(lp == '\n') { linenum++; } lp = fgetc(fp); } linenum++; printf("该文件行数为:%d\n",linenum); fclose(fp); return 0; }
统计单词数函数:
int wordnum(char *filename) //统计单词数 { FILE *fp; char wp; int wordnum=0; fp = fopen(filename,"r"); wp = fgetc(fp); while (wp != EOF) { if((wp>='a'&&wp<='z') || (wp>='A'&&wp<='Z')) { wp = fgetc(fp); } else { wordnum++; wp = fgetc(fp); } } wordnum++; printf("该文件中单词数为:%d\n",wordnum); fclose(fp); return 0; }
主函数:
int main() { int countc=0; FILE *file; char filename[50]; printf("请输入将要查询的文件名:"); scanf("%s",filename); charnum(filename); linenum(filename); wordnum(filename); return 0; }
八,测试结果
可执行文件:
空文件:
只含一个字符:
只含有一个词的文件:
只含有一行的文件:
一个典型的源文件:(该个人项目源文件)
九,PSP表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 600 | 750 |
Development | 开发 | 240 | 300 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 120 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 10 | 15 |
· Coding | · 具体编码 | 420 | 500 |
· Code Review | · 代码复审 | 20 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 150 |
Reporting | 报告 | 100 | 150 |
· Test Report | · 测试报告 | 30 | 20 |
· Size Measurement | · 计算工作量 | 20 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 15 |
合计 | 1185 | 1415 |
十,收获
第一次像这样完成一个个人项目,真的收获了很多,也知道了很多以前不知道的知识,由于现在其他高级语言只是有点匮乏,没有用其他高级语言实现该项目,在深入理解其他高级语言的知识之后,会尝试着用其他语言编写该个人项目,在写代码的过程中也出现了一些问题,第一次编写进行运行时,无论输入什么文件,字符数以及行数和单词数都是不变的,当我把后缀名改为cpp之后,才有了正确答案,在此次项目中,我明显感觉自己的知识储备不足,很多项目可能完成不了,在今后的时间里,我会增加自己的知识储备,多学新知识。之后会利用其他语言进行wc操作的实现。