实验目的与要求
-体验软件项目开发中的两人合作,练习结对编程(Pair programming)。
-掌握Github上增量发布软件的操作方法。
项目名称:英文文本统计分析 | 项目要求:https://www.cnblogs.com/nwnu-daizh/p/10569690.html |
任课教师:代老师 | 博客地址:http://www.cnblogs.com/nwnu-daizh/ |
结队人:201671010413葛进花 | 博客地址:https://www.cnblogs.com/gejinhua/p/10550323.html/ |
点评内容: | 排版比较整齐,功能设计的描述不够完整,没有实现柱状图,从博客中看出来前期还是深入学习的,就psp而言,规划较为完美,但是后期拖延较多,说明准备不够充分。计划和完成程度有误差,可能对于计划的初期分配不正确。 |
点评心得: | 点评的过程中发现,两人的进度基本一致,对于实验的要求一致,部分没有实现的功能也相似。需要后期一起加深学习,互相学习对方的优点,弥补自身缺点,争取这次结队项目完成顺利。 |
实验内容与步骤
任务一:两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
-对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究。
-克隆结对方项目源码到本地机器,阅读并测试运行代码,结合运行结果评论程序代码,评论要点包括:软件结构、代码规范、功能实现、人机交互等。
-尝试利用github中的Fork、Clone、Push、Pull request、Merge pull request对结对方仓库中的源码进行合作修改。
任务二:采用两人合作方式,设计开发一个英文文本统计分析软件,使之具有以下功能:
-实验2要求的功能;
-单词频数可视化柱状图要求是以下样式:
-统计该文本行数及字符数;
-各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
-可处理任意用户导入的任意英文文本;
-人机交互界面要求GUI界面(WEB页面、APP页面都可);
-附加分功能:统计文本中除冠词、代词、介词之外的高频词;
-附加分功能:统计前10个两个单词组成的词组频率。
软件设计:
-需求分析:
-1.可处理用户任意输入的英文文本
-2.统计该文本的行数及字符数功能
-3.指定单词词频统计功能
-4.前k个高频词的输出
-5.统计该文本的单词数,然后输出到result.txt文件。
-6.统计功能耗时
-7.GUI人机交互界面
-8.统计文本除冠词、代词、介词之外的高频词
核心功能代码展示:
public class CountOccurrenceOfWords {
public static void main(String[] args) {
long t1 = System.currentTimeMillis();
String s;
String fileName1 = "D:\Workspaces\jiedui\src\text.txt";
String fileName2 = "D:\Workspaces\jiedui\src\result.txt";
try {
BufferedReader br = new BufferedReader(new FileReader(fileName1));
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName2));
StringBuffer sb = new StringBuffer();
//将文件内容存入StringBuffer中
while((s = br.readLine()) != null) {
sb.append(s);
}
String str = sb.toString().toLowerCase();
//分隔字符串并存入数组
String[] elements = str.split("[^a-zA-Z0-9]+");
int count = 0;
Map<String, Integer> myTreeMap = new TreeMap<String, Integer>();
//遍历数组将其存入Map<String, Integer>中
for(int i = 0; i < elements.length; i++) {
if(myTreeMap.containsKey(elements[i])) {
count = myTreeMap.get(elements[i]);
myTreeMap.put(elements[i], count + 1);
}
else {
myTreeMap.put(elements[i], 1);
}
}
System.out.println("单词统计的结果请见当前目录result.txt文件");
//将map.entrySet()转换成list
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(myTreeMap.entrySet());
//通过比较器实现排序
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
//降序排序
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
int num = 1;
//将结果写入文件
for(Map.Entry<String, Integer> map : list) {
if(num <= sb.length()) {
bw.write("出现次数第" + num + "的单词为:" + map.getKey() + ",出现频率为" + map.getValue() + "次");
bw.newLine();
System.out.println(map.getKey() + ":" + map.getValue());
num++;
}
else break;
}
bw.write("耗时:" + (System.currentTimeMillis() - t1) + "ms");
br.close();
bw.close();
System.out.println("耗时:" + (System.currentTimeMillis() - t1) + "ms");
} catch (FileNotFoundException e) {
System.out.println("找不到指定文件!");
} catch (IOException e) {
System.out.println("文件读取错误!");
}
}
}
public class Word {
// 统计数字或者字符出现的次数
public static TreeMap<Character, Integer> Pross(String str) {
char[] charArray = str.toCharArray();
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
for (int x = 0; x < charArray.length; x++) {
if (!tm.containsKey(charArray[x])) {
tm.put(charArray[x], 1);
} else {
int count = tm.get(charArray[x]) + 1;
tm.put(charArray[x], count);
}
}
return tm;
}
public static void main(String[] args) {
BufferedReader br = null;
int line = 0;
String str = "";
StringBuffer sb = new StringBuffer();
try {
br = new BufferedReader(new FileReader("D:\Workspaces\jiedui\src\text.txt"));
while ((str = br.readLine()) != null) {
sb.append(str);
++line;
}
System.out.println("
文件行数: " + line);
TreeMap<Character, Integer> tm = Pross(sb.toString());
System.out.println("
字符统计结果为:" + tm);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
程序运行截图:
结队过程:
-初期寻找队友,两人互评博客,找出对方的优势和不足,然后相互补充,做出psp表,初期有了大致的计划,后期投入实践,在编程过程遇到的问题较多。
结队照片:
实验总结:
-从实验二到实验四,老师给出的实验,在开发和代码编写上花费大量时间,错误频繁出现修改失败,一直有bug,很崩溃,但是bug修复后心情也是很激动。在结队中我们相互促进,共同寻找实现的方法,但是很可惜由于技术方面的不足,附加功能没有实现。PSP展示了我们的开发过程,计划赶不上变化,实际操作的时间远远大于计划时间,程序语言方面存在很大问题,在中途也请教过其他同学,有所收获,但是仍然有解决不了的问题,后续要强加练习和学习,相互讨论和监督,得到了不同的提升,在合作过程中磨合不断,要学会发现别人身上的闪光点。
任务三:博文信息表psp:
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成所需要的时间(min) |
---|---|---|---|
Planning | 计划 | 15 | 13 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 15 | 10 |
Development | 开发 | 600 | 850 |
Analysis | 需求分析(包括学习新技术) | 18 | 12 |
Design Spec | 生成设计文档 | 20 | 35 |
Design Review | 设计复审(审核设计文档) | 15 | 22 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 18 | 25 |
Design | 具体设计 | 15 | 20 |
Coding | 具体编码 | 600 | 930 |
Code Review | 代码复审 | 20 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 50 | 68 |
Reporting | 报告 | 50 | 60 |
Test Report | 测试报告 | 30 | 40 |
Size Measurement | 计算工作量 | 15 | 20 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 32 |
Github地址:https://github.com/aaabaoo/wordcount