题目集4~6的总结性Blog

题目分析

本阶段题目集的主要考察的知识点是继承和多态,继承包括对super、extend关键字的使用,方法的重写等,多态包括向上转型、向下转型等。此外还考察了抽象类和接口及之前的封装性,需要我们有抽象类的能力。在设计上考察了单一职责原则和MVC模式。总体上需要对现已学过的知识进行综合运用。
这三次程序设计的作业对于类与类之间的关系的设计要求较高,如果不能很好的设计出合理的类间关系,那么写起这个题目来无疑是这补补,那看看。所以,对于程序的大致框架设计显得十分重要。三次pta作业涉及的知识点很多,要求平时基本功要很好。在答题程序4中,家居强电电路模拟程序-1,家居强电电路模拟程序-2这三次作业中,都以继承为背景,考察了继承的相关知识,例如继承中多态的使用,方法的重写,以及子类的构造方法调用父类的无参构造进行数据的初始化等。同时,对于输入数据的解析和处理又考察了对于正则表达式的使用,利用捕获和分组对解析相应的信息进行创建对象的初始化。在保存对象数据时又考察了集合类的使用,例如ArrayList,,HashMap等数据结构的使用,对于保存的数据要求不同要选择对应的集合类进行储存,HashMap可以存储一个键值对,这就可以用来实现编号和对象一一对应的关系

7-4答题判题程序-4

设计思路

设计分析本次迭代新增了选择题,填空题,处理这两种题的输入和前几次迭代大致相同,但本次迭代新颖的地方,就是他们的输出:都增加一项”partially correct”表示部分正确。
1.定义数据结构来存储题目信息、试卷信息、学生信息和答题信息。
2.编写函数来处理每种输入信息的格式,并存储到对应的数据结构中。
3.编写函数来处理答题信息的输入,并判断每道题目的答案是否正确。
4.编写函数来输出各种类型的信息,包括试卷总分警示、答题信息、判分信息、被删除的题目提示信息、题目引用错误提示信息、格式错误提示信息和试卷号引用错误提示信息。
5.编写函数来处理多张试卷的情况,包括排序和合并输出。
这个题目需要考虑多种异常情况,包括题目编号的缺失、试卷总分不等于100分、题目被删除、输入信息顺序问题等。在处理这些异常情况时,需要根据题目要求来输出相应的提示信息。
设计类图如下

踩坑心得

1.对选择题和填空题的部分正确未考虑周到。比如一个选择题的正确答案是ACD,答卷答案是AD时肯定是正确的,DA也毫无疑问没错,但我的判断方式是Pattern(标准答案),Matcher(答案)来进行简单判断。所以后面一种DA最后判断会得0分。
2.因为用HashMap时存储时的key值不不是简单的0,1,2之类的,所以多名学生输出时因为HashMap输出的随机性,输出结果也是乱序的。最后也是在输出前面用ArrayList再记录了一遍顺序进行输出。
3.答案批改的方法,是否进入批改的判断仅为题目是否在输入时读取到,这导致被删除的题目也会被计算出答案,而我的答案输出形式判断的是answer是否为0,这使得题目被删除的情况依旧会输出答案。

7-5家居强电电路模拟程序-1

设计思路:

因为这次题目的设备并没有电阻,所以无法使用正常的根据电阻求分压的方法来计算设备状态,也因此,电路中只能出现一个设备,不然出现多个设备的话无法进行分压操作。这一点也就给了很多人设计一个特殊电路的可乘之机。但是我并不是如此。
首先,我们判断电路开端是否含有VCC信息,如果有,就设置电路初始电压为220V,反之为0V,GND判断同理。
然后读取所有设备信息,包括控制器和被控制器。按照从电路开端到电路接地端的方向一步一步进行处理,并且令下一个设备的输出电压等于上一个设备的输出电压。这样就能得到所有设备的输入电压和输出电压。
其次,获取了输入电压和输出电压后,就能用前者与后者的差计算出该设备的电压,再根据该设备的状态计算方式计算出它的转速或者亮度等状态信息。
最后,对设备信息进行排序输出。
1.系统需要能够处理多种输入信息,包括设备信息、连接信息、控制设备调节信息等。设备信息包括设备的标识符和编号,以及设备的引脚编号。连接信息表示一组连接在一起的设备引脚,引脚与引脚之间用空格分隔。控制设备调节信息用于改变控制设备的状态或参数。

2.系统需要能够根据输入信息计算出每个设备的参数值,并按照指定的格式输出。输出信息包括设备标识、设备编号和设备参数值,其中参数值需要根据题目要求进行截尾处理。

3.题目中还提供了一些输入样例和输出样例,可以帮助理解题目的要求和测试系统的正确性。

4.这个题目是一个综合性的编程题目,需要考虑多种数据结构和算法,以及对各种异常情况的处理。在实现过程中,需要注意代码的清晰性和可维护性,以及程序的效率和正确性。同时,还需要注意题目中给出的各种规则和约束条件,确保程序能够正确地模拟智能家居电路的工作情况
类图如下

踩坑和心得:

1,基本没有设计阶段,逻辑混乱。所以在写代码前还是要先设计好,这样才能事半功倍。
2,忽略部分情况,比如开关在后面断开,开关后的电器电压全为零,但开关前的电器电压未清零。解决方法便是添加一个TestFlow()方法判断电路是否为通路,在进行Flow()。
3.对象为空的情况,因为本次用了Electronic behindElectronic,这种类似C语言链表的形式的方法,在处理信息时有behindElectronic或者frontElectronic为空导致错误。我的解决方法是重头理一遍,还是设计的问题,一开始没想好怎么写就直接动手。
4,截尾输出出现问题,不应该使用String.format("%.0f",n),应直接用(int)强制类型转换后输出。
5.区间范围写错。挡位为0-3共4个挡位。所以下意识的写了if(level <4)使得某些测试点没过。
6.审题不清,以为开关也只有一个。所以当时连电路上设备连接顺序都没有写,于是便在主函数中新加一个链表存储电路上设备连接顺序。在进行电路运转效果计算之前再进行电路上开关的判断。

7-6家居强电电路模拟程序-2

设计思路:

控制设备:
开关、分档调速器、连续调速器的基本功能和特性与之前相同,但增加了所有开关的电阻为0的设定。
受控设备:
1.增加了落地扇,其工作电压区间和对应转速区间与吊扇有所不同,且每个电压区间对应的转速也不同。
2.考虑了电阻的影响,白炽灯、日光灯、吊扇、落地扇的电阻值不同。
3.增加了并联电路的输入,允许并联多个串联电路。
4.引入了串联电路和并联电路的编号系统,以及IN和OUT的概念来表示电路的起始和结束端。
5.连接信息不再单独输入,而是包含在串联电路或并联电路的信息中。
输出信息:
1.输出格式与之前相同,但需要额外输出落地扇的转速。
规则和约束:
1.增加了对并联电路的约束,不允许并联电路中包含并联电路,也不允许多个并联电路串联。
2.强调了电路中的短路如果不会产生无穷大的电流,则被认为是合理情况。
3.明确了电源VCC和接地GND在电路中的位置,以及调速器输入端的连接限制。
新增功能:
1.并联电路的模拟,允许电路中存在并联结构,增加了电路设计的灵活性。
2.电阻的考虑,使得电路模拟更加接近实际物理情况,需要计算电压降和电流分配。

踩坑心得

截止到现在,由于种种原因这次的代码测试并没有通过,一方面是在代码逻辑结构的设计上存在漏洞,一些关键的分支条件判断不够精准,导致程序在运行特定数据组合时出现了错误的走向,计算结果与预期严重偏离。另一方面,代码中存在部分变量未初始化的情况,这使得程序在运行过程中产生了随机的、不可控的数值,进而破坏了整个数据处理流程的稳定性与准确性。此外,对新引入的算法库函数理解不够深入,在调用和参数传递时出现失误,引发了一系列连锁反应,致使程序崩溃。我会在下次集中精力解决这些问题,尤其是针对 Java 代码特性深入优化。对于代码逻辑结构漏洞,我会运用 Java 的调试工具,如断点调试与日志输出,详细追踪程序运行流程,精准定位不准确的分支条件判断,然后依据 Java 的语法规范和最佳实践,重新设计与优化逻辑,确保程序能正确处理各类数据组合。对于未初始化变量问题,严格遵循 Java 的变量初始化规则,仔细检查每一个变量声明处,必要时添加默认初始化值或者明确初始化逻辑,保障数据处理流程的稳定性。

总结

在这三次作业中,遇到了很多困难,也有很多严重的问题,在电路问题中就体现出了这一点,经过这几次的pta的锻炼,我感觉我的代码的能力还是有了很大的提升,虽然过程很难,但收获很大。
这三次PTA较前三次PTA来说,在单一职责原则和开闭原则上有进步,但依旧不够。要想使代码更“高级”,需要掌握设计原则,并多加练习。无它法,唯多练。Java这门语言,不仅考验了逻辑思维能力还有用代码的表达能力,用最好的方式最好的思维写出最简洁的代码,这是很难的地方,还要多多学习Java这门语言,面对难题的时候要多思考,多练习,寻找最优解。

在写题目的过程中,总是会有很多细小的逻辑方面的问题没有考虑到,这应该怎么改进呢?有的人可以写完代码后提交一遍过,而我则需要一遍遍的刷测试点以找到自己的错误。或许是因为在编写代码的过程中过于依赖案例,就是就着案例编写程序,而不是在脑子里思考存在哪些情况。上次blog告诉自己写之前画类图,然而这几次并没有做到。希望后面两次的PTA可以尝试着做一下看看效果。

java中有很多流,虽然我到现在还没明白什么是“流”,但我稍微用过几次:获取数组中有多少null,和C语言进行对比,不得不感叹Java的强大,他能成为目前世界上最流行的语言不是没有原因的。

java中的Arrays也是个比较好用的工具,可以对数组进行扩容什么的(我最常用的也就是扩容),但需要注意的是,使用完数组的地址会发生改变。当把数组的地址传入方法后,若不返回数组地址且使用了Arrays对数组进行编译,将无法在方法结束后获得编译后的数组。还是喜欢动态数组ArraysList,便捷且功能强大。

java中有很多很好用的工具,然而我只是会用,知道给方法传什么能得到什么我想要的东西,希望我在有空的时候,可以弄懂他的底层逻辑。

这三次的作业很好地训练了我对类的设计能力,和刚开学时相比我想我已经学到了很多东西,但是这还远远不够,我们还需要更加用心地去面对这门课,在面对pta里的这些题目也能迎难而上。

posted @ 2024-11-23 23:42  Mist_123  阅读(31)  评论(0)    收藏  举报