一、github地址
https://github.com/CourierLo/WordCounter
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 20 |
Estimate | 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 600 | 720 |
Analysis | 需求分析 | 10 | 30 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 20 | 60 |
Coding Standard | 代码规范 | 20 | 20 |
Design | 具体设计 | 20 | 20 |
Coding | 具体编码 | 480 | 600 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 60 | 40 |
Test Report | 测试报告 | 20 | 10 |
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 20 |
Total | 合计 | 780 | 900 |
三、解题思路
①cmd运行exe嘛,可以从
int main(int argc, char * argv[])
中的argv[]获得用户想要的操作和路径。记录用户的操作用一个结构体FLAG就可以了,同理答案也用结构体存储。
②怎么统计各种数据?我的方法是先打开文件,一行一行地读入至缓冲区,再对缓冲区进行统计,具体算法看代码,我是暴力模拟的,没用到正则表达式。各类特殊情况在代码注释中已有说明。
③怎么递归文件夹中的所有文件?利用好FindFirstFile和FindNextFile函数生成出各个文件路径就好了,遇到文件夹则递归执行,要注意路径的构造,和各种类型的转换(麻烦!吃了大亏)
④图形用户界面给用户选择文件?调用WINDOWS API即可。同样地要处理类型之间的转化(just like TCHAR to CHAR, too trivial)。输出结果我直接用cmd显示了,cmd也算是图形界面?(滑稽)画也能画,比cmd还丑的图形界面就.......如果要好看还得用WINDOWS API画。
⑤处理通配符?两种思路:a. 截取用户输入路径中的文件后缀名,在递归查找函数中添加条件过滤其他文件(正则表达式处理之) b. 自己写一个文件后缀匹配函数,加上优秀的字符串匹配算法如KMP,时间复杂度优秀,可以但没必要。我采用前者的方式实现了。
⑥如果用户输入不符合规范怎么办?Well, 我只处理了部分.....用户可能有千奇百怪的输入......
总之知道怎么写之后查一查WINDOWS API就可以了。另外,类型转换稍有不慎害死人啊啊啊啊啊啊!!!
pay attention to this: 我的程序不支持/*注释的代码行统计,因为我发现我无法通过一般手段判断/*是否是字符串内容还是注释开头,如果有个人这么写代码的话
printf("""); /* putchar('"');
还有
printf("/*");
怎么判断???
四、设计过程
本次任务面向过程,没有任何对象。流程如下:(隐去如处理路径和统计数据的各种小细节)
//最最最重要函数如下 void dirList(const string& strPath); //递归遍历文件夹 bool getPathWin(TCHAR* filepath); //用户选定文件的图形界面 void display(); //输出函数 void countNum(char* filepath); //统计文本数据
五、测试运行
只需要测试递归-s及图形界面-x和各种命令的综合就可以测试完所有代码部分了。
①cmd输入"my project.exe" -s -a -l -c -w D:\测试\?.cpp
②cmd输入cmd输入"my project.exe" -s -a -l -c -w D:\测试\
综合①②可以得知countNum和dirList和通配符匹配没有问题。
③测试图形界面
选定文件后
④测试各种特殊文件,什么空文件,一个词、一行
⑤用OpenCppCoverage测试代码覆盖度?星期三晚上看看。
测试了一下,不带注释的情况下,递归,代码覆盖率如下:
如果加入大量注释代码覆盖率会上升。由于本程序不支持中文,注释造着累啊.....就不应该用C写的。
六、总结
由于很缺乏面向对象的编程经验,还是用老方法处理问题。项目中统计文本数据不难,难在处理各种异常输入、调用Windows API和处理文件路径上。大部分代码我用的C语言写的,由于C对UNICODE支持很不好,然后有些API又是用TCHAR类型的,用的是C++标准,处理中文和类型转换搞得心累。到最后该程序仅支持中文路径而不支持代码文本内中文的统计(代码文本中有中文会Down掉)。原本dirList是用char类型写的,结果程序一直不按输入的路径访问文件......后来用c++的string又莫名其妙地好了......总之有关文本统计的项目不要用C写!测试嘛,未完待续。
可以完善的地方有:支持中文文本;支持带空格的文件夹名字;搞个图形交互界面 etc.