Github项目地址:https://github.com/z472/code_all/blob/master/test1.cpp
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
0 |
· Estimate |
· 估计这个任务需要多少时间 |
四天 |
五天 |
Development |
开发 |
|
|
· Analysis |
· 需求分析 (包括学习新技术) |
360 |
780 |
· Design Spec |
· 生成设计文档 |
0 |
0 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
0 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
0 |
· Design |
· 具体设计 |
60 |
120 |
· Coding |
· 具体编码 |
480 |
720 |
· Code Review |
· 代码复审 |
240 |
360 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
360 |
360 |
Reporting |
报告 |
60 |
未知 |
· Test Report |
· 测试报告 |
0 |
0 |
· Size Measurement |
· 计算工作量 |
0 |
0 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 |
120 |
合计 |
|
1620 |
2460 |
解题思路:最初觉得命令行就用C的那个命令行参数来做,然后查了很多的windos下C目录操作,因为不会-s的all内容(最难搞懂的是---在知道当前目录时怎么获取它目录下的文件路径的问题),主要是查找对目录操作的内容,看了别人的具体写法,模仿着写的。
设计实现:边写边分析怎么调用使得代码整洁,觉得函数不多,就没画调用关系图。具体的就是在主函数里写了-s的模式,其他的都是给其他函数传个文件名就可以,但是-s要获取当前的路径所有符合条件的文件,就特例化编写了。
代码说明:-s:思路就是利用C目录操作,在给到的目录,进入它的子目录,就通过在路径字符串之后加' \\* ' 。然后通过_findfirst()返回子目录的唯一的文件句柄,并存到一个结构体地址data中,文件结构体data中的attrib属性可以区别,文件是文件夹(目录)还是其他普通文件。进行不同处理。普通文件就可以通过C++中的string类,对字符串进行处理很好做。对目录就要递归,也是用string类的函数处理很好做。
-a: 就是具体情况,具体分析。设想很多可能情况。.c文件是有它自己特点的。比如说注释写法,还有双引号符号什么的都是成对存在的,不是随意的文本文件。写的思路就是一个外循环来利用fgetc(fp)函数遍历文件的字符。外循环的关键量是linec_sum来记录“一行”(一行是不出现意外的情况)的可见字符数,如果在大循环中遍历到了特殊的字符比如注释的‘ / ’就分类处理,其中就加入了内循环来遍历字符判断是否换行(因为/* */ 的关系),或是注释何时截指,截指后对注释行数量的增加,而且又要不处理注释中的内容,就略过遍历它们。后来看题目中有即使代码行又是注释行的情况,就添加对发现注释之前的linec_sum>1的条件,对代码行加一。还有双引号(c中常用的字符串等用到)问题。就双引号如果像是printf("/*");情况,就不能当成是注释行,就先发现一个双引号然后写内循环,使得双引号内的字符内容封闭起来,也是略过遍历方法。-a时间不够了,空白行是外循环的linec_sum<=1且遍历到‘ \n ’时
,增加一行。但是无法处理最后一行仅有' } '的情况。
测试运行:-s的最大问题就是测试运行,因为我发现C目录操作函数就获取当前目录函数getcwd() ,在编译器内执行的窗口和在DOS执行的结果完全不一样,我是看着编译器走的前半程,后来才发现,耽误了好多时间。
-a的测试不多,但是就在代码说明的几个细节都测试了,问题还没改过来(空白行也是文件结尾那个)
项目小结:psp使用不熟练,其中字眼看不懂,没有很多步骤,下次需要重视去做好。
来源:https://www.cnblogs.com/s1mplelectronic/p/12563617.html