Github项目地址:https://github.com/KenneyLourve/Li/blob/master/WC
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 15 | 15 |
· Estimate | · 估计这个任务需要多少时间 | 15 | 15 |
Development | 开发 | 505 | 775 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 80 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
· Design | · 具体设计 | 20 | 20 |
· Coding | · 具体编码 | 300 | 480 |
· Code Review | · 代码复审 | 20 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 85 | 95 |
· Test Report | · 测试报告 | 50 | 60 |
· Size Measurement | · 计算工作量 | 15 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 605 | 885 |
解题思路
题目描述
Word Count
1. 实现一个简单而完整的软件工具(源程序特征统计程序)。
2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
WC 项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:
wc.exe [parameter] [file_name]
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的词的数目
wc.exe -l file.c //返回文件 file.c 的行数
扩展功能:
-s 递归处理目录下符合条件的文件。(未实现)
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。(基本实现)
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
[file_name]: 文件或目录名,可以处理一般通配符。
高级功能:(未实现)
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
需求举例:
wc.exe -s -a *.c
返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。
设计实现过程
编程语言的选择:C
需要用到的新知识:文件操作函数、文件函数code的思路、文件函数的使用方式
结构分析:每个功能预设使用一个函数,不同功能调用不同函数。主函数实现调用和用户界面。
遇到的困难:
1.文件操作类的代码一窍不通,只能在不断的参考中快速学习,现学现用。在这个过程中发生了许多谬误,只能一一解决,所幸代码不算太长。
2.实现-a功能时候要考虑的内容太多样,比较耗费时间和心力,仍然感觉是不是少了什么。(可能这里就需要充分样本的测试吧)
代码说明
1. -c:计算文件字符数
在数据流中截取计算字符数。
void Letter(FILE *f) //Letters counting { int letter = 0, num = 0; while (!feof(f)) { letter = fgetc(f); if (letter == '\n') continue; num++; } printf("共有字符数 %d\n\n", num - 1); }
2. -l:计算文件行数
在-c的基础上,通过空行计算行数。
void Line(FILE *f) //lines counting { int letter = 0, line = 0,c=0; while (!feof(f)) { letter = fgetc(f); if (letter!=0)c=1; if (letter == '\n') line++; } if(c==1)line++; printf("共有行数 %d\n\n", line); }
3. -w:计算文件单词数
void Word(FILE *f) //words counting { int letter = 0, word = 0; int t = 0; while (!feof(f)) { letter = fgetc(f); if ((letter >= 'a'&&letter <= 'z') || (letter >= 'A'&&letter <= 'Z')) { if (t == 0) t = 1; }else { if (t == 1) { word++; t = 0; } else continue; } } printf("共有词数 %d\n\n", word); }
4. -a:计算文件空行、代码行和注释行
先判断是否为一整行,然后再分别统计不同类别的数目。
void ElseData(FILE *f) { int letter = 0, code = 0, emp = 0; char a[100]; int note = 0, mark = 0, notemark = 0; int i; while (!feof(f)) { letter = fgetc(f); if (mark == 0 || mark == 1) { if (letter == ' ') continue; else if (letter == '\n') { emp+=1; mark = 0; continue; } else if ((letter == '{' || letter == '}') && mark == 0) { mark = 1; continue; } else { if (letter == '/') mark = 2; else mark = 3; } } if (mark == 3) { while (!feof(f) && letter != '\n') letter = fgetc(f); mark = 0; code+=1; continue; } if (mark == 2) { while (!feof(f)) { letter = fgetc(f); if (letter == '/' && notemark == 0) notemark = 1; else if (letter == '*' && notemark == 0) notemark = 2; else if (letter == '*' && notemark == 2) notemark = 3; if (notemark == 1) { while (!feof(f) && letter != '\n') letter = fgetc(f); note+=1; mark = 0; notemark = 0; break; } if (notemark == 2) { while (!feof(f) && letter != '\n') letter = fgetc(f); note++; } if (notemark == 3 && letter == '/') { while (!feof(f) && letter != '\n') letter = fgetc(f); note++; mark = 0; notemark = 0; break; } else if (notemark == 3 && letter != '*') notemark = 2; } } } printf("共有:空行数 %d 代码行数 %d 注释行数 %d\n", emp, code - 1, note); }
程序运行
项目小结
现学现用,我经历了太多。感谢分享经验的前辈们,有学到很多,你们的思路打开了的我的思域。谢谢。