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. 比XGBOOST更快--LightGBM介绍

    xgboost的出现,让数据民工们告别了传统的机器学习算法们:RF.GBM.SVM.LASSO.........现在,微软推出了一个新的boosting框架,想要挑战xgboost的江湖地位.笔者尝试 ...

  2. C# 如何将窗体写到Dll中

    步骤: 1.解决方案资源管理器窗口->右击项目属性 2.属性窗口->应用程序->输出类型(U)->类库

  3. swagger 接口文档,控制器 和 object类型的参数与返回值 的 注释不显示问题

    一.控制器的注释不显示:是因为配置swagger的时候没有将includeControllerXmlComments参数配置为true,因为其默认值为false 二.object 类型的参数和返回值 ...

  4. leetcode380

    class RandomizedSet { public: /** Initialize your data structure here. */ RandomizedSet() { } /** In ...

  5. leetcode168

    public class Solution { private string Convert(int k) { var s = ""; switch (k) { : s = &qu ...

  6. leetcode566

    public class Solution { public int[,] MatrixReshape(int[,] nums, int r, int c) { ); ); if (row * col ...

  7. spring-boot-maven-plugin 插件的作用

    pom文件中添加了"org.springframework.boot:spring-boot-maven-plugin"插件.在添加了该插件之后,当运行"mvn pack ...

  8. 【307】◀▶ Python 相关功能实现

    目录: 1. Python 实现下载文件 2. 删除文件名中的点 “.” 3. 让 Python 脚本暂停执行的方法 4. 添 1. Python 实现下载文件 使用 urllib 模块提供的 url ...

  9. linux磁 盘分区 挂载

    f命令查看磁盘的分区和已经使用量 利用du命令查询当前目录下的所有目录/文件所占的容量 dumpe2fs查看分区的具体使用情况 磁盘的分区–命令fdisk fdisk /dev/sda 进入这个设备m ...

  10. [iOS]使用autolayout的时候会有明明设置和父视图左右间距为0但却还有空隙问题

    有时候设置左右与父视图间距为0但却还有空隙,relative to margin 作怪,到关系里面,把这个取消掉.如关系里面的 firstitem 如果显示 xxView.trailling.marg ...