github地址:
https://github.com/DouglasLee001/softTest
一.PSP表格
PSP2.1 | PSP阶段 | 预估耗时 (分钟) | 实际耗时 (分钟) |
Planning | 计划 | 10分钟 | 20分钟 |
· Estimate | · 估计这个任务需要多少时间 | 2天 | 1天 |
Development | 开发 | 1天 | 1天 |
· Analysis | · 需求分析 (包括学习新技术) | 0.5天 | 1天 |
· Design Spec | · 生成设计文档 | - | - |
· Design Review | · 设计复审 (和同事审核设计文档) | - | - |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20分钟 | 20分钟 |
· Design | · 具体设计 | 2小时 | 3小时 |
· Coding | · 具体编码 | 0.5天 | 10小时 |
· Code Review | · 代码复审 | 0.5天 | 0.5天 |
· Test | · 测试(自我测试,修改代码,提交修改) | 0.5天 | 0.5天 |
Reporting | 报告 | 30分钟 | 30分钟 |
· Test Report | · 测试报告 | 30分钟 | 1小时 |
· Size Measurement | · 计算工作量 | 2小时 | 1小时 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 1小时 | 0.5小时 |
合计 | 6天 | 4天半 |
二.解题思路
1.首先这个作业是需要在控制台进行操作的,所以在编写程序时应该从main函数的args[]中传入参数
2.其次这个作业的基本要求是要统计出字符数,行数,单词数以及要能指定输出文件夹,
(1)因此对于字符数可以选择直接将每一行的内容存在一个string里面,用length()函数读出,并且需要注意的是,因为换行是算字符的,因此需要加上行数-1;
(2)对于行数可以选择将内容读进一个string的动态数组后统计动态数组的长度
(3)对于单词数目可以选择将每一行的内容存在一个string中,然后在每一行之间加上“ ”,最后用java自带的split函数将这个长字符串切分成短的string,每个string就是一个单词
3.作业的拓展功能是要实现停用词表和递归查找以及复杂的数据结构
(1)递归使用一下深搜就可以实现
(2)停用词表的实现可以使用一下set功能,查找一下对应的单词是否在set中
(3)注释行和空行,代码行的解决详见代码注释
4.至于最后打包成.exe文件可以参考:https://jingyan.baidu.com/article/2a138328f3e2b0074a134ffe.html
三.程序设计实现过程
private static void error(String err)报错函数
private static ArrayListfileContent(String filepath) 输入文件路径,并且返回这个路径下的每一行的内容,将每一行的内容放进一个string类型的动态数组
private static String[] cutToWord(String filePath)将文件中的每一行都加到一行中去,然后在行与行之间用空格隔开,最后将这一行字符串根据空格,"\t","\n"分开成一个字符串数组, 就是单词的集合
private static SetbanWord(String banlistFile)将所有的停用表中的内容放到一个set中去,既保证了不重复,又可以方便查询
private static int countWord(String str, SetbanWords)数单词的函数
private static int sumChar(String[] contents)数字符的函数
private static int[] lines(String[] contents)返回行数的函数
private static class Argstransit类:将命令行中输入的内容转换成对应类的参数
private static void confirm(String filepath)确定文件路径是否存在,如果不存在的话就创建一个加上去,用于创建输出文件的时候
private static void count(String filepath, Argstransit po, PrintWriter out)将信息放在Argstransit这个类中传递过来,再根据其上的内容信息来调用上面的各个函数
private static void findDownfiles(String dir,String filepath)递归寻找所有的文件
public static void main(String[] args) 主函数
四.代码说明
private static void findDownfiles(String dir,String filepath)
//递归寻找所有的文件, private static void findDownfiles(String dir,String filepath) {//作为深搜 File fp=new File(dir); for(File f :fp.listFiles()){ if(f.getName().matches(filepath)&&f.isFile()){//如果是一个文件,并且这个文件的名字和输入的名字相同,就插入但动态数组末尾 fls.add(dir+f.getName()); } else if(f.isDirectory())//如果是一个文件夹,那么就搜索下面的文件 findDownfiles(dir+f.getName()+"/",filepath); } }
private static int[] lines(String[] contents)
private static class Argstransit { Boolean c = false; Boolean w = false; Boolean l = false; Boolean s = false; Boolean a = false; Boolean o = false; Boolean e = false; String filePath; String outPath; String banPath; //int filepathNum=0; Argstransit(String[] args) { for (int i = 0; i < args.length; i++) { if(args[i].charAt(0) == '-' && args[i].length() < 3) { switch (args[i].charAt(1)) { case 'w': this.w = true;break;// 如下来判定是否有输入对应的内容 case 'l': this.l = true;break; case 's': this.s = true;break; case 'a': this.a = true;break; case 'c': this.c = true;break; case 'o': this.o = true; i++; if(i < args.length) { this.outPath = args[i];//o之后要紧跟着输出表 //File fp=new File(this.outPath); } else { error("未找到输出表");//如果“-o”之后就已经结束,那么就是没有输入输入表 this.o = false; } break; case 'e': this.e = true; i++; if(i < args.length) { File fp=new File(args[i]); if(!fp.exists()) error("未找到停用词表");//如果后面的内容不是一个已经存在的文件,那么就报错 else this.banPath = args[i];//e之后要紧跟着停用表 } else error("未找到停用词表");//如果-e之后后面没有内容了,就报错 break; default: break; } } else { this.filePath = args[i]; System.out.print(filePath); } } } }
private static int[] lines(String[] contents)
//返回linecount{代码行,空行,注释} private static int[] lines(String[] contents) { int[] linecount = {0, 0, 0}; for (String line : contents) { if(line.trim().length() <= 1) {//去掉了前后的空格,然后再统计总共有多少个字符,如果小于2就是空行 linecount[1]++; } else { if(!line.trim().contains("//")) { linecount[0]++;//如果没有"//"那一定是代码行 } else if(line.replaceAll(" ", "").indexOf("//") > 1) { linecount[0]++;//如果有"//",但是去掉了所有空格后发现"//"的位置在第三个或者之后,是代码行 } else if(line.contains("//")) { linecount[2]++;//否则是注释行,也就是"//"在第一个位置或者第二个位置 } } } return linecount; }
五.测试设计过程
对于java文件测试命令行设计:
java WordCount -c case1.c -o output1://针对没有空格没有换行的情况做的只统计字符数的“冒烟测试”java WordCount -c -l -w case1.c -o output2:针对输入中没有换行没有空格的所有基础功能测试java WordCount -c -l -w case2.c -o output3.txt://针对输入中含有空格的所有基础功能测试java WordCount -c -l -w case3.c -o 3.c -o output4.txt://针对输入中含有空格和换行的所有基础功能测试java WordCount -a case4.c -o output5.txt://针对(代码行 / 空行 / 注释行)的测试java WordCount -s -c case5.c -o output6.txt//:针对递归寻找文件“-s”的测试java WordCount -s -c -a case5.c -o output7.txt://针对递归寻找文件s功能和其他扩展功能如a,以及基本功能如c的集成的测试java WordCount -c -w -e stoplist.txt case6.c -o output8.txt://针对停用词表的测试java WordCount -c -w -l -s -a -e stoplist.txt case7.c -o output9.txt://针对所有的功能的测试java WordCount -c -w://对于没有文件名的测试java WordCount -c case10.c://对于文件名不存在的测试java WordCount -c case1.c -e://-e之后没有停用词表WordCount -c case1.c -e st.txt://停用词表不存在的情况java WordCount -c case1.c -o://输出符号“-o”之后没有紧跟输出文件位置
对应的测试结果在
github中BIN中的
output1.txt output2.txt output3.txt output4.txt output5.txt output6.txt output7.txt output8.txt output9.txt
六.参考链接
1.
2.
3.https://jingyan.baidu.com/article/2a138328f3e2b0074a134ffe.html
4.
5.
6.
7.少部分方法参考:,并在参考后重写