OOP7-8次作業
一.前言:
1.第七次PTA:
根據之前的內容在,之前的內容上進行修改和擴增。
①題目理解:
1.增加了互斥開關,互斥開關的難點在於他可以轉換每條路的通路和斷路,而且你切換的兩個引腳他的電阻也是不一樣的,這就增加了你獲得電路電阻的難度。
2.對於在電路的獲得這個互斥開關也是需要更改的。因為我獲得每個用電電器的方法是不需要查詢引腳的,但是互斥開關開始,他是需要根據互斥開關來去找到他的對應的引腳對應的串聯位置。所以我的輸入獲取方式的程式碼也得更改。
3.增加了多個串聯的並聯,然後這樣的電路,也存在一些特殊情況,比如說他可能會短路,他也可能因為互斥開關的轉換造成一條串連電路的短路。所以我的並聯類需要更改為串聯陣列,對於他的獲得也需要更改。
4.增加了受控窗簾這個用電器,他的難點在於我們要根據能發光的用電器來算得他的總光亮,來算出受控窗簾開啟的百分比,然後輸出出來。
5.他的輸出順序是根據字串得直接比較,而不是比數字。例如D11比D2更先輸出,所以這個地方還是比較坑的點。
6.然後如何去賦值正確的電壓,和其對應的電阻,的順序其實也是需要考慮的。這次迭代我們是透過賦值非幹路的串聯電路的電阻,然後賦值並聯電路的電阻,然後賦值幹路上的電阻,然後賦值幹路上的電壓,然後最後賦值並聯電路每個串聯的電壓,然後每個用電器的電壓。在下一次迭代中,這樣會出現一個文體,但是本次迭代還是能透過測試的。
②知識點:
具體的知識點倒是沒啥更新的,主要是思維邏完成一個專案的能力。
一·用正規表示式的匹配(split函式的使用);
二·如何Java中建立一個二維陣列,或者一維陣列;
三·Java中如何將int型轉化成String型別(valueOf,Integer.paseInt);
③題量:
正常;
④難度:
正常;
2.第八次PTA:
有一說一,最後一次了,有點小激動,哈哈哈。
①題目理解:
這次的更改會有一點多。
1.增加了二極體,這個電路元件,然後這個電路元件是根據電流流過的方向和其引腳的不同來判斷是不是相同的,如果相同則當導線,如果不同則被判斷為為斷路,電流走不通。這就對串聯的判斷增加了許多情況。
2.輸出了引腳的電壓顯示,這樣就增加了大量的工作量。因為之前的測試都與引腳無關,但是本次的迭代,包括了引腳,所以得全部修改,然後如何判斷他的引腳是12還是21,還有互斥開關的123引腳還是個問題。所以我規定12為正的狀態21為負的狀態,123為正的狀態,321為負的狀態,然後先獲得兩端引腳的值,不管他是12還是21,最後輸出的時候檢視一下狀態,看看要不要更改,這樣就可以輸出正確了。然後還有一個方面,當前面的這條路是斷路但是最後一個用電器的右引腳是有電壓的,這樣僅僅透過簡單賦值是不可取的。然後你還有回去檢查一下幹路的情況,這個點也比較坑。
3.還有幾個電流過大的判斷,我們還是把各個串聯電路和並聯電路看成一個用電器,然後去判斷他流過的電流情況,如果這個電路是斷路那麼我們根本就不用判斷他裡面的用電器,這樣能節省點,執行的時間。
4.然後這次增加了串聯中的並聯,那麼串聯中有並聯,並聯中有串聯,這樣的迴圈就形成了閉環,這就要求你不能只找到串聯或者是並聯去賦值,這樣的賦值應該是一個遞迴的操作。這樣我們就會有一個閉環,在串聯電路中我們會有並聯陣列,串聯陣列,用電器,和控制器。在並聯電路中,我們只需要有串聯電路陣列,一切都可以在獲得並聯的時候,去用並聯類的方法,這樣就會形成一個遞迴。
5.然後是整個電路的如果他是一個斷路的狀態還會有輸出語句,這樣我們還要判斷整個幹路串聯是不是都是短路的,是的話就輸出。
②知識點:
具體的知識點倒是沒啥更新的,主要是思維邏完成一個專案的能力。
一·用正規表示式的匹配(split函式的使用);
二·如何Java中建立一個二維陣列,或者一維陣列;
三·Java中如何將int型轉化成String型別(valueOf,Integer.paseInt);
③題量:
我覺得正常,就是大概每個星期自己做,差不多一個星期可以做完,但是有時候一直有的點過不去,就一直卡著;
④難度:
不正常;
二.內容:
1.第七次PTA:
①題目簡介:
1.增加了互斥開關和受控窗簾;
2.本次迭代考慮多個並聯電路串聯在一起的情況。
本題考慮一條串聯電路中包含其他串聯電路的情況。例如:
T3:[VCC K1-1] [K1-2 T2-IN] [T2-OUT K2-1] [K2-2 T1-IN] [T1-OUT GND]
本例中T1\T2兩條串聯電路T3的一個部分,本題考慮這種型別的輸入
3.本次迭代模擬一種受控窗簾:
受控窗簾的電路符號為S,其最低工作電壓為50V,電壓達到或超過50V,窗簾即可正常工作,不考慮室外光照強度和室內空間大小等因素,窗簾受室內燈光的光照強度控制。
4.互斥開關有3個引腳:1個是彙總引腳,另兩個是分支引腳。 開關電路示意圖如圖1所示,左邊是彙總引腳,編號為1;右邊兩個是分支引腳,右上的輸出引腳為2,右下輸出引腳為3。圖中1、2、3引腳均可以是輸入引腳,當1為輸入引腳時,2、3引腳為輸出引腳;1為輸出引腳時,2、3引腳為輸入引腳。 互斥開關只有兩種狀態:開關接往上面的2號引腳、接往下面的3號引腳。開關每次只能接通其中一個分支引腳,而另一個分支引腳處於斷開狀態。 互斥開關的預設狀態為1、2引腳接通,1、3引腳斷開。 圖1中所示的互斥開關可以反過來接入電路,即彙總引腳接往接地端,兩個分支引腳接往電源端。
②內容實現:
1.對於每個物件陣列,你構造物件是實現自增的方式。
public void setTandemDevices(TandemDevice tandemDevice) {
if (this.tandemDevices == null) {
this.tandemDevices = new TandemDevice[1];
}
this.tandemDevices[hh4] = tandemDevice;
hh4++;
this.tandemDevices = Arrays.copyOf(this.tandemDevices, this.tandemDevices.length + 1);
}
這樣的寫法,當你後期判斷這個陣列有沒有時,直接就能判斷,不存在空者的陣列但是被呼叫或者使用了,更加自動。
2.面對互斥開關的三個引腳,然後我對他的獲取方式進行修改。
for (int i = 0; i < get77.length; i++) {
if (get77[i].length() > 3) {
numc++;
}
}
get88 = new String[numc];
for (int i = 0, j = 0; i < get77.length; i++) {
if (get77[i].length() > 3) {
get88[j] = get77[i];
j++;
}
}
get = new String[get88.length / 2];
for (int i = 0, j = 0; i < get88.length; i = i + 2) {
if(get88[i].charAt(0)=='H'){
String[] temp=get88[i].split("-");
if(temp[1].equals("1")){
get[j]=get88[i+1];
}else{
get[j]=get88[i];
}
}else {
get[j] = get88[i];
}
j++;
}
因為每個互斥開關的兩個引腳都是寫在一起的,當我們判斷了一個引角這個物件已經存在在,然後就不用在新建一個物件了。這樣的寫法可以實現,題目的要求。
2.然後我們要判斷互斥開關的引腳到底連在那條路上。
if (((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).number.equals("2")) {
if (((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).tandemDevice2.deviceControlings != null) {
for (int z = 0; z < ((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).tandemDevice2.deviceControlings.length - 1; z++) {
if (((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).tandemDevice2.deviceControlings[z] instanceof Switch && ((Switch) ((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).tandemDevice2.deviceControlings[z]).state == 0) {
target2++;//表示在互斥開關,有用一端有斷開的開關,加數量
break;
}
}
}
}
if (((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).number.equals("3")) {
if (((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).tandemDevice3.deviceControlings != null) {
for (int z = 0; z < ((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).tandemDevice3.deviceControlings.length - 1; z++) {
if (((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).tandemDevice3.deviceControlings[z] instanceof Switch && ((Switch) ((MutexSwitch) parallelDevice[j].tandemDevices[i].deviceControlleds[k]).tandemDevice3.deviceControlings[z]).state == 0) {
target2++;//表示在互斥開關,有用一端有斷開的開關
break;
}
}
}
我在互斥開關加了兩個串聯物件,放2,3引腳的串聯位置,然後判斷這個電路是不是在這個引腳裡,那麼透過上述程式碼可以實現。
3.在窗簾上增加了亮度這個成員變數,記錄最後獲得的總亮度。
if(voltage<50){
System.out.println("@S"+name+":"+100+"%");
}
else{
if(lightness>=0&&lightness<50){
System.out.println("@S"+name+":"+100+"%");
} else if (lightness>=50&&lightness<100) {
System.out.println("@S"+name+":"+80+"%");
} else if (lightness>=100&&lightness<200) {
System.out.println("@S"+name+":"+60+"%");
} else if (lightness>=200&&lightness<300) {
System.out.println("@S"+name+":"+40+"%");
}else if(lightness>=300&&lightness<400){
System.out.println("@S"+name+":"+20+"%");
} else if(lightness>=400) {
System.out.println("@S"+name+":"+0+"%");
}
}
4.還有在輸出時,我們是根據字串來排序的,但是我們已經把字串改成了數字,所以需要一些改變來,重新排序。
if (deviceControlleds != null) {
Curtain[] ct = new Curtain[1];
int num_ct = 0;
for (int i = 0; i < deviceControlleds.length - 1; i++) {
if (deviceControlleds[i] instanceof Curtain) {
ct[num_ct] = (Curtain) deviceControlleds[i];
ct = Arrays.copyOf(ct, ct.length + 1);
num_ct++;
}
}
for (int i = 0; i < ct.length - 1 - 1; i++) {
for (int k = 0; k < ct.length - i - 1 - 1; k++) {
if (String.valueOf(ct[k].name).compareTo(String.valueOf(ct[k + 1].name)) > 0) {
Curtain temp = ct[k];
ct[k] = ct[k + 1];
ct[k + 1] = temp;
}
}
}
for (int i = 0; i < ct.length - 1; i++) {
ct[i].setLightness(this.lightness);
ct[i].show();
}
}
先判斷,用電器陣列中是否有有用電器;
在從用電器陣列中提取出窗簾,放到一個新的窗簾陣列中去;
然後用氣泡排序,把窗簾的名字轉換成字串,用compareTo函式進行比較;
然後附上每個亮度,然後輸出。
③踩坑心得:
1.忽略了沒有用電器,或者是控制器,或者是並聯電路,所以當我去查詢他們的時候我要先判斷是不是存在這樣一個用電器,然後再去判斷,這樣的一個方式要一直用。
2.當我們去查詢一個用電器的時候,可能會從他的並聯中找他的串聯,再從串聯找他的用電器,這樣經過多層迴圈之後,可能會一不小心少了一個修飾符,這樣就會查詢出現問題。
2.第八次PTA:
①題目簡介:
1.並聯電路中包含並聯,本次迭代考慮並聯電路中包含並聯電路的情況,即構成並聯電路的串聯電路可以包含別的並聯電路。例如如下輸入的電路,並聯電路M2的其中一條串聯電路T4中包含了另一條並聯電路M1
2.如果電路出現無窮大的電流造成短路,所有元器件資訊不輸出,僅輸出提示“short circuit error”
3.增加二極體元件,其電路特性為:正向導通,反向截止;其電器符號如圖4所示,當電流從左至右流過時,二極體導通”conduction”,電阻為0;電流從右至左流動時,二極體截止”cutoff”,電阻無窮大,相當於開關開啟。
②內容實現:
1.對於他在每個引腳都要輸出對應的電壓,我們要先調整他的狀態,判斷他是正的還是逆的。
if (get88[i].charAt(0) == 'R') { //日光燈
String[] get1 = get88[i].split("-");
String[] zz = get1[0].split("R");
if(Integer.parseInt(get[1])==1){
int target_pdshunxu=0;
if(deviceControlleds!=null){
for(int b=0;b<deviceControlleds.length-1;b++){
if(deviceControlleds[b] instanceof fluorescentLamp &&((fluorescentLamp) deviceControlleds[b]).name==Integer.parseInt(zz[1])){
target_pdshunxu=1;//已經存在了
}
}
}
if(target_pdshunxu==0){//判斷為null
fluorescentLamp1 = new fluorescentLamp(Integer.parseInt(zz[1]));
fluorescentLamp1.setShunorni(1);
if(deviceControlleds==null){
deviceControlleds=new deviceControlled[1];
}
deviceControlleds[num] = fluorescentLamp1;
num++;
deviceControlleds = Arrays.copyOf(deviceControlleds, deviceControlleds.length + 1);
tandemDevices[number].setListChildren(fluorescentLamp1);
tandemDevices[number].setDeviceControlleds(fluorescentLamp1);
}
}
if(Integer.parseInt(get[1])==2){
int target_pdshunxu=0;
if(deviceControlleds!=null){
for(int b=0;b<deviceControlleds.length-1;b++){
if(deviceControlleds[b] instanceof fluorescentLamp&&((fluorescentLamp) deviceControlleds[b]).name==Integer.parseInt(zz[1])){
target_pdshunxu=1;//已經存在了
}
}
}
if(target_pdshunxu==0){//判斷為null
fluorescentLamp1 = new fluorescentLamp(Integer.parseInt(zz[1]));
fluorescentLamp1.setShunorni(0);
if(deviceControlleds==null){
deviceControlleds=new deviceControlled[1];
}
deviceControlleds[num] = fluorescentLamp1;
num++;
deviceControlleds = Arrays.copyOf(deviceControlleds, deviceControlleds.length + 1);
tandemDevices[number].setListChildren(fluorescentLamp1);
tandemDevices[number].setDeviceControlleds(fluorescentLamp1);
}
}
2.然後對每個串聯都增加了一個狀態的變數,記錄他這個串聯是屬於短路還是斷路還是通路,
for(int i=0;i<deviceControlings.length-1;i++) {
if(deviceControlings[i] instanceof Diode && ((Diode) deviceControlings[i]).shunorni==0){//他是逆電路,則他為斷路,電阻為零
target_0=1;
}
}
for (int i = 0; i < deviceControlings.length - 1; i++) {
if (deviceControlings[i] instanceof Switch && ((Switch) deviceControlings[i]).state == 0) { //開關斷開
target_0=1;
}
}
一般是先判斷是否存在二極體,二極體是否順序;
在判斷開關是否斷開,在判斷互斥開關是否連到這個線路上來;
在判斷是否存在用電器,這樣就可以判斷他是通路,還是斷路,還是短路了;
③踩坑心得:
1.他連線gnd的引腳還是有電壓的,所以我們還要去找尋一遍他在gnd所在位置有哪些引腳;
2.為了讓他實現遞迴,當我們要呼叫到其他串聯或者並聯電路中,直接呼叫他的方法,然後要返回他的狀態,還有他的電阻。
3.在最後的判斷中我們還要考慮他是不是整體短路。
三.總結:
一.要懂得基本的工具,和相關函式;
二.要明白程式碼的邏輯,熟悉idea除錯的方法;