201671030103 仇素龙 实验四软件工程结对项目

项目内容
这个作业属于哪个课程任课教师首页链接
这个作业的要求在哪里作业链接地址
课程学习目标熟悉软件开发整体流程,提升自身能力
本次作业在哪个具体方面帮助我们实现目标第一次体验一个完整的工程

任务一:

  • 点评作业的博客:https://www.cnblogs.com/jsj-hxl/p/10561076.html
  • github链接地址: https://github.com/Queey/WordCount
  • 点评内容:
    本篇博文结构清晰,分别从需求分析、功能设计、设计实现和测试运行做了详细分析,内容比较完整,但是也有一定的缺点,比如在需求分析中指出指定单词词频统计功能可显示对应单词在文本中出现的次数和柱状图,但是博文里面没有实现柱状图。博文结构与PSP中“任务内容”列存在对应关系,PSP中的数据可以明确显示这个项目计划、开发和完成报告的时间分配情况,PSP中“计划共完成需要的时间”与“实际完成需要的时间”有些任务可以在计划完成的时间内完成,而有些任务超出了计划完成任务的时间,其主要原因与项目本身密切相关,一方面项目有一定的难度,另一方面由于自身经验不足,完成项目的时候缺乏经验,导致实际完成项目的时间超出了预期完成项目的时间。
  • 点评心得:
    通过运行博主的代码,对方代码在书写方面符合代码书写规范,命名格式完全符合代码规范要求,代码格式整洁,注释部分也很详细。对比自己的博文和代码,我还是有很多不足之处,因此,在接下来的实验中我会慢慢改善自己的不足,尽量写出结构清晰、内容完整的博文。

    任务二:

    (一)需求分析

    按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,结对完成英文文本词频统计的软件开发。软件基本功能要求如下:
    (1)实验2要求的功能;
    (2)单词频数利用可视化柱状图;
    1616110-20190402225229728-1223177694.png

(3)统计该文本行数及字符数;
(4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
(5)可处理任意用户导入的任意英文文本;
(6)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(7)附加分功能:统计文本中除冠词、代词、介词之外的高频词;

(二)软件设计:

类图
1616110-20190402192043191-332538227.png

(三)核心功能代码展示:

(1)单词频数利用可视化柱状图实现

public JFreeChart ShowCountHistogram(BufferedReader bufferedReader) throws IOException {                
    CategoryDataset dataset = getDataSet(bufferedReader);
    JFreeChart chart = ChartFactory.createBarChart3D(
                         "英文文本词频统计图",           // 图表标题
                        "单词名称",                     // 目录轴的显示标签
                        "次数",                       // 数值轴的显示标签
                        dataset,                    // 数据集
                        PlotOrientation.VERTICAL,   // 图表方向:水平、垂直
                        true,                       // 是否显示图例(对于简单的柱状图必须是false)
                        false,                      // 是否生成工具
                        false                       // 是否生成URL链接
                        );                                                  
    CategoryPlot plot=chart.getCategoryPlot();      //获取图表区域对象
    CategoryAxis domainAxis=plot.getDomainAxis();   //水平底部列表
     domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14));       //水平底部标题
     domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));   //垂直标题
     ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
     rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
      chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
      chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));     //设置标题字体
    return chart;
}

(2)统计文本中除冠词、代词、介词之外的高频词的实现

public Map<String, Integer> selectExceptFunctionWord(BufferedReader bufferedReader) throws IOException {
    Map<String, Integer> map = this.selectWordCountByDOrder(bufferedReader);
    Map<String, Integer> exceptFunction = new LinkedHashMap<String, Integer>();
    for (Map.Entry<String, Integer> w :map.entrySet())  {
        if(!w.getKey().equals("the")&&!w.getKey().equals("is")&&!w.getKey().equals("you")&&!w.getKey().equals("yourself")&&!w.getKey().equals("your")&&!w.getKey().equals("them")&&!w.getKey().equals("their")&&!w.getKey().equals("to")&&!w.getKey().equals("by")&&!w.getKey().equals("is")&&!w.getKey().equals("a")&&!w.getKey().equals("and")&&!w.getKey().equals("was")&&!w.getKey().equals("has")&&!w.getKey().equals("had")&&!w.getKey().equals("I")&&!w.getKey().equals("for")&&!w.getKey().equals("my")&&!w.getKey().equals("me")&&!w.getKey().equals("with")&&!w.getKey().equals("of")&&!w.getKey().equals("in")&&!w.getKey().equals("on")&&!w.getKey().equals("that")&&!w.getKey().equals("it")&&!w.getKey().equals("The")&&!w.getKey().equals("at")&&!w.getKey().equals("which")&&!w.getKey().equals("he")&&!w.getKey().equals("as")
                 &&!w.getKey().equals("but")&&!w.getKey().equals("his")&&!w.getKey().equals("from")&&!w.getKey().equals("some")&&!w.getKey().equals("be")&&!w.getKey().equals("were")&&!w.getKey().equals("not") &&!w.getKey().equals("they")&&!w.getKey().equals("this")&&!w.getKey().equals("an")&&!w.getKey().equals("no")&&!w.getKey().equals("into")&&!w.getKey().equals("It")&&!w.getKey().equals("there")&&!w.getKey().equals("But")&&!w.getKey().equals("him")&&!w.getKey().equals("could")&&!w.getKey().equals("been")&&!w.getKey().equals("would")&&!w.getKey().equals("she")&&!w.getKey().equals("then")&&!w.getKey().equals("Then")&&!w.getKey().equals("have"))
                {
            
            exceptFunction.put(w.getKey(), w.getValue());
        }}
    

    return exceptFunction;
}

(3)读取文本获取降序词频

    public Map<String, Integer> selectWordCountByDOrder(BufferedReader bufferedReader) throws IOException {
    Map<String, Integer> map = this.AllWordCount(bufferedReader);
    List<Map.Entry<String, Integer>> nlist = new LinkedList<Map.Entry<String, Integer>>(map.entrySet());
    Collections.sort(nlist, new Comparator<Map.Entry<String, Integer>>()
    {
        @Override
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2)
        {
            int compare = (o1.getValue()).compareTo(o2.getValue());
            return -compare;
        }
    });

    Map<String, Integer> result = new LinkedHashMap<String, Integer>();
    for (Map.Entry<String, Integer> entry : nlist) {
        result.put(entry.getKey(), entry.getValue());
    }
    
    return result;
     }

(四)程序运行:

(1)实验2要求的功能
主界面
1616110-20190402222000430-1393657176.jpg

统计该文本行数及字符数
1616110-20190402222141046-736203564.png

读取文本获取词频,按照字典排序
1616110-20190402222554244-823867484.png

(2)单词频数利用可视化柱状图
1616110-20190402222618032-1937119519.png

(3)读取文本获取指定单词出现的次数
1616110-20190402222711919-1385896778.jpg

1616110-20190402222728534-1399361272.png
(4)读取文本获取指定前K个高频词
1616110-20190402222844486-1645476035.png

1616110-20190402222857765-406445505.jpg

(5)读取文本获取降序词频
1616110-20190402222937900-53274162.png

(6)统计文本中除冠词、代词、介词之外的高频词
1616110-20190402223014225-2092638355.png

(五)描述结对的过程,提供两人在讨论、细化和编程时的结对照片(非摆拍)

1616110-20190402190547954-1724231871.jpg1616110-20190402190618711-333608170.jpg

(六)PSP

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

(七)总结

通过这次结对项目,我深刻的理解了1+1>2的含义。在编写这次项目的过程中由于我们两个的编程水平都不太好,需要学习的东西太多,所以在学习心得技术和具体实现的时候花费了很多的时间,但是两个人在学习和讨论的效率明显大于一个人的,我们可以互相讲解自己看懂的或者学懂得技术,这样节约了大量的时间。但是在结对项目的过程中也存在很多的缺点,比如沟通不好两个人就会重复做事情,这样反而降低了项目的进度,所以在两个人的合作中良好的沟通显得格外重要。最后,在这次的结对项目中我学会了很多的知识,我们也从彼此的身上学到了各自的优点,很开心和她合作。

(八)本次项目源码在这里查看

转载于:https://www.cnblogs.com/nunw-qslhd/p/10535108.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值