第一次作业——WorkCount
项目地址: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
第一次作业——WorkCount的更多相关文章
- C 语言学习 第一次作业总结
第一次的作业是冯老师布置的练习题,需要在pta平台上完成.我这边看不到结果,但是透过冯老师给出的截图,同学们都还是认真的去做的.同时,我这边也布置了一个持续 3 周的作业:熟悉 git 的使用.因为后 ...
- 耿丹CS16-2班第一次作业汇总
第一次作业统计完成. 注:1.作业顺序:取最早交作业的前3名,依次拿5,2,1分,前提是作业质量较高,否则轮至下一名同学得分,其余同学得0分:2.作业情况:满10分,空一题扣2分,心得写得好的有额外加 ...
- 软件工程(QLGY2015)第一次作业小结(含成绩)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 Github项目提交 github的代码提交,大部分人都只是提交了单个文件,存在几个问题 请提交完整的项目文件到github 问题:为什 ...
- 2015级软工实践k班第一次作业-准备
第一次作业-准备······ 几篇文章阅读下来发现一个事实,还是要有明确的目标,清楚自己需要做什么最为重要.然后根据目标确定需要为之所做的准备工作,考研也好,工作也罢,都是服务于自己的目标. 问题答应 ...
- java第一次作业0
lsl321 java第一次作业 #1. 本章学习总结 你对于本章知识的学习总结 本章我们学习了各种java相关文件的使用,以及码云,博客,pat等程序辅助软件,这些对于我们专业的学习有非常大的帮助, ...
- 集大1513 & 1514班 软件工程第一次作业评分与点评
谢谢大多数同学按时完成了作业,同学态度都比较端正,没有为了完成作业或者讨好老师而说一些假话空话. 很多同学选择CS之前并没有从兴趣或者擅长出发.这是一个普遍的现象,十年前我们是这样,十年后的孩子们还是 ...
- OO第一次作业总结
OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...
- # C语言程序设计第一次作业1234
---恢复内容开始--- C语言程序设计第一次作业 1.求圆面积和周长 输入圆的半径,计算圆的周长和面积 (1)流程图 (2)测试数据及运行结果 测试数据r=3 运行结果 2.判断闰年 输入一个四位年 ...
- 构建之法助教园地第一次作业--点评<西北师范大学|李晓婷>
一 博客点评 第一次作业--准备篇:https://www.cnblogs.com/Mookiepiece/p/10464606.html#4192515 点评内容: 首先,你对电脑很感兴趣,兴趣就是 ...
随机推荐
- Spark入门到精通--(第二节)Scala编程详解基础语法
Scala是什么? Scala是以实现scaleable language为初衷设计出来的一门语言.官方中,称它是object-oriented language和functional languag ...
- Java-idea-安装配置优化等
1.属性配置 使用版本,winzip解压版,开发工具安装目录下idea.properties文件,自定义配置路径 # idea.config.path=${user.home}/.IntelliJId ...
- MTSC2019第五届中国移动互联网测试开发大会北京站震撼来袭!
MTSC2019 暨第五届中国移动互联网测试开发大会(Mobile Testing Summit China)是由国内最大的测试开发技术社区之一 TesterHome 发起的行业会议,聚焦于软件测试及 ...
- django-ajax post与get请求
客户端 访问 服务器 方式: 地址栏 get a标签 get form表单 get/post ajax ...
- python_MySQL
原文章连接:http://www.runoob.com/python/python-mysql.html 配置数据库 conn = mysql.connector.connect(user='root ...
- 从AST编译解析谈到写babel插件
之前一直在掘金上看到一些关于面试写babel插件的文章,最近也在学,以下就是学习后的总结. 关键词:AST编译解析, babel AST编译解析 AST[维基百科]:在计算机科学中,抽象语法树(Abs ...
- SVN在update的时候报错Please execute the 'Cleanup' command.
需要右键clearn up 然后再update
- poj3155 最大密度子图
求最大密度子图 记得在最后一次寻找的时候记得将进入的边放大那么一点点,这样有利于当每条边都满流的情况下会选择点 #include <iostream> #include <algor ...
- JS判断元素是否在数组内
//判断元素是否在数组内 function contains(arr, obj) { var i = arr.length; while (i--) { if (arr[i] === obj) { r ...
- 51Nod 算法马拉松12 移数博弈
点进去发现并不是博弈QAQ 一开始考虑单调队列什么乱七八糟的发现根本做不出来 (没错我一直在想枚举最大值求次大值QAQ 不妨换个思路: 我们考虑枚举次大值求最大值 设当前为now, 设now之前第一个 ...