wc作业的JAVA实现

Github项目地址传送门

(PSP表格在最后给出)

项目相关要求

  • 1.基本功能
    • -c,统计文件的字符数(完成)
    • -w,统计文件的词的数目(完成)
    • -l,统计文件的行数(完成)
  • 2.拓展功能
    • -s,递归处理目录下符合条件的文件(未完成)
    • -a,返回更复杂的数据(代码行 / 空行 / 注释行)(未完成)

 

解题思路

WC这个项目主要有两个部分组成:

      1.有关基本功能的实现设计;

       2.读取测试文件;

       基本功能的实现设计比较简单,如果用Java的角度,用read的方式按字符读取文件内容。

字符数:读取的过程中,空格键字符数+1,回车键字符数+2,所以要去除掉这两个才能计算出不计空格和回车的字符数;

行数:以回车数+1就能统计文件的总行数;

单词数:通过判断前后是否有空格来统计单词的数目。

      文件读取这个方面比较难,因为我对java的输入流不太熟悉,上网查资料查到可以用文件或者路径的方式来读取文件,因为只用文件方式有几率会找不到该文件,所以我就只用读取路径的方式来打开文件。

 

 

设计

testcount类:

变量:chars, words, lines.   基本功能的表示。

方法:calculate                               基本功能的实现方法。

          switch(arr[0])                    对功能进行分类并打印输出结果。

主要流程:用文件输入流一个字符一个字符读取文件,以判断当前读取位置是否为文本末尾为结束条件进行循环,计算chars,words,lines。然后在主类设计读取文件路径的方法,并对功能进行分类实现。读取路径用split(“\\s”)的方法来表达。

 

关键代码

1.实现基本功能

 1 public static int words = 1;
 2     public static int lines = 1;
 3     public static int chars = 0;
 4         public static int space = 0;
 5         
 6     
 7 
 8         public static void calculate(String s) throws IOException {
 9         FileInputStream f = new FileInputStream(s);
10         // 根据前后空格来判断是否为单词
11         boolean notblank = false;
12         String blank = " \t\n\r";
13                 int c;
14         while ((c = f.read()) != -1) {
15             chars++;
16             if(c == '\n') lines++;//计算行数
17             if(c == ' ') space++;
18             if(blank.indexOf(c) != -1) {
19                 if(notblank) {
20                     words++;
21                 }
22                 notblank = false;
23             } else {
24                 notblank = true;
25             }
26         }if(chars==0) {words=0;lines=0;}//空文件

 

2.文件读取及功能分类

 1  System.out.print("请输入命令:");
 2             Scanner s = new Scanner(System.in);
 3             String m = s.nextLine();
 4             String arr[]= m.split("\\s");
 5             
 6             // 根据获取指令来执行函数
 7             try {
 8                 switch (arr[0]){
 9                     //打印输出结果
10                     case "-c": textcount.calculate(arr[1]);
11                       if(chars==0) System.out.println
12         ("本文件共有字符数:" + chars);//空文件情况
13                          else{
14                        System.out.println
15         ("本文件共有字符数:" + (chars-(lines-1)*2-space));}//不计空格和换行
16                         break;     //返回文件字符数
17                     
18                         case "-w": textcount.calculate(arr[1]);
19                         System.out.println("本文件共有单词数:" + words+"\n");
20                         break;         //返回文件单词数目
21                         
22                        //空行也计算在内 
23                     case "-l": textcount.calculate(arr[1]);
24                         System.out.println("本文件共有行数:" + lines+"\n");
25                         break;      //返回文件行数
26                    
27                          case "-cwl": textcount.calculate(arr[1]);
28                    if(chars==0) System.out.println("本文件共有字符数:" + chars);
29                          else{
30                        System.out.println
31         ("本文件共有字符数:" + (chars-(lines-1)*2-space));}
32                        System.out.println("本文件共有单词数:" + words);
33                        System.out.println("本文件共有行数:" + lines);
34                       
35                         break;
36                  
37                     default: System.out.println("\n不存在该指令!"+"\n");break;
38                 }
39             } catch (FileNotFoundException e) {//读取失败
40                 System.out.println("\n不存在该文件路径!");
41             } catch (IOException e){
42                 System.out.println("\n文件读取错误!");
43             }System.out.println("运行结束,感谢您的使用");break;

 

测试截图

1.正常测试文件,我一般都会把文件存在自己的d盘。

 

2.测试文件2,因为以回车键标准来数行,所以在该测试文件中空白行也算一行。

 

3.空文件

4.只有一个单词的文件,一个字符也算一个单词。

  

5.随便找了以前做的一个C语言源文件来做测试。

6.文件查找失败。

 

遇到的困难及解决方法

1. 在计算字符数的时候在考虑空文件情况的时候结果不是预期的,一开始都是在想判断文件为空这个方式。不过稍微往简单的想空文件就是一开始就到文件末尾,统计的字符数为零,所以根据这个思路补充这个情况:当char为零时,行数和单词书都置为零。

2.因为对Java不熟悉,所以对读取文件路径的方法需要上网查资料,用split的方法来输入文件路径。

3.输入文件名的时候不支持空格,解决方法尚未知。

 

PSP

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

 

经验小结

设计思路方面想的过于简单,只有大致方向,细化方面比预期再花多了一点时间。由于对Java语言不太熟悉,所以即使想到了算法,但是在实现的代码编写方面遇到了很多磕磕绊绊的过程,有时候想了几十分钟还是不知道怎么写。因为想不到更优的语法,所以代码规范方面也没想的太仔细,代码复审也没有花很多的时间。测试方面因为都是一个一个文件路径输进去的,所以稍微花了点时间。通过这次项目设计,让我意识到如果不去回顾编程语言,很久不去实践的话,代码编程的技术会生疏很多,所以还是要不定时的去回顾一下编程语言。

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-09-14 14:15  休眠中的熊  阅读(140)  评论(0)    收藏  举报