软测第二周作业WordCount

一、Github地址:

https://github.com/duwei1996/wc

二、PSP2.1表格

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

3030

· Estimate

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

3030

Development

开发

540900

· Analysis

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

60120

· Design Spec

· 生成设计文档

00

· Design Review

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

00

· Coding Standard

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

60120

· Design

· 具体设计

6060

· Coding

· 具体编码

240360

· Code Review

· 代码复审

60120

· Test

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

6060

Reporting

报告

90120

· Test Report

· 测试报告

3045

· Size Measurement

· 计算工作量

3030

· Postmortem & Process Improvement Plan

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

3045
 

合计

7001050

三、设计思路

1.程序设计两个主要方法baseFunction()和extendFunction(),分别用于实现基本功能和扩展功能

2.设计辅助方法如countChar()、countLine()等供上面两个方法调用

3.根据接收的命令参数,判断执行相应的操作

四、主要代码

1.main函数

  从输入参数获取要处理的文件, 并对文件做基本功能和扩展功能的处理

public static void main(String[] args) throws Exception{ File file = new File(args[args.length-1]);     baseFunction(args,file);extendFunction(args,file); 
}

 

2.baseFunction函数和baseCount函数

  调用baseCount方法,根据参数,输出相应结果

public static void baseFunction(String[] strings, File file)throws IOException{if (file == null || !file.exists())throw new FileNotFoundException(file + ",文件不存在!");baseCount(file);List<String> list = Arrays.asList(strings);if (list.contains("-c")){//countChar()System.out.println(file.getName() + "," + result1); } if (list.contains("-w")&& !list.contains("-e")){ //countWord() System.out.println(file.getName() + "," + result2); } if (list.contains("-l")){ //counLine() System.out.println(file.getName() + "," + result3); } if (list.contains("-o")){ String content = new String(file.getName() + "\r\n" + result1 + "\r\n" + result2 + "\r\n" + result3); Path outPath = Paths.get("output.txt"); File output = new File(outPath.toString()); Files.write(outPath,content.getBytes()); } }

  baseCount方法用于读取文件内容,并计算字符、单词和行数

 public static void baseCount(File file) throws IOException{BufferedReader br = helper(file);String s = null;while ((s = br.readLine()) != null){s = br.readLine();countChar(s);countWord(s);countLine(s);}}

 

3.extendFunction函数和extendCount函数

  调用baseCount方法,根据参数,输出相应结果  

public static void extendFunction(String[] strings,File file)throws IOException{extendCount(file);List<String> list = Arrays.asList(strings);if (list.contains("-s")){//recFile(file);}if (list.contains("-a")){System.out.println(file.getName() +",代码行 / 空行 / 注释行:" + codeLineNum + "/" + blankLineNum + "/" + annotationLineNum); } if (list.contains("-w")&&list.contains("-e")){ baseCount(file); String s1 = list.get(list.indexOf("-w")+1); String s2 = list.get(list.indexOf("-e")+1); File file1 = new File(s1); File file2 = new File(s2); int sameNum = stopList(file1,file2); System.out.println(file.getName() +",单词数:" + (wordNum - sameNum)); } }

  extendCount方法

public static void extendCount(File file) throws IOException{exCountLine(file);recFile(file);}

  exCountLine方法

public static void exCountLine(File file) throws IOException {if (file == null || !file.exists())throw new FileNotFoundException(file + ",文件不存在!");//fileCount ++;   // 文件数累加if (file.isDirectory()) {recFile(file);} else {BufferedReader bufr = null; try { // 将指定路径的文件与字符流绑定 bufr = new BufferedReader(new InputStreamReader(new FileInputStream(file))); } catch (FileNotFoundException e) { throw new FileNotFoundException(file + ",文件不存在!" + e); } // 定义匹配每一行的正则匹配器 Pattern annotationLinePattern = Pattern.compile("((//)|(/\\*+)|((^\\s)*\\*)|((^\\s)*\\*+/))+", Pattern.MULTILINE + Pattern.DOTALL); // 注释匹配器(匹配单行、多行、文档注释)  Pattern blankLinePattern = Pattern.compile("^\\s*$"); // 空白行匹配器(匹配回车、tab键、空格)  Pattern codeLinePattern = Pattern.compile("(?!import|package).+;\\s*(((//)|(/\\*+)).*)*", Pattern.MULTILINE + Pattern.DOTALL); // 代码行匹配器(以分号结束为一行有效语句,但不包括import和package语句) // 遍历文件中的每一行,并根据正则匹配的结果记录每一行匹配的结果 String line = null; try { while ((line = bufr.readLine()) != null) { if (annotationLinePattern.matcher(line).find()) { annotationLineNum++; } if (blankLinePattern.matcher(line).find()) { blankLineNum++; } if (codeLinePattern.matcher(line).matches()) { codeLineNum++; } } } catch (IOException e) { throw new RuntimeException("读取文件失败!" + e); } finally { try { bufr.close(); // 关闭文件输入流并释放系统资源 } catch (IOException e) { throw new RuntimeException("关闭文件输入流失败!"); } } } }

  recFile函数,实现递归处理文件夹

public static void  recFile(File file) throws IOException{File[] files = file.listFiles(new FileFilter() {public boolean accept(File pathname) {return pathname.getName().endsWith(".c") || pathname.isDirectory();}});for (File target : files) {extendCount(target);}}

  stopList函数,实现禁用单词计数;

public static int stopList(File file1,File file2) throws IOException{String[] strings1 = word(file1);String[] strings2 = word(file2);return same(strings1,strings2);}public static String[] word(File file) throws IOException{BufferedReader br = helper(file); String s = null; String[] content = null; while ((s=br.readLine())!=null){ s = br.readLine(); String a = ","; s.replaceAll(a," "); content = s.split(" "); } return content; } public static int same(String[] a,String[] b){ ArrayList<String> same = new ArrayList<String>(); ArrayList<String> temp = new ArrayList<String>(); for (int i = 0; i < a.length; i++) { temp.add(a[i]); //把数组a中的元素放到Set中,可以去除重复的元素  } for (int j = 0; j < b.length; j++) { //把数组b中的元素添加到temp中 //如果temp中已存在相同的元素,则temp.add(b[j])返回false if(!temp.add(b[j])) same.add(b[j]); } return same.size(); }

 

五、测试

1.基本功能

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

测试文本

命令与结果

 

2.扩展功能

wc.exe -s            //递归处理目录下符合条件的文件
wc.exe -a file.c     //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt  // 停用词表,统计文件单词总数时,不统计该表中的单词

禁用列表

命令与结果

     

     

注:另外两个功能尚未实现

六、体会

  通过编程,更深地体会到需求设计的重要性;通过测试,更加了解需求与产品之间的差别,以及测试的必要性和重要性。

 

七、参考文献

 http://www.cnblogs.com/ningjing-zhiyuan/p/8563562.html

 

 

 


转载于:https://www.cnblogs.com/duwei1996/p/8613783.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hook java android_Android Hook Java的的一個改進版本

Hook Java的的一個改進版本《注入安卓進程&#xff0c;並Hook java世界的方法》這篇好文相信大家都看這&#xff0c;里面所提到的方法估計大家也都試過。不過里面的所用的方法&#xff0c;我發現有兩個可以改進的地方。改進點一&#xff1a;更簡單地修改java方法為本地方法.../…

VB6转换C#2010函数替换

VB6转换C#2010函数替换 VB6 ---------------->C#2010 1、InStr(strKey, " ")-->strKey.IndexOf(" ") InStr([start, ]string1, string2[, compare]) 返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中&#xff0c;从start开始找stri…

C#读写文本文件

C#中读写文本文件.txt文件既可以用File类也可用StreamReader、StreamWrite类。这两种方法都需要引用using System.IO命名空间。 下面分别给出例子&#xff1a; 1.File类写入文本文件&#xff1a; 1 private void btnTextWrite_Click(object sender, EventArgs e)2 …

java redirect 跨域_如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式...

如何解决跨域重定向携带参数的问题&#xff1f;不使用将参数拼接在重定向url末尾的方式需求&#xff0c;项目A在服务器A上&#xff0c;需要重定向到服务器B上项目B&#xff0c;并且需要携带参数&#xff0c;参数对用户不可见&#xff0c;所以不可以将参数拼接在重定向url后面&a…

RichTextBox的使用

WPF里面虽然很多形式上跟Winform一样&#xff0c;但是控件的使用上面还是会有很多诧异。RichTextBox就是一个例子&#xff0c;是的&#xff0c;在WPF里面对这个控件可以做很多Winform很难做的效果出来。比如在对RichTextBox插入图片&#xff0c;winform时代除了用复制粘贴这种借…

前端自动化测试工具:SlimerJS、phantomJS 和 CasperJS

对于富客户端的 Web 应用页面&#xff0c;自动登录、页面修改、抓取页面内容、屏幕截图、页面功能测试…面对这些需求&#xff0c;使用后端语言需要花费不少的精力才能实现。此时 SlimerJS、phantomJS 或 CasperJS 或许是更好的一种选择。 一、PhantomJS 和 SlimerJS PhantomJS…

java 封装 继承 堕胎_Java的继承、封装和多态

一、继承继承就是子类继承父类的特征和行为&#xff0c;使得子类对象(实例)具有父类的实例域和方法&#xff0c;或子类从父类继承方法&#xff0c;使得子类具有父类相同的行为。继承的特性子类拥有父类非 private 的属性、方法。子类可以拥有自己的属性和方法&#xff0c;即子类…

HTML5学习笔记简明版(4):新元素之video,audio,meter,datalist,keygen,output

video 通过<video>标签&#xff0c;我们可以抛弃最近不怎么讨好的Flash&#xff0c;直接在页面中播放视频文件。视频文件自然是最符合语义化的文件格式&#xff0c;但该元素标签同样支持音频与图片。 过去(及目前)&#xff0c;我们通常要使用类似下面这样繁冗丑陋的代码来…

P2782 友好城市

题目描述 有一条横贯东西的大河&#xff0c;河有笔直的南北两岸&#xff0c;岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸&#xff0c;而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市&#xff0c;但…

五个在线图形工具创建简单的设计元素

有很多网站可以为图形元素生成提供服务&#xff0c;但获得非常好的工具并不容易。这就是为什么我共享五个在线的图形工具的原因 Logotype Maker 这是一个简单而自由的做标志的Web工具&#xff0c;它可以帮助您创建一个标志 BgPatterns BgPatterns按几次按键&#xff0c;做背景图…

java shape类_Java——Shape类

Description定义一个形状类Shape&#xff0c;提供计算周长getPerimeter()和面积getArea()的函数定义一个子类正方形类Square继承自Shape类&#xff0c;拥有边长属性&#xff0c;提供构造函数&#xff0c;能够计算周长getPerimeter()和面积getArea()定义一个子类长方形类Rectang…

sulin Python3.6爬虫+Djiago2.0+Mysql --实例demo

1.切换到项目目录下&#xff0c;启动测试服务器 manage.py runserver 192.168.0.108:8888 2.设置相关配置 项目目录展示如下&#xff1a; beauty>settings.py 修改 2.1 添加app到应用程序中 2.2 设置模板路径 2.3 配置数据为mysql 2.4设置静态文件路径 2.5设置漏油 3.beau…

dubbo的invoke命令_dubbo 调试服务telnet命令

1.概述在我们使用dubbo实现分布式布局时&#xff0c;如果我们想测试我们刚写好的service层服务是否正确时&#xff0c;通常要将service层和web层同时开启&#xff0c;通过浏览器调用controller层端口&#xff0c;达到测试service层的目的。有时&#xff0c;这样的测试方法过于麻…

18个不常见的C#关键字,您使用过几个?

18个不常见的C#关键字&#xff0c;您使用过几个&#xff1f;1、__arglist 让我们先从__arglist开始。 __arglist是用来给方法传送参数。通常我们是通过函数头部指定的参数列表给方法传递参数的。如果我们想要给方法传递一组新的参数&#xff0c;我们需要重载方法。如果我们想…

C指针详解

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运…

java collection api_Java Stream和Collection比较:何时以及如何从Java API返回?

向您展示一些可以非常方便地使用Java Stream流的场景以及如何使用它们的示例。本文基于标准Java库java.util.stream。它既与反应流无关&#xff0c;也与诸如Vavr之类的其他流实现无关。另外&#xff0c;我将不介绍诸如并行执行之类的流的高级细节。首先&#xff0c;让我们简要讨…

依赖属性

项目的WF中用到了依赖属性, 有点晕, 不明白, 先来段代码: public static DependencyProperty IsSignInProperty DependencyProperty.Register("IsSignIn", typeof(System.String), typeof(StateMachineWF.WF1)); [DesignerSerializationVisibilityAttribute(Designe…

[UE4]集合:TSet容器

一、TSet<T>是什么 UE4中&#xff0c;除了TArray动态数组外&#xff0c;还提供了各种各样的模板容器。这一节&#xff0c;我们就介绍集合容器——TSet<T>。类似于TArray<T>&#xff0c;尖括号里面的T是模板类型&#xff0c;可以是任何C类型。一个集合表示了一…

【汇总】flash单个文件上传

之前有朋友给我发送email&#xff0c;询问我是否有单个文件上传的源代码&#xff0c;因为当时写这个好像是在09年&#xff0c;所以放哪了一时也没找着。后来整理硬盘的时候&#xff0c;找到了源码&#xff0c;所以决定来个汇总&#xff08;之前写过的关于flashjs上传文件的例子…

2018.3.24 struct

好了今天听完了struct&#xff0c;感觉也差不多了&#xff0c;后面的视频不想听了&#xff0c;io啊预处理啊什么的用时候现学就好了。主要是就这么光听却没有作业可做真的有点不爽。 明天开始15-213&#xff0c;反正手头也有c primer plus了&#xff0c;后面遇到什么问题看书就…