项目地址: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. ES6 对象

    对象字面量 属性的简洁表示法 ES6允许对象的属性直接写变量,这时候属性名是变量名,属性值是变量值. const age = 12; const name = "Amy"; con ...

  2. 记一次mysql事故---纪念逝去的一上午

    虚拟机关机后第二天mysql起不来,回想一下我关机前和关机后的操作发现:关机前没关闭mysqld服务就直接init 0了,关机后将虚拟机内存由1G降到724M.笔者保证再也做过别的骚操作了. -- : ...

  3. Mac破解免费office软件

    一.下载安装包及破解工具 地址: https://pan.baidu.com/s/1hugtoLQ 密码: s5in 附官网地址 文件夹中包含三个文件: Office16安装文件 Microsoft_ ...

  4. React时间组件(时分秒补0)页面全局引用

    1.common.js export function formatTime(data){ var d = new Date(data); function doTime(d){ if(d<10 ...

  5. Cisco Packet Tracer

    ---恢复内容开始--- 1.简单局域网组建 交换机:2960  s1 终端设备:generic  pc 配置 pc1    单击>>Descktop>>IP configur ...

  6. Django框架获取各种form表单数据

    Django中获取text,password 名字:<input type="text" name="name"><br><br& ...

  7. 让hive的表注释和字段注释支持中文

    此处用的数据库类型为mysql.发现hive在初始化创建这些表的时候,大部分字段的字符集给设置成了latin1,然后collation设成了latin1_bin. 但是我们在hive中创建表时,表注释 ...

  8. [macOS] Cannot find libz when install php56

    After upgraded to 10.12 and xcode8.2, when updating php with homebrew, i got these errors: /usr/loca ...

  9. 线段树 HDU-1166 敌兵布阵

    敌兵布阵是一个线段树典题,题目如下(点此查看题目出处): Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国 ...

  10. 字典排序 sorted

    a = {6:2,8:0,1:4,-5:6,99:11,4:22} print( sorted(a.items()) ) #默认安照key排序的print( sorted(a.items(),key= ...