课程名称:2016级计算机科学与工程学院软件工程(西北师范大学)
课程要求:实验二 软件工程个人项目
一、需求分析
使用JAVA编程语言,开发一个统计英文文本词频的软件。软件基本功能要求如下:
1、可读入英文词数大于等于1个的任意英文文本文件。
2、能读取容纳英文原版《哈利波特》10万词以上的文章。
3、单词词频统计功能:输入从该文本中想要查找词频的一个或任意多个英文单词,显示对应单词在文本中出现的次数和柱状图。
4、高频词统计功能:从键盘输入高频词输出的个数k,按文本中词频数降序显示前k个单词的词频及单词。
5、统计文本中所有单词数量及词频数,并将单词及词频数按字典顺序输出到文件result.txt中。
二、功能设计
1、读文本功能——读入文本数据
2、用户输入功能——输入用户想要查询的单词以及想要查询高频单词的个数
3、排序功能——降序排序和按字典顺序排序
4、词频统计功能——显示输入单词在文本中出现的次数和柱状图以及降序显示前k个单词的词频及单词
5、写文件功能——将输出数据存入文件中
三、设计实现
1、本次词频统计软件项目共有两个类
(1)、Main.java
控制整个程序
<1、实现对文本文件中数据的读入
<2、对各项功能进行选择,并调用wordcount.java中相应的函数实现各项功能
(2)、wordcount.java
包括四个功能函数:
<1、显示词频和柱状图(histogram函数)——输入从该文本中想要查找词频的一个或任意多个英文单词,显示对应单词在文本中出现的次数
和柱状图。<2、输出高频词(HighWord函数)——按文本中词频数降序显示前k个单词的词频及单词。
❤️、排序(sort函数)——降序排序和按字典顺序排序
<4、写文件(output函数)——将文本中所有单词数量及词频数按字典顺序输出到文件result.txt中
2、程序设计流程图
四、测试运行
1、显示所要查询的单词词频和柱状图
2、输出词频最高的前k个单词
3、将结果输出到文件result.txt中
五、关键代码
-
1、读取英文文本
Map<String, Integer> map = new TreeMap<String, Integer>();
BufferedReader b = null;
try {
b = new BufferedReader(new FileReader(A));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件没有找到,请输入正确的文件路径!");
}
-
2、显示词频和柱状图(histogram)
void histogram(Map<String, Integer> map){
System.out.println("请输入需要查询的单词 :");
String words = in.nextLine();
String[] word= words.split(",");//输入的单词之间以逗号分隔
float sum;
for(int i=0; i<word.length; i++) {
for(Map.Entry<String,Integer> y : map.entrySet()) { //可以查看Map类中的entrySet()方法和Entry()方法,for中是一个赋值语句
if(word[i].equals(y.getKey()))
{
System.out.println("单词 —— "+y.getKey() + " 出现 (" + y.getValue()+" )次");
sum=(float)(y.getValue())/500;
for(int j=0;j<sum;j++){
System.out.print("*");
}
System.out.println();
}
}
}
}
-
3、功能菜单
public class Main {
static Scanner in = new Scanner(System.in);
public static void main(String[] args)throws IOException{
Map<String, Integer> map = new TreeMap<String, Integer>();
// 读取要处理的文件,并将它放在b中
System.out.println("~~~~~~~~词频统计小软件~~~~~~~~");
System.out.println("请选择以下功能序号:");
System.out.println("1、读取文本");
System.out.println("2、显示所要查询的单词词频");
System.out.println("3、输出词频最高的前k个单词");
System.out.println("4、输出结果存入result.txt中");
System.out.println("0、退出");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
int y= in.nextInt();
int i=0;
六、总结
在一个软件项目的开发过程中,首先需要进行需求分析,对一个项目有整体的认知。其次,将整个项目按照功能分成若干个模块,每个模块完成自己对应的功能,并且各个模块之间相互联系,协作完成所有功能。在本次词频统计软件项目中,我创建了两个类。Main类控制整个程序,读入文本文件中的数据,显示菜单并调用wordcount类中的各个函数。wordcount类中包含四个函数:histogram函数(显示词频和柱状图)、HighWord函数(输出高频词)、sort函数(降序排序和按字典顺序排序)、output函数(将结果输出到文件result.txt中),分别实现各自的功能,并相互联系实现整个软件项目。
七、PSP展示
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 20 | 25 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 15 | 10 |
Development | 开发 | 250 | 300 |
Analysis | 需求分析 (包括学习新技术) | 20 | 25 |
Design Spec | 生成设计文档 | 10 | 12 |
Design Review | 设计复审 | 10 | 25 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
Design | 具体设计 | 15 | 20 |
Coding | 具体编码 | 200 | 300 |
Code Review | 代码复审 | 15 | 25 |
Test | 测试(自我测试,修改代码,提交修改) | 25 | 30 |
Reporting | 报告 | 15 | 20 |
Test Report | 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 12 | 15 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 20 | 15 |
从PSP中可以看出计划完成需要的时间与实际完成需要的时间之间是有一定的差距的,主要原因还是基础不扎实,对Java掌握的不熟练,导致写代码时很困难。同时,在第二次个人项目的完成过程中,我深刻认识到了自己在某些方面的薄弱,不论是在整体的构思上,还是在分模块的设计上,都不是很顺利。最后通过查阅资料,请教同学,才成功完成项目二。从这次项目中也明白了自己还有许多地方需要学习,对于Java的相关知识点需要尽快去回顾和学习,努力做好之后的项目。