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项目记录的更多相关文章

  1. 软件工程wc项目,基于py

    ###WC项目文件链接:https://github.com/ILTHEW/wc.git 个人项目:WC 实践是理论的基础和验证标准,希望读者贯彻"做中学"的思想,动手实现下面的项 ...

  2. 软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序

    软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数 ...

  3. IOS客户端Coding项目记录导航

    IOS客户端Coding项目记录(一) a:UITextField设置出现清除按键 b:绘画一条下划线  表格一些设置 c:可以定义表头跟底部视图(代码接上面) d:隐藏本页的导航栏 e:UIEdge ...

  4. Unity Project Wizard (最近打开的项目记录)

    最近打开工程列表 当用Unity打开过的项目越来越多之后,在最近打开项目记录框中就会变的很长,那么如何才能删除最近打开的记录呢? Unity4.x最近打开的工程记录 Unity5.x最近打开的工程记录 ...

  5. jenkins构建项目记录2(tag)

    与jenkins构建项目记录1不同的是通过tag拉去对应版本代码 1.先安装创建(git parameter) 2.general设置 name可任意命名,下面源码管理设置时变量会引用到. 3.源码管 ...

  6. 软件工程实践-WC项目之C实现

    1.Github项目地址 https://github.com/ShadowEvan/homework 基本功能 -c 统计文件字符数(实现) -w 统计文件词数(实现) -l  统计文件行数(实现) ...

  7. 【项目记录】-液化气配送app android版

    15年底参与过甲方呼叫中心平台开发.液化气配送app android版要求1个月开发完成.开发此项目以前我只有过一周android的开发经验.(与甲方签署过保密协议,遵循职业道德有些敏感信息不能写.) ...

  8. 作业三:WC项目

    WC一个简单的文件检测系统 用c语言实现 不多说 上代码 #include<stdio.h> #include<stdlib.h> #include <io.h> ...

  9. 用spring+hibernate+struts 项目记录以及常用的用法进等

    一.hibernate1. -----BaseDao------ // 容器注入 private SessionFactory sessionFactory; public void setSessi ...

随机推荐

  1. win8下ctrl+alt+down失效问题

    最近换win8系统后用myeclipse发现这个用得最多快捷键居然不能用了. 百度后的确是显卡的快捷键冲突,但禁用显卡快捷键后仍然无效,把eclipse换成其他的不能忍. 所以把显卡快捷键换了就可以了 ...

  2. [Z] 关于Python Tornado的一些资料

    一个简单的样例: http://osedu.net/article/python/2014-03-18/501.html ioloop的官方doc: http://www.tornadoweb.org ...

  3. ubuntu安装Percona Server

    Percona Server是mysql数据库的一个衍生版本,在性能,稳定性和可管理性上都有很大的提升,目前淘宝的mysql数据库就是基于Percona Server,请原谅我这么喜欢研究淘宝的技术. ...

  4. A generic error occurred in GDI+的解决方案

    转自智慧光原文A generic error occurred in GDI+. 解决方法 使用image1.RotateFlip(RotateFlipType.Rotate90FlipNone)方法 ...

  5. Nodejs&Express

    http://www.expressjs.comhttp://github.com/lelandtseng/form-datahttp://github.com/lelandtseng/mongo-m ...

  6. GNU/Linux操作系统总览

    计算机科学本科的专业课包括高等数学.离散数学.模拟电子技术.数字电子技术.微机原理.汇编语言原理.高级程序语言.操作系统原理.高级编译原理.嵌入式原理.网络原理.计算机组成与结构等诸多科目.GNU计算 ...

  7. IOS 阻止 锁屏

    [UIApplication sharedApplication].idleTimerDisabled=YES;不自动锁屏 idleTimerDisabled

  8. MyBatis 学习记录4 MyBatis的一级缓存

    主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...

  9. 网卡流量监控脚本 ( Shell )

    #!/bin/bash # Traffic Monitor # author: Xiao Guaishou get_traffic_info(){ recv=`cat /proc/net/dev | ...

  10. JDBC中,如何动态的设置查询条件

    今天看JDBC,发现有段代码,可以减少重复的编写查询方法,如下: public List<Goddess> query(List<Map<String, Object>& ...