前言
背景介紹:
繼上次PTA題目講解完,本次部落格會進行對後幾次題目集的講解說明和題後總結
目的和目標:
及時反饋學習成果,達到學由所會,及時吸收和深入學習的目的
學習收益:
透過後面幾次的題目學習,使得我對java的語法程式碼以及運用熟練度有了極大的進步,同時也對學習程式碼語言有了一個更深的學習理解和更好的學習方法
第一題題目介紹:
設計實現答題程式,模擬一個小型的測試,要求輸入題目資訊、試卷資訊、答題資訊、學生資訊、刪除題目資訊,根據輸入題目資訊中的標準答案判斷答題的結果。本題在答題判題程式-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=5false
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=5false
黨十八大報告提出要加強()建設。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=5false
古琴在古代被稱為:瑤琴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=5false
古琴在古代被稱為:古箏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=5false
古琴在古代被稱為:瑤琴或七絃琴true
20201103 Tom: 0 10~10
1+1=2true
古琴在古代被稱為:古箏false
20201103 Tom: 8 0~8
1+1=2true
古琴在古代被稱為:瑟false
20201104 Jack: 5 0~5
1+1=5false
古琴在古代被稱為:七絃琴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=5false
黨十八大報告提出要加強()建設。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=5false
古琴在古代被稱為:瑤琴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=5false
古琴在古代被稱為:古箏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=5false
古琴在古代被稱為:瑤琴或七絃琴true
20201103 Tom: 0 10~10
1+1=2true
古琴在古代被稱為:古箏false
20201103 Tom: 8 0~8
1+1=2true
古琴在古代被稱為:瑟false
20201104 Jack: 5 0~5
1+1=5false
古琴在古代被稱為:七絃琴partially correct
20201104 Jack: 0 10~10
題目分析:
這是一個相當複雜的問題,需要設計一個包含多個類和方法的Java程式來實現。主要的類包括題目資訊類(QuestionInfo)、試卷資訊類(TestPaperInfo)、學生資訊類(StudentInfo)、答卷資訊類(AnswerSheetInfo)以及主程式類(Main)。
首先,你需要定義每個類的屬性和方法,例如:
QuestionInfo類:包含題目編號、題目內容、標準答案等屬性,還可以有方法用於獲取和設定這些屬性。
TestPaperInfo類:包含試卷號、題目編號和分值等屬性,同樣可以有獲取和設定屬性的方法。
StudentInfo類:包含學號、姓名等屬性,同樣可以有獲取和設定屬性的方法。
AnswerSheetInfo類:包含試卷號、學號、答案等屬性,也需要方法來設定和獲取這些屬性。
Main類:包含主程式,用於輸入題目資訊、試卷資訊、學生資訊、答卷資訊、刪除題目資訊,並根據輸入資訊進行判斷和輸出結果。
在Main類中,你需要實現以下功能:
輸入題目資訊、試卷資訊、學生資訊、答卷資訊、刪除題目資訊,並儲存到對應的類中。
根據輸入的答卷資訊和題目資訊,判斷每個學生每道題目的得分情況,並輸出判分資訊。
根據題目引用錯誤、答案不存在、刪除題目等情況,輸出相應的錯誤資訊。
根據試卷總分是否等於100分,輸出警示資訊。
實現多選題和填空題的判斷邏輯,計算得分情況並輸出。
實現多張試卷和多個學生的情況,按照規定的輸出順序輸出結果。
設計分析與程式碼展示:
初步設計(框架)
點選檢視程式碼
import java.util.*;
// 題目資訊類
class QuestionInfo {
private int questionNumber;
private String questionContent;
private String standardAnswer;
public QuestionInfo(int questionNumber, String questionContent, String standardAnswer) {
this.questionNumber = questionNumber;
this.questionContent = questionContent;
this.standardAnswer = standardAnswer;
}
// 其他方法根據需要新增
}
// 試卷資訊類
class TestPaperInfo {
private int paperNumber;
private Map<Integer, Integer> questionScores;
public TestPaperInfo(int paperNumber, Map<Integer, Integer> questionScores) {
this.paperNumber = paperNumber;
this.questionScores = questionScores;
}
// 其他方法根據需要新增
}
// 學生資訊類
class StudentInfo {
private int studentId;
private String studentName;
public StudentInfo(int studentId, String studentName) {
this.studentId = studentId;
this.studentName = studentName;
}
// 其他方法根據需要新增
}
// 答卷資訊類
class AnswerSheetInfo {
private int paperNumber;
private int studentId;
private List<String> answers;
public AnswerSheetInfo(int paperNumber, int studentId, List<String> answers) {
this.paperNumber = paperNumber;
this.studentId = studentId;
this.answers = answers;
}
// 其他方法根據需要新增
}
public class Main {
public static void main(String[] args) {
// 建立題目資訊
QuestionInfo question1 = new QuestionInfo(1, "1+1=", "2");
// 建立試卷資訊
Map<Integer, Integer> questionScores = new HashMap<>();
questionScores.put(1, 5); // 第1題得5分
TestPaperInfo testPaper1 = new TestPaperInfo(1, questionScores);
// 建立學生資訊
StudentInfo student1 = new StudentInfo(20201103, "Tom");
// 建立答卷資訊
List<String> answers = new ArrayList<>();
answers.add("1-2"); // 第1題答案是2
AnswerSheetInfo answerSheet1 = new AnswerSheetInfo(1, 20201103, answers);
// 判斷試卷總分是否為100分
int totalScore = 0;
for (int score : questionScores.values()) {
totalScore += score;
}
if (totalScore != 100) {
System.out.println("alert: full score of test paper" + testPaper1.getPaperNumber() + " is not 100 points");
}
// 判斷答卷資訊
for (String answer : answerSheet1.getAnswers()) {
String[] parts = answer.split("-");
int questionNumber = Integer.parseInt(parts[0]);
String answerContent = parts[1];
String standardAnswer = question1.getStandardAnswer(questionNumber);
if (standardAnswer.equals(answerContent)) {
System.out.println(question1.getQuestionContent(questionNumber) + "~" + answerContent + "~true");
} else {
System.out.println(question1.getQuestionContent(questionNumber) + "~" + answerContent + "~false");
}
}
// 計算學生得分
int studentScore = 0;
for (String answer : answerSheet1.getAnswers()) {
String[] parts = answer.split("-");
int questionNumber = Integer.parseInt(parts[0]);
String answerContent = parts[1];
int questionScore = testPaper1.getQuestionScore(questionNumber);
if (question1.getStandardAnswer(questionNumber).equals(answerContent)) {
studentScore += questionScore;
}
}
System.out.println(student1.getStudentName() + ": " + studentScore);
}
}
第二題題目介紹
7-1 家居強電電路模擬程式-1
分數 75
作者 蔡軻
單位 南昌航空大學
智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。
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
題目分析
以下是對題目進行分析並設計相應的 Java 類的思路:
首先,我們需要設計一個電路裝置的抽象類(例如 CircuitDevice),包含裝置識別符號、輸入引腳編號、輸出引腳編號等屬性,並且定義一個抽象方法來處理輸入資訊。這個類將作為其他具體裝置類的基類。
根據題目描述,我們可以設計具體的控制裝置類(如 SwitchDevice、GearShiftDevice、ContinuousAdjustmentDevice),以及受控裝置類(如 LightingDevice、FanDevice)繼承自電路裝置類,並實現相應的輸入資訊處理方法。
還需要設計一個串聯電路類(例如 SerialCircuit)來管理一組連線在一起的電路裝置,並實現處理連線資訊的方法。
最後,設計一個家居電路模擬程式的入口類(例如 SmartHomeCircuitSimulator),負責解析輸入資訊並呼叫對應的類來處理,最終輸出裝置狀態或引數。
這樣的設計思路可以讓我們清晰地管理各種裝置的資訊和狀態,並實現電路模擬系統的功能。
根據這個設計思路,我們可以逐步實現相關的 Java 類。您可以首先嚐試實現電路裝置的抽象類和具體裝置類,然後再實現串聯電路類和家居電路模擬程式的入口類。在實現過程中,可以根據需要新增必要的屬性和方法,並根據題目要求來實現具體的功能邏輯。
設計分析與程式碼展示
第一步我們定義一個電器的抽象類,其父類為開關和電器
點選檢視程式碼
abstract class Device {
protected String id;
protected double inputVoltage;
protected double outputVoltage;
public Device(String id) {
this.id = id;
this.inputVoltage = 0;
this.outputVoltage = 0;
}
abstract void updateOutputVoltage();
@Override
public String toString() {
return id;
}
public void SetinputVoltage(double outputVoltage) {
this.inputVoltage = outputVoltage;
}
public double GetoutputVoltage() {
return this.outputVoltage;
}
}
然後相應的根據題目內容寫好其他電器的類
點選檢視程式碼
class Switch extends Device {
private boolean state; // false for turned off, true for turned on
public Switch(String id) {
super(id);
this.state = false;
}
public void toggle() {
this.state = !this.state;
updateOutputVoltage();
}
@Override
void updateOutputVoltage() {
if (state) {
outputVoltage = inputVoltage;
} else {
outputVoltage = 0;
}
}
@Override
public String toString() {
return "@" + id + ":" + (state ? "closed" : "turned on");
}
public boolean isState() {
return state;
}
}
class SpeedController extends Device {
private int level;
private int maxLevel;
public SpeedController(String id) {
super(id);
this.level = 0;
this.maxLevel = 3;
}
public void increaseLevel() {
if (level < maxLevel) level++;
updateOutputVoltage();
}
public void decreaseLevel() {
if (level > 0) level--;
updateOutputVoltage();
}
@Override
void updateOutputVoltage() {
outputVoltage = inputVoltage * (this.level * 0.3);
}
@Override
public String toString() {
return "@" + id + ":" + level;
}
}
class ContinuousSpeedController extends Device {
private double level;
public ContinuousSpeedController(String id) {
super(id);
this.level = 0.00;
}
public void setLevel(double level) {
this.level = level;
updateOutputVoltage();
}
@Override
void updateOutputVoltage() {
outputVoltage = inputVoltage * level;
}
@Override
public String toString() {
return "@" + id + ":" + String.format("%.2f", level);
}
}
abstract class ControlledDevice extends Device {
protected int brightnessOrSpeed=0;
public ControlledDevice(String id) {
super(id);
}
abstract void updateBrightnessOrSpeed();
@Override
public String toString() {
return "@" + id + ":" + brightnessOrSpeed;
}
}
class IncandescentLamp extends ControlledDevice {
public IncandescentLamp(String id) {
super(id);
}
@Override
void updateBrightnessOrSpeed() {
if (inputVoltage <= 9) {
brightnessOrSpeed = 0;
} else {
brightnessOrSpeed = Math.min((int) ((inputVoltage-10)* 150 / 210.0+50), 200);
}
}
@Override
void updateOutputVoltage() {
outputVoltage = inputVoltage;
}
}
class FluorescentLamp extends ControlledDevice {
public FluorescentLamp(String id) {
super(id);
}
@Override
void updateBrightnessOrSpeed() {
brightnessOrSpeed = inputVoltage == 0 ? 0 : 180;
}
@Override
void updateOutputVoltage() {
outputVoltage = inputVoltage;
}
}
class CeilingFan extends ControlledDevice {
public CeilingFan(String id) {
super(id);
}
@Override
void updateBrightnessOrSpeed() {
if (inputVoltage < 80) {
brightnessOrSpeed = 0;
} else {
brightnessOrSpeed = Math.min((int) ((inputVoltage-80) * 280.0 / 70.0) + 80, 360);
}
}
@Override
void updateOutputVoltage() {
outputVoltage = inputVoltage;
}
}
最後一步在main函式中實現對資料的輸入輸出即可
點選檢視程式碼
public class Main {
private static Map<String, Device> devices = new HashMap<>();
private static Map<String, String> connections = new HashMap<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line;
// Process input
while (sc.hasNextLine()) {
line = sc.nextLine().trim();
if (line.equals("end")) break;
if (line.startsWith("[")) {
processConnection(line);
} else if (line.startsWith("#")) {
processControl(line);
}
}
updateVoltage(connections.get("VCC"));
// Output results
check("VCC");
}
private static void processConnection(String line) {
line = line.replace("[", "").replace("]", "");
String[] parts = line.split(" ");
String first = parts[0], second = parts[1];
if (first.equals("VCC")) {
String device = second.split("-")[0];
if (!devices.containsKey(device)) {
Device device0 = createDevice(device);
device0.SetinputVoltage(220.00);
devices.put(device, device0);
connections.put("VCC", device);
}
} else if (second.equals("GND")) {
String device3= first.split("-")[0];
if (!devices.containsKey(device3)) {
devices.put(device3, createDevice(device3));
connections.put(device3,null);
}
} else {
String device1 = first.split("-")[0];
String device2 = second.split("-")[0];
connections.put(device1, device2);
if (!devices.containsKey(device1)) {
devices.put(device1, createDevice(device1));
}
if (!devices.containsKey(device2)) {
devices.put(device2, createDevice(device2));
}
}
}
private static Device createDevice(String id) {
char type = id.charAt(0);
switch (type) {
case 'K':
return new Switch(id);
case 'F':
return new SpeedController(id);
case 'L':
return new ContinuousSpeedController(id);
case 'B':
return new IncandescentLamp(id);
case 'R':
return new FluorescentLamp(id);
case 'D':
return new CeilingFan(id);
default:
throw new IllegalArgumentException("Unknown device type: " + type);
}
}
private static void processControl(String line) {
String control = line.substring(1);
String control1=control.substring(0, 2);
if (devices.containsKey(control)) {
Device device = devices.get(control);
if (device instanceof Switch) {
((Switch) device).toggle();
}
}
if(devices.containsKey(control1)) {
Device device = devices.get(control1);
if (device instanceof SpeedController) {
if (line.endsWith("+")) {
((SpeedController) device).increaseLevel();
} else if (line.endsWith("-")) {
((SpeedController) device).decreaseLevel();
}
}
else if (device instanceof ContinuousSpeedController) {
double level = Double.parseDouble(line.substring(line.indexOf(":") + 1));
((ContinuousSpeedController) device).setLevel(level);
}
}
}
private static void updateVoltage(String id) {
Device device = devices.get(id);
if (device != null) {
Device connectedDevice = devices.get(connections.get(id));
if (connectedDevice != null) {
connectedDevice.inputVoltage = device.outputVoltage;
connectedDevice.updateOutputVoltage();
updateVoltage(connectedDevice.id);
}
}
}
private static void outputResults(String string) {
String a=connections.get(string);
if(a!=null) {
Device device = devices.get(a);
if (device instanceof IncandescentLamp) {
((IncandescentLamp) device).updateBrightnessOrSpeed();
System.out.println(device.toString());
outputResults(a);
}
else if (device instanceof FluorescentLamp) {
((FluorescentLamp) device).updateBrightnessOrSpeed();
System.out.println(device.toString());
outputResults(a);
}
else if (device instanceof CeilingFan) {
((CeilingFan) device).updateBrightnessOrSpeed();
System.out.println(device.toString());
outputResults(a);
}
else if (device instanceof Switch) {
outputResults(a);
}
else {System.out.println(device.toString());
outputResults(a);}
}
}
private static void outputResults1(String string) {
String a=connections.get(string);
if(a!=null) {
Device device = devices.get(a);
if (device instanceof IncandescentLamp) {
System.out.println(device.toString());
outputResults1(a);
}
else if (device instanceof FluorescentLamp) {
System.out.println(device.toString());
outputResults1(a);
}
else if (device instanceof CeilingFan) {
System.out.println(device.toString());
outputResults1(a);
}
else if (device instanceof Switch) {
outputResults1(a);
}
else {System.out.println(device.toString());
outputResults1(a);}
}
}
private static void check(String string) {
int KG=1;
String a=connections.get(string);
while(a!=null) {
Device device = devices.get(a);
if (device instanceof Switch) {
if(((Switch) device).isState()==false)
KG=0;
System.out.println(device.toString());
}
a=connections.get(a);
}
if(KG==1) {
outputResults("VCC");
}
else {
outputResults1("VCC");
}
}
}
第三題題目介紹
7-1 家居強電電路模擬程式-2
分數 100
作者 蔡軻
單位 南昌航空大學
智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。以下題目介紹中加粗的部分為本次迭代在“家居強電電路模擬程式-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
題目分析
這個題目涉及到模擬智慧家居的強電電路系統,需要設計一個程式來模擬這個系統的執行狀態,並根據輸入的資訊來控制各個裝置的狀態或引數。以下是對該題目的題目分析和解答思路:
題目分析:
裝置型別:題目中包含了控制裝置(開關、分檔調速器、連續調速器)和受控裝置(燈、風扇)。
裝置狀態與引數:各種裝置有不同的狀態和引數,如開關的狀態(0和1)、調速器的檔位引數、燈的亮度、風扇的轉速等。
連線關係:裝置之間存在連線關係,需要根據連線資訊來類比電路的執行。
輸入資訊:包括裝置資訊、連線資訊、控制裝置調節資訊等。
輸出資訊:根據輸入資訊和裝置狀態引數,輸出各個裝置的狀態或引數值。
解答思路:
設計類結構:首先根據題目要求設計合適的類結構,包括控制裝置類、受控裝置類、電路裝置類等。可以使用物件導向的思想,透過類和物件的方式來模擬各個裝置之間的關係和行為。
解析輸入資訊:根據題目要求,解析輸入資訊,包括裝置資訊、連線資訊、控制裝置調節資訊等,將其轉化為程式可以理解和處理的資料結構。
類比電路執行:根據連線資訊和裝置狀態,類比電路的執行狀態。對於控制裝置的調節資訊,根據輸入調節裝置的狀態或引數。
輸出結果:根據模擬的電路狀態,輸出各個裝置的狀態或引數值,符合題目要求的輸出格式。
以上是對該題目的基本分析和解答思路,具體實現時需要根據實際情況進行程式碼編寫和除錯,確保程式能夠正確模擬智慧家居的強電電路系統執行。
設計分析與程式碼展示
針對該題,我們首先要對main函式上對上一題的程式碼進行修改,以便可以完成對該題目的輸入輸出
程式碼如下(部分,需要自己完善補充)
點選檢視程式碼
public class SmartHomeCircuitSimulator {
public static void main(String[] args) {
// 建立串聯電路並連線裝置
SerialCircuit circuit = new SerialCircuit();
circuit.connectDevices(Arrays.asList(
new ControlDevice("K1", 1, 2),
new ControlDevice("F1", 3, 4),
new ControlDevice("C1", 5, 6),
new ControlledDevice("B1", 7, 8),
new ControlledDevice("R1", 9, 10),
new ControlledDevice("L1", 11, 12),
new ControlledDevice("S1", 13, 14),
new ControlledDevice("F2", 15, 16)
));
// 模擬輸入資訊並處理
circuit.processInput("[VCC K1-1]");
circuit.processInput("[K1-2 F1-1]");
circuit.processInput("[F1-2 C1-1]");
circuit.processInput("[C1-2 B1-1]");
circuit.processInput("[B1-2 R1-1]");
circuit.processInput("[R1-2 L1-1]");
circuit.processInput("[L1-2 S1-1]");
circuit.processInput("[S1-2 F2-1]");
circuit.processInput("[F2-2 GND]");
circuit.processInput("#K1");
circuit.processInput("#K1+");
circuit.processInput("#K1-");
circuit.processInput("#F1");
circuit.processInput("#F1+");
circuit.processInput("#F1-");
circuit.processInput("#C1");
circuit.processInput("#C1:");
circuit.processInput("#C1:0.75");
circuit.processInput("#B1");
circuit.processInput("#R1");
circuit.processInput("#L1");
circuit.processInput("#S1");
circuit.processInput("#F2");
circuit.processInput("end");
}
}
點選檢視程式碼
class SerialCircuit {
List<CircuitDevice> devices = new ArrayList<>();
void connectDevices(List<CircuitDevice> devices) {
this.devices.addAll(devices);
}
void processInput(String input) {
for (CircuitDevice device : devices) {
device.processInput(input);
}
}
}
PTA三次實驗心得體會與總結
完成這個實驗後,我得到了一些有關智慧家居強電電路模擬系統的寶貴經驗:
-
深入理解電路結構:透過實現這個模擬系統,我更深入地理解了智慧家居電路的結構和工作原理,包括控制裝置和受控裝置之間的關係,以及連線方式對電路執行的影響。
-
物件導向設計的重要性:在這個實驗中,我使用了物件導向的設計思想,透過設計合適的類結構來類比電路裝置之間的關係和行為。這種設計方法使得程式結構清晰,易於維護和擴充套件。
-
資料解析與模擬:實驗中需要解析輸入資訊並進行電路模擬,這鍛鍊了我處理複雜資料結構和演算法的能力。同時,透過類比電路執行,我更好地理解了電路中各個裝置的工作狀態和引數變化。
-
輸出結果格式規範性:實驗要求輸出結果的格式非常規範,這要求我在輸出結果時要格外注意,確保輸出的結果符合要求,並且能夠清晰地展示電路裝置的狀態或引數。
-
團隊合作與交流:如果這個實驗是在團隊中完成的,那麼與團隊成員的合作和交流也是非常重要的。共同討論和解決問題,能夠更快地完成實驗並提高整體效率。
總的來說,完成這個實驗讓我對智慧家居強電電路有了更深入的瞭解,提升了我的程式設計和問題解決能力,也體會到了團隊合作的重要性。