PTA題目集1-3總結(22207331-張博文)

xxxxxx001x發表於2024-10-26

總體情況預覽:
第一次:
第二次:
第三次:

(1)前言:

前三次作業題量適中,但是難度較大!
題目集作業主要考察了以下知識點:

一、基礎語法

1. 變數與資料型別:包括整型(int、long 等)、浮點型(float、double)、字元型(char)、布林型(boolean)等資料型別的定義和使用。
2. 運算子:算術運算子(+、-、*、/、%)、關係運算子(==、!=、>、<、>=、<=)、邏輯運算子(&&、||、!)等的使用。
3. 控制流語句:
條件語句(if-else、switch-case):根據不同條件執行不同的程式碼塊。
迴圈語句(for、while、do-while):用於重複執行一段程式碼。

二、物件導向程式設計

1. 類與物件:定義類、建立物件、訪問物件的屬性和方法。
要求理解類的封裝性、繼承性和多型性。
2. 方法:定義方法、呼叫方法、方法的引數傳遞和返回值。
可能涉及方法的過載和重寫。
3. 建構函式:
封裝:將資料和操作封裝在類中,透過訪問修飾符控制訪問許可權。
繼承:子類繼承父類的屬性和方法,實現程式碼複用。
多型:透過方法重寫和向上轉型實現多型性,使程式更加靈活。

三、陣列與集合

1. 陣列:定義陣列、初始化陣列、遍歷陣列。
可能會涉及陣列的排序和查詢操作。
2. 集合框架:
ArrayList和LinkedList 等集合類的使用。
掌握集合的新增、刪除、遍歷等操作。

四、異常處理

1. 理解異常的概念和分類。
2. 掌握 try-catch 語句塊的使用,捕獲和處理異常。
3. 可能會要求自定義異常類並進行處理。

五、輸入輸出

1. 控制檯輸入輸出:使用 Scanner 類進行控制檯輸入,System.out.println()進行輸出。
2. 檔案輸入輸出:瞭解如何讀取和寫入檔案。

(2)設計與分析:

題目集一-7.1:
設計一個名為Fan的類表示一個風扇。這個類包括:

1.三個名為SlOW、MEDIUM和FAST,其值為1、2和3常量表示風扇的速度。

2.一個名為speed的int型別私有資料域表示風扇的速度(預設值為SLOW)。

3.一個名為on的boolean型別私有資料域表示風扇是否開啟(預設值為false)。

4.一個名為radius的double型別私有資料域表示風扇的半徑(預設值為5)。

5.一個名為color的string型別資料域表示風扇的顏色(預設值為white)。

6.這四個成員變數(資料域)的訪問器和修改器。

7.一個無參構造方法;

8.一個有參構造方法 public Fan(int fanSpeed,boolean fanOn,double fanRadius,String fanColor) { ... },

9.一個名為toString()的方法返回描述風扇的字串。如果風扇是開啟的,那麼該方法在一個組合的字串中返回風扇的速度、顏色和半徑。如果風扇沒有開啟,該方法就會返回一個由"fan is off"和風扇顏色以及半徑組合成的字串。

請在自己的草稿本上畫出UML圖,養成良好的設計習慣。

要求:建立兩個Fan物件:

第一個物件利用無參構造方法構造預設風扇物件Fan1;

第二個物件依據輸入的風扇屬性,呼叫有參構造方法構造自定義風扇物件Fan2。

透過呼叫它們的toString方法顯示這些物件。

部分程式碼如下:
import java.util.*;
class Fan{
public final int SlOW=1;
public final int MEDIUM=2;
public final int FAST=3;
private int speed=SlOW;
private boolean on=false;
private double radius=5;
private String color="white";
public Fan(){}
public void setSpeed(int speed) {
this.speed = speed;
}
public Fan(int fanSpeed,boolean fanOn,double fanRadius,String Color){
this.speed=fanSpeed;
this.on=fanOn;
this.radius=fanRadius;
this.color=Color;
}
public String toString(){
String s="speed "+speed+"\n"+"color "+color+"\n"+"radius "+radius+"\n";
if(on==false) s+="fan is off";
else s+="fan is on";
return s;
}
public class Main{
public static void main(String[] args){
System.out.println("-------\n"+ "Default\n"+ "-------");
Fan fan1=new Fan();
System.out.println(fan1.toString());
System.out.println("-------\n"+ "My Fan\n"+ "-------");
Scanner in=new Scanner(System.in);
int fanSpeed=in.nextInt();
boolean fanOn=in.nextBoolean();
double fanRadius=in.nextDouble();
String Color=in.next();
Fan fan2=new Fan(fanSpeed,fanOn,fanRadius,Color);
System.out.println(fan2.toString());
}
}

程式碼解釋:

  1. Fan類的整體結構
    這個Java程式定義了一個名為Fan的類來表示風扇的相關屬性和行為,以及一個包含main方法的Main類來測試Fan類的功能。
  2. Fan類中的常量
    在Fan類中,定義了三個public final型別的常量:SlOW、MEDIUM和FAST,它們的值分別為1、2和3。這些常量用於表示風扇可能的速度級別,一旦定義就不能被修改,提供了一種清晰的方式來指定風扇速度的取值範圍。
  3. 私有資料域
    private int speed = SlOW;:定義了一個私有整數型別的資料域speed來表示風扇的速度,預設值被初始化為SlOW常量所代表的值,即1。
    private boolean on = false;:一個私有布林型別的資料域on,用於表示風扇是否處於開啟狀態,初始預設值為false,表示風扇初始是關閉的。
    private double radius = 5;:私有雙精度型別的資料域radius,用於表示風扇的半徑,預設值為5。
    private String color = "white";:私有字串型別的資料域color,用於表示風扇的顏色,預設值為"white"。
  4. 訪問器和修改器方法(getter 和 setter)
    對於每個私有資料域,都定義了相應的訪問器(getter)和修改器(setter)方法。
    例如,public int getSpeed()方法用於獲取風扇的速度值,它返回speed資料域的值。
    public void setSpeed(int speed)方法用於設定風扇的速度,它接受一個整數引數,並將該引數賦值給speed資料域。
    類似地,還有getOn、setOn、getRadius、setRadius、getColor和setColor等方法,分別用於獲取和設定風扇的開關狀態、半徑和顏色等屬性。
  5. 構造方法
    無參構造方法:public Fan()是一個無參構造方法,當建立Fan物件時如果沒有傳入任何引數,就會呼叫這個構造方法。它會使用之前定義的私有資料域的預設值來初始化一個風扇物件,即速度為SlOW、關閉狀態、半徑為5、顏色為"white"。
    有參構造方法:public Fan(int fanSpeed, boolean fanOn, double fanRadius, String Color)是一個有參構造方法,它接受四個引數,分別用於初始化風扇的速度、開關狀態、半徑和顏色。在方法內部,將傳入的引數值賦給相應的私有資料域,從而建立一個具有指定屬性的風扇物件。
  6. toString方法
    public String toString()方法用於返回一個描述風扇狀態的字串。它首先構建一個包含風扇速度、顏色和半徑資訊的字串,然後根據風扇的開關狀態(透過on資料域判斷),如果風扇是關閉的(on == false),就在字串末尾新增"fan is off";如果風扇是開啟的,就在字串末尾新增"fan is on"。最後返回這個完整的描述字串。
  7. Main類中的main方法
    在Main類的main方法中:
    首先輸出一段分隔線和"Default"字樣,表示接下來要建立並展示預設的風扇物件。然後透過Fan fan1 = new Fan();使用無參構造方法建立了一個預設的風扇物件fan1,並透過System.out.println(fan1.toString());呼叫fan1的toString方法將其狀態資訊輸出到控制檯。
    接著輸出另一段分隔線和"My Fan"字樣,表示接下來要建立一個自定義屬性的風扇物件。透過建立Scanner物件來獲取使用者從控制檯輸入的風扇屬性值,包括速度(fanSpeed)、開關狀態(fanOn)、半徑(fanRadius)和顏色(Color)。然後使用這些輸入的值透過Fan fan2 = new Fan(fanSpeed, fanOn, fanRadius, Color);呼叫有參構造方法建立了一個自定義的風扇物件fan2,最後透過System.out.println(fan2.toString());輸出fan2的狀態資訊到控制檯,展示了自定義風扇的相關屬性和狀態。
    總體來說,這段程式碼實現了一個簡單的Fan類來模擬風扇的基本屬性和行為,並透過Main類中的main方法進行了測試,展示瞭如何建立預設和自定義屬性的風扇物件以及獲取它們的狀態資訊。

題目集二-7.2:
按要求完成程式的編寫。
1、定義圓類Circle,其中包括:
(1)成員變數:private int radius
(2)無參構造方法 ,給radius賦值為2,並輸出資訊:"This is a constructor with no para.";
(2)有參構造方法 ,接收使用者給的radius賦值,並輸出"This is a constructor with para."(如果給的半徑小於等於0,則賦預設值為2);
(3)為radius新增set方法,接收使用者輸入的半徑,如果使用者輸入半徑為<=0,則讓半徑的值為2;
(4)為radius半徑新增get方法,返回使用者輸入的半徑;
(5)求圓面積方法getArea(), π使用Math.PI代替;
(6)定義toString方法,public String toString( )方法體為:
return "Circle [radius=" + radius + "]";
2、定義Main類,在main方法中,完成下列操作:
(1)定義並建立Circle類物件c1,輸出c1物件,求c1的面積並輸出;
(2)定義並建立Circle類物件c2,輸出c2物件,求c2的面積並輸出;
(3)從鍵盤接收整數半徑,賦值給c2的半徑,輸出c2物件,求c2的面積並輸出;
(4)從鍵盤接收整數半徑,用有參構造方法建立Circle類物件c3,輸出c3物件,求c3的面積後輸出。

部分程式碼如下:

import java.util.Scanner;
class Circle {
private int radius;
public Circle() {
radius = 2;
System.out.println("This is a constructor with no para.");
}
public Circle(int radius) {
if (radius <= 0) {
this.radius = 2;
} else {
this.radius = radius;
}
System.out.println("This is a constructor with para.");
}
}
public class Main {
public static void main(String[] args) {
Circle c1 = new Circle();
System.out.println(c1);
System.out.printf("%.2f\n", c1.getArea());
Circle c2 = new Circle();
System.out.println(c2);
System.out.printf("%.2f\n", c2.getArea());
Scanner scanner = new Scanner(System.in);
int radius = scanner.nextInt();
c2.setRadius(radius);
System.out.println(c2);
System.out.printf("%.2f\n", c2.getArea());
radius = scanner.nextInt();
Circle c3 = new Circle(radius);
System.out.println(c3);
System.out.printf("%.2f\n", c3.getArea());
}
}

程式碼解釋:

  1. Circle類
    成員變數:
    private int radius;:定義了一個私有整型變數radius,用於儲存圓的半徑。將其設為私有可以限制對該變數的直接訪問,只能透過類提供的方法來操作它,保證了資料的封裝性。
    構造方法:
    無參構造方法:
    public Circle() {... }:這是無參構造方法。當建立Circle物件時,如果沒有傳入任何引數,就會呼叫這個方法。在方法內部,將radius賦值為2,並輸出"This is a constructor with no para.",用於提示使用者當前呼叫的是無參構造方法且已完成物件的初始化操作。
    有參構造方法:
    public Circle(int radius) {... }:這個是有參構造方法,它接收一個整數引數radius。在方法內部,首先判斷傳入的radius值是否小於等於0,如果是,則將類中的radius成員變數賦值為2(即設定預設值);如果傳入的radius值大於0,則將傳入的值賦給成員變數radius。最後輸出"This is a constructor with para.",提示使用者當前呼叫的是有參構造方法且已完成物件的初始化操作。
    訪問器和修改器方法(getter 和 setter):
    getRadius方法:
    public int getRadius() { return radius; }:這是radius的訪問器方法(getter),它返回radius成員變數的值,使得外部程式碼可以獲取圓的半徑資訊。
    setRadius方法:
    public void setRadius(int radius) {... }:這是radius的修改器方法(setter)。它接收一個整數引數radius,並在方法內部判斷該引數是否小於等於0。如果是,則將類中的radius成員變數賦值為2;如果引數大於0,則將傳入的引數值賦給成員變數radius。這樣就可以透過這個方法來安全地修改圓的半徑值,同時保證半徑不會被設定為無效的值(小於等於0)。
    業務方法:
    getArea方法:
    public double getArea() { return Math.PI * radius * radius; }:這個方法用於計算圓的面積。它根據圓的面積公式S = πr²,其中π使用Math.PI來表示,radius是透過getRadius方法獲取到的圓的半徑值,計算出圓的面積並返回結果。
    toString方法:
    @Override
    public String toString() { return "Circle [radius=" + radius + "]"; }:這個方法重寫了Object類中的toString方法。它返回一個包含圓的半徑資訊的字串,格式為"Circle [radius=" + radius + "]",這樣當我們直接輸出Circle物件時,就會顯示出這個有意義的字串,而不是物件的預設雜湊碼等無意義資訊,方便我們檢視圓的相關資訊。
  2. Main類
    main方法:
    首先建立了兩個Circle類的物件c1和c2,都是透過無參構造方法建立的。
    對於c1:
    Circle c1 = new Circle();:呼叫無參構造方法建立c1物件,此時c1的半徑被初始化為2,並且控制檯會輸出"This is a constructor with no para."。
    System.out.println(c1);:輸出c1物件,由於Circle類重寫了toString方法,所以會輸出"Circle [radius=2]",展示了c1的半徑資訊。
    System.out.printf("%.2f\n", c1.getArea());:呼叫c1的getArea方法計算並輸出c1的圓面積,保留兩位小數。
    對於c2:
    Circle c2 = new Circle();:同樣呼叫無參構造方法建立c2物件,半徑也初始化為2,控制檯輸出"This is a constructor with no para."。
    後續對c2進行的操作與c1類似,先輸出c2物件(顯示半徑資訊),再計算並輸出c2的圓面積。
    然後從鍵盤接收一個整數半徑值,並將其賦值給c2的半徑。
    Scanner scanner = new Scanner(System.in);:建立一個Scanner物件,用於從鍵盤讀取使用者輸入。
    int radius = scanner.nextInt();:從鍵盤讀取一個整數,並將其賦值給radius變數。
    c2.setRadius(radius);:呼叫c2的setRadius方法,將讀取到的半徑值設定給c2。如果讀取到的值小於等於0,setRadius方法會將c2的半徑設定為2。
    之後再次輸出c2物件和計算其圓面積並輸出,此時c2的半徑可能已經根據使用者輸入或預設值進行了更新。
    最後再次從鍵盤接收一個整數半徑值,並用有參構造方法建立Circle類的物件c3。
    radius = scanner.nextInt();:再次從鍵盤讀取一個整數,覆蓋之前的radius變數值。
    Circle c3 = new Circle(radius);:呼叫Circle類的有參構造方法建立c3物件,根據讀取到的半徑值來初始化c3的半徑。如果讀取到的值小於等於0,有參構造方法會將c3的半徑設定為2。
    同樣,先輸出c3物件展示半徑資訊,然後計算並輸出c3的圓面積。
    總體來說,這段程式碼實現了一個簡單的Circle類來表示圓的基本屬性(半徑)和行為(計算面積),並透過Main類中的main方法進行了測試,展示瞭如何透過不同的構造方法建立圓物件、修改圓的半徑以及計算圓的面積等操作。

題目集三-7.2:
7-2 jmu-java-日期類的基本使用
要求,給定一個日期,判定是否為合法日期。如果合法,判斷該年是否閏年,該日期是當年第幾天、當月第幾天、當週第幾天、。
給定起始日期與結束日期,判定日期是否合法且結束日期是否早於起始日期。如果均合法,輸出結束日期與起始日期之間的相差的天數、月數、唸書。

部分程式碼如下:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String line = input.nextLine();
String nextLine = input.nextLine();//輸入日期 格式為2020/3/21
String[] arr = line.split("-"); // 以/為分隔符,提取年月日
int year = Integer.parseInt(arr[0]); //轉換為int型
int mouth = Integer.parseInt(arr[1]);
int day = Integer.parseInt(arr[2]);
String[] arr1 = nextLine.split(" ");
boolean valid1=Main.isValidDate(arr1[0],"yyyy-MM-dd");
boolean valid2=Main.isValidDate(arr1[1],"yyyy-MM-dd");
if (valid1false||valid2false){
System.out.println(arr1[0]+"或"+arr1[1]+"中有不合法的日期.");
System.exit(0);
}
DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
try {
Date star = dft.parse(arr1[0]);//開始時間
String[] st1=arr1[0].split("-");
Date end = dft.parse(arr1[1]);
if (star.before(end)){
Year firstYear = Year.of(t11);
i3=t22-t11;
Calendar c1 = Calendar.getInstance();
//這裡有bug必須減1
c1.set(t11, t1-1, Integer.parseInt(st1[2])); // 設定年月日,時分秒將預設採用當前值
int yearDay = c1.get(Calendar.DAY_OF_YEAR);
Calendar c2 = Calendar.getInstance();
//這裡有bug必須減1
c2.set(t22, t2-1, Integer.parseInt(st2[2])); // 設定年月日,時分秒將預設採用當前值
int yearDa2y = c2.get(Calendar.DAY_OF_YEAR);
if (firstYear.isLeap(t11)){
int temp=yearDa2y+(366-yearDay);
if (end.before(star)){
System.out.println(arr1[1]+"早於"+arr1[0]+",不合法!");
System.exit(0);
}
if ((judge(t11,t1,Integer.parseInt(st1[2]))true)&&judge(t22,t2,Integer.parseInt(st2[2]))true){
System.out.println(arr1[1]+"與"+arr1[0]+"之間相差"+i1+"天,"+"所在月份相差"+i2+",所在年份相差"+i3+".");
}else {
System.out.println(arr1[0]+"或"+arr1[1]+"中有不合法的日期.");
}
} catch (ParseException e) {
e.printStackTrace();
}
public static boolean isValidDate(String dttm,String format) {
if (dttm == null || dttm.isEmpty() || format == null || format.isEmpty()) {
return false;
}
if (format.replaceAll("'.+?'", "").indexOf("y") < 0) {
format += "/yyyy";
DateFormat formatter = new SimpleDateFormat("/yyyy");
dttm += formatter.format(new Date());
}
String regex = "^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$";
DateFormat formatter = new SimpleDateFormat(format);
formatter.setLenient(false);
ParsePosition pos = new ParsePosition(0);
Date date = formatter.parse(dttm, pos);
程式碼解釋:

  1. 整體功能概述
    這段 Java 程式碼主要實現了兩個功能:一是判斷給定的單個日期是否合法,並在合法的情況下進一步判斷該年是否為閏年以及該日期在當年、當月、當週是第幾天;二是判斷給定的起始日期和結束日期是否合法,且結束日期是否不早於起始日期,若均合法則計算並輸出兩個日期之間相差的天數、月數和年數。
  2. 程式碼結構及主要方法解釋
    main方法
    在main方法中,首先透過Scanner從控制檯讀取使用者輸入的兩行字串,分別用於處理單個日期判斷和起始日期與結束日期的判斷相關操作。
    處理單個日期判斷:
    讀取使用者輸入的單個日期字串(格式如2020/3/21),透過split方法以/為分隔符將其拆分成包含年、月、日的字串陣列,再將各部分轉換為整數型別。
    呼叫isValidDate方法判斷該日期是否合法格式,同時呼叫judge方法進一步從數值範圍角度判斷日期是否合理(例如每月的天數是否符合實際情況)。若兩者都為真,則進行後續操作:
    建立Calendar例項,設定其年、月(這裡存在一個小問題,設定月份時應該減 1,因為Calendar類中月份是從 0 開始計數的)、日,然後透過Calendar的相關方法獲取該日期是當年第幾天(DAY_OF_YEAR)、當月第幾天(DAY_OF_MONTH)以及當週第幾天(DAY_OF_WEEK,這裡還對獲取到的星期值進行了調整,將週日的值從 1 調整為 7,其他星期值減 1,使其符合常規的星期計數習慣)。
    透過Year類判斷該年是否為閏年,如果是則輸出相應提示,並最終輸出該日期在當年、當月、當週的天數資訊。若日期不合法,則輸出相應的無效提示。
    處理起始日期與結束日期判斷:
    讀取使用者輸入的包含起始日期和結束日期的字串(格式如2020-03-21 2021-05-10),同樣透過split方法拆分出兩個日期字串,分別呼叫isValidDate方法判斷它們是否合法格式。若其中有不合法的日期,則輸出相應提示並結束程式。
    若兩個日期格式都合法,透過SimpleDateFormat將日期字串解析為Date型別物件,以便後續比較和計算。同時提取出年、月、日的整數值用於後續計算。
    判斷起始日期和結束日期的先後順序,若結束日期早於起始日期,則輸出相應提示並結束程式。
    若起始日期和結束日期順序正確且都合法,透過一系列複雜的計算來確定兩個日期之間相差的天數、月數和年數:
    首先根據起始日期和結束日期的年份判斷是否為閏年,然後透過Calendar例項分別獲取兩個日期是當年第幾天。
    對於相差的天數計算,分閏年和非閏年情況進行處理,在計算過程中還需要考慮中間年份的閏年情況,透過迴圈遍歷中間年份並根據是否為閏年累加相應的天數,最後加上起始日期到當年結束的天數以及結束日期在當年的天數得到總相差天數。
    對於相差的月數,直接用結束日期的月份減去起始日期的月份得到。
    對於相差的年數,用結束日期的年份減去起始日期的年份得到。
    最後輸出兩個日期之間相差的天數、月數和年數的資訊。
    isValidDate方法
    該方法用於判斷給定的日期字串是否為合法的日期格式。
    首先進行一些基本的空值和格式字串的校驗,如果日期字串或格式字串為空,則直接返回false。
    如果格式字串中不包含y(用於表示年),則在格式字串末尾新增/yyyy,並將當前日期的年份新增到日期字串末尾,以確保能夠正確解析年份。
    透過正規表示式^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$來校驗日期字串是否符合yyyy-MM-dd的格式,如果不符合則返回false。
    建立SimpleDateFormat例項並設定為非寬鬆模式(setLenient(false)),然後透過ParsePosition嘗試解析日期字串。如果解析結果為null或者解析過程中出現錯誤(透過getErrorIndex判斷),或者解析的索引位置不等於日期字串的長度(表示沒有完全解析成功),或者解析出的年份大於 9999,則都返回false。只有在所有校驗都透過的情況下才返回true。
    judge方法
    該方法用於從數值範圍角度判斷給定的年、月、日組合是否合理。
    根據月份的不同情況進行判斷:
    如果月份是 1、3、5、7、8、10、12,只要日期小於等於 31 就認為是合理的,返回true;否則返回false。
    如果月份小於 1 或大於 12,直接返回false。
    如果月份是 2,需要根據年份是否為閏年進一步判斷日期的合理性。如果年份能被 400 整除或者能被 4 整除但不能被 100 整除(即閏年條件),且日期小於等於 29 則返回true;否則返回false。如果年份不是閏年,且日期小於等於 28 則返回true;否則返回false。
    如果是其他月份(4、6、9、12),只要日期小於等於 30 就認為是合理的,返回true;否則返回false。
  3. 程式碼存在的問題
    在設定Calendar例項的月份時,程式碼中存在一個小錯誤,應該將傳入的月份值減 1,因為Calendar類中月份是從 0 開始計數的,目前程式碼中雖然有相關注釋指出這個問題,但實際操作中可能會因為疏忽而忘記修改。
    總體上來說,這段程式碼實現了較為複雜的日期相關的判斷和計算功能,但在程式碼的簡潔性和一些細節處理上還有一定的最佳化空間,比如可以考慮使用 Java 8 引入的新的日期時間 API(如java.time包下的相關類)來更加簡潔和準確地實現類似功能,避免一些如Calendar類中月份計數起始點不同等帶來的小麻煩。

(3)踩坑心得:

作為初學者,可能會遇到不少的“坑”,以下是我的踩坑心得:

一、語法錯誤方面

1. 括號不匹配:在編寫複雜的表示式或方法呼叫時,很容易忘記括號的配對,導致編譯錯誤。一定要仔細檢查每一個括號的開閉。
2. 變數未初始化:Java 要求變數在使用前必須進行初始化。如果忘記初始化變數就進行使用,會引發編譯錯誤。在定義變數時,最好養成同時進行初始化的習慣,或者在使用前確保變數已經被正確賦值。
3. 資料型別不匹配:在進行運算或賦值操作時,資料型別必須匹配。例如,不能將一個字串直接賦值給一個整數變數。要注意資料型別的轉換規則,避免出現型別不匹配的錯誤。

二、邏輯錯誤方面

1. 邊界條件考慮不足:很多題目都有邊界情況,比如陣列的下標從 0 開始,迴圈的邊界值設定錯誤可能導致結果錯誤或者陣列越界異常。在編寫程式碼時,要充分考慮各種邊界情況,進行全面的測試。
2. 迴圈條件錯誤:迴圈是 Java 中常用的結構,但很容易出現迴圈條件設定錯誤的情況。例如,迴圈次數計算錯誤、迴圈條件判斷不準確等。在編寫迴圈程式碼時,要仔細分析迴圈的目的和條件,確保迴圈能夠正確執行。
3. 方法呼叫錯誤:在呼叫方法時,引數傳遞錯誤或者對方法的返回值理解錯誤都可能導致程式出現問題。要仔細閱讀方法的文件說明,瞭解方法的引數和返回值型別,確保正確呼叫方法。

三、除錯技巧方面

1. 學會使用除錯工具:在遇到問題時,不要盲目猜測錯誤原因,要學會使用除錯工具,如 IDE 中的偵錯程式。透過設定斷點、單步執行等方式,可以逐步跟蹤程式的執行過程,找出問題所在。
2. 列印除錯資訊:在無法使用除錯工具的情況下,可以透過列印關鍵變數的值、程式執行的步驟等資訊來幫助定位問題。但要注意不要過度列印資訊,以免影響程式的效能和可讀性。
3. 對比正確結果:如果有已知的正確結果,可以將自己的程式輸出與正確結果進行對比,找出差異所在。

(4)改進建議:
有九點:
1. 鞏固基礎語法,定期複習和總結。
2. 建立自己的程式碼模板,用於常見的結構,如迴圈、輸入輸出。
3. 多做筆記,記錄易錯點和新學到的知識點。
4. 加入學習小組,和同學交流解題思路和經驗。
5. 主動研究優秀程式碼,學習別人的程式設計習慣和技巧。
6.認真分析題目,可畫流程圖輔助理解邏輯。
7.在本地用測試用例充分測試程式碼後再提交。
8.總結錯題,建立錯題集並定期回顧。
9.積極參加線上線下程式設計交流活動。

(5)總結與反思:

在學習 PTA 中的 Java 題目集的過程中,作為初學者,我收穫了許多寶貴的經驗和教訓。以下是我的總結和反思:

一、總結

(1)知識與技能的提升

1.透過完成各種題目,我對 Java 語言的基礎語法有了更深入的理解,包括變數、資料型別、運算子、控制流語句等。同時,也掌握了一些常用的程式設計技巧,如迴圈的使用、條件判斷、陣列操作等。
2.學習了物件導向程式設計的基本概念,如類、物件、方法、屬性等。能夠建立簡單的類,並使用物件進行操作。瞭解了封裝、繼承和多型的概念,並在實際程式設計中嘗試運用。
3.掌握了基本的輸入輸出操作,能夠從控制檯讀取使用者輸入,並將結果輸出到控制檯。同時,也學會了如何處理異常情況,提高了程式的穩定性和可靠性。
4.提升瞭解決問題的能力。在面對各種題目時,學會了分析問題、設計演算法、編寫程式碼和除錯程式。透過不斷地嘗試和實踐,逐漸提高了自己的程式設計能力。

(2)學習方法的改進

1.學會了如何有效地閱讀題目。在開始程式設計之前,認真閱讀題目要求,理解問題的本質和輸入輸出格式。對於複雜的題目,可以透過畫圖、舉例等方式幫助理解。
2.掌握了除錯技巧。在程式設計過程中,不可避免地會遇到各種錯誤。學會了使用除錯工具,如斷點除錯、輸出中間結果等,快速定位錯誤並進行修復。
3.注重程式碼規範。良好的程式碼規範可以提高程式碼的可讀性和可維護性。在程式設計過程中,注意變數命名、程式碼縮排、註釋等方面的規範,養成良好的程式設計習慣。
4.多做練習。程式設計是一項需要不斷練習的技能。透過完成更多的題目,不僅可以鞏固所學的知識,還可以提高自己的程式設計速度和準確性。

二、反思

1. 基礎知識的不紮實

在做題過程中,發現自己對一些基礎知識的掌握還不夠紮實。例如,對資料型別的轉換、運算子的優先順序等方面的理解還存在一些模糊的地方。需要進一步加強對基礎知識的學習和理解,打牢基礎。
物件導向程式設計的理解還不夠深入。在編寫類和物件的程式碼時,有時會出現一些邏輯錯誤。需要更加深入地學習物件導向程式設計的概念和原則,提高自己的程式設計思維能力。

2. 程式設計習慣的問題

程式碼的可讀性有待提高。在編寫程式碼時,有時會為了追求速度而忽略了程式碼的可讀性。這會給後續的除錯和維護帶來困難。需要養成良好的程式設計習慣,注重程式碼的可讀性和可維護性。
缺乏程式碼最佳化的意識。在完成題目後,沒有對程式碼進行最佳化的習慣。這可能會導致程式的效能不夠高效。需要學習一些程式碼最佳化的技巧,提高程式的效能。

3. 解決問題的能力有待提高
在面對一些複雜的題目時,有時會感到無從下手。需要進一步提高自己分析問題和解決問題的能力。可以透過學習更多的演算法和資料結構知識,拓寬自己的解題思路。
缺乏獨立思考的能力。在遇到問題時,有時會過於依賴搜尋引擎和他人的幫助。需要培養自己獨立思考的能力,嘗試自己解決問題。只有透過不斷地嘗試和實踐,才能真正提高自己的程式設計能力。

總之,透過學習 PTA 中的 Java 題目集,我在知識與技能、學習方法等方面都有了很大的提升。同時,也認識到了自己存在的不足之處。在今後的學習中,我將繼續努力,不斷提高自己的程式設計能力,為今後的學習和工作打下堅實的基礎。