码云地址:https://gitee.com/xjtsh/ExpandedWordCount

功能实现:

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

wc.exe -s            //递归处理目录下符合条件的文件

wc.exe -a file.c     //返回更复杂的数据(代码行 / 空行 / 注释行)

wc.exe -e stopList.txt  // 停用词表,统计文件单词总数时,不统计该表中的单词

项目简介

本项目是基础项目的扩展,增加了递归处理目录下符合条件的文件、统计文件单词总数时,不统计停用词表中的单词、返回文件的代码行 、 空行 、注释行等功能。

可执行程序命名为:wc.exe,该程序处理用户需求的模式为:

wc.exe [parameter] [input_file_name]

存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。

解题思路:

获取键盘数输入的指令,当读取到 '-'这个命令符号前缀时 ,我们能知道它将会和下一个字符一起构成一个操作指令,于是我们通过对下一个字符的读取就能够决定这个命令符号具体代表了什么含义。这里分几种情况:若下一个字符是 'c'、 'w'、'l'之类的基本功能参数,若下一个字符是 'o'、'e'之类的拓展功能参数,那么它会紧跟着一个txt文件,实现的是对文件内容停用词检索与执行结果输出到文件的操作功能;也存在下一个字符是程序未定义的参数字符如‘m’、'n'等,这时程序应当是无法识别这类命令参数的,不会执行任何操作,但一般也不会报错。获取待处理文件名和结果输出文件名,通过指令中是否含有-o指令判断是否采用默认的result.txt文件输出。以及获得输出文件名。本项目仅实现了文件的字符数、行数、单词数的统计。即分为一个主类和获取字符数、行数、单词数方、输出方法和main方法。待处理文件放在项目的统一文件夹内。

-e 必须与停用词文件名同时使用,且停用词文件必须紧跟在-e参数后面,不允许单独使用-e参数。

stopList.txt中停用词可以多于1个,单词之间以空格分割,不区分大小写。特别的注意代码行后的注释,并非另起一行的情况。

此次主要增加的则是匹配原则:

和对文件夹的遍历:

public static List<File> getFile(File dir) {
List<File> files = new ArrayList<File>();
File[] subs = dir.listFiles(); //读取当前文件下的所有文件、文件夹
for (File file : subs) {
if (file.isFile() && file.getName().endsWith(endString)) {
files.add(file);
} else if (file.isDirectory())
files.addAll(getFile(file)); //若读取到目录,就对当前目录递归读取
}
return files;
}

  

测试设计

对于程序测试这一块,我一共设计了10个测试用例,其中包括8个相互独立的常规测试用例和2种类型的错误测试用例。具体测试如下:

1. 基本字符测试

输入:–c test.txt

期望输出:字符数:148

实际输出:字符数:148

分析:符合预期输出

2. 行数字符测试

输入:-l test.txt

期望输出:,文件总行数:7

实际输出:文件总行数:7

分析:符合预期输入

3. 单词测试

输入:-w test.txt

期望输出:,文件总行数:20

实际输出:文件总行数:20

分析:符合预期输入

4. 基本功能测试

输入:-c -w -l test.txt

期望输出:字符个数:148

       单词个数:20

       文件总行数:7

实际输出:字符个数:148

     单词个数:20

     文件总行数:7

分析:符合预期输出

5. 部分扩展功能测试

输入:-c test.txt stoplist.txt -o output.txt

期望输出:字符数:143

实际输出:字符数:143

分析:符合预期输出

6. 错误指令测试一(纯未定义命令参数)

输入:-m test.txt

期望输出:无期望

实际输出:无任何内容,但也未报错

分析:由于并未涉及命令参数-m,故而程序无法识别对应指令无法执行。

7. 错误指令测试二(含未定义命令参数)

输入:-c -m test.txt

期望输出:无期望

实际输出:字符个数:148

分析:由于命令语句中含有已定义的命令参数-c,故而虽然含有-m,但是程序依然识别了-c并且执行了字符统计功能。

项目总结

总的说来,这次项目确实让我收获了不少东西,一开始因为要求的细节过于繁琐而且时常所以有些情绪化,在项目设计和开发的过程中没有完全静下心来去好好地想一下如何解决这个问题。随着提交时间的逼近才逐渐硬着头皮开始认真去搞这个作业,从最终的结果来看,确实学到了很多有用的东西,关于注释行、代码行与空行的正则表达式匹配判定法以及如何从提高一个程序的条件覆盖率去编写测试用例测试程序的性能,这些都是以后走向工作岗位很宝贵、很重要的东西。特别地解决了基础项目中-|的相关问题。作业要求中的是-l与逻辑符号或混淆而出错。

WordCount扩展的更多相关文章

  1. WordCount扩展与优化

    合作者:201631062327,201631062128码云地址:https://gitee.com/LIUJIA6/WordCount3 一:项目说明 本次项目是在上次作业WorldCount的基 ...

  2. C#原始类型扩展方法—this参数修饰符

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...

  3. C#扩展方法入门

    扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀. 仅当你使用 using 指令将命名空间显式导入到源代码 ...

  4. 转:扩展方法(C# 编程指南)

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...

  5. C#语言不常用语法笔记

    只看过3天C#语法书,了解个大概,与C++等不同之处,或者看开源遇到一些奇异用法,记录一下,脑子不够用的情况下,还是记笔记靠谱. ==================== 顺便吐槽下,这年头得会各种编 ...

  6. 大数据之路week07--day03(Hadoop深入理解,JAVA代码编写WordCount程序,以及扩展升级)

    什么是MapReduce 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃. MapReduce方法则是: 1.给在座的所有玩家中分配这摞牌 2.让每个玩家数自己手中的牌有几 ...

  7. C#的扩展方法

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

  8. mrunit for wordcount demo

    import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.had ...

  9. C#高级功能(四)扩展方法和索引

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但 ...

随机推荐

  1. Docker国内镜像source

    现在使用docker的镜像大多基于几种基本Linux系统.虽然我不需要在容器李安装很多东西,但经常需要一些必要的工具,而基础镜像里并不包含,比如vim, ifconfig, curl等.考虑下载速度, ...

  2. How do I remove a particular element from an array in JavaScript?

    9090down voteaccepted Find the index of the array element you want to remove, then remove that index ...

  3. Spring中的CharacterEncodingFilter

    spring的配置文件如下: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns=&q ...

  4. 【MySQL】MySQL中查询出数据表中存在重复的值list

    1.目的:查询MySQL数据表中,重复记录的值 2.示例: 3.代码: select serial_num,count(*) as count FROM card_ticket GROUP BY se ...

  5. 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境

    在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了. 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDC ...

  6. H+ 关闭menuTab页面

    //注:在contabs.js文件中 $(function () { }); 方法外 加入//注: data-name="' + menuName + '" 这句是加入的自定义属性 ...

  7. 设置DataGridView不自动创建生成列

    DataGridView.AutoGenerateColumns 获取或设置一个值,该值指示是否为数据源中的每一字段自动创建 BoundColumn 对象并在 DataGrid 控件中显示这些对象. ...

  8. 【JAVA面试】java面试题整理(4)

    版权声明:转载请注明 https://blog.csdn.net/qq_33591903/article/details/83473779                               ...

  9. SQL获取当前时间月份为两位数

    --获取当前时间月份为两位数 )),) --获取当前时间上月月份为两位数 , )),)

  10. jqweui 关于$(document.body).infinite的bug

    jqweui,0.8.2版本infinite存在bug,会存在下拉不触发的情况,解决办法: 源代码3730行附近 Infinite.prototype.scroll = function() { va ...