第四到六次pta作业总结

news/2024/10/8 2:19:23

前言

本次的总结是关于第四、五、六次pta编程作业的概括与分析,也是对自己近一个月java学习方面上的成
果收获与经验教训的回顾与反思。

  • 对于知识点的总结

    第四次的作业主要还是在前三次的程序上进行迭代并添加了新的类来处理不同的数据,这也是主要的新的难点。在这次的作业中,我对正则表达式的功能与便捷有了更深的体会。其实有些题目的难点并不是类间设计的难点,而是如何合理的对输入的数据进行恰当的处理。而通过正则表达式则可以极大地便利我们。第五次的作业改变为了新的题型——家居电路模拟题,是使用代码将不同的电器通过串联或并联的方式连接起来形成回路并能够通过改变电路中的电器的状态来实现对电器的控制。第六次作业则是在这基础上进行迭代。这两道题中都涉及到对继承和多态的反复使用,并且通过对集合的合理使用能够大大降低数据处理的难度,例如HashMap,ArrayList等。

  • 对于体量与难度的说明

    综合来讲,总体题量不是特别大,但对于我来说短时间内完成还是非常困难,而我也主要将时间花费在了对类间关系的设计与调试上,这些也占用了我的大部分时间。在我看来,这些pta的题目对于我这样语文不是太好的人来说难度更是直线飙升,在每次新的作业发布后我都需要花费几个小时来将文字极多的题干、设计需求、类间关系、输入输出样例来反复斟酌才能理解其中的原理并加以设计程序,这也是我花费时间多的原因之一。但在对原理理解通透之后,再来编写程序便可快速上手。还有其他的难点就是对于数据的处理,但经过前几次作业的磨炼后也没花费过多的时间也解决了。

  • 设计与分析

    第四次作业:
    数据处理过程是我认为难度最大的一步,所以我把关于数据处理方面的源码展示出来:

      Scanner scanner = new Scanner(System.in);HashMap<Integer, String> questionMap = new HashMap<>();HashMap<Integer, HashMap<Integer, Integer>> quotaMap = new HashMap<>();HashMap<Integer, String> studentMap = new HashMap<>();HashMap<String, HashMap<Integer, String>> answerMap = new HashMap<>();HashSet<Integer> deletedQuestionSet = new HashSet<>();boolean isFirstStudent = true;boolean isFirstTestPaper = true;int maxScore = 0;while (scanner.hasNextLine()) {String line = scanner.nextLine().trim();if (line.equals("end")) {break;}if (line.startsWith("#N:")) {parseQuestionInfo(line, questionMap);} else if (line.startsWith("#T:")) {parseTestPaper(line, quotaMap, questionMap);isFirstTestPaper = false;} else if (line.startsWith("#X:")) {if (!isFirstStudent) {printScoreInfo(answerMap, studentMap, quotaMap, deletedQuestionSet, maxScore);resetMaps(questionMap, answerMap, deletedQuestionSet);maxScore = 0;}parseStudentInfo(line, studentMap);isFirstStudent = false;} else if (line.startsWith("#S:")) {parseAnswerInfo(line, answerMap, quotaMap, deletedQuestionSet);} else if (line.startsWith("#D:")) {parseDeletedQuestion(line, deletedQuestionSet);}}printScoreInfo(answerMap, studentMap, quotaMap, deletedQuestionSet, maxScore);
    

    }

    通过每个类开头的不同信息来将其通过正则表达式分割为单个的字符串,并将每个字符串存入与其对应的集合中,以便在后续使用中对其中的数据进行处理。在这次作业中我也将原来使用的ArratList集合改换为了HashMap集合,因为Map类集合可以存储两个数据,如果将题目对应的题号存储在键对象中且题目的内容或是数据存储在值对象中,会大大提高代码运行效率且更为简洁。

    第五次作业:
    类图:

    需求

    需要将受控设备——包括白炽灯、日光灯和吊扇,而且每个设备在不同的电压下会存在不同的状态,在对搜空设备档位的调节中可以改变为不同的状态。而控制设备则包括:开关、连续调速器和风档调速器,这其中的开关能够控制电路是否有电,而两个调速器则是用来改变输入输出的电压值。

    分析

    这次为新的题型,但总体的设计思路与之前的作业相比并无太大的差别,依然是考察我们对于类间设计和数据处理的能力,但第一道题对于数据量较少,所以并不复杂,难的是全新的类间关系,这也需要一点小小的电学知识,但好在这题只需要最简单的串联电路将几个用电器连接起来就好。但新的考察点也有了继承与抽象类的知识,这需要其中的受控设备、控制设备、串联电路都需直接继承于电路设备类。

    第六次作业:
    家居电路模拟系列所有题目的默认规则:

1、当计算电压值等数值的过程中,最终结果出现小数时,用截尾规则去掉小数部分,只保留整数部分。为避免精度的误差,所有有可能出现小数的数值用double类型保存并计算,不要作下转型数据类型转换,例如电压、转速、亮度等,只有在最后输出时再把计算结果按截尾规则,舍弃尾数,保留整数输出。

2、所有连接信息按电路从电源到接地的顺序依次输入,不会出现错位的情况。

3、连接信息如果只包含两个引脚,靠电源端的引脚在前,靠接地端的在后。

4、对于调速器,其输入端只会直连VCC,不会接其他设备。整个电路中最多只有一个调速器,且连接在电源上。

家居电路模拟系列1-4题目后续迭代设计:

1、电路结构变化:

迭代1:只有一条线路,所有元件串联
迭代2:线路中包含一个并联电路
迭代3:线路中包含多个串联起来的并联电路
迭代4:并联电路之间可能出现包含关系
类图:

需求

第六次的作业是在上一次的基础上增加了并联电路类和一个受控设备,并且在电路设备的基础上增加了电阻这个属性,这其中的关键点是一条由多个设备组成的串联电路或并联电路也可以看做一个独立的串联设备。

分析

这两个电路类中最难的点是对每条电路的存储,并且必须保证在这同时还能实现电路的动态变化,代码如下:

class Circuit {
Map<String, Device> devices = new HashMap<>();
List<List<String>> connections = new ArrayList<>();void addDevice(Device device) {devices.put(device.id, device);
}Device getDeviceById(String id) {return devices.get(id);
}void addConnection(List<String> connection) {connections.add(connection);
}void applyVoltage(String startDeviceId, double voltage) {Queue<String> queue = new LinkedList<>();queue.add(startDeviceId);while (!queue.isEmpty()) {String deviceId = queue.poll();Device device = devices.get(deviceId);if (device == null) {continue;}device.voltage = voltage;device.updateState();for (List<String> connection : connections) {if (connection.contains(deviceId + "-2")) {for (String conn : connection) {String[] parts = conn.split("-");String nextDeviceId = parts[0];int pin = Integer.parseInt(parts[1]);Device nextDevice = devices.get(nextDeviceId);if (nextDevice != null && !nextDeviceId.equals(deviceId) && pin == 1) {queue.add(nextDeviceId);}}}}}
}public void printStatus() {Device d1 = devices.get("D1");Device d2 = devices.get("D2");Device d3 = devices.get("D3");Device k1 = devices.get("K1");Device k2 = devices.get("K2");Device l1 = devices.get("L1");System.out.println(k1.getStatus());System.out.println(k2.getStatus());System.out.println(l1.getStatus());if(d1.getStatus().split(":")[1].equals("turned on")) {System.out.println(d1.getStatus().split(":")[0]+":0");}if(d2.getStatus().split(":")[1].equals("turned on")) {System.out.println(d2.getStatus().split(":")[0]+":0");}if(d3.getStatus().split(":")[1].equals("turned on")) {System.out.println(d3.getStatus().split(":")[0]+":0");}}

}

在这电路类中不但需要存储串并联电路,还需对处理后的电路结果进行输出。

踩坑心得

在类设计中不能合理构建各个所需的类,在模拟电路的题目中我不能够很好的理解其中的引脚与电路电压之间的关系,从而设计了太多的无用类使得代码变得更为臃肿,大大降低了代码可读性。在之后迭代中我也使用抽象类来对其进行了修改:

abstract class Device {
String id;
int pin1;
int pin2;
double voltage; // 电压
double resistance; // 电阻public Device(String id, int pin1, int pin2) {this.id = id;this.pin1 = pin1;this.pin2 = pin2;this.voltage = 0;this.resistance = 0;
}abstract void updateState();abstract String getStatus();

}
这也使得设备类的子类能够直接使用其中的方法与属性。

总结

通过这三次的实验,我也对继承和抽象有了更深层的理解,并且继承和多态是Java面向对象编程中非常重要的概念。继承可以实现类之间的层次关系,提高代码的复用性和可维护性;而多态可以实现同一操作在不同对象上的不同行为。掌握继承和多态的概念和应用,可以让代码更灵活、可扩展,并提高开发效率。通过抽象,可以隐藏对象的底层实现细节,关注对象的行为和属性。抽象类和接口提供了一种规范化的编程方式,使得代码更加简洁、可扩展,并且可以实现多态。掌握抽象的概念和应用,可以提高代码的可维护性和扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/42656.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

拓扑排序

topo,拓扑排序,我的第二篇文章哈哈拓扑排序 大家好,我是Weekoder! 接上次的二分查找,我又打算写一篇关于拓扑排序的文章! 本文涉及到的知识比较多,请确认已经掌握了以下知识:循环、输入、数组等基本语法STL vector容器的基本操作STL queue队列的基本操作图论基本知识其…

课程阶段性总结

前言: 学习Java到了第二个阶段了,通过这几个月的学习,我对Java的了解逐渐深入.但是随着深入学习,我发现编写代码所需要的知识越来越多,就需要我们不断学习更多的知识.通过这几次的大作业,让我成长的非常迅速,为我提供了宝贵的实践机会。我将对题目集的知识点、题量及难度进行简…

【攻防技术系列+权限维持】①

这种方式我觉得挺好用的,且不需要管理员权限,我们都知道lnk文件可以指向一个exe文件,相当于一个快捷方式,所以我们可以更改指向的文件,指向我们的exe文件,但是这样的话原本的lnk文件就没用了,所以我们可以CreateShortcut方法来创建lnk快捷方式,在不损坏其原始lnk文件的…

第四到第六次大作业总结

一,前言 第四次大作业:第四次大作业,对我而言,并没有新增多少内容,这也给了我更多的时间去审视之前的结构与设计,我将我原先的结构重新写了一遍,做了许多优化,比如说又多提取出了两个类,尽量去实现单一职责原则,但是,在主函数当中,仍然用了一些循环,或许我可以将这…

第二次博客作业-答题判题程序4/家居强电电路模拟程序1-2 blog-2

一、前言: 在前三次面向对象程序设计题目集的基础上,我又完成了三次PTA题目集的作业,在此过程中我感受颇多。在解决前三次答题判题程序后,我逐渐掌握了这套程序的设计精髓,并在我第三次题目集的基础上做了扩展性的重构,以便于解决答题判题程序-4的相关问题。然而,在…

xxt

引子 前不久,我完成了第五次和第六次大作业。这次的作业主题是“家居强电电路模拟程序”,每次的作业都是在前一次作业的基础上进行迭代。此次作业训练了前段时间新学的继承与多态,并且巩固了之前学到的一些旧的知识。 作业总结从难度来看,这两次的大作业题都是由一种题目发…

【NAS】Docker Gitea+SakuraFrp+绿联DPX4800标 搭建私有代码托管平台

本文主要分享 Gitea的一些设置,和Https的实现。本文主要分享 Gitea的一些设置,和Https的实现。 Gitea的一些设置 映射网络HTTPS的实现 先准备好一个域名,建议准备一个1Panel创建一个AC账户然后点击申请证书,手动解析。 申请完毕后,点击详情,查看证书crt和私钥key 自己创建…

【转载】基于 Docker 的 PHP 集成环境 dnmp

参考https://github.com/yeszao/dnmp?tab=readme-ov-file https://learnku.com/articles/19289 https://www.awaimai.com/2120.html 源码 【下载】(由于限制20m上传,删除 .git 文件夹 )正文 介绍 PHP 环境搭建是个麻烦事,nginx、PHP、MySQL 一个不能少,有时候一个错误可能…