23201927-楊民星第二次blog
1.前言:
繼上次第一次blog之後,又開展了3次的Java的opp的訓練集。在這三次的opp的題目中,第一次是對於之前三次題目的最後 一次的迭代(上次3個題集的blog23201927-楊民星-第一次部落格)這個題目也是答題系統的最後一個題目;而對於後面兩個題目,就是基於電路系統進行一個擴充以及迭代,接下來我會分別講解一下我對於這三個題目的理解與解決思路。感興趣的小夥伴可以點贊關注收藏一下,這個對於博主真的很重要!
2.題目一:
a.題目描述:
7-1 答題判題程式-4
設計實現答題程式,模擬一個小型的測試,要求輸入題目資訊、試卷資訊、答題資訊、學生資訊、刪除題目資訊,根據輸入題目資訊中的標準答案判斷答題的結果。本題在答題判題程式-3基礎上新增的內容統一附加在輸出格式說明之後,用粗體標明。
輸入格式:
程式輸入資訊分五種,資訊可能會打亂順序混合輸入。
1、題目資訊
題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。
格式:"#N:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案
格式約束:
1、題目的輸入順序與題號不相關,不一定按題號順序從小到大輸入。
2、允許題目編號有缺失,例如:所有輸入的題號為1、2、5,缺少其中的3號題。此種情況視為正常。
樣例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
2、試卷資訊
試卷資訊為獨行輸入,一行為一張試卷,多張卷可分多行輸入資料。 \
格式:"#T:"+試卷號+" "+題目編號+"-"+題目分值+" "+題目編號+"-"+題目分值+...
格式約束:
題目編號應與題目資訊中的編號對應。
一行資訊中可有多項題目編號與分值。
樣例:#T:1 3-5 4-8 5-2
3、學生資訊
學生資訊只輸入一行,一行中包括所有學生的資訊,每個學生的資訊包括學號和姓名,格式如下。
格式:"#X:"+學號+" "+姓名+"-"+學號+" "+姓名....+"-"+學號+" "+姓名
格式約束:
答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。
樣例:
#S:1 #A:5 #A:22
1是試卷號
5是1號試卷的順序第1題的題目答案
4、答卷資訊
答卷資訊按行輸入,每一行為一張答卷的答案,每組答案包含某個試卷資訊中的題目的解題答案,答案的順序號與試 卷資訊中的題目順序相對應。答卷中:
格式:"#S:"+試卷號+" "+學號+" "+"#A:"+試卷題目的順序號+"-"+答案內容+...
格式約束:
答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。
答案內容可以為空,即””。
答案內容中如果首尾有多餘的空格,應去除後再進行判斷。
答卷資訊中僅包含試卷號、學號,而沒有後續內容的,視為一張空白卷,為有效資訊,不做格式錯誤處理。
樣例:
#T:1 1-5 3-2 2-5 6-9 4-10 7-3
#S:1 20201103 #A:2-5 #A:6-4
1是試卷號
20201103是學號
2-5中的2是試卷中順序號,5是試卷第2題的答案,即T中3-2的答案
6-4中的6是試卷中順序號,4是試卷第6題的答案,即T中7-3的答案
注意:不要混淆順序號與題號
5、刪除題目資訊
刪除題目資訊為獨行輸入,每一行為一條刪除資訊,多條刪除資訊可分多行輸入。該資訊用於刪除一道題目資訊,題目被刪除之後,引用該題目的試卷依然有效,但被刪除的題目將以0分計,同時在輸出答案時,題目內容與答案改為一條失效提示,例如:”the question 2 invalid~0”
格式:"#D:N-"+題目號
格式約束:
題目號與第一項”題目資訊”中的題號相對應,不是試卷中的題目順序號。
本題暫不考慮刪除的題號不存在的情況。
樣例:
#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#X:20201103 Tom-20201104 Jack
#S:1 20201103 #A:1-5 #A:2-4
#D:N-2
end
輸出:
alert: full score of test paper1 is not 100 points
1+1=~5~false
the question 2 invalid~0
20201103 Tom: 0 0~0
答題資訊以一行"end"標記結束,"end"之後的資訊忽略。
輸出格式:
1、試卷總分警示
該部分僅當一張試卷的總分分值不等於100分時作提示之用,試卷依然屬於正常試卷,可用於後面的答題。如果總分等於100 分,該部分忽略,不輸出。
格式:"alert: full score of test paper"+試卷號+" is not 100 points"
約束:有多張試卷時,按輸入資訊的先後順序輸出警示。
樣例:alert: full score of test paper2 is not 100 points
2、答卷資訊
一行為一道題的答題資訊,根據試卷的題目的數量輸出多行資料。
格式:題目內容+"~"+答案++"~"+判題結果(true/false)
約束:如果輸入的答案資訊少於試卷的題目數量,每一個缺失答案的題目都要輸出"answer is null" 。
樣例:
answer is null
3+2=~5~true
4+6=~22~false.
answer is null
3、判分資訊
判分資訊為一行資料,是一條答題記錄所對應試卷的每道小題的計分以及總分,計分輸出的先後順序與題目題號相對應。
格式:學號+" "+姓名+": "+題目得分+" "+....+題目得分+"~"+總分
格式約束:
1、沒有輸入答案的題目、被刪除的題目、答案錯誤的題目計0分
2、判題資訊的順序與輸入答題資訊中的順序相同
樣例:20201103 Tom: 0 0~0
根據輸入的答卷的數量以上2、3項答卷資訊與判分資訊將重複輸出。
4、被刪除的題目提示資訊
當某題目被試卷引用,同時被刪除時,答案中輸出提示資訊。樣例見第5種輸入資訊“刪除題目資訊”。
5、題目引用錯誤提示資訊
試卷錯誤地引用了一道不存在題號的試題,在輸出學生答案時,提示”non-existent question~”加答案。例如:
輸入:
#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103 #A:1-4
end
輸出:
alert: full score of test paper1 is not 100 points
non-existent question~0
20201103 Tom: 0~0
如果答案輸出時,一道題目同時出現答案不存在、引用錯誤題號、題目被刪除,只提示一種資訊,答案不存在的優先順序最高,例如:
輸入:
#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103
end
輸出:
alert: full score of test paper1 is not 100 points
answer is null
20201103 Tom: 0~0
6、格式錯誤提示資訊
輸入資訊只要不符合格式要求,均輸出”wrong format:”+資訊內容。
例如:wrong format:2 #Q:2+2= #4
7、試卷號引用錯誤提示輸出
如果答卷資訊中試卷的編號找不到,則輸出”the test paper number does not exist”,答卷中的答案不用輸出,參見樣例8。
8、學號引用錯誤提示資訊
如果答卷中的學號資訊不在學生列表中,答案照常輸出,判分時提示錯誤。參見樣例9。
本次作業新增內容:
1、輸入選擇題題目資訊
題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。
格式:"#Z:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案
格式基本的約束與一般的題目輸入資訊一致。
新增約束:標準答案中如果包含多個正確答案(多選題),正確答案之間用英文空格分隔。
例如:
#Z:2 #Q:宋代書法有蘇黃米蔡四家,分別是: #A:蘇軾 黃庭堅 米芾 蔡襄
多選題輸出:
輸出格式與一般答卷題目的輸出一致,判斷結果除了true、false,增加一項”partially correct”表示部分正確。
多選題給分方式:
答案包含所有正確答案且不含錯誤答案給滿分;包含一個錯誤答案或完全沒有答案給0分;包含部分正確答案且不含錯誤答案給一半分,如果一半分值為小數,按截尾規則只保留整數部分。
例如:
#N:1 #Q:1+1= #A:2
#Z:2 #Q:黨十八大報告提出要加強()建設。A 政務誠信 B 商務誠信 C社會誠信 D司法公信 #A:A B C D
#T:1 1-5 2-9
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-A C
end
輸出:
alert: full score of test paper1 is not 100 points
1+1=~5~false
黨十八大報告提出要加強()建設。A 政務誠信 B 商務誠信 C社會誠信 D司法公信~A C~partially correct
20201103 Tom: 0 4~4
2、輸入填空題題目資訊
題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。
格式:"#K:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案
格式基本的約束與一般的題目輸入資訊一致。
例如:#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
填空題輸出:
輸出格式與一般答卷題目的輸出一致,判斷結果除了true、false,增加一項”partially correct”表示部分正確。
填空題給分方式:
答案與標準答案內容完全匹配給滿分,包含一個錯誤字元或完全沒有答案給0分,包含部分正確答案且不含錯誤字元給一半分,如果一半分值為小數,按截尾規則只保留整數部分。
例如:
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
#T:1 1-5 2-10
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-瑤琴
end
輸出:
alert: full score of test paper1 is not 100 points
1+1=~5~false
古琴在古代被稱為:~瑤琴~partially correct
20201103 Tom: 0 5~5
3、輸出順序變化
只要是正確格式的資訊,可以以任意的先後順序輸入各類不同的資訊。比如試卷可以出現在題目之前,刪除題目的資訊可以出現在題目之前等。
例如:
#T:1 1-5 2-10
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-古箏
end
輸出:
alert: full score of test paper1 is not 100 points
1+1=~5~false
古琴在古代被稱為:~古箏~false
20201103 Tom: 0 0~0
4、多張試卷資訊
本題考慮多個同學有多張不同試卷的答卷的情況。輸出順序優先順序為學號、試卷號,按從小到大的順序先按學號排序,再按試卷號。
例如:
#T:1 1-5 2-10
#T:2 1-8 2-21
#N:1 #Q:1+1= #A:2
#S:2 20201103 #A:1-2 #A:2-古箏
#S:1 20201103 #A:1-5 #A:2-瑤琴或七絃琴
#S:1 20201104 #A:1-2 #A:2-瑟
#S:2 20201104 #A:1-5 #A:2-七絃琴
#X:20201103 Tom-20201104 Jack
#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
end
輸出:
alert: full score of test paper1 is not 100 points
alert: full score of test paper2 is not 100 points
1+1=~5~false
古琴在古代被稱為:~瑤琴或七絃琴~true
20201103 Tom: 0 10~10
1+1=~2~true
古琴在古代被稱為:~古箏~false
20201103 Tom: 8 0~8
1+1=~2~true
古琴在古代被稱為:~瑟~false
20201104 Jack: 5 0~5
1+1=~5~false
古琴在古代被稱為:~七絃琴~partially correct
20201104 Jack: 0 10~10
新增的題目異常情況的處理與一般題目相同,具體樣例參考上一次大作業的樣例說明:
答題判題程式-3題面.pdf
輸入樣例1:
多選題測試,不含刪除。例如:
#N:1 #Q:1+1= #A:2
#Z:2 #Q:黨十八大報告提出要加強()建設。A 政務誠信 B 商務誠信 C社會誠信 D司法公信 #A:A B C D
#T:1 1-5 2-9
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-A C
end
輸出樣例1:
在這裡給出相應的輸出。例如:
alert: full score of test paper1 is not 100 points
1+1=~5~false
黨十八大報告提出要加強()建設。A 政務誠信 B 商務誠信 C社會誠信 D司法公信~A C~partially correct
20201103 Tom: 0 4~4
輸入樣例2:
填空題測試,不含刪除。例如:
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
#T:1 1-5 2-10
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-瑤琴
end
輸出樣例2:
在這裡給出相應的輸出。例如:
alert: full score of test paper1 is not 100 points
1+1=~5~false
古琴在古代被稱為:~瑤琴~partially correct
20201103 Tom: 0 5~5
輸入樣例3:
亂序測試,不含刪除。例如:
#T:1 1-5 2-10
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-古箏
end
輸出樣例3:
在這裡給出相應的輸出。例如:
alert: full score of test paper1 is not 100 points
1+1=~5~false
古琴在古代被稱為:~古箏~false
20201103 Tom: 0 0~0
輸入樣例4:
兩個同學多張不同試卷的答卷,不含刪除。例如:
#T:1 1-5 2-10
#T:2 1-8 2-21
#N:1 #Q:1+1= #A:2
#S:2 20201103 #A:1-2 #A:2-古箏
#S:1 20201104 #A:1-2 #A:2-瑟
#S:1 20201103 #A:1-5 #A:2-瑤琴或七絃琴
#S:2 20201104 #A:1-5 #A:2-七絃琴
#X:20201103 Tom-20201104 Jack
#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
end
輸出樣例4:
在這裡給出相應的輸出。例如:
alert: full score of test paper1 is not 100 points
alert: full score of test paper2 is not 100 points
1+1=~5~false
古琴在古代被稱為:~瑤琴或七絃琴~true
20201103 Tom: 0 10~10
1+1=~2~true
古琴在古代被稱為:~古箏~false
20201103 Tom: 8 0~8
1+1=~2~true
古琴在古代被稱為:~瑟~false
20201104 Jack: 5 0~5
1+1=~5~false
古琴在古代被稱為:~七絃琴~partially correct
20201104 Jack: 0 10~10
b.題目概括:這個題目就是對於前三次的opp的最後一次的擴充,接下來分析一下題目。
首先,本題目相比於上一次的題目增加了填空題和多選題的題目樣例,這個就是最為突出的地方。這個也是這個題目中比較難的一點,既要考慮到多選問題,還要考慮到的就是填空題的答案的真確與否,最突出的就是填空題的中答案多一個字的種種情況,之後分析,其他的的情況就是之前的題目集的的情況是一樣的,包括輸入的情況和輸出的情況,但是要注意的是就是填空題和多選題的輸入和輸出
多選題的輸入情況:
題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。
格式:"#Z:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案
多選題的輸出情況:
多選題輸出:
輸出格式與一般答卷題目的輸出一致,判斷結果除了true、false,增加一項”partially correct”表示部分正確。
填空題的輸出入情況:
題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。
格式:"#K:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案
格式基本的約束與一般的題目輸入資訊一致。
例如:#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
填空題的輸出情況:
填空題輸出:
輸出格式與一般答卷題目的輸出一致,判斷結果除了true、false,增加一項”partially correct”表示部分正確。
這些就是這個題目的主要新增,主要的注意事項看第一次的blog中的第三題可見。
c.題目分析以及解答方式:最主要的分析就是看題目中的輸入的情況,而這些中只用看新增加的題目樣式,這個在題目的解析中也已經有了情況。
對於多選題的情況:首先就是要識別編號,這個是要在之後的情況分析中的題號的情況,然後就是要看的就是標準的答案,這個是對於分數的計算,分數的計算可以透過輸出的true和false等的情況來計算分數,這個是之前的單選題目的思維,但是在這個的的基礎上加上第三種情況。而輸出的就是在題目概括中的輸出。
對於填空題的情況:填空題的情況就是識別文字了,我覺得這個最難的點就是這個,也是在這個過程中最大的坑點,(這個坑我踩了好多次,之後會分析)然後的填空題的輸出其實和多選題的輸出的問題就是一樣的了,而在這個的過程中,我的之前的識別是想看是否包含在裡面,例如:“#Q:古琴在古代被稱為: #A:瑤琴或七絃琴”;如果作答是:瑤琴,這個就是半對,但是如果作答是:瑤琴-,這個答案如果是這樣的話,用識別的方法就是會判斷是正確的,但是其實的錯誤的。這就是我一直踩坑的點。這個如果是全對但是帶有別的字或者是其他的識別符號,這樣也是有問題。
對於統計分數的情況:分數的統計就是相對來說的比較簡單的情況,可以先判斷是true,false還是partially correct的情況再將這個分數儲存在一個Arraylist的陣列中,這個陣列就是專門用來統計分數的陣列,然後的再將這個陣列進行加和,輸出總分。
接下來看一下我的類圖,因為在一些類中的方法有點長,所以展示的就是將一些類中的某些方法進行了精簡。
展示:
SourceMontor展示:
對於我的程式碼中,一直以來的問題就是複雜度太高,這個是我最大的問題之一,這個一定要改!!!(看那個9+的高度,嗚嗚嗚)
接下來是部分程式碼的展示:
Scanner in = new Scanner(System.in);
ArrayList<String> lines = new ArrayList<String>();//用來儲存全部輸入
ArrayList<String> lineN = new ArrayList<String>();//這個是帶N的行輸入,如果說lines中有帶N的元素,就方在這裡面,但是要符合。
ArrayList<String> lineT = new ArrayList<String>();//這個是帶T
ArrayList<String> lineX = new ArrayList<String>();//帶X
ArrayList<String> lineS = new ArrayList<String>();//帶S
ArrayList<String> lineD = new ArrayList<String>();//帶D
ArrayList<String> line1 = new ArrayList<String>();//這是不符合要求的元素
ArrayList<String> lineNcontent = new ArrayList<String>();//N全存
ArrayList<String> lineXid = new ArrayList<String>();//X的學號
ArrayList<String> lineXname = new ArrayList<String>();//X的姓名
ArrayList<String> lineDdelete = new ArrayList<String>();//D中的刪除
//上面全是定義的List陣列
Match match = new Match();//匹配的類
SplitArray splitArray = new SplitArray(lineN , lineT , lineX , lineS , lineD);//分割的類
while(true) {//把所有輸入都放進一個變長陣列中
String str = in.nextLine();
if(str.equals("end")) {
break;
}
lines.add(str);
}
public ArrayList<String> SplitlineN(ArrayList<String> lineNcontent) {//將N的分為全存的
for(int i = 0 ; i < lineN.size() ; i ++) {
temp = lineN.get(i).split("\\s|#N:|#Q:|#A:");
for(int j = 1 ; j < temp.length ; j += 2 ) {//改成+=2
lineNcontent.add(temp[j]);
}
}
return lineNcontent;
}
public ArrayList<String> SplitlineT1(ArrayList<String> lineTcontent , int n) {//將T的先分
temp = lineT.get(n).split("\\s|#T:");
for(int j = 1 ; j < temp.length ; j ++ ) {
lineTcontent.add(temp[j]);
}
return lineTcontent;
}
public ArrayList<String> SplitlineT2(ArrayList<String> lineTcontent , ArrayList<String> lineTquestion){//分出T題目號
for(int i = 1 ; i < lineTcontent.size() ; i ++ ) {
temp = lineTcontent.get(i).split("-");
lineTquestion.add(temp[0]);
}
return lineTquestion;
}
public ArrayList<String> findwhere(ArrayList<String> n) {//找到試卷在那個T中的位置
for(int i = 0 ; i < lineTcontent.size() ; i++ ) {
if(!lineTcontent.get(i).matches("-")) {
n.add(String.valueOf(i));
}
}
return n;
}
public void judgesocer() {//判斷分數
ArrayList<String> n = new ArrayList<String>();
findwhere(n);
int sum = 0;
for(int j = 0 ; j < n.size() ; j ++) {
for(int i = 0 ; i < lineTscore.size() ; i ++) {
sum += Integer.parseInt(lineTscore.get(i));
}
}
if(sum != 100) {
System.out.println("alert: full score of test paper" + 1 + " is not 100 points");
}
}
public void judgeD() {//判斷刪除的,標記
for(int i = 0 ; i < lineDdelete.size() ; i ++) {
for(int j = 0 ; j < lineNcontent.size() ; j += 3) {
if(lineDdelete.get(i).equals(lineNcontent.get(j))) {
lineNcontent.set(j , "no");
}
}
}
}
public void backD() {
for(int i = 0 ; i < lineDdelete.size() ; i ++) {
lineNcontent.set((Integer.parseInt(lineDdelete.get(i)) - 1) * 3 , lineDdelete.get(i));
}
}
d、本題小總結:整體的難度還是挺大的,主要就是在多選題和填空題的識別和判斷中的問題。這個也是這個問題的重點和難點。坑點也很多,我遇到的最大的問題就是對於多選和填空中的對於答案的識別問題,然後就是判斷。整體來說,難度有,得花時間去寫。還要花時間去整理程式碼以及對於程式碼的複雜度問題。
3.題目二:
對於題目二中,題目二是新的題型,這個題型就是電路的分析以及實現,這個也是一個迭代的主要體型。等下會進行第一次的題目的資訊以及的分析。
a.題目描述:
7-1 家居強電電路模擬程式-1
智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。
1、控制裝置模擬
本題模擬的控制裝置包括:開關、分檔調速器、連續調速器。
開關:包括0和1兩種狀態。
開關有兩個引腳,任意一個引腳都可以是輸入引腳,而另一個則是輸出引腳。開關狀態為0時,無論輸入電位是多少,輸出引腳電位為0。當開關狀態為1時,輸出引腳電位等於輸入電位。
分檔調速器
按檔位調整,常見的有3檔、4檔、5檔調速器,檔位值從0檔-2(3/4)檔變化。本次迭代模擬4檔調速器,每個檔位的輸出電位分別為0、0.3、0.6、0.9倍的輸入電壓。
連續調速器
沒有固定檔位,按位置比例得到檔位引數,數值範圍在[0.00-1.00]之間,含兩位小數。輸出電位為檔位引數乘以輸入電壓。
所有調速器都有兩個引腳,一個固定的輸入(引腳編號為1)、一個輸出引腳(引腳編號為2)。當輸入電位為0時,輸出引腳輸出的電位固定為0,不受各類開關調節的影響。
所有控制裝置的初始狀態/檔位為0。
控制裝置的輸入引腳編號為1,輸出引腳編號為2。
2、受控裝置模擬
本題模擬的受控裝置包括:燈、風扇。兩種裝置都有兩根引腳,透過兩根引腳電壓的電壓差驅動裝置工作。
燈有兩種工作狀態:亮、滅。在亮的狀態下,有的燈會因引腳電位差的不同亮度會有區別。
風扇在接電後有兩種工作狀態:停止、轉動。風扇的轉速會因引腳的電位差的不同而有區別。
本次迭代模擬兩種燈具。
白熾燈:
亮度在0~200lux(流明)之間。
電位差為0-9V時亮度為0,其他電位差按比例,電位差10V對應50ux,220V對應200lux,其他電位差與對應亮度值成正比。白熾燈超過220V。
日光燈:
亮度為180lux。
只有兩種狀態,電位差為0時,亮度為0,電位差不為0,亮度為180。
本次迭代模擬一種吊扇。
工作電壓區間為80V-150V,對應轉速區間為80-360轉/分鐘。80V對應轉速為80轉/分鐘,150V對應轉速為360轉/分鐘,超過150V轉速為360轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)。其他電壓值與轉速成正比,輸入輸出電位差小於80V時轉速為0。
輸入資訊:
1、裝置資訊
分別用裝置識別符號K、F、L、B、R、D分別表示開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇。
裝置標識用識別符號+編號表示,如K1、F3、L2等。
引腳格式:裝置標識-引腳編號,例如:K1-1標識編號為1的開關的輸入引腳。
三種控制開關的輸入引腳編號為1,輸出引腳編號為2。
受控裝置的兩個引腳編號分別為1、2。
約束條件:
不同裝置的編號可以相同。
同種裝置的編號可以不連續。
裝置資訊不單獨輸入,包含在連線資訊中。
2、連線資訊
一條連線資訊佔一行,用[]表示一組連線在一起的裝置引腳,引腳與引腳之間用英文空格" "分隔。
格式:"["+引腳號+" "+...+" "+引腳號+"]"
例如:[K1-1 K3-2 D5-1]表示K1的輸入引腳,K3的輸出引腳,D5的1號引腳連線在一起。
約束條件:
本次迭代不考慮兩個輸出引腳短接的情況
考慮調速器輸出串聯到其他控制裝置(開關)的情況
不考慮調速器串聯到其他調速器的情況。
不考慮各類控制裝置的並聯接入或反饋接入。例如,K1的輸出接到L2的輸入,L2的輸出再接其他裝置屬於串聯接線。K1的輸出接到L2的輸出,同時K1的輸入接到L2的輸入,這種情況屬於並聯。K1的輸出接到L2的輸入,K1的輸入接到L2的輸出,屬於反饋接線。
3、控制裝置調節資訊
開關調節資訊格式:
#+裝置標識K+裝置編號,例如:#K2,代表切換K2開關的狀態。
分檔調速器的調節資訊格式:
#+裝置標識F+裝置編號+"+" 代表加一檔,例如:#F3+,代表F3輸出加一檔。
#+裝置標識F+裝置編號+"-" 代表減一檔,例如:#F1-,代表F1輸出減一檔。
連續調速器的調節資訊格式:
#+裝置標識L+裝置編號+":" +數值 代表將連續調速器的檔位設定到對應數值,例如:#L3:0.6,代表L3輸出檔位引數0.6。
4、電源接地標識:VCC,電壓220V,GND,電壓0V。沒有接線的引腳預設接地,電壓為0V。
輸入資訊以end為結束標誌,忽略end之後的輸入資訊。
輸出資訊:
按開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇的順序依次輸出所有裝置的狀態或引數。每個裝置一行。同類裝置按編號順序從小到大輸出。
輸出格式:@裝置標識+裝置編號+":" +裝置引數值(控制開關的檔位或狀態、燈的亮度、風扇的轉速,只輸出值,不輸出單位)
連續調速器的檔位資訊保留兩位小數,即使小數為0,依然顯示兩位小數.00。
開關狀態為0(開啟)時顯示turned on,狀態為1(合上)時顯示closed
如:
@K1:turned on
@B1:190
@L1:0.60
本題不考慮輸入電壓或電壓差超過220V的情況。
本題只考慮串聯的形式,所以所有測試用例的所有連線資訊都只包含兩個引腳
本題電路中除了開關可能出現多個,其他電路裝置均只出現一次。
電源VCC一定是第一個連線的第一項,接地GND一定是最後一個連線的後一項。
家居電路模擬系列所有題目的預設規則:
1、當計算電壓值等數值的過程中,最終結果出現小數時,用截尾規則去掉小數部分,只保留整數部分。為避免精度的誤差,所有有可能出現小數的數值用double型別儲存並計算,不要作下轉型資料型別轉換,例如電壓、轉速、亮度等,只有在最後輸出時再把計算結果按截尾規則,捨棄尾數,保留整數輸出。
2、所有連線資訊按電路從電源到接地的順序依次輸入,不會出現錯位的情況。
3、連線資訊如果只包含兩個引腳,靠電源端的引腳在前,靠接地端的在後。
4、對於調速器,其輸入端只會直連VCC,不會接其他裝置。整個電路中最多隻有一個調速器,且連線在電源上。
家居電路模擬系列1-4題目後續迭代設計:
1、電路結構變化:
迭代1:只有一條線路,所有元件串聯
迭代2:線路中包含一個並聯電路
迭代3:線路中包含多個串聯起來的並聯電路
迭代4:並聯電路之間可能出現包含關係
電路結構變化示意圖見圖1。
2、輸入資訊的變化
串聯線路資訊:用於記錄一段串聯電路的元件與連線資訊。
例如: #T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[VCC T1-1] [T1-2 M1-IN] [M1-OUT D2-1] [D2-2 GND]
並聯線路資訊:用於記錄一段並聯電路所包含的所有串聯電路資訊。
例如:#M1:[T1 T2 T3]
3、計算方式的變化
迭代1只包含1個受控元件,不用計算電流,之後的電路計算要包含電流、電阻等電路引數。
4、電路元件的變化
每次迭代會增加1-2個新的電路元件。
image.png
圖1:電路結構示意圖
設計建議:
1、電路裝置類:描述所有電路裝置的公共特徵。
2、受控裝置類、控制裝置類:對應受控、控制裝置
3、串聯電路類:一條由多個電路裝置構成的串聯電路,也看成是一個獨立的電路裝置
其他類以及類的屬性、方法自行設計。
image.png
圖2:建議設計類圖
輸入樣例1:
在這裡給出一組輸入。例如:
[VCC K1-1]
[K1-2 D2-1]
[D2-2 GND]
#K1
end
輸出樣例1:
在這裡給出相應的輸出。例如:
@K1:closed
@D2:360
輸入樣例2:
在這裡給出一組輸入。例如:
[VCC K1-1]
[K1-2 D2-1]
[D2-2 GND]
#K1
#K1
end
輸出樣例2:
在這裡給出相應的輸出。例如:
@K1:turned on
@D2:0
輸入樣例3:
在這裡給出一組輸入。例如:
[VCC F1-1]
[F1-2 D2-1]
[D2-2 GND]
#F1+
end
輸出樣例3:
在這裡給出相應的輸出。例如:
@F1:1
@D2:0
輸入樣例4:
在這裡給出一組輸入。例如:
[VCC F1-1]
[F1-2 D2-1]
[D2-2 GND]
#F1+
#F1+
end
輸出樣例4:
在這裡給出相應的輸出。例如:
@F1:2
@D2:288
輸入樣例5:
在這裡給出一組輸入。例如:
[VCC F1-1]
[F1-2 D2-1]
[D2-2 GND]
#F1+
#F1+
#F1+
end
輸出樣例5:
在這裡給出相應的輸出。例如:
@F1:3
@D2:360
輸入樣例6:
在這裡給出一組輸入。例如:
[VCC L1-1]
[L1-2 D2-1]
[D2-2 GND]
#L1:1.00
end
輸出樣例6:
在這裡給出相應的輸出。例如:
@L1:1.00
@D2:360
輸入樣例7:
在這裡給出一組輸入。例如:
[VCC L1-1]
[L1-2 D2-1]
[D2-2 GND]
#L1:0.68
end
輸出樣例7:
在這裡給出相應的輸出。例如:
@L1:0.68
@D2:358
輸入樣例8:
在這裡給出一組輸入。例如:
[VCC L1-1]
[L1-2 B2-1]
[B2-2 GND]
#L1:0.68
end
輸出樣例8:
在這裡給出相應的輸出。例如:
@L1:0.68
@B2:149
輸入樣例9:
在這裡給出一組輸入。例如:
[VCC L1-1]
[L1-2 B2-1]
[B2-2 GND]
#L1:1.00
end
輸出樣例9:
在這裡給出相應的輸出。例如:
@L1:1.00
@B2:200
輸入樣例10:
在這裡給出一組輸入。例如:
[VCC L1-1]
[L1-2 R2-1]
[R2-2 GND]
#L1:1.00
end
輸出樣例10:
在這裡給出相應的輸出。例如:
@L1:1.00
@R2:180
程式碼長度限制
50 KB
時間限制
1000 ms
記憶體限制
64 MB
棧限制
8192 KB
b.題目概括:這個題目較為簡單,最直觀的問題就是三個電器和三個控制器,本次的問題就是串聯電路中的電器,控制器的不同情況,以及輸出的情況。三種電器分別為日光燈,白熾燈和吊扇,前兩個是輸出的亮度,後面的一個就是轉速。三種控制器分別是連續調速器、分檔調速器以及開關,其中前兩個的主要的功能是對於的電壓的調節,開關的主要功能就是對於電路的電壓的有無。其中有一些的重要的細節,之前沒注意到這些細節,導致之後出現了很多的問題。這個在之後會也會細講。
c.題目分析以及解答方式:題目的主要的就是一個電源,多個用電器,多個控制器,接下來就是兩個非常大的坑點,一開始的時候就踩了這兩個坑點,首先就是第一個坑點,其實我覺得不叫坑點,因為這個在實際的生活中是有實際的現象的,這個坑點就是連續變速器和分檔變速器這兩個只能存在一個。第二個坑點就是可以有兩個以及以上的開關,這個是最大的一個問題,之前就是隻考慮了一種情況,就是隻有一個開關的情況。這個到之後就會出問題。這個題目的解決的點就是先算電壓,然後在進行計算每一個電器的輸出,日光燈和白熾燈是亮度,吊扇是轉速。最後在按順序輸出控制器和電器的狀態,控制器輸出狀態,連續變速器和分擋變速器輸出相應的擋位,開關輸出相應的狀態。接下來看輸入和輸出的例子:
輸入:
一條連線資訊佔一行,用[]表示一組連線在一起的裝置引腳,引腳與引腳之間用英文空格" "分隔。
格式:"["+引腳號+" "+...+" "+引腳號+"]"
例如:[K1-1 K3-2 D5-1]表示K1的輸入引腳,K3的輸出引腳,D5的1號引腳連線在一起。
輸出:
按開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇的順序依次輸出所有裝置的狀態或引數。每個裝置一行。同類裝置按編號順序從小到大輸出。
輸出格式:@裝置標識+裝置編號+":" +裝置引數值(控制開關的檔位或狀態、燈的亮度、風扇的轉速,只輸出值,不輸出單位)
連續調速器的檔位資訊保留兩位小數,即使小數為0,依然顯示兩位小數.00。
開關狀態為0(開啟)時顯示turned on,狀態為1(合上)時顯示closed
如:
@K1:turned on
@B1:190
@L1:0.60
接下來就是我的類圖和SourceMontor展示:
SourceMontor展示:
這個程式碼複雜度是下降了一些,接下來看我的部分程式碼:
Split_input split = new Split_input(lines);
ArrayList<String> E = split.Split_E();
ArrayList<String> C = split.Split_C();
ArrayList<String> K = split.Split_K();
ArrayList<String> F = split.Split_F();
ArrayList<String> L = split.Split_L();
ArrayList<String> B = split.Split_B();
ArrayList<String> R = split.Split_R();
ArrayList<String> D = split.Split_D();
int num_K = split.num_K(C);
int num_F = split.num_F(C);
double num_L = split.num_L(C);
double voltage = 220;
for(int i = 0 ; i < K.size(); i ++) {
Switchs switchs = new Switchs(K.get(i) , num_K);
switchs.Show();
}
for(int i = 0 ; i < F.size() ; i ++ ) {
F_control f_control = new F_control(F.get(i) , 0 , num_F);
f_control.Judge_gear();
f_control.Show();
}
for(int i = 0 ; i < L.size() ; i ++ ) {
L_control l_control = new L_control(L.get(i), num_L);
l_control.Show();
}
if(L.size() == 0 &&F.size() == 0){
Calculation calculation = new Calculation(num_K , 0, 0, voltage);
voltage = calculation.Judge_state();
for(int i = 0 ; i < B.size() ; i ++ ) {
Filament filament = new Filament(B.get(i) , voltage);
filament.Show();
}
for(int i = 0 ; i < R.size() ; i ++ ) {
Fluorescent fluorescent = new Fluorescent(R.get(i), voltage);
fluorescent.Show();
}
for(int i = 0 ; i < D.size() ; i ++ ) {
Fan fan = new Fan(D.get(i), voltage);
fan.Show();
}
}
public ArrayList<String> Split_K() {
ArrayList<String> K = new ArrayList<String>();
for(int i = 1 ; i < Split_E().size() - 1 ; i ++) {
if(Split_E().get(i).contains("K")) {
String[] Str = Split_E().get(i).split("-");
K.add(Str[0]);
i++;
}
}
return K;
}
public ArrayList<String> Split_F() {
ArrayList<String> F = new ArrayList<String>();
for(int i = 1 ; i < Split_E().size() - 1 ; i ++) {
if(Split_E().get(i).contains("F")) {
String[] Str = Split_E().get(i).split("-");
F.add(Str[0]);
i++;
}
}
return F;
}
public ArrayList<String> Split_L() {
ArrayList<String> L = new ArrayList<String>();
for(int i = 1 ; i < Split_E().size() - 1 ; i ++) {
if(Split_E().get(i).contains("L")) {
String[] Str = Split_E().get(i).split("-");
L.add(Str[0]);
i++;
}
}
return L;
}
d、本題小總結:這個題目比較簡單,有一點邏輯關係就可以直接寫出來,只先是考慮一種簡單的串聯電路的情況,之後迭代的情況是更加有難度的,主要的就是注意單一職責原則,使程式碼的可擴充套件性更加強一點,之後的可以將本次的程式碼進行延申,接下來的第三次的opp題目就可以直接用上面的一些類的關係。
4.題目三:
題目三是對於題目二的第一次的迭代,這個題就是電路的分析以及實現,這個題目的是前一題中將串聯的電路迭代成本次的有簡單的並聯電路以及串聯電路,這讓本體有了一個新型的高度。
a.題目描述:
7-1 家居強電電路模擬程式-2
智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。以下題目介紹中加粗的部分為本次迭代在“家居強電電路模擬程式-1”的基礎上增加的功能要求。
1、控制裝置
本題模擬的控制裝置包括:開關、分檔調速器、連續調速器。
開關:包括0和1兩種狀態。
開關有兩個引腳,任意一個引腳都可以是輸入引腳,而另一個則是輸出引腳。開關狀態為0時,無論輸入電位是多少,輸出引腳電位為0。當開關狀態為1時,輸出引腳電位等於輸入電位。
分檔調速器
按檔位調整,常見的有3檔、4檔、5檔調速器,檔位值從0檔-2(3/4)檔變化。本次迭代模擬4檔調速器,每個檔位的輸出電位分別為0、0.3、0.6、0.9倍的輸入電壓。
連續調速器
沒有固定檔位,按位置比例得到檔位引數,數值範圍在[0.00-1.00]之間,含兩位小數。輸出電位為檔位引數乘以輸入電壓。
所有調速器都有兩個引腳,一個固定的輸入(引腳編號為1)、一個輸出引腳(引腳編號為2)。當輸入電位為0時,輸出引腳輸出的電位固定為0,不受各類開關調節的影響。
所有控制裝置的初始狀態/檔位為0。
控制裝置的輸入引腳編號為1,輸出引腳編號為2。
所有開關的電阻為 0。
2、受控裝置
本題模擬的受控裝置包括:燈、風扇。兩種裝置都有兩根引腳,透過兩根引腳電壓的電壓差驅動裝置工作。
燈有兩種工作狀態:亮、滅。在亮的狀態下,有的燈會因引腳電位差的不同亮度會有區別。
風扇在接電後有兩種工作狀態:停止、轉動。風扇的轉速會因引腳間電位差的不同而有區別。
本次迭代模擬兩種燈具。
白熾燈:
亮度在0~200lux(流明)之間。
電位差為0-9V時亮度為0,其他電位差按比例,電位差10V對應50ux,220V對應200lux,其他電位差與對應亮度值成正比。白熾燈超過220V。
日光燈:
亮度為180lux。
只有兩種狀態,電位差為0時,亮度為0,電位差不為0,亮度為180。
本次迭代模擬一種吊扇。
工作電壓區間為80V-150V,對應轉速區間為80-360轉/分鐘。80V對應轉速為80轉/分鐘,150V對應轉速為360轉/分鐘,超過150V轉速為360轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)。其他電壓值與轉速成正比,輸入輸出電位差小於80V時轉速為0。
本次迭代模擬一種落地扇。
工作電壓區間為 [80V,150V],對應轉速區間為 80-360 轉/分鐘。電壓在[80,100)V 區間對應轉速為 80 轉/分 鍾,[100-120)V 區間對應轉速為 160 轉/分鐘,[120-140)V 區間對應轉速為 260 轉/分鐘,超過 140V 轉速 為 360 轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)輸入資訊:
本次迭代考慮電阻:白熾燈的電阻為 10,日光燈的電阻為 5,吊扇的電阻為 20,落 地扇的電阻為 20
3、輸入資訊
1)輸入裝置資訊
分別用裝置識別符號K、F、L、B、R、D、A分別表示開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇、落地扇。
裝置標識用識別符號+編號表示,如K1、F3、L2等。
引腳格式:裝置標識-引腳編號,例如:K1-1標識編號為1的開關的輸入引腳。
三種控制開關的輸入引腳編號為1,輸出引腳編號為2。
受控裝置的兩個引腳編號分別為1、2。
約束條件:
不同裝置的編號可以相同。
同種裝置的編號可以不連續。
裝置資訊不單獨輸入,包含在連線資訊中。
2)輸入連線資訊
一條連線資訊佔一行,用[]表示一組連線在一起的裝置引腳,引腳與引腳之間用英文空格" "分隔。
格式:"["+引腳號+" "+...+" "+引腳號+"]"
例如:[K1-1 K3-2 D5-1]表示K1的輸入引腳,K3的輸出引腳,D5的1號引腳連線在一起。
約束條件:
不考慮調速器串聯到其他調速器的情況。
不考慮調速器串聯到其他調速器的情況。
考慮各類裝置的並聯接入。例如,K1 的輸出接到 L2 的輸入,L2 的輸出再接其他裝置屬於串聯接線。K1 的輸出接到 L2 的輸出,同時 K1 的輸入接到 L2 的輸入,這種情況屬於並聯。
本次迭代的連線資訊不單獨輸入,包含線上路資訊中。
3)輸入控制裝置調節資訊
開關調節資訊格式:
#+裝置標識K+裝置編號,例如:#K2,代表切換K2開關的狀態。
分檔調速器的調節資訊格式:
#+裝置標識F+裝置編號+"+" 代表加一檔,例如:#F3+,代表F3輸出加一檔。
#+裝置標識F+裝置編號+"-" 代表減一檔,例如:#F1-,代表F1輸出減一檔。
連續調速器的調節資訊格式:
#+裝置標識L+裝置編號+":" +數值 代表將連續調速器的檔位設定到對應數值,例如:#L3:0.6,代表L3輸出檔位引數0.6。
4)電源接地標識:
VCC,電壓220V,GND,電壓0V。沒有接線的引腳預設接地,電壓為0V。
5)輸入串聯電路資訊
一條串聯電路佔一行,串聯電路由按從靠電源端到接地端順序依次輸入的 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]
6)輸入並聯電路資訊
一條並聯電路佔一行,並聯電路由其包含的幾條串聯電路組成,串聯電路標識之間用英文空格" "分隔。
格式:
"#M"+電路編號+":"+”[”+串聯電路資訊+" "+....+" "+串聯電路資訊+”]”
例如:#M1:[T1 T2 T3]
該例宣告瞭一個並聯電路,由 T1、T2、T3 三條串聯電路並聯而成,三條串聯電路的 IN 短 接在一起構成 M1 的 IN,三條串聯電路的 OUT 短接在一起構成 M1 的 OUT。
約束條件:
本次迭代不考慮並聯電路中包含並聯電路的情況,也不考慮多個並聯電路串聯的情況。
本題不考慮輸入電壓或電壓差超過220V的情況。
輸入資訊以end為結束標誌,忽略end之後的輸入資訊。
本題中的並聯資訊所包含的串聯電路的資訊都在並聯資訊之前輸入,不考慮亂序輸入的情況。
電路中的短路如果不會在電路中產生無窮大的電流燒壞電路,都是合理情況,在本題測試點的考慮範圍之內。
本題不考慮一條串聯電路中包含其他串聯電路的情況。例如:
#T3:[VCC K1-1] [K1-2 T2-IN] [T2-OUT K2-1] [K2-2 T1-IN] [T1-OUT GND]
本例中T1\T2兩條串聯電路實際是T3的一個部分,本題不考慮這種型別的輸入,而是當將T1\T2的所有連線資訊直接包含在T3中定義。
下次迭代中需要考慮這種型別的輸入。
4、輸出資訊:
按開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇、落地扇的順序依次輸出所有裝置的狀態或引數。每個裝置一行。同類裝置按編號順序從小到大輸出。
輸出格式:@裝置標識+裝置編號+":" +裝置引數值(控制開關的檔位或狀態、燈的亮度、風扇的轉速,只輸出值,不輸出單位)
連續調速器的檔位資訊保留兩位小數,即使小數為0,依然顯示兩位小數.00。
開關狀態為0(開啟)時顯示turned on,狀態為1(合上)時顯示closed
如:
@K1:turned on
@B1:190
@L1:0.60
5、家居電路模擬系列所有題目的預設規則:
1)當計算電壓值等數值的過程中,最終結果出現小數時,用截尾規則去掉小數部分,只保留整數部分。為避免精度的誤差,所有有可能出現小數的數值用double型別儲存並計算,不要作下轉型資料型別轉換,例如電壓、轉速、亮度等,只有在最後輸出時再把計算結果按截尾規則,捨棄尾數,保留整數輸出。
2)所有連線資訊按電路從電源到接地的順序依次輸入,不會出現錯位的情況。電源VCC一定是第一個連線的第一項,接地GND一定是最後一個連線的後一項。
3)連線資訊如果只包含兩個引腳,靠電源端的引腳在前,靠接地端的在後。
4)調速器的輸入端只會直連VCC,不會接其他裝置。整個電路最多隻有連線在電源上的一個調速器,且不包含在並聯單路中。
6、家居電路模擬系列1-4題目後續迭代設計:
1)電路結構變化:
迭代1:只有一條線路,所有元件串聯
迭代2:線路中包含一個並聯電路
迭代3:線路中包含多個串聯起來的並聯電路
迭代4:並聯電路之間可能出現包含關係
電路結構變化示意圖見圖1。
2)計算方式的變化
迭代1只包含1個受控元件,不用計算電流,之後的電路計算要包含電流、電阻等電路引數。
3)電路元件的變化
每次迭代會增加1-2個新的電路元件。
image.png
圖1:電路結構示意圖
設計建議:
1、電路裝置類:描述所有電路裝置的公共特徵。
2、受控裝置類、控制裝置類:對應受控、控制裝置
3、串聯電路類:一條由多個電路裝置構成的串聯電路,也看成是一個獨立的電路裝置
4、並聯電路類:繼承電路裝置類,也看成是一個獨立的電路裝置
其他類以及類的屬性、方法自行設計。
image.png
圖2:建議設計類圖
輸入格式:
請在這裡寫輸入格式。例如:輸入在一行中給出2個絕對值不超過1000的整數A和B。
輸出格式:
請在這裡描述輸出格式。例如:對每一組輸入,在一行中輸出A+B的值。
輸入樣例1:
在這裡給出一組輸入。例如:
#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
end
輸出樣例1:
在這裡給出相應的輸出。例如:
@K1:closed
@K2:turned on
@L1:0.00
@D1:0
@D2:0
@D3:0
輸入樣例2:
在這裡給出一組輸入。例如:
#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
#L1:1.00
end
輸出樣例2:
在這裡給出相應的輸出。例如:
@K1:closed
@K2:turned on
@L1:1.00
@D1:0
@D2:200
@D3:200
輸入樣例3:
在這裡給出一組輸入。例如:
#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
#K2
#L1:1.00
end
輸出樣例3:
在這裡給出相應的輸出。例如:
@K1:closed
@K2:closed
@L1:1.00
@D1:0
@D2:0
@D3:346
程式碼長度限制
40 KB
時間限制
1000 ms
記憶體限制
64 MB
棧限制
8192 KB
b.題目概括:在之前就講了本次題目是前一題的延申,題目中的具體的新增就多加了一個電器落地扇,這個電器參加串聯和並聯的電路,本題主要就是並聯電路的情況,這次的情況就只有一個並聯電路,在並聯電路中的沒有混聯電路,只有是帶有開關的單條電路。這些就是一個簡單的題目的資訊。在這個題目中就是新加的輸入情況,就是直接加上了在並聯的情況的輸入M。其實在這個題目集中,就是用將這個存入一個簡單的Arraylist的陣列中,再進行讀出。因為這個題目的請款只是有一個並聯電路的請款,但是在之後的題目的迭代中,會出現多個並聯的情況,這個就是在之後就可以多次呼叫儲存的類,進行實現。
c.題目分析以及解答方式:接下來先對這些題目進行一些細節分析。第一:這個所有的電路和之前一樣,只有一個分檔變速器和連續變速器。第二:整個電路中只有在串聯中的地方才有連續和分檔的調速器。第三:整個電路中在串聯部分可以有開關,也可以沒有;在並聯電路中的沒一條路中,可以沒有開關,但是要有吊扇,日光燈,白熾燈,落地扇其中的一個或者一個以上的電器。第四:在這個電路中,並聯電路中的每一條的開關可以全部開啟,這樣只是一種特殊情況。
細節就主要是這麼多,這個題目的輸入和輸出其實和之前是差不多的。只是輸入有一點不同,如下:
"#M"+電路編號+":"+”[”+串聯電路資訊+" "+....+" "+串聯電路資訊+”]”
例如:#M1:[T1 T2 T3]
該例宣告瞭一個並聯電路,由 T1、T2、T3 三條串聯電路並聯而成,三條串聯電路的 IN 短 接在一起構成 M1 的 IN,三條串聯電路的 OUT 短接在一起構成 M1 的 OUT。
這個輸入就只是加了並聯的情況,這個情況在前面就說過來,只用將M中的資訊傳入到一個Arraylist的陣列中。這個主要的情況就是識別並聯的情況。
其他的情況就用一個樣例的輸入和輸出進行解釋:
在這裡給出一組輸入。例如:
#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
#K2
#L1:1.00
end
在這裡給出相應的輸出。例如:
@K1:closed
@K2:closed
@L1:1.00
@D1:0
@D2:0
@D3:346
輸入的電器中就只有加了M,區分串聯和並聯情況,和前一次的情況就是大差不差的;輸出情況也是一樣,和前一次的情況是一樣的,只是加了一個電器,輸出的順序和前一次是一樣的
接下來就是我的類圖和SourceMontor展示:
對於這個程式碼的類圖,其實就是有一點複雜,其實有些類是可以直接合並的情況。
接下來就是SourceMontor展示:
本次的程式碼多了好幾種對於並聯的情況進行分析和變化的情況,但是這個的高迴圈的複雜度降低了好多。
接下來是部分程式碼的展示:
ArrayList<String> P_Resistance = new ArrayList<String>();//並聯分支中的分支電阻
ArrayList<String> P_statement = new ArrayList<String>();//判斷分支中的狀態,是閉合還是斷開
for(int i = 0; i < list_P.size(); i++){
ArrayList<String> P = split_input.Split_P(i);//並聯分支一條分割
Agent_Parallel agent_parallel = new Agent_Parallel(P);
ArrayList<String> P_K = agent_parallel.list_P_K();//並聯中的開關數
ArrayList<String> P_B = agent_parallel.list_P_B();//白熾燈數目
ArrayList<String> P_R = agent_parallel.list_P_R();//日光燈數目
ArrayList<String> P_D = agent_parallel.list_P_D();//吊扇的數目
ArrayList<String> P_A = agent_parallel.list_P_A();//落地扇的數目
Calculate_P calculate_p = new Calculate_P(P_K , P_K_agent);
String str = calculate_p.calculate_r(P_B.size(), P_R.size(), P_D.size(), P_A.size());
if(Integer.parseInt(str) > 0){
P_statement.add("1");
}else {
P_statement.add("0");
}
P_Resistance.add(str);
// for(int j = 0; j < P.size(); j++){
// System.out.println(P.get(j));
// }
}
ArrayList<String> temp_Resistance = new ArrayList<String>();
for(int i = 0 ; i < P_Resistance.size(); i++){
if(Integer.parseInt(P_Resistance.get(i)) < 0){
continue;
}else if(Integer.parseInt(P_Resistance.get(i)) > 0){
temp_Resistance.add(P_Resistance.get(i));
}
}
double temp = 0.00;
double totalResistance = 0.00;
if(temp_Resistance.size() == 1){
totalResistance = Double.parseDouble(P_Resistance.get(0));
}else if(temp_Resistance.size() > 1){
for(int i = 0 ; i < temp_Resistance.size(); i++){
temp += 1.0/Double.parseDouble(temp_Resistance.get(i));
}
totalResistance = 1.0 / temp;
} else if (temp_Resistance.isEmpty()) {
totalResistance = 0;
}
public void Show_B(ArrayList<String> All_B) {
ArrayList<String> str1 = new ArrayList<>();
ArrayList<String> str2 = new ArrayList<>();
for(int i = 0; i < All_B.size(); i += 2) {
str1.add(All_B.get(i));
str2.add(All_B.get(i + 1));
}
for(int i = 0; i < str1.size() - 1; i ++) {
for(int j = 0; j < str1.size(); j ++) {
int num = str1.get(j).compareTo(str1.get(i));
if(num > 0){
String temp1 = str1.get(i);
str1.set(i, str1.get(j));
str1.set(j, temp1);
String temp2 = str2.get(i);
str2.set(i, str2.get(j));
str2.set(j, temp2);
}
}
}
for(int i = 0; i < str1.size() - 1; i ++) {
Filament filament = new Filament(str1.get(i) , 10.0);
filament.Show(Double.parseDouble(str2.get(i)));
}
}
public void Show_R(ArrayList<String> All_R) {
ArrayList<String> str1 = new ArrayList<>();
ArrayList<String> str2 = new ArrayList<>();
for(int i = 0; i < All_R.size(); i += 2) {
str1.add(All_R.get(i));
str2.add(All_R.get(i + 1));
}
for(int i = 0; i < str1.size() - 1; i ++) {
for(int j = 0; j < str1.size(); j ++) {
int num = str1.get(j).compareTo(str1.get(i));
if(num > 0){
String temp1 = str1.get(i);
str1.set(i, str1.get(j));
str1.set(j, temp1);
String temp2 = str2.get(i);
str2.set(i, str2.get(j));
str2.set(j, temp2);
}
}
}
d、本題小總結:本題的邏輯其實沒有很大的問題,但是我在最後的一些輸出的情況有點問題,我的輸出的情況就只是考慮了在串聯部分的電器和控制器的輸出情況,然而沒有考慮到並聯的情況。但是這個程式碼中有很多的地方就是之前的程式碼,就只有是在並聯的情況才是新加的新類。符合了迭代的情況。