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. switch case 语法

    switch (条件){ case 第一种: 执行语句 break: case 第二种情况: 执行语句 break: default: 执行语句: break: }

  2. bzoj 3887: Grass Cownoisseur Tarjan+Topusort

    题目: 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) 题解: 首先考虑简单 ...

  3. shell 去重

    group=`cat config.properties  |            grep -v "^$" |                 grep -v "^# ...

  4. Mysql事件的创建和使用

    1.查看事件是否开启SHOW VARIABLES LIKE 'event_scheduler'; 2.开启事件SET GLOBAL event_scheduler = ON; 3.创建事件DELIMI ...

  5. MQTT协议通俗讲解

    参考 Reference v3.1.1 英文原版 中文翻译版 其他资源 网站 MQTT官方主页 Eclipse Paho 项目主页 测试工具 MQTT Spy(基于JDK) Chrome插件 MQTT ...

  6. laravel csrf保护

    有时候我们的项目需要和外部的项目进行接口对接,如果是post的方式请求;laravel要求csrf保护 但是别人是ci框架或者没有csrf_token的;该如何处理呢? 可以把我们不需要csrf的ur ...

  7. HDU3887(树dfs序列+树状数组)

    Counting Offspring Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  8. 转载:MongoDB 在 58 同城百亿量级数据下的应用实践

    为什么要使用 MongoDB? MongoDB 这个来源英文单词“humongous”,homongous 这个单词的意思是“巨大的”.“奇大无比的”,从 MongoDB 单词本身可以看出它的目标是提 ...

  9. 2018年长沙理工大学第十三届程序设计竞赛 Dzzq的离散数学教室1

    Dzzq的离散数学教室1 链接:https://www.nowcoder.com/acm/contest/96/D来源:牛客网 zzq的离散数学教室1 时间限制:C/C++ 1秒,其他语言2秒 空间限 ...

  10. Oracle Flushback 学习测试

    Oracle Flushback 学习测试:三思笔记 Flashback恢复 从9i开始,利用oracle查询的多版本一致的特点,实现从回滚段中读取一定时间内在表中操作的数据,被称为 flashbac ...