wc项目记录

1、Github项目地址:https://github.com/3116004700/ruanjiangongcheng
2、预估时间见PSP表格。
3、解题思路描述:
在看到这个项目的时候我就想到了利用java里面的IO流来实现这个项目,统计文件中的字符数、单词数、和行数,统计行数可以选择利用bufferreader来按行读出文件中的内容,设置一个变量来统计行数,直到整个文件全部读完;字符数可以通过字节流进行统计,相对来说也比较简单,这个项目相对而言难点我认为是对于单词的界定,究竟满足什么条件才算一个完整的单词,这是需要仔细考虑的,我最先想到的就是利用空格来界定单词,但是这种方法误差太大,不可能做到精确统计,然后就是想到了正则表达式,但是由于正则表达式之前没有接触过,对于我来说还是一个陌生的知识,这是需要我去学习的内容。
我的想法是先通过简单的逻辑判断大致上实现功能,然后通过对正则表达式的学习逐步实现相对而言比较精确的统计。
4、设计实现过程:
这个项目我分了两个类,一个是statistics类,里面有存放字符数、单词数、行数的变量以及相应统计字符数、单词数、行数的方法;另一个类是一个测试类,里面有一个测试的test方法和main函数,test方法功能就是对用户输入的文件路径、选择输出的内容进行判断,并且通过传参的方式将用户数据传到statistics类的方法中,main方法就是调用test方法,作为一个程序入口的存在。
5、代码说明:
主要的代码部分就是三个统计方法:
(1)统计字符数的方法-charSum()
设计思路:因为是要统计字符数,所以我选择采用字节流来完成这个方法,一个字符一个字符的读,读出一个判断一个,直到文件全部读完。
具体实现:

    int charSum(String fName){
    int flag;
    int num = 0;
    on_off = true;
    File file = new File(fName);
    FileReader fr = null;
    try {
        fr = new FileReader(file);//采用字节流读文件的内容
    } catch (FileNotFoundException e) {
        // TODO 自动生成的 catch 块
        //e.printStackTrace();
        System.out.println("文件路径输入有误");
        on_off = false;
    }
    if(on_off){
        try {
        while((flag=fr.read())!=-1){//读出一个字节便判断一下,只要不为空,num++
            num++;
        }
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        return num;
    }else{
        return -1;
    }
}

​ (2)统计单词的方法-wordSum()
设计思路:使用bufferreader缓冲流来读,按行读入,然后使用正则表达式进行单词的判断。
具体实现:

       int wordSum(String fName){
    on_off = true;
    int num = 0;
    String str = null;
    String s = "\\d+.\\d+|\\w+";//用来界定单词的通配符
    Pattern  pattern=Pattern.compile(s);  
    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(fName);
    } catch (FileNotFoundException e2) {
        // TODO 自动生成的 catch 块
        //e2.printStackTrace();
        System.out.println("文件路径输入有误");
        on_off = false;
    }
    if(on_off){
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        try {
            while((str = bufferedReader.readLine()) != null)
            {
                  Matcher  ma=pattern.matcher(str); 
                   while(ma.find()){ 
//                      if(num%10 == 0 &&num>1)System.out.println();
//                      System.out.print(ma.group()+" ");  //可以选择将所有的单词打印输出。
                        num++;
                    }  
            }
        } catch (IOException e1) {
            // TODO 自动生成的 catch 块
            e1.printStackTrace();
        } 
        return num;
    }else{
        return -1;
    }
}

​ (3)统计行数的方法-rowSum()
设计思路:这个方法相对来说比较简单,与wordSum()的读入方法相同,按行读入,每次读入时进行计数,直到全部的行全部读完。
具体实现:

  int rowSum(String fName){
    on_off = true;
    String flag = null;
    int num = 0;
    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(fName);
    } catch (FileNotFoundException e2) {
        // TODO 自动生成的 catch 块
        //e2.printStackTrace();
        System.out.println("文件路径输入有误");
        on_off = false;
    }
    if(on_off){
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        try {
            while((flag = bufferedReader.readLine()) != null)//对读入的每一行进行判断是否为空行,如果不是,则num++
            {
                num++;
            }
        } catch (IOException e1) {
            // TODO 自动生成的 catch 块
            e1.printStackTrace();
        }
        return num;
    }else{
        return -1;
    }

}

​ (4)其他代码的说明:
因为不是主要的实现代码,在这里简单的说明一下,就不贴出了,完整的源代码已经上传GitHub,链接地址开头已经给出。
除了以上的统计方法,源文件里还有一个choose()方法,这个方法的目的就是对用户的输入数据进行处理,通过参数的方式传到相应的方法中去,使得程序能够运行起来。还有一点就是choose()方法和三个主要的统计方法都写了异常处理机制,针对用户的输入数据不符合规范的问题,没有简单的抛出异常,而是通过提示用户输入有误,并且回调choose()方法使用户重新输入,增强了用户的体验。

6、测试运行:

测试文件:

(1)测试统计字符数:

(2)测试统计单词数(为了效果明显,将所有的单词全都打印了):

(3)测试统计行数:

7、各部分预计耗费时间和实际耗费时间:

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

8、代码覆盖率:

9、项目小结:

这次项目只完成了基本的部分,因为之前一直在学JavaScript,对java的掌握并不是很好,也算是通过这个项目对java的知识的重新学习。这个项目的实现并不难,主要是IO流与正则表达式的使用,采用控制台输出的方式显示结果,省掉了GUI的设计过程。

虽然项目不大,但是学习了如何从零开始一个项目,并且对每个阶段的时间进行记录,同时学会了使用GitHub来记录项目开发过程,这是之前没有接触过的,能更清晰的看到自己的项目改动记录。

猜你喜欢

转载自www.cnblogs.com/renluqian/p/9623685.html
今日推荐