• 第一次 作业 workcount (基础功能实现)


      github项目:https://github.com/lilikai/Lk_test/blob/master/zuoye/src/com/zuoye/cn/wcCount.java

       码云项目:https://gitee.com/jiansanzhihou/first_homework_wordcount/blob/master/WC/wcCount.java

    1、项目要求:实现对文件内容里面的 字符、单词、行数的统计,并将结果输出在制定的文件里面,在命令行直接运行wc.exe,存储统计结果的默认文件为result.txt,和wc.exe在同级目录

    2、基本功能: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参数

    3、基本功能列表:

    1、 -c 文件路径 返回文件字符数

    2、 -l 文件路径 返回文件内容行数

    3、 -w 文件路径 返回文件单词数

    4、 -o 文件路径 输出结果到制定文件

    4、psp开发表格

    PSP2.1

    PSP阶段

    预估耗时

    (分钟)

    实际耗时

    (分钟)

    Planning

    计划

     30

     50

    · Estimate

    · 估计这个任务需要多少时间

     350

     350

    Development

    开发

     100

     120

    · Analysis

    · 需求分析 (包括学习新技术)

     100

     130

    · Design Spec

    · 生成设计文档

     

     

    · Design Review

    · 设计复审 (和同事审核设计文档)

     

     

    · Coding Standard

    · 代码规范 (为目前的开发制定合适的规范)

     30

     50

    · Design

    · 具体设计

     30

     40

    · Coding

    · 具体编码

     200

     300

    · Code Review

    · 代码复审

     30

     30

    · Test

    · 测试(自我测试,修改代码,提交修改)

     50

     70

    Reporting

    报告

     30

     50

    · Test Report

    · 测试报告

     

     

    · Size Measurement

    · 计算工作量

     30

     30

    · Postmortem & Process Improvement Plan

    · 事后总结, 并提出过程改进计划

     30

     30

                合计

          660

         910

     

     

    5、表格分析:

      从表格上可以看出,实际和预期的时间大部分相差不是很大,但是在编码和测试修改出现了很大的反差,究其原因还是在前面开发计划有问题,具体的编码规划没有制定好,编码之前的资料和工具没有准备充分导致编码阶段出现问题,当然后面的测试也会受到相应的影响,代码总是写完才去测试,没有进行模块化测试,导致时间超出预期的结果。

    6、设计思路: 

           通过输入的命令来判断执行各个if函数,将输入的命令分割为两部分,第一部分是指令,第二部分是文件路径,

    用指令来判断需要执行的if函数,文件路径作为参数。

    字符统计:按行读取文件,把每行的字符数相加;

    词数统计:把读取的数据记录下来,把多行拼接为一行,用空格替代标点符号,然后根据空格切割;

    行数统计函数:根据JAVA的readLine功能统计;

    设计思路图:

    运行截图:

    将java 项目转为可直接执行的exe 文件测试

    7、部分代码:

    /*
             *  获取文件目录名
             */
            
            InputStream iStream = System.in;
            InputStreamReader inputStreamReader = new InputStreamReader(iStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = bufferedReader.readLine();
            String[] strings = str.split("\s");
            
            for (int i = 0; i < strings.length; i++) {
                if (strings[i].endsWith(".txt"))
                inputFile = strings[i];
        }
    /**
             * 字符数统计
             */
            for (int i = 0; i < strings.length; i++) {
              if (strings[i].equals("-c")) { // -c对应字符个数统计
              BufferedReader bff = new BufferedReader(new FileReader(inputFile));
              String str1;
              String str2 = bff.readLine();
              while ((str1 = str2) != null) {
              charnum = charnum + str1.length();
              charnum++;
            if ((str2 = bff.readLine()) == null){
                charnum--;
            }
    
        }
            bff.close();
            String file = inputFile;
            file = file.substring(file.lastIndexOf("\") + 1, file.length());
            System.out.println(file + ",字符个数:" + charnum);
            }
        }
     /**
             *  行数统计
             */
    
            for (int i = 0; i < strings.length; i++) {
                if (strings[i].equals("-l")) { // -l对应字符行数统计
                    BufferedReader bff = new BufferedReader(new FileReader(inputFile));
                    while (bff.readLine() != null)
                    linenum++;
                    bff.close();
                    String file = inputFile;
                    file = file.substring(file.lastIndexOf("\") + 1, file.length());
                    System.out.println(file + "文件总行数:" + linenum );
                }
            }
    
            /**
             *  单词数统计
             */
            for (int i = 0; i < strings.length; i++){
                if (strings[i].equals("-w")) { // -w对应字符个数统计
    
                    BufferedReader bff = new BufferedReader(new FileReader(inputFile));
                    StringBuffer sBuffer = new StringBuffer();
                    String str1;
                    while ((str1 = bff.readLine()) != null)
                    sBuffer = sBuffer.append(str1 + " ");
                    str1 = sBuffer.toString();
                    /**
                     *  把中英文标点符号都替换为“ ”
                     */
                    String str2 = str1.replaceAll("[\p{P}+~$`^=|<>~`$^+=|<>¥×]", " ");
                    String[] str3 = str2.split("\s+");
                    wordnum = str3.length;
                    bff.close();
                    String file = inputFile;
                    file = file.substring(file.lastIndexOf("\") + 1, file.length());
                    System.out.println(file + "单词个数:" + wordnum);
                 }
              }

    8、总结:

    在这个小项目公布以后,我觉得虽然这个一个非常小的项目,属于个人项目,如果以前没有学习软件工程系统分析的话。可能就直接在电脑上写代码,了解大致要实现的功能就行,就想着边写边改,有不会的上网百度就行,但是从软件项目的角度来看,这种完成的东西不能称之为软件,就只是一点程序代码而已,如果要称之为软件的话还缺少很 多的东西,因此,就借着这个小项目来具体按照软件工程的角度去实现它,完成它前期要做到对功能进行分析,对各个阶段的进行规划,进行需求分析,可行性分析等等,前期的准备都是为了后面做的时候能事半功倍。我做的这个小项目大致按照软件工程项目的流程走了一次,但是中间也有许多的问题和被忽视的东西,测试的话我直接是在编译器上写一段代码测试一段,而没有具体的进行单元测试,因为代码量不大,如果真正的大项目的话,我觉得单元测试是必不可少的。这次的作业完善的还是不好,只是让我能够体会到做一个项目不仅仅是写代码,更重要的是分析和规划我们的时间和需求功能,只有把这些基础工作做好了,右面的编程,测试就会很容易。

    参考文献:java io 流详解https://www.cnblogs.com/xll1025/p/6418766.html
    参考代码 :http://www.cnblogs.com/LYhah/p/9642534.html
  • 相关阅读:
    2020.4.10个人总结
    CG-CTF simple machine
    CG-CTF Our 16bit wars
    CG-CTF Our 16bit Games
    CG-CTF single
    CG-CTF WxyVM2
    Go Channel 详解
    Go语言TCP Socket编程
    golang mysql demo
    YouCompleteMe unavailable: requires Vim compiled with Python 2.x support
  • 原文地址:https://www.cnblogs.com/3106Likai/p/9692543.html
Copyright © 2020-2023  润新知