PTA第四次大作业到第六次大作业
目录
一、答题判题程序第四次迭代
1、题目分析
2、题目类图
3、题目时序图
4、题目思路
二、家居强电电路模拟程序第一次迭代
1、题目分析
2、题目类图
3、题目时序图
4、题目思路
三、家居强电电路模拟程序第二次迭代
1、题目分析
2、题目类图
3、题目时序图
4、题目思路
四、踩坑心得
五、改进建议
六、总结
一、答题判题程序
(1)题目分析:第一题比较简单,只要定义三个类然后show一下就行
题目类图:

(2) 题目分析:这题涉及子类的相关知识,要定义一个父类Student和子类Undergraduate,日间再将子类中的内容输出
题目类图:

(3)题目思路:这次是答题判题第四次迭代,在前三次迭代的基础上,这一次大作业新增加了一个多选题和填空题,需要对输入的类型先进行一次判断,不同类型开头的题目需要进入对应类型的处理函数当中,然后在进行相关逻辑的处理,同时本次题目还新增了一个对输出的学生进行排序的操作,输出先按照学号大小进行排序,当学号一样大的时候,更加答卷的序号进行排序
题目类图:

题目时序图:

题目分析:在本次题目当中新增加了多选题和填空题,先一个一个看,主要的进入saveanswer函数没有变化,主要是在进入前增加了一个判断,然后修改了checkanswer中的函数,增加了多选题部分正确的判断,先一个一个看,多选题的部分,首先是输入处理:

当输入为#N开头的判断为多选题,在saveanswer中新增加一个type变量,当出现多选题时,将type置为2,便于后续判断,然后再看判断是否正确部分:

在这一部分当中,我定义了一个allright和partright,首先判断是不是是不是输入的答案是不是等于输出的答案,如果不等于,则将allright置为0,然后再看正确答案中是否包含输入的答案,如果包含,则将partright置为1.否则将partright置为0,最后再根据allright的值和partright的值来判断题目的正确与否。并且定义了一个数组,用于存储对应题号的答案状态,比如正确还是半对半错还是全部错误。同时还要输出对应的分数,当半对半错的时候需要将分数折半。其次看填空题部分,首先是填空题的输入:

当输入为#K的时候便进入填空题的判断当中,填空题的判断和多选题类似,先判断是不是全对,如果不是全对的话就判断标准答案中是不是包含了输入的答案,从而实现判断半对半错的情况。
其次,本次大作业还需要对最后输出的学生进行判断,从题目中给出的样例可以知道,输出的顺序格式为,先按照学号排序,学号小的在前面,如果同样的学号的情况下,排序则按照答卷号进行,答卷号小的试卷在前面,如图所示:

Dajun类

Exam类

Student类:

tihao类:

第二次大作业:
(1)家居强电电路模拟
题目分析:作为新的一次迭代,这一次需要用到java中继承相关的知识,先看题目,本次题目要求的是家居状态的判断,一共有三个不同的类型,一个是控制设备,其中包括开关、分档控制器、连续控制器,一个是被控制设备,其中包括日光灯、白炽灯两种,还包括一种吊扇,第三就是串并联电路,不过第一次迭代中没有用到并联电路,同时,这一次的输入分为两种情况,第一种就是处理输入的电路,根据输入建立起电路电器之间的联系,第二种是调整电路中控制原件的状态,因为电路中的控制原件会根据输入的状态改变自身的状态,因此需要先改变完输入的状态后再进行电器状态的判断。
类图:

类图分析,在这一次大作业当中,我定义了一个device总的父类,然后我定义了一个类shuru,用来处理输入的状态,比如在第一种情况输入时(即输入电路时),我在输入中创建不同电器的类并且完成其的初始化。然后在输入第二种情况(即控制原件状态的时候),在shuru类中分解并传到device类中。我定义了一个子类beikongzhi,这个子类里面有一个dw变量和一个getres方法,这个dw变量是用来存储电流经过后该电器的状态的,二这个getres方法是将该电子原件的状态输出的方法。然后这个beikongzhi的子类同时还是一个light和fan类的父类,因为题目中的电器主要是灯和风扇,因此我将灯和风扇作为父类,以便于后续处理其他灯类型和风扇类型的变量。这个light和fan都是继承与beikongzhi的父类,因此里面都有一个printres的方法,同时我还增加了一个共同的getres方法,因为在打印之前需要获取最终的要打印的值,而这个getres方法就是用来获取最终要打印的值的方法。在light子类的情况下,他同时又作为Sunlight类和White类的父类,这两个子类一个作为日光灯,一个作为白炽灯,同样继承了light中的getres和printres的方法。
然后我定义了一个kongzhi类用来处理和控制有关的元器件的类,以这个kongzhi类作为父类的有三个类,这三个子类分别是kongzhikg(控制开关),kongzhifd(分档控制器),kongzhilx(连续控制器),这三个子类中有共同的方法,一个是changedw,getres,printres,changedw是用来改变该控制原件的状态的,getres是用来获取经过该元器件后的电压大小,然后printres是用来打印控制原件本身的状态的。
时序图:

题目思路:首先先根据输入来判断建立相应的类,比如我是先根据[+字母来进行判断,如果是[K则将建立一个开关类并根据序号将类添加进对应的数组。我建立了六个类数组,一个存储开关,一个存储分档控制器,一个存储连续控制器,一个存储日光灯,一个存储白炽灯,一个存落地扇。当有对应的类过来就将对应的存储在序号当中。
因为建立好了之后我不是优先计算被控制设备的状态我先跳过之前的读取,先处理第二种情况的读取,并将控制设备对应的状态存储到对应的数组下。
在获取到了电路中控制原件的基本信息后,我先判断电路是否是连通的:

若不连通,则将初始电压赋值为0,若连通则赋值为220V,然后再逐行判断电器的状态,遇到分档控制器,分档控制器输出分档后的电压,并将电压值设置为输出后的电压。若遇到连续控制器与分档控制器一样处理,如果遇到吊扇、白炽灯等被控制设备,则将当前的电压输入判断当前的值。
这道题目比较难过去的测试点有:当电路中只要有一个开关处于断开状态,电路就应该默认没有电流,出错的原因大概率是当开关处于电器后面的时候没有进行判断。
(2)题目分析:这题属于修改代码中不正确的部分,主要是增加其中关于数组的,因为这道题目调用了ArrayList,因此需要导入相应的数组模块import java.util.ArrayList;import java.util.List;然后将初始化改为 List
kongzhikg类:

kongzhifd类

kongzhilx类

Sunlight类:

Whitelight类:

DFun类:

三、家居强电电路模拟程序第二次迭代
题目分析:这次题目相当于上次迭代新增加了一些功能,首先是增加了一个并联电路,可以视为是电路的组成部分之一,并且其可以看成是多个串联电路,同时在上一次迭代的基础上增加了一个新的风扇子类,因为输入的格式发生了变化,因此shuru类中也需要发生相应的变化,这次输入是一整行代表一个串联短路,当为#M开头的时候是并联电路,因此可以把#M开头的视为一组#T开头的串联电阻。同时,因为是并联电路,所以电路中并联部分如果有一个开关断开可以直接将该电路视为不通过电流的电路。
类图:

类图分析,在先前的基础上,在这个类图当中先由shuru类调用获取每一条串联电路的电压。然后结合每一条电路的电阻与电压的关系获取到电路中并联电路的电压值,再将并联电路的电压值用来当做并联电路的输入电压,并且这一次新增加一个电扇类--落地扇,并且这一次这些电器中有了电阻,我电阻直接放在getR中进行了一并的处理。
时序图:

题目思路:首先是输入类的调整,因为这一次是一整行代表一个串联电阻的输入,所以像上一次那样直接输入是行不通的了,因此需要换一种方法,在这里我将输入的每一行进行判断,如果改行打头的为[,则直接将这一整行中的[替换为!,然后再根据!进行分割,将!前后分离开来,之后,再进入相应的构造函数,构造出对应的函数数组。构造玩函数后,先进行控制设备的打印,是因为控制设备在电路中输出的优先级最高,打印完控制设备之后,获取电路初始化电压,并且获取电路的并联电压,方便对电路后续并联部分进行处理。如果并联部分存在着不连通的电路,则将该段串联电路电流值改为0,然后将每一段设备的电压存放在数组当中,最后遍历数组得出设备的状态即可
kongzhikg:

kongzhifd:

kongzhilx:

chuanlian:

binlian:

device:

Sunlight:

Whitelight:

Dfun:

Afun:

** 三、三次大作业踩坑心得:**
(1)、答题判题程序第四次迭代因为已经经过了三次迭代,因此一些之前就存在的问题,比如.输入答卷的数组号和原先数组号不一致的问题,因为已经迭代了三次,因此,这个问题已经相当的深入了我的代码当中,每一次要修改一个地方,总要大修特修我的代码,然后结合老师最近上课的时候讲的几个原则,其中有一条就是面向修改关闭原则,而我的代码面向修改无法关闭,所以我的代码结构在一定程度上来说不算是一个好的结构,其次在答题判题程序当中,我的代码在一定程度上进行了耦合,按照老师说的,正常的代码需要高内聚低耦合,我也没有做到这一点,因此我感觉我这一次的代码可以往这个上面进行优化
(2)、家居强电电路模拟程序第一次迭代:1、父类中方法没有定义完全,因为这一次大作业需要我们进行继承,因为是第一次在大作业中使用继承,我并不是很熟练,落下了很多本应该在父类当中出现的方法,我却没有将其写进父类。
(3)、 家居强电电路模拟程序第二次迭代:1.可以使用模式来完成,比如将并联电路与device之间的关系加上组合,再在其中增加一个遍历的方法2.shuru函数太过于冗余复杂,可以将职责拆开给其他类一点,3.部分代码出现杂糅情况,有一些本来应该在子类当中的代码逻辑我因为贪便宜将其放在父类当中,增加了后续修改的难度。同样没有满足面向修改关闭的原则,可以尝试只将电路有关的部分写在类当中。
** 四、改进建议:**
(1)、答题判题程序:在每一个类之前增加一个注释说明,将其内部涉及到的变量和方法都标记出来,方便后续处理。遵循设计原则:单一职责原则:确保每个类和函数只负责一项明确的功能。例如,将处理不同类型题目(单选题、多选题、填空题)的逻辑分别封装在独立的函数或类中,避免在一个函数里处理多种类型题目导致代码复杂度过高且难以维护。开闭原则:对修改关闭,对扩展开放。目前代码在迭代过程中因新题型的加入而需要大量修改原有代码,应重构代码结构。比如,可以定义一个抽象的题目处理接口,不同类型的题目(如单选题处理类、多选题处理类、填空题处理类)实现该接口,这样当有新题型加入时,只需新增一个实现该接口的类,而无需修改已有的核心逻辑代码。解耦模块依赖减少不同模块之间的直接耦合。当前代码中可能存在多个模块直接相互引用或操作对方的数据结构,应通过定义清晰的接口和数据传递机制来解耦。例如,答题模块与判题模块之间,通过定义统一的答题数据格式和判题结果反馈格式,使它们之间仅通过这些接口进行交互,而不直接访问对方内部的数据或函数。
对于输入处理、答题逻辑处理、答案存储、输出排序等功能模块,明确各自的边界和职责,并通过合理的设计模式(如工厂模式、观察者模式等)来管理它们之间的依赖关系。例如,使用工厂模式创建不同类型的题目对象,根据题目类型动态生成对应的处理对象,避免在代码中大量使用 if - else 语句来判断题目类型并执行相应逻辑。
(2)、家居强电电路模拟第一次迭代:一、类设计优化完善父类方法定义仔细梳理子类共有的行为和属性,将其抽象提取到父类中作为通用方法和成员变量。例如,对于所有电器设备类(无论是日光灯、白炽灯还是吊扇),可能都有获取当前工作状态、设置初始状态等共性操作,这些方法应在父类 device 中统一定义,子类继承后可根据自身特性进行重写或扩展。这样可以提高代码的复用性,减少代码冗余,并且当有新的电器类型添加时,能够更方便地遵循已有框架进行开发。对于控制类(如 kongzhi 及其子类),也应明确其通用的控制逻辑和接口方法,如控制元件的初始化、状态切换以及与被控制设备的交互接口等,确保在不同类型的控制元件(开关、分档控制器、连续控制器)中具有一致的操作方式和数据传递机制。同时,对于控制类与被控制类之间的关系,应通过合理的接口设计来体现。例如,定义一个 Controllable 接口,被控制设备类实现该接口,而控制类通过该接口与被控制设备进行交互,这样可以降低类之间的耦合度,提高代码的灵活性和可扩展性。
(3)、对于并联电路中存在开关断开导致部分电路不通的情况,不仅要将该段串联电路的电流值设为 0,还要正确处理对整个并联电路和其他相关电路的影响,如重新计算总电阻、总电流以及其他支路的电流和电压分布,确保电路状态的一致性和准确性。优化电路状态更新与遍历算法,改进电路状态更新的算法,提高更新效率和准确性。在遍历电路中的设备时,采用更合理的遍历顺序和数据结构来减少不必要的计算和重复操作。例如,可以先遍历控制设备,获取其输出状态后再遍历被控制设备,根据控制设备的状态来更新被控制设备的状态,避免多次重复计算电路的连通性和电压传递。
五、总结:通过这三次的大作业我学习到了新的东西,在第一次大作业中,我对于类的实现有了更加深刻的理解,在类与类之间,我用了大量耦合导致迭代的时候需要耗费大量的精力去修改耦合相关部分的代码,我对于老师说的低内聚高耦合有了更加深刻的认识,同时这一次的大作业中的题型使用父类子类结构,让我第一次接触到了父类与子类,在答题判题程序第四次迭代中,新题型的引入暴露了代码结构的缺陷,违背了面向修改关闭原则且模块间耦合度过高,这使我意识到遵循设计原则如单一职责、开闭原则和解耦模块依赖的重要性,后续应通过合理的设计模式重构代码,清晰划分功能模块边界与职责,以提升代码可维护性与扩展性。家居强电模拟第一次迭代中我算是正式接触到了父类子类,在这过程中我们需要注意的是需要一整个判断电路是否处于连通的状态,作为我在大作业中首次深入运用继承知识的实践,暴露出诸多不足。因对继承不够熟练,父类方法定义残缺,未能充分提炼子类共有的行为和属性到父类中形成通用方法与成员变量。这不仅降低了代码的复用性,还增加了代码冗余,给后续开发新电器类型带来不便。同时,控制类与被控制类之间缺乏清晰合理的接口设计,致使类之间耦合度较高,影响代码的灵活性与可扩展性。家具强电模拟第二次迭代在第一次的基础上有了进一步拓展,增加了并联电路和新风扇子类。然而,此次迭代也呈现出不少问题,如并联电路与 device 关系处理不够巧妙,可引入组合模式并增加遍历方法加以优化;shuru 函数过于臃肿复杂,应将部分职责合理分配给其他类;部分代码在父子类间杂糅,违反面向修改关闭原则,建议将电路相关部分更精准地封装在类中。此外,对于并联电路中开关断开影响电路状态的情况,不能仅简单设置串联电路电流为 0,而应全面考虑对整个并联电路及其他相关电路的影响,重新精确计算总电阻、总电流以及各支路的电流和电压分布,确保电路状态的一致性与准确性。

浙公网安备 33010602011771号