第二次blog作业
一、前言:
1.知识点总结
先看主要新增内容:
(1)输入选择题题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
新增约束:标准答案中如果包含多个正确答案(多选题),正确答案之间用英文空格分隔。
输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。
多选题给分方式:
答案包含所有正确答案且不含错误答案给满分;包含一个错误答案或完全没有答案给0分;包含部分正确答案且不含错误答案给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
(2)输入填空题题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。
填空题给分方式:
答案与标准答案内容完全匹配给满分,包含一个错误字符或完全没有答案给0分,包含部分正确答案且不含错误字符给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
(3)输出顺序变化
只要是正确格式的信息,可以以任意的先后顺序输入各类不同的信息。比如试卷可以出现在题目之前,删除题目的信息可以出现在题目之前等。
(4)多张试卷信息
本题考虑多个同学有多张不同试卷的答卷的情况。输出顺序优先级为学号、试卷号,按从小到大的顺序先按学号排序,再按试卷号。
根据新增内容,首先,要解决单选题,多选题和填空题的问题我们可以用继承方面的知识,为它们定义同一个父类题目类,并在父类中定义一个判题方法,根据子类各自的判题方式重写它,实现多态。
然后是乱序输入问题我们可以先将所有数据读入进一个arraylist中,然后根据需求,先读哪些信息,避免出现题目还未被创建就删除或者加到试卷中了。
然后就是输出顺序,可以利用implements Comparable接口实现排序。
2.题量方面
答题判题程序4是在3的基础上迭代的,这次题量并不多,主要是为了让我们理解继承和多态方面的知识并熟练使用它。
3.难度情况
难
家居强电电路模拟程序1
1.知识点总结
先看题目主要内容:
控制设备模拟
本题模拟的控制设备包括:开关、分档调速器、连续调速器。
受控设备模拟
本题模拟的受控设备包括:灯、风扇。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。
输入信息:
设备信息
连接信息
控制设备调节信息
电源接地标识:VCC,电压220V,GND,电压0V。没有接线的引脚默认接地,电压为0V。
输出信息:
按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。
知识点主要有
(1)大量使用了继承方面的知识,所有家具和控制器都继承自同一个父类Element元件类,这样便于后面的连接和通电处理过程
2.题量方面
由于是第一次迭代,代码量并不多,最多500行
3.难度情况
难
家居强电电路模拟程序2
1.知识点总结
新增内容方面:
(1)串联电路信息
一条串联电路占一行,串联电路由按从靠电源端到接地端顺序依次输入的 n 个连接 信息组成,连接信息之间用英文空格" "分隔。
串联电路信息格式:
"#T"+电路编号+":"+连接信息+" "+连接信息+...+" "+连接信息
例如:#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT] 一个串联电路的第一个引脚是 IN,代表起始端,靠电源。最后一个引脚是 OUT,代表结尾端, 靠接地。
约束条件:
不同的串联电路信息编号不同。
输入的最后一条电路信息必定是总电路信息,总电路信息的起始引脚是 VCC,结束引脚是 GND。
连接信息中的引脚可能是一条串联或并联电路的 IN 或者 OUT。例如:
T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT OUT]
T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT M2-IN] [M2-OUT OUT]
(2)并联电路信息
一条并联电路占一行,并联电路由其包含的几条串联电路组成,串联电路标识之间用英文空格" "分隔。
格式:
"#M"+电路编号+":"+”[”+串联电路信息+" "+....+" "+串联电路信息+”]”
例如:#M1:[T1 T2 T3]
该例声明了一个并联电路,由 T1、T2、T3 三条串联电路并联而成,三条串联电路的 IN 短 接在一起构成 M1 的 IN,三条串联电路的 OUT 短接在一起构成 M1 的 OUT。
(3)落地扇
工作电压区间为 [80V,150V],对应转速区间为 80-360 转/分钟。电压在[80,100)V 区间对应转速为 80 转/分 钟,[100-120)V 区间对应转速为 160 转/分钟,[120-140)V 区间对应转速为 260 转/分钟,超过 140V 转速 为 360 转/分钟(本次迭代暂不考虑电压超标的异常情况)
知识点相比于上次没有太大变化,主要是难在并联电路和串联电路的处理方面。
2.题量方面
代码行数明显增多,所需时间比之前多5个小时
3.难度情况
难
二、设计与分析:
答题判题程序4:
家居强电电路模拟程序1:
设计概述
输入处理:
程序首先通过标准输入接收一系列命令,这些命令用于构建电路连接和控制指令。
输入命令分为三类:电路连接描述(以方括号 [ 开头)、控制命令(以井号 # 开头)和结束命令(end)。
电路连接描述用于创建电器对象并建立它们之间的连接关系。
控制命令用于调整特定电器的工作状态或参数。
电器对象管理:
使用 HashMap 存储电器对象,键是电器的标识符,值是对应的电器对象。
根据输入的电路连接描述,创建相应的电器对象并存储到 HashMap 中。
控制逻辑:
对于每个控制命令,根据电器类型调用相应的方法来改变其状态或参数。
例如,对于开关(K),根据命令改变其开闭状态;对于分档(F),根据命令增加或减少档位。
电压计算与传递:
根据控制命令调整后的状态,重新计算各电器的电压值。
电压值从电源(VCC)开始,经过各个电器传递到最后的接地(GND)。
输出结果:
最后,根据电器类型对所有电器进行排序,并输出每种电器的状态。
代码分析
输入处理:
使用 Scanner 类读取用户输入,通过正则表达式解析不同类型的命令。
对于电路连接描述,提取其中的电器标识符和连接信息,存储到 ArrayList 中。
对于控制命令,提取具体的控制信息,存储到另一个 ArrayList 中。
电器对象创建:
使用 complain 方法根据电路连接描述创建电器对象,并将其存储到 HashMap 中。
这个方法根据电器类型创建相应的对象,并初始化其属性。
控制逻辑执行:
遍历控制命令列表,根据命令类型调用相应的电器方法。
对于开关(K),改变其开闭状态并更新电压。
对于分档(F),根据命令增加或减少档位,并更新电压。
对于连续调节(L),设置其线性值并更新电压。
电压计算与传递:
通过遍历电器对象,根据其类型和状态计算最终的电压值。
特别地,如果所有开关都处于关闭状态,则整个电路的电压为零。
输出结果:
将所有电器对象放入 ArrayList 中,并使用自定义的比较器进行排序。
比较器首先按电器类型排序,然后按标识符排序。
最后,调用每个电器对象的 display 方法输出其状态。
家居强电电路模拟程序2:
- 总体设计
数据结构
ArrayList: 用于存储输入的电路配置信息。
Map<String, Map<String, Electric>>: 用于存储并联电路的信息。
Map<String, Electric>: 用于存储主电路的信息。
ArrayList: 用于存储最终排序后的电器设备列表。
类设计
Electric: 抽象基类,定义了电器设备的基本属性和方法。
Kaiguan, Fendang, Lianxu, Baichi, Riguang, Diaoshan, Luodi, Bi, Chuan: 继承自Electric的具体电器设备类,每个类实现了特定的电器功能。 - 主要功能模块
输入处理
读取输入:
使用Scanner从标准输入读取电路配置信息。
根据不同的前缀(如#T, #M, #K, #F, #L)将输入解析为相应的电路配置信息。
电路配置
complain方法:
根据输入字符串创建相应的电器设备对象,并将其添加到电路配置中。
每个电器设备的电阻值根据其类型初始化。
电路计算
计算并联电路的总电阻:
遍历并联电路中的每个电器设备,计算总电阻。
如果电路中有开关打开,则总电阻设为-1。
如果所有开关都关闭,则总电阻为0。
计算主电路的总电阻:
遍历主电路中的每个电器设备,计算总电阻。
如果电路中有开关打开,则总电阻设为0。
计算电压分配:
根据总电阻计算串联和并联电路的电压分配。
电器设备状态更新
更新电器设备的电压:
根据计算出的电压分配,更新每个电器设备的电压。
特别处理开关的状态,如果开关打开则电压设为0。
输出结果
排序和显示:
将所有电器设备按特定规则排序(先按类型,再按ID)。
使用display方法输出每个电器设备的详细信息。 - 代码分析
优点
模块化设计:
通过继承和多态性,将不同类型的电器设备抽象为同一个基类,提高了代码的可扩展性和可维护性。
清晰的逻辑:
电路配置和计算逻辑清晰,易于理解和维护。
灵活的输入处理:
支持多种类型的输入,能够灵活地配置电路。
改进点
异常处理:
当前代码没有处理输入格式错误的情况,可以在读取输入时增加异常处理,确保程序的健壮性。
性能优化:
在处理大量电器设备时,可以考虑使用更高效的数据结构和算法来优化性能。
代码复用:
有些重复的代码块(如更新电压的部分)可以提取为单独的方法,提高代码的复用性。
单元测试:
增加单元测试,确保每个模块的功能正确无误。
三、采坑心得:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空
家居强电电路模拟程序1:没设计好类的成员变量和成员方法、父类的抽象方法,导致在主函数调用方法是容易出问题。
家居强电电路模拟程序2:并联电路的短路情况没有考虑到,电阻计算的方法没选好
四、改进建议:
家居强电电路模拟程序1
电路连接的方法太过麻烦,后续不好处理也不好改进,所以需要换别的方法,然后就是读取信息的方式太麻烦,代码行数太多
家居强电电路模拟程序2
大部分结构以及完善,但信息读取所用代码还是太长了,需要优化
五、总结:
在Java中,继承和抽象方法是面向对象编程的关键特性,它们提供了代码重用性、灵活性和结构化设计的多种优势。继承允许子类从父类继承属性和方法,减少了代码重复,提高了开发效率。同时,继承还支持多态性,使子类对象可以被视为父类类型,增强了程序的灵活性。此外,继承帮助建立清晰的对象层次结构,使得程序结构更加清晰,易于理解和维护。另一方面,抽象方法通过定义标准接口,要求所有子类都必须实现这些方法,确保了子类的一致性和完整性。抽象方法允许父类专注于定义公共行为和属性,而具体的实现细节则由子类根据自身需求来完成,这样不仅提高了代码的可读性和可维护性,还避免了代码冗余。总的来说,合理利用继承和抽象方法可以使Java程序更加高效、灵活且易于维护。