项目地址:https://gitee.com/yangfj/wordcount_project

1.软件需求分析:

撰写PSP表格:

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

20

15

· Estimate

· 估计这个任务需要多少时间

20

15

Development

开发

960

880

· Analysis

· 需求分析 (包括学习新技术)

10

20

· Design Spec

· 生成设计文档

40

20

· Design Review

· 设计复审 (和同事审核设计文档)

10

30

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

50

10

· Design

· 具体设计

50

20

· Coding

· 具体编码

500

650

· Code Review

· 代码复审

100

30

· Test

· 测试(自我测试,修改代码,提交修改)

200

50

Reporting

报告

150

100

· Test Report

· 测试报告

80

50

· Size Measurement

· 计算工作量

20

20

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

50

30

合计

1130

995

结果分析,在完成编码撰写博客的时候,确实发现了许多计划与实际出入的地方,比如说代码规范,在实际编码的时候,根本没有考虑到这一点,只是在最终编写完成之后才意识到,于是最后才开始改编码规范,写次开发的时候就应该提前考虑,虽然只是一个人在开发。还有就是总体来说并不是很完整的进行了测试,只是有一些单元测试,以后会多了解一下代码测试这一块的技能。

2.解题思路

因为以前用到的代码管理工具都是SVN,还没有用过Git ,只是偶尔在GitHub上面逛逛,所以首先想的是成功安装Git,并且实现代码管理,然后就找了好久的资料,包括Git如何提交到码云等等,详见我的另一篇博文:

https://www.cnblogs.com/shoneworn/p/8251556.html

然后看了看题目,发现应该先确定用什么语言代码来实现,虽然自己擅长C#,也学过Python,但还是决定用java语言比较好,一个是因为自己现在正在学习java,正好可以通过这个项目提升自己,主要采用的技术是java IO流方面的技术。

1.对于常见的java项目,应该利用什么才能实现在命令行中进行输入输出的信息读取?

2.如何判断控制台是要求的统计字符数,单词数,总行数,存入特定文件的相应基础功能?

3.如何在支持基础功能的基础上,拓展其待实现的功能而又能与原代码区分开来?

 3.需求分析

具体的需求其实大致可以总结为一下几点:

1.输入:

输入指定的文件,采用程序统计文件的字符数、单词数、行数、

2.输出:

输出文件(以指定的格式)

3.拓展:

支持 返回高级选项(代码行 空行 注释行)

递归处理符合条件的文件,考虑程序的时间复杂度和空间复杂度

4.程序实现过程

项目一共两个文件,一个为主函数,一个为实现具体功能类。

mian函数:

public class WorkCount {
public static void main(String[] args) throws Exception {
// 统计一个文件的字符数,单词数,行数
Scanner input = new Scanner(System.in);
System.out.println("please input path:");
String path = input.next();
int countChar = ;
int countword = ;
int countline = ;
InputStreamReader isr = new InputStreamReader(new FileInputStream(path));
//InputStreamReader将字符流向字节流转换。
//InputStreamReader isr = new InputStreamReader(new FileInputStream(绝对文件名));
//用来读取文件中的数据
BufferedReader br = new BufferedReader(isr);//使用缓冲区,可以使用缓冲区的read(),readLine()方法;
while(br.read()!=-)//read()=-1代表数据读取完毕
{
String s = br.readLine();
countChar += s.length();//字符个数就是字符长度
countword += s.split(" ").length;//split() 方法用于把一个字符串分割成字符串数组,字符串数组的长度,就是单词个数
countline++;//因为是按行读取,所以每次增加一即可计算出行的数目
}
isr.close();//关闭文件
System.out.println("char cont "+countChar);
System.out.println("word count "+countword );
System.out.println("line count "+countline);
}
}

实现具体功能类:

返回字符的个数

int  CharCount(String s)//用来输入文件并返回字符的个数
{
int count = ;
Pattern p = Pattern.compile("[a-zA-Z]");
Matcher m = p.matcher(str);
while(m.find()){
count++;
}
return count; }
}

返回单词出现总数 :

public static int countdanci(String[] args) {

         //逐行读文件

         BufferedReaderbr = null;

         try {

              Map<String,Integer>map = newHashMap<String,Integer>();

              br = new BufferedReader(new FileReader("d:/mywords.txt"));

              Stringline;

              while(null != (line = br.readLine())){

                   System.out.println(line);

                   //将字符串用空格分隔

                   String[]ss = line.split("\\s+");

                   for(String s : ss){

                       if(map.containsKey(s)){

                            map.put(s, map.get(s)+);

                       }else{

                            map.put(s, );

                       }

                   }

              }

              Set<String>keys = map.keySet();

              for(String key : keys){

                   System.out.println(key + "有:" + map.get(key) + "个.");

              }

         }catch(FileNotFoundException e) {

              e.printStackTrace();

         }catch(IOException e) {

              e.printStackTrace();

         }finally {

              if(null != br){

                   try {

                       br.close();

                   }catch(IOException e) {

                       e.printStackTrace();

                   }

         }
}

文件总行数:

public static HangCount(String[] args)
{
try{
File file =new File("c:\\test.txt");
if(file.exists()){
FileReader fr = new FileReader(file);
LineNumberReader lnr = new LineNumberReader(fr);
int linenumber = ;
while (lnr.readLine() != null){
linenumber++;
}
System.out.println("Total number of lines : " + linenumber);
lnr.close();
}else{
System.out.println("File does not exists!");
}
}catch(IOException e){
e.printStackTrace();
}
}

文件空白行数,注释行数

public static void CountLine(File f) throws FileNotFoundException, IOException{
//通过调用一个之前定义的对象来表示此文件连接,file参数表示的路径作为参数调用javaLine方法
String strLine = "";//创建了一个对象。并且加入字符串池中
String str = fromFile(f);
//str为引用 "" 是 引用指向的的值,定义一个String 类型的变量str,并为其赋值
if (str.length() > ) {
while (str.indexOf('\n') != -) {
//通过一个wile循环体判断这个值,从而做到字符串处理,使得字符串以正确方式显示
totle++; strLine = str.substring(, str.indexOf('\n')).trim(); if (strLine.length() == ) {
blank++;
}else if (strLine.charAt() == '*' || strLine.charAt() == '/') {
comments++;
}else{
source++;
String regEx = "^*//";
if(regEx(strLine,regEx)){
comments++;
}
}
str = str.substring(str.indexOf('\n') + , str.length());
//返回给定区间的字符串,以上经过转换后,str能够正常显示
}
}
}

输出到文件:

public void outPutfile(String infilename,String outfiename)
{
try {
fileReader(infilename);
File file=new File(outfiename); if(!file.exists())
{
file.createNewFile();
}
String lineSents="";
String wordSents=" ";
String charSents=" ";
String charCon=CharCount/callCounter+"";
String lineCon=LineCount/callCounter+"";
String wordCon=WordCount/callCounter+"";
charSents=charSents.concat(charCon).concat("\r\n");//使用concat()方法链接两个字符串
lineSents=lineSents.concat(lineCon).concat("\r\n");
wordSents=wordSents.concat(wordCon).concat("\r\n");
FileWriter fw=new FileWriter(file.getAbsoluteFile());
BufferedWriter bWriter=new BufferedWriter(fw);
bWriter.write(charSents);//写入到文件
bWriter.write(lineSents);
bWriter.write(wordSents);
bWriter.close();//必须关闭才能写入文件,否则写入无效
fw.close();
if(file.length()!=)
System.out.println("write file succeed...");
else
System.out.println("write file failed...");
} catch (IOException e) {//跑出异常
// TODO Auto-generated catch block
e.printStackTrace();
}
}

5.测试过程:

wc.exe -c file.c     //返回文件 file.c 的字符数

wc.exe -w file.c     //返回文件 file.c 的单词总数

wc.exe -l file.c     //返回文件 file.c 的总行数

wc.exe -o outputFile.txt     //将结果输出到指定文件outputFile.txt

......

6.测试结果:

wc.exe -c C:\Learning\Java\code\temp\src\com\hcedu\dao\LoginDao.java

wc.exe -w C:\Learning\Java\code\temp\src\com\hcedu\dao\LoginDao.java

wc.exe -l C:\Learning\Java\code\temp\src\com\hcedu\dao\LoginDao.java

wc.exe -c C:\Learning\Java\code\temp\src\com\hcedu\dao\LoginDao.java

wc.exe -m C:\Learning\Java\code\temp\src\com\hcedu\dao\LoginDao.java

7.总结

这次的WorkCount作业,其实是一个较为完整的项目,其中包括了需求分析、系统设计、编码实现、测试分析等等。以前写代码并没有写过如此完整的代码流程,其中很多时候都没有写过文档和测试分析,通过这次的编码,我意识到了代码的安全性,程序的健壮性。规范的代码更对之后的测试分析有利。同时更要考虑到用户的感受,让代码变的更加人性化才行。

最后,其实这次的代码我还存在着许多的不足,我最开始拿到这个项目,写完需求分析之后就没有动过博客,后面逐一实现代码之后又对博客进行的删减去,总的来说,还是一直都在写代码,而忽视了文档的重要性,在以后的编码过程中,更应该加强对文档的投入。

8.参考文献

邹欣老师在《构建之法》中设计的第一项个人作业:http://www.cnblogs.com/xinz/p/7426280.html

java统计文件中字符,数字,汉字,空格数目: https://blog.csdn.net/lalaxumelala/article/details/79532159
【Java】统计文件中各单词数量:https://blog.csdn.net/cassie_m/article/details/77512473

第一次作业——WorkCount的更多相关文章

  1. C 语言学习 第一次作业总结

    第一次的作业是冯老师布置的练习题,需要在pta平台上完成.我这边看不到结果,但是透过冯老师给出的截图,同学们都还是认真的去做的.同时,我这边也布置了一个持续 3 周的作业:熟悉 git 的使用.因为后 ...

  2. 耿丹CS16-2班第一次作业汇总

    第一次作业统计完成. 注:1.作业顺序:取最早交作业的前3名,依次拿5,2,1分,前提是作业质量较高,否则轮至下一名同学得分,其余同学得0分:2.作业情况:满10分,空一题扣2分,心得写得好的有额外加 ...

  3. 软件工程(QLGY2015)第一次作业小结(含成绩)

    相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 Github项目提交 github的代码提交,大部分人都只是提交了单个文件,存在几个问题 请提交完整的项目文件到github 问题:为什 ...

  4. 2015级软工实践k班第一次作业-准备

    第一次作业-准备······ 几篇文章阅读下来发现一个事实,还是要有明确的目标,清楚自己需要做什么最为重要.然后根据目标确定需要为之所做的准备工作,考研也好,工作也罢,都是服务于自己的目标. 问题答应 ...

  5. java第一次作业0

    lsl321 java第一次作业 #1. 本章学习总结 你对于本章知识的学习总结 本章我们学习了各种java相关文件的使用,以及码云,博客,pat等程序辅助软件,这些对于我们专业的学习有非常大的帮助, ...

  6. 集大1513 & 1514班 软件工程第一次作业评分与点评

    谢谢大多数同学按时完成了作业,同学态度都比较端正,没有为了完成作业或者讨好老师而说一些假话空话. 很多同学选择CS之前并没有从兴趣或者擅长出发.这是一个普遍的现象,十年前我们是这样,十年后的孩子们还是 ...

  7. OO第一次作业总结

    OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...

  8. # C语言程序设计第一次作业1234

    ---恢复内容开始--- C语言程序设计第一次作业 1.求圆面积和周长 输入圆的半径,计算圆的周长和面积 (1)流程图 (2)测试数据及运行结果 测试数据r=3 运行结果 2.判断闰年 输入一个四位年 ...

  9. 构建之法助教园地第一次作业--点评<西北师范大学|李晓婷>

    一 博客点评 第一次作业--准备篇:https://www.cnblogs.com/Mookiepiece/p/10464606.html#4192515 点评内容: 首先,你对电脑很感兴趣,兴趣就是 ...

随机推荐

  1. Spark入门到精通--(第二节)Scala编程详解基础语法

    Scala是什么? Scala是以实现scaleable language为初衷设计出来的一门语言.官方中,称它是object-oriented language和functional languag ...

  2. Java-idea-安装配置优化等

    1.属性配置 使用版本,winzip解压版,开发工具安装目录下idea.properties文件,自定义配置路径 # idea.config.path=${user.home}/.IntelliJId ...

  3. MTSC2019第五届中国移动互联网测试开发大会北京站震撼来袭!

    MTSC2019 暨第五届中国移动互联网测试开发大会(Mobile Testing Summit China)是由国内最大的测试开发技术社区之一 TesterHome 发起的行业会议,聚焦于软件测试及 ...

  4. django-ajax post与get请求

    客户端    访问  服务器  方式:      地址栏          get      a标签           get      form表单     get/post      ajax ...

  5. python_MySQL

    原文章连接:http://www.runoob.com/python/python-mysql.html 配置数据库 conn = mysql.connector.connect(user='root ...

  6. 从AST编译解析谈到写babel插件

    之前一直在掘金上看到一些关于面试写babel插件的文章,最近也在学,以下就是学习后的总结. 关键词:AST编译解析, babel AST编译解析 AST[维基百科]:在计算机科学中,抽象语法树(Abs ...

  7. SVN在update的时候报错Please execute the 'Cleanup' command.

    需要右键clearn up 然后再update

  8. poj3155 最大密度子图

    求最大密度子图 记得在最后一次寻找的时候记得将进入的边放大那么一点点,这样有利于当每条边都满流的情况下会选择点 #include <iostream> #include <algor ...

  9. JS判断元素是否在数组内

    //判断元素是否在数组内 function contains(arr, obj) { var i = arr.length; while (i--) { if (arr[i] === obj) { r ...

  10. 51Nod 算法马拉松12 移数博弈

    点进去发现并不是博弈QAQ 一开始考虑单调队列什么乱七八糟的发现根本做不出来 (没错我一直在想枚举最大值求次大值QAQ 不妨换个思路: 我们考虑枚举次大值求最大值 设当前为now, 设now之前第一个 ...