zoukankan      html  css  js  c++  java
  • 编程作业

    这个作业属于哪个课程 软件工程
    这个作业要求在哪里 作业要求
    这个作业的目标 编程作业
    学号 20188540

    1、作业描述和目录

    1、统计文件的字符数(对应输出第一行):

    只需要统计Ascii码,汉字不需考虑
    空格,水平制表符,换行符,均算字符

    2、统计文件的单词总数(对应输出第二行),单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。

    英文字母: A-Z,a-z
    字母数字符号:A-Z, a-z,0-9
    分割符:空格,非字母数字符号
    例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词

    3、统计文件的有效行数(对应输出第三行):任何包含非空白字符的行,都需要统计。

    4、统计文件中各单词的出现次数(对应输出接下来10行),最终只输出频率最高的10个。

    频率相同的单词,优先输出字典序靠前的单词。

    例如,windows95,windows98和windows2000同时出现时,则先输出windows2000

    输出的单词统一为小写格式

    然后将统计结果输出到output.txt,输出的格式如下;其中word1和word2 对应具体的单词,number为统计出的个数;换行使用' ',编码统一使用UTF-8。

    项目链接

    Gitee-Java

    2、psp表

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

    3、解题思路

    (1),读取文件,利用Java I/O读入文件中的内容 bufferedreader类将数据放到缓冲区内进行操作,
    (2)bufferedreader中的readline()方法是按照逐行读取同时进行累加最后输出行数
    (3)用split()方法进行单词切割存放在数组中,并获取数组长度,将其中所有的单词利用toLowerCase()方法全部变成小写,判断是否视其为单词,如果视为不是单词,获取的数组长度减一,循环下去知道所有的单词都满足要求,然后输出个数
    (4)取(3)中的数组遍历,判断是否为重复,统计单词频率,循环下去,最后利用filewriter写出到output.txt

    4、代码规范

    codestyle

    5、计算机模块接口的设计与实现

    int length = item.length;// 得到item的长度
    
    		FileInputStream fis = null;
    
    		try {
    			fis = new FileInputStream(file_path);
    
    			while ((bytes = fis.read(item, 0, length)) != -1) {
    				countChar += bytes;
    			}
    
    

    定义 countChar来存储字节数,用缓冲区中的数据fileinputstream通过while循环来累加字节数,最后输出字节数

    try {
    			fis = new FileInputStream(file_path);
    			isr = new InputStreamReader(fis);
    			br = new BufferedReader(isr);
    
    			while (br.readLine() != null) {
    				countLine++;
    			}
    

    bufferedreader中的readline()方法是按照逐行读取同时进行累加最后输出行数

    temp = temp.toLowerCase();
    
    			String[] total = temp.split(" ");// 将temp中的单词用“ ”分开
    			countWords = total.length;
    			
    			for (int i = 0; i < total.length; i++) {
    				String s = total[i].toString();
    				if (s.length() < 4) {// 如果字符小于4个
    					countWords--;
    				} else {
    					for (int j = 0; j < 4; j++) {// 如果字符数大于4但是前面为数字
    						char c = s.charAt(j);
    						if (!(c >= 'a' && c <= 'z')) {
    							countWords--;
    							break;
    						}
    					}
    				}
    			}
    
    

    用split()方法进行单词切割存放在数组中,并获取数组长度,将其中所有的单词利用toLowerCase()方法全部变成小写,判断是否视其为单词,如果视为不是单词,获取的数组长度减一,循环下去知道所有的单词都满足要求,然后输出个数

    fis = new FileInputStream(file_path);
    			isr = new InputStreamReader(fis);// 文件字节输入流
    			br = new BufferedReader(isr);// 文件缓存输入流
    
    			while (br.read() != -1) {
    				temp = br.readLine();
    				sb.append(temp);// 将读出来的数据保存在temp中
    				sb.append(" ");// 添加一个空格
    			}
    			Map<String, Integer> map = new HashMap<String, Integer>();// 运用哈希排序
    			temp = sb.toString();
    
    			temp = temp.replaceAll("[^A-Za-z0-9]", " ");
    
    			temp = temp.toLowerCase();
    
    			StringTokenizer st = new StringTokenizer(temp, " ");// 分割字符串
    
    			while (st.hasMoreTokens()) {
    				String letter = st.nextToken();// 把分割好的字符串保存到letter中
    				int count;
    				if (map.get(letter) == null) {
    					count = 1;// 表示没有分割
    				} else {
    					count = map.get(letter).intValue() + 1;
    
    				}
    				map.put(letter, count);
    			}
    			Set<MySetUtil> set = new TreeSet<MySetUtil>();
    			for (String key : map.keySet()) {
    				set.add(new MySetUtil(key, map.get(key)));
    			}
    			int count = 1;
    			for (Iterator<MySetUtil> it = set.iterator(); it.hasNext();) {
    				MySetUtil msu = it.next();
    				boolean isWords = true;
    				if (msu.getKey().length() > 4) {
    					String s = msu.getKey();
    					for (int i = 0; i < 4; i++) {
    						char c = s.charAt(i);
    						if (!(c >= 'a' && c <= 'z'))// 只要是字母都已经换成小写了
    						{
    							isWords = false;
    							break;
    						}
    						if (isWords == true) {
    							result += msu.getKey() + ": " + msu.getCount() + "
    ";
    							if (count == 10) {
    								break;
    							}
    							count++;
    						}
    					}
    
    				}
    			}
    

    取(3)中的数组遍历,判断是否为重复,统计单词频率,循环下去,最后利用filewriter写出到output.txt

    6、单元测试和性能分析

    7、异常处理

    1、输出时数据重复

    2、使用输入输出流、文件流时,必须try catch处理异常,否则编译不通过。

    8、心路历程与收获

    在这次的项目中,我复习了如何用gitee管理代码,也学到了不少新知识,制定了自己的Java代码规范。我也接触到了PSP表格这种估计开发时间的方法,在项目开发的过程中开始有意识地估计和记录各项工作的时间。我还学会了编写构建之法中提到的单元测试,我想单元测试对于复杂的项目是很重要的。同时我还复习巩固了一些Java的知识,也锻炼了思考的能力。

    这次的作业接触到的新东西比较多,感觉有点难,有需要学习的新知识,会遇到一些问题,文档的写作也和较以往的作业比不同,希望经过这一次的练习,我能在以后的作业中做得更快更好。

  • 相关阅读:
    ruia笔记
    一个有趣的小例子,带你入门协程模块-asyncio
    python标准库之secrets
    转载:(Mac)在bash和zsh配置环境变量path的几种方法
    mac安装mysql8.0的错误
    Mac下的安装 mongodb
    mac 安装zsh教程资料
    mac 报错Root chmod operation not permitted on file
    喝奶粉的宝宝一天喝多少水 奶粉喂养的宝宝每天要喝多少水
    洗碗机耗材:finish 亮碟 产品的选购
  • 原文地址:https://www.cnblogs.com/zzwwll/p/14608378.html
Copyright © 2011-2022 走看看