OOP第三阶段题目集总结|课程总结-22201608-柯汶君|今日要闻
第三阶段的题目集时间跨度大,内容比较充实,对前面学习过的类的继承,多态,接口进行了巩固练习,加深我们对多态的理解,学会更好地改善代码的结构。同时对最后阶段所学习的集合框架体系(Set、Map等)比较方便的工具进行相应的练习,让我们通过合理地使用这些工具来减少代码复杂度。
前言: 1.作业相关知识点:第七次和第八次题目集主要是对类的继承,多态和接口的巩固练习;
(相关资料图)
第九次题目集是课上讲完Set后对(Set和Map)利用的实践;
第十、十一、十二次题目集有成绩统计系统的迭代,同时对容器和前面学习过的类的基础知识进行复习。
2.作业题量:每次题目集是为了对所学知识有一定的实践意义,题量与时间相关,比较正常;
3.作业难度:复习回顾性的题目集的难度不大,重点是统计关键字和课程成绩统计,写起来繁琐,需要理解题目需求及类与类之间的关系。
设计与分析: 1.关键词统计: 题目分析:题目要求对输入的源码进行关键词的查找(注释及字符串中的关键词不进行统计),当未输入源码时,程序输出Wrong Format
当没有统计数据时,输出为空,当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字
。
输出格式的要求可以通过(Map 把关键词当key存入,数量作为值)来满足,记得先对Map进行初始化,再使用,避免null的报错。将读取数据作为一个类,按行存入,再对每行除去字符串中的内容及非英文单词的部分(一些其他符号),然后按空格分割得到每一个代码中的词再与java中的53个关键词进行匹配,处理完后进行相应的输出。
类图:作了输入和处理两个类,在Main中对结果进行输出
SourceMonitor分析:这次题目用到了Map和Set代码的长度不大,同时涉及的分支很少,圈复杂度等不高,都在正常的范围之中。
完整代码:查看代码
import java.util.*;class InputData { public static StringBuilder getData() { StringBuilder stringBuilder = new StringBuilder(); String line; while (!(line = Main.input.nextLine()).equals("exit")) { //去掉单行注释和字符串里的内容 //.匹配这个字符多次,*字符后的内容 // /n 作为每行之间的特殊字符便于后续分割 stringBuilder.append(line.replaceAll("//.*", "").replaceAll("\".*\"", "")).append("\n"); } return stringBuilder; }}class DealData { private Map countMap = new TreeMap<>(); // 键值对(关键词 出现次数) private final Set keyWords = new HashSet<>(Arrays.asList( "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "for", "final", "finally", "float", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while", "true", "false", "null")); public Map getCountMap() { return countMap; } public String[] remove(StringBuilder stringBuilder) { //去掉多行注释 int startIndex = stringBuilder.indexOf("/*"); while (startIndex != -1) { int endIndex = stringBuilder.indexOf("*/", startIndex + 2); if (endIndex == -1) { break; } stringBuilder.replace(startIndex, endIndex + 1, ""); startIndex = stringBuilder.indexOf("/*"); } stringBuilder.toString().replaceAll(",", " "); String str = stringBuilder.toString(); /*运算符加上关键词应该不算关键词 所以要把带运算符的关键词作为非处理 */ //通过改变运算符使整体不再是关键词 str = str.replace("-", "k").replace("*", "w").replace("/", "j"); str = str.replace("+", "h").replace(">", "y").replace("=", "y"); str = str.replace("!", "s"); str = str.replace(":", "s"); //匹配非字母项为空格,再用多空格分割每一块代码 String[] strings = str.replaceAll("[^a-zA-Z]", " ").split("\\s+"); return strings; } public void count(String[] codes) { for (String keyword : keyWords) { // map初始化 countMap.put(keyword, 0); } //把每个代码词块都单独拿出来,再与关键词一一匹配 for (String code : codes) { for (String keyword : keyWords) { if (code.equals(keyword)) { countMap.put(keyword, countMap.get(keyword) + 1); } } } }}public class Main { public static Scanner input = new Scanner(System.in); public static void main(String[] args) { DealData dealData = new DealData(); StringBuilder data = InputData.getData(); //进行结果的输出 if(data.length() == 0) { System.out.println("Wrong Format"); } else { String[] codes = dealData.remove(data); dealData.count(codes); for (Map.Entry entry : dealData.getCountMap().entrySet()) { if(entry.getValue() > 0) { System.out.println(entry.getValue()+ "\t" +entry.getKey()); } } } }}
首先要读取输入的课程信息,并进行存储,然后读取选课的信息(这里可以通过输入的格式进行区分),同时要注意格式不正确的输入要进行删除同时输出(wrong format);
我的思路是先读取信息,对信息作正确检测,然后再把正确的选课信息进行处理,读取与处理是两个类。在处理选课的同时,创建每个学生(不允许重复学号),将成绩存储给学生和课程;
最后把课程,学生,班级成绩的输出放在一个类中,在三个方法中进行相应的输出。
类图:题目所给类图:
实际类图:
学生,课程,班级中都涉及到了成绩,成绩作为父类分为考试成绩和考察成绩两个子类,对应相应的课程,选课信息的组成有学生,课程,成绩三部分。通过Comparable接口重写compareTo方法来实现相应的排序。
SourceMonitor分析:在对输入的信息进行分类及相应格式正确性的判断上使用了较多的if-else语句,导致最大圈复杂度过高,类中方法代码过于冗杂。
关键词:
相关阅读
-
OOP第三阶段题目集总结|课程总结-222016...
第三阶段的题目集时间跨度大,内容比较充实,对前面学习过的类的继承, -
外媒盘点《最终幻想16》未登场怪物 希...
外媒gamerant就盘点了一些没能够出现在《最终幻想16》中的经典怪物,希 -
快消息!篮球|女篮亚洲杯:中国队首战告捷
6月26日,在澳大利亚悉尼举行的2023年女篮亚洲杯小组赛中,中国队以89 -
天天通讯!电影剧本投稿赚钱_电影剧本投稿
1、可以先发到博客里连载,如果看的人多了,自然会有人联系你如果看的 -
环氧氯丙烷一周前瞻 天天资讯
一、关注点 1、周内丙烯、液氯反弹为主,ECH不同工艺毛利缩减明显。 -
iOS 16.5.1更新被测出续航损40分钟 苹...
苹果近日针对测试版和正式版用户推送了iOS17Beta2和iOS16 5 1更新。苹
精彩放送
-
OOP第三阶段题目集总结|课程总结-222016...
第三阶段的题目集时间跨度大,内容比较充实,对前面学习过的类的继承, -
外媒盘点《最终幻想16》未登场怪物 希...
外媒gamerant就盘点了一些没能够出现在《最终幻想16》中的经典怪物,希 -
快消息!篮球|女篮亚洲杯:中国队首战告捷
6月26日,在澳大利亚悉尼举行的2023年女篮亚洲杯小组赛中,中国队以89 -
天天通讯!电影剧本投稿赚钱_电影剧本投稿
1、可以先发到博客里连载,如果看的人多了,自然会有人联系你如果看的 -
环氧氯丙烷一周前瞻 天天资讯
一、关注点 1、周内丙烯、液氯反弹为主,ECH不同工艺毛利缩减明显。 -
iOS 16.5.1更新被测出续航损40分钟 苹...
苹果近日针对测试版和正式版用户推送了iOS17Beta2和iOS16 5 1更新。苹 -
世界最资讯丨固始:推动交旅融合发展打...
2023年6月23日,信阳市固始县交通运输局开通908公交线路景区环形运输, -
qq互联管理中心官网_qq互联管理中心网站
1、第一步、使用网站创始人帐号登录后台,进入“云平台 "页面,点... -
合见工软与华大九天携手共建国产EDA数模...
2023年6月26日——上海合见工业软件集团有限公司(简称“合见工软”... -
天天新资讯:国家铁路局就《铁路公益性...
央视网消息:为加强对铁路运输企业承担公益性运输任务的监督管理,国家