1. 程式人生 > 其它 >三次PTA題目集的總結

三次PTA題目集的總結

一、前言

這三次PTA作業涉及的知識量非常廣,這幾次作業主要是進行了一些Java基礎語法和麵向物件思想的鍛鍊。

1、第一次作業

每一道作業都使用了Scanner類進行鍵盤輸入,而其中第二題和第六題使用了Java中陣列的知識,剩下的幾道題都是使用if-else或switch語法進行解答,一共八道題,題目是數量雖然較多,但是題目都比較簡單,只有最後一道題稍微難一點。

2、第二次作業

第二次作業一共五題,第一題IP地址轉換中主要使用了String類中的charAt()方法和substring()方法以及Integer類中的parseInt()方法,第二題則使用了Arrays類中的sort()方法和增強for迴圈,後三道題都是有關日期的題目使用陣列和if-else便可以解答,這幾道題目都比較簡單。


3、第三次作業

第三次作業一共三題,題目不算多,這幾題主要是為了鍛鍊我們的面向物件的思想。每一題都要採用類進行解答,在這幾題get和set方法對進行問題的解答有著很大的幫助,前兩題比較簡單,而最後一道題較難,在最後一道題中使用到了正則表示式、String類中的repalce()方法、split()方法、charAt()方法、indexOf()方法和substring()方法,StringBuilder類中的append()方法和toString()方法,BigInteger類中的multiply()方法、subtract()方法、equals()方法和compareTo()方法,這道題運用的知識非常多導致其相較於前兩題較難。

二、設計與分析

1、判斷三角形型別

輸入格式:

在一行中輸入三角形的三條邊的值(實型數),可以用一個或多個空格或回車分隔,其中三條邊的取值範圍均為[1,200]。

輸出格式:

(1)如果輸入資料非法,則輸出“Wrong Format”; (2)如果輸入資料合法,但三條邊不能構成三角形,則輸出“Not a triangle”; (3)如果輸入資料合法且能夠成等邊三角形,則輸出“Equilateral triangle”; (3)如果輸入資料合法且能夠成等腰直角三角形,則輸出“Isosceles right-angled triangle”; (5)如果輸入資料合法且能夠成等腰三角形,則輸出“Isosceles triangle”; (6)如果輸入資料合法且能夠成直角三角形,則輸出“Right-angled triangle”; (7)如果輸入資料合法且能夠成一般三角形,則輸出“General triangle”。

我寫的程式碼如下:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double num1=sc.nextDouble();
double num2=sc.nextDouble();
double num3=sc.nextDouble();
double temp;
if(num1>num2){
temp=num1;num1=num2;num2=temp;
}
if(num1>num3){
temp=num1;num1=num3;num3=temp;
}
if(num2>num3){
temp=num2;num2=num3;num3=temp;
}
if(num1>=1&&num1<=200&&num2>=1&&num2<=200&&num3>=1&&num3<=200){
if(num1+num2>num3){
if(num1==num2&&num2==num3)
System.out.println("Equilateral triangle");
else if(num1*num1+num2*num2-num3*num3<0.000001&&num1==num2)
System.out.println("Isosceles right-angled triangle");
else if((num1==num2&&num1!=num3)||(num1==num3&&num1!=num2)||(num2==num3&&num2!=num1))
System.out.println("Isosceles triangle");
else if(num1*num1+num2*num2-num3*num3<0.000001)
System.out.println("Right-angled triangle");
else
System.out.println("General triangle");
}
else
System.out.println("Not a triangle");
}
else
System.out.println("Wrong Format");
}
}
我這道題的Source Monitor:

從Source Monitor可以看出我這份程式碼是不夠合格的,Avg Complexity、AvgDepth等都是超標了的,其原因是我使用了很多if-else語句、&&和||運算子,這道題目的思路會很清晰,就是不斷判斷不同三角形的各自的特點,這隻能使用if-else進行解答。

2、求下一天

輸入格式:

在一行內輸入年月日的值,均為整型數,可以用一到多個空格或回車分隔。

輸出格式:

  1. 當輸入資料非法及輸入日期不存在時,輸出“Wrong Format”;
  2. 當輸入日期合法,輸出下一天,格式如下:Next date is:年-月-日
我這道題的Source Monitor:

從圖中可以看出這份程式碼的各項指標基本處於綠色內,證明這份程式碼還是比較良好的,這道題思路同樣比較清晰,進行輸入後求下一天,需要注意的是要注意月末時月份會加一而日會變成一,其中當月份為12時,年份也同樣會進行加一操作。


3、求前N天

輸入格式:

在一行中輸入年月日的值以及n的值,可以用一個或多個空格或回車分隔。

輸出格式:

  1. 當輸入的年、月、日以及n的值非法時,輸出“Wrong Format”;
  2. 當輸入資料合法時,輸出“n days ago is:年-月-日”
我這道題的Source Monitor:

由此可以看出各項指標都處於綠色內,這說明這份程式碼是良好的,這一題其實是求後一天的變化題,這道題的解題思路就像上一題那樣,只不過這個n可以較大且可以為負數,將其是正數還是負數分類討論即可完成這道題目。

4、定義日期類

輸入格式:

在一行內輸入年月日的值,均為整型數,可以用一到多個空格或回車分隔。

輸出格式:

  • 當輸入資料非法及輸入日期不存在時,輸出“Date Format is Wrong”;
  • 當輸入日期合法,輸出下一天,格式如下:Next day is:年-月-日
我這道題的Source Monitor:

這道題除了Max Complexity較高之外,其餘的指標都處於綠色範圍內,這道題其實就是用類的思想來實現第二次作業的第三題,使用get和set方法可以更加方便地進行資料的存取。


5、一元多項式求導(類設計)

輸入格式:

在一行內輸入一個待計算導函式的表示式,以回車符結束。

輸出格式:

  1. 如果輸入表示式不符合上述表示式基本規則,則輸出“Wrong Format”。
  2. 如果輸入合法,則在一行內正常輸出該表示式的導函式,注意以下幾點: 結果不需要排序,也不需要化簡;
  • 當某一項為“0”時,則該項不需要顯示,但如果整個導函式結果為“0”時,則顯示為“0”;
  • 當輸出結果第一項係數符號為“+”時,不輸出“+”;
  • 當指數符號為“+”時,不輸出“+”;
  • 當指數值為“0”時,則不需要輸出“x^0”,只需要輸出其係數即可。
我這道題的Source Monitor:

從中可以看出這道題的複雜程度,這道題要使用正則表示式、BigInteger類中的一些方法、String類中的一些方法和StringBuilder類中的一些方法綜合運用進行解答,我在寫這題時一開始也遇到了許多問題。

三、踩坑心得

1、首先就是程式設計中最常見的錯誤了,有時在提交程式碼時莫名其妙會多出字元或少了字元。如圖所示:

在這次提交中就在最後一行少了一個}符號。

2、輸出格式錯誤

在這次提交中因為一個空格導致格式錯誤。

3、在寫判斷三角形型別這道題時,我沒有考慮到Java中沒有根號,導致在判斷等腰直角三角形時答案錯誤

利用餘弦定理判斷是否為直角時需要兩個邊的平方和減去第三條邊的平方小於0.000001即可

4、在使用類的思想時在類的前面加了public導致編譯錯誤

我在一開始使用類時並不知道在main類中其他的class不能用public進行修飾。

5、在寫一元多項式求導這道題時,我一開始並沒有使用正則表示式和BigInteger類,在中途時仔細看了word文件發現了正則表示式和大資料測試,在經過正則表示式的學習後,我利用正則表示式的匹配輕鬆地

解決了多項式的合格檢驗問題,而學習了BigInteger類後,知道了BigInteger類的底層是使用了陣列來進行超大整數的表示,而且其中的multiply()方法、subtract()方法正好可以用於多項式的求導。

小總結:這幾次作業暴露了我很多的問題,比如:粗心、知識量不足等,在程式設計中應當仔細,在不使用IDE時我們很難發現一些小錯誤,一些符號的漏寫和多寫。我們同樣要注意輸出的格式一定要按照題目來,不然就會沒一個答案正確,現在我們還只是學習到了Java的一些皮毛,對Java的學習還遠遠不夠,我希望在將來的學習中我能學習到更多的知識,同時我還應該多看、多寫、多用API,對其中的常用的類和方法進行更多的學習,要更加靈活地運用這些類和方法。

四、改進建議

1、在判斷三角形型別這道題中,我使用了很多if-else語句導致其的圈複雜度很高,但因為這道題就是進行一個判斷,我也很難降低其的圈複雜度。

2、在第二次作業的第三題中,我使用了很多if-else語句進行資料合理性判斷,在提交時結果完全正確,但在下一題的使用中出現了錯誤,下一題的程式碼限制長度為3KB,我的程式碼過於長導致出現錯誤,而發現利用陣列可以很好的解決這一問題。

這是我資料合理性判斷的程式碼:

              if(b<1||b>12){
System.out.println("Wrong Format");
return;
}
if(c<1){
System.out.println("Wrong Format");
return;
}
if(b==1&&c>31){
System.out.println("Wrong Format");
return;
}
if(b==2&&isLeapYear(a)&&c>29){
System.out.println("Wrong Format");
return;
}
if(b==2&& !isLeapYear(a) &&c>28){
System.out.println("Wrong Format");
return;
}
if(b==3&&c>31){
System.out.println("Wrong Format");
return;
}
if(b==4&&c>30){
System.out.println("Wrong Format");
return;
}
if(b==5&&c>31){
System.out.println("Wrong Format");
return;
}
if(b==6&&c>30){
System.out.println("Wrong Format");
return;
}
if(b==7&&c>31){
System.out.println("Wrong Format");
return;
}
if(b==8&&c>31){
System.out.println("Wrong Format");
return;
}
if(b==9&&c>30){
System.out.println("Wrong Format");
return;
}
if(b==10&&c>31){
System.out.println("Wrong Format");
return;
}
if(b==11&&c>30){
System.out.println("Wrong Format");
return;
}
if(b==12&&c>31){
System.out.println("Wrong Format");
return;
}

改進前這個程式碼很長,而且使用了很多if-else和&&,圈複雜度很高。
boolean checkInputValidity;
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(!isLeapYear(year))
a[2] = 28;
checkInputValidity = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=a[month]&&day>0);
return checkInputValidity;
利用陣列改進後只需要幾行程式碼就能直接判斷資料合理性。

3、在一元多項式求導這道題中,陣列可以來進行字串匹配,但這樣的效率很低,而使用正則表示式則可以很好地解決這一問題,Java中int型別有效範圍為-2,147,483,648至2,147,483,647,long類型範圍是-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 ,而這道題測試的資料結果在long類型範圍之外,導致使用long不能完全正確,使用BigInteger類則可以很好地解決這一問題,其中的很多方法也很好地解決了多項式求導的問題。

五、總結

在這幾次作業中我學到了很多,,我瞭解了自己的不足,在程式設計中最重要的就是要仔細,我學習了正則表示式和BigInteger類這兩個我之前完全不知道的知識以及通過作業進一步瞭解了面向物件的思想,類中的get和set方法對於資料的存取非常好用。老師在上課時講的雨刷問題和農夫過河問題很大地提升了我對面向物件的理解,希望老師還能多多在上課時讓我們進行實踐。