1.github地址:https://github.com/husterSyy/SoftTest

2.PSP表格

  psp 2.1 psp阶段 预估耗时(分钟) 实际耗时(分钟)
Planning 计划       10         5
Estimate 估计这个任务需要多少时间       10       15
Deveploment 开发       10         5
Analysis 需求分析(包括学习新技术)       30         30
Design Spec 生成设计文档       20         10
Design Review 设计复审(和同事审核设计文档)       10          5
Coding Standard 代码规范(为目前的开发制定合适的规范)       20         20
Design 具体设计       30         50
Coding  具体编码       380       400
Code Review 代码复审       30        20
Test 测试(自我测试,修改代码,提交修改)       150       200
Reporting 报告       10        10
Test Report 测试报告       20       30
Size Measurement 计算工作量        5        10
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划       10       20
  合计      745     830

3.解题思路

根据老师给定的需求,从基本功能开始,实现-c -w -l  功能,完成基本功能后,进行第一次代码commit 到github.

在基本功能基础上,分析扩展功能,由于扩展功能较为复杂,故我将逐个实现 -s  -a  -e功能,并进行单个测试,最后统一整理,编码运行成功后,进行全部功能测试。

输入均用主函数自带的String args[]参数进行接收,对接收的字符进行判断,从而进行对应操作。

对于输出到文件实现,若未指定具体输出,则默认为result.txt,否则输出到-o后面的文本中。

若用-s  *.c命令,则遍历得到的符合条件文本,分别输出各文本的指定输出,如字符,单词,行数等。

4.程序设计实现过程

由于思路是从基本功能出发,进而为扩展功能,故我的程序只有一个类,这个类包含了一个主函数,其他单个功能 -c -w  -l  -s -a -e 分别在单个函数实现,对应函数命名为:

统计字符数 countCharacters, 统计单词数 countWords ,统计所有行数 countLines ,读取给定目录下的符合条件的文本 readAllFile, 统计给定文本的代码行,空行,注释行 countDLines , 统计除停用文本的单词外其它所有单词总数countWordsS.

函数 countCharacters,countWords,countLines实现:

http://blog.sina.com.cn/s/blog_680288f00100l6a2.html

单词定义为用逗号或空格隔开的,非仅为英文字母组成的,如{ ,}算两个单词,//也算单词。

采取BufferedReader 读取文件,用br.read()函数并用int类型接收该函数返回的数值,返回值是否等于-1判断是否读到文件末尾,

当未读到尾部时,对读取的字符进行判断,当为单词间的空格或逗号时,字符加1,单词加1,当为换行符,单词数,行数分别进行加1,若出现连续的空格且空格不在单词间则跳过,不计入字符数,无意义。

同时对于read函数,经调用发现读取文本最后一行回车换行并另起一行空格,最后才读到-1,文件末尾,故对于此种情况跳过,不能对行数进行加1.

函数countDLines实现:

若空行{或一个字母位置或代码行在注释行内,则此行仅属于注释行,不计入代码行和空行。

对于代码行,空行,注释行判断,定义一个大小为3的数组,利用readline()函数读取一行字符串内容,当读取的内容长度不超过1时,空行加1,当读取的内容以“//”为开始startsWith(),进行注释行加1,当读取的内容以“/*”开始,"*/"结束endsWith(),计算该注释包含的所有行,其他均为代码行。

函数countWordsS实现:

https://www.cnblogs.com/fqfanqi/p/6187085.html

对于除停用词外的单词计数实现,读取源文件和停用文件的字符内容,分别提取对于文本的单词(split()+正则表达式)存到字符串数组,定义可动态增长的数组,遍历源文件,将源文件存到动态数组中,并将其转换成map<String,Integer>数据结构,便于计算单词数,对于停用词动态数组,进行遍历,若map集合键含有该单词,将其从map集合移除,最后遍历map统计得到的单词总数。

函数readAllFile实现:

https://www.cnblogs.com/linuxjava/p/6435911.html

遍历指定格式的文本 实现:对传入的文本进行判断,若为文件目录,继续遍历该目录下的子目录包括文本,若为文本且符合指定格式,则将其添加到存放文件名的动态数组。最后返回得到的存放指定目录下或子目录下的符合格式的文本文件。

5.代码说明

关键代码:

sourceFile为符合条件的文件数组

cflag,wflag,aflag,lfag初始定义为false,当键盘输入的是-c 则cflag置为true,同理对-w -l -a。

遍历从readAllFile得到的文件,根据从键盘输入的字符判断是否需要统计字符数,单词数,总行数,还是代码行/空行/注释行。

因为需求给定输出的内容和输入顺序无关,输出的顺序均为字符-->单词-->行数-->代码行数/空行数/注释行的顺序,依次分行显示,

故文本输出时按照打印输出顺序判断,确保输出到文本的顺序。

当采用 -e命令则不统计停用表中单词,则选用countWordsS函数输出单词数,否则看是否有 -w 命令有则输出总单词数。

 while(j<sourceFile.length){
name=sourceFile[j].getName();
if(eflag){
str1=name+", 单词数: "+countWordsS(sourceFile[j], stopFile);
bw.write(str1+"\r\n");
}
if(cflag){
str1=name+", 字符数: "+countCharacters(sourceFile[j]);
bw.write(str1+"\r\n");
}
if(!eflag&&wflag){
str1=name+", 单词数: "+countWords(sourceFile[j]);
bw.write(str1+"\r\n");
}
if(lflag){
str1=name+", 行数: "+countLines(sourceFile[j]);
bw.write(str1+"\r\n");
}
//注释行代码行空行
if(aflag){
str1=name+", 代码行/空行/注释行: ";
int[] lines=countDLines(sourceFile[j]);
str1+=""+lines[0]+"/"+lines[1]+"/"+lines[2];
bw.write(str1+"\r\n");
} j++; }

6.测试设计过程

关于测试,我选择了以下测试方案:

(1)对同一命令行采取对多个具有不同内容的文本测试,且文本写入的内容具有程序针对性。

(2)对同一文本采取多个命令行随机测试。

(3)根据程序给定的需求进行多组测试。

(4)对程序其他方面异常测试,如文件路径不存在和用户恶意输入测试等。

如下选择了较为典型的测试用例:

需求功能测试:

测试命令:

基本功能:

1)    -c  -w  -l  f:\c.txt

测试文本:磁盘F路径下的c.txt

#$Vs w
int main,this printf

输出文本:未指定则为result.txt

c.txt,字符数:
c.txt,单词数:
c.txt,行数:

2)   基本命令: -c  -w  -l  file1.c   -o output.txt

测试文本:

file1.c

int main
{
return
}
//
/**/

输出文本:output.txt

file1.c,字符数:
file1.c,单词数:
file1.c,行数:

扩展功能:

3)  测试命令:-l  -s  *.c  -w -e stop.txt

测试文本内容:

源文本:

file.c

int main
{
return
}
//
/*
int main()
a
*/

file1.c

int main
{
int a=1;
return
}
//
/**/

停用词文本:stop.txt

int main

输出文件:默认result.txt

file.c,单词数:
file.c,行数:
file1.c,单词数:
file1.c,行数:

4)  测试命令:     -l -c -a wordCount.c -o output.txt

测试文本内容: wordCount.c

#include <stdio.h>
//主函数
/*int a()
{
int b=1;
}
*/
int main()
{
printf ("hello");
return 0;
}//函数结束

输出文本:output.txt

wordCount.c,字符数:
wordCount.c,行数:
wordCount.c,代码行/空行/注释行://

5)  测试命令:-s -l -c -w *.c -e stop.txt -o output.txt -a

符合条件的测试文本:

file.c

int main
{
return
}
//
/*
int main()
a
*/

file1.c

int main
{
return
}
//
/**/

停用词文本:stop.txt

int main

输出文本:output.txt

file.c,字符数:
file.c,单词数:
file.c,行数:
file.c,代码行/空行/注释行://
file1.c,字符数:
file1.c,单词数:
file1.c,行数:
file1.c,代码行/空行/注释行://

非需求测试:

6) 安全测试:

对不存在的文本进行测试

-c file.o

输出:文件或路径不存在

---------------------------------------------------------------------------------

单元测试代码:

public class WordCountTest extends TestCase{

	File file=null;
File sourceFile=null; //源文件
File stopFile=null; //停用文本
int actual=0; //存放统计单词数或字符数行数
int[] actuals=new int [3]; //存放统计代码行空行注释行的数量
int expected=0; //存放统计单词数或字符数行数
int[] expecteds=new int [3]; //存放统计代码行空行注释行的数量
ArrayList<String> filePath=new ArrayList<String>();
//测试统计字符数函数
public void testCharacter() throws FileNotFoundException, IOException {
file=new File("file.c");
actual=wordCount.countCharacters( file);
expected=33;
assertEquals(expected, actual); } // 测试统计单词数函数
public void testWord() throws FileNotFoundException, IOException {
file=new File("file.c");
actual = wordCount.countWords(file);
expected=10;
assertEquals(expected, actual);
} // 测试统计行数函数
public void testLine() throws FileNotFoundException, IOException {
file=new File("file.c");
actual = wordCount.countLines(file);
expected=9;
assertEquals(expected, actual);
} // 测试统计代码行,空行,注释行数函数
public void testDLine() throws FileNotFoundException, IOException {
file=new File("wordCount.c");
actuals = wordCount.countDLines(file);
expecteds[0]=4;
expecteds[1]=1;
expecteds[2]=7;
assertArrayEquals(expecteds, actuals);
} // 测试采用停用文本后统计单词数函数
public void testEStop() throws Exception {
sourceFile=new File("wordCount.c");
stopFile=new File("stop.txt");
actual = wordCount.countWordsS(sourceFile, stopFile);
expected=8;
assertEquals(expected, actual);
} }

  

程序集成测试:

//测试程序功能  修改参数args内容
public class testMain extends TestCase{
String[] args=null;
File actual=null; //实际运行结果文件
File expected=null; //测试前将正确的结果存入expected文件
//有效等价类测试
public void test1() throws Exception{
args=new String[2];
args[0]="-c";
args[1]="wordCount.c";
wordCount.main(args);
actual=new File("result.txt");
expected=new File("cresult.txt");
assertEquals(expected, actual);
}
public void test2() throws Exception{
args=new String[2];
args[0]="-w";
args[1]="wordCount.c";
wordCount.main(args);
actual=new File("result.txt");
expected=new File("wresult.txt");
assertEquals(expected, actual);
}
public void test3() throws Exception{
args=new String[2];
args[0]="-l";
args[1]="wordCount.c";
wordCount.main(args);
actual=new File("result.txt");
expected=new File("lresult.txt");
assertEquals(expected, actual);
}
public void test4() throws Exception{
args=new String[2];
args[0]="-a";
args[1]="wordCount.c";
wordCount.main(args);
actual=new File("result.txt");
expected=new File("aresult.txt");
assertEquals(expected, actual);
}
public void test5() throws Exception{
args=new String[2];
args[0]="-s";
args[1]="wordCount.c";
wordCount.main(args);
actual=new File("result.txt");
expected=new File("sresult.txt");
assertEquals(expected, actual);
}
public void test6() throws Exception{
args=new String[4];
args[0]="-c";
args[1]="wordCount.c";
args[2]="-o";
args[3]="output.txt";
wordCount.main(args);
actual=new File("output.txt");
expected=new File("coresult.txt");
assertEquals(expected, actual);
}
//基础功能综合测试
public void test7() throws Exception{
args=new String[4];
args[0]="-w";
args[1]="wordCount.c";
args[2]="-c";
args[3]="-l";
wordCount.main(args);
actual=new File("result.txt");
expected=new File("wclresult.txt");
assertEquals(expected, actual);
}
//拓展功能综合测试
public void test8() throws Exception{
args=new String[5];
args[0]="-s";
args[1]="-e";
args[2]="stop.txt";
args[3]="wordCount.c";
args[4]="-a";
wordCount.main(args);
actual=new File("result.txt");
expected=new File("aseresult.txt");
assertEquals(expected, actual);
}
//基础加拓展功能综合测试
public void test9() throws Exception{
args=new String[8];
args[0]="-w";
args[1]="wordCount.c";
args[2]="-c";
args[3]="-l";
args[4]="-s";
args[5]="-e";
args[6]="stop.txt";
args[7]="-a";
wordCount.main(args);
actual=new File("result.txt");
expected=new File("beresult.txt");
assertEquals(expected, actual);
}
//基础加拓展加输出测试
public void test10() throws Exception{
args=new String[10];
args[0]="-s";
args[1]="-e";
args[2]="stop.txt";
args[3]="wordCount.c";
args[4]="-a";
args[5]="-w";
args[6]="-c";
args[7]="-l";
args[8]="-o";
args[9]="output.txt";
wordCount.main(args);
actual=new File("output.txt");
expected=new File("beoresult.txt");
assertEquals(expected, actual);
}
}

  

  

---------------------------------------------------------------------------------------

7.参考文献链接

[1]:http://blog.sina.com.cn/s/blog_680288f00100l6a2.html

[2]:https://www.cnblogs.com/xiadongqing/p/6235833.html

[3]:https://www.cnblogs.com/fqfanqi/p/6187085.html

[4]:https://www.cnblogs.com/linuxjava/p/6435911.html

[5]:http://blog.csdn.net/sunkun2013/article/details/13167099

wordCount总结的更多相关文章

  1. hadoop 2.7.3本地环境运行官方wordcount

    hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...

  2. Hadoop3 在eclipse中访问hadoop并运行WordCount实例

    前言:       毕业两年了,之前的工作一直没有接触过大数据的东西,对hadoop等比较陌生,所以最近开始学习了.对于我这样第一次学的人,过程还是充满了很多疑惑和不解的,不过我采取的策略是还是先让环 ...

  3. Eclipse 执行成功的 Hadoop-1.2.1 WordCount 源码

    万事开头难.最近在学习Hadoop,先是搭建各种版本环境,从2.2.0到2.3.0,再到1.2.1,终于都搭起来了,折腾了1周时间,之后开始尝试使用Eclipse编写小demo.仅复制一个现成的Wor ...

  4. 软件工程:Wordcount程序作业

    由于时间的关系,急着交作业,加上这一次也不是那么很认真的去做,草草写了“Wordcount程序”几个功能,即是 .txt文件的读取,能计算出文件内容的单词数,文件内容的字符数,及行数. 这次选用C来做 ...

  5. Spark源码编译并在YARN上运行WordCount实例

    在学习一门新语言时,想必我们都是"Hello World"程序开始,类似地,分布式计算框架的一个典型实例就是WordCount程序,接触过Hadoop的人肯定都知道用MapRedu ...

  6. MapReduce剖析笔记之一:从WordCount理解MapReduce的几个阶段

    WordCount是一个入门的MapReduce程序(从src\examples\org\apache\hadoop\examples粘贴过来的): package org.apache.hadoop ...

  7. 软件工程-构建之法 WordCount小程序 统计文件中字符串个数,单词个数,词频,行数

    一.前言 在之前写过一个词频统计的C语言课设,别人说你一个大三的怎么写C语言课程,我只想说我是先学习VB,VB是我编程语言的开始,然后接触到C语言及C++:再后来我是学习C++,然后反过来学习C语言, ...

  8. eclipse连hadoop2.x运行wordcount 转载

    转载地址:http://my.oschina.net/cjun/blog/475576 一.新建java工程,并且导入hadoop相关jar包 此处可以直接创建mapreduce项目就可以,不用下面折 ...

  9. Hadoop中wordcount程序

    一.测试过程中 输入命令: 首先需要在hadoop集群中添加文件 可以首先进行查看hadoop集群中文件目录 hadoop fs -ls / hadoop fs -ls -R / hadoop fs ...

  10. Hadoop示例程序WordCount详解及实例(转)

    1.图解MapReduce 2.简历过程: Input: Hello World Bye World Hello Hadoop Bye Hadoop Bye Hadoop Hello Hadoop M ...

随机推荐

  1. nodejs读取excel内容批量替换并生成新的html和新excel对照文件

    因为广告投放需要做一批对外投放下载页面,由于没有专门负责填充页面的编辑同学做,只能前端来做了, 拿到excel看了一下,需要生成200多个文件,一下子懵逼了. 这要是来回复制粘贴太low了 正好最新用 ...

  2. js改变select的选中项不触发select的change事件

    // test var selectEl = document.querySelector('select') var buttonEl = document.querySelector('butto ...

  3. 《Javascript高级程序设计》阅读记录(六):第六章 下

    这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...

  4. php7 新特性整理

    PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来越好. 在这里整理 PHP 5.1 ,PHP5.2,PHP5.3,PHP5.4,PHP ...

  5. 学习动态性能表(19)--v$undostat

    学习动态性能表 第19篇--V$UNDOSTAT  2007.6.14 本视图监控当前实例中undo空间以及事务如何运行.并统计undo空间开销,事务开销以及实例可用的查询长度. V$UNDOSTAT ...

  6. 六、Jmeter后置处理器JSON Extractor

    一.当接口返回是JSON格式的时候,就可以用JSON Extractor来抓取返回的值,用来关联或者断言. 1.首先,到V2EX中找一个接口,地址为:https://www.v2ex.com/p/7v ...

  7. RSA公钥,私钥和数字签名通用理解

    一.公钥加密 假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个 ...

  8. web基础 (三) CSS

    css 层叠样式表 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector { property: value; property: value; ... property: ...

  9. 解决CentOS遇到Qt编译(error: cannot find -lGL)

    笔者CentOS 6.5 64位,安装完成Qt5.5.1.随意新建一个Qt Widgets Application. 结果遇到Qt编译问题,提示信息如下: error: cannot find -lG ...

  10. EmguCV3.0几个控件的使用

    值方图(Histogram)是一种统计图数据,在影像处理中最常被用来统计一张图像或是感兴趣(ROI)区域的色彩分布,在这边本人使用的EmguCV 2.4.0版的内建值方图工具只有被包含在WinForm ...