第二周个人作业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 给 ...
随机推荐
- Ansible实战演练
[root@Ansible-server ~]# rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.n ...
- Python 自动化 第一周
1.Python简介 1.1.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时 ...
- 从零搭建 webpack3 环境 #1 - 安装使用
目录: (1)什么是webpack (2)webpack核心概念 (3)环境安装 (4)开始使用webpack 1.什么是webpack 官网的一幅图对webpack的解释,从图中可以看出,webpa ...
- logback中批量插入数据库的参考代码
protected void insertProperties(Map<String, String> mergedMap, Connection connection, long eve ...
- Ionic 2 开发(一)_安装与目录结构
由于公司开始使用后ionic 进行前段开发,现在需要学习下ionic,虽然是后台开发,但是还是有必要了解下的 安装Node.js 官网:http://nodejs.cn/ 自行下载安装 安装Ionic ...
- 前端学习之jquery
前端学习之jquery 1. 什么是jQuery对象? jQuery对象就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuery独有的.如果一个对象是jQuery对象,那么它 ...
- 南京邮电大学java程序设计作业在线编程第二次作业
王利国的"Java语言程序设计第2次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60 1. 表达式9==8&&3<7的运算结果是( ) ...
- 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
一.前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦 ...
- Azure AI 服务之文本翻译
当下人工智能可谓是风头正劲,几乎所有的大厂都有相关的技术栈.微软在 AI 领域自然也是投入了重注,并且以 Azure 认知服务的方式投入了市场: 也就是说作为开发者我们不需要学习太多 AI 的理论知识 ...
- 部署上次的Hapi到Windows+Docker,WindowsDocker
前言: 理论的就不多说了,具体的架构看图.web这里是上篇文章开发的Hapi服务,数据库Mysql,废话不多说,粗略的画了下,架构图如下: Mysql镜像拉取,配置 数据库镜像查找 docker se ...