NCHU PTA7~8次题目集总结
PTA 7~8次题目集总结
1. 前言
2. 设计与分析
3. 踩坑心得
4. 改进建议
5. 总结
(1)前言
第七次大作业:
第七次大作业相比之前的几次作业,主要是增加了线路上多并联的条件,以及在线路上添加了互斥开关设备和窗帘设备,考察的知识点还是:类的继承,接口,排序,正则表达式等。这次大作业我认为主要的难点是互斥开关,多并联路在之前代码的设置上其实已经有铺垫,只需修改好线路处理类并添加一些补充的方法。但是互斥开关我似乎没有处理妥当,主要问题是:在接收两条条含同一个互斥开关的串联线路时,是把其当作两个器件来处理放在我的ArrayList<Device> devices
中,还是独立处理当作一个器件处理?以及互斥开关所在的位置(在串联线路开头,结尾,中间)和引脚(2号引脚和3号引脚)怎么处理恰当?总体来说我认为此次大作业是属于中等难度,且对设计的考虑要求更加高了,可能也是因为我考虑不完善的原因,代码编写大概比上次多了100多行,总体用了870行代码,只拿到了及格左右的分数。
第八次大作业:
第八次大作业也是最后一次迭代,添加了新的器件:二极管,输出信息内容增加了:在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压,以及若电流超出每个电器额定最大电流时输出提示:“exceeding current limit error”(例如:@B1:190 68-17 exceeding current limit error);如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”;最后电路还增加了考虑并联电路中嵌套并联电路。总体上考察的知识点还是:类的继承,接口,排序,正则表达式等。由于这里考虑到了每个设备的引脚的关系,而这正是我前三次迭代没有添加的属性,导致我输出设备两个引脚电压十分困难。处于各种个人原因,我认为这次大作业是偏难的。
(2)设计与分析
第七次大作业:
第七次大作业基于前一次大作业的基础上,我添加了几个类:互斥开关类(HSwitch
),灯泡类(Light
)以及窗帘类(Curtain
),我还修改了处理类(process
)以及线路处理类(lineprocess
)中的多个方法。多个并联如(#T3:[VCC K2-1] [K2-2 M1-IN] [M1-OUT M2-IN] [M2-OUT GND])只要把每个并联电路当作一个设备器件单位,然后只把所有线路浓缩在主线路上,结果就是一条简单的串联电路。大体思路上仍是把所有的线路都放在一个线路的ArrayList的集合中,再对每个线路添加题目中存在的设备,随后进行操作处理(actionprocess
方法),最后总体输出每个设备的状态---结束!Light类的添加是为了更好统一所有线路的总光照强度这一属性以便对窗帘这个新添加的内容进行处理。
再来谈谈困扰我很久的内容---互斥开关。它的属性以及方法如下图
如图显示,我设计的互斥开关在属性上有两条线路(当然这两条线路也可以其中一条是空的,即当作一个有电阻的普通开关来处理),还有一个isOn属性(引脚12连接为True,引脚13连接则为false,默认为12连接),互斥开关12引脚连接时电阻为5,13引脚连接时电阻为10,我这里电阻默认为5。还有一个用于操作信息的turnswitch方法,目的是改变isOn的状态,互斥开关的电阻大小以及两条线路的连通状态,具体如下:
public void turnswitch(){
if(this.isOn){
this.isOn=false;
this.R=10.0;
line1.setVaild(false);
line2.setVaild(true);
}
else if(!this.isOn){
this.isOn=true;
this.R=5.0;
line1.setVaild(true);
line2.setVaild(false);
}
}
但是我忽略了一个很重要的一点,因为我在处理单个线路信息的时候,当接收到互斥开关时,我会在创建一个互斥开关单位后对其属性中的Line1或Line2(取决于引脚是2还是3)放入一个Line值(本身是两个原来都是空值),所以当我在处理两条有共同一个互斥开关的串联线路时,实际上我创造了两个同名的互斥开关单位,但是这两个单位都各自缺少了一条线(各自缺少的线是互补的),导致后面对操作信息处理的时候只会处理一个没有完整两条线路属性的互斥开关,所有和转向互斥开关(#H)有关的情况都无法实现,随后我在短暂的时间里尝试打补丁,但是还是无力回天,
值得一提的是第七次大作业的平均圈复杂度得到了很好的控制,只有2.37(如下SourceMontor报表所示),也许是基于前一次代码设计合理的原因。
以下是第七次大作业代码的idea自动生成类图和SourceMontor的生成报表内容:
第八次大作业:
第八次大作业要考虑设计并联电路嵌套的问题,还要考虑前引脚和后面引脚的电压输出,这里我认为可以通过检索整体字符串来考虑1号和2号引脚。通过新建一个引脚类,来考虑每个电器设备信息的输入和输出引脚,从而确定各自的分电压和方向(这个主要针对二极管)。
(3)踩坑心得
和前一次大作业一样,踩得坑都是在类与类的设计上面。比如对HSwitch(互斥开关)的设计,我自以为自己设计两条线路作为其中的属性是没问题的,实则不然,对输入信息的处理以及后续的一切信息处理是没有考虑好的,有时候这么设计其实是更复杂的。我们一定要在考虑一个类的时候先进行一些测试点的测试,再通过反馈给我们的内容进行修改。而不是闷头敲代码,一味的倔强下去其实是懒惰思考的表现。如果我们要考虑完善,一定要付诸行动,而不是继续在原来其实有很多bug的代码的基础上继续设计下去。
(4)改进建议
如果可以我觉得我有必要从一开始就在设备类里奠定好引脚的属性。其次是对互斥开关的设计,应该考虑如何合并两个互斥开关的Line1和Line2属性并删除其中一个互斥开关(或者直接不考虑互斥开关中两条Line的性质),随后是如何考虑并联电路的嵌套,这些都是值得改进和修复的信息和内容。
(5)总结
学到了什么:1.一定一定要在类与类的设计前谨慎思考,要考虑全面和完善,不可急于求成。
2.要对字符串信息内容处理要灵活,不能死板,多运用String提供的一些方法以及灵活运用强大的正则表达式。
3.通过这么多次的大作业设计和迭代,我不仅增强了自己对java语言三大特性:封装,继承,多态的理解和运用,还掌握了java的单一职责原则,依赖倒置原则和开闭原则等,对我以后编程的学习有很大帮助。
4.路漫漫其修远兮,吾将上下而求索,编程之路还需不断的努力和坚持!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)