第三次Bolg

23201818洪泽發表於2024-06-29

一、前言
題目集7 (1)知識點:題目集4:類間的關係,關聯,依賴,聚集,繼承,正規表示式,Map,List介面 題目集5:類間的關係,關聯,依賴,聚集,繼承,正規表示式,List,Map,ArrayList,Collection,列舉法,
介面。
(2)題量:只有一道題目,但是程式碼量,個人是寫了1000多行
(3)難度:難度很大,不適宜新手
題目集8 (1)知識點:未知
(2)題量:一題,程式碼量據說非常恐怖
(3)難度:非常大,非常不適宜新手
二、設計與分析
題目集7
題目內容:智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。以下題目介紹中加粗的部分為本次迭代在“家居強電電路模擬程式-2”的基礎上增加的功能要求。
整體類圖:

類設計及其分析:
(1)設計Circuit類,用來存放所有的電器,包括並聯電路,串聯電路
部分原始碼:
class Circuit {
private Map<String, CircuitDevice> devices = new LinkedHashMap<>();
private Map<String, CircuitDevice> mainDevices = new HashMap<>();
private Map<String, ParallelCircuit> parallelCircuits = new HashMap<>();
private Map<String, SeriesCircuit> seriesCircuits = new HashMap<>();
private double Voltage = 220;
public double getVoltage() {
return Voltage;
}
public void setVoltage(double voltage) {
Voltage = voltage;
}
public void addDevice(CircuitDevice circuitDevice) {
devices.put(circuitDevice.getNumber(), circuitDevice);
}
public void addMainDevice(CircuitDevice circuitDevice) {
mainDevices.put(circuitDevice.getNumber(), circuitDevice);
}
public void addParallelCircuit(ParallelCircuit circuitDevice) {
parallelCircuits.put(circuitDevice.getNumber(), circuitDevice);
}
public void addSeriesCircuit(SeriesCircuit seriesCircuit) {
seriesCircuits.put(seriesCircuit.getNumber(), seriesCircuit);
}
public SeriesCircuit findSeriesCircuit(String str) {
return seriesCircuits.get(str);
}
public void controlCommend(String str) {
String number = str.substring(1,3);
CircuitDevice device = mainDevices.getOrDefault(number, devices.get(number));
if(device != null) {
if (device instanceof Switch) {
((Switch) device).toggle();
}else if (device instanceof BinningGovernor) {
if (str.substring(3,4).equals("+")) {
((BinningGovernor) device).upGear();
this.Voltage = ((BinningGovernor) device).getVoltage(220);
}else if (str.substring(3,4).equals("-")) {
((BinningGovernor) device).downGear();
this.Voltage = ((BinningGovernor) device).getVoltage(220);
}
}else if (device instanceof ContinuousGovernor) {
((ContinuousGovernor) device).setGearParameters((Double.parseDouble(str.substring(4))));
this.Voltage = ((ContinuousGovernor) device).getVoltage(220);
}else if(device instanceof MutexSwitch) {
((MutexSwitch)device).toggleSwitch();
}
}
}
public void setWay() {
for(SeriesCircuit seriesCircuit : seriesCircuits.values()) {
seriesCircuit.setPathways();
//seriesCircuit.show();
}
for(ParallelCircuit parallelCircuit : parallelCircuits.values()) {
parallelCircuit.setMutexswitchPathway();
}

}
public void setPR() {
	for(ParallelCircuit parallelCircuit : parallelCircuits.values()) {
		parallelCircuit.setParallelR();
		//parallelCircuit.show();
		}
}
private boolean mainClosure() {
	for(CircuitDevice device : mainDevices.values()) {
		if(device instanceof Switch) {
			Switch switchDevice = (Switch) device;
			//System.out.println(switchDevice.getNumber());
			if(!switchDevice.isClosure()) {
				return false;
			}
		}
	}
	return true;
}
public void calculatePartialPressure() {
	if(!mainClosure()) {
		this.Voltage = 0;

// System.out.println("0000");
}
double totalR = 0;
for(CircuitDevice mainDevice : mainDevices.values()) {
totalR += mainDevice.getResistance();
} //System.out.println(totalR);
for(CircuitDevice mainDevice : mainDevices.values()) {
if(mainDevice instanceof ControlledDevice) {
if(mainDevice instanceof ParallelCircuit) {
ParallelCircuit parallelCircuit = (ParallelCircuit) mainDevice;
parallelCircuit.setPathways();
//System.out.println(parallelCircuit.isPathways());
if(!parallelCircuit.isPathways()) {
parallelCircuit.setInputVoltage(0);
parallelCircuit.setV();
this.Voltage = 0;
}else {
parallelCircuit.setInputVoltage((mainDevice.getResistance() / totalR) * this.Voltage);
parallelCircuit.setV();
//System.out.println(this.Voltage);
//System.out.println(mainDevice.getResistance());
//System.out.println(parallelCircuit.getInputVoltage());
}
}else if(mainDevice instanceof SeriesCircuit) {
SeriesCircuit seriesCircuit = (SeriesCircuit) mainDevice;
seriesCircuit.setPathways();
if(seriesCircuit.isPathways()) {
((SeriesCircuit) mainDevice).setVoltage((mainDevice.getResistance() / totalR) * this.Voltage);
}
else this.Voltage = 0;
}
else if(mainDevice instanceof IncandescentLamp) {
((IncandescentLamp) mainDevice).setInputVoltage((mainDevice.getResistance() / totalR) * this.Voltage);
}else if(mainDevice instanceof FluorescentLamp) {
((FluorescentLamp) mainDevice).setInputVoltage((mainDevice.getResistance() / totalR) * this.Voltage);
}else if(mainDevice instanceof CeilingFan) {
((CeilingFan) mainDevice).setInputVoltage((mainDevice.getResistance() / totalR) * this.Voltage);
}else if(mainDevice instanceof FloorFan) {
((FloorFan) mainDevice).setInputVoltage((mainDevice.getResistance() / totalR) * this.Voltage);
}else if(mainDevice instanceof Curtain) {
((Curtain) mainDevice).setInputVoltage((mainDevice.getResistance() / totalR) * this.Voltage);
}
}
}
setBrightness();
}
}
private Map<String, CircuitDevice> devices = new LinkedHashMap<>();
用來存放不同的單個電器,方便最後的電器狀態展示
public void controlCommend(String str);
用來調節控制電器,從而調控受控電器,簡單來講就是實現路端電壓是否接入
public void calculatePartialPressure();
計算所有電器的分壓
private double calBrightness();
計算整個電路的總光照強度,從而實現對窗簾的調控
private void setBrightness();
把計算出來的光照強度賦值
(2)設計ParallelCircuit類,實現每個並聯電路中不同電器的調控
部分原始碼:
private Map<String, SeriesCircuit> seriesCircuits = new HashMap<>();
private boolean isPathways = true;

public ParallelCircuit(String number) {
	super(number);
	// TODO Auto-generated constructor stub
}
public boolean isPathways() {
	return isPathways;
}

public void setPathways(boolean isPathways) {
	this.isPathways = isPathways;
}
public void setPathways() {
	int flag = -1;
	for(SeriesCircuit seriesCircuit : seriesCircuits.values()) {
		if(seriesCircuit.isPathways()) {
			//System.out.println("0000");
			flag = 1;
			break;
		}
	}
	if(flag == -1) {
		this.isPathways = false;
	}else {
		this.isPathways = true;
	}
}
public void setMutexswitchPathway() {
	for(SeriesCircuit seriesCircuit : seriesCircuits.values()) {
		if(seriesCircuit.containMutexSwitch()) {
			MutexSwitch mutexswitch = (MutexSwitch) seriesCircuit.getMutexswitch();
			if(seriesCircuit.getMutexPin().equals("2")) {
				if(mutexswitch.getCurrentState() == MutexSwitch.SwitchState.UP) {
					seriesCircuit.setPathways(true);
				}else if(mutexswitch.getCurrentState() == MutexSwitch.SwitchState.DOWN){
					seriesCircuit.setPathways(false);
				}
			}else if(seriesCircuit.getMutexPin().equals("3")) {
				if(mutexswitch.getCurrentState() == MutexSwitch.SwitchState.UP) {
					seriesCircuit.setPathways(false);
				}else if(mutexswitch.getCurrentState() == MutexSwitch.SwitchState.DOWN){
					seriesCircuit.setPathways(true);
				}
			}
		}
	}
}

public void addSeriesCircuit(SeriesCircuit seriesCircuit) {
	seriesCircuits.put(seriesCircuit.getNumber(), seriesCircuit);
}
public void setParallelR() {
	double R = 0;
	for(SeriesCircuit seriesCircuit : seriesCircuits.values())  {
		if(seriesCircuit.isPathways() && seriesCircuit.getTotalR() == 0) {
			break;
		}else if(seriesCircuit.isPathways() && R == 0){				
			R = seriesCircuit.getTotalR();
			//System.out.println(R);
		}else if (seriesCircuit.isPathways() && R != 0) {
			R = 1.0/(1.0/R +1.0/ seriesCircuit.getTotalR());
		}
		//System.out.println(R);
	}
	
        resistance = R;
}

}
private Map<String, SeriesCircuit> seriesCircuits = new HashMap<>();
儲存每個並聯電路中的串聯電路。從而方便實現調控
public void setMutexswitchPathway();
因為本次迭代了一個控制裝置互斥開關,因為普通開關和互斥開關的調控方式不同,互斥開關兩條串聯電路只能透過一條,設定此方法對含有互斥開關的並聯電路進行調控
(3)設計SeriesCircuit類,實現對並聯電路中的每個小串聯電路的各種電器實現調控
部分原始碼:
class SeriesCircuit extends CircuitDevice{
private Map<String, CircuitDevice> devices = new HashMap<>();
private boolean isPathways = true;
private String MutexPin;
private double totalR = 0;
private double Voltage = 0;
/**
* @param number
*/
public SeriesCircuit(String number) {
super(number);
}
public void addSeriesCircuits(CircuitDevice circuitDevice) {
devices.put(circuitDevice.getNumber(), circuitDevice);
}
public void setTotalR() {
for(CircuitDevice circuitDevice : devices.values()) {
this.totalR += circuitDevice.getResistance();
}
}
public void setTotalR(double totalR) {
this.totalR = totalR;
}
public double getTotalR() {
return totalR;
}

public String getMutexPin() {
	return MutexPin;
}
public void setMutexPin(String mutexPin) {
	MutexPin = mutexPin;
}
public boolean isPathways() {
	return isPathways;
}
public void setPathways(boolean isPathways) {
	this.isPathways = isPathways;
}
public double getVoltage() {
	return Voltage;
}
public void setVoltage(double voltage) {
	Voltage = voltage;
}
public void setPathways() {
	List<Switch> switchList = new LinkedList<>();
	for(CircuitDevice circuitDevice : devices.values()) {
		if(circuitDevice instanceof Switch) {
			switchList.add((Switch) circuitDevice);
			//Switch switchDevice = (Switch) circuitDevice;
			//System.out.println(switchDevice.getNumber() + switchDevice.isClosure());
		}
	}
	if(!switchList.isEmpty()) {
		for (Switch switchItem : switchList) {
        if(!switchItem.isClosure()) {
        	this.isPathways = false;
	    	break;
	    	}
        }
	}else {
		this.isPathways = true;
		}	     
}
public boolean containMutexSwitch() {
	for(CircuitDevice circuitDevice : devices.values()) {
		if(circuitDevice instanceof MutexSwitch) {
			return true;
		}else {
			continue;
		}
	}
	return false;
}
public CircuitDevice getMutexswitch() {
		for(CircuitDevice circuitDevice : devices.values()) {
			if(circuitDevice instanceof MutexSwitch) {
				return circuitDevice;
			}
		}
	return null;
}

}
private String MutexPin;
本次增加了一個新的私有屬性,因為互斥開關含有兩個不同的引腳,所以本人就設計了此屬性實現含有互斥開關並聯電路,每個串聯電路都有一個引腳,可以識別兩個不用的引腳,從而方便實現對含有互斥開關的並聯電路實現調節
public boolean containMutexSwitch();
為了找出含有互斥開關的並聯電路,方便對其拉出來進行調控
public CircuitDevice getMutexswitch();
找到含有互斥開關的小串聯電路後,從而可以得到包含其的並聯電路,透過此方法返回該小串聯電路,方便實現調控,包括識別引腳之類的操作
(4)設計MutexSwitch類,實現互斥開關的作用
部分原始碼:
private double resistance = 5;
public MutexSwitch(String number) {
super(number);
// TODO Auto-generated constructor stub
this.currentState = SwitchState.UP;
}

// 定義開關狀態列舉
public enum SwitchState {
    UP, // 接通2號引腳
    DOWN // 接通3號引腳
}

// 開關當前狀態
private SwitchState currentState;

// 切換開關狀態的方法
public void toggleSwitch() {
    if (currentState == SwitchState.UP) {
        currentState = SwitchState.DOWN; // 如果當前接通2號引腳,切換到接通3號引腳
        this.resistance = 10;
    } else {
        currentState = SwitchState.UP; // 如果當前接通3號引腳,切換到接通2號引腳
        this.resistance = 5;
    }
}

// 獲取當前開關狀態
public SwitchState getCurrentState() {
    return currentState;
}

}
private double resistance = 5;
因為互斥開關不同於其他控制裝置,互斥開關含有電阻,所以初始化互斥開關電阻為5
public enum SwitchState{
}
定義開關類列舉,UP接通二號引腳,DOWN接通三號引腳
public void toggleSwitch();
切換開關狀態,並且透過切換開關狀態的同時切換開關的電阻
(4)設計Brightness介面,實現對可以產生光的電器光照強度的獲取
public double getBrightness();
獲取光照強度的抽象方法
(5)設計Curtain類,實現窗簾電器的功能
部分原始碼:
class Curtain extends ControlledDevice {
private double resistance = 15;
private double Lightness = 0;

public Curtain(String number) {
	super(number);
	// TODO Auto-generated constructor stub
}

public double getResistance() {
	return resistance;
}

public void setResistance(double resistance) {
	this.resistance = resistance;
}

public double getLightness() {
	return Lightness;
}

public void setLightness(double lightness) {
	Lightness = lightness;
}
@Override
public void display() {
	// TODO Auto-generated method stub
	if(inputVoltage >= 50) {
		if(Lightness >= 50 && Lightness < 100) {
			System.out.println("@" + number + ":" + "80%");
		}else if(Lightness >= 100 && Lightness < 200) {
			System.out.println("@" + number + ":" + "60%");
		}else if(Lightness >= 200 && Lightness < 300) {
			System.out.println("@" + number + ":" + "40%");
		}else if(Lightness >= 300 && Lightness < 400) {
			System.out.println("@" + number + ":" + "20%");
		}else if(Lightness >= 400) {
			System.out.println("@" + number + ":" + "0%");
		}else if(Lightness >= 0 && Lightness < 50) {
			System.out.println("@" + number + ":" + "100%");
		}			
	}else if(inputVoltage < 50) {
		System.out.println("@" + number + ":" + "100%");
	}
	
}

}
public void display();
實現窗簾狀態的展示的方法
題目集8
(由於題目集7並未全部完成,所以本次迭代並沒完成,在此就不做展示了)
題目內容:智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。以下題目介紹中加粗的部分為本次迭代在“家居強電電路模擬程式-3”的基礎上增加的功能要求。

整體類圖:無

類設計及其分析:無

三、踩坑心得:
題目集7
(1)Main類,主類中對調控裝置的操作忘記加入互斥開關
else if(str.startsWith("#K") || str.startsWith("#L") || str.startsWith("#F") || str.startsWith("#H")) {
devices.controlCommend(str);

		}		

主類增加Map<String, ParallelCircuit> parallelDevices = new HashMap<>();實現對並聯電路的操作,之前寫的程式碼只能實現對一個並聯電路的操作
(2)Circuit類,之前把判斷整個電路是否為通路的方法放入在ControlCommend方法之中去了,可這是在未實現電壓調控之前做的操作,所以有的電路分壓會出現錯誤,因此把判斷整個電路是否為通路的方法放在調控了電壓之後,就解決了此問題
(3)實現獲得光照強度的介面更加方便,避免作為實現私有屬性,過於繁瑣
(4)互斥開關使用列舉的方法實現對開關的調控;
題目集8

四、改進建議:
(1)自己寫的程式碼類之間的關係不是絕對的清晰,即不能很好的實現單一職責的功能。
(2)還有類中的方法,有些方法的使用有些錯誤,因為沒給測試點,所以很多種情況並沒有考慮到,所以會導致程式碼方法的問題。
(3)一些該考慮的情況沒有被考慮到,所以會導致一些需要的方法被遺漏,或者方法使用的錯誤,類間關係的錯誤。
五、總結:
透過這兩次Pta,對類之間關係的使用有了更清楚的認知,對繼承,抽象方法使用的更加熟練,邏輯思維的提高,自我動手,自我思考能力增強,解決問題的能力增強
六、建議以及意見:分小組探討