一、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.