oop第一次部落格作業

孙笑氕氘氚發表於2024-04-20

一、關於Java&&物件導向

本學期剛開始進行Java的學習,也是剛開始瞭解物件導向,目前也就學習了三四周的樣子,期間進行了三次作業,我感覺到Java的語法和c語言中的有許多相似之處,又不是完全相同,它有它自己的特色。

二、三次PTA作業

1.第一次pta作業

第一次作業總共八道題,由於剛開始,老師可能不太像打擊我們,題目比較簡單,參考教材上相應知識點通過自學就可以完成所有題目,我們需要自學數值資料型別和操作、if else語句,while迴圈,字串以及一維陣列,此自學內容由於之前學習過c語言,所以自學起來還是很容易理解和掌握的,要說有難度的就是最後一題,判斷三角形的型別。此題考察選擇語句與你的思維邏輯能力。(題目看下圖)

出現過的BUG:

1.判斷等腰直角三角形,浮點型的判斷未用估計精度值來做判斷

2.進入其中一種情況後,輸出後沒有退出程式,進行了其他判斷

3.多層巢狀也出現了問題

不足:

if的巢狀過於多了,。。。就是if到底,圈複雜度太高了(垃圾程式碼),之後可以做優化。(看下圖)

瘋狂使用if語句,使得圈複雜度過於高,這都是純體力勞動來的程式碼。

2.第二次PTA

第二次題目集作業總共包括五道題,包括ip地址轉化,合併兩個有序陣列,判斷閏年及星期幾,求下一天及求前N天。題目集主要考察類與物件,同時讓我們熟悉使用String型別,陣列,以及選擇語句,和迴圈語句。難度較上一次有小小的提升。

7-3 判斷閏年及星期幾

該題與第一次題目集最後一題相比,沒有大量使用if語句,而是改換成了switch語句,switch語句在這題中大量使用,if語句也有少量的使用,複雜度依舊高的驚人。

在Main類中我也使用了較多的方法去實現不同的功能

public static void main(String[] args);//主方法;

public static boolean isLeapYear(int year) ;//判斷year是否為閏年,返回boolean型別;

public static int numOfDays(int year,int month ,int day) ;//求出year-month-day到0001-1-1的距離天數,返回整型數;

public static String getWhatDay(int days) ; //根據天數返回星期幾,其中引數days為天數,整型數,返回星期幾的英文單詞。

遇到的bug:

1.沒有考慮到非法輸入的情況。

2.沒有將閏年的2月加上一天。

3.返回boolean型時是空

7-4求下一天

由於上一題複雜度較高,我將switch語句改寫,降低了它的複雜度。

 本題建立了一個類,

 

 用如下程式碼改寫:

public static boolean isLeapYear(int year){
boolean flag1=(year%4==0);
boolean flag2=(year%100!=0);
boolean flag3=(year%400==0);
boolean isLeapYear=((flag1&&flag2)||(flag3));
return isLeapYear;
}

public static boolean checkInputValidity(int year,int month,int day) {
int tianshu[]=new int[] { 31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)) {
tianshu[1]=29;
}

先用public static boolean isLeapYear(int year) ;//判斷year是否為閏年,返回boolean型別;採用陣列的方式將每個月的總天數存起來,判斷該年如果為閏年,則將二月份的天數改為29天,這遠遠降低了複雜度,就不需要用大量的選擇語句去判斷。

同樣的,這道題我也使用了一些方法

public static void main(String[] args);//主方法 public static boolean isLeapYear(int year) ;//判斷year是否為閏年,返回boolean型別 public static boolean checkInputValidity(int year,int month,int day);//判斷輸入日期是否合法,返回布林值 public static void nextDate(int year,int month,int day) ; //求輸入日期的下一天

7-5  求下N天

求下N天就只需要考慮其他的特殊月份,比如跨年的測試,閏年3月初,平年3月初,8月初,9月初,求下n天平年2月,求下n天閏年2月,求下n天閏年12月等。其他和上一題求下一天類似。

3.第三次PTA

 本次題目集總共有三道題,題目數量較少,但是對我來說題目還是比較難的。第一題為建立一個賬戶類,第二題為建立一個日期類,第三題為一元多項式求導。

7-1 建立賬戶類Account 

 

 本題建立了一個類:

具體包括:

id:賬號,私有屬性,整型,預設值為0;balance:餘額,私有屬性,實型,預設值為0;annualInterestRate:當前利率,私有屬性,實型,預設值為0,假設所有帳戶均有相同的利率;dateCreated:賬戶開戶時間,私有屬性,LocalDate型別,預設為2020年7月31日;一個能建立預設賬戶的無參構造方法;一個能建立帶特定id和初始餘額的賬戶的構造方法;id、balance、annualInterstRate的getter及setter方法;dateCreated的getter方法;一個名為getMonthlyInterestRate()的方法返回月利率(月利率計算公式:餘額*(年利率/1200));一個名為withDraw的方法從賬戶提取特定數額,當提取數額大於餘額或為負數系統返回WithDraw Amount Wrong提示;一個名為deposit的方法向賬戶儲存特定數額,當儲存數額大於20000元或為負數系統返回Deposit Amount Wrong提示。

public class Main {
private int id;
private static double balance;
private static double annualInterestRate;
private Date dateCreated;

public Main() {
super();
dateCreated=new Date();
id=0;
balance=0;
annualInterestRate=0;
}

public Main(int id, double balance,double annualInterestRate) {
super();
dateCreated=new Date();
this.id = id;
this.balance = balance;
this.annualInterestRate=annualInterestRate;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}

public double getAnnualInterestRate() {
return annualInterestRate;
}

public void setAnnualInterestRate(double annualInterestRate) {
this.annualInterestRate = annualInterestRate;
}

public Date getDateCreated() {
return dateCreated;
}
public boolean withDraw(double money){
if(balance>=money&&money>=0){
balance -= money;
return true;
}
else
return false;
}

public boolean deposit(double money){
if(money>= 0&&money<=20000){
balance += money;
return true;
}
else
return false;
}
public static double getMonthlyInterestRate() {
return balance*(annualInterestRate/1200);
}

本題需要對類有充分的理解,明白且正確使用類的封裝

7-3一元多項式求導

本題很難,在這道題上花費的時間比較長,這也是我們第一次接觸正規表示式相關的知識,題目中涉及到表示式正確性的校驗需要用正規表示式來進行,如果用if語句來判斷的話,工作量太大,不一定寫的完,所以在寫這道題之前,我先自學了正規表示式的相關內容。到最後,我也沒有全部通過測試點,在題目集結束後,我去問我完成的同學,很多同學都是強拆的,寫了一百多行,也有更多的。題目在輸入格式和輸出格式上的要求也比較多。

 

 我連前面的係數以及後面的指數都沒有提取出來。

 

 程式碼複雜度也比較高。

總結與心得

類與對向的理解:

物件:物件是類的一個例項,有狀態和行為。例如,一條狗是一個物件,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。

:類是一個模板,它描述一類物件的行為和狀態。

類的封裝的優點:1. 良好的封裝能夠減少耦合。

2. 類內部的結構可以自由修改。

3. 可以對成員變數進行更精確的控制。

4. 隱藏資訊,實現細節。(私有屬性)

正規表示式:

正規表示式有各種匹配規則。

對課堂模式的看法與建議:課堂採取的是線上線下相結合的模式。線上需自學相關Java內容,老師根據題目的完成情況講解同學們所產生的各種問題, 這種課堂模式還是比較好的,大大增強了課堂效率。

收穫:程式碼的編寫過程一定要嚴謹,資料的處理也是十分重要的 ,一定要去測試程式碼,測試程式碼輸入的合理性,這也是題目涉及到的非法輸入的測試點。通過SourceMonitor我也知道了程式碼需要不斷的優化,解決程式碼在提交時產生的執行超時的問題,所以優化程式碼也是十分重要的。三次作業  難度是逐步上升的 ,很多東西需要自學,這樣也養成了自學的習慣和學會翻閱資料等。做題只靠老師講的知識 遠遠不夠,需要我們自己去查詢資料。

相關文章