201671010428沙沙:词频统计软件项目报告
课程名称 | 2016级计算机科学与工程学院软件工程(西北师范大学) |
---|---|
作业要求 | 实验二 软件工程个人项目 |
课程目标 | 通过学习这门课程,深入了解软件开发的标准过程,从软件生命周期的8个阶段分析各个阶段的开发任务,摒弃以往开发软件的方法。 |
作业意义 | 此次作业能帮助我掌握软件项目个人开发流程和Github上发布软件项目的操作方法 |
需求分析(根据作业要求中给出的进行分析)
- 程序可以读入任意英文文本文件,能读取容纳10万词以上的文章,程序需要很壮健。
- 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,可显示对应单词在文本中出现的次数和柱状图,由柱状图显示单词出现的频率的高低。
- 高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
- 统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
功能设计
- 读入读出文件功能(将文件进行读取,存放),这个是对于第一条和第四条需求所需要的一部分功能。
- 用户输入功能(用户输入想要查询的单词,以及查询高频单词的个数),这个是对于第二条和第三条需求所需要的一部分功能。
- 词频统计功能,这个是对于第二条、第三条和第四条需求所需要的一部分功能。
- 排序功能(降序排序和按字典顺序排序),这个是针对第三条、第四条需求和所需要的一部分功能。
- 显示功能(显示柱状图,显示前k个高频单词的词频,显示指定单词出现的次数),这个是对于第二条和第三条需求所需要的一部分功能。
###设计实现 ### ####该程序共有四个类: #### - 包含主函数main的主类:Test.java,主要就是控制整个程序流程,读入文本文件,统计单词出现的次数,然后分别调用不同的类的方法去实现功能,对用户输入的单词进行查询词频,并且由查询出的数据进行柱状图的表示。 - 指定单词词频统计功能类: Wordcount.java,对用户输入的单词进行处理,查询单词出现的次数。 - 高频词统计功能类:Highwordcount.java,读取用户输入的k值,对整个文本文件进行降序排序,输出前k个单词和词频。 - 单词及词频数按字典顺序输出:Wordout.java,获取整个文档,将单词及词频数按字典顺序输出到result.txt中,保存。
###测试运行 ### ####测试功能一截图: #### ![](https://img2018.cnblogs.com/blog/1614512/201903/1614512-20190316234258072-644160611.png) ####测试功能二截图: #### ![](https://img2018.cnblogs.com/blog/1614512/201903/1614512-20190316234451762-2117266811.png) ####测试功能三截图: #### ![](https://img2018.cnblogs.com/blog/1614512/201903/1614512-20190316234603380-1527420511.png) ####测试功能四截图: #### ![](https://img2018.cnblogs.com/blog/1614512/201903/1614512-20190316234648830-1051080585.png)
###代码 ### ####- 我为什么要粘贴这段代码,因为这段代码编写过程中查阅了很多资料,由于资料类型繁多,就不一一列举了。这段代码是关于柱状图这个需求的。Java中柱状图的画法有很多种,可以在导入jar包的基础上,调用方法去构造,也可以通过重写JFrame中的paint()方法来进行构造,每种方法都是可行的,看你自己的选择,这段代码中涉及在Java中我们可能不常用的一些方法,对象,我也通过写注释的方法来进行了标注。 ####
public void paint(Graphics g){
int Width = getWidth();
int Height = getHeight();
int leftMargin = 50;//柱形图左边界
int topMargin = 50;//柱形图上边界
Graphics2D g2 = (Graphics2D) g;
int ruler = Height-topMargin;
int rulerStep = ruler/20;//将当前的高度评分为20个单位
g2.setColor(Color.WHITE);//绘制白色背景
g2.fillRect(0, 0, Width, Height);//绘制矩形图
g2.setColor(Color.LIGHT_GRAY);
for(int i=0;i<rulerStep;i++){
g2.drawString((400-20*i)+"个", 8, topMargin+rulerStep*i);//绘制Y轴上的数据
}
g2.setColor(Color.PINK);
int m=0;
for(int i = 0;i<wordCount.length;i++){
int value = wordsCount.get(wordCount[i]);
int step = (m+1)*40;//设置每隔柱形图的水平间隔为40
g2.fillRoundRect(leftMargin+step*2,Height-value, 40, value, 40, 10);//绘制每个柱状条
g2.drawString(wordCount[i], leftMargin+step*2, Height-value-5); //标识每个柱状条
m++;
}
}
###总结 ### - 在进行需求分析时,将整个程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立了必要的联系,通过每个模块的互相协作完成整个程序功能,其次采用了自顶向下的方法,将问题划分为几个部分,然后再将各个部分再进行细化,直到分解为较好解决问题为止。这样做的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化,在后期的开发过程中遇到了很多问题,由于每个模块的功能相对独立,所以改起来也没有很麻烦。
###PSP ###
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 15 | 15 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 15 | 15 |
Development | 开发 | 146 | 218 |
·· Analysis | 需求分析 (包括学习新技术) | 15 | 10 |
· Design Spec | · 生成设计文档 | 15 | 15 |
· Design Review | · 设计复审 (和同事审核设计文档) | 3 | 5 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 3 | 3 |
· Design | 具体设计 | 20 | 25 |
· Coding | 具体编码 | 50 | 120 |
· Code Review | · 代码复审 | 15 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 25 | 20 |
Reporting | 报告 | 25 | 30 |
·· Test Report | · 测试报告 | 10 | 15 |
· Size Measurement | 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结 ,并提出过程改进计划 | 10 | 10 |
分享
- 从表中可以看出在每个阶段自己预估的时间和实际的时间还是有一定的差距,对于Java有些内容还是掌握不够,基础不是很扎实,对软件开发过程的每个阶段还不是很熟悉,导致开发过程较为困难,但是不管是什么困难都可以通过很多方式来得到解决,希望自己能在以后的学习过程中扎好基础,在软件开发过程中去体会软件工程的魅力。