一、Github地址:https://github.com/l67t/wc
二、PSP表格
| PSP2.1 | Personal 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)空行数、注释行数、代码行数的统计

import java.util.Scanner;
public class WC {
public static void main(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=new Scanner(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();
}}
import java.io.File;
import java.io.FileReader;
import java.util.Scanner;
public class Codecount {
Scanner c=new Scanner(System.in);{
String Pathname=null;
while((Pathname=c.nextLine())!="") {
File file=new File(Pathname);{
try {
FileReader fr=new FileReader(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("路径不正确,请重新输入路径:");
}
}
}
}}
import java.io.File;
import java.io.FileReader;
import java.util.Scanner;
public class Wordcount {
Scanner w=new Scanner(System.in);
String Pathname=null;{
while((Pathname=w.nextLine())!="") {
File file=new File(Pathname);{
try {
FileReader fr=new FileReader(file);
char temp[]=new char[4096];
int b=0;
int a= fr.read(temp);
for(int i=0;i<a;i++) {
if(temp[i]==' ')
b++;
}
if(a==-1) b=-1;
System.out.println("文本的单词数为"+(b+1));
fr.close();
}catch(Exception e) {
System.out.print("文件路径输入错误,请重新输入:");
}
}}}}
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Scanner;
public class Extra {
Scanner e=new Scanner(System.in);
String Pathname=null;
String kregex="(\\s)*[{]?";{
while((Pathname=e.nextLine())!="") {
File file=new File(Pathname);{
try {
String s=null;
int a=0,c=0,b=0;
FileReader fr=new FileReader(file);
BufferedReader bufr=new BufferedReader(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("文件路径输入错误,请重新输入:");
}
}
}
}
}
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Scanner;
public class Linecount {
Scanner l=new Scanner(System.in);
String Pathname=null;{
while((Pathname=l.nextLine())!="") {
File file=new File(Pathname);{
try {
FileReader fr=new FileReader(file);
BufferedReader bufr=new BufferedReader(fr);
int i=0;
while((bufr.readLine())!=null) {
i++;
}
System.out.println("文本行数为"+i);
fr.close();
bufr.close();
}catch(Exception e) {
System.out.println("文件路径输入错误,请重新输入:");
}
}
}}}