目录:
一)前言
二)设计与分析
三)踩坑心得
四)改进建议
五)总结
(2)家居强电电路模拟程序-3:
【1】知识点:ArrayList的运用,物理知识的运用。
【2】题量:较大
【3】难度:较难
在家居强电电路模拟程序的迭代中引出较难的互斥开关
(3)家居强电电路模拟程序-4:
【1】知识点:对象类型转换,继承与多态,物理知识的运用。
【2】题量:多
【3】难度:困难
家居强电电路模拟程序的最终版本,需要模拟复杂的电路情况,题目很难,但值得思考
二.设计与分析
家居强电电路模拟程序-3:
(1)类的设计思路图
(2)设计具体思路:
1.字符串录入:先创建一个String类的数组,用于储存输入的所有字符串,直到输入的字符串为"end"为止。以这个String类数组中的字符串为基础,进行处理。
2.对象的创建:分别创建一条总Device类(原件)、Circuit类(串联电路),Mcircuit类(并联电路),HControl类(互斥开关)ArrayList。
3.各类对象的实例化:根据charAt(1)(字符串第二个字符)对步骤1中所实例化的字符串数组进行分类操作:
【1】charAt(1)为'T'且i<字符串的个数:截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Circuit类对象,创建一个Device类的ArrayList(该ArrayList是该Device类对象的一个属性)。并将该Circuit对象添加进Circuit类ArrayList中去。
(1)charAt(1)为'K':则该字符串用于添加一个Switch类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Switch类对象,并加入到Device类的ArrayList中去。
(2)charAt(1)为'F':则该字符串用于添加一个FControl类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个FControl类对象,并加入到Device类的ArrayList中去。
(3)charAt(1)为'L':则该字符串用于添加一个LControl类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个LControl类对象,并加入到Device类的ArrayList中去。
(4)charAt(1)为'B':则该字符串用于添加一个BLight类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个BLight类对象,并加入到Device类的ArrayList中去。
(5)charAt(1)为'R':则该字符串用于添加一个RLight类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个RLight类对象,并加入到Device类的ArrayList中去。
(6)charAt(1)为'D':则该字符串用于添加一个Fan类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Fan类对象,并加入到Device类的ArrayList中去。
(7)charAt(1)为'A':则该字符串用于添加一个AFan类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个AFan类对象,并加入到Device类的ArrayList中去。
(8)charAt(1)为'H':则该字符串用于添加一个HControl类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Hcontrol类对象,并加入到Device类的ArrayList中去。(在添加前要判断hcontrol的number值是否与HControl类的ArrayList里某个array的number相等,如果相等则是把这个array添加进Device类ArrayList中去,反之则是添加这个hcontrol对象,并将这个hcontrol添加到Hcontrol类ArrayList中去)
(9)charAt(1)为'S':则该字符串用于添加一个Scurtain类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Scurtain类对象,并加入到Device类的ArrayList中去。
(10)charAt(1)为'T':则该字符串用于添加一个Circuit类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个AFan类对象,并加入到Device类的ArrayList中去。(在添加前要判断circuit的number值是否与Circuit类的ArrayList里某个array的number相等,如果相等则是把这个array添加进Device类ArrayList中去,反之则是添加这个circuit对象,并将这个circuit添加到Circuit类ArrayList中去)
【3】charAt(1)为'M':根据特征字符确定,是哪个Circuit类的ArrayList的array加入到mcircuit的ArrayList中去,并以此Circuit类ArrayList创建并实例化一个MCircuit类对象。
【4】charAt(1)为'T'且i=字符串的个数:根据特征字符,确定是将哪个原件加入到总ArrayList中去。
4.电路状况的确定:根据charAt(0)(字符串第一个字符)和charAt(1)(字符串第二个字符)对步骤1中所实例化的字符串数组进行分类操作:(注:遍历时会有Array为Mcircuit类,需要对其Circuit类属性进行遍历,其中每个Circuit类Array也需要进行遍历)
【1】charAt(0)为'#'且charAt(1)为'K':截取指定字符并转化为int形式,如若在对Device类的字符串的遍历(若有ArrayList的array是ArrayList的情况,对这个array进行遍历)中有Array为Switch类且其num属性与改int类值相等,则改变一次该Switch类ArrayList的state属性(若此时为0,则改变为1.反之亦然,0为关闭,1为打开)。
【2】charAt(0)为'#'且charAt(1)为'F':截取指定字符并转化为int形式,如若在对Device类的字符串的遍历(若有ArrayList的array是ArrayList的情况,对这个array进行遍历)中有Array为DiscreteSpeedController类且其num属性与改int类值相等,根据该字符串的charAt(3)来判断该Array的initionSpeedLevel该有的变化(charAt(3)为'-'则减小一档。charAt(3)为'+',则加一档。特别注意此次包括0共四档,若已经为0档,则减一档还是0档。若已经为3档,则加一档仍未3档)。
【3】charAt(0)为'#'且charAt(1)为'L':截取指定字符并转化为int形式,如若在对Device类的字符串的遍历(若有ArrayList的array是ArrayList的情况,对这个array进行遍历)中有Array为FluorescentLamp类且其num属性与改int类值相等,则截取指定的第二个字符并转为double类,并将该Array的range属性设置为该double数据。
【4】charAt(0)为'#'且charAt(1)为'H':截取指定字符并转化为int形式,如若在对Device类的字符串的遍历(若有ArrayList的array是ArrayList的情况,对这个array进行遍历)中有Array为Hcontrol类且其num属性与改int类值相等,则改变一次该Hcontrol类ArrayList的state属性(若此时为0,则改变为1.反之亦然,0为关闭,1为打开)。
5.原件状态确定:根据每一个原件的状态,设计物理逻辑编写程序,确定每一个原件的运行成果。
6.原件集合:创建一个新的Device类ArrayList(此后叫新Device类ArrayList),对经过排序后的ArrayList进行遍历将所有的Array加入到新ArrayList中去(如果Array为Mcircuit类,则先对其所包含的Circuit类属性进行遍历,其Circuit类属性也需要遍历,将其所有的Array加入到新ArrayList中去)
7.原件排序:对Device类对象实现接口,用于排序:对Device类新ArrayList先根据每个原件的type属性再根据num属性进行从大到校排序。(每一个原件所对应的类都有一个type属性,按照Switch、DiscreteSpeedController、ContinuousSpeedController、IncandescentLamp、FluorescentLamp、Fan的顺序不断增大)
8.输出原件的运行情况:对经过排序后的新ArrayList进行遍历,对每一个Array的运行情况进行输出。
家居强电电路模拟程序-4:
(1)类的设计思路图:
(2)程序设计具体思路:
1.字符串录入:先创建一个String类的数组,用于储存输入的所有字符串,直到输入的字符串为"end"为止。以这个String类数组中的字符串为基础,进行处理。
2.对象的创建:分别创建一条总Device类(原件)、Circuit类(串联电路),Mcircuit类(并联电路),HControl类(互斥开关)ArrayList。
3.各类对象的实例化:根据charAt(1)(字符串第二个字符)对步骤1中所实例化的字符串数组进行分类操作:
【1】charAt(1)为'T'且i<字符串的个数:截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Circuit类对象,创建一个Device类的ArrayList(该ArrayList是该Device类对象的一个属性)。并将该Circuit对象添加进Circuit类ArrayList中去。
(1)charAt(1)为'K':则该字符串用于添加一个Switch类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Switch类对象,并加入到Device类的ArrayList中去。
(2)charAt(1)为'F':则该字符串用于添加一个FControl类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个FControl类对象,并加入到Device类的ArrayList中去。
(3)charAt(1)为'L':则该字符串用于添加一个LControl类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个LControl类对象,并加入到Device类的ArrayList中去。
(4)charAt(1)为'B':则该字符串用于添加一个BLight类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个BLight类对象,并加入到Device类的ArrayList中去。
(5)charAt(1)为'R':则该字符串用于添加一个RLight类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个RLight类对象,并加入到Device类的ArrayList中去。
(6)charAt(1)为'D':则该字符串用于添加一个Fan类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Fan类对象,并加入到Device类的ArrayList中去。
(7)charAt(1)为'A':则该字符串用于添加一个AFan类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个AFan类对象,并加入到Device类的ArrayList中去
(8)charAt(1)为'H':则该字符串用于添加一个HControl类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Hcontrol类对象,并加入到Device类的ArrayList中去。(在添加前要判断hcontrol的number值是否与HControl类的ArrayList里某个array的number相等,如果相等则是把这个array添加进Device类ArrayList中去,反之则是添加这个hcontrol对象,并将这个hcontrol添加到Hcontrol类ArrayList中去)
(9)charAt(1)为'S':则该字符串用于添加一个Scurtain类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个Scurtain类对象,并加入到Device类的ArrayList中去。
(10)charAt(1)为'P':则该字符串用于添加一个Pdevice类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个AFan类对象,并加入到Device类的ArrayList中去(在添加前要先判断pdevice的引脚1是正向连接还是反向连接,如果是正向则pdevice的电阻是0,反之为无穷大)。
(11)charAt(1)为'T':则该字符串用于添加一个Circuit类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个AFan类对象,并加入到Device类的ArrayList中去。(在添加前要判断circuit的number值是否与Circuit类的ArrayList里某个array的number相等,如果相等则是把这个array添加进Device类ArrayList中去,反之则是添加这个circuit对象,并将这个circuit添加到Circuit类ArrayList中去)
(12)charAt(1)为'M':则该字符串用于添加一个AFan类对象并添加到Device类的ArrayList中,截取指定字符并进行类型转化,以此实例化int number,用以实例化一个AFan类对象,并加入到Device类的副ArrayList中去。(在添加前要判断circuit的number值是否与Circuit类的ArrayList里某个array的number相等,如果相等则是把这个array添加进Device类ArrayList中去,反之则是添加这个circuit对象,并将这个circuit添加到Circuit类ArrayList中去)
【3】charAt(1)为'M':根据特征字符确定,是哪个Circuit类的ArrayList的array加入到mcircuit的ArrayList中去,并以此Circuit类ArrayList创建并实例化一个MCircuit类对象。
【4】charAt(1)为'T'且i=字符串的个数:根据特征字符,确定是将哪个原件加入到总ArrayList中去。
4.电路状况的确定:根据charAt(0)(字符串第一个字符)和charAt(1)(字符串第二个字符)对步骤1中所实例化的字符串数组进行分类操作:(注:遍历时会有Array为Mcircuit类,需要对其Circuit类属性进行遍历,其中每个Circuit类Array也需要进行遍历)
【1】charAt(0)为'#'且charAt(1)为'K':截取指定字符并转化为int形式,如若在对Device类的字符串的遍历(若有ArrayList的array是ArrayList的情况,对这个array进行遍历)中有Array为Switch类且其num属性与改int类值相等,则改变一次该Switch类ArrayList的state属性(若此时为0,则改变为1.反之亦然,0为关闭,1为打开)。
【2】charAt(0)为'#'且charAt(1)为'F':截取指定字符并转化为int形式,如若在对Device类的字符串的遍历(若有ArrayList的array是ArrayList的情况,对这个array进行遍历)中有Array为DiscreteSpeedController类且其num属性与改int类值相等,根据该字符串的charAt(3)来判断该Array的initionSpeedLevel该有的变化(charAt(3)为'-'则减小一档。charAt(3)为'+',则加一档。特别注意此次包括0共四档,若已经为0档,则减一档还是0档。若已经为3档,则加一档仍未3档)。
【3】charAt(0)为'#'且charAt(1)为'L':截取指定字符并转化为int形式,如若在对Device类的字符串的遍历(若有ArrayList的array是ArrayList的情况,对这个array进行遍历)中有Array为FluorescentLamp类且其num属性与改int类值相等,则截取指定的第二个字符并转为double类,并将该Array的range属性设置为该double数据。
【4】charAt(0)为'#'且charAt(1)为'H':截取指定字符并转化为int形式,如若在对Device类的字符串的遍历(若有ArrayList的array是ArrayList的情况,对这个array进行遍历)中有Array为Hcontrol类且其num属性与改int类值相等,则改变一次该Hcontrol类ArrayList的state属性(若此时为0,则改变为1.反之亦然,0为关闭,1为打开)。
5.原件状态确定:根据每一个原件的状态,设计物理逻辑编写程序,确定每一个原件的运行成果。
6.原件集合:创建一个新的Device类ArrayList(此后叫新Device类ArrayList),对经过排序后的ArrayList进行遍历将所有的Array加入到新ArrayList中去(如果Array为Mcircuit类,则先对其所包含的Circuit类属性进行遍历,其Circuit类属性也需要遍历,将其所有的Array加入到新ArrayList中去)
7.原件排序:对Device类对象实现接口,用于排序:对Device类新ArrayList先根据每个原件的type属性再根据num属性进行从大到校排序。(每一个原件所对应的类都有一个type属性,按照Switch、DiscreteSpeedController、ContinuousSpeedController、IncandescentLamp、FluorescentLamp、Fan的顺序不断增大)
8.输出原件的运行情况:对经过排序后的新ArrayList进行遍历,对每一个Array的运行情况进行输出。
三.踩坑心得
(1)踩坑:家居强电电路模拟程序-3:hcontrol输出开关开闭的情况。
解决方法:考虑并联电路某一电路断开的情况。
数据:
T1:[IN H1-1] [H1-2 D2-1] [D2-2 OUT]
T2:[IN H1-1] [H1-3 D1-1] [D1-2 OUT]
M1:[T1 T2]
T4:[IN K3-1] [K3-2 B2-1] [B2-2 OUT]
T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT]
M2:[T4 T5]
T3:[VCC K2-1] [K2-2 M1-IN] [M1-OUT M2-IN] [M2-OUT GND]
K1
K2
end
改正后测试结果:
@K1:closed
@K2:closed
@K3:turned on
@B1:87
@B2:0
@D1:0
@D2:262
@H1:closed
(2)踩坑:家居强电电路模拟程序-3:最开始没有考虑hcontrol只连接两个引脚的情况。
解决方法:考虑档次为0不能再减小,档次为3不能再增大。
数据:
T3:[VCC B2-1] [B2-2 K1-1] [K1-2 S1-1] [S1-2 H1-1] [H1-2 GND]
K1
end
改正后测试结果:
@K1:closed
@B2:95
@H1:closed
@S1:80%
(3)踩坑:家居强电电路模拟程序-4未考虑短路的情况。
解决方法:考虑并联电路所有电路断开的情况。
数据:
T3:[VCC K2-1] [K2-2 GND]
K2
end
改正后测试结果:
short circuit error
(4)踩坑:家居强电电路模拟程序-4并联里有并联判断错误。
解决方法:考虑并联电路多电路的情况。
数据:
T1:[IN H1-1] [H1-2 D2-1] [D2-2 OUT]
T2:[IN H1-1] [H1-3 D1-1] [D1-2 OUT]
M1:[T1 T2]
T4:[IN K3-1] [K3-2 B2-1] [B2-2 OUT]
T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT]
M2:[T4 T5]
T3:[VCC K2-1] [K2-2 M1-IN] [M1-OUT M2-IN] [M2-OUT GND]
K1
K2
end
改正后测试结果:
@K1:closed 220-220 exceeding current limit error
@K2:closed 220-220 exceeding current limit error
@K3:turned on 220-0
@B1:200 220-0 exceeding current limit error
@D1:0 0-0
@H1:closed 0-0-0
@P2:cutoff 0-0
四.改进建议
(1)改用hashmap()
(2)学习使用getClass()尝试减少代码量
(3)在电路情况的判定中可以改用“方法”,将对象引用进方法以减少工程量。
五.总结
(1)首先,这俩题是近期的主要任务,我们在期末考试之前比较好的锻炼题,可以说它们是我们本学期java语言学习的一次大考验,不仅考验了我们有关java方面的理论知识,还考验了我们的java编程的上手能力。
(2)其次,在前段时间里,我确实让我的学习状态相较于曾经有了很大的改善,不少东西现在都能独立完成甚至能够指导他人,自主学习能力也有了巨大的提高,但是我这段时间的学习并没有因此松懈,而是去努力赶上其他同学的步伐,欲求在编程能力和学习能力得到更大的提高。
(3)然后,在这几周中,我对于java编程的庞大的任务量有了清晰的认识,但同时也知道了,只要编程时的思路够清晰,对于java编程的原则足够遵守,大任务能分散成多个小任务,困难任务能分散成多个简单任务。
(4)此外,我仍然认为时间十分重要。在课程方面,虽然近期晚自习多了,但是我还是建议学校可以试着调整课程的安排,让学生们在学习过程中可以尽可能的线下交流、共同讨论、一起克服难题。在作业方面,我曾经希望老师可以明确作业的要求,测试点的要求希望可以更加清晰,但是我现在发现,程序需要自己去完善,自己去想有什么需要改进的地方,因为建议老师只要表明有几个测试点就行了,不用标明测试点的通过方法。在实验方面,我没有什么建议,比较满意。
(5)最后,我希望自己可以更加积极有效得去学习,做时间的优秀把握者,能够认真提高自己的学习能力的同时去接触新鲜事物以求完善自我。