1.Github地址
https://github.com/JingzheWu/WordCount
2.PSP表格
PSP2.1 | PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning | 计划 | 20 | 15 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | 500 | 680 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 70 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 20 | 20 |
· Coding | · 具体编码 | 300 | 420 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 40 | 60 |
Reporting | 报告 | 90 | 90 |
· Test Report | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 |
10 | 15 |
合计 | 610 | 785 |
3.解题思路
看到题目之后,大致设想了一下解题过程,先实现基本功能,再实现扩展功能,通过I/O流读取带计数文件内容,然后分别统计字符数、单词数以及行数,在设计基础功能时,统计单词数是通过空格和逗号来计算的,但是到后面有个停用词表,所以前面设计的这个方法就不能使用了,需要用到编译原理里面的词法分析的知识。由于很长时间没有写过java程序,好多知识都忘记了,实现的时候,没有设计多个类来实现,而是把这些功能放在了一个文件里,也没有进行封装,看起来有点乱。由于时间有限,到后面发现这个问题之后,也没有时间来重构代码了,所以准备在下次作业时再进行代码重构。
4.程序设计实现过程
程序通过先读取命令字符串,split函数分割,获得参数列表以及文件名等字符串,再根据文件路径读取文件,用I/O流来读取文件内容,调用BufferedReader实例的readLine方法,一次读取文件的一行,然后一行一行进行处理。
5.代码说明
变量定义
int charNum=0;//字符数 int wordNum=0;//单词数 int lineNum=0;//行数 int codeLineNum=0;//代码行数 int emptyLineNum=0;//空行数 int commentLineNum=0;//注释行数 boolean isEmpty=false; Scanner scanner=new Scanner(System.in); String cmd;//获取输入的命令字符串 String preCmd;//命令前缀,即wc.exe ArrayList<String> parameter=new ArrayList<>();//命令参数列表 String filePath;//程序设计语言源文件,即input_file_name
获取参数
while (true) { cmd=scanner.nextLine(); preCmd=cmd.split(" ")[0]; if (preCmd.equals("wc.exe")){ break; }else { System.out.println("命令有误,请重新输入!"); } } for (int i=1,cmdLen=cmd.split(" ").length;i<cmdLen-1;i++){ parameter.add(cmd.split(" ")[i]); } filePath=cmd.split(" ")[cmd.split(" ").length-1];
读取文件并处理
FileInputStream fileInputStream=new FileInputStream(filePath); InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream); BufferedReader bufferedReader=new BufferedReader(inputStreamReader); String lineStr=bufferedReader.readLine(); while (lineStr==null){ emptyLineNum++; lineStr=bufferedReader.readLine(); } while (lineStr!=null){ isEmpty=false; charNum=charNum+lineStr.length(); String[] charArr=lineStr.split(""); int index=0; while (charArr[index].equals(" ")||charArr[index].equals(",")){ index++; if (index==lineStr.length()){ break; } }//去掉该行第一个非空格非逗号字符前的空格和逗号 if (!(index==lineStr.length())){ wordNum++; }else { emptyLineNum++; isEmpty=true; } if (lineStr.length()-index==1&&(charArr[index]=="{"||charArr[index]=="}")){ emptyLineNum++; isEmpty=true; }//如果该行只有一个“{”或者“}”,则算作空行 int index2=index; for (;index<charArr.length;index++){ if ((charArr[index].equals(" ")||charArr[index].equals(","))&&(!(charArr[index-1].equals(" ")||charArr[index-1].equals(",")))){ wordNum++; } } if (!isEmpty){ boolean commentFlag1=charArr[index2].equals("/")&&charArr[index2+1].equals("/"); boolean commentFlag2=charArr[index2].equals("/")&&charArr[index2+1].equals("*"); boolean commentFlag3=charArr[index2].equals("*")&&charArr[index2+1].equals("/")&&((index2+2==charArr.length)||(charArr[index2+2].equals(" "))); if (commentFlag1||commentFlag2||commentFlag3){ commentLineNum++; }else { codeLineNum++; } } lineNum++; lineStr=bufferedReader.readLine(); if (lineStr==null){ emptyLineNum++; lineStr=bufferedReader.readLine(); } }
6.测试设计过程
wda dad 提示命令有误,重新输入 wc.exe -c qweqwe.asd 提示文件不存在 wc.exe test.c 提示请输入参数 wc.exe -c test.c 输出待测试文件字符数,并存储到result.txt文件中 wc.exe -w test.c 输出待测试文件单词数,并存储到result.txt文件中 wc.exe -l -w -c test.c 输出待测试文件行数、单词数、字符数,并存储到result.txt文件中 wc.exe -w -c test.c -o output.txt 输出待测试文件单词数、字符数,并存储到output.txt文件中 wc.exe -a test.c 输出待测试文件代码行数、空行数、注释行数,并存储到result.txt文件中 wc.exe -s *.c 提示功能开发中 wc.exe -w test.c -e stop.txt 输出待测试文件中除去停用词表单词后的单词数,并存储到result.txt文件中
7.参考文献链接
http://blog.****.net/ycy0706/article/details/45457311