这个作业属于哪个课程 软工-2018级计算机二班
这个作业要求在哪里 20210326-软件工程作业-3-编程作业
这个作业的目标 熟悉并掌握gitee
学号 20188456
其他参考文献 腾讯C++代码规范

PSP表格

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

gitee仓库地址

码云地址

解题思路描述

要求统计input.txt中的几个指标:
1>,统计文件的字符数;
2>,统计文件的单词总数;
3>,统计文件的有效行数;
4>,统计文件中各单词的出现次数;
单词是一步步来处理的
实现统计字符数,是较为简单的功能,通过文件流读取字符,特殊字符特殊处理;
实现统计单词数,是较为复杂的功能,通过设置状态位canbeword(每次增加,当最后大于四的时候成立)、canbetransferred(当上一个是‘\’,则可能是控制符)等,来处理一系列特殊情况。
实现统计行数,以实现设置状态位来处理大部分情况;
实现统计文件单词出现次数,是打算设置定义string单词和定义整型变量frequency并存于hashMap中,再通过将hashMap排序,以此输出前十位的频率排序;

代码规范指定链接

腾讯C++代码规范

设计与实验过程

接口类设计

class Lib {
    int chcount;   //字符总数
    int wordcount;	//单词总数
    int linecount;	//行总数
    String finname;
    String foutname;
    Map<String,  Integer > hashMap = new HashMap<String, Integer>();
    characterCount();//字符统计
    wordCount();//单词和行统计
    wordOccMax();//单词出现最多频率
    outFile(String fname, String str);//输出

字符统计characterCount();
canbetransferred用来处理可能为\n\r的情况,因为按照要求'\n'、'\r'在被读取进来时是连续两个字符,而我们每次只读一个字符。为了处理这种情况,于是当读入为'',进入(if 1),我们将canbetransferred设置为1,表示有可能出现'\n'、'\r'的情况,当下一次读入时,由于上一次canbetransferred被置为1,则进入(if 2),判断下一个是不是n或r再进行处理。

    while ((i = br.read()) != -1) {
    	 ch = (char)i;
    	 chcount++;  //字符统计
    	 if ((i == 92)) {             //(if 1)
    		 canbetransferred = 1;
    	}
    	 if (canbetransferred == 1) {      //(if 2)
    		 canbetransferred = 0;
    		 if (ch == 'n' || ch == 'r') {
    			 chcount--;
    			 continue;
    		 }
    	 }
    } 

单词统计和行统计wordCount();
设置的一下状态符合思路。

    int canbeword = 0; 	//当为0时遇到字母每次增加,前四个有非字母就置0,当最后大于四的时候说明前四个都是字母
    int canbetransferred = 0;//可能为\n\r
    int linechcount = 0;    //统计每行字符,不为空字符则++,为空不能算一行
    String tempword = "";    //存放临时字符串

因为仅在换行和出现分割符时,word数量才会相加,通过!Character.isLetter(ch) && !Character.isDigit(ch))判断ch是否为分割符,分下列两种情况:
一、ch为'',
1、判断tempword是否可为word(通过canbeword是否为4),若是则加入hashmap, 且wordcount++;2、将tempword、canbeword重置;3、将canbetransferred = 1;4、continue,进入下一层判断是否为'r'或'n' ;
二、ch不为''
1、判断tempword是否可为word(通过canbeword是否为4),若是则加入hashmap, 且wordcount++; 2、将tempword、canbeword重; 3、continue,进入下一层判断是否为'r'或'n'

换行统计主要代码

	 if (linechcount != 0) {
		 linecount++;
	 }
	 linechcount = 0;

前10单词出现最多频率wordOccMax()
思路与单词数统计差不多,当可为一个单词时,就存入hashMap。最后再统计。
存入HashMap的代码:

    if (hashMap.containsKey(tempword)) {
       	 Integer hvalue = ((Integer)hashMap.get(tempword))+1;
       	 hashMap.put(tempword, hvalue);
    }else {
        hashMap.put(tempword, 1);
    }

排序代码,先按value,value相同,再按key:

public int compare(Map.Entry<String,  Integer> o1,  Map.Entry<String,  Integer> o2) {
	int re = o2.getValue().compareTo(o1.getValue()); //重写排序规则,小于0表示升序,大于0表示降序
	if (re != 0) {
		return re;
		}else {
			return o1.getKey().compareTo(o2.getKey());
	}
}

输入结果示例:

运行结果示例:

异常处理说明

1>、数组越界问题,采用了ArrayIndexOutOfBoundsException进行异常处理。
2>、输入输出流问题,采用了IOException进行异常处理。

新路历程与收获

这次作业是个人第二次作业,主要考验了学生自我编程能力及gitee的使用,通过完成作业,了解到自己还存在很大的不足,革命还在继续,同志仍需努力。