202103226-1 编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/computer-science-class4-2018
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-science-class4-2018/homework/11880
这个作业的目标 编程作业
其他参考文献 《构建之法》

1. gitee链接

2. PSP表格(预计)

PSP2.1 Personal Software Process Stages 预估耗时(分钟)
Planning 计划 10
Estimate 估计这个任务需要多少时间 30
Development 开发 300
Analysis 需求分析 (包括学习新技术) 30
Design Spec 生成设计文档 40
Design Review 设计复审 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10
Design 具体设计 200
Coding 具体编码 300
Code Review 代码复审 20
Test 测试(自我测试,修改代码,提交修改) 30
Reporting 报告 60
Test Repor 测试报告 20
Size Measurement 计算工作量 20
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30
合计 1130

3. 解题思路

3.1. 需求分析

  1. 统计文件的字符数(对应输出第一行)
  2. 统计文件的单词总数(对应输出第二行)
  3. 统计文件的有效行数(对应输出第三行)
  4. 统计文件中各单词的出现次数(对应输出接下来10行)
  5. 输出结果

3.2. 概要设计

  1. 文件的读写
    • 使用输入输出流对文件进行读写操作
  2. 计算行数、计算字符
    • 使用BufferedReader类中readline()方法进行行数的读取,同时计算行数
    • 使用InputStream中的方法available()得到文件的字符数
  3. 单词的处理与计数
    • 将整个文件读取出来后,进行规格化处理,将换行符和其他字符均设置为一个空格
    • 将整理后的字符串通过空格分割为一个字符串数组
    • 对数组中每一个字符串进行判断,是否符合题目规则
    • 将每一个符合规则的单词进行统计计数,从而得到单词的总数
  4. 单词频率统计
    • 使用Map集合以键值对的形式保存单词其出现的频率

4. 代码规范

codestyle.md

5. 计算模块接口的设计与实现过程

FileWordSplit()

该方法读取文件,对文件的字符进行处理,分割出若干个单词

// 将文件中的字符切割为字符数组
	public static String[] FileWordSplit(String input) throws IOException {

		InputStream in = new FileInputStream(input);
		StringBuilder buffer = new StringBuilder();
		
		// 获取字符个数
		int size = in.available();

		for (int i = 0; i < size; i++) {
			// 读取文件中每一个字符
			char b = (char) in.read();

			if (b == '\n' || b == '\r' || b >= '!' && b <= '/' || b >= ':' && b <= '@' || b >= '[' && b <= '`'
					|| b >= '{') {
				b = ' ';
			}
			buffer.append(b);
		}
		String[] word = buffer.toString().toLowerCase().split("\\s+");
		return word;

	}

WordFrequency()

统计单词出现的频率,使用hashMap保存

// 统计单词出现频率
	public static ArrayList<Entry<String, Integer>> WordFrequency(String input) throws IOException {
		Map<String, Integer> wordMap = new HashMap<String, Integer>();

		String[] word = FileWordSplit(input);
		for (String string : word) {
			if (CheckWord(string)) {
				if (wordMap.containsKey(string)) {
					Integer num = wordMap.get(string) + 1;
					wordMap.put(string, num);
				} else {
					wordMap.put(string, 1);

				}
			}
		}
		ArrayList<Entry<String, Integer>> list = SortMap(wordMap);

		return list;
	}

SortMap()

对使用键值对保存的单词和其出现频率的集合进行排序

CountWord()

统计单词的总个数

CountLine()

使用InputStreamreadLine()统计总行数

CountChar()

使用BufferedReaderavailable()统计总字符数

OutputFileContent()

使用OutputStream将数据写入文件中

6、计算模块接口部分的性能改进

暂时想不到改进的地方和方法

7、单元测试和性能分析

  • 将文件中的字符切割为字符数组FileWordSplit()测试

单词除去空格和特殊符号存入数组中

  • 整体测试

8、异常处理说明

当文件找不到时会跳出异常

9、PSP表格(实际)

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 10
Estimate 估计这个任务需要多少时间 30 30
Development 开发 300 400
Analysis 需求分析 (包括学习新技术) 30 30
Design Spec 生成设计文档 40 60
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 20
Design 具体设计 200 200
Coding 具体编码 300 400
Code Review 代码复审 20 20
Test 测试(自我测试,修改代码,提交修改) 30 30
Reporting 报告 60 60
Test Repor 测试报告 20 30
Size Measurement 计算工作量 20 20
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 30
合计 1130 1370

10、心路历程与收获

在实现项目的过程中发现了自身诸多的不足,许多东西曾经学过,而如今已然忘却,在光研究git便耗费了我3个小时的光景,至于编程语言也略有生疏。虽然本次作业的编程题目总体来说难度不大,但是对完成这一个整体的作业而言,相比较之下由于自身对于gitee和GitHub使用的并不多所花费的时间和精力更大,而且我对于测试也并不太熟悉,只是曾经略有了解过,还是存在较多的弱项,自身的学习任然需要进一步的加深。

posted @ 2021-04-01 23:39  孙笑川6324  阅读(101)  评论(0编辑  收藏  举报
1 2 3