第2周个人作业:WordCount

github地址

https://github.com/HastingsX/SoftwareTest

PSP表格

PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 1
· Estimate · 估计这个任务需要多少时间 10 1
Development 开发 730 890
· Analysis · 需求分析 (包括学习新技术) 60 60
· Design Spec · 生成设计文档 20 30
· Design Review · 设计复审 (和同事审核设计文档) 10 10
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
· Design · 具体设计 30 60
· Coding · 具体编码 480 540
· Code Review · 代码复审 60 60
· Test · 测试(自我测试,修改代码,提交修改) 60 120
Reporting 报告 120 150
· Test Report · 测试报告 100 120
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10 20
合计 860 1050

解题思路

先读取在命令行输入的参数来判断进行哪些操作,通过循环和if语句得到相关信息,然后将文件内的字符数、单词数、行数、代码行/空行/注释行一并统计出来,根据参数选择性输出到结果文档内。

查阅资料:

  1. java main方法参数传递(http://blog.csdn.net/docuxu/article/details/73604038)
  2. Java实现词频统计(Wordcount)-Map或Hashtable的value排序 (http://blog.csdn.net/qy20115549/article/details/52784926)
  3. Java一次读取文本文件所有内容(http://www.cnblogs.com/longronglang/p/7458027.html)
  4. String使用equals和==比较的区别(http://blog.csdn.net/andyzhaojianhui/article/details/75176807)
  5. Java-IO之BufferedWriter(字符缓冲输出流)(http://blog.csdn.net/qq924862077/article/details/52740488)
  6. Java获取文件后缀名(http://www.cnblogs.com/henuyuxiang/p/7485834.html)
  7. Java使用递归找出某目录下的所有子目录以及子文件(http://www.cnblogs.com/wangtianze/p/6690644.html)
  8. java获取指定文件夹下的所有文件名 (http://blog.csdn.net/aa8568849/article/details/52670133)

程序设计实现过程

一个类(Main类),三个函数(main函数,getAllFilePaths函数和scan函数)。

main函数首先先通过读入参数判断要进行哪些操作,统计是否要用到停用词表,统计结果是否有指定的输出文件名,然后判断是对一个文件进行统计还是利用getAllFilePaths函数对一个目录下符合条件的文件进行统计,这些都通过if语句来判断分别进行不同的操作,把要统计的文件名或路径存入一个String数组,通过循环依次对指定的文件使用scan函数进行统计,将统计结果合成一个字符串(String),一次性写入到结果文件中。

在完成基本功能字符统计,单词数统计,行数统计后git推送一次;完成扩展功能递归处理目录下符合条件的文件,返回代码行、空行、注释行,采用停用词表进行统计后git推送一次,后为完善功能,修复bugs而推送多次。

代码数码

scan方法中将文件按行读入,分行处理。

有关字符统计和单词统计的代码如下:

InputStreamReader isr = new InputStreamReader(new FileInputStream(path));
BufferedReader br = new BufferedReader(isr);
......
String str=null;int flagex=0,j=0;
while((str=br.readLine())!=null){
    char[] chars=str.toCharArray();
    for( i=0;i<chars.length;i++) {//统计每行字符数并加到字符总数里
        numChar++;
    }
    numChar++;//添上每行最后的换行符
    String[] tmp= str.split(" |,");//以空格或英文逗号分隔开每个单词
	for(i=0;i<tmp.length;i++){
        if(tmp[i].length()!=0){
            if(extraList.size()!=0){//假如使用了停用词表
				flagex=0;
				for(j=0;j<extraList.size();j++) {
                    if (tmp[i].equals(extraList.get(j))){
                        flagex = 1;//这个存在于停用词表内,将flagex置1
                        break;
                    }
                }
                if(flagex!=1) {//只统计不在停用词表里的单词
                    numWord++;
                }
            }
            else{
                numWord++;
            }
        }
    }
    ......
numChar--;//减去最后一行不存在的换行符

与“-s”功能相关的读取目录及子目录下所有文件的代码如下:

//获取当前目录和子目录下所有文件
public static ArrayList<String> getAllFilePaths(File filepath,ArrayList<String> filePaths){
	File[] array=filepath.listFiles();
	if(array==null)
		return filePaths;
	for(File f:array){
		if(f.isDirectory()){//递归读取子目录下内容
			filePaths.add(f.getPath());
			getAllFilePaths(f,filePaths);
		}
		else{
			filePaths.add(f.getPath());
		}
	}
	return filePaths;
}

判断行性质的代码因为过长而进行文字说明:假如一行不超过一个可显示字符,则它是空行,假如它有只两个字符且该行是“//”或“/*”,则是注释行,假如它有三个或三个以上字符,假如它是以“{//”或“{/*”或“}//”或“}/*”开头,则他是注释行,剩下的情况都是代码行。

测试设计过程

测试中风险最高的地方在单词数的统计,代码行、空行、注释行的统计,因为这这些地方的代码较为复杂,与其它较为简明的地方相比更易出错。

设计测试用例的思想是是没一个判断语句执行一遍,实现条件覆盖,更进一步,尽量让每一个判断语句在是或否的情况下都执行一遍,实现语句覆盖。

设计10个测试用例。

编写的测试脚本"test.bat"内容如下:

wc.exe -a a.c
wc.exe a.c
wc.exe -c *.c
wc.exe -o
wc.exe a.c -o
wc.exe -s -c -w -l -a *.c -out0.txt
wc.exe -s -c -w -l -a *.c -e b.c -o out1.txt
wc.exe -c -w -l -a a.c out2.txt
wc.exe -c -w -l -a a.c -e b.c -o out3.txt
wc.exe -c -w -l -a a.c -e -o 

文件“a.c”内容如下:

a bc  a,c,,c ,a
//a
/*a */
/*a b

c
*/
/*
*/
{//
}//

文件”b.c“内容如下:

abc bc ad

这些测试用例基本符合了需求 。

参考文献

  1. java main方法参数传递(http://blog.csdn.net/docuxu/article/details/73604038)
  2. Java实现词频统计(Wordcount)-Map或Hashtable的value排序 (http://blog.csdn.net/qy20115549/article/details/52784926)
  3. Java一次读取文本文件所有内容(http://www.cnblogs.com/longronglang/p/7458027.html)
  4. String使用equals和==比较的区别(http://blog.csdn.net/andyzhaojianhui/article/details/75176807)
  5. Java-IO之BufferedWriter(字符缓冲输出流)(http://blog.csdn.net/qq924862077/article/details/52740488)
  6. Java获取文件后缀名(http://www.cnblogs.com/henuyuxiang/p/7485834.html)
  7. Java使用递归找出某目录下的所有子目录以及子文件(http://www.cnblogs.com/wangtianze/p/6690644.html)
  8. java获取指定文件夹下的所有文件名 (http://blog.csdn.net/aa8568849/article/details/52670133)
posted @ 2018-03-18 22:36  拾英  阅读(191)  评论(2编辑  收藏  举报