一、關於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我也知道了程式碼需要不斷的優化,解決程式碼在提交時產生的執行超時的問題,所以優化程式碼也是十分重要的。三次作業 難度是逐步上升的 ,很多東西需要自學,這樣也養成了自學的習慣和學會翻閱資料等。做題只靠老師講的知識 遠遠不夠,需要我們自己去查詢資料。