wc项目记录
1、Github项目地址:https://github.com/3116004700/ruanjiangongcheng
2、预估时间见PSP表格。
3、解题思路描述:
在看到这个项目的时候我就想到了利用java里面的IO流来实现这个项目,统计文件中的字符数、单词数、和行数,统计行数可以选择利用bufferreader来按行读出文件中的内容,设置一个变量来统计行数,直到整个文件全部读完;字符数可以通过字节流进行统计,相对来说也比较简单,这个项目相对而言难点我认为是对于单词的界定,究竟满足什么条件才算一个完整的单词,这是需要仔细考虑的,我最先想到的就是利用空格来界定单词,但是这种方法误差太大,不可能做到精确统计,然后就是想到了正则表达式,但是由于正则表达式之前没有接触过,对于我来说还是一个陌生的知识,这是需要我去学习的内容。
我的想法是先通过简单的逻辑判断大致上实现功能,然后通过对正则表达式的学习逐步实现相对而言比较精确的统计。
4、设计实现过程:
这个项目我分了两个类,一个是statistics类,里面有存放字符数、单词数、行数的变量以及相应统计字符数、单词数、行数的方法;另一个类是一个测试类,里面有一个测试的test方法和main函数,test方法功能就是对用户输入的文件路径、选择输出的内容进行判断,并且通过传参的方式将用户数据传到statistics类的方法中,main方法就是调用test方法,作为一个程序入口的存在。
5、代码说明:
主要的代码部分就是三个统计方法:
(1)统计字符数的方法-charSum()
设计思路:因为是要统计字符数,所以我选择采用字节流来完成这个方法,一个字符一个字符的读,读出一个判断一个,直到文件全部读完。
具体实现:
int charSum(String fName){
int flag;
int num = 0;
on_off = true;
File file = new File(fName);
FileReader fr = null;
try {
fr = new FileReader(file);//采用字节流读文件的内容
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
//e.printStackTrace();
System.out.println("文件路径输入有误");
on_off = false;
}
if(on_off){
try {
while((flag=fr.read())!=-1){//读出一个字节便判断一下,只要不为空,num++
num++;
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return num;
}else{
return -1;
}
}
(2)统计单词的方法-wordSum()
设计思路:使用bufferreader缓冲流来读,按行读入,然后使用正则表达式进行单词的判断。
具体实现:
int wordSum(String fName){
on_off = true;
int num = 0;
String str = null;
String s = "\\d+.\\d+|\\w+";//用来界定单词的通配符
Pattern pattern=Pattern.compile(s);
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(fName);
} catch (FileNotFoundException e2) {
// TODO 自动生成的 catch 块
//e2.printStackTrace();
System.out.println("文件路径输入有误");
on_off = false;
}
if(on_off){
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
try {
while((str = bufferedReader.readLine()) != null)
{
Matcher ma=pattern.matcher(str);
while(ma.find()){
// if(num%10 == 0 &&num>1)System.out.println();
// System.out.print(ma.group()+" "); //可以选择将所有的单词打印输出。
num++;
}
}
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
return num;
}else{
return -1;
}
}
(3)统计行数的方法-rowSum()
设计思路:这个方法相对来说比较简单,与wordSum()的读入方法相同,按行读入,每次读入时进行计数,直到全部的行全部读完。
具体实现:
int rowSum(String fName){
on_off = true;
String flag = null;
int num = 0;
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(fName);
} catch (FileNotFoundException e2) {
// TODO 自动生成的 catch 块
//e2.printStackTrace();
System.out.println("文件路径输入有误");
on_off = false;
}
if(on_off){
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
try {
while((flag = bufferedReader.readLine()) != null)//对读入的每一行进行判断是否为空行,如果不是,则num++
{
num++;
}
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
return num;
}else{
return -1;
}
}
(4)其他代码的说明:
因为不是主要的实现代码,在这里简单的说明一下,就不贴出了,完整的源代码已经上传GitHub,链接地址开头已经给出。
除了以上的统计方法,源文件里还有一个choose()方法,这个方法的目的就是对用户的输入数据进行处理,通过参数的方式传到相应的方法中去,使得程序能够运行起来。还有一点就是choose()方法和三个主要的统计方法都写了异常处理机制,针对用户的输入数据不符合规范的问题,没有简单的抛出异常,而是通过提示用户输入有误,并且回调choose()方法使用户重新输入,增强了用户的体验。
6、测试运行:
测试文件:

(1)测试统计字符数:

(2)测试统计单词数(为了效果明显,将所有的单词全都打印了):

(3)测试统计行数:

7、各部分预计耗费时间和实际耗费时间:
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 40 | 60 |
| · Estimate | · 估计这个任务需要多少时间 | 50 | 70 |
| Development | 开发 | 700 | 800 |
| · Analysis | · 需求分析 (包括学习新技术) | 30 | 70 |
| · Design Spec | · 生成设计文档 | 20 | 120 |
| · Design Review | · 设计复审 (和同事审核设计文档) | 60 | 150 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
| · Design | · 具体设计 | 40 | 50 |
| · Coding | · 具体编码 | 210 | 200 |
| · Code Review | · 代码复审 | 30 | 30 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 100 | 00 |
| Reporting | 报告 | 60 | 90 |
| · Test Report | · 测试报告 | 30 | 30 |
| · Size Measurement | · 计算工作量 | 30 | 30 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
| 合计 | 1200 | 1500 |
8、代码覆盖率:

9、项目小结:
这次项目只完成了基本的部分,因为之前一直在学JavaScript,对java的掌握并不是很好,也算是通过这个项目对java的知识的重新学习。这个项目的实现并不难,主要是IO流与正则表达式的使用,采用控制台输出的方式显示结果,省掉了GUI的设计过程。
虽然项目不大,但是学习了如何从零开始一个项目,并且对每个阶段的时间进行记录,同时学会了使用GitHub来记录项目开发过程,这是之前没有接触过的,能更清晰的看到自己的项目改动记录。
wc项目记录的更多相关文章
- 软件工程wc项目,基于py
###WC项目文件链接:https://github.com/ILTHEW/wc.git 个人项目:WC 实践是理论的基础和验证标准,希望读者贯彻"做中学"的思想,动手实现下面的项 ...
- 软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序
软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数 ...
- IOS客户端Coding项目记录导航
IOS客户端Coding项目记录(一) a:UITextField设置出现清除按键 b:绘画一条下划线 表格一些设置 c:可以定义表头跟底部视图(代码接上面) d:隐藏本页的导航栏 e:UIEdge ...
- Unity Project Wizard (最近打开的项目记录)
最近打开工程列表 当用Unity打开过的项目越来越多之后,在最近打开项目记录框中就会变的很长,那么如何才能删除最近打开的记录呢? Unity4.x最近打开的工程记录 Unity5.x最近打开的工程记录 ...
- jenkins构建项目记录2(tag)
与jenkins构建项目记录1不同的是通过tag拉去对应版本代码 1.先安装创建(git parameter) 2.general设置 name可任意命名,下面源码管理设置时变量会引用到. 3.源码管 ...
- 软件工程实践-WC项目之C实现
1.Github项目地址 https://github.com/ShadowEvan/homework 基本功能 -c 统计文件字符数(实现) -w 统计文件词数(实现) -l 统计文件行数(实现) ...
- 【项目记录】-液化气配送app android版
15年底参与过甲方呼叫中心平台开发.液化气配送app android版要求1个月开发完成.开发此项目以前我只有过一周android的开发经验.(与甲方签署过保密协议,遵循职业道德有些敏感信息不能写.) ...
- 作业三:WC项目
WC一个简单的文件检测系统 用c语言实现 不多说 上代码 #include<stdio.h> #include<stdlib.h> #include <io.h> ...
- 用spring+hibernate+struts 项目记录以及常用的用法进等
一.hibernate1. -----BaseDao------ // 容器注入 private SessionFactory sessionFactory; public void setSessi ...
随机推荐
- 25_java之Properities集合|对象序列化和反序列化
01Properties集合的特点 * A: Properties集合的特点 * a: Properties类介绍 * Properties 类表示了一个持久的属性集.Properties 可保存在流 ...
- 05_java之方法
01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. 02方法的定义格式 * A: 方法的格式 * 修饰符 返回值类型 方法名(参数类型 参 ...
- Linux下编译、安装php
一.apache环境下php的安装步骤如下:[注意:编译安装php前,应先安装好apache,因为编译php时要用到apache的路径] 1. 在http://www.php.net/download ...
- C语言调用汇编
程序的入口是main,在main里调用汇编的函数. 首先要解决怎么定义函数的问题 在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现. 在汇编里面,用EXPORT 把C语言定义的 ...
- git之项目上传
git之项目上传 需求:将项目代码上传至github 前期准备: 1.github账号注册 2.安装git环境,可以打开且使用git shell. 3.生成SSH key并与github账号绑定 步骤 ...
- 教你看懂Code128条形码
首 页 条码控件 条码技术 条码新闻 合作伙伴 联系我们 常见问题 电话:010-84827961 当前位置:条形码控件网 > 条形码控件技术文章 > >正文 教你看懂C ...
- Windows Server 2003 简体中文企业版
Windows Server 2003 简体中文企业版,真正免激活. CD-KEY:JB88F-WT2Q3-DPXTT-Y8GHG-7YYQY 安装序列号:JCGMJ-TC669-KCBG7-HB8X ...
- ffmpeg问题汇总及解决方案 <设置avformat_open_input 超时><转>
1:如果数据是rtp/rtsp传输的话,ffmpeg会每隔30s(哪里设置该值?)发送一个keepalive包,如果ipc支持GET_PARAMETER命令,就发该命令等ipc回复以确认ipc还活着. ...
- angular的service与factory
angular里的service是一个单例对象,在应用生命周期结束的时候(关闭浏览器)才会被清除.而controllers在不需要的时候就会被销毁了. factory是angular里的一种ser ...
- 关于Remoting的个人使用心得
最经几天比较闲写了一个基于Tcp网络通信的聊天程序,写的过程中实现了文件传输,可是却怎样也无法将文件名传送过去,期间想过用通信的端口发送文件的名称,但是又要自己定义一个协议,觉得那样比较麻烦,于是想到 ...