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. python‘s second day for me

    in     not in 主要用来检测一些字符串是否存在,或者避免一些字符串 while True: comment = input('请输入你的评论') if '顾清秋' in comment: ...

  2. day9-数据库操作与Paramiko模块

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: 1 ...

  3. 通过Java代码装配Bean

    上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...

  4. A标签的href设置为#代表什么意思?

    空锚点<a href="#abc">a link <#>表示跳到锚点abc,<a href="#">a link <# ...

  5. 跟着太白老师学python 10day 函数的动态参数 *args, **kwargs, 形参的位置顺序

    1. *args 接收实参的位置参数, **kwargs接收实参的关键字参数 def func(*args, **kwargs): print(args, kwargs) func(1, 2, 3, ...

  6. aop中的顾问

    通知只能指定织入的时间点,目标方法之前,之后,环绕,还是异常时. 要想指定切入点就要使用顾问

  7. Opencv轮廓计数(学习)

    #include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/xfeatures2d.hpp> ...

  8. Navicat修改查询保存路径

    mysql使用navicat查询时有时候会有很多sql语句, ctrl+s时自动保存在C:\Users\Administrator\Documents\Navicat\MySQL\servers\lo ...

  9. 79. Word Search在字母矩阵中查找单词

    [抄题]: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...

  10. [C++] c pointer

    the nature of pointer const keyword const int*  p int const *p int*  const p int const a const int a ...