目錄
1. 前言
2.代碼分析
3.三次作業遇到的bug及采坑心得
4.改進建議
5.總結
一、前言
這學期開始接觸java,面向物件以前也只是在c++學過一點,所以一開始對于寫這次blug有點手足無措,不過還好學會了SourceMonitor軟體的使用,對于我分析代碼提供了很大的幫助,
下面是我對三次題目集的大體分析:
題目集1
題量:8道
知識點:java的簡單運用:順序結構、選擇結構、回圈結構,陣列的建立等
難度:只要有別的語言基礎如c、c++等,難度偏易
題目集2
題量:5道
知識點:字串的運用,java中方法的參考
難度:一般
題目集3
題量:3道
知識點:物件和類,java中類的封裝性,正則運算式的運用
難度:前兩題難度一般,最后一題較難
二、代碼分析
由于學校要求,本次代碼分析就分析題目集中的重點題目即題目集1的7-8,題目集2的7-4、7-5以及題目集3的7-2、7-3,
題目集1
7-8
該題代碼如下:
import java.util.*; import java.lang.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); double [] arr = new double[3]; for(int i=0;i<arr.length;i++){ arr[i]=in.nextDouble(); } Arrays.sort(arr,0,3); if(arr[0]<1||arr[0]>200||arr[1]<1||arr[1]>200||arr[2]<1||arr[2]>200) { System.out.println("Wrong Format"); } else { if((arr[0]+arr[1])>arr[2]) { if(Math.abs(arr[2]*arr[2]-arr[0]*arr[0]-arr[1]*arr[1])<0.1) { if((arr[0]==arr[1]&&arr[0]!=arr[2])||(arr[0]==arr[2]&&arr[1]!=arr[2])||(arr[1]==arr[2]&&arr[0]!=arr[2])) { System.out.println("Isosceles right-angled triangle"); } else { System.out.println("Right-angled triangle"); } } else if(arr[0]==arr[1]&&arr[1]==arr[2]&&arr[0]==arr[2]) { System.out.println("Equilateral triangle"); } else if((arr[0]==arr[1]&&arr[0]!=arr[2])||(arr[0]==arr[2]&&arr[0]!=arr[1])||(arr[1]==arr[2]&&arr[0]!=arr[2])) { System.out.println("Isosceles triangle"); } else { System.out.println("General triangle"); } } else { System.out.println("Not a triangle"); } } } }
度量:

分析:這第一次作業比較簡單,只要用if條件句找到就輸出就基本可以拿到分了,但經過分析發現塊的深度有點高,下次一定得改正,
題目集2
這次的作業因為要呼叫類中的方法所以整體難度比第一次作業要高,與c中函式的呼叫很像,
7-4
該題代碼如下:
import java.util.Scanner; public class Main { public static boolean isLeapYear(int year) { if(year%4==0&&year%100!=0) return true; else if(year%400==0&&year%100==0) return true; else return false; } public static boolean checkInputValidity(int year,int month,int day) { if(year>=1820&&year<=2020&&month<=12&&month>=1&&day>=1&&day<=31){ if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){ if(day<=31&&day>=1){ return true; } else{ return false; } } else if(month==4||month==6||month==9||month==11){ if(day<=30&&day>=1){ return true; } else{ return false;} } else if(month==2){ if(isLeapYear(year)){ if(day<=29&&day>=1){ return true; } else{ return false; } } else{ if(day<=28&&day>=1){ return true; } else{ return false; } } } } return false; } public static void nextDate(int year,int month,int day){ if(month==1||month==3||month==5||month==7||month==8||month==10){ if(day<31){ day++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } else{ day=1; month++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } } else if(month==4||month==6||month==9||month==11){ if(day<30){ day++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } else{ day=1; month++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } } else if(month==2){ if(isLeapYear(year)){ if(day<29){ day++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } else{ day=1; month++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } } else{ if(day<28){ day++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } else{ day=1; month++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } } } else if(month==12){ if(day<31){ day++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } else{ day=1; month=1; year++; System.out.println("Next date is:"+year+"-"+month+"-"+day); } } } public static void main(String[] args) { Scanner in = new Scanner(System.in); int year =in.nextInt(); int month=in.nextInt(); int day=in.nextInt(); if(checkInputValidity(year,month,day)) { nextDate(year,month,day); } else { System.out.println("Wrong Format"); } } }
度量:

分析:這道題因為方法設定的有點多,所以導致方法平均陳述句有點高甚至超過了題目設定的代碼長度限制,后來改了下代碼風格就沒問題了,
7-5
該題代碼如下:
import java.util.Scanner; public class Main { public static boolean isLeapYear(int year) { if(year%4==0&&year%100!=0) return true; else if(year%400==0&&year%100==0) return true; else return false; } public static boolean checkInputValidity(int year,int month,int day,int n) { if(year>=1820&&year<=2020&&month<=12&&month>=1&&day>=1&&day<=31&&n<=10&&n>=-10) { if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) { if(day<=31&&day>=1) { return true; } else { return false; } } else if(month==4||month==6||month==9||month==11) { if(day<=30&&day>=1) { return true; } else { return false; } } else if(month==2) { if(isLeapYear(year)) { if(day<=29&&day>1) { return true; } else { return false; } } else { if(day<=28&&day>=1) { return true; } else { return false; } } } } return false; } public static void lastDate(int year,int month,int day,int n) { if(n>0) { if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) { if(day-n>=1) { day=day-n; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { if(month==3) { if(isLeapYear(year)) { month--; day=29-Math.abs(day-n); System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { month--; day=28-Math.abs(day-n); System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } else if(month==1) { year--; month=12; day=31-Math.abs(day-n); System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else if(month==8) { month--; day=31-Math.abs(day-n); System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { month--; day=30-Math.abs(day-n); System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } } else if(month==4||month==6||month==9||month==11||month==2) { if(day-n>=1) { day=day-n; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { month--; day=31-Math.abs(day-n); System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } } else if(n<0) { if(month==1||month==3||month==5||month==7||month==8||month==10) { if(day-n<=31) { day=day-n; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { month++; day=day-n-31; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } else if(month==12) { if(day-n<=31) { day=day-n; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { year++; month=1; day=day-n-31; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } else if(month==2) { if(isLeapYear(year)) { if(day-n<=29) { day=day-n; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { day=day-n-29; month++; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } else { if(day-n<=28) { day=day-n; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { day=day-n-28; month++; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } } else if(month==4||month==6||month==9||month==11) { if(day-n<=30) { day=day-n; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } else { month++; day=day-n-30; System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } } else if(n==0) { System.out.println(n+" days ago is:"+year+"-"+month+"-"+day); } } public static void main(String[] args) { Scanner in = new Scanner(System.in); int year =in.nextInt(); int month=in.nextInt(); int day=in.nextInt(); int n=in.nextInt(); if(checkInputValidity(year,month,day,n)) { lastDate(year,month,day,n); } else { System.out.println("Wrong Format"); } } }
度量:

分析:這道題有部分方法與7-4題中方法一樣,但lastDate方法因為判斷情況過多所以較長,導致代碼塊平均深度較大,
題目集3
第三次作業前兩道題比第兩次作業中的題多了對于資料域封裝性的運用和對與外部類的呼叫還有對于封裝的理解,并沒有別的對于我來說而第三次作業的最后一題不僅要運用類的封裝性更要會使用正則運算式,正確寫出可以符合條件的字串,
7-2
該題代碼如下:
import java.util.Scanner; class Date{ private int year; private int month; private int day; Date(){ this.setYear(0); this.setMonth(0); this.setDay(0); } Date(int year,int month,int day){ this.setYear(year); this.setMonth(month); this.setDay(day); } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } static boolean isLeapYear(int year) { if(year%4==0&&year%100!=0) return true; else if(year%400==0&&year%100==0) return true; else return false; } boolean checkInputValidity(int year,int month,int day) { if(year>=1900&&year<=2000&&month<=12&&month>=1&&day>=1&&day<=31){ if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){ if(day<=31&&day>=1){ return true; } else{ return false; } } else if(month==4||month==6||month==9||month==11){ if(day<=30&&day>=1){ return true; } else{ return false;} } else if(month==2){ if(isLeapYear(year)){ if(day<=29&&day>=1){ return true; } else{ return false; } } else{ if(day<=28&&day>=1){ return true; } else{ return false; } } } } return false; } void nextDate(int year,int month,int day){ if(month==1||month==3||month==5||month==7||month==8||month==10){ if(day<31){ day++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } else{ day=1; month++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } } else if(month==4||month==6||month==9||month==11){ if(day<30){ day++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } else{ day=1; month++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } } else if(month==2){ if(isLeapYear(year)){ if(day<29){ day++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } else{ day=1; month++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } } else{ if(day<28){ day++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } else{ day=1; month++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } } } else if(month==12){ if(day<31){ day++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } else{ day=1; month=1; year++; System.out.println("Next day is:"+year+"-"+month+"-"+day); } } } } public class Main { public static void main(String[] args) { Scanner in =new Scanner(System.in); Date q=new Date(); int year=in.nextInt(); int month=in.nextInt(); int day=in.nextInt(); if(q.checkInputValidity(year, month, day)) { q.nextDate(year, month, day); } else { System.out.println("Date Format is Wrong"); } } }
度量:

分析: 這道題外部類中的方法與第二次作業中的方法很接近,但由于資料域的封裝性使得類中塊的深度特別高因為要呼叫私有屬性的資料,但總的來說沒有太大的難度,
7-3
這道題我一直沒有完全過,只能達到部分正確,因為對于用正則運算式表示求導程序一直不知道應該怎么處理,
該題代碼如下:
import java.util.*; class regex{ private String str; regex(String str) { this.str=str; } boolean panduan(String str) { if(str.matches("^(([-+]([1-9][0-9]*)(\\\\*x(\\\\^[+-]?([1-9][0-9]*))?))|(([1-9][0-9]*)\\\\*(x(\\\\^[+-]?([1-9][0-9]*))?))|([-+](x(\\\\^[+-]?([1-9][0-9]*))?))|([-+]([1-9][0-9]*))|(([1-9][0-9]*))|((x(\\\\^[+-]?([1-9][0-9]*))?)))+$")) { return true; } else { return false; } } void derivation(String str) { for(int i=0;i<str.length();i++) { if(str.matches("^([-+]?([1-9][0-9]*))+$")) { System.out.println("0"); } } } } public class Main { public static void main(String[] args) { Scanner sc =new Scanner(System.in); String str=sc.nextLine(); regex p =new regex(str); if(p.panduan(str)) { p.derivation(str); } else { System.out.println("Wrong Format"); } } }
度量:

分析: 這道題運用正則運算式來判斷輸入的資料是否正確是一個符合條件的一元多項式,
而正則運算式我是這樣運用的:
- 匹配首項系數為1、指數可能存在;x(\\^[+-]?([1-9][0-9]*))?)
- 匹配首項帶正系數且不為1、指數可能存在;([1-9][0-9]*)(\\*x(\\^[+-]?([1-9][0-9]*))?)
- 匹配首項或非首項、系數不為1、指數可能存在;[-+]([1-9][0-9]*)(\\*x(\\^[+-]?([1-9][0-9]*))?)
- 匹配首項或非首項、系數為1、指數可能存在;[-+](x(\\^[+-]?([1-9][0-9]*))?)
- 匹配首項或非首項常數;[-+]([1-9][0-9]*)
- 匹配首項或非首項常數;[-+]([1-9][0-9]*)
- 在運算式開始加^且末尾加$表示多次重復出現
將一元多項式分為了6種情況,這樣就可以判斷其輸入多項式是否符合條件了,
但多項式求導只知道若輸入常量可變為0,其余的就不知如何運用正則運算式去寫,
三、三次作業遇到的bug及采坑心得
第一次作業
自己寫的時候并沒有遇到什么bug,寫7-7題時一開始用的是冒泡排序給陣列里的數排序后來發現直接用sort函式更加省時省力,而在幫別人看過代碼發現有的同學在7-8題中的判斷直角三角形中遇到bug,代碼并沒有正確判斷出這個三角形是直角三角形,因為資料輸入的都是實數型,程式在運行時會出現小數點后面多個數無法正確判斷,這時可以運用資料型別的強制轉換變成整數型或者將資料相減小于1e-6就可以正確判斷出直角三角形,
第二次作業
7-1題寫時不知道如何將二進制數轉換成十進制數,后來用了Interage類可以將其直接轉換,比很多用數學方法轉換省事了許多,再用sunstring函式可以直接截取字串中一段然后直接將其轉換,
7-2題和7-3題寫時自己沒有遇到什么bug,都是直接就過了,
7-4題剛寫完提交時是部分錯誤,因為閏年最后一天這一點沒有完全過,后來發現是因為平年有365天而閏年有366天,這會導致從閏年變成平年時會有代碼變化所以后來加上了這一情況,代碼就過了,
7-5題跟前兩題中的方法有相同的地方,但在判斷是前幾天時要將n分情況進行判斷,
7-3題、7-4題、7-5題中閏年的判斷方法:
public static boolean isLeapYear(int year) { if(year%4==0&&year%100!=0) return true; else if(year%400==0&&year%100==0) return true; else return false; }
第三次作業
7-1題自己寫時沒有遇到bug,但有同學問我localDate是什么型別資料,我輸出日期用的是localDate.of函式,這樣輸出日期直接可以過,
7-2題自己寫時沒有遇到bug,整體思路跟第二次作業的后面幾題很像,
7-3題自己遇到了很多問題,但現在有些問題都沒有解決,剛開始寫這題時還去自學了一下正則運算式,知道了如何用正則運算式表示一元多項式才開始寫代碼,但當時不知道如何用正則運算式寫出一元多顯示的求導程序,現在有些了解就是用正則運算式寫出一元多項式求導后的式子并進行匹配,輸出即可,
四、改進建議
題目集1
7-8題代碼可以將if條件句用縮進變短,并將三角形型別可以整合在一起,
題目集2
7-4題和7-5題都有代碼長度過長這一毛病,事實上可以將代碼風格改變一下,并將類中的方法進行一些優化,可以適當減小其代碼的時間復雜度,
題目集3
7-2題可以將外部類呼叫到主類中變為內部類,這樣可以直接使用,而并不需要再宣告類了,
7-3題正則運算式還可以進行替換,可以匹配到符合正則運算式的輸入資料時直接將其替換成輸出所要的已經求過導的一元多項式;輸入一元多項式的資料存盤可以改為用陣列數列即ArraysList,更加方便資料的錄用以及呼叫,
五、總結
這三次作業我識訓頗多,學到了java語法的基本運用,以及加深了對于許多函式,包的理解比如Interage類,sort類,Random類等等,還有java中類的封裝性,資料域的封裝性,最重要的是學會了如何使用正則運算式,這實在不失為一個檢查字串格式的一把利器,同時在對于OO的學習中也改變了我學代碼不喜歡換行加空格的風格,對于日后的學習我會繼續加深對于面向物件這一概念更深的理解,還有java中的繼承和多型以及對于正則運算式更多的運用使其真正的成為自己的“武器”,最后也希望在學習OO的程序中能在課堂上學習到更多書上本沒有的但對我編代碼十分有用的知識,寫到更加具有代表性的題型,擴展自己的視野,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272428.html
標籤:Java
上一篇:第一次OOP作業-Blog總結
下一篇:OOP作業總結(一)
