201671030125 曾佳+《英文文本统计分析》结对项目报告
项目 | 内容 |
---|---|
这个作业属于哪个课程? | 2016级计算机科学与工程学院软件工程(西北师范大学) |
这个作业的要求在哪里? | 实验四 软件工程结对项目 |
我在这个课程的目标是? | 熟悉软件开发整体流程,提升自身能力 |
本次作业在哪个具体方面帮助我们实现目标 | 第一次体验一个完整的工程 |
本次项目代码 | GitHub链接 |
任务一:两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价
>[点评博客链接](https://www.cnblogs.com/WJwangjing/p/10543326.html) [GitHub链接](https://github.com/WJwjj/wangjing)
点评内容:
在阅读了你的博文后,我学到了很多,下面时我的一些想法:
1.博文结构排版布局层次分明,排版合理,认真学习了Markdown编辑器语法使用,是我该学习的地方。
2.博文内容按照老师的要求以需求分析、功能设计、设计实现、测试运行、关键代码、总结、PSP展示的步骤分别书写,字体大小适宜,让阅读的人可以方便快捷、清楚明了地找到自己想看的部分。
3.在PSP表中“计划共完成需要的时间”与“实际完成需要的时间”两列数据差别较大的是开发和具体编码两个阶段,并且都是实际完成需要的时间相比更多,我也有这个问题,分析原因可能是对JAVA编程不熟练,或是在编码运行过程中遇到了困难和阻碍。
4.运行代码时了解到你的代码习惯是主函数一个类,其余功能为一个类。个人觉得将每个功能单独为一个类,这样后续如果想对单个功能的代码进行优化,或者添加删除功能的时候,可以方便直接更改。这点也是我需要改进的地方。代码编写符合基本的代码规范,可以继续优化。
5.功能中的柱状图是用符号的长短代替了,如果能使用可视化界面显示会更好。符号代替在词频相差不多的时候符号长度一样,就不能显示出来哪个单词词频更多。
点评心得:
通过这次点评,我认识到自己的很多不足。排版不够美观大方,需要继续学习。编写代码时对类的划分不明确,很多功能都是在Main()函数中完成的,这样编写在后面有错误或者进行复审的时候找代码要前后滑动会很麻烦,我的代码编写不是很规范,这是我需要改进的一个很重要的点。实验二中还是有很多功能做的太简单,柱状图也没有用可视化界面做出来,这点我们会在实验四的结对项目中改进完善。
任务二:采用两人合作方式,设计开发一个英文文本统计分析软件
1. 需求分析
通过对项目要求的分析,本次结对项目的需求为:
(1)实验2要求的功能;
(2)绘制单词频数可视化柱状图;
(3)统计该文本行数及字符数;
(4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
(5)可处理任意用户导入的任意英文文本;
(6)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(7)附加分功能:统计文本中除冠词、代词、介词之外的高频词。
2. 软件设计:
3. 核心功能代码展示:展示核心功能代码
计算查询单词词频的时间
long time=System.currentTimeMillis() - start;
JOptionPane.showConfirmDialog(null,print+"\n"+"所用时间为:"+(System.currentTimeMillis() - start)+"ms","结果",JOptionPane.DEFAULT_OPTION);
Histogram histogram=new Histogram(map1,input.length);
统计文本行数、字符数、大小写字母、汉字、数字、字节数等功能
while ((str = in.readLine())!= null) {//readLine()方法, 用于读取一行,只要读取内容不为空就一直执行
i++;//每循环一次就进行一次自增,用于统计文本行数
c += str.length();//用于统计总字符数
byte[] bytes=str.getBytes();//求出该行的字节数组
d += bytes.length;//用于统计总字节数
for (int j = 0; j < str.length(); j++) {//for循环的条件,当j小于该行长度时就一直循环并自增
b = Character.toString(str.charAt(j));//返回一个字符串对象
if (b.matches("[\\u4e00-\\u9fa5]")) {//if语句的条件,判断是否为汉字
c1++;//若为汉字则c1自增
} else if(b.matches("[A-Z]")){//if语句的条件,判断是否为大写字母
c2++;//若为大写字母则c2自增
} else if(b.matches("[a-z]")){//if语句的条件,判断是否为小写字母
c3++;//若为小写字母则c3自增
} else if(b.matches("[0-9]")){//if语句的条件,判断是否为数字
c4++;//若为数字则c4自增
} else {//否则可判断为其他字符
c5++;//若为其他字符则c5自增
}
}
词频柱状图部分代码
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.BLACK);
for(int i=0;i<rulerStep;i++){
g2.drawString((30000-1500*i)+"个", 8, topMargin+rulerStep*i);//绘制Y轴上的数据
}
g2.setColor(Color.YELLOW);
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++;
}
}
4. 程序运行:程序运行时每个功能界面截图
主界面
输入要查询词频的单词,用“,”隔开
点击输出词频和柱状图,显示单词及词频数,以及运行时间
点击确定后弹出柱状图界面
输入要查询的高频词个数
点击输出前N个高频词,弹出单词及词频个数,以及运行时间
点击词频导出到文件,弹出运行时间
点击确定后弹出“写入文件成功...”
点击各项统计,弹出统计的文本行数、字符数、大小写字母、汉字、数字、字节数及运行时间等
将单词及词频按字典顺序输出到文件中
5. 结对的过程
1.在实验二的基础上,分析了还需添加的功能。
2.分别实现统计文本行数、字符数、大小写字母、汉字、数字、字节数、运行时间、柱状图等功能。
3.完成附加功能1。
4.最后的GUI界面由我们两人共同编写。
6. 结对作业的PSP
PSP2.1 | 任务内容 | 计划完成时间(min) | 实际完成时间(min) |
---|---|---|---|
Planning | 计划 | 15 | 10 |
Estimate | 规划工作步骤 | 8 | 10 |
Development | 开发 | 130 | 150 |
Analysis | 需求分析 | 18 | 20 |
Design Spec | 生成文档 | 10 | 12 |
Design Review | 设计复审 | 15 | 10 |
Coding Standard | 代码规范 | 20 | 15 |
Design | 具体设计 | 15 | 20 |
Coding | 具体编码 | 250 | 280 |
Code Review | 代码复审 | 20 | 20 |
Test | 测试 | 25 | 30 |
Reporting | 报告 | 20 | 20 |
Test Report | 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 12 | 15 |
Postmortem & Process Improvement Plan | 事后总结 | 20 | 20 |
7.总结
本次实验是第一次结对项目,相比之前的个人项目,这次实验的方法步骤都有很大改变。两个人一起编程时,需要在方法、数据结构甚至是变量和函数名上达成一致。这减少了其中一方随意编写代码的可能性,结对编程时也选择了更加标准的语法、格式。每个人独自进行设计、实现软件的过程中难免要犯这样那样的错误。如果是结对编程的话,解决问题的能力就提高了,程序中的错误就会少很多,设计质量和代码质量也会高很多,还会省下很多以后修改、测试的时间。因为有随时的复审和交流,而且程序各方面的质量都会因为实力较强的同伴而变得更高。还有就是两个人一起合作一件事的时候,精神力更能集中、更专注,从而更能快速高效的完成任务。结对编程时我了解到了不同的解决问题的思路和算法,知道了一些还未接触到的键盘快捷键和调试技巧。和同伴在一起工作让我更好地相互了解对方,从而更加理解她,增强了团队凝聚力。一个成功的软件团队需要很多合作,有效地交流、相互学习和传递经验是很有必要的。