1、课程名称:html
2016级计算机科学与工程学院软件工程(西北师范大学)java
2、课程要求:git
实验四 软件工程结对项目github
3、实验内容:编程
任务1:点评队友博客,并给出所点评做业的博客、github连接地址,点评内容和点评心得数组
1)你的博文结构安排的比较好,博文内容也写的很好,在PSP中你在开发和具体编码时花费了较多的时间,我我的以为一方面是由于你对软件开发不太了解,具体操做不太熟悉,另外一方面有多是由于对Java有些遗忘,以致于在编码时花费了较多的时间,在实现某些功能时忘记了一些控件的操做,好比在柱状图的显示方面,咱们都作的不太好,Java里自己就有画图功能,这个咱们都忘记使用了,但愿下次做业咱们均可以更好的改进。数据结构
2)你在编写代码时,将功能类和测试类分开这个作法很好,可是若是能够将每个功能都分为一个类,这样在从此扩展功能时我以为会比较方便。其次就是咱们都应该在人机交互方面作相应的改进。以上就是个人建议,但愿在以后的结对项目中咱们能够作的更好。框架
经过对我队友博文的阅读和点评,我了解到了本身的不足,看到了她作的好的地方,好比:她在编写代码时,将功能类和测试类分开编写,而我在编写代码之初是写在一个类里面的,后来才改正过来的;而且她的博文内容很是符合做业要求,设计实现模块也作得很好,这对我来讲仍是很欠缺的,因此在从此的学习中我要多向她学习。ide
任务2:给出结对项目源码在Github的仓库主页连接地址,并编写博客文档学习
根据实验四 软件工程结对项目的要求,本次项目采用两人合做方式,设计开发一个英文文本统计分析软件,其基本功能要求以下:
(1)实现 实验2要求的功能;
(2)单词频数可视化柱状图要求是如下样式:
(3)统计该文本行数及字符数;
(4)各类统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
(5)可处理任意用户导入的任意英文文本;
(6)人机交互界面要求GUI界面(WEB页面、APP页面均可);
(7)附加分功能:统计文本中除冠词、代词、介词以外的高频词;
(8)附加分功能:统计前10个两个单词组成的词组频率。
1.读写文件功能:对文件进行读取和存放,这是英文文本统计分析软件的基本功能;
2.用户输入功能:用户能够输入想要查询的单词或文本,来查询单词或文本的个数以及想进行何种操做;
3.统计功能:用户能够统计文本行数及字符数,还能够统计文本中除冠词、代词、介词以外的高频词;
4.排序功能:降序排序和按字典顺序排序;
5.显示功能:显示单词频数可视化柱状图,显示文本行数及字符数,显示文本中除冠词、代词、介词以外的高频词;
6.计时功能:显示程序统计所消耗时间;
7.人机交互功能:能够用 GUI界面实现人机交互功能。
(1)Main.java:初始化登录界面,从指定文件读入单词并统计词频,在该界面用户能够点击按钮进行如下操做:查看前N个高频词、查询指定单词词频、执行词频写入文件、查看文本行数和单词数;
(2)HighFrequencyWords.java:这个类实现了显示文本中除冠词、代词、介词以外的高频词,以及执行该操做所需的时间的功能;
(3)PrintToFile.java:这个类实现了文本按字典顺序输出到result.txt文件,以及执行该操做所需的时间的功能。在该类中先按字典顺序排序,再写入result.txt文件;
(4)WordCountStatistics.java:这个类实现了统计指定单词词频的功能,以及执行该操做所需的时间的功能。在该类中先初始化统计指定单词词频界面,再查询并显示指定单词词频;
(5)HighFrequencyWords.java:这个类实现了绘制柱形图的功能;
2.数据结构:
本次结对项目采用TreeMap存储从文本读入的数据,用LinkedList进行词频排序,用字符数组String进行文本中冠词、代词、介词的存储。
3.程序流程图:
登录界面的显示:
前k个单词词频及单词的显示:
统计指定单词的词频及柱状图的显示:
词频写入文件的显示:
行数单词数的显示:
显示文本中除冠词、代词、介词以外的高频词,以及执行该操做所需的时间部分的代码
inputButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { if (event.getSource()==inputButton) { long start = System.currentTimeMillis(); String n=number2.getText(); int wordNum=Integer.parseInt(n); String print = ""; if (!n.isEmpty()) { String str = "above, over,in,of,at,on,behind,during,from,into, onto,inside,outside,to,without," + "throughout,out,she,he,its,we,them,your,i,you,my,myeself,a,an,the"; String s[] = str.split(","); ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(maps.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(); } }); int j=0; int i=0; while (j<wordNum) { boolean flag = true ; String tmpString = list.get(i).getKey(); for (String string : s) { if(tmpString.equals(string)) { flag = false; } } if(flag) { print += list.get(i).getKey()+ ": " +list.get(i).getValue()+" "; j++; } i++; } JOptionPane.showConfirmDialog(null,print+"\n"+"所用时间:"+(System.currentTimeMillis() - start)+"ms","结果",JOptionPane.DEFAULT_OPTION); } } else { JOptionPane.showConfirmDialog(null, "请输入要查询的信息!","提示",JOptionPane.DEFAULT_OPTION); } } });
绘制柱状图部分的代码
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((30000-1500*i)+"个", 8, topMargin+rulerStep*i);//绘制Y轴上的数据 } g2.setColor(Color.PINK); int m=0; for (Entry<String, Integer> entry : map.entrySet()) { int value =entry.getValue(); int step = (m+1)*40;//设置每隔柱形图的水平间隔为40 g2.fillRoundRect(leftMargin+step*2,Height-value/50-5, 40, value, 40, 10);//绘制每一个柱状条 g2.drawString(entry.getKey(), leftMargin+step*2, Height-value/50-5); //标识每一个柱状条 m++; } }
一、在作本次结对项目时,我和队友首先根据老师给出的代码规范参考资料肯定了本次项目的代码规范,好比基本的缩进、命名和注释的规范,阅读了对方的代码,按照制定的规范对对方的代码进行了改进。
二、接下来咱们俩一块儿对本次实验进行了需求分析,明确了在本次结对项目中咱们须要在上一次的基础之上再完成的功能有:统计该文本行数及字符数、提供计时功能、可处理任意用户导入的任意英文文本、实现人机交互界面、统计文本中除冠词、代词、介词以外的高频词。肯定了项目的基本框架,项目该如何开展和大致的用时时间,按照该计划咱们填写了粗略的PSP表;
三、而后咱们开始着手编程。首先咱们进行了分工,我作柱状图的统计和附加功能一,我队友作行数及字符数的统计 、计时功能和处理任意用户导入的任意英文文本的部分。因此在本次结对项目中,咱们建立了五个类:Main.java:初始化登录界面;HighFrequencyWords.java:显示文本中除冠词、代词、介词以外的高频词,以及执行该操做所需的时间;PrintToFile.java:按字典顺序输出到result.txt文件,以及执行该操做所需的时间;WordCountStatistics.java:统计指定单词词频,以及执行该操做所需的时间;HighFrequencyWords.java:绘制柱形图;
四、整个项目完成后,咱们两人共同根据代码规范进行复审,对多余的语句进行简化;
五、最后咱们根据完成该项目实际状况填写PSP实际所用时间;
六、撰写报告文档。
在作本次结对项目时,我和队友的想法既有相同的时候,但同时也有碰撞的时候,在这个时候咱们一般是采用谁对就听谁的策略。经过此次结对项目,我了解到团队合做的重要性,以及在团队合做时咱们应该注意的诸多事项,知道了在作一个团队项目时,双方交流、沟通的重要性,双方合做的重要性。
任务内容 | 计划完成时间(min) | 实际完成时间(min) |
---|---|---|
计划 | 10 | 7 |
规划工做步骤 | 10 | 7 |
开发 | 255 | 264 |
需求分析 | 10 | 9 |
生成文档 | 5 | 10 |
设计复审 | 15 | 10 |
代码规范 | 20 | 15 |
具体编码 | 180 | 200 |
代码复审 | 15 | 10 |
测试 | 10 | 10 |
报告 | 15 | 12 |
测试报告 | 5 | 7 |
计算报告量 | 5 | 2 |
过后总结 | 5 | 3 |
从上表中能够看出,在开发和具体代码的编写时,咱们花费了较多的时间,一方面有多是由于这是咱们第一次作结对项目,还不太熟悉,另外一方面有多是由于咱们对于有些功能的实现方面有困难:好比在绘制柱状图来进行单词的统计,用GUI界面实现人机交互,以及完成附加功能一中的统计文本中除冠词、代词、介词以外的高频词等,因此在开发和具体代码的编写时咱们花费了较多的时间。尽管在完成这些部分时咱们都作的很是吃力,可是最终咱们仍是作出告终果。在此次结对项目中,我是真的认识到了本身在编程方面的不足,在从此的学习中要更加努力才行。
点击源码,查看所有代码!