• 第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)
  • 相关阅读:
    数组删除元素注意事项
    点击下拉菜单以外的区域,关闭弹窗
    webpack学习笔记(六)优化
    webpack学习笔记(五)
    webpack学习笔记(四)
    webpack学习笔记(三)
    webpack学习笔记(二)
    es6 笔记
    vue学习笔记——组件的优化
    vue学习笔记——路由
  • 原文地址:https://www.cnblogs.com/zhiwei97/p/8598022.html
Copyright © 2020-2023  润新知