软件质量与测试--第二周作业 WordCount
github地址:
**https://github.com/wzfhuster/software_test_tasks **
psp表格:
| PSP2.1 | PSP 阶段 | 预估耗时 (分钟) | 实际耗时 (分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 20 |
| · Estimate | · 估计这个任务需要多少时间 | 50 | 40 |
| Development | 开发 | 300 | 400 |
| · Analysis | · 需求分析 (包括学习新技术) | 50 | 80 |
| · Design Spec | · 生成设计文档 | 40 | 100 |
| · Design Review | · 设计复审 (和同事审核设计文档) | 60 | 50 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 40 | 59 |
| · Design | · 具体设计 | 30 | 40 |
| · Coding | · 具体编码 | 120 | 180 |
| · Code Review | · 代码复审 | 90 | 89 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 60 | 189 |
| Reporting | 报告 | 120 | 150 |
| · Test Report | · 测试报告 | 20 | 30 |
| · Size Measurement | · 计算工作量 | 12 | 10 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 50 | 60 |
| 合计 | 1072 | 1497 |
解题思路:
- 首先: 根据需求首先最传入main函数中的args解析出对应的命令,文件名
- -c命令: 由于需求中没有明确说明我默认回车换行不算字符,然后首先用BufferedReader对象逐行的读取源文件,
每一行暂时保存到String对象中,然后利用String对象的length()方法直接返回改行的字符数,然后把各行的
字符数都加起来,即得到总的字符数。 - -w命令: 对于计算单词数则同样,因为以换行隔开的也是单个单词,所以还是逐行读取,然后利用String对象的
一个split方法,就可以指定以空格,逗号作为分隔符,返回一个字符串数组,然后对字符数组的个数相加
即得单词的个数 - -l命令: 这个也就很简单了,直接用readLine()函数每读一行计数器就加一,返回总的行数
- -a命令: 这个就是在读取每一行的时候对当前行进行判断,设置三个计数器,分别记录代码行,注释行,空行的行数
当该行全是空格或者制表符或者不超过一个字符时就是空行,若是以//开头或者}//开头的就是注释行,否
则就是代码行 - -o命令: 这个就是就是将统计结果写入一个指定的文件中,代码中可以用一个ArrayList来保存之前的记录结果
最后再用 FileWriter 来将结果写入文件中
程序的设计实现过程
对命令的解析采用一个for循环,对传入的字符串数组的每个字符串都对其进行判断,看对应哪个命令就调用相应的处理程序进行处理,程序的实现我只写了一个类,在这个类中既有main函数,也有其它功能函数的实现,由于需要将多个功能的查询结果写入到一个件中所以我在类中添加了一个静态的ArrayList对象,当有这样的命令的时候:wc.exe -c -w -l -a test.txt -o result.txt每个-c,-w等命令产生的字符串输出结果都加入到ArrayList对象,当程序最后的时候再将对象中的结果一起写到result.txt中去。
代码说明:
package wordCount;
import java.io.*;
import java.util.ArrayList;
public class WordCount {
//这里创建的list用来存放每个命令处理后的输出的结果
//用来保存这些结果,需要输出到文件时,就将list中的结果都输出到指定文件中
public static ArrayList<String> sList = new ArrayList<String>();
public static void main(String[] args){
WordCount wc = new WordCount();
if(args.length>1)
{
int last = args.length -1;
String name = args[last]; //用来存放读取文件的名字
String outputName = ""; //用来存放输出文件的名字
String tmp;
//是否将结果写入某个文件的标志
int flag = 0;
//这个for用来判断是否需要将信息输出到一个文件中
for(int i=0;i<last;i++)
if(args[i].equals("-o"))
{
flag=1;
name = args[last-2];
outputName = args[last];
break;
}
//这个for用来循环读取命令行中传入的参数
for(int i=0;i<last;i++)
if(args[i].equals("-c"))
{
tmp = new String(wc.getC(name));
System.out.println(tmp);
sList.add(tmp);
}
else if(args[i].equals("-w"))
{
tmp = new String(wc.getW(name));
System.out.println(tmp);
sList.add(tmp);
}
else if(args[i].equals("-l"))
{
tmp = new String(wc.getl(name));
System.out.println(tmp);
sList.add(tmp);
}
else if(args[i].equals("-a"))
{
tmp = new String(wc.geta(name));
System.out.println(tmp);
sList.add(tmp);
}
//如果flag=1,表示需要将结果输出到一个文件中
if(flag==1)
{
wc.writeFile(outputName);
System.out.println();
System.out.println("将信息写入"+outputName+"文件成功!!!");
}
}else
System.out.println("请先输入参数!!!"); //如果wc.exe后面没有输入参数,就打印提示信息
}
//该函数用来计算指定文件中字符的个数,《其中回车换行都没计入字符数中!!!》
public String getC(String fileName)
{
int count=0;
String s;
int c;
try {
BufferedReader in = new BufferedReader(new FileReader(fileName));
//FileReader in = new FileReader(fileName);
while((s=in.readLine())!=null)
count+=s.length();
in.close();
} catch (FileNotFoundException e1) {
System.out.println("找不到文件!!!");
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fileName+", 字符数为:"+count;
}
//该函数用来计算指定文件中单词的个数
public String getW(String fileName)
{
int count=0;
String s;
try {
BufferedReader in = new BufferedReader(new FileReader(fileName));
while((s = in.readLine())!=null)
{
if(!s.isEmpty())
{
String ss [] = s.trim().split(" |,| ");
count+=ss.length;
}
}
in.close();
} catch (FileNotFoundException e1) {
System.out.println("找不到文件!!!");
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fileName+", 单词数为:"+count;
}
//该函数用来计算指定文件中的总的行数,包括空的行和注释行
public String getl(String fileName)
{
int count=0;
String s;
try {
BufferedReader in = new BufferedReader(new FileReader(fileName));
while((s = in.readLine())!=null)
++count;
in.close();
} catch (FileNotFoundException e1) {
System.out.println("找不到文件!!!");
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fileName+", 总的行数为:"+count;
}
//该函数用来返回具体的代码行数,注释行数和空的行数!!!
public String geta(String fileName)
{
int count=0,space=0,h=0;
String s;
try {
BufferedReader in = new BufferedReader(new FileReader(fileName));
while((s = in.readLine())!=null)
{
if(s.isEmpty() || s.trim().length()<=1) ++space;
else
{
int t=0;
while(t<s.length()&&s.charAt(t)==' ') ++t;
if((t+1<s.length() && s.charAt(t)=='/' && s.charAt(t+1)=='/')
|| (t+2<s.length() && s.charAt(t+1)=='/' && s.charAt(t+2)=='/')) ++h;
else
++count;
}
}
in.close();
} catch (FileNotFoundException e1) {
System.out.println("找不到文件!!!");
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fileName+", 代码行/空行/注释行:"+count+"/"+space+"/"+h;
}
//该行数用来将结果写入指定的文件中
public void writeFile(String fileName)
{
try {
FileWriter w = new FileWriter(fileName);
int i=0;
for(;i < sList.size();i++)
{
w.write(sList.get(i));
w.write("\r\n");
}
w.close();
} catch (IOException e) {
System.out.println("呵呵,在写文件过程中出现了错误!!!");
e.printStackTrace();
}
}
}
测试设计过程
- 测试没有参数输入的情况:
- wc.exe
- 测试单个功能:
- wc.exe -c test.txt
- wc.exe -w test.txt
- wc.exe -l test.txt
- wc.exe -a test.txt
- wc.exe -c test.txt -o output.txt
- 测试组合的输入功能:
- wc.exe -c -w test.txt
- wc.exe -c -l test.txt
- wc.exe -w -l test.txt
- wc.exe -c -w -l test.txt
- wc.exe -a test.txt -o output.txt
- 测试文件的绝对路径和相对路径:
- wc.exe -c D:/test.txt
- wc.exe -c test.txt
- wc.exe -c D:/test.txt -o D:/output.txt
- wc.exe -c D:/test.txt -o output.txt
- 测试错误参数的输入:
- wc.exe -c
- wc.exe test.txt -c
- ...
参考文献链接
http://blog.csdn.net/tw19811220/article/details/41040937
http://blog.csdn.net/etjnety/article/details/7842618
http://www.cnblogs.com/math/p/se-tools-001.html
软件质量与测试--第二周作业 WordCount的更多相关文章
- 软件测试第二周作业 WordCount
本人github地址: https://github.com/wenthehandsome23 psp阶段 预估耗时 (分钟) 实际耗时 (分钟) 计划 30 10 估计这个任务需要多少时间 20 ...
- 结队第二次作业——WordCount进阶需求
结队第二次作业--WordCount进阶需求 博客地址 051601135 岳冠宇 博客地址 051604103 陈思孝 博客地址 Github地址 具体分工 队友实现了爬虫功能,我实现了wordco ...
- 2017-2018-1 Java小组-1623 第二周作业
2017-2018-1 Java小组-1623 第二周作业 关于游戏软件的问题 讨论结果 20162301张师瑜 20162305李昱兴 20162306陈是奇 20162308马平川 2016231 ...
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 2019-2020-1 20209313《Linux内核原理与分析》第二周作业
2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- Java第二周作业
Java第二周作业 本周作业: 参考http://www.cnblogs.com/rocedu/p/7911138.html 学习第二三章视频 参考http://www.cnblogs.com/roc ...
- C语言--第二周作业评分和总结(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1026 一.评分要求 要求1 阅读指定博客+阅读收获+例子.(5分) 要求2 ...
随机推荐
- UVA - 10118 Free Candies 记忆化搜索经典
思路:d[a][b][c][d]表示从已经第一个篮子取了a颗糖,第二个取了b颗糖,第三个取了c颗糖,第四个取了d颗糖最多还能够获得多少糖果.首先明白一个问题:如果能分别取a,b,c,d个,不论如何取, ...
- cache缓存的BUG
坑: 1.在使用这个模版代码开发的时候,当我们改变了数据库表的设置的时候,我们都要把本地的cache缓存文件删除一下. 如果不删除的话,当我们改变数据库设置的之后,程序读取数据是从本地的缓存文件里面读 ...
- 类似fabric主机管理demo
类似于fabric的主机管理系统 可以批量对主机进行操作 批量上传文件 批量下载文件 批量执行命令 demo代码 #!/usr/bin/env python # -*- coding:utf-8 -* ...
- 如何进行系统配置 ——了解DOS下的内存
DOS操作系统最早设计时,PC机的硬件系统只支持1M字节的寻址空间,所以DOS只能管理最多1M字节的连续内存空间.在这1M内存中,又只有640K被留给应用程序使用,它们被称为常规内存或基本内存,其它3 ...
- 理解Annotation
一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...
- R语言︱R社区的简单解析(CRAN、CRAN Task View)
笔者寄语:菜鸟笔者一直觉得r CRAN离我们大家很远,在网上也很难找到这个社区的全解析教程,菜鸟我早上看到一篇文章提到了这个,于是抱着学渣学习的心态去看看这个社团的磅礴.威武. CRAN(The Co ...
- R语言︱文本挖掘套餐包之——XML+SnowballC+tm包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言︱文本挖掘套餐包之--XML+tm+Sn ...
- 关于FusionCharts图表宽度width的设置问题导致图表显示异常的解决办法
关于FusionCharts图表宽度width的设置问题导致图表显示异常的解决办法 题设: 经常使用FusionCharts图表的朋友可能会遇到这个问题.就是在FusionCharts显示的时候有时候 ...
- WINDOWS的错误代码对应的故障
WINDOWS的错误代码对应的故障 0000 操作已成功完成. 0001 错误的函数. 0002 系统找不到指定的文件. 0003 系统找不到指定的路径. 0004 系统无法打开文件. 0005 拒绝 ...
- TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClickEvent。
1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClick ...