1.Github作业地址
https://github.com/Luozhixuan/wordcount
2.PSP表格
PSP2.1 | PSP 阶段 | 预估耗时 (分钟) | 实际耗时 (分钟) |
---|---|---|---|
Planning | 计划 | 60 | 90 |
· Estimate | · 估计这个任务需要多少时间 | 300 | 600 |
Development | 开发 | 300 | 600 |
· Analysis | · 需求分析 | 60 | 60 |
· Design Spec | · 生成设计文档 | 50 | 30 |
· Design Review | · 设计复审 | 30 | 0 |
· Coding Standard | · 代码规范 | 40 | 600 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 240 | 360 |
· Code Review | · 代码复审 | 60 | 120 |
· Test | · 测试 | 40 | 120 |
Reporting | 报告 | 30 | 30 |
· Test Report | · 测试报告 | 10 | 5 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 480 | 600 |
3.解题思路
- 上周发布题目的的时候我只是大致看了下,觉得有些复杂,所以就先去完成其他的作业了,过了几天真正开始做这个任务。我刚开始准备用c语言完成这个作业,但是好像周围的同学都是用的java,我觉得用相同的语言,在开发过程中出了问题可以一起讨论,能节省好多时间。但是因为好久没使用java了,所以都写到了一个类里面。首先,我觉得这个任务最主要的功能是解析args函数的参数,因为java没有像c/c++那样的类似scanf的函数,因此需要写一个解析args数组参数的函数。参考链接如下:
http://blog.csdn.net/baidu_28236027/article/details/52471094
http://blog.csdn.net/qq_24877569/article/details/51931337
- 其次,就是对输入的文件进行计算单词数,字符数,行数,按行读入字符,字符的长度即是字符的个数,再通过判断前后的字符关系来判断单词数,按行读入依次计数来表示行数。再通过每行的内容及正则表达式来判断是代码行、注释行或是空行。参考链接如下:
https://www.cnblogs.com/hgcrown/p/5311155.html
- 最后创建一个result.txt文件,通过解析参数的结果来判断如何输出,将输出写入result.txt文本中。
- 因为java不会自动生成.exe文件,因此需要下载一个exej4软件来先将代码打包成.jar文件,再打包成.exe文件,在我的电脑上点击这个.exe文件会产生错误,但是不影响输出,这个情况到现在我还没解决。
但是能在命令行中使用此exe文件,由于时间比较紧,我还没找出我的电脑缺少的组件。参考链接:
https://jingyan.baidu.com/article/2a138328f3e2b0074a134ffe.html
4.程序设计实现过程
只有一个wordcount类
函数:main:主函数,包含args的初步解析并通过解析的结果选择要输出的内容,具体实现方面在上述解题思路中已经体现。
error函数:当差找不到正确地文件时,向用户反馈错误。
5.代码说明:
package word; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; import java.io.FileWriter; public class WordCount { public static void main(String[] args) throws Exception { //解析args数组中的参数 try { if (args.length == 0) { //提示未输入参数 System.out.println("请输入参数"); return; } String name =args[args.length-1]; //默认args数组中的最后一个参数为读取文件 //定义各个记录项 int Char = 0; int word = 0; int line = 0; int emptyline = 0; int codeline = 0; int explainline =0; int flag = 0; String output="result.txt"; String except= null; String next = System.getProperty("line.separator"); //将行分隔符传入str for(int m=0;m<args.length-1;m=m+1){ if(args[m].equals("-o")) { output=args[m+1]; } if(args[m].equals("-e")) { except=args[m+1]; } } FileInputStream fis = new FileInputStream(name); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); while(br.read()!=-1) //read()=-1代表数据文件读取完毕 { String s = br.readLine();//按行读取 Char += s.length();//字符个数就是字符长度 if (s.length()==0) emptyline++; String[] aa=s.split(" |,"); line++; if(line>1){Char++;} for (int i = 0 ; i <aa.length ; i++ ) { if(!(aa[i] == null || aa[i].isEmpty())) {word=word+1; flag=flag+1; if(!(except==null||except.isEmpty())) { FileInputStream ff = new FileInputStream(except); BufferedReader bc = new BufferedReader(new InputStreamReader(ff)); String ss = bc.readLine(); String[] bb=ss.split(" "); for(int k=0;k<bb.length;k++) { if(aa[i].equals(bb[k])) {word--;} } } } if(aa[i].equals("//")) {explainline=explainline+1;} } if(flag>1) codeline=codeline+1; flag=0; } //每次输出中都会将输出文本文件清空,重新写入计算结果 FileWriter fw = new FileWriter(output); for(int m=0;m<args.length-1;m++) { if (args[m].equals("-c")){ fw.write(name+",字符数: "+Char); fw.write(next); } if (args[m].equals("-w")){ fw.write(name+",单词数: "+word);fw.write(next); } if (args[m].equals("-l")) {fw.write(name+",行数: "+line);fw.write(next);} if(args[m].equals("-a")) { fw.write(name+",代码行数: "+codeline);fw.write(next); fw.write(name+",空行数: "+emptyline);fw.write(next); fw.write(name+",注释行: "+explainline);fw.write(next); } } fw.close(); br.close();//关闭文件流 } catch(FileNotFoundException e){ System.out.println("未找到文件,请输入正确文件名!"); } } }
6.测试设计过程
- 测试过程对于每一项功能进行单元测试,再进行组合测试,确保覆盖了所有可执行的代码,总共设计10个测试用例:
wc.exe 输出:请输入参数
wc.exe asdasd 输出:未找到文件,请输入正确文件名!
wc.exe -c test.txt ./test.txt, 字符数: 30
wc.exe -w test.txt ./test.txt, 单词数: 2
wc.exe -l test.txt ./test.txt, 行数: 1
wc.exe -o abc.txt 生成abc.txt文件
wc.exe -a test.txt ./test.txt, 代码行/空行/注释行: 1/0/0
wc.exe -w -c test.txt ./test.txt, 字符数: 30
./test.txt, 单词数: 2
wc.exe -w -c -l test.txt ./test.txt, 字符数: 30
./test.txt, 单词数: 2
./test.txt, 行数: 1
wc.exe -a -c -w -l test.txt ./test.txt, 字符数: 30
./test.txt, 单词数: 2
./test.txt, 行数: 1
./test.txt, 代码行/空行/注释行: 1/0/0
在命令行中运行结果基本正确,本代码未实现文件夹遍历功能,因此没有设计这样的测试用例,之后会继续完善该代码从而修改本博客。
上述测试所用文本文件在所给github地址中,读者可按照上述例子给出更多测试用例进行测试。
7.心得或体会
本次作业给我最大的感受就是时间较为紧迫,在实现的过程中遇到了不少坎坷,比如java环境配置过程中缺少组件、对java语言的不熟悉、上传到github中是git使用权限受阻、jar文件打包过程中生成的exe文件只能用命令行打开等,就不说遇到的其他bug了,最终还是学习到了一些东西,对后续的学习应该有所帮助。