第三次Blog

杨昌兴發表於2024-06-29

嗨嗨,到了最後一次啦,不管成績如何,有了這半個學期的教訓,多多少少也體驗了一下大學的真正內容,下學期得要重新恢復狀態才行!
講講這這最後兩次的作業集7和8吧,都是單題型別的,也可能是出於題難的緣故吧
那我們來看看這最後的兩次作業中我們都有哪些收穫與總結吧,

第7次作業

首先是第7次作業集,相比於第二次的電路題(總共有4次電路系列的題目集)而言,加了一個名為:“互斥開關”的開關和“窗簾”的電器以及電阻的考慮


那我們的思路很簡單的方面想就是,讓互斥繼承開關父類,讓窗簾繼承繼承了開關的電器

然後電阻方面就是往父類加個屬性的事

點選檢視程式碼
private double R;

但是在這裡的互斥開關中讓我學到了類與類之間的另一種奇妙的關係。

在程式設計中,我遇到了當我在一個串聯中調節電壓時,串聯電路和串聯電路中的第一個電器的輸入引腳必須關聯起來,而最後一個引腳得和最後一個電器的輸出引腳關聯一起,因為在這裡其他的電器沒有考慮輸出引腳輸入引腳反接的情況,所以我們只需面對這個新的開關——互斥開關討論就行了,但是我們調第一個電器的輸入亦或是最後一個電器的輸出,若是HC(互斥開關的話)我們就還需要討論是HC三個引腳中的哪一個,而且我們也不知道這個HC中是以哪個引腳作為輸入,哪個作為輸出,討論起來非常麻煩,而且換做並聯裡調這種電壓就更雪上加霜了,所以我們利用了一個我自稱“包裝類”的類,來包裝起來不同的串聯電路中的每一個互斥部分,並且用num,num2來提示對應於該電路中,這個HC輸出引腳以及輸入引腳,放程式碼:

點選檢視程式碼
class H extends Switch {// HC的外包裝類,但是不提供引腳,也不繼承
	HC hc;
	int num;// 記錄p1腳
	int num2;// 記錄p2腳

	public H(HC hc, int num) {
		super(hc.name, new Pins(0));// 這裡絕不能多出一個引腳
		this.hc = hc;
		this.num = num;
		if (num == 1)
			num2 = 2;// 函式存根
		else
			num2 = 1;
	}

	@Override
	public boolean OF() {
		if (num != 1) {
			if (num == hc.num)
				return true;
			else
				return false;
		} else {
			if (num2 == hc.num)
				return true;
			else
				return false;
		}
	}

	public void setHeadPin(Pins p) {
		if (this.num == 1)
			this.hc.p1 = p;
		else if (this.num == 2)
			this.hc.p[0] = p;
		else if (this.num == 3)
			this.hc.p[1] = p;
	}

	public void setLastPin(Pins p) {
		if (this.num2 == 1)
			this.hc.p1 = p;
		else if (this.num2 == 2)
			this.hc.p[0] = p;
		else if (this.num2 == 3)
			this.hc.p[1] = p;
	}
}

這樣子調節電壓時也更容易些。

所以我學到了,以後在做軟體時,若是屬性相同的物件出現了多次,那麼最好它們之間的不同點露出來,這樣會便於管理和檢視,然後相同點僅僅就是當作其中一個屬性儲存於裡面。打個比方說圖書管理系統,
若是要設計借書這個功能,那麼不應該是人借書,因為書是大家都可以借的,但是時間不同,受損程度也不一樣,若是讓人借書,則一個人對該書的結果,可能會影響到其他人的同一本書,所以我們應該利用
一個“圖書包裝類”,將圖書資訊封裝起來,只用一個該書的借書資訊來讓人獲取,對該書的任何操作都要回到借書資訊類中處理,分析,避免直接對書的影響傳到其他的物件中去,這樣的好處也有可以使物件
與物件之間的相互影響降低,互不干擾。

本次實驗同時也迭代了有多個並聯串聯的情況,只是在調節後面的並聯的輸入引腳電壓需要小心將其於前面的電壓繫結在一起。

點選檢視程式碼
	public void ChangeP1(Pins p) {// 改電壓的話應該全要改
		this.p1 = p;
		for (int i = 0; i < Switchs.size(); i++) {
			if (Switchs.get(i) instanceof CL) {
				((CL) Switchs.get(i)).ChangeP1(p);
				continue;
			}
			if (Switchs.get(i) instanceof BL) {
				((BL) Switchs.get(i)).ChangeP1(p);
				continue;
			}
			Switchs.get(i).p1 = p;
		}
	}

	public void ChangeP2(Pins p) {// 改電壓的話應該全要改
		this.p2 = p;
		for (int i = 0; i < Switchs.size(); i++) {
			if (Switchs.get(i) instanceof CL) {
				((CL) Switchs.get(i)).ChangeP2(p);
				continue;
			}
			if (Switchs.get(i) instanceof BL) {
				((BL) Switchs.get(i)).ChangeP2(p);
				continue;
			}
			Switchs.get(i).p2 = p;

		}
	}

其他的都是考查電路的知識對於程式設計的知識考察也可能僅限於基礎和類之間關係的設計了,不過對於更擅長於解決演算法問題的我而言,這些天花亂墜的關係屬實是讓人頭疼不已

題量而言,就一題,也是十分考慮了學生方面的原因,也十分感謝。
但是難度確實對的上這唯一的一題哈哈。

第8次作業:
在第8次作業中,比起之前,提出了要輸出電壓的設定,和電流是否過載的判定,以及二極體的出現:

那根據題目要求,我們需要增加電流,因為原先的幾次實驗中我們都只是利用電壓與電阻的關係來分配電壓,所以在這裡我們還得考慮電流的分配方法:若是串聯,則大家電流都一樣,若是並聯,那先算出所有有效電路的電阻,然後每一個有效電路分配其電壓除以其電阻的電流,上程式碼:
串聯:

並聯:

然後就是考慮二極體了,在這裡我犯得最多的錯誤就是,二級管當截斷時的電阻,若設其為Double.MAX_VALUE-1的話,那麼該R再加1就會變成0(位元組儲存的原因),但是如果不大的話,就會將電流分走一些,電壓分去一些,最後也是會導致明明是220的電壓,卻輸出了219,導致結果出錯,我當時想過的一個解決方法,但是我沒來得及改,就是給P(二極體類)加一個識別符號-1,當檢測到這個時,電阻怎麼加都是-1.然後分電流與分電壓時,只需做個判斷就行了,不用再糾結於值取多少,會不會導致判斷短路之類的了。
電流的過載判定也只需要在每個類的ToString方法中幾個判定,判斷NowI(實際電流)和I(限度電流)的大小即可。

因為只有一題,所以知識點有限,所以我也盡力的想發揮自己的所學,到了最後一次作業了,我唯一的遺憾就是沒有怎麼用過“介面”哈哈。

吶,也許在8次虐待後,心態從“我怎麼可能做不出來呢”到“我確實做不出來”,但是我還是那個我,我還是堅持自己的原則,我只是盡力知道自己知道的事情而已,我不會因為一次兩次,8次的失敗而放棄,我會等,等哪一個可以讓自己發光發亮的時候的,加油嗨嗨!