一、Github地址:https://github.com/l67t/wc
二、PSP表格
PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning
计划
30
40
· Estimate
· 估计这个任务需要多少时间
30
40
Development
开发
1155
1220
· Analysis
· 需求分析
50
60
· Design Spec
· 生成设计文档
30
40
· Design Review
· 设计复审
20
20
· Coding Standard
· 代码规范
15
30
· Design
· 具体设计
80
60
· Coding
· 具体编码
750
800
· Code Review
· 代码复审
30
30
· Test
· 测试(自我测试,修改代码,提交修改)
180
180
Reporting
报告
110
130
· Test Report
· 测试报告
60
60
· Size Measurement
· 计算工作量
20
30
· Postmortem & Process Improvement Plan
· 事后总结, 并提出过程改进计划
30
40
合计
1295
1390
三、解题思路
由于之前的JAVA课设有跟这次项目相似的功能,因此我选择用JAVA来实现。
功能分析
(1)统计字符数(通过计算文本文档中内容的长度实现)
(2)统计单词数(通过统计单词间的空格数实现)
(3)统计行数(通过统计‘\n’的数目实现)
(4)统计空行数、注释行数、代码行数(利用正则表达式实现)
(5)支持通配符(未实现)
(6)图形界面(未实现)
(7)递归处理目录下符合条件的文件(未实现)
在设计图形界面时我遇到了一些难题,首先是框架,我构建的窗口一定需要先调整窗口大小才能显示内容,我的的确确按照查阅的方法先设置窗口大小setSize(),然后再显示窗体setVisible(),可是还是不行,然后就是方法和函数的调用,但由于前面的代码,我是先判断“-c、-l、-w"这些指令来启用别的类的方法,然后路径的输入是通过输入指令的判断完成,导致制作图形界面时不知道如何调用和把通过选择文件时用getPath()获得的路径输入,需要将前面代码大部分重新编译才能修改,最后只能放弃图形界面,虽然可以在图形界面的类中把之前统计用的方法都塞进去,但是这样代码又太过臃肿,只是在重复前面的代码,没有利用到别的类,变成完全分离出来完成前面功能的类,不过最主要的还是个人编码能力不足,前期没有做好功能规划,后期修改乏力,正如老师在项目要求中写的一样,Practice makes perfect. 没有捷径可走,就是练习、练习再练习!经过这次的简单个人项目之后,发现我的编程能力真的是十分低,因此我今后要努力锻炼我的编程能力,多练多思考,提高水平。
四、设计实现过程
项目主要有六个类:
1.WC(主类)
2.CodeCount(实现字符统计)
3.WordCount(实现单词统计)
4.LineCount(实现行数统计)
5.Extra(实现扩展功能,对空行数、注释行数、代码行数的统计)
五、测试运行
文件的测试
(1)字符统计
(2)单词统计
(3)行数统计
(4)空行数、注释行数、代码行数的统计
importjava.util.Scanner;public classWC {public static voidmain(String[] args) {
System.out.println("*********************************************");
System.out.println("指令说明:");
System.out.println("wc.exe -c //返回文件的字符数");
System.out.println("wc.exe -w //返回文件的单词数");
System.out.println("wc.exe -l //返回文件的行数");
System.out.println("wc.exe -a //返回文件的空行数、代码行数、注释行数");
System.out.println("*********************************************");
Scanner scan=newScanner(System.in);
String order=null;while((order=scan.nextLine())!="") {switch(order) {case "wc.exe -c":System.out.println("请输入文件路径:");new Codecount();break;case "wc.exe -w":System.out.println("请输入文件路径:");new Wordcount();break;case "wc.exe -l":System.out.println("请输入文件路径:");new Linecount();break;case "wc.exe -a":System.out.println("请输入文件路径:");new Extra();break;default:System.out.println("指令输入错误,请重新输入指令:");
}
}
scan.close();
}}
importjava.io.File;importjava.io.FileReader;importjava.util.Scanner;public classCodecount {
Scanner c=newScanner(System.in);{
String Pathname=null;while((Pathname=c.nextLine())!="") {
File file=newFile(Pathname);{try{
FileReader fr=newFileReader(file);char temp[]=new char[4096];int a=fr.read(temp);if(a==-1) a=a+1;
System.out.println("文件的字符数为"+a);
fr.close();
}catch(Exception e) {
System.out.println("路径不正确,请重新输入路径:");
}
}
}
}}
importjava.io.File;importjava.io.FileReader;importjava.util.Scanner;public classWordcount {
Scanner w=newScanner(System.in);
String Pathname=null;{while((Pathname=w.nextLine())!="") {
File file=newFile(Pathname);{try{
FileReader fr=newFileReader(file);char temp[]=new char[4096];int b=0;int a= fr.read(temp);
for(int i=0;i
b++;
}if(a==-1) b=-1;
System.out.println("文本的单词数为"+(b+1));
fr.close();
}catch(Exception e) {
System.out.print("文件路径输入错误,请重新输入:");
}
}}}}
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.util.Scanner;public classExtra {
Scanner e=newScanner(System.in);
String Pathname=null;
String kregex="(\\s)*[{]?";{while((Pathname=e.nextLine())!="") {
File file=newFile(Pathname);{try{
String s=null;int a=0,c=0,b=0;
FileReader fr=newFileReader(file);
BufferedReader bufr=newBufferedReader(fr);while((s=bufr.readLine())!=null) {if(s.contains("//"))
a++;else if(s.matches(kregex))
b++;else c++;
}
System.out.println("文本的空行数为:"+a);
System.out.println("文本的注释行数为:"+b);
System.out.println("文本的代码行数为:"+c);
fr.close();
bufr.close();
}catch(Exception e) {
e.printStackTrace();
System.out.println("文件路径输入错误,请重新输入:");
}
}
}
}
}
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.util.Scanner;public classLinecount {
Scanner l=newScanner(System.in);
String Pathname=null;{while((Pathname=l.nextLine())!="") {
File file=newFile(Pathname);{try{
FileReader fr=newFileReader(file);
BufferedReader bufr=newBufferedReader(fr);int i=0;while((bufr.readLine())!=null) {
i++;
}
System.out.println("文本行数为"+i);
fr.close();
bufr.close();
}catch(Exception e) {
System.out.println("文件路径输入错误,请重新输入:");
}
}
}}}