201671030103 仇素龙 实验二 词频统计软件项目报告

一、课程名称:

2016级计算机科学与工程学院软件工程(西北师范大学)

二、课程要求:

实验二 软件工程个人项目

三、实验目标:

(1)掌握软件项目个人开发流程。
(2)掌握Github上发布软件项目的操作方法。

四、实验内容:

(一)需求分析

尝试按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发。软件基本功能要求如下:

  • 程序可读入任意英文文本文件,改文件中英文词数大于等于1个,且能读取容纳英文原版《哈利波特》10万词以上的文章。
  • 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图。
  • 高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
  • 统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。

    (二)功能设计

  • 文件的读入输出功能:读取文件sourse.txt,能容纳10万单词以上。
  • 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图。
  • 高频词统计功能:用户输入高频词个数k,程序返回k个高频词以及每个单词的词频。
  • 排序功能:实现按照词频数降序,按照字典顺序排序。
  • 菜单功能:利用do-while语句实现词频统计的基本功能循环使用。

(三)设计实现

该词频统计软件项目共有一个主类,包含主函数和三个功能函数。
主函数Main.java用来控制整个流程:读入文本、单词词频统计、柱状图展示。
三个基本函数:
函数WordNum():统计指定单词的词频,可用柱状图显示。
函数Before():可按文本中词频数降序显示前k个单词的词频及单词。
函数WriteTxt():将文本中的单词及其词频按照字典顺序输出到文件result.txt文件中。

五、测试运行

1、指定单词词频统计以及统计前8个单词的词频及单词

2、将sourse.txt文本中的单词及其词频按照字典顺序输出到文件result.txt文件中。

六、优秀代码片段

    1、筛选出文章中的英文单词
    BufferedReader br = new BufferedReader(new FileReader(fileName));  
    List<String> lists = new ArrayList<String>();           //存储过滤后单词的列表  
    String readLine = null;
    while((readLine = br.readLine()) != null){  
              String[] wordsArr1 = readLine.split("[^a-zA-Z]");   //过滤出只含有字母的  
             for (String word : wordsArr1) {  
              if(word.length() != 0){                       //去除长度为0的行  
                   lists.add(word);  
            }  
    }  
    2、存储单词计数信息,并进行降序排列
    Map<String, Integer> wordsCount = new TreeMap<String,Integer>();  //存储单词计数信息,key值为单词,value为单词数                       
    for (String li : lists) {  
        if(wordsCount.get(li) != null){  
            wordsCount.put(li,wordsCount.get(li) + 1);  
        }else{  
            wordsCount.put(li,1);  
        }
    }
    ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(wordsCount.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            return o2.getValue() - o1.getValue(); // 降序排列
        }
    });   

七、总结

      我在做这个项目之前,原本打算着手写代码,可是写着写着感觉没有一点思绪,最后实在写不出来,就对此进行分析,结果发现这次程序设计包含的模块其实很清楚。我先进行需求分析,然后对功能模块进行具体分析,将该程序设计的文本输入输出、单词储存排序以及统计词频都串联起来,各功能独立实现,最终完成了本次项目设计。

八、PSP

PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 20 20
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 20 15
Development 开发 300 300
Analysis 需求分析 (包括学习新技术) 15 15
Design Spec 生成设计文档 10 12
Design Review 设计复审 (和同事审核设计文档) 5 8
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 10
Design 具体设计 15 15
Coding 具体编码 200 300
Code Review 代码复审 10 10
Test 测试(自我测试,修改代码,提交修改) 30 30
Reporting 报告 30 20
Test Report 测试报告 5 5
Size Measurement 计算工作量 10 5
Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 20 20

九、设计经验

    在设计项目的过程中,一定要进行需求分析,并且划分模块。

点击查看源代码

猜你喜欢

转载自www.cnblogs.com/nunw-qslhd/p/10558763.html