GitHub项目地址:https://github.com/3116004696/ruanjiangongcheng

项目要求:

wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。

实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:

 

基本功能列表:   

wc.exe -c file.c     //返回文件 file.c 的字符数

wc.exe -w file.c    //返回文件 file.c 的词的数目 

wc.exe -l file.c      //返回文件 file.c 的行数

扩展功能:
    -s   递归处理目录下符合条件的文件。(未实现)
    -a   返回更复杂的数据(代码行 / 空行 / 注释行)。

空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。

代码行:本行包括多于一个字符的代码。

注释行:本行不是代码行,并且本行包括注释。

高级功能:(未实现)

 -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。

返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。

PSP

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

 

解题思路

刚开始拿到这个题目的时候有点不知所措,因为很久没用Java写代码了,很多功能不知道该用什么算法和语句实现,纠结了很久,最后重新翻开之前的Java书本复习了一下基础知识,了解了大概如何实现wc的部分功能,主要使用正则表达式内容和输入输出流部分内容还有contains语句和split等语句完成。

 

设计实现过程

首先,先写好main函数,设计好需要输出的大概界面,然后创建5个类,5个函数,各对应一个功能。Linecount类实现统计行数功能,Charcount类实现统计字符数功能,Wordcount类实现统计单词数 功能,Complex类实现统计空行、注释行、代码行功能。

代码说明

 main方法    主程序界面和循环处理参数

public class WC {

    public static void main(String[] args) throws IOException{
        // TODO 自动生成的方法存根
        while(true) {
        System.out.println("指令说明:");
        System.out.println("wc.exe -c  返回文件 file.c 的字符数:");
        System.out.println("wc.exe -w  返回文件 file.c 的词的数目 ");
        System.out.println("wc.exe -l  返回文件 file.c 的行数");
        System.out.println("wc.exe -a  返回文件 file.c 的空行,代码行,注释行");
        System.out.println("输入指令:");
     
 
        Scanner input=new Scanner(System.in);  //从键盘上输入指令并执行
        String commend=input.nextLine();
        switch (commend) {
        case "-l":
            Linecount line = new Linecount();
            break;
        case "-c":
             Charcount ch = new Charcount();
            break;
        case "-w":
             Wordcount wc = new Wordcount();
             break;
        case "-a":
            Complex cp = new Complex();
            break;
        default:
            System.out.println("指令错误,请重新输入:");
            break;
        }
 
    }
    }
}

 

Linecount() :实现统计行数功能

public  class Linecount {
    Linecount() throws IOException {
    System.out.println("输入路径:");
    Scanner input=new Scanner(System.in);
    String path=input.nextLine();
    BufferedReader fis =new BufferedReader(new FileReader(path));
    int linecount=0;
    while(fis.readLine()!=null) {  //当前行不为空时,行数+1
        linecount++;
        }
    System.out.println("行数:"+linecount);
    fis.close();

}
}

 

Charcount():统计字符数功能

 String REGEX ="\\S";
int charcount=0; 
        String w;
        Pattern p =Pattern.compile(REGEX);//匹配合适的字符
        while((w=fis.readLine()) != null) {
            Matcher m =p.matcher(w);
            while(m.find())    //找到对应字符时字符数+1
                
               charcount ++;
        }        

 

Wordcount():实现统计单词数功能

String REGEX ="[a-zA-Z]+\\b";   //判定为单词的正则表达式条件
int wordcount =0;
        String w;
        Pattern p =Pattern.compile(REGEX);
        while((w=fis.readLine()) != null) {
            Matcher m =p.matcher(w);
            while(m.find())   //当找到符合条件的内容时单词数+1
                   wordcount ++;
        }

 

Complex():实现统计空行、注释行、代码行功能

int spacecount = 0;
          int notecount = 0;
          int codecount = 0;
          boolean state = false;
          String c;
          while((c=fis.readLine())!=null) {
                 if(c.contains("/*")) {   //多行注释开始标记
                     notecount++;
                     state = true;
                 }
                 else if(state) {
                     notecount++;
                     if(c.contains("*/")) {  //多行注释结束标记
                     state = false;}
                 }
                 else if(c.contains("//")) {  //单行注释标记
                     notecount++;
                 }
                 else if(c.trim().length()>1) {  //判定为代码行条件
                     codecount++;
                 }
                 else {spacecount++;}
             }

 

 

 

测试运行

测试文件

 

 分别输入-l   -c   -w  指令和文件路径得到该文件的行数、字符数、单词数

 

 

 输入-a指令和文件路径得到该文件的注释行、空行、代码行数目

 

项目小结

       在做这个作业项目时遇到了许多的问题,至今还有些功能尚未实现,还有待以后加以完善。就比如在设计计算字符数功能时,就不知道该如何统计,最后通过查阅资料和询问同学得知可以用正则表达式来匹配符合条件的字符。同时做这次作业也耗费了许多的时间,可能是因为许久不曾使用Java,本身Java底子也不厚,所以导致在实现各种功能时遇到了很多的bug,还有很多语句也忘记了,需要重新翻开书本学习。不过这样也让我重新拾起很多遗忘的知识,更清晰的认识到各种语句用法,像正则表达式用法、contains、compile、matcher方法的使用,也学会了GitHub的使用方法,让我获益良多。在今后,我需要经常练习打代码,保持对代码的熟悉感,学习更多的代码知识,不断的提升自己,这样才不至于拿起项目时不知所措。