1.Github地址

https://github.com/JingzheWu/WordCount

2.PSP表格

PSP2.1 PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

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

10 15
  合计 610 785

3.解题思路

看到题目之后,大致设想了一下解题过程,先实现基本功能,再实现扩展功能,通过I/O流读取带计数文件内容,然后分别统计字符数、单词数以及行数,在设计基础功能时,统计单词数是通过空格和逗号来计算的,但是到后面有个停用词表,所以前面设计的这个方法就不能使用了,需要用到编译原理里面的词法分析的知识。由于很长时间没有写过java程序,好多知识都忘记了,实现的时候,没有设计多个类来实现,而是把这些功能放在了一个文件里,也没有进行封装,看起来有点乱。由于时间有限,到后面发现这个问题之后,也没有时间来重构代码了,所以准备在下次作业时再进行代码重构。

4.程序设计实现过程

程序通过先读取命令字符串,split函数分割,获得参数列表以及文件名等字符串,再根据文件路径读取文件,用I/O流来读取文件内容,调用BufferedReader实例的readLine方法,一次读取文件的一行,然后一行一行进行处理。

5.代码说明

变量定义

        int charNum=0;//字符数
        int wordNum=0;//单词数
        int lineNum=0;//行数

        int codeLineNum=0;//代码行数
        int emptyLineNum=0;//空行数
        int commentLineNum=0;//注释行数
        boolean isEmpty=false;

        Scanner scanner=new Scanner(System.in);
        String cmd;//获取输入的命令字符串
        String preCmd;//命令前缀,即wc.exe
        ArrayList<String> parameter=new ArrayList<>();//命令参数列表
        String filePath;//程序设计语言源文件,即input_file_name

  获取参数

        while (true) {
            cmd=scanner.nextLine();
            preCmd=cmd.split(" ")[0];
            if (preCmd.equals("wc.exe")){
                break;
            }else {
                System.out.println("命令有误,请重新输入!");
            }
        }

        for (int i=1,cmdLen=cmd.split(" ").length;i<cmdLen-1;i++){
            parameter.add(cmd.split(" ")[i]);
        }
        filePath=cmd.split(" ")[cmd.split(" ").length-1];

  读取文件并处理

         FileInputStream fileInputStream=new FileInputStream(filePath);
            InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream);
            BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
            String lineStr=bufferedReader.readLine();
            while (lineStr==null){
                emptyLineNum++;
                lineStr=bufferedReader.readLine();
            }
            while (lineStr!=null){
                isEmpty=false;

                charNum=charNum+lineStr.length();

                String[] charArr=lineStr.split("");
                int index=0;
                while (charArr[index].equals(" ")||charArr[index].equals(",")){
                    index++;
                    if (index==lineStr.length()){
                        break;
                    }
                }//去掉该行第一个非空格非逗号字符前的空格和逗号

                if (!(index==lineStr.length())){
                    wordNum++;
                }else {
                    emptyLineNum++;
                    isEmpty=true;
                }

                if (lineStr.length()-index==1&&(charArr[index]=="{"||charArr[index]=="}")){
                    emptyLineNum++;
                    isEmpty=true;
                }//如果该行只有一个“{”或者“}”,则算作空行

                int index2=index;
                for (;index<charArr.length;index++){
                    if ((charArr[index].equals(" ")||charArr[index].equals(","))&&(!(charArr[index-1].equals(" ")||charArr[index-1].equals(",")))){
                        wordNum++;
                    }
                }

                if (!isEmpty){
                    boolean commentFlag1=charArr[index2].equals("/")&&charArr[index2+1].equals("/");
                    boolean commentFlag2=charArr[index2].equals("/")&&charArr[index2+1].equals("*");
                    boolean commentFlag3=charArr[index2].equals("*")&&charArr[index2+1].equals("/")&&((index2+2==charArr.length)||(charArr[index2+2].equals(" ")));
                    if (commentFlag1||commentFlag2||commentFlag3){
                        commentLineNum++;
                    }else {
                        codeLineNum++;
                    }
                }

                lineNum++;
                lineStr=bufferedReader.readLine();
                if (lineStr==null){
                    emptyLineNum++;
                    lineStr=bufferedReader.readLine();
                }
            }

6.测试设计过程

wda dad  提示命令有误,重新输入
wc.exe -c qweqwe.asd  提示文件不存在
wc.exe test.c  提示请输入参数
wc.exe -c test.c  输出待测试文件字符数,并存储到result.txt文件中
wc.exe -w test.c  输出待测试文件单词数,并存储到result.txt文件中
wc.exe -l -w -c test.c  输出待测试文件行数、单词数、字符数,并存储到result.txt文件中
wc.exe -w -c test.c -o output.txt  输出待测试文件单词数、字符数,并存储到output.txt文件中
wc.exe -a test.c  输出待测试文件代码行数、空行数、注释行数,并存储到result.txt文件中
wc.exe -s *.c  提示功能开发中
wc.exe -w test.c -e stop.txt  输出待测试文件中除去停用词表单词后的单词数,并存储到result.txt文件中 

7.参考文献链接

http://blog.csdn.net/ycy0706/article/details/45457311

第二周个人作业WordCount的更多相关文章

  1. java第二周的作业

    package java第二周学习; import javax.swing.JOptionPane; public class 数学题 { private int a; private int b; ...

  2. 软件测试第二周个人作业:WordCount

    github地址:https:/github.com/muzhailong/wc.git 第一次写博客很不容易,也算是一个好的开始吧. 1.   个人作业要求 作业简述:根据WordCount的需求描 ...

  3. 第二周个人作业:WordCount

    github地址 https://github.com/lzwk/WordCount PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) Planning 计划 20 40 · ...

  4. 第二次结对作业-WordCount进阶需求

    原博客 队友博客 github项目地址 目录 具体分工 需求分析 PSP表格 解题思路描述与设计实现说明 爬虫使用 代码组织与内部实现设计(类图) 算法的关键与关键实现部分流程图 附加题设计与展示 设 ...

  5. Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业

    一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...

  6. Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业(线性回归)

    一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...

  7. JAVA学习第二周课后作业

    Java 的基本运行单位是类.类由数据成员和函数成员组成.变量之间可以相互转换.String是一个类.static是静态.全局的意思.经过测试,Java的枚举类型定义的Size与String一样都不是 ...

  8. 16级第二周寒假作业H题

    快速幂(三) TimeLimit:2000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 计算( AB ...

  9. 16级第二周寒假作业E题

    Home_W的位运算4 TimeLimit:2000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 给 ...

随机推荐

  1. 启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决

    昨晚安装另一个版本的eclipse,启动时出现了"Failed to load the JNI shared library jvm.dll"错误: 1.刚开始以为是因为当时没有将 ...

  2. [phpvia/via] PHP多进程服务器模型中的惊群

    [ 概述 ] 典型的多进程服务器模型是这样的,主进程绑定ip,监听port,fork几个子进程,子进程安装信号处理器,随后轮询资源描述符检查是否可读可写: 子进程的轮询又涉及到 IO复用,accept ...

  3. ibatis的优缺点及可行性分析

    1.优点 简单: 易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现. 实用: 提供了数据映射功能,提供了对底层数据访问的封装(例如ado.net),提供了DAO框架,可以使我 ...

  4. IPv6原理、应用与实践

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯微信技术架构部团队 2017年11月26日,中共中央办公厅和国务院办公厅印发了<推荐互联网协议第六版(IPv6)规模部署行动 ...

  5. python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序

    说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...

  6. 在Debian或Ubuntu中安装和使用'搜狗输入法for linux'

    下载搜狗输入法 for linux点击 搜狗输入法 for linux 以下载安装包到本地 安装搜狗输入法 for linuxA.准备工作: (1) 连接网络.挂载系统安装盘 此安装过程需要网络连接, ...

  7. Windows10+Docker搭建分布式Redis集群(一)

    摘要,Docker for Windows 仅支持专业版 目录 第一步:检查系统支持虚拟化 第二步:下载Docker对应版本 第三步:配置镜像加速 第一步:检查系统是否支持虚拟化 Docker前提是需 ...

  8. flask +gevent+nginx+Gunicorn+supervisor部署flask应用

    上篇   可以完美部署flask ,但是视乎在结合gevent+apscheduler 实现异步非阻塞后台和定时任务的时候视乎不是那么完美.请教了前辈,决定使用flask+gevent+nginx+g ...

  9. [LeetCode] Image Smoother 图片平滑器

    Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother t ...

  10. 【BZOJ3110】【ZJOI2013】k大数查询

    原题传送门 题意简析 给定一个区间,可以在这个区间上每个整数点插入若干个数(这些数数值可以重复)你需要支持2种操作: 1)在[a,b]间所有整数点插入c 2)查询[a,b]内第c大的数 解题思路 树套 ...