201671030124 闫雪《英文文本统计分析》结对项目报告
博文简要信息表
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 软件工程 代祖华老师 博客 |
这个作业的要求在哪里 | 实验四 软件工程结对项目 |
课程学习目标 | 熟悉软件开发整体流程,提升自身能力 |
本次作业在哪个具体方面帮助我们实现目标 | 第一次体验一个完整的工程 |
任务一:点评博客
项目 | 内容 |
---|---|
点评博客地址 | 201671030111 词频统计软件项目报告 |
github链接地址 | 源码 |
点评内容 | 在读完你的博文后,我有一些建议和看法: 1.在博文排版方面,你的结构清晰,内容明了,并且使用了博文简要内容信息表,这点做的很不错。但是,在排版方面还有待提高的地方,比如图片的大小不一致,导致给人观感不是特别的好,可以在插入图片前统一图片的大小。 2.在博文结构方面,你使用了简化的软件工程流程(需求分析-功能设计-设计实现-结果展示-代码展示-总结),在浏览博文时,让人可以层层递进的对博文的内容有深入的了解。但是,如果有空闲时间的话希望可以加一个详细设计的模块,这样让人对你的软件开发过程有更加深刻的理解。 3.在博文内容方面,你做的是英文文本词频统计,根据老师所给的要求,你基本实现了查询指定单词,查询前K个高频单词,将所有单词按字典顺序输出到文本中。但是,在绘制柱状图方面,有点投机取巧,并没有完整的实现柱状图的绘制,你可以学习一下Java的Graphics类,给你一篇博文作为参考(http://www.cnblogs.com/donghb/p/7637990.html)。其次,在功能设计模块,你的内容不太完善,只说明了实现什么功能,但是没有说明怎样实现功能,可以进一步详细叙述一下。 4.博文结构与PSP中“任务内容”列的关系:你的博文结构和PSP任务内容列的关系比较紧密,基本按照PSP任务内容列的顺序编写了博文. 5.PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究:通过对比博文中计划完成时间和实际完成时间,发现实际完成时间比计划完成时间超出很多,看到你在下面总结了自己在PSP过程中的困难,主要在于编程能力不强,在开发过程中花费了较多的时间。其他的流程花费时间基本和计划时间差别不大,但是也超出了一些时间,可能是由于初次按照PSP流程进行软件开发,所以对时间的把握不充分。 6.我在GitHub上下载了你的源码,编译运行后,和博文内容贴合,代码比较规范,结构清晰明了,基本实现了老师所要求的功能,但是人机交互方面没有很好的实现。 |
点评心得 | 通过阅读点评别人的博文,我了解到了别人在编写代码和博文的优点,比如博文简要信息表等。而且在点评团队成员的博文时,和队友互相交流了一些问题,比如代码的规范,博文的规范,使自己有了进步。在这次点评博文的过程中,我学习了别人的优点,也通过别人的视角认识到了自己的缺点,让自己在下次做作业时改正这些错误,并且对队友有了深入的了解。 |
任务二:结对编程
需求分析
采用两人合作方式,设计开发一个英文文本统计分析软件,使之具有以下功能:
-
(1)实验2要求的功能;
-
(2)绘制单词频数可视化柱状图;
-
(3)统计该文本行数及字符数;
-
(4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
-
(5)可处理任意用户导入的任意英文文本;
-
(6)人机交互界面要求GUI界面(WEB页面、APP页面都可);
-
(7)附加分功能:统计文本中除冠词、代词、介词之外的高频词。
软件设计
核心功能代码展示
计时功能
Date date1 = new Date();//获得当前时间
int sum = 0;
for (int j = 0; j < 100000000; j++) {
sum += j;
}
Date date2 = new Date();//获得当前时间
System.out.println("程序的执行时间为:");
System.out.println(date2.getTime()-date1.getTime()+"ms");
柱状图的实现
//绘制词频的柱形图
public main(){
super();
setTitle("单词的词频统计图");
setBounds(Count.length, 200, 450, 450);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
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;
g2.setColor(Color.BLACK);//绘制黑色背景
g2.fillRect(0, 0, Width, Height);//绘制矩形图
g2.setColor(Color.LIGHT_GRAY);
for(int i=0;i<rulerStep;i++){
g2.drawString((400-20*i)+"个", 8, topMargin+rulerStep*i);//绘制Y轴上的数据
}
g2.setColor(Color.WHITE);
int m=0;
for(int i = 0;i<Count.length;i++){
int value = WordsCount.get(Count[i]);
int step = (m+1)*40;//设置每隔柱形图的水平间隔为40
g2.fillRoundRect(leftMargin+step*2,Height-value, 40, value, 40, 10);//绘制每个柱状条
g2.drawString(Count[i], leftMargin+step*2, Height-value-5); //标识每个柱状条
m++;
}
}
选择文件
canner in = new Scanner(System.in);
System.out.println("请输入读取文件的文件名:");
String line= in.nextLine();
File file = new File(line);
InputStreamReader is = new InputStreamReader(new FileInputStream(file), "utf-8");//将字节流转换为字符流
BufferedReader buff = new BufferedReader(is);//提供通用的缓冲方式文本读取
List<String> list = new ArrayList<String>();//list中只存放纯单词文本
String readLine = null;//单词列表初始为空
while((readLine = buff.readLine())!=null){
String[] WordsArr = readLine.split("[^a-zA-z]");
for(String word:WordsArr){
if(word.length()!=0){
list.add(word);//将截取后的纯单词放入list
}
}
}
buff.close();
程序运行
高频词查询
指定单词查询
按字典顺序输出
查询行数及字符数
GitHub上传了三次过程代码,按照1,2,3的顺序,由最初的代码,过程中修改的代码,最终的代码组成。
结对过程
-
我们在实验二的基础上,分析了还需实现的功能。
-
我们分开实现了文本行数和字符数和计时功能,我负责计时功能的实现。
-
最后的GUI界面由我们两人共同编写。
PSP流程
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 8 | 12 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 10 |
Development | 开发 | 82 | 250 |
Analysis | 需求分析 (包括学习新技术) | 6 | 4 |
Design Spec | 生成设计文档 | 10 | 30 |
Design Review | 设计复审 (和同事审核设计文档) | 4 | 5 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 3 | 7 |
Design | 具体设计 | 10 | 60 |
Coding | 具体编码 | 50 | 200 |
Code Review | 代码复审 | 20 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 10 | 30 |
Reporting | 报告 | 30 | 50 |
Test Report | 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 5 | 10 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 15 | 30 |
结对编程的总结
我认为两人合作真的能够带来1+1>2的效果。因为一个人在编程时,总会有思维枯竭的时候,两个人的互相合作可以使开发的过程卡壳时间不太久。并且可以及时发现在代码编写过程中的错误。这次结对编程让我意识到在编写代码的过程中和他人交流的重要性,不能自己钻进死胡同。别人也许能给自己提供一种新的思路。在以后的编程过程中,我和队友准备再次使用结对编程,让编写软件的过程更顺畅。