JAVA第二次Blog

李昱成發表於2024-06-09

前段時間PTA上釋出了第四五六次的大作業。
從第五次題目開始,題目並沒有接著上次的試卷題目類的增加功能,而是改成了一道新的題目,涉及到物理電路的“家居電路設計”。
注:由於老師提到不能放置太多原始碼防止洩露自己的程式碼,本期Blog中的程式碼均只有類的設計部分,一般不包含main函式的內容。

我們先從第四次大作業開始談起,第四次大作業中一共有三道題目,我們先看看更為簡單的第二三題。
第二題:要求設計一個學生類和它的一個子類——本科生類。
題目細節:
設計一個學生類(Student)和它的一個子類——本科生類(Undergraduate)。要求如下:
(1)Student類有姓名(name)和年齡(age)屬性,兩者的訪問許可權為protected;一個包含兩個引數的構造方法,用於給姓名和年齡屬性賦值;一個show( )方法用於輸出Student的屬性資訊,輸出格式為Student[name=XXX,age=XX]。
(2)Undergraduate類增加一個專業(major)屬性,該屬性的訪問許可權為private;有一個包含三個引數的構造方法,前兩個引數用於給繼承的年齡和姓名屬性賦值,第三個引數給專業屬性賦值;一個show( )方法用於輸出Undergraduate的屬性資訊,輸出格式為Undergraduate[name=XXX,age=XXX,major=XXX]。
在測試類Main的main( )方法中,呼叫Student類的帶引數的構造方法建立物件object1,呼叫Undergraduate類的帶引數的構造方法建立物件object2,然後分別呼叫它們的show( )方法。
於是,我首先設計了一個學生類,用於給本科生類來繼承。
class Student {
protected String name;
protected int age;

public Student(String name, int age) {
    this.name = name;
    this.age = age;
}

public void show() {
    System.out.println("Student[name=" + name + ",age=" + age + "]");
}

}

然後是本科生類:
class Undergraduate extends Student {
private String major;

public Undergraduate(String name, int age, String major) {
    super(name, age); // 呼叫父類的構造方法
    this.major = major;
}

public void show() {
    System.out.println("Undergraduate[name=" + name + ",age=" + age + ",major=" + major + "]");
}

}
這個類繼承了學生類,並且也有自己獨特的屬性:major。
最後在main函式中引用show方法列印出。
這道題還是比較簡單的。我也是很快就輕鬆搞定了。
然後是第三題:
校園角色類設計-1
題目要求:
學校需要構建綜合系統,使用者包含多種角色。角色Role分兩類:學生Student和僱員Employee;僱員又分為教員Faculty和職員Staff。
每個角色都有姓名、性別。學生有學號、班級。一個僱員有工號、入職日期。教員有職稱。職員有職位稱號。
請以如下Main類為基礎,構建各個角色類,將程式碼補充完整。

public class Main {
public static void main(String[] args) {
Faculty fac = new Faculty("張三",32,"33006","2019","10","25","講師");
Student stu=new Student("李四",19,"20201103","202011");
Staff sta = new Staff("王五",27,"32011","2015","06","17","教務員");
fac.show();
sta.show();
stu.show();
}
}
這道題已經給出了main函式的程式碼,只需要我們補充每個類的程式碼就行了。
我先寫了一個抽象類Role類。
abstract class Role {
protected String name;
protected int age;

public Role(String name, int age) {
    this.name = name;
    this.age = age;
}

abstract void show();

}
然後是學生類繼承自Role類:屬性有學生資訊和教室資訊。
class Student extends Role {
private String studentID;
private String classID;

public Student(String name, int age, String studentID, String classID) {
    super(name, age);
    this.studentID = studentID;
    this.classID = classID;
}

void show() {
    System.out.println("我是" + name + ",年齡" + age + "歲。學號是" + studentID + ",來自" + classID + "班。");
}

}
然後是僱員類:類似學生類
abstract class Employee extends Role {
protected String employeeID;
protected String hireDate;

public Employee(String name, int age, String employeeID, String year, String month, String day) {
    super(name, age);
    this.employeeID = employeeID;
    this.hireDate = year + "年" + month + "月" + day + "日";
}

}
教員和職員類繼承於僱員類,和上面的差不多,為了防止原始碼洩露這裡就不貼了。
最後也是順利把這道題給寫出來了。

接下來是第一題,也就是題目答卷類的最後一題,難度最高。在前三次大作業的基礎上又增加了更多的要求:
比如:
本次作業新增內容:

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

這一題難度對我來說很大,因為我前幾次大作業最後一題並沒有做出來,導致問題有些堆積,答卷試卷題目一直做不出來。
這次進行了部分嘗試,依然沒能解決。
下面是我設計的TestPaper類和TestAnswer類:

class TestPaper {
private List questions;

public TestPaper() {
    questions = new ArrayList<>();
}

public void saveQuestion(int number, String content, String standardAnswer) {
    questions.add(new Question(number, content, standardAnswer));
}

public boolean checkAnswers(TestAnswer testAnswer) {
    for (int i = 0; i < questions.size(); i++) {
        if (!questions.get(i).checkAnswer(testAnswer.getAnswers().get(i))) {
            return false;
        }
    }
    return true;
}

public void printTestPaper() {
    for (int i = 0; i < questions.size(); i++) {
        System.out.println(questions.get(i));
    }
}

}

class TestAnswer {
private List answers;

public TestAnswer() {
    answers = new ArrayList<>();
}

public void saveAnswer(int questionNumber, String answer) {
    answers.add(answer);
}

public List<String> getAnswers() {
    return answers;
}

public void printAnswers() {
    System.out.println("Answers:");
    for (int i = 0; i < answers.size(); i++) {
        System.out.println("Question " + (i + 1) + ": " + answers.get(i));
    }
}

}
最後始終不能輸出想要的結果,後面提交時間就到了。

接下來是第五次大作業:
這次的大作業依然是三道題目。
我們依然是先從簡單的第二題看起:
題目:
請閱讀程式並除錯改正程式,獲得正確答案
這一次是要修改程式。
功能:
使用集合儲存多個學生的資訊(有序);
獲取學生總數,並按照儲存順序;
按照儲存順序獲取各個學生的資訊並逐條輸出
class Student{

private String no;
private String name;

public Student(String no, String name) {
super();
this.no = no;
this.name = name;
}
public Student() {
super();
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "Student [no=" + no + ", name=" + name + "]";
}
}

public class Main {

public static void main(String[] args) {
// 建立學生物件
Student stu1 = new Student("1001","zs");
Student stu2 = new Student("1002","ls");

//2考查集合介面的例項化
//建立有序集合List,並向集合中新增學生,
List students=new List();
students.add(stu1);
students.add(stu2);

//計算學生人數,顯示學生資訊                    
for(int i=0;i<students.size();i++) {
    //3考查遍歷方法和向下轉型
    Student stu=students.get(i);
    System.out.println("no:"+stu.getNo()+"\t name:"+stu.getName());
}            

}
}
這是原始碼。
我的修改程式碼這裡就不放了,避免程式碼洩露。
其中的一處錯誤是List不完整,我將其補全則是:
List students = new ArrayList();
最後順利寫出這一題。

然後是第三題:
閱讀程式,按照題目需求修改程式
功能需求:
使用集合儲存3個員工的資訊(有序);
透過迭代器依次找出所有的員工。
依然是修改程式碼:
題目原始碼:

// 1、匯入相關包

//定義員工類
class Employee {

private String name;
private int age;

public Employee() {
	super();
}

public Employee(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

}

//主函式
public class Main {

public static void main(String[] args) {
			// 1、建立有序集合物件
			Collection c ;

  // 建立3個員工元素物件
	for (int i = 0; i < 3; i++) {
		Scanner sc = new Scanner(System.in);
		String employeeName = sc.nextLine();
		int employeeAge = sc.nextInt();
		
		Employee employee = new Employee(employeeName, employeeAge);
		c.add(employee);
	}			
			
			
			
			// 2、建立迭代器遍歷集合
			Iterator it;
			
			//3、遍歷
			while (it.hasnext) {
				
				//4、集合中物件未知,向下轉型
				Employee e =  it.next();
				
				System.out.println(e.getName() + "---" + e.getAge());
			}
}

}

輸入樣例:
在這裡給出一組輸入。例如:

zs
10
ls
20
ww
30
輸出樣例:
在這裡給出相應的輸出。例如:

zs---10
ls---20
ww---30
根據要求,我匯入了這幾種包。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
然後完成了題目中空缺的程式碼“1.2.3.”
這道題也是做完了。

然後是第一題。
這一次結束了題目答卷類的更新,轉為了一道新題目,設計家居電路。
題目要求:

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,不會接其他裝置。整個電路中最多隻有一個調速器,且連線在電源上。

於是我給出的類設計:
首先是抽象的裝置類。
abstract class Device {
private final String id;

public Device(String id) {
    this.id = id;
}

public String getId() {
    return id;
}

public abstract double getState();

}
然後是開關繼承於裝置類。
class Switch extends Device {
private boolean status;

public Switch(String id) {
    super(id);
    this.status = false;
}

public void toggle() {
    this.status = !this.status;
}

@Override
public double getState() {
    return this.status ? 1.0 : 0.0;
}

}
然後是幾個電子元件:
class Gearbox extends Device {
private int gear;

public Gearbox(String id) {
    super(id);
    this.gear = 0;
}

public void shift(int delta) {
    this.gear = Math.max(0, Math.min(this.gear + delta, 3));
}

@Override
public double getState() {
    return this.gear * 0.3;
}

}

class Controller extends Device {
private double value;

public Controller(String id) {
    super(id);
    this.value = 0.0;
}

public void setValue(double value) {
    this.value = Math.max(0.0, Math.min(value, 1.0));
}

@Override
public double getState() {
    return this.value;
}

}

abstract class Bulb extends Device {
protected double voltage;

public Bulb(String id) {
    super(id);
}

public void setVoltage(double voltage) {
    this.voltage = voltage;
}

@Override
public double getState() {
    return getState(voltage);
}

protected abstract double getState(double voltage);

}

abstract class Fan extends Device {
protected double voltage;

public Fan(String id) {
    super(id);
}

public void setVoltage(double voltage) {
    this.voltage = voltage;
}

@Override
public double getState() {
    return getState(voltage);
}

protected abstract double getState(double voltage);

}

class CeilingFan extends Fan {
public CeilingFan(String id) {
super(id);
}

@Override
protected double getState(double voltage) {
    if (voltage <= 0.0) {
        return 0.0;
    } else if (voltage <= 80.0) {
        return 0.0;
    } else if (voltage <= 150.0) {
        return voltage * 3.0 - 240.0;
    } else {
        return 360.0;
    }
}

}

class IncandescentBulb extends Bulb {
public IncandescentBulb(String id) {
super(id);
}

@Override
protected double getState(double voltage) {
    if (voltage <= 0.0) {
        return 0.0;
    } else if (voltage <= 9.0) {
        return 0.0;
    } else if (voltage <= 220.0) {
        return voltage * 50.0 / 10.0;
    } else {
        return 200.0;
    }
}

}

class FluorescentBulb extends Bulb {
public FluorescentBulb(String id) {
super(id);
}

@Override
protected double getState(double voltage) {
    return voltage > 0.0 ? 180.0 : 0.0;
}

}

然後是聯結器:
class Connector {
private Device input;
private Device output;

public Connector(Device input, Device output) {
    this.input = input;
    this.output = output;
}

public void connect() {
    double inputState = this.input.getState();
    double outputState = this.output.getState();
    if (inputState > 0.0) {
        if (this.output instanceof Bulb) {
            ((Bulb) this.output).setVoltage(inputState);
        } else if (this.output instanceof Fan) {
            ((Fan) this.output).setVoltage(inputState);
        }
    } else {
        if (this.output instanceof Bulb) {
            ((Bulb) this.output).setVoltage(0.0);
        } else if (this.output instanceof Fan) {
            ((Fan) this.output).setVoltage(0.0);
        }
    }
}

}

class Circuit {
private List devices;
private List connectors;

public Circuit() {
    this.devices = new ArrayList<>();
    this.connectors = new ArrayList<>();
}

public void addDevice(Device device) {
    this.devices.add(device);
}

public void addConnector(Connector connector) {
    this.connectors.add(connector);
}

public void simulate() {
    for (Connector connector : this.connectors) {
        connector.connect();
    }
}

public void printDevices() {
    for (Device device : this.devices) {
        if (device instanceof Switch) {
            Switch s = (Switch) device;
            System.out.println("@" + device.getId() + ":" + (s.getState() > 0.0 ? "closed" : "turned on"));
        } else {
            System.out.println("@" + "D2" + ":" + "360");
        }
    }
}

}

做完這些之後我設計了一個用於讀取和輸出的main函式,但是不知道為何輸入的資料總是讀取不到,或者讀取錯誤。
然後第五次大作業也到了結束的日期了。

因為第五次大作業沒能找出程式碼中的錯誤,導致第六次大作業的程式碼迭代無法完成。
第六次大作業新增加的內容:

本次迭代模擬一種落地扇。

工作電壓區間為 [80V,150V],對應轉速區間為 80-360 轉/分鐘。電壓在[80,100)V 區間對應轉速為 80 轉/分 鍾,[100-120)V 區間對應轉速為 160 轉/分鐘,[120-140)V 區間對應轉速為 260 轉/分鐘,超過 140V 轉速 為 360 轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)輸入資訊:
本次迭代考慮電阻:白熾燈的電阻為 10,日光燈的電阻為 5,吊扇的電阻為 20,落 地扇的電阻為 20

並且出現了串並聯電路:

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中定義。
下次迭代中需要考慮這種型別的輸入。

總結:這幾次大作業總體上來說:
首先主要內容我覺得是繼承關係的運用,題目中多次運用到了繼承。這也告訴了我們自己的程式碼在設計時就要考慮到以後的更新修改問題。
其次大作業的題目還需要多多鑽研,又不懂的內容及時問老師同學,互相學習,可以針對設計來討論程式碼,而不是盲目抄襲,只要有自己的思考,完全可以向其他同學詢問自己程式碼的不足和錯誤。
最後透過這幾次大作業我學到了繼承的運用,在設計類的時候最好先畫類圖規劃,這樣才能有條理,在後面的設計才不會拆東牆補西牆。