答题判题程序4 及 家居强电电路模拟程序1-2 PTA大作业 第二次总结blog
**前言**
PTA大作业4-6分为两部分,大作业4是对上一部分答题判题程序程序的迭代,加入了多选,填空等题型的判断;大作业5,6则是新的家居强电电路模拟程序。除此外,在第5次大作业中,还涉及到了Java迭代器的使用。
**设计与分析**
题目大致信息如下:
7-4 答题判题程序-4
分数 87
作者 蔡轲
单位 南昌航空大学
设计实现答题程序,模拟一个小型的测试,要求输入题目信息、试卷信息、答题信息、学生信息、删除题目信息,根据输入题目信息中的标准答案判断答题的结果。本题在答题判题程序-3基础上新增的内容统一附加在输出格式说明之后,用粗体标明。
本次作业新增内容:
1、输入选择题题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
格式:"#Z:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式基本的约束与一般的题目输入信息一致。
新增约束:标准答案中如果包含多个正确答案(多选题),正确答案之间用英文空格分隔。
多选题输出:
输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。
多选题给分方式:
答案包含所有正确答案且不含错误答案给满分;包含一个错误答案或完全没有答案给0分;包含部分正确答案且不含错误答案给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
2、输入填空题题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
格式:"#K:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式基本的约束与一般的题目输入信息一致。
输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。
填空题给分方式:
答案与标准答案内容完全匹配给满分,包含一个错误字符或完全没有答案给0分,包含部分正确答案且不含错误字符给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
3、输出顺序变化
只要是正确格式的信息,可以以任意的先后顺序输入各类不同的信息。比如试卷可以出现在题目之前,删除题目的信息可以出现在题目之前等。
4、多张试卷信息
本题考虑多个同学有多张不同试卷的答卷的情况。输出顺序优先级为学号、试卷号,按从小到大的顺序先按学号排序,再按试卷号。
大作业4中增加了填空题,多选题等的答题判题种类,难度相较于前几次又有了进一步的提升,尤其是填空题答案的判断,并不是简单比较标准答案与输入的答案字符串是否相同即可,需要对字符串进行进一步的处理才可以。
设计类图如下:
大作业4的设计思路与前几次相同,在读入所有信息后分类封装,依次添加,全部完成后执行删除命令;随后为试卷,答卷排序,依次遍历判题。
与上一次的区别是,这次的判题涉及三种方式,仍然放在控制类中进行判断多有不便。由于判断方法不同,因此本次大作业中,我还新增了一判断类,用来专门判断题目类型,调用特定类的判题方法。判断类需要一个题目类作为参数,在判断过程中,使用instanceof判断题目属于哪一特定类,并调用该特定类的特有判题方法,返回对应的结果。
大作业4中因为有了多种题型的判断,所以使用继承和多态的方法,将单选,多选,填空题类都继承自一个题目类,实现了不同题目不同判断方法。
大作业5为新的家居强电电路模拟程序,涉及到多种用电器和多种控制类设备,对于继承和多态的使用有了更进一步的要求
设计类图如下:
在大作业5中,由于该简单的电路系统只包含一个控制设备和一个用电器。由于这个系统相对简单,只包含了一个控制点和一个被控设备,我们可以采用一种直接而有效的方法来计算和分配电能,即计算节点的方式。
在这个简化的系统中,我们不需要复杂的电网模型或分布式计算,而是可以通过直接计算节点电压的方式来模拟电能的分配。节点电压是指在电路中某个特定点(即节点)的电位差,通常用来描述电路中电压的分布情况。
具体来说,我们可以设定一个电源节点和一个用电器节点,并且电源节点有一个已知的电压值。然后,我们通过计算或模拟的方式,确定这两个节点之间的电压差,即用电器两端节点的电压。这个电压值将直接反映到用电器的状态上,比如电压达到一定值后,用电器开始工作;电压降低后,用电器可能降低功率或停止工作。
通过这种简单而直接的方式,我们可以模拟出一个包含控制类和用电器的简单电力系统,并通过计算节点电压的方式来模拟电能的分配和用电器的状态变化。
设计思路也非常简单,直接依次读取节点,分析后设置控制类和用电器类,并为其设置引脚所在节点编号。待到全部节点解析完成后,读取控制信息,为控制类设置状态,并按照控制状态控制用电器状态即可。
大作业6中增加了并联电路,使得之前的节点设计已经不再适用,对于新的大作业,我引入一个新的线路类协助计算。
设计类图如下:
大作业6的设计思路比较复杂。首先依旧是读取全部字符串后分析并分类至串联,并联,控制信息。随后,先按照控制信息调控所有控制类,再依次按照线路信息,读取控制器状态,为用电器分配电压。
在大作业6中,分配电压是问题的关键,为此引入了串联线路类和并联线路类,再在线路类当中利用节点的方法获取线路内的控制器和用电器;同时,还为线路类定义了电阻属性,方便记录该线路中所有用电器的电阻之和。并联电路的电阻直接简单相加即可,并联电路的电阻则使用公式 (1/R总=1/R1+1/R2+……+1/Rn) 计算。待全部电阻计算完毕后,再分配电压,首先为总串联线路中各用电器分配电压,并联电路亦视作用电器分配相应电压;随后为并联电路内各串联线路分配相同的电压,随后再依照串联电路分配电压的方法依次遍历线路中的所有用电器,计算串联电路中的用电器的电压。最后输出各控制器和用电器状态即可。
**踩坑心得**
大作业4的测试点大多都比较正常,简单提交并修改后便通过了大部分测试点,然而却有两个测试点一直过不了,一个显示答案错误,另一个则是格式错误。
经过测试后发现,第一个测试点由于涵盖无效题目,有效删除和答案不存在,应该输出优先级最高的“answer is null”才正确;而最后一个测试点则是在填空题当中含有前后空格,应当在输出时不予删除,但在判题时予以删除,因而导致的格式错误,最终修改后通过。
大作业5由于是新类型第一次作业,较为简单,在编写完成提交后便通过了大部分测试点,只有一个通过不了:
经过分析可以发现,这个测试点为开关在后的情况,在该情况下,由于用电器一号引脚接220V,二号引脚接开关,而开关关闭,为0V,致使电路不通但按照前后引脚计算导致用电器工作,简单修改,加入电路是否为通路的判断语句即可通过。
作业6在前一次的基础上加入了并联电路的情况,使得情况变得更加复杂,首次提交后出现了大量的测试点无法通过的情况。但实际上本次测试点较为简单,测试点不过是因为新加入的落地扇类是复制粘贴的风扇类,然后再做修改,导致输出部分忘记修改导致的。修改后只剩下部分测试点出现非零返回。
检查后发现是在检查字符串的时候由于数组越界导致的,由于在循环中使用了j+1作为数组的参数,导致只限定j < xxnumber的方式不正确,在循环条件中加上减一即可。
**改进建议**
1.大作业5,6是全新的题目类型,其大量涉及到继承和多态的应用,而我对于这方面的使用还不熟练,致使代码中含有大量冗杂的部分,不便于后续修改。后续应当合理地设计类结构,有效地利用这些特性来简化代码、提高代码的可读性和可维护性。减少我的代码中充满了冗杂的部分,方便阅读,更难以进行后续的修改和扩展。
2.由于每次的大作业都需要加以修改,因此有部分的代码可能原先有用,而修改后该方法可能不再被使用或者方法被修改后不再适用原来的用法,会导致思路突然的中断。当这种情况发生时,原先精心设计的类结构、实现的方法可能在新的需求下变得冗余或过时。这种突然的变化不仅会影响我们的编写效率,还可能导致代码质量的下降,增加维护成本。为了应对这种情况,我需要培养良好的代码管理和重构习惯。保持代码的模块化设计,确保每个模块都有清晰的职责和边界。这样,在需要修改或删除某个功能时,我们可以只关注相关模块,减少对其他部分的影响。
3.名称大多含义重复,命名冗长,不方便分辨。新的电路内有大量序号,比如电路序号、用电器编号、引脚编号等,这些数字在命名时为了方便分辨,我采用了较长的前缀,这样虽然方便理解含义,但在查看代码时往往会被过长的名称干扰注意力,不方便后续的修改。今后的代码设计中,我应该多使用专业的名词作为变量的名称,减少过长前缀的使用。
**总结**
在完成大作业4、5、6的过程中,我经历了一系列编程挑战。这三个大作业不仅检验了我对课程知识的理解和掌握,也锻炼了我的逻辑思维、问题分析和编程实践能力。在最近完成的大作业5和6中,我遇到了关于继承和多态应用的挑战,这两大题目类型对我而言是全新的,因此我在实现过程中遇到了不少困难。特别是由于我对继承和多态的使用不够熟练,导致代码中出现了大量的冗杂部分,这不仅降低了代码的可读性,也增加了后续修改和扩展的难度。
大作业5引入了新类型的题目,要求我运用面向对象编程的思想进行设计。这对我来说是一个全新的挑战,但也是我成长的一个重要机会。通过设计合理的类结构和继承关系,我逐渐掌握了面向对象编程的精髓。同时,我也学会了如何根据题目要求调整类的属性和方法,以实现正确的功能。在解决开关在后情况下的测试点时,我更加深入地理解了电路的逻辑和编程的灵活性。
大作业6在前两次作业的基础上增加了并联电路的情况,使得题目变得更加复杂和具有挑战性。这次作业不仅要求我掌握更多的编程知识,还要求我具备更强的逻辑思维和问题分析能力。在解决测试点无法通过的问题时,我发现了自己在字符串处理和数组操作方面的不足,并通过查阅资料和请教他人找到了解决方案。这次经历让我更加明白编程是一门需要不断学习和探索的学科。
通过完成这三个大作业,我不仅提高了自己的编程能力,还培养了良好的编程习惯和解决问题的思维方式。我学会了如何分析问题、设计解决方案、编写代码和测试程序。同时,我也明白了编程的严谨性和精确性对于解决问题的重要性。在未来的学习和工作中,我将继续运用这些经验和技能,不断提升自己的编程水平和解决问题的能力。
综上所述,通过大作业5和6的实践,我深刻认识到了自己在面向对象编程和代码管理方面的不足。为了改进这些问题,我将加强相关知识的学习和实践,并努力培养良好的编程习惯。我相信,在不断的努力和实践中,我能够不断提高自己的编程能力,写出更加优秀、高效的代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~