201671030122杨凡亿《英文文本统计分析》结对项目报告

放肆的年华 提交于 2020-11-13 07:34:14
项目 内容
课程名称 2016级计算机科学与工程学院软件工程(西北师范大学)
作业要求 实验四 软件工程结对项目
课程学习目标 熟悉软件开发整体流程,提升自身能力
具体方面的帮助 第一次体验一个完整的工程


###任务一 两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价

项目 内容
点评博客 201671030126 赵佳平词频统计软件项目报告
Github github地址
点评内容 博文结构整体很清楚,很简洁。对需求分析做了认真分析,基本完成了各项功能。但在博文排版上有所不足,表格和代码部分尽量不要使用截图;另外可以把所实现功能的截图尽可能详细的写到博文中。在具体代码方面,希望可以把不同的类分开,不要都写在一个java文件里面,这样可以使代码结构更加清晰。希望博主可以不断完善,继续努力。
点评心得 通过阅读结对方的代码,首先感觉到的是我们两个代码风格有很大的不同。其次在思考和解决问题的方法上也有很大的差别。了解了对方的编码习惯,为任务二的开展奠定了一些基础。当然通过阅读也注意的到自己在编码时需要进一步改进的问题。在接下来的结对编程中,会充分听取对方的意见,共同讨论完成本次项目


###任务二 采用两人合作方式,设计开发一个英文文本统计分析软件

  • <span style="color:orange">结对项目源码Github链接地址</span>

  • a.需求分析

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

    • 类图

    <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403020817412-2035858442.png" width = "500" height = "360">

    (1) 本次项目主要有三部分构成,登录界面(login)、主界面、主类(Main)。
    
    (2) 高频词的统计在Highword.java中实现,指定单词词频和柱状图在chart.java中实现,其余功能在function.java实现。
    
    (3) 计时功能主要是利用函数System.currentTimeMillis()实现。
    
  • c.核心功能代码展示

    • 单词频数可视化柱状图部分,主要采用外部包jcommon-1.0.23.jar,jfreechart-1.0.19.jar实现。另参考这篇博文完成
    	JFreeChart chart = ChartFactory.createBarChart(
               "指定单词的词频柱状图",    //标题
               "",    //x轴名称
               "",    //y轴名称
               dataset,//数据集
               PlotOrientation.VERTICAL,//使用垂直柱状图
               true,//是否使用legend
               false,//是否使用tooltip
               false);   //是否使用url
    
       Font kfont = new Font("宋体", Font.PLAIN, 20);    // 底部   
       Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题   
       // 图片标题   
       chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));   
       // 底部   
       chart.getLegend().setItemFont(kfont);   
       ChartFrame cf = new ChartFrame("词频显示", chart);
       cf.pack();
       cf.setVisible(true);
    
    • 行数和字符数统计。该部分主要是在读入文件的时候进行统计。
    while((temp = br.readLine())!=null)
    {
    	   stmplength1+=temp.length();//字符数
    	   String[] str = temp.split("([^a-zA-Z])"); //过滤出只含有字母的
    	   stmplength++;//行数
    	   for(int i=0;i<str.length;i++)
    	   {
    		  String word = str[i].trim();
    		   if(word.length()!=0)    //去除长度为0的行
    		   staff.put(word, staff.getOrDefault(word, 0)+1);
    	    }
    }
    
    • 除去介词,冠词,代词的高频词汇。该部分的实现是在输出的时候与介词,冠词,代词表进行比对,然后决定是否输出。
    /*该部分主要是通过flag来控制要显示的界面*/
    ok.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				// TODO Auto-generated method stub
    
    				textArea.setText("");
    
    				long startTime=System.currentTimeMillis();
    				int k=Integer.parseInt(textField.getText().toString());
    				for(int i=0;i<k;i++)//10
    				{
    					boolean ok=false;
    					if(flag)   //flag为true显示正常高频词界面,否则显示除去代词,冠词,介词的界面
    						textArea.append(function.aList.get(i).getKey()+"\t"+function.aList.get(i).getValue()+"\n");
    					else
    					{
    						for(int j=0;j<function.stop.size();j++)
    						{
    							if(function.aList.get(i).getKey().toLowerCase().equals(function.stop.get(j)))
    							{
    								k++;
    								ok=true;
    								break;
    							}
    						}
    						if(!ok)
    							textArea.append(function.aList.get(i).getKey()+"\t"+function.aList.get(i).getValue()+"\n");
    					}
    				}
    				long endTime=System.currentTimeMillis();
    				JOptionPane.showMessageDialog(null, "耗时:"+(endTime-startTime)+"ms");
    			}  
    	      });
    
  • d.程序运行截图

    • 登录界面:用户名(nwnu),密码(2019)

    <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403005227415-239027120.png" width = "500" height = "360">

    • 主界面 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403005339418-250640631.png" width = "500" height = "360">

    • 点击浏览,选择需要读入的文件,然后点击开始读入

    <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403005823946-666483022.png" width = "500" height = "360"> <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403010229029-1299514048.png" width = "500" height = "360">

    • 指定单词词频统计及柱状图

    <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403011847194-1974509402.png" width = "500" height = "360"> <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403012001753-470062895.png" width = "500" height = "360">

    • 前k个高频词统计 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403012243923-1743857873.png" width = "500" height = "360">

    • 前k个高频词统计 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403012410532-29098887.png" width = "500" height = "360"> <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403012609776-571026367.png" width = "500" height = "160">

    • 统计行数和字符数 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403013318546-1941197430.png" width = "500" height = "360">

    • 附加1:除去代词,介词,冠词的高频词 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403013445839-1012665444.png" width = "500" height = "360">

  • e.结对的过程

    • 在结对过程,我们首先提出自己对某一功能的想法,然后经过讨论决定采用其中的一种实现。采用谁的想法,谁编程。在讨论过程也可能会有新的想法出现,也会很明显的感到自己的有些想法不太好。

    <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403014655539-367496585.png" width = "300" height = "260">


  • ##PSP
任务内容 计划完成时间(min) 实际完成时间(min)
计划 10 8
估计这个任务需要多长时间,并规划大致工作步骤 5 6
开发 110 130
需求分析(包括学习新技术) 8 6
生成设计文档 5 8
设计复审(和同事审核设计文档) 5 4
代码规范(为当前的开发制定合适的规范) 4 3
具体设计 15 10
具体编码 150 200
代码复审 5 6
测试(自我测试、修改代码、提交修改) 15 12
报告 9 5
测试报告 5 3
计算工作量 3 2
事后总结,并提出工程改进计划 5 3


  • ##小结

     通过此次项目,体会了结对编程的过程,很大的一个感受是在编码、测试以及复审时能够很容易的发现代码中的一些逻辑错误,相比一个来说编码效率比较高。另外通过这次项目也感受到了编码规范也是很重要的,当对变量随意定义,没有相应注释的时候,读代码非常的耗时。在项目中我们主要是先讨论某个功能怎么实现,充分听取对方的想法,最后用谁的想法,谁编程实现。总之,在此次项目中,彼此配合的还是很友好的,也有很大的收获。在以后的过程中也会注意在此次项目中遇到的问题,不断完善,继续努力。
    
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!