WC项目反思与总结

Posted lu0526

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WC项目反思与总结相关的知识,希望对你有一定的参考价值。

1. 项目需求说明

WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
wc.exe [parameter] [input_file_name]
存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。

1. 1 基本功能:

wc.exe -c file.c //返回文件 file.c 的字符数wc.exe -w file.c //返回文件 file.c 的单词总数wc.exe -l file.c //返回文件 file.c 的总行数wc.exe -o outputFile.txt //将结果输出到指定文件outputFile.txt
注意:
空格,水平制表符,换行符,均算字符。
由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
-c, -w, -l参数可以共用同一个输入文件,形如:wc.exe –w –c file.c 。
-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。

举例:

wc.exe –c file.c,则输出结果保存在result.txt中,内容格式如下(注意大小写):
file.c, 字符数: 50

wc.exe –w file.c,则输出结果保存在result.txt中,内容格式如下(注意大小写):
file.c, 单词数: 30

wc.exe –l file.c,则输出结果保存在result.txt中,内容格式如下(注意大小写):
file.c, 行数: 10

wc.exe –l –c file.c,则统计file.c中的字符数和行数,输出结果保存在result.txt中,内容格式如下:
file.c, 字符数: 50
file.c, 行数: 10

2. 编码过程

PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 1
· Estimate · 估计这个任务需要多少时间 10 1
Development 开发 720 635
· Analysis · 需求分析 (包括学习新技术) 10 5
· Design Spec · 生成设计文档 30 40
· Design Review · 设计复审 (和同事审核设计文档) 10 0
· Coding · 代码规范 (为目前的开发制定合适的规范) 10 0
· Code Review · 具体设计 10 5
· Test · 具体编码 610 540
Reporting · 代码复审 10 5
· Test Report 报告 30 40
· Size Measurement · 测试报告 30 10
· Postmortem & Process · 计算工作量 10 0
Improvement Plan · 事后总结, 并提出过程改进计划 10 5
合计 770 656

2. 1 解题思路

刚拿到题目时,我先看了题目需求,并列出主要要实现的功能:
1. 读取文件内容
2. 计算字符数
3. 计算单词数
4. 计算行数
5. 向文件写入内容
经过主要的功能分析后,我决定用我比较熟悉的java语言来完成这个题目。

其次,我分析了用java语言完成该题目主要需要运用的知识是:文件的IO流部分的知识。
于是我复习了我自己学习java IO字符流模块的知识和笔记,相关笔记如下:


/*
------------|   Reader    抽象类    输入字符流的基类
-----------------------|   FileReader    读取文件的输入字符流

FileReader的步骤:

    1. 找到目标文件
    2. 建立数据输入字符流通道
    3. 读取数据

*/

package cn.itcast.charstream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Demo1 {
       public static void main(String[] args) throws IOException {
             read1();
             read2();
       }
       public static void read1() throws IOException {
             File file = new File("E:/作业/Java/文件/b.txt");
             FileReader fileReader = new FileReader(file);
             int content = 0;
             while((content = fileReader.read()) != -1){//每次读一个字符
                    System.out.print((char)content);
             }
             fileReader.close();
       }
       public static void read2() throws IOException {
             File file = new File("E:/作业/Java/文件/b.txt");
             FileReader fileReader = new FileReader(file);
             //建立缓冲字符数组
             char[] buf = new char[1024];
             int length = 0;
             while((length = fileReader.read(buf)) != -1)
             {
                    System.out.println(new String(buf, 0, length));
             }
       }
}


/*
--------------|    Write    抽象类    输出字符流的基类
--------------------------|    FileWriter    向文件数据输出数据的输出字符流

FileWriter 的使用步骤:

    1. 找到目标文件
    2. 建立字符输出流通道
    3. 输出数据
    4. 关闭文件




注意:

    1. filewriter底层维护了一个1024的字符数组,写的数据先存在该数组中,当调用flush或close方法或填满了数组才会保存到硬盘上。
    2. new FileWriter(file);    如果目标文件不存在,会自动创建。
    3. new FileWriter(file);默认先清空数据。如果要直接添加数据,使用FileWriter(File,true)。

*/

package cn.itcast.charstream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Demo2 {
       public static void main(String[] args) throws IOException {
             write();
       }
       public static void write() throws IOException {
             File file = new File("E:/作业/Java/文件/b.txt");
             FileWriter fileWriter = new FileWriter(file);
             String data = "今天很开心";
             fileWriter.write(data);
             fileWriter.close();
       }
}


然后,我又思考发现,在计算单词数的时候,可以通过正则表达式来截取字符串的方式计算单词数量,
所有我又复习了正则表达式的相关用法,相关示例如下:


    范围词

            [abc]                        出现的只能是abc其中的一个
            [^abc]                      出现的只能是除了abc 的一个任意字符
            [a-z1-9&$]                    出现的只能是两头字母包括在内的字符(即:a~z  或1~9 或&或$)

2. 2 程序设计实现过程

在实际编码中,我使用了四个类,其类名和相关用途如下:
BaseCount:解析用户输入的命令行、调用JudgeOption类
相关方法:
wordCountMain()

BaseFunc:实现计算字符数、单词书、行数这三个方法
相关方法:
count_charsNum(String path)
count_wordsNum(String path)
count_linesNum(String path)

JudgeOption:判断用户输入参数,调用BaseFunc中对应的相关方法
相关方法:
judge(String arg, String readPath, String writePath)

WriteCount:把计算后的结果写出到指定文件
相关方法:
writeCount(String str, String path)
initFile(String path):如果写出的文件存在,将文件内容清空

2. 3 代码说明


public class BaseFunc {
    public static int count_charsNum(String path){
        int count = 0;
        try {
            FileReader fileReader = new FileReader(path);
            char[] buf = new char[1024];
            int length = 0;
            while( (length = fileReader.read(buf)) != -1){
                count += length;
            }
            fileReader.close();
        } catch (FileNotFoundException e) {
            System.out.println("");
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return count;
    }
    
    public static int count_wordsNum(String path) {
        int count = 0;
        
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
              while(br.read()!=-1) 
              {
               String s = br.readLine();
               
               for(int i=0; i<s.split("[^a-zA-Z]").length; i++){
                   
                   if( !s.split("[^a-zA-Z]")[i].isEmpty()){
                       count ++;
                   }
               }
               
               
              }
              br.close(); 
        }  catch (Exception e) {
            System.out.println(e);
        }
        
        
        return count;
        
    }
    public static int count_linesNum(String path) {
        int count = 0;
        
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
            while(br.read()!=-1) 
            {
                String s = br.readLine();
                
                count++;
            }
            br.close(); 
        }  catch (Exception e) {
            System.out.println(e);
        }
        
        
        return count;
        
    }
}



public class JudgeOption {
    public static void judge(String arg, String readPath, String writePath) {
        int count = 0;
        String str = "";
        
        switch (arg) {
        case "-c":
        case "—c":
            count = BaseFunc.count_charsNum(readPath);
            str = readPath.split("/")[ (readPath.split("/").length-1) ];
            str += ", 字符数:";
            str += count;
            WriteCount.writeCount(str, writePath);
            break;
            
        case "-w":
        case "—w":
            count = BaseFunc.count_wordsNum(readPath);
            str = readPath.split("/")[ (readPath.split("/").length-1) ];
            str += ", 单词数:";
            str += count;
            WriteCount.writeCount(str, writePath);
            break;
            
        case "-l":
        case "—l":
            count = BaseFunc.count_linesNum(readPath);
            str = readPath.split("/")[ (readPath.split("/").length-1) ];
            str += ", 行数:";
            str += count;
            WriteCount.writeCount(str, writePath);
            break;
            
        }
    }
}


































以上是关于WC项目反思与总结的主要内容,如果未能解决你的问题,请参考以下文章

项目的总结与反思

回归 | js实用代码片段的封装与总结(持续更新中...)

2022年度总结:反思与回顾

2022年度总结:反思与回顾

‘内部系统’怎么测试?两年测试的总结与反思

Unity Shader 阶段性反思与总结