第二周个人作业WordCount
1.Github地址
https://github.com/JingzheWu/WordCount
2.PSP表格
| PSP2.1 | PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
| Planning | 计划 | 20 | 15 |
| · Estimate | · 估计这个任务需要多少时间 | 20 | 15 |
| Development | 开发 | 500 | 680 |
| · Analysis | · 需求分析 (包括学习新技术) | 60 | 70 |
| · Design Spec | · 生成设计文档 | 30 | 30 |
| · Design Review | · 设计复审 (和同事审核设计文档) | 10 | 10 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
| · Design | · 具体设计 | 20 | 20 |
| · Coding | · 具体编码 | 300 | 420 |
| · Code Review | · 代码复审 | 30 | 60 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 40 | 60 |
| Reporting | 报告 | 90 | 90 |
| · Test Report | · 测试报告 | 60 | 60 |
| · Size Measurement | · 计算工作量 | 20 | 15 |
| · Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 |
10 | 15 |
| 合计 | 610 | 785 |
3.解题思路
看到题目之后,大致设想了一下解题过程,先实现基本功能,再实现扩展功能,通过I/O流读取带计数文件内容,然后分别统计字符数、单词数以及行数,在设计基础功能时,统计单词数是通过空格和逗号来计算的,但是到后面有个停用词表,所以前面设计的这个方法就不能使用了,需要用到编译原理里面的词法分析的知识。由于很长时间没有写过java程序,好多知识都忘记了,实现的时候,没有设计多个类来实现,而是把这些功能放在了一个文件里,也没有进行封装,看起来有点乱。由于时间有限,到后面发现这个问题之后,也没有时间来重构代码了,所以准备在下次作业时再进行代码重构。
4.程序设计实现过程
程序通过先读取命令字符串,split函数分割,获得参数列表以及文件名等字符串,再根据文件路径读取文件,用I/O流来读取文件内容,调用BufferedReader实例的readLine方法,一次读取文件的一行,然后一行一行进行处理。
5.代码说明
变量定义
int charNum=0;//字符数
int wordNum=0;//单词数
int lineNum=0;//行数
int codeLineNum=0;//代码行数
int emptyLineNum=0;//空行数
int commentLineNum=0;//注释行数
boolean isEmpty=false;
Scanner scanner=new Scanner(System.in);
String cmd;//获取输入的命令字符串
String preCmd;//命令前缀,即wc.exe
ArrayList<String> parameter=new ArrayList<>();//命令参数列表
String filePath;//程序设计语言源文件,即input_file_name
获取参数
while (true) {
cmd=scanner.nextLine();
preCmd=cmd.split(" ")[0];
if (preCmd.equals("wc.exe")){
break;
}else {
System.out.println("命令有误,请重新输入!");
}
}
for (int i=1,cmdLen=cmd.split(" ").length;i<cmdLen-1;i++){
parameter.add(cmd.split(" ")[i]);
}
filePath=cmd.split(" ")[cmd.split(" ").length-1];
读取文件并处理
FileInputStream fileInputStream=new FileInputStream(filePath);
InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream);
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
String lineStr=bufferedReader.readLine();
while (lineStr==null){
emptyLineNum++;
lineStr=bufferedReader.readLine();
}
while (lineStr!=null){
isEmpty=false;
charNum=charNum+lineStr.length();
String[] charArr=lineStr.split("");
int index=0;
while (charArr[index].equals(" ")||charArr[index].equals(",")){
index++;
if (index==lineStr.length()){
break;
}
}//去掉该行第一个非空格非逗号字符前的空格和逗号
if (!(index==lineStr.length())){
wordNum++;
}else {
emptyLineNum++;
isEmpty=true;
}
if (lineStr.length()-index==1&&(charArr[index]=="{"||charArr[index]=="}")){
emptyLineNum++;
isEmpty=true;
}//如果该行只有一个“{”或者“}”,则算作空行
int index2=index;
for (;index<charArr.length;index++){
if ((charArr[index].equals(" ")||charArr[index].equals(","))&&(!(charArr[index-1].equals(" ")||charArr[index-1].equals(",")))){
wordNum++;
}
}
if (!isEmpty){
boolean commentFlag1=charArr[index2].equals("/")&&charArr[index2+1].equals("/");
boolean commentFlag2=charArr[index2].equals("/")&&charArr[index2+1].equals("*");
boolean commentFlag3=charArr[index2].equals("*")&&charArr[index2+1].equals("/")&&((index2+2==charArr.length)||(charArr[index2+2].equals(" ")));
if (commentFlag1||commentFlag2||commentFlag3){
commentLineNum++;
}else {
codeLineNum++;
}
}
lineNum++;
lineStr=bufferedReader.readLine();
if (lineStr==null){
emptyLineNum++;
lineStr=bufferedReader.readLine();
}
}
6.测试设计过程
wda dad 提示命令有误,重新输入 wc.exe -c qweqwe.asd 提示文件不存在 wc.exe test.c 提示请输入参数 wc.exe -c test.c 输出待测试文件字符数,并存储到result.txt文件中 wc.exe -w test.c 输出待测试文件单词数,并存储到result.txt文件中 wc.exe -l -w -c test.c 输出待测试文件行数、单词数、字符数,并存储到result.txt文件中 wc.exe -w -c test.c -o output.txt 输出待测试文件单词数、字符数,并存储到output.txt文件中 wc.exe -a test.c 输出待测试文件代码行数、空行数、注释行数,并存储到result.txt文件中 wc.exe -s *.c 提示功能开发中 wc.exe -w test.c -e stop.txt 输出待测试文件中除去停用词表单词后的单词数,并存储到result.txt文件中
7.参考文献链接
http://blog.csdn.net/ycy0706/article/details/45457311
第二周个人作业WordCount的更多相关文章
- java第二周的作业
package java第二周学习; import javax.swing.JOptionPane; public class 数学题 { private int a; private int b; ...
- 软件测试第二周个人作业:WordCount
github地址:https:/github.com/muzhailong/wc.git 第一次写博客很不容易,也算是一个好的开始吧. 1. 个人作业要求 作业简述:根据WordCount的需求描 ...
- 第二周个人作业:WordCount
github地址 https://github.com/lzwk/WordCount PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) Planning 计划 20 40 · ...
- 第二次结对作业-WordCount进阶需求
原博客 队友博客 github项目地址 目录 具体分工 需求分析 PSP表格 解题思路描述与设计实现说明 爬虫使用 代码组织与内部实现设计(类图) 算法的关键与关键实现部分流程图 附加题设计与展示 设 ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业
一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业(线性回归)
一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...
- JAVA学习第二周课后作业
Java 的基本运行单位是类.类由数据成员和函数成员组成.变量之间可以相互转换.String是一个类.static是静态.全局的意思.经过测试,Java的枚举类型定义的Size与String一样都不是 ...
- 16级第二周寒假作业H题
快速幂(三) TimeLimit:2000MS MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 计算( AB ...
- 16级第二周寒假作业E题
Home_W的位运算4 TimeLimit:2000MS MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 给 ...
随机推荐
- javaScript识别网址文本并转为链接文本
最近项目有个需求:用户之间发送消息时,如果发送者输入的信息中含有网址文本,要在接受者界面中显示网址链接,点击该链接直接跳转到网页.这个功能和 QQ 发送网址文本的效果非常像,可以说是一模一样的. 思路 ...
- Linq 集合操作符 Except,Intersect,Union
IList<string> s1 = new List<string>() { "One", "Two", "Three&qu ...
- Mego开发文档 - 复杂保存操作
复杂保存操作 Mego框架还提供了更强大的数据更新API,以简化开发工作,同时也保证的性能. 指定属性添加数据 本列中指定插入一个数据对象,并且只会插入三列数据,最后两个属性是以表达式的形式插入. u ...
- maven构建spring报错org.springframework.core.NestedRuntimeException cannot be resolved.
Error:The type org.springframework.core.NestedRuntimeException cannot be resolved. It is indirectly ...
- AWS的开发工具包和设备SDK开发工具包
一.开发工具包 二.设备sdk开发工具包
- istio入门(00)istio的学习资源
官网:https://istio.io/ 理论知识: http://www.uml.org.cn/wfw/201710131.asp 环境搭建: http://dockone.io/article/2 ...
- kubernetes入门(03)kubernetes的基本概念
一.Pod 在Kubernetes集群中,Pod是创建.部署和调度的基本单位.一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个应用的容器.在同一个Pod内部,多个容器共享存储.网络IP,以 ...
- 译《Time, Clocks, and the Ordering of Events in a Distributed System》
Motivation <Time, Clocks, and the Ordering of Events in a Distributed System>大概是在分布式领域被引用的最多的一 ...
- 从感知机到 SVM,再到深度学习(二)
这篇博文承接上一篇,详细推导了 SVM 算法,包括对偶算法,SMO 优化算法,核函数技巧等等,最后还提到用高度非线性的曲线代替超平面,就是神经网络的方法. 在第一篇中已经得到了最优间隔 ...
- python列表很聪明,支持负数索引
python列表很聪明,支持负数索引