OO题目集7~8总结
最后的两次题目集主要是对家具强电电路模拟程序的迭代设计,第7次题目集添加了电路元件互斥开关和窗帘,第8次则是添加了二极管元件,新的题目对于创新和思考能力以及思维逻辑能力要求更高了,主要是电路元件和电路系统的功能越来越复杂,比较难用代码体现一个完整的电路系统,接下来我将对这两次题目集进行具体分析。
两次题目集实现
题目集7
题目集7在题目集6的基础上增加了电路元件互斥开关和窗帘,窗帘这个电路元件很好实现,通过计算整个电路系统中的总光照就可以算出窗帘的开闭程度,设计一个受控窗帘(ControlledCurtain)类,有属性openRatio为窗帘的开合比例以及totalLux为所有灯光的光照强度总和,当然窗帘也有电阻为15欧,把窗帘看出一个受控元件就行了,但是要注意的是窗帘本身的电压(电压低于50V时,窗帘默认为全开状态),按照这个思路就很好实现受控窗帘这个电路元件。对于我来说,这次题目集的难点就是互斥开关的实现,一开始我理解错了题目,以为互斥开关是存在一条电路中的,和开关一样,只不过有电阻罢了,然而并不是这样,因为老师的意思是互斥开关是跟两条电路有关的,输入样例中#T1:[IN H1-1] [H1-2 D2-1] [D2-2 OUT] #T2:[IN H1-1] [H1-3 D1-1] [D1-2 OUT]中,虽然是两条电路,但两条电路前面那段是一样的,是同一个互斥开关,互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。互斥开关的默认状态为1、2引脚接通,1、3引脚断开。互斥开关可以也可以反过来接入电路,即汇总引脚接往接地端,两个分支引脚接往电源端。为避免短路,互斥开关设置了限流电阻,12引脚之间默认电阻为5,13引脚之间默认电阻为10。理解了之后我卡住了,因为我是读取一行的内容作为一条串联电路,而两条电路的前一段相同,在读取输入的代码就要改一改了。思考了之后,首先我添加了函数deviceExists用来判断电路中是否已经存在与该电路元件同名的电路元件,并将这个函数放在我将电路元件存入列表的函数中,这样一来,我在获取输入中的电路元件名称时还是一样获取,而接下来就是要判断哪两条电路是通过互斥开关联系起来的,这里我只是写了一串代码判断两条电路前一段或后一段的输入信息是否相同,虽然我知道这样很草率,但我实在想不出别的更好的方法了,按照这样的思路我先是把样例那几个测试点过了,之后也零碎的过了几个测试点,但我也不知道我的代码哪里出问题了,单串联电路-含互斥开关的测试点我一个都没过,之后我按照我的理解改了改,没想到之前过的测试点也过不了了,当时也是比较难受,为什么别人都是改了改代码就过了一大片,之后再找那几个特殊的样例就行了,而我写了很长的代码却只能过零碎的几个,我按照我的想法设计了几个单串联电路含互斥开关的样例,输出了正确的答案,却还是过不了那几个测试点,反而之前能过的还少了几个,看了我的代码许久,也找不到哪里能改的地方,直达答题时间结束我也没找出来,于是我就决定重新写一份代码,因为下一次迭代要用到引脚电压,而我之前的代码都没有考虑这个,所以我干脆就重新写了,以下是我觉得这道题的难点及需要注意的地方:
互斥开关
互斥开关是一种具有三个引脚的控制设备,包括一个汇总引脚和两个分支引脚。其主要特点和难点包括:
- 状态切换:互斥开关有两种状态,可以接通2号引脚或3号引脚,但不能同时接通。这意味着每次只能激活其中一个分支,另一个分支则处于断开状态。
- 引脚功能:汇总引脚可以是输入也可以是输出,而分支引脚的功能取决于汇总引脚的状态。这种双向性增加了电路设计的复杂性。
- 默认状态:互斥开关有默认状态,即1号引脚和2号引脚接通。在模拟程序中,需要正确处理这种默认状态。
- 电阻设置:互斥开关设置了限流电阻,以避免短路。12引脚之间默认电阻为5,13引脚之间默认电阻为10。在计算电流和电压时,需要考虑这些电阻值。
- 反向接入:互斥开关可以反向接入电路,即汇总引脚接地,分支引脚接电源。这要求模拟程序能够处理这种特殊情况。
受控窗帘
受控窗帘是一种受室内灯光光照强度控制的设备。其主要特点和难点包括:
- 工作电压:窗帘的最低工作电压为50V。只有当电压达到或超过这个值时,窗帘才能正常工作。
- 光照强度控制:窗帘的开合比例由电路中所有灯光的光照强度总和决定。这要求模拟程序能够计算光照强度,并根据其值来调整窗帘的开合状态。
- 多种开合比例:窗帘的开合比例有多个级别,从全开到全闭,这需要模拟程序能够根据光照强度的精确值来确定窗帘的具体开合比例。
- 无灯或全灭情况:如果电路中没有灯或所有灯都关闭,窗帘默认为全开状态。模拟程序需要处理这种情况。
- 电阻值:窗帘具有一定的电阻值(15),在电路模拟中需要考虑这一点。
- 电压与光照强度的关系:需要建立电压与光照强度之间的映射关系,并根据这个关系来控制窗帘的开合。
题目集8
题目集8又开始上难度了,和题目集7相比增加了挺多东西,主要是输入输出内容上的,增加了电路元件二极管,二极管这个东西我了解不多,只知道它具有单向导电性,这是二极管最基本的特性,它允许电流只能沿一个方向流动。当二极管正向偏置时(即正极连接到高电位,负极连接到低电位),二极管导通;当反向偏置时,二极管截止。另外增加了电流限制:电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。以及短路检测:如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”。还有并联电路中包含并联:构成并联电路的串联电路可以包含别的并联电路。这样一来就要考虑很多种情况了,且要用到电路元件的两端电压,之前并没有考虑到两端电压是不一样,所以这次题目我要改的地方就多了,于是我干脆重新写了一份,这次我优化了许多东西,我直接删去了电路类(Ciucuit),将串联电路和并联电路作为Device类的子类,以及将受控设备和控制设备合并到一个列表里,这样修改之后代码简洁了不少,也删去了很多无用的代码,不至于有时候看不懂,然后再Device类中添加引脚电压和最大电流的属性,以及判断是否超过最大电流的函数,还包括了短路检测,主要是二极管的存在让这个题目多了很多种情况,我设计了二极管类(Diode),以及boolean isConductive来表示二极管的导通状态,还有函数checkConductivity,通过正向导通电压阈值来设置二极管的导通状态,并模拟电流通过二极管时的行为,如果二极管导通,电流可以通过,如果二极管截止,电流为0,之后慢慢分析所有可能的情况并加以实现。以下是我觉得这道题的难点及需要注意的地方:
-
二极管的导通与截止逻辑:
- 需要精确模拟二极管的单向导电性,确保电流只能沿允许的方向流动。这涉及到电压比较和二极管状态的更新。
-
电流限制的实现:
- 必须为每个元器件设定最大电流限制,并在电流计算时检查是否超出此限制,如果超出,需要给出相应的错误提示。
-
短路检测:
- 需要实时监控电路中的电流,一旦检测到由于短路引起的电流无限增大,立即终止程序并给出错误提示。
-
并联电路中包含并联的逻辑处理:
- 电路结构可能变得更加复杂,需要正确处理嵌套的并联电路,确保电路连接和电流分配的逻辑正确无误。
-
管脚电压的准确计算和显示:
- 需要根据电路的拓扑结构和元器件的特性,准确计算每个管脚的电压,并按照规定的格式输出。
-
复杂的电路拓扑结构:
- 电路中可能存在多个串联和并联电路的组合,需要合理组织数据结构,以便于模拟复杂的电路连接。
-
输入信息的解析:
- 输入信息可能包含复杂的电路描述,需要准确解析并构建相应的电路模型。
-
电压和电流的计算精度:
- 根据题目要求,所有计算应使用
double
类型以避免精度损失,并在最终输出时采用截尾规则处理小数。
- 根据题目要求,所有计算应使用
-
异常情况的处理:
- 需要考虑各种异常情况,如短路、超出电流限制等,并确保程序能够妥善处理这些情况。
-
程序的健壮性和错误处理:
- 程序应能够处理各种不合理或异常的输入情况,不因错误输入而崩溃。
-
模块化设计:
- 程序设计应遵循模块化原则,将不同的功能划分为独立的模块,便于开发和维护。
-
测试覆盖:
- 需要进行全面的测试,包括单元测试和集成测试,确保所有功能按预期工作,特别是新增加的功能。
总结作业
1.分析和总结
参考第一部分的内容。
2.设计检查
题目集7
题目集8
3.心得体会
在这两次作业中我主要学习到了:1.封装:将数据和方法结合在一起,并对外界隐藏内部细节。2.多态:通过重载和重写实现多态性。3.接口:使用interface
定义共享的行为协议。4.异常处理:使用try
, catch
, finally
, throw
, throws
来处理程序中的异常情况。5.集合框架:使用List
, Set
, Map
等集合类存储和管理数据。
但是,我还有许多地方有待进步,比如测试环节。设计模式也需要抓紧时间学习。
标签:OO,总结,题目,引脚,开关,互斥,电路,窗帘 From: https://www.cnblogs.com/Yyr114/p/18276874