Github地址:
https://github.com/hddddd/Wordcount
1.PSP表格
PSP2.1 |
PSP阶段 |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
45 |
· Estimate |
· 估计这个任务需要多少时间 |
15 |
20 |
Development |
开发 |
1000 |
900 |
· Analysis |
· 需求分析 (包括学习新技术) |
150 |
200 |
· Design Spec |
· 生成设计文档 |
30 |
45 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
45 |
60 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
70 |
40 |
· Coding |
· 具体编码 |
700 |
900 |
· Code Review |
· 代码复审 |
150 |
200 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
300 |
100 |
Reporting |
报告 |
150 |
90 |
· Test Report |
· 测试报告 |
50 |
40 |
· Size Measurement |
· 计算工作量 |
10 |
20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
合计 |
2800 |
3000
|
2、解题思路
逐行读取文件代码,通过正则表达式逐个处理最后相加。
3.程序设计实现过程
本项目采用JAVA语言实现,除主函数外,还有多个自定义函数共同组成。
4、关键代码:
此处引用成建伟同学的代码。
字符数、单词数和行数
while((line=br.readLine())!=null) { linecount++; sb.append(line); charcount+=line.length(); String[] split = line.split("\\s++|\\.|,|\\;|\\(|\\)|\\[|\\]|\\<|\\>|\\=|\\-|\\+|\\*|\\/|\\{|\\}"); //设置单词划分的要求 for (int i = 0; i < split.length; i++) { // 获取到每一个单词 Integer integer = map.get(split[i]); // 如果这个单词在map中没有,赋值1 if(null==integer){ map.put(split[i], 1); }else{ // 如果有,在原来的个数上加上一 map.put(split[i], ++integer); } } } // 遍历,根据key获取所对应的value Set<String> keySet = map.keySet(); for (String string : keySet) if(!(string.equals("")))//测试时候发现,去除不了多个空格的要求 wordcount+=map.get(string);
此处引用成建伟同学的代码。
扩展功能
//统计代码行/空行/注释行 while ((line = br.readLine()) != null) { line = line.trim(); if (line.matches("^[//s&&[^//n]]*$")||line.equals("{")||line.equals("}")) { /* 空行 :本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”*/ whiteLines++; } /* 本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释: * }//注释 */ else if (line.startsWith("/*") && !line.endsWith("*/")|| ((line.startsWith("{/*")||line.startsWith("}/*"))&&!line.endsWith("*/"))){ // 判断此行为"/*"开头的注释行 commentLines++; comment = true; } else if (comment == true && !line.endsWith("*/") &&!line.startsWith("*/")) { // 为多行注释中的一行(不是开头和结尾) notLine++;//虚假的注释行计数 commentLines++; } else if (comment == true && (line.endsWith("*/")||line.startsWith("*/"))) { // 为多行注释的结束行 commentLines++; comment = false; } else if (line.startsWith("//")|| line.startsWith("}//")||line.startsWith("{//")|| ((line.startsWith("{/*") ||line.startsWith("}/*")||line.startsWith("/*")) && line.endsWith("*/"))) { // 单行注释行 commentLines++; } else { // 正常代码行 normalLines++; }
5.测试设计过程:
在wc.exe的目录下放置测试文件,分别输入以下命令:
1. wc.exe -w -c -l test.c
2. wc.exe -w -c D:\test\test.c
3,wc.exe -w test.c -e stoplist.txt -o out.txt
4. wc.exe -a -c -l -w test.c -e stoplist.txt
5. wc.exe -a -c test.c -o out.txt
6. wc.exe -s -w test.c -e stoplist.txt
7. wc.exe -w -l D:\test\test.c -o out.txt
8.wc.exe -a -l -c -w test.c
9.wc.exe -l test.c -e stoplist.txt
10. wc.exe -s -w test.c -o out.txt
得到相应的测试结果。
6.心得体会:
本次作业量较大,但对自己的能力也是一种锻炼,学到了许多东西,受益匪浅,希望在以后的学习生活中能够继续努力。
参考文献链接:
http://www.cnblogs.com/jakejian/p/8613002.html
http://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html