第二周作业wordcount

github项目链接https://github.com/liqia/WordCount

1.项目简介

对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。

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

wc.exe [parameter] [input_file_name]

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

2.项目psp表格

PSP2.1表格


PSP2.1


PSP阶段


预估耗时

(分钟)


实际耗时

(分钟)


Planning


计划

 60  100

· Estimate


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

 两天 一天半 

Development


开发

 一天 一天 

· Analysis


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

 180    240

· Design Spec


· 生成设计文档

 50    60

· Design Review


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

 30 30 

· Coding Standard


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

 20 60 

· Design


· 具体设计

 100 120 

· Coding


· 具体编码

 240 260 

· Code Review


· 代码复审

 30 50 

· Test


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

 120 60 

Reporting


报告

 140 100 

· Test Report


· 测试报告

 50 30 

· Size Measurement


· 计算工作量

 40 60 

· Postmortem & Process Improvement Plan


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

 60 60 

3.思路

首先要有对java文件处理的,因为要读文件还要写文件;

对字符进行统计,就要会一些正则表达式去处理这些字符串;

为了便于管理项目还要将项目推到GitHub上;

4.程序设计实现

(1)首先要对输入的参数进行处理,得出要调用哪些功能模块;

    为了满足需求中的输出顺序,我使用一个特定数组a[参数的个数]来表示每一个可能出现的参数存在不存在,存在则在相应的位置置1,扫描完参数之后,就可以按照需求规定的顺序进行处理了。详情请看代码

  代码:

  

public static void main(String[] args) {    int[] canshu=new int[5];//0-4分别表示字符、单词、行数、代码行数/空行数/注释行、递归处理 的参数存在不存在    String file = new String();    String outputFile = new String();    String stopListFile = new String();    int flag=0;    for(int i=0;i<args.length;i++) {        if (args[i].equals("-c")) canshu[0]=1;        else if (args[i].equals("-w")) canshu[1]=1;        else if (args[i].equals("-l")) canshu[2]=1;        else if (args[i].equals("-a")) canshu[3]=1;        else if (args[i].equals("-s")) canshu[4]=1;        else if (args[i].equals("-o"))        {            if (i==args.length-1) erro("参数不匹配");            if (Pattern.compile("\\w+\\.txt").matcher(args[i+1]).find())            {                outputFile=args[i+1];                i++;            }            else {                erro("输出文件名不正确");            }        }        else if (args[i].equals("-e"))        {            if (i==args.length-1) erro("参数不匹配");            if (Pattern.compile("\\w+\\.txt").matcher(args[i+1]).find())            {                stopListFile=args[i+1];                i++;            }            else {                erro("参数不匹配");            }        }        else if (Pattern.compile("(\\w+|\\*)\\.\\w+").matcher(args[i]).find()) {            if (i==0) erro("输入参数不正确");            flag=1;            file=args[i];        }        else {            erro("参数不匹配");        }    }    if (flag == 0) erro("参数不匹配");

execute(canshu,file,stopListFile,outputFile);}

(2)按照功能需求编写各个模块

    将文件中的字符一次性读到String中:

static public String retext(String fileName) {    if (fileName == null) {        return null;    }    InputStream is = null;    try {        is = new FileInputStream(fileName);    } catch (FileNotFoundException e) {        e.printStackTrace();        erro("找不到指定文件");    }    String text = null;    try {        byte[] b = new byte[is.available()];//available函数将会获取输入流中字节总数        is.read(b);//根据前面获得的字节总数,一次性读出所有字节        text = new String(b);        is.close();    } catch (FileNotFoundException var5) {        var5.printStackTrace();    } catch (IOException var6) {        var6.printStackTrace();    }    return text;}

统计单词数,行数:使用String类中的split函数用正则表达式匹配进行分割
String[] strings = text.split("\\.|,|\\s");

将结果写入文件:
static public void output(String text, String outputFile) {    try {        FileOutputStream fos = new FileOutputStream(outputFile,true);//第二个参数Ture表示从文件末尾追加写入        fos.write(text.getBytes());        fos.close();    }    catch (Exception e) {        System.out.println(e.getMessage());    }}
停用词表:首先将词表文件读出,然后分割成各个词,再进行单词统计的时候判断单词时候是否再停用词表中,以此决定计数与否

返回代码行/空行/注释行:

按行读取文件,判断空行的时候就匹配正则表达式中的\s,以及是否是}单独一行判断注释的时候,对于“//”可以这样写正则表达式
\\s*//.*|\\}//.*}对于“/**/”就需要再匹配到“/*”的时候置一个用于标记的flag为ture,之后的每一行都是注释,直到匹配到“*/”并将flag置为0;详细代码:
public class CountLine {    private int cntCode=0, cntNode=0, cntSpace=0;    private boolean flagNode = false;    public int[] reA(String fileName) {        BufferedReader br = null;        try {            br = new BufferedReader(new FileReader(fileName));            String line=null;            while((line = br.readLine()) != null)                pattern(line);        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        System.out.println("注释行: " + cntNode);        System.out.println("空行: " + cntSpace);        System.out.println("代码行: " + cntCode);        System.out.println("总行: " + (cntNode+cntSpace+cntCode));        return new int[]{cntCode, cntSpace, cntNode};    }

private  void pattern(String line) {        // TODO Auto-generated method stub        String regxNodeBegin = "\\s*/\\*.*";        String regxNodeEnd = ".*\\*/\\s*";        String regx = "\\s*//.*|\\}//.*}";        String regxSpace = "(\\s*)|(\\s*(\\{|\\})\\s*)";        int i=line.length();        if(line.matches(regxNodeBegin) && line.matches(regxNodeEnd)){            ++cntNode;            return ;        }        if(line.matches(regxNodeBegin)){            ++cntNode;            flagNode = true;        } else if(line.matches(regxNodeEnd)){            ++cntNode;            flagNode = false;        } else if(line.matches(regxSpace)||line.equals("\uFEFF"))            ++cntSpace;        else if(line.matches(regx))            ++cntNode;        else if(flagNode)            ++cntNode;        else ++cntCode;    }}5.测试设计过程考虑到字符串为空的时候可能会有意想不到的bug 所以再测试过程中尽量的会去进行边界测试。
        //测试函数retext        String text = WordCount.retext("src/momo/File.txt");//        String text1 = WordCount.retext(" ");        System.out.println(text);;        //测试函数reWord        int testReWord1 = WordCount.reWorld(null, null);        int testReWord2 = WordCount.reWorld(text, "whetu.txt");        //测试reCount函数        int testReCount = WordCount.reCount(null);        int testReCount1 = WordCount.reCount(text);        //测试reLine函数        int testReLine = WordCount.reLine(null);        int testReLine1 = WordCount.reLine(text);        //测试output函数        WordCount.output(null,"whetu.txt");        WordCount.output("123","whetu.txt");6.参考文件链接
 java文件读取的几种方式https://www.cnblogs.com/hudie/p/5845187.html java正则表达式http://www.runoob.com/java/java-regular-expressions.html java中获取文件夹或则文件路径的方法https://www.cnblogs.com/tk55/p/6064160.html idea如何打包jarhttps://jingyan.baidu.com/article/7e4409531fbf292fc1e2ef51.html

原文地址:https://www.cnblogs.com/liqia/p/8608602.html

时间: 2024-11-08 13:04:21

第二周作业wordcount的相关文章

软件测试第二周作业 wordcount

软件测试第二周作业 wordcount Github地址 https://github.com/mxz96102/word_count PSP2.1表格 PSP2.1 PSP 阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 25 30 · Estimate · 估计这个任务需要多少时间 150 252 Development 开发     · Analysis · 需求分析 (包括学习新技术) 20 20 · Design Spec · 生成设计文档 0 0 · Desig

软件质量与测试第二周作业 WordCount

第二周作业 WordCount 一.Github 地址 https://github.com/llag9810/Software-Quality-and-Testing-Wordcount 二.PSP2.1 表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 60 25 · Estimate · 估计这个任务需要多少时间 30 15 Development 开发 600 810 · Analysis · 需求分析 (包括学习新技术) 60 60 · D

第二周作业 WordCount

https://github.com/HuangDongPeng/WordCount.git 1.1  PSP PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 30 30 · Estimate · 估计这个任务需要多少时间 5h 12h Development 开发 2h 4h · Analysis · 需求分析 (包括学习新技术) 30min 30min · Design Spec · 生成设计文档 - - · Design Review · 设计复审

解题报告——2018级2016第二学期第二周作业

解题报告——2018级2016第二学期第二周作业 D:迷宫问题 题目描述: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. 输入 一个5 × 5的二维数组,表示一个迷宫.数据保证有唯一解. 输出 左上角到右

马哥linux 培训第二周作业

注意:第二周作业,请将以下题目整理在51cto博客当中,完成后请将对应的博文链接地址提交在答案栏中,提交格式如下:学号+姓名+博文链接地址eg:1+张三+http://mageedu.blog.51cto.com/4265610/1794420 本周作业内容:1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 文件管理的命令有cp.mv.rm 复制命令:cp 用法: cp [-adfilprsu] 来源文件(source) 目标文件(destination) cp [o

第二周作业补交(请老师看一下)

#include<stdio.h> #include<math.h> int main(void) { int money,year; double rate,sum; printf("Enter money:"); scanf("%d",&money); printf("Enter year:"); scanf("%d",&year); printf("Enter rate:

魏昊卿——《Linux内核分析》第二周作业:了解操作系统是怎样工作的

魏昊卿——<Linux内核分析>第二周作业:了解操作系统是怎样工作的 一.实验部分 使用实验楼的虚拟机打开shell cd LinuxKernel/linux-3.9.4 qemu -kernel arch/x86/boot/bzImage 然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c 使用自己的Linux系统环境搭建过程参见mykernel,其中也可以找到一个简单的时间片轮转多道程序内核代码 mymain.c myinterr

学习linux第二周作业

第二周作业: 本周作业内容: 1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. touch,rm,mv,cp,file,ls,chmod,chown,ln,rename, touch 修改文件atime,如果文件不存在,那么创建该文件. rm:删除文件. -r:循环删除,包含文件和目录 -f:强制删除,布询问. -i:询问是否删除. 默认情况下,系统自带别名,rm=rm -i mv:移动文件,可以在移动的过程中重命名文件或文件夹. 例如:移动重命名mytest1目录为

软件工程 第二周作业

##软件工程第二周作业 提出问题 1. 一般来说,想要自己的程序跑得又快又好,就要减少函数的反复调用,但有所得则必有所失,效能提高就有可能伴随着程序的稳定性的降低,这两者应该如何权衡呢? 2. 关于5.3.5 老板驱动的流程,这种开发流程模式存在着一些问题,那要如何解决这些问题呢? 这种模式当然也有它的问题. 领导对许多技术细节是外行. 领导未必懂得软件项目的管理,领导的权威影响了自由的交流和创造. 领导最擅长的管理方式是行政命令,这未必能管好软件团队或任何需要创造力的团队. 领导的精力有限,领