OOP4-6次作業
一.前言:
1.第四次PTA:
①題目理解:
延續前面的四次PTA,只不過在此基礎上進行更全面的處理,新增了其他的一些點。例如增加了多選題,的輸入方式,這樣,也就增加了多選題的輸出方式。增加了一些填空題,對其部分正確的判斷變成了一個難點,也增加了其輸出的難度和種類。
②知識點:
1·正規表示式去匹配一個字串,如何去分組獲得其內容;
2·Arroys.copyOf()函式的使用,獲取下一次的時候應當在new一個物件,否則會將部分資料覆蓋,或者其先擴增一個單位在進行復制;
3·trim()函式的使用
4·去除匹配字串陣列的的null
5·相關的邏輯
6·如何去重寫一個函式toString()
③題量:
正常;
④難度:
正常;
2.第五次PTA:
①題目理解:
第五次PTA,是家居強電路模擬裝置程式,透過電路的開閉,和各種用電其,和電路控制裝置,會產生多種情況,和不同的輸出內容和方式會將題目變得複雜許多,但是按要求實現即可。
②知識點:
1.抽象類的如何使用。
2.介面的如何使用。
3.正規表示式去匹配一個字串,如何去分組獲得其內容;
4.Arroys.copyOf()函式的使用,獲取下一次的時候應當在new一個物件,否則會將部分資料覆蓋,或者其先擴增一個單位在進行復制;
③題量:
正常;
④難度:
正常;
3.第六次PTA:
①題目理解:
增加了串聯和並聯電路,這樣就存在了串聯電路短路的情況,同時也增加了題目的難度。並且此次增加了電壓和電阻的加入,這樣如何計算電阻分配電壓成為一個難題,如何用電壓去分配成了一個難題。
②知識點:
1.正規表示式去匹配一個字串,如何去分組獲得其內容;
2.Arroys.copyOf()函式的使用,獲取下一次的時候應當在new一個物件,否則會將部分資料覆蓋,或者其先擴增一個單位在進行復制;
3.邏輯關係中的聯絡。
4.他的輸出是按照從小到大的一定順序進行排序的。
③題量:
正常;
④難度:
正常;
二.內容:
1.第四次PTA:
①題目簡介:
- 程式輸入資訊分五種,資訊可能會打亂順序混合輸入。解釋:這就要求我們要根據#前面的符號進行判斷。
- 試卷資訊為獨 行輸入,一行為一張試卷,多張卷可分多行輸入資料。解釋:存在多張試卷的情況,這就要迴圈找到這是哪幾張試卷。
- 答卷資訊按行輸入,每一行為一張答卷的答案,每組答案包含某個試卷資訊中的題目的解題答案,答案的順序號與試 卷資訊中的題目順序相對應。解釋:這就要求我們根據學號,找到試卷好,根據試卷號,找到標準答案,再根據試卷號的題目判斷判斷正確與否,和算其得分。
- 還存在刪除題目資訊的輸出資訊提示,例如:”the question 2 invalid~0”。還有試卷總分的警示。
②內容實現:
1.對於//#S:1 20201103 #A:1-5 #A:2-4這樣的情況的時候;
if(a.charAt(1)=='S'){
String[] s_s=null;
//#S:1 20201103 #A:1-5 #A:2-4
//if () 這裡還需要排除,#A:#A:這種示例 [\u4e00-\u9fa5A-Z0-9\s]
String pattern5="#S:\\d+\\s+\\d+\\s+(\\s*#A:\\s*\\d+\\s*-\\s*[\\u4e00-\\u9fa5A-Z0-9\\s]*\\s*)*$";
Pattern p5 = Pattern.compile(pattern5);
Matcher m5 = p5.matcher(a);
- 他這裡面有對於數字的匹配[\u4e00-\u9fa5A-Z0-9\s]這樣的情況;
- 這裡面可能還會存在多個空格,至少有一個,而且#A的前面一定是要有空格的所以應當先寫個\\s+的判斷,而且這還要重複多次判斷,這就要在整個需要重複的片段加*;
2.對於/#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴這種填空題。
if(a.charAt(1) == 'K'){
//填空題,就是說我的類還要再改
//#K:2 #Q:古琴在古代被稱為: #A:瑤琴或七絃琴
String pattern1 = "#K:(\\s*[1-9]\\d*\\s*)\\s+#Q:(.*)\\s+#A:(.*)";
Pattern p1 = Pattern.compile(pattern1);
Matcher m2 = p1.matcher(a);
- 你不僅要判斷他是否正確,還要判斷他是否半對,和錯誤的情況
- 這個正規表示式就巧妙的用.*去匹配了所有的#Q和#A中的內容
3.重要函式的實現:
1·透過int sccz=0;的這個標記來實現如果未找到這個試卷,就輸出不存在。
for (int i = 0; i < answerpaper.length - 1; i++) { //#S:1 20201103 #A:1-5 #A:2-4 answerpaper
int sccz = 0;//這個是用來判斷是否存在這個試卷
for (int k = 0; k < answerfens.length - 1; k++) { //#T:1 1-5
if (answerfens[k].numberPaper.equals(answerpaper[i].textNumber)) {
if (sccz == 0) {
System.out.println("The test paper number does not exist");
}
}
}
}
2·我們如果存在試卷則去找對應的學生,寫的試卷答案,然後我們用flag=0;去標記是否找到
sccz = 1;
int flag = 0;
//
int a[] = new int[1];
int numm = 0;
int gg = 0;
int sum = 0;
//
for (int l = 0; l < student.studentNumber.length; l++) {
if (answerpaper[i].studentNumber.equals(student.studentNumber[l])) {
flag = 1;
3·接著我們要判斷是否這個答案是否是被刪除的,用flag2=0;來標記。順便去輸出這個題目是否是被刪除的
for (int p = 0; p < answerfens[k].number.length; p++) {
int flag3 = 0;//每次迴圈都要賦值為零
for (int q = 0; q < answerpaper[i].titleNumber.length; q++) {
if (answerpaper[i].titleNumber[q].equals(String.valueOf(p + 1))) {
flag3 = 1;
//去判斷這個題目是否被刪
int flag2 = 0;
if (deleteNumber != null) {
for (int r = 0; r < deleteNumber.titlenumber.length; r++) {
if (deleteNumber.titlenumber[r].equals(answerfens[k].number[p])) {
flag2 = 1;
System.out.println("the question " + answerfens[k].number[p] + " invalid~0");
//判斷得分的
a[numm] = 0;
a = Arrays.copyOf(a, a.length + 1);
numm++;
}
}
}
4·接著我們找到這個題目,且不是被刪除的,我們就分三種情況,普通的單選題,填空題,多選題,然後我們再去對應的類的陣列中去找是否存在這樣的題目
一.單選
for (int u = 0; u < pttitles.length - 1; u++) {
if (answerfens[k].number[p].equals(pttitles[u].number)) {
flag4 = 1;
if (answerpaper[i].titleAnswer[q].equals(pttitles[u].pt_standardAnswer)) {
System.out.println(pttitles[u].content + "~" + answerpaper[i].titleAnswer[q] + "~true");
a[numm] = Integer.valueOf(answerfens[k].score[p]);
a = Arrays.copyOf(a, a.length + 1);
numm++;
} else {
System.out.println(pttitles[u].content + "~" + answerpaper[i].titleAnswer[q] + "~false");
a[numm] = 0;
a = Arrays.copyOf(a, a.length + 1);
numm++;
}
}
}
二.填空題
for (int z = 0; z < tktitles.length - 1; z++) {
if (answerfens[k].number[p].equals(tktitles[z].number)) {
flag4 = 1;
//這裡是找到題號
int ccd = tkpd(tktitles[z].tk_standardAnswer, answerpaper[i].titleAnswer[q]);
if (ccd == 1) {
System.out.println(tktitles[z].content + "~" + answerpaper[i].titleAnswer[q] + "~true");
//判斷分數
a[numm] = Integer.valueOf(answerfens[k].score[p]);
a = Arrays.copyOf(a, a.length + 1);
numm++;
} else if (ccd == 0) {
System.out.println(tktitles[z].content + "~" + answerpaper[i].titleAnswer[q] + "~partially correct");
//判斷分數
a[numm] = (int) (Integer.valueOf(answerfens[k].score[p]) * 0.5);
a = Arrays.copyOf(a, a.length + 1);
numm++;
} else if (ccd == -1) {
System.out.println(tktitles[z].content + "~" + answerpaper[i].titleAnswer[q] + "~false");
//判斷分數
a[numm] = 0;
a = Arrays.copyOf(a, a.length + 1);
numm++;
}
}
}
三.多選題
for (int w = 0; w < dxtitles.length - 1; w++) {
if (answerfens[k].number[p].equals(dxtitles[w].number)) {
flag4 = 1;//標記說明有這個試卷
int ccd2 = dxpd(dxtitles[w].dx_standardAnswer, answerpaper[i].titleAnswer[q]);
if (ccd2 == 1) {
System.out.println(dxtitles[w].content + "~" + answerpaper[i].titleAnswer[q] + "~true");
//判斷分數,正確得全分
a[numm] = Integer.valueOf(answerfens[k].score[p]);
a = Arrays.copyOf(a, a.length + 1);
numm++;
} else if (ccd2 == 0) {
System.out.println(dxtitles[w].content + "~" + answerpaper[i].titleAnswer[q] + "~partially correct");
//判斷分數,半對就得一半分
a[numm] = (int) (Integer.valueOf(answerfens[k].score[p]) * 0.5);
a = Arrays.copyOf(a, a.length + 1);
numm++;
} else if (ccd2 == -1) {
System.out.println(dxtitles[w].content + "~" + answerpaper[i].titleAnswer[q] + "~false");
//判斷分數,全錯就得零分
a[numm] = 0;
a = Arrays.copyOf(a, a.length + 1);
numm++;
}
}
}
③踩坑心得:
-
一開始我都沒注意到這個點就是必須有一個空格,然後存在多個空格然後可以去除空格,我們可以在輸入的時候就把空格全去掉。
-
if(Integer.parseInt(answerPapers[k].studentNumber)== Integer.parseInt(answerPapers[k+1].studentNumber)){ if(Integer.parseInt(answerPapers[k].textNumber)> Integer.parseInt(answerPapers[k+1].textNumber)){ AnswerPaper temp2=answerPapers[k]; answerPapers[k]=answerPapers[k+1]; answerPapers[k+1]=temp2; } }
我們存進去的名字是String的轉成int 用Integer.parseInt()函式,一開始直接比了然後報錯,找不到,之後看了儲存的是Stirng。
④改進建議:
判斷好其中的邏輯關係,然後注意他的測試點過的條件,然後不然有點太難找了。
2.第五次PTA:
①題目簡介:
控制裝置模擬:開關,分檔調速器,連續調速器
受控裝置模擬:燈,電風扇
本次迭代只存在串聯的情況,然後並且他並沒有電壓和電阻的模擬,所以只需要透過開關來判斷是否是通路,當然我們也可已沒有開關,這就預設是通路。
②內容實現:
一.宣告受控裝置類,和控制裝置類,五種電器去繼承他,我們這一次只有一個串聯電路然後我們在電路裝置類中進行判斷
二.接受對應控制裝置的狀態更改條件,然後可以對相應控制裝置進行更改
if(a.charAt(1)=='K'){
String ggg = String.valueOf(a.charAt(2));
for(int i=0;i<deviceControlings.length-1;i++){
if(deviceControlings[i] instanceof Switch){
if(((Switch) deviceControlings[i]).name==Integer.parseInt(ggg)){
((Switch) deviceControlings[i]).setState();
}
}
}
// switch1.setState();
}else if(a.charAt(1)=='F'){
if(a.charAt(a.length()-1)=='+'){
governorBinning1.setGrears("+");
}else if(a.charAt(a.length()-1)=='-'){
governorBinning1.setGrears("-");
}
}else if(a.charAt(1)=='L'){
String[] get2=a.split(":");
governorContinuous1.setMagnification(Double.parseDouble(get2[1]));
}
}
三.當我們將所有的輸入都輸入完成,然後我們在電路裝置中進行判斷,也是我們的主要函式。
1.判斷我們是否存在開關斷開
int number2=0;
for(int i=0;i<s.length-1;i++){
s[i].show(); //輸出按開關的名稱編號
if(s[i].state==1){// 判斷存在了開關閉合的情況
number2++;
}
}
if(number2!=number){ //存在了開關斷開的情況
for (int k = 0; k < deviceControlleds.length-1; k++) {
deviceControlleds[k].setPd(0);
deviceControlleds[k].show();
}
2.然後去輸出獲得對應的電壓賦值
if(number2==number){
for (int i = 0; i < deviceControlings.length; i++) {
if(deviceControlings[i] instanceof governorBinning){
((governorBinning) deviceControlings[i]).show();
((governorBinning) deviceControlings[i]).setV(220);
for(int k=0;k<deviceControlleds.length-1;k++){
deviceControlleds[k].setPd(((governorBinning) deviceControlings[i]).getV());
deviceControlleds[k].show();
}
break;
}
else if(deviceControlings[i] instanceof governorContinuous) {
((governorContinuous) deviceControlings[i]).show();
((governorContinuous) deviceControlings[i]).setV(220);
for (int k = 0; k < deviceControlleds.length - 1; k++) {
deviceControlleds[k].setPd(((governorContinuous) deviceControlings[i]).getV());
deviceControlleds[k].show();
}
break;
}else if(deviceControlings[i] instanceof Switch){
for (int k = 0; k < deviceControlleds.length - 1; k++) {
deviceControlleds[k].setPd(220);
deviceControlleds[k].show();
}
break;
}
else {
for (int k = 0; k < deviceControlleds.length - 1; k++) {
deviceControlleds[k].setPd(220);
deviceControlleds[k].show();
}
}
}
}
③踩坑心得:
多種條件去進行排序輸出,我們可以轉換成找到一類裝置,然後再按照條件去排序。
④改進建議:
題目要求說我們要按照裝置的順序,並且同種裝置需要根據裝置名稱的大小進行排序
Switch[] s=new Switch[1];
//看排序,把Switch放到另一個陣列Switch陣列裡,然後進行氣泡排序
int num_s=0;
int number=0; //儲存著有多少個開關
for (int i = 0; i < deviceControlings.length; i++) {
if (deviceControlings[i] instanceof Switch) {
number++;
s[num_s]=(Switch) deviceControlings[i];
s= Arrays.copyOf(s,s.length+1);
num_s++;
}
}
for(int i=0;i<s.length-1-1;i++){
for(int k=0;k<s.length-i-1-1;k++){
if (s[k].name>s[k+1].name){
Switch temp=s[k];
s[k]=s[k+1];
s[k+1]=temp;
}
}
}
int number2 = 0;
for (int i = 0; i < s.length - 1; i++) {
s[i].show(); //輸出按開關的名稱編號
if (s[i].state == 1) {// 判斷存在了開關閉合的情況
number2++;
}
}
if (number2 != number) { //存在了開關斷開的情況
for (int k = 0; k < deviceControlleds.length - 1; k++) {
deviceControlleds[k].setPd(0);
deviceControlleds[k].show();
}
3.第六次PTA:
①題目簡介:
相較上一次,多了一種吊扇為落地扇,並且燈具多了白熾燈和日光燈
並且增加了並聯的裝置但是並聯的線路在這裡只有一條
電路計算要包含電流、電阻等電路引數。
但是不用計算引腳的位置。
②內容實現:
1·重新寫了一個排序針對所有的裝置,透過instanceof的函式把找到的同類裝置放入一個新的陣列中然後排序去輸出,然後同理可得複製程式碼。
public void show(){
//按照先排序
Switch[] s=new Switch[1];
//看排序,把Switch放到另一個陣列Switch陣列裡,然後進行氣泡排序
int num_s=0;
for (int i = 0; i < deviceControlings.length-1; i++) {
if (deviceControlings[i] instanceof Switch) {
s[num_s]=(Switch) deviceControlings[i];
s= Arrays.copyOf(s,s.length+1);
num_s++;
}
}
for(int i=0;i<s.length-1-1;i++){
for(int k=0;k<s.length-i-1-1;k++){
if (s[k].name>s[k+1].name){
Switch temp=s[k];
s[k]=s[k+1];
s[k+1]=temp;
}
}
}
for(int i=0;i<s.length-1;i++){
s[i].show();
}
//同理
governorBinning[] gB=new governorBinning[1];
int num_gB=0;
for (int i = 0; i < deviceControlings.length-1; i++) {
if (deviceControlings[i] instanceof governorBinning) {
gB[num_gB]=(governorBinning) deviceControlings[i];
gB= Arrays.copyOf(gB,gB.length+1);
num_gB++;
}
}
for(int i=0;i<gB.length-1-1;i++){
for(int k=0;k<gB.length-i-1-1;k++){
if (gB[k].name>gB[k+1].name){
governorBinning temp=gB[k];
gB[k]=gB[k+1];
gB[k+1]=temp;
}
}
}
for(int i=0;i<gB.length-1;i++){
gB[i].show();
}
//同理
governorContinuous[] gC=new governorContinuous[1];
int num_gC=0;
for (int i = 0; i < deviceControlings.length-1; i++) {
if (deviceControlings[i] instanceof governorContinuous) {
gC[num_gC]=(governorContinuous) deviceControlings[i];
gC= Arrays.copyOf(gC,gC.length+1);
num_gC++;
}
}
for(int i=0;i<gC.length-1-1;i++){
for(int k=0;k<gC.length-i-1-1;k++){
if (gC[k].name>gC[k+1].name){
governorContinuous temp=gC[k];
gC[k]=gC[k+1];
gC[k+1]=temp;
}
}
}
for(int i=0;i<gC.length-1;i++){
gC[i].show();
}
//同理
incandescnetLamp[] iL=new incandescnetLamp[1];
int num_iL=0;
for (int i = 0; i < deviceControlleds.length-1; i++) {
if (deviceControlleds[i] instanceof incandescnetLamp) {
iL[num_iL]=(incandescnetLamp) deviceControlleds[i];
iL= Arrays.copyOf(iL,iL.length+1);
num_iL++;
}
}
for(int i=0;i<iL.length-1-1;i++){
for(int k=0;k<iL.length-i-1-1;k++){
if (iL[k].name>iL[k+1].name){
incandescnetLamp temp=iL[k];
iL[k]=iL[k+1];
iL[k+1]=temp;
}
}
}
for(int i=0;i<iL.length-1;i++){
iL[i].show();
}
//同理
fluorescentLamp[] fL=new fluorescentLamp[1];
int num_fL=0;
for (int i = 0; i < deviceControlleds.length-1; i++) {
if (deviceControlleds[i] instanceof fluorescentLamp) {
fL[num_fL]=(fluorescentLamp) deviceControlleds[i];
fL= Arrays.copyOf(fL,fL.length+1);
num_fL++;
}
}
for(int i=0;i<fL.length-1-1;i++){
for(int k=0;k<fL.length-i-1-1;k++){
if (fL[k].name>fL[k+1].name){
fluorescentLamp temp=fL[k];
fL[k]=fL[k+1];
fL[k+1]=temp;
}
}
}
for(int i=0;i<fL.length-1;i++){
fL[i].show();
}
//同理
ceilingFan[] cF=new ceilingFan[1];
int num_cF=0;
for (int i = 0; i < deviceControlleds.length-1; i++) {
if (deviceControlleds[i] instanceof ceilingFan) {
cF[num_cF]=(ceilingFan) deviceControlleds[i];
cF= Arrays.copyOf(cF,cF.length+1);
num_cF++;
}
}
for(int i=0;i<cF.length-1-1;i++){
for(int k=0;k<cF.length-i-1-1;k++){
if (cF[k].name>cF[k+1].name){
ceilingFan temp=cF[k];
cF[k]=cF[k+1];
cF[k+1]=temp;
}
}
}
for(int i=0;i<cF.length-1;i++){
cF[i].show();
}
//同理
FloorFan[] fF=new FloorFan[1];
int num_fF=0;
for (int i = 0; i < deviceControlleds.length-1; i++) {
if (deviceControlleds[i] instanceof FloorFan) {
fF[num_fF]=(FloorFan) deviceControlleds[i];
fF= Arrays.copyOf(fF,fF.length+1);
num_fF++;
}
}
for(int i=0;i<fF.length-1-1;i++){
for(int k=0;k<fF.length-i-1-1;k++){
if (fF[k].name>fF[k+1].name){
FloorFan temp=fF[k];
fF[k]=fF[k+1];
fF[k+1]=temp;
}
}
}
for(int i=0;i<fF.length-1;i++){
fF[i].show();
}
2·然後對於如何實現電路的電阻和電壓的賦值在每個串聯電路和每個並聯電路都設定電阻,把並聯電路看作是一個用電器,然後每個串聯電路都有設定總電阻,然後串聯電路和並聯電路都有設定總電壓的函式,當我們把幹路上賦值完之後,我們可以設定每個用電器的電壓和電阻。
public void setsetVoltageAll(){
//先給並聯賦電阻值
//2.再給各個串聯電路賦電阻值
if(parallelDevice!=null){
parallelDevice.setResistanceAll();
}
for(int i=0;i<tandemDevices.length-1;i++){
tandemDevices[i].setResistanceAll();
}
tandemDevices[tandemDevices.length-1-1].setVoltageAll(220);
tandemDevices[tandemDevices.length-1-1].setVoltageApart();
if(parallelDevice!=null){
parallelDevice.setVoltageApart();
for(int i=0;i<parallelDevice.tandemDevices.length-1;i++){
// parallelDevice.tandemDevices[i].setVoltageAll(parallelDevice.voltageAll);
parallelDevice.tandemDevices[i].setVoltageApart();
}
}
3·對於並聯我們要有特殊判斷,因為並聯電路上的一條支鏈如果全是開關閉合,那麼並聯電路就被短路了。
//先判斷並聯支路短路的情況
int target = 0;
for (int i = 0; i < tandemDevices.length - 1; i++) {
int num = 0;
if (tandemDevices[i].deviceControlings != null) { //檢視控制裝置開關的開閉
for (int j = 0; j < tandemDevices[i].deviceControlings.length - 1; j++) {
//存在用電器為零個,開關閉合,形成短路
if (tandemDevices[i].deviceControlings[j] instanceof Switch && ((Switch) tandemDevices[i].deviceControlings[j]).state == 1) {
num = 1;
} else if (tandemDevices[i].deviceControlings[j] instanceof Switch && ((Switch) tandemDevices[i].deviceControlings[j]).state == 0) {
num = 0;
break;
}
}
}
if (num == 1 && tandemDevices[i].deviceControlleds == null) { //開關都閉合,無用電器器
target = 1;
break;
}
}
if (target == 1) {
this.resistanceAll = 0;
}
③踩坑心得:
1·要考慮到多種情況,比如說並聯的的短路情況
2·我們還要考慮到是否在這次情況中有並聯和串聯的電路,所以要加特判。
if(parallelDevice!=null){
parallelDevice.setVoltageApart();
for(int i=0;i<parallelDevice.tandemDevices.length-1;i++){
// parallelDevice.tandemDevices[i].setVoltageAll(parallelDevice.voltageAll);
parallelDevice.tandemDevices[i].setVoltageApart();
}
}
3·我們動態增加陣列我們也要加特判如果開始時空則宣告,之後用Arrays.copyOf函式去動態增加。
public void setTandemDevices(TandemDevice tandemDevices) {
if (this.tandemDevices == null) {
this.tandemDevices = new TandemDevice[1];
}
this.tandemDevices[i] = tandemDevices;
i++;
this.tandemDevices = Arrays.copyOf(this.tandemDevices, this.tandemDevices.length + 1);
}
④改進建議:
1·使用動態陣列去增加長度時,要防止你多次去宣告,把資料覆蓋掉;
2·從總壓到分壓,要注意其誤差。