(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) throwsIOException {9 FileInputStream f = newFileInputStream(s);10 //根据前后空格来判断是否为单词
11 boolean notblank = false;12 String blank = " \t\n\r";13 intc;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 = newScanner(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.println12 ("本文件共有字符数:" + chars);//空文件情况
13 else{14 System.out.println15 ("本文件共有字符数:" + (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.println31 ("本文件共有字符数:" + (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语言不太熟悉,所以即使想到了算法,但是在实现的代码编写方面遇到了很多磕磕绊绊的过程,有时候想了几十分钟还是不知道怎么写。因为想不到更优的语法,所以代码规范方面也没想的太仔细,代码复审也没有花很多的时间。测试方面因为都是一个一个文件路径输进去的,所以稍微花了点时间。通过这次项目设计,让我意识到如果不去回顾编程语言,很久不去实践的话,代码编程的技术会生疏很多,所以还是要不定时的去回顾一下编程语言。