软工-计科二班编程作业
这个作业属于哪个课程 | 软工-计科二班 |
---|---|
这个作业要求是什么 | 作业要求 |
这个作业的目标 | 熟悉利用码云/GitHub等代码托管平台,熟悉软件的开发流程 |
学号 | 20188425 |
目录 | |
·1.码云项目地址 | |
·2.PSP表格 | |
·3.解题思路 | |
·4.代码规范 | |
·5.计算模块接口的设计与实现过程 | |
·6.计算模块接口部分的性能改进 | |
·7.计算模块部分单元测试展示 | |
·8.计算模块部分异常处理说明 | |
·9.附录 | |
·10.总结 |
1.码云项目地址
2.PSP表格
PSP | Personal Software Process Stages | 预估耗时(h) | 实际耗时(h) |
---|---|---|---|
Planning | 计划 | 0.5 | 0.25 |
·Estimate | 开始计划需要多长时间 | 0.5 | 0.25 |
Development | 开发 | 10.25 | 11.25 |
·Analysis | 需求分析 | 2 | 3 |
·Design Spec | 生成设计文档 | 1.5 | 1 |
·Design Review | 设计复审 | 0.5 | 0.25 |
·Coding Standard | 代码规范 | 0.25 | 0.25 |
·Design | 具体设计 | 1.5 | 1.5 |
·Coding | 代码实现 | 4 | 5 |
·Coding Review | 代码复审 | 0.5 | 0.25 |
·Test | 测试 | 1 | 1.5 |
Reporting | 报告 | 0.95 | 1.15 |
·Test Report | 测试报告 | 0.25 | 0.5 |
·Size Measurement | 计算工作量 | 0.2 | 0.15 |
·Postmortem & Process Improvement Plan | 事后总结,并提出改进计划 | 0.5 | 0.5 |
合计 | 11.7 | 12.65 |
3.解题思路
需求分析:
程序可读入任意英文文本文件,该文件中英文词数大于等于1个;
程序需要很齐全,能够容纳足够多的字符;
程序可以实现用户指定单词词频统计功能;
用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词;
统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
功能实现:
功能一:程序在读入英文文本的基础上能实现统计用户指定单词出现的频率的功能;
功能二:在功能一的基础上用柱状图显示出单词出现频率的高低;
功能三:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词;
功能四:统计出文本中所有单词的数量并将单词输出到文件result.txt中.
程序设计与实现:
该程序中通过count.java来实现文本的单词统计功能,指定单词的统计及将单词输出到文件result.txt中;
在设计程序的读入任意英文文本的设计中使用bufferedreader,其作用是从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取;
bufferedwriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
4.代码规范
5.计算模块接口的设计与实现过程
首先,题目要求程序能够接收一个文件,文件名由控制台输入,因此需要一个方法能够接收控制台输入的值作为文件的地址参数。因为题目还需要求把不同功能的模块封装成独立的模块,因此我把接收文件的代码段直接放在各个方法里。然后,题目要求代码至少要对数据进行四种统计,统计字符出现次数、单词(符合要求的)出现次数、有效行数以及出现频率最高的十个单词。我使用BufferedReader来依次读取文件的每一行,对于行数统计,我在读取的同时会记下长度不为0的行的个数;对于字符统计,我用一个StringBuffer记下每行的内容,然后把它转为String,由于此方法无法记下换行符,所以我最后用这个String的长度加上总行数(包括空白行)-1作为字符数;对于单词(有效)统计,我前面的方法同上,之后用split()方法将String分成一个String数组,通过一系列方法筛选出符合条件的元素,统计个数;对于词频统计,我用一个HashMap存放获得的符合条件的单词及其出现次数,然后对其进行排序并返回。最后,用一个输出函数接收之前方法返回的参数并新建一个新的result.txt输出。
6.计算模块接口部分的性能改进
这里几个统计方法都揉在一个方法里写了,这样复用效率不高,因此我将原先的大方法里的各个代码块独立出来,形成了最终的方法。
计算模块部分单元测试展示:
7计算模块部分单元测试展示
主函数 WordCount.java:
用一个变量pathname记下控制台传入的参数,其意义是文件的绝对地址,它将作为计数函数的参数。创建数个变量分别记下字符数,单词数,有效行数以及储存单词与出现次数关系的map。,它们的值分别与计数函数的返回值一一对应。最后,把这些值传入printFile函数中,打印并创建result.txt
public class WordCount {
public static void main(String[] args) {
String pathname = args[0];
int characters = 0;
int words = 0;
int lines = 0;
Map<String, String> map = new HashMap<String, String>();
/*查询&统计*/
characters = lib.countChar(pathname);
words = lib.countWord(pathname);
lines = lib.countLines(pathname);
map = lib.countFrequency(pathname);
/*输出结果*/
lib.printFile(characters, words, lines, map);
System.out.println("completed");
}
}
8.计算模块部分异常处理说明
通过try catch语句处理异常,在程序出错时方便查找出错点。当路径出错时,提示找不到指定文件;当无法打开文件时,提示无法打开文件。因为我对这方面知识较少,因此不太掌握这方面的知识,不是特别理解。
try {
String encoding = "UTF-8";
File file = new File(filePath);
if (file.isFile() && file.exists()) {
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
[计数函数内容]
read.close();
} else {
System.out.println("找不到指定的文件");
}
[计数函数内容]
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
附录(见上图)
10.心路历程与收获
·通过这次作业,我进一步的学习和使用github/码云。在接触git后,发现其便利性有助于我日后学习软工;
·了解了程序开发的具体,知道了一个好的程序项目需要哪些必要步骤;
·逐渐形成自己的代码风格,代码要让别人一读就懂,即一目了然;
·编写一个程序之前,要清楚的知道程序的要求,目的以及需求;
·虚心请教他人,使自己向更优秀的人靠近;
·会用知识网站,在搜寻资料的同时,知道优秀的知识网站。