201671010460朱艺璇《英文文本统计分析》结对项目报告
-
实验四 《英文文本统计分析》结对项目报告.
==========
| 项目 | 内容 |
|:-------------😐:-------------😐
| 这个作业属于哪个课程 | http://www.cnblogs.com/nwnu-daizh/ |
| 这个作业的要求在哪里 | https://www.cnblogs.com/nwnu-daizh/p/10569690.html |
| 课程学习目标 | 熟悉软件开发整体流程,提升自身能力 |
| 本次作业在哪个具体方面帮助我们实现目标 | 第一次体验一个完整的工程 | -
任务一.
- 两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价
对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究。
任务2需要给出结对项目源码在Github的仓库主页链接地址;
任务2博文作为结对项目实施过程的文字资料,请完整包含下面7个部分:- 点评作业的博客: 王潇的实验二
- github链接地址:https://github.com/LAUGHwangxiao/Personal-Program
- 点评内容:整个页面非常清爽,文档内容调理很清晰。用线条将每个模块分开,让读者看着非常清晰。唯一的一点不足就是总结有点少,不过也情有可原,从任务实践分配表可以看到王潇同学用了非常多的时间设计项目。希望我们两可以共同学习对方的长处。在阅读并测试运行代码以后,我发现她不仅完成了基础功能,还附加了输出每一行有多少个单词。软件结构完整,人机交互很有清楚。代码规范,结构完整,值得我学习。有一点小缺憾就是王潇同学也没有实现柱状图功能。希望在这一次的实验中我们能通过学习解决这个困难。
- 点评心得:在阅读完王潇同学的实验二以后,我觉得她的博客前后条理很清楚,对每个模块的设计分析都很到位,这一点我需要向他学习,善用表格这一点,包括开头用表格形式写明博客信息,这一点我需要实践到自己的博客中。她的代码中将功能和main主函数区分开,结构完整,这一点也值得我学习。
- 两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价
- 任务二.
a.需求分析.
(1)程序可读入任意英文文本文件,该文件中英文词数大于等于1个。
(2)程序需要很壮健,能读取容纳英文原版《哈利波特》10万词以上的文章。
(3)指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图。
(4)高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
(5)统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
(6)统计该文本行数及字符数;
(7)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
(8)可处理任意用户导入的任意英文文本;
(9)人机交互界面要求GUI界面(WEB页面、APP页面都可);
b.核心功能代码展示:展示核心功能代码.
- 统计每一行单词的数量,并按序输出
public void SortWords() throws IOException{
System.out.println("已输出到result2.txt中");
BufferedReader bufferedReader=new BufferedReader(new FileReader("src/Harrypotter.txt"));
BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter("src/result2.txt"));
String s;
while((s=bufferedReader.readLine())!=null){
Map<String, Integer> map=new TreeMap<String,Integer>();
String[] words=s.split("[【】、.。,\"!--;:?\'\\] ]");
for(int i=0;i<words.length;i++){
String key=words[i].toLowerCase();
if(key.length()>0){
if(!map.containsKey(key)){
map.put(key, 1);
}else{
int value=map.get(key);
value++;
map.put(key, value);
}
}
}
Set<Map.Entry<String, Integer>> entrySet=map.entrySet();
for(Map.Entry<String, Integer> entery:entrySet){
bufferedWriter.write(entery.getKey()+"---"+entery.getValue()+"\r\n");
}
bufferedWriter.newLine();
}
bufferedReader.close();
bufferedWriter.close();
}
- 绘制柱状图
public Find(String[] word, Map<String, Integer> wordsCount) {
super();
this.word = word;
this.wordsCount = wordsCount;
setTitle("绘制柱形图");
setBounds(word.length, 200, 450, 450);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public Find() {
}
@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;// 将当前的高度评分为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((400 - 20 * i) + "个", 8, topMargin + rulerStep * i);// 绘制Y轴上的数据
}
g2.setColor(Color.BLUE);
int m = 0;
for (int i = 0; i < word.length; i++) {
int value = wordsCount.get(word[i]);
int step = (m + 1) * 40;// 设置每隔柱形图的水平间隔为40
g2.fillRoundRect(leftMargin + step * 2, Height - value, 40, value, 0, 0);// 绘制每个柱状条
g2.drawString(word[i], leftMargin + step * 2, Height - value - 5); // 标识每个柱状条
m++;
}
}
- 统计字符数和行数
// Initializing counters
int countWord = 0;
int sentenceCount = 0;
int characterCount = 0;
int paragraphCount = 1;
int whitespaceCount = 0;
try {
if (file.exists()) {
FileReader fr = new FileReader(file);
LineNumberReader lnr = new LineNumberReader(fr);
int lineNum = 0;
while (lnr.readLine() != null) {
lineNum++;
}
System.out.println("该文本文档的总行数为 : " + lineNum);
lnr.close();
} else {
System.out.println("File does not exists!");
}
} catch (IOException e) {
e.printStackTrace();
}
// Reading line by line from the
// file until a null is returned
while ((line = reader.readLine()) != null) {
if (line.equals("")) {
paragraphCount++;
}
if (!(line.equals(""))) {
characterCount += line.length();
// \s+ is the space delimiter in java
String[] wordList = line.split("/s+");
countWord += wordList.length;
whitespaceCount += countWord - 1;
// [!?.:]+ is the sentence delimiter in java
String[] sentenceList = line.split("[!?.:]+");
sentenceCount += sentenceList.length;
}
}
c.程序运行:程序运行时每个功能界面截图.
人机交互界面首页.
细节功能.
细节功能.
实现的功能.
功能实现结果.
d. 描述结对的过程.
我们两在一起行动四年,非常有默契。由于平时的课业比较多,所以我们尽量在上课的时间多做一些,包括平时没课的时候也一起在机房自习做这个实验。
e. 提供此次结对作业的PSP。.
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 9 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 三天 | 四天 |
Development | 开发 | 110 | 120 |
Analysis | 需求分析(包括学习新技术) | 40 | 100 |
Design Spec | 生成设计文档 | 10 | 15 |
Design Review | 设计复审(和同学审核设计文档) | 5 | 10 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 10 | 15 |
Design | 具体设计 | 10 | 10 |
Coding | 具体编码 | 150 | 240 |
Test | 测试(自我修改,修改代码,提交修改) | 30 | 50 |
Reporting | 报告 | 20 | 180 |
Rostmortem & Process Improvement Plan | 事后总结,提出过程改进计划 | 3 | 5 |
f. 小结感受.
这个项目有很多功能都和上一个词频软件功能类似,所以我们首先对比了我们两个人的实验二项目,取比较好的部分进行整合再开始这个项目。新增了四个功且补全了实验二没有实现柱状图的遗憾。我们首先在eclipse中实现了柱形图的功能,并完成了统计每行的每个单词的数量和统计该文本文档的行数,前端页面用sublime软件写的html页面,采用了css和js布局。由于很久不接触gui等人机交互页面设计,所以很生疏,这个实验室一点点重新捡起来的过程。在这次结对过程中,我们俩一起合作,尤其是作业截止的前一天,在机房呆了十个小时,终于将项目大概的样子有了个形,我相信在今后的学习中我们都会成为对方的好搭档。对于我们来说,1+1必须是>2的,就算卡bug,也能互相鼓励。
GitHub地址点击☞此处