作业要求 |
实验二 软件工程个人项目 |
课程目标 |
通过学习这门课程,深入了解软件开发的标准过程,从软件生命周期的8个阶段分析各个阶段的开发任务,摒弃以往开发软件的方法。 |
作业意义 |
此次作业能帮助我掌握软件项目个人开发流程和Github上发布软件项目的操作方法 |
需求分析(根据作业要求中给出的进行分析)
- 程序可以读入任意英文文本文件,能读取容纳10万词以上的文章,程序需要很壮健。
- 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,可显示对应单词在文本中出现的次数和柱状图,由柱状图显示单词出现的频率的高低。
- 高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
- 统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
功能设计
- 读入读出文件功能(将文件进行读取,存放),这个是对于第一条和第四条需求所需要的一部分功能。
- 用户输入功能(用户输入想要查询的单词,以及查询高频单词的个数),这个是对于第二条和第三条需求所需要的一部分功能。
- 词频统计功能,这个是对于第二条、第三条和第四条需求所需要的一部分功能。
- 排序功能(降序排序和按字典顺序排序),这个是针对第三条、第四条需求和所需要的一部分功能。
- 显示功能(显示柱状图,显示前k个高频单词的词频,显示指定单词出现的次数),这个是对于第二条和第三条需求所需要的一部分功能。
设计实现
该程序共有四个类:
- 包含主函数main的主类:Test.java,主要就是控制整个程序流程,读入文本文件,统计单词出现的次数,然后分别调用不同的类的方法去实现功能,对用户输入的单词进行查询词频,并且由查询出的数据进行柱状图的表示。
- 指定单词词频统计功能类: Wordcount.java,对用户输入的单词进行处理,查询单词出现的次数。
- 高频词统计功能类:Highwordcount.java,读取用户输入的k值,对整个文本文件进行降序排序,输出前k个单词和词频。
- 单词及词频数按字典顺序输出:Wordout.java,获取整个文档,将单词及词频数按字典顺序输出到result.txt中,保存。
测试运行
测试功能一截图:
测试功能二截图:
测试功能三截图:
测试功能四截图:
代码
- 我为什么要粘贴这段代码,因为这段代码编写过程中查阅了很多资料,由于资料类型繁多,就不一一列举了。这段代码是关于柱状图这个需求的。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
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 |
分享