您的位置:首页 >滚动 >

OOP第三阶段题目集总结|课程总结-22201608-柯汶君|今日要闻

2023-06-26 16:25:25    来源:博客园

第三阶段的题目集时间跨度大,内容比较充实,对前面学习过的类的继承,多态,接口进行了巩固练习,加深我们对多态的理解,学会更好地改善代码的结构。同时对最后阶段所学习的集合框架体系(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());                }            }        }    }}
2.课程成绩统计程序-1:   题目分析:

首先要读取输入的课程信息,并进行存储,然后读取选课的信息(这里可以通过输入的格式进行区分),同时要注意格式不正确的输入要进行删除同时输出(wrong format);

我的思路是先读取信息,对信息作正确检测,然后再把正确的选课信息进行处理,读取与处理是两个类。在处理选课的同时,创建每个学生(不允许重复学号),将成绩存储给学生和课程;

最后把课程,学生,班级成绩的输出放在一个类中,在三个方法中进行相应的输出。

类图:

题目所给类图:

实际类图:

学生,课程,班级中都涉及到了成绩,成绩作为父类分为考试成绩和考察成绩两个子类,对应相应的课程,选课信息的组成有学生,课程,成绩三部分。通过Comparable接口重写compareTo方法来实现相应的排序。

SourceMonitor分析:

在对输入的信息进行分类及相应格式正确性的判断上使用了较多的if-else语句,导致最大圈复杂度过高,类中方法代码过于冗杂。

关键词:

相关阅读

精彩放送

世界最资讯丨固始:推动交旅融合发展打造景区环形运输线

qq互联管理中心官网_qq互联管理中心网站

合见工软与华大九天携手共建国产EDA数模混合信号设计与仿真解决方案|天天速读

天天新资讯:国家铁路局就《铁路公益性运输监督管理办法》公开征求意见

【短讯】马斯克星链又获一国政府青睐!日本军方有望明年全面部署

红色痘痘涂什么药膏?推荐祛痘效果好的产品2023!

中国美术馆“大师讲大美”再度开讲 奥运冠军张宁泪洒现场 环球快看

播报:信用卡逾期信用怎么办?信用卡最低还款额利息高吗?

天天新资讯:国家铁路局就《铁路公益性运输监督管理办法》公开征求意见

【短讯】马斯克星链又获一国政府青睐!日本军方有望明年全面部署

红色痘痘涂什么药膏?推荐祛痘效果好的产品2023!

中国美术馆“大师讲大美”再度开讲 奥运冠军张宁泪洒现场 环球快看

播报:信用卡逾期信用怎么办?信用卡最低还款额利息高吗?

霍格沃茨之遗地图指引是否显示收藏品攻略|环球看点

Histoire失落之翼乐谱位置_焦点速讯

每日观点:烟火端午|端午旅游“热度”攀升 周边游,短途游受青睐

湖北省黄石市2023-06-18 21:30发布雷电黄色预警

省环保集团开展有机废弃物处理和资源化利用调研:变废为宝,让水更清岸更绿