【1】.前言
這三次的pta難度還是比較高的,尤其是第四次的(根本沒有思緒),考察了較多的正規表示式的使用,以及對類的設計有一些要求,第五次的pta難度一般,主要考察的是類的書寫,並不需要太多關於類的設計,第六次的pta是在第五次的基礎上進行迭代,增加了並聯電路,難度還是有的。
【2】.設計與分析
第四次pta:
以上就是第四次pta的報表內容以及類圖
可以看到類圖非常的複雜,涉及了非常多的類,但卻沒有保證類的單一職責性,導致後期的檢查過程和除錯過程異常困難。類的設計一言難盡(八大設計原則都不符合)
以上就是第五次的pta的報表內容以及類圖
可以看到類圖也非常的複雜(但總歸是滿足了單一職責原則)
以上就是第六次的pta的報表內容以及類圖
【3】.採坑心得
(1).Set
for(String key11:key1) {
Set
for(String keypaper1:keypaper) {
int num=0;
if(s.getAllanswer().get(key11).getCodeS().equals(p.getAllpaper().get(keypaper1).getCodeP())) {
printmess1(s.getAllanswer().get(key11).getCodeS());//把匹配上的試卷編號傳過去
break;
}
num++;
if(num==p.getNumOfpaper()) {
System.out.println("The test paper number does not exist");
//System.out.println(s.getAllanswer().get(key11).getSignid()+" "+x.getAllstudent().get(s.getAllanswer().get(key11).getSignid()).getName()+" "+":"+"0");
}
}
}
}
例如該foreach遍歷時,如果用get獲取時會為null。
(2).private String[]match=new String[50];
在用陣列作為類的屬性的時候,需要new一下,不然會讓屬性值為null。
(3).在寫第五次pta時:
白熾燈:
亮度在0~200lux(流明)之間。
電位差為0-9V時亮度為0,其他電位差按比例,電位差10V對應50ux,220V對應200lux,其他電位差與對應亮度值成正比。白熾燈超過220V。
這是題目要求,在計算亮度時會涉及到小數的計算,結果會*7/5,但算出的結果總是為0,應該採用7.0/5.0計算,不然不會保留小數部分。
(4).
家居電路模擬系列所有題目的預設規則:
1、當計算電壓值等數值的過程中,最終結果出現小數時,用截尾規則去掉小數部分,只保留整數部分。為避免精度的誤差,所有有可能出現小數的數值用double型別儲存並計算,不要作下轉型資料型別轉換,例如電壓、轉速、亮度等,只有在最後輸出時再把計算結果按截尾規則,捨棄尾數,保留整數輸出。
2、所有連線資訊按電路從電源到接地的順序依次輸入,不會出現錯位的情況。
3、連線資訊如果只包含兩個引腳,靠電源端的引腳在前,靠接地端的在後。
4、對於調速器,其輸入端只會直連VCC,不會接其他裝置。整個電路中最多隻有一個調速器,且連線在電源上。
其中第一點,在最後保留時會使保留精度出現誤差,應該用強制轉換直接變為(int)型。
(5).在第六次pta中,涉及了電阻,按道理來說應該計算電流,但最後計算電流會出現一些誤差,應該用分壓來計算最後的結果。
(6).import java.util.;
import java.util.regex.;
class Equipment{
private int node;
public Equipment() {}
public int getNode() {
return node;
}
public void setNode(int node) {
this.node = node;
}
public Equipment(int node) {
super();
this.node = node;
}
}
class Switch extends Equipment implements Comparable
private int state=0;
public void change() {
if(this.state0) {
this.state=1;
}
else {
this.state=0;
}
}
public Switch(int node) {
super(node);
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
@Override
public int compareTo(Switch ss) {
return Integer.compare(super.getNode(),ss.getNode());
}
}
class Fswitch extends Equipment{
private int lever=0;
private double output=0;
public Fswitch(int node) {
super(node);
}
public int getLever() {
return lever;
}
public void setLever(int lever) {
this.lever = lever;
}
public void setOutput(double output) {
this.output = output;
}
public void up(){
if(this.lever0||this.lever1||this.lever2) {
this.lever++;
}
else {
return;
}
}
public void down() {
if(this.lever1||this.lever2||this.lever==3) {
this.lever--;
}
else {
return;
}
}
public void ele(){
this.output=0.3this.lever220;
}
public double getOutput() {
return output;
}
}
class Lswitch extends Equipment{
private double lever=0;
private double output=0;
public Lswitch(int node) {
super(node);
}
public double getLever() {
return lever;
}
public void setLever(double lever) {
this.lever = lever;
}
public double getOutput() {
return output;
}
public void ele() {
this.output=220*this.lever;
}
}
class Blamp extends Equipment{
private double light;
public Blamp(int node) {
super(node);
}
public double getLight() {
return light;
}
public void eleLight(double v) {
if(v>0&&v<=9) {
this.light=0;
}
else if(v>=9&&v<=10) {
this.light=50(v-9);
}
else if(v>10&&v<=220) {
this.light=(v-10)(5.0/7.0)+50;
}
}
}
class Rlamp extends Equipment{
private double light;
public Rlamp(int node) {
super(node);
}
public double getLight() {
return light;
}
public void eleLight(double v) {
if(v==0) {
this.light=0;
}
else {
this.light=180;
}
}
}
class Fan extends Equipment{
private double roll;
public double getRoll() {
return roll;
}
public void setRoll(double roll) {
this.roll = roll;
}
public Fan(int node) {
super(node);
}
public void eleroll(double v) {
if(v<80){
this.roll=0;
}
else if(v>=80&&v<=150){
this.roll=(v-80)*4+80;
}
else if(v>150) {
this.roll=360;
}
}
}
public class Main {
public static void main(String[] args) {
ArrayList
Fswitch F1=null;
Lswitch L1=null;
Blamp B1=null;
Rlamp R1=null;
Fan fan1=null;
//ArrayList
Scanner input=new Scanner(System.in);
while(input.hasNext()) {
String s=input.nextLine();
if(s.equals("end")) {
break;
}
else {
if(s.startsWith("[")) {
String regex="[K|F|L|B|R|D]\d-1";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
char first=matcher.group().charAt(0);
if(first'K') {
Switch stem=new Switch((int)(matcher.group().charAt(1))-48);
alls.add(stem);
}
else if(first'F') {
Fswitch stem=new Fswitch((int)(matcher.group().charAt(1))-48);
F1=stem;
}
else if(first'L') {
Lswitch stem=new Lswitch((int)(matcher.group().charAt(1))-48);
L1=stem;
}
else if(first'B') {
Blamp stem=new Blamp((int)(matcher.group().charAt(1))-48);
B1=stem;
}
else if(first'R') {
Rlamp stem=new Rlamp((int)(matcher.group().charAt(1))-48);
R1=stem;
}
else if(first'D') {
Fan stem=new Fan((int)(matcher.group().charAt(1))-48);
fan1=stem;
}
}
}
else if(s.startsWith("#")) {
if(s.contains("K")) {
int num=(int)(s.charAt(2))-48;
for(Switch tem:alls) {
if(tem.getNode()num) {
tem.change();
}
}
}
else if(s.contains("F")) {
if(s.contains("-")) {
F1.down();
}
else if(s.contains("+")) {
F1.up();
}
}
else if(s.contains("L")) {
String regex="[0-9]+\.?[0-9]*";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
double lever= Double.parseDouble(matcher.group());
L1.setLever(lever);
}
}
}
}
}
Collections.sort(alls);
boolean ele=true;
for(Switch s:alls) {
System.out.print("@K"+s.getNode()+"😊;
if(s.getState()0) {
System.out.println("turned on");
ele=false;
}
else {
System.out.println("closed");
}
}
if(F1null&&L1null) {
if(B1!=null) {
if(ele) {
B1.eleLight(220);
System.out.println("@B"+B1.getNode()+":"+(int)(B1.getLight()));
}
else {
System.out.println("@B"+B1.getNode()+":"+"0");
}
}
else if(R1!=null) {
if(ele) {
R1.eleLight(220);
System.out.println("@R"+R1.getNode()+":"+(int)(R1.getLight()));
}
else {
System.out.println("@R"+R1.getNode()+":"+"0");
}
}
else if(fan1!=null) {
if(ele) {
fan1.eleroll(220);
System.out.println("@D"+fan1.getNode()+":"+(int)(fan1.getRoll()));
}
else {
System.out.println("@D"+fan1.getNode()+":"+"0");
}
}
}
else if(F1!=null) {
System.out.println("@F"+F1.getNode()+":"+F1.getLever());
F1.ele();
if(B1!=null) {
if(ele) {
B1.eleLight(F1.getOutput());
System.out.println("@B"+B1.getNode()+":"+(int)(B1.getLight()));
}
else {
System.out.println("@B"+B1.getNode()+":"+"0");
}
}
else if(R1!=null) {
if(ele) {
R1.eleLight(F1.getOutput());
System.out.println("@R"+R1.getNode()+":"+(int)(R1.getLight()));
}
else {
System.out.println("@R"+R1.getNode()+":"+"0");
}
}
else if(fan1!=null) {
if(ele) {
fan1.eleroll(F1.getOutput());
System.out.println("@D"+fan1.getNode()+":"+(int)(fan1.getRoll()));
}
else {
System.out.println("@D"+fan1.getNode()+":"+"0");
}
}
}
else if(L1!=null) {
System.out.println("@L"+L1.getNode()+":"+String.format("%.2f",L1.getLever()));
L1.ele();
if(B1!=null) {
if(ele) {
B1.eleLight(L1.getOutput());
System.out.println("@B"+B1.getNode()+":"+(int)(B1.getLight()));
}
else {
System.out.println("@B"+B1.getNode()+":"+"0");
}
}
else if(R1!=null) {
if(ele) {
R1.eleLight(L1.getOutput());
System.out.println("@R"+R1.getNode()+":"+(int)(R1.getLight()));
}
else {
System.out.println("@R"+R1.getNode()+":"+"0");
}
}
else if(fan1!=null) {
if(ele) {
fan1.eleroll(L1.getOutput());
System.out.println("@D"+fan1.getNode()+":"+(int)(fan1.getRoll()));
}
else {
System.out.println("@D"+fan1.getNode()+":"+"0");
}
}
}
}
}
在寫第五次pta的時候,由於輸入比較簡單以及只有一個用電器,電路也只有簡單的一條,所以很簡單的只需要計算輸入電壓然後賦給用電器就可以了,所以根本沒有可以迭代的靈活性,是當之無愧的“垃圾程式碼”,而且在判斷輸入的時候,也非常的簡單,因為沒有錯誤輸入,所以只需要讀取部分即可,這是非常投機取巧的寫法,而且程式碼的可加性非常差。
【4】.改進建議:
在設計時遵循類的單一職責
如:class Fswitch extends Equipment{
private int lever=0;
private double output=0;
public Fswitch(int node) {
super(node);
}
public int getLever() {
return lever;
}
public void setLever(int lever) {
this.lever = lever;
}
public void setOutput(double output) {
this.output = output;
}
public void up(){
if(this.lever0||this.lever1||this.lever2) {
this.lever++;
}
else {
return;
}
}
public void down() {
if(this.lever1||this.lever2||this.lever3) {
this.lever--;
}
else {
return;
}
}
public void ele(){
this.output=0.3this.lever220;
}
public double getOutput() {
return output;
}
}
這是分檔開關類,但在裡面卻有通電的方法,沒有保證單一職責原則。
【5】.總結:
在寫這幾次pta時,我沒有注重類的設計(好吧,其實根本沒有在設計),看完題目之後直接上手開寫了,遇到了問題也採用了非常生硬的辦法直接解決了,導致程式碼就是亂的,自己再看第二次都不認識的地步,只是想著怎麼得分,根本沒有想程式碼應不應該有可加性,導致寫出了沒用的程式碼(雖然可以得分)