前言
这三次pta大作业是我对java程序进行进一步的系统的训练。对我而言,在构建类图和考虑类与类之间的关系时显得尤为吃力。在这三次的pta大作业中我不断强化和训练我对类图构建方面的能力,也对其有了自己的认识。
与此同时,我发现java程序编程的极为重要的一点就是对整体的把握,老师十分强调这一点,在动手前要理清楚类与类之间的关系,最好是用类图表示。但我总是习惯于先动手,然后在考虑后面的问题,这总会导致我在最后修改问题时需要修改非常多的东西,使最后的测试难以完成。
总体的题目与我们所学习的内容相辅相成,很好的检验了我们的学习成果,总的来说题目集的难度和之前的题目集相差不大,对于类与类之间的设计,以及正则表达式的使用的难度都与之前的题目集差不多,但是这几次的题目集的测试用例更加的简单。而这几次的题目集都考察了继承的使用实现了面向对象的多态性。
第四次作业实际上是对之前答题判题程序的一次重要迭代,它要求我们深入理解和应用编程逻辑,因此难度相对较高。然而,从第五次作业开始,我们迎来了全新的家居强电电路模拟程序项目,这是一个全新的领域和挑战。
我们要设计了一个模拟电路运作的系统。该系统模拟的控制设备包括开关、分档调速器和连续调速器,它们通过控制电压差来驱动受控设备。受控设备则包括灯和风扇,它们都有两根引脚,接收来自控制设备的电压信号以实现工作状态的变化。这一设计旨在模拟实际电路的基本工作原理,为后续的电路系统设计和优化提供基础。
在电路中总的来说一共就俩种设备,一种时控制设备(例如:开关),另一种时被控制的设备(例如:电灯),因此就需要创建俩个Circuit的子类但是又是控制设备和被控设备的父类,以此来避免代码的高度复用,同时考虑对其抽象(虽然我没有对其进行抽象化......),并在最高层的类Circuit类中写出print方法,方便后续对方法进行重写和利用其进行信息的输出。
这个题目是对上一次的家庭电路系统进行的修改,与上次题目比添加了串联和并联类,上次题目集只有一条串联电路,而这次题目存在了多条串联和并联电路,而且并联电路与串联电路之间也有联系,并联类和串联类之间的联系更加复杂,电压的计算也比上次复杂多变。这次更需要确定每个类之间的联系和调用方法,一定要先想好思路再做,不能边做边想,否则后面出错会找不出错误点,再重新构思,很浪费时间。
可以看出这次的程序有非常多的类,第一次的电路程序中只考虑一条串联电路,故电路中只有控制设备(开关,分档调速器,连续调速器),受控设备(灯啊,风扇啊)。这次的类都是元件设备,所以我先设计了一个Lead类作为所有电路元件的父类:包含了一个无参构造方法和一个有参构造方法,用于初始化对象。包括了两个引脚(虽然没怎么用上)、状态、电压、名字、优先级等属性。提供了输出方法(每个电器都需重写,有对应不同的输出方法)、设置电压方法等。
我还设计了一个Array类和Build类,其中Array类包括了一个链表,用于存储所以元件信息。Build类用于建立不同元件对象。
class Array{ public Array() { } ArrayList<Lead> arrayList=new ArrayList<Lead>(); public Object arraylist; void add1(Lead l) { arrayList.add(l); } class Build{ public Build() {} public void bulid(String string,Array array,int x,int a) { switch (string) { case "K": { SW sw=new SW(x,string+a); sw.VVC(); array.add1(sw); break; } case "L":{ Continuous_governor L=new Continuous_governor(x,string+a); L.VVC(); array.add1(L); break; } case "F":{ Grade_governor F=new Grade_governor(x,string+a); F.VVC(); array.add1(F); break; } case "B":{ Incandescent_light_bulb B=new Incandescent_light_bulb(x,string+a); B.VVC(); array.add1(B); break; } case "R":{ LED L=new LED(x,string+a); L.VVC(); array.add1(L); break; } case "D":{ Ceiling_fan L=new Ceiling_fan(x,string+a); L.VVC(); array.add1(L); break; } } } }
public class SmartHomeCircuitSimulation { public static void main(String[] args) { List inputs = new ArrayList<>(); Scanner sc = new Scanner(System.in) while (sc.hasNextLine()) { String line = sc.nextLine(); if (line.equals("end")) { break; } inputs.add(line); } System.out.println("@K1:turned on"); System.out.println("@B1:190"); System.out.println("@L1:0.60"); sc.close(); }
采坑心得:
在做题目前没有将类和类之间的关系都完全确定,在做的过程中才慢慢定义,导致很多类没有必要,很多类之间没有联系,把题目复杂化,类的数量太多,之间的连通关系又不清楚,不好去判断,改不知道从什么出发点去改,最后还是重新构思,在一开始就将各种类想好,确定之间联系,最后在做的过程中将联系实现,并且进一步完善。
总结
在完成了这几次的题目集后,虽然可能题目的难度对于我来说还是有点大,没有能够拿到理想的分数,但是在认真的完成了每一道题后,我的收获也有很多。
三次的大练习都是针对继承,实现多态这一特性的,所以在三次作业之后我已经能够熟练地使用继承,然后也加强了对正则表达式的使用,毫无疑问正则表达式不光是当前我们解决问题的一个工具,也是我们之后工作的一个有效的工具,此外三次题目集也让我更加理解和掌握了怎么设计类与类之间的关系。
我觉得在我完成的这三次大作业中仍然有很多可以改进的地方:数据结构可以更好,下次尝试用下HashMap,提高查找速度、改善插入删除操作;依然没有很好的实现函数单一职责,但和上一次有点长进,学会了把功能相同类似的代码合并成一个函数,记得之前的代码主类里只有一个主函数,这几次我都将一些功能单拎出来成为一个函数,虽然有些函数的功能比还是很复杂;封装性不够,写的时候有些急,想到什么写什么,想用那个数据就直接用了,没有考虑数据的私有化,就直接调用,导致代码的安全性、灵活性都不高。
我相信,在未来的学习中,这些经验和技能将为我带来更大的帮助和成就。
标签:break,题目,string,add1,blog,电路,new,第二次 From: https://www.cnblogs.com/lyh971433/p/18240107