【Java學習】三次大做業總結

1、   前言正則表達式

很是高興能夠在這裏寫下個人第一篇博客,此次的博客我相信將會是很是有意義的,說實話之前感受寫這種東西的人感受很是的nb,沒想到如今我也能夠寫下本身的第一篇博客啦!數組

這三次的Java大做業的知識點我認爲主要仍是主要在各類數據的處理方面。第一次大做業主要爲基本數據的運算和數字大小的排序,還有字符串的處理這三大處理;第二次的大做業是字符串的處理和日期的處理這兩個方面,而此次的三四五題思想基本同樣,最主要考察的仍是對不一樣月份的思考,須要考慮不一樣的方面,對基本的邏輯能力有必定的考察;第三次的大做業就再也不是前兩次的簡單的數據處理了,考察了咱們對面向對象的思考了,再也不只是寫在一個主類了,不僅是考察咱們的基本寫一些代碼的問題了,更多的是考察咱們對面向對象這一實質的思考,利用數據的私有和不一樣類之間的關聯了。學習

說實話這三次題量並非那麼多,畢竟每次的大做業給了咱們一個星期的時間,在平時利用空餘時間也可隨時敲敲code。前兩次的大做業都還好,都可以將全部的測試點給經過,而不是一堆的讓人崩潰的綠色(PTA測試點不經過的狀況),而且能夠提早完成。可是到了最後的一次的大做業,明顯難度就上升了好多,說實話十天的時間是夠的,可是不知道我爲何就是沒有寫出來最後一題(可能本身的思惟邏輯不夠嚴謹強大吧,也可能就是本身比較懶,嘿嘿,之後必定更加努力)一元多項式求導(類設計)。測試

總的來講我對這三次的大做業還算是滿意,就是對最後的一次大做業感受仍是挺失望的,畢竟沒有經過因此的測試點,看着其餘經過的同窗心裏仍是挺難受的,不過經過這三次的大做業仍是讓我學到了挺多的。說了這麼多,下面就讓我來對這三次的做業作個具體的描述吧。優化

二. CODE設計與分析ui

 對於第一次的做業相對來講仍是比較簡單的,最後一題應該也就算是難一點的吧spa

 

對於這題的分析,主要仍是將不一樣的三角形的區別有個良好的認知就能夠了,我將這個判斷寫在一個類裏面,類圖以下:設計

 

用了一些方法即可以將這題解出來了。3d

•   對於第二次的做業,主要的模塊仍是求日期,在不容許使用Java中任何與日期有關的類或方法的條件下,這題就是要分析清楚這些月份之間的不一樣,搞清楚這些的特殊關係仍是比較能夠輕鬆的解決的,下面是這7-5,7-5的類圖展現:rest

 

 對於第三次的就比較複雜了,對於Account類就是定義一個類而後對數據進行操做,主要關係類圖以下

  

對於日期的也就是和第二次的大做業沒有什麼區別,這個就是利用了一個類專門來對日期進行操做,這樣使得code的操做能力更強。

 

最後一題的正則表達式算是一大問題了,感受明顯是個燙手的「山芋」,在操做時,我想了許多的辦法,可是最終仍是沒有解決,一頓操做猛如虎,結果像個‘250’,

對於正則表達式的操做,我發現仍是有很大的缺陷,我發如今操做這些Java自帶的類和方法仍是挺困難的,對一個自帶的類或方法的理解則須要本身不斷的進行各類各樣的操做纔可以將這些正確的理解。對於正則表達式的理解,其實就是按照咱們正常的思考來講就是挺簡單的,可是code畢竟是code,從另外一個角度來講,這個則更須要咱們思惟上的嚴謹,由於計算機不能本身思考,仍是須要咱們去操控的。

三. 採坑心得

1. 第一次的大做業說實話並無太多的坑位,前面的幾題都是比較的簡單的,例如第一題的兩個數的相加並無任何的坑,因爲在大一上學期學了C語言有了必定的基礎,在剛學Java仍是有必定的好處的。一直到第三題都是很平穩的,可是第四題就不同了。在這題中,因爲數據很是的多,有着不一樣數字,很是的容易看錯,加上題目提供的表格上有一些的錯誤,致使在作的時候在稅率結果計算上與答案有點偏差致使測試點過不去,可是在通過屢次的檢查後仍是所有過了。7-5這道題就有必定的思考了,在換錢幣時須要優先考慮面值大的錢幣,因此在數據操做時有了必定的限制,而且須要儘量至關於儘量的多換面值大的錢幣,這就須要判斷是否還能再換這種面值的錢幣,這題目通過必定的思考仍是有着比較好的處理的。7-6,7-8這兩個題目主要仍是考數組的使用,在7-8值得思考的是咱們可使用不一樣的排序方法來作(這裏我採用的是冒泡排序)

•最後一題就是判斷三角形了,其實這題目也並無什麼很難跳出的坑,這裏最主要的就是要判斷等腰三角形和等腰直角三角形和之間三角形這幾者的區分。可是有一個坑我確實是很久都沒有發現本身的code哪裏有問題考慮的不周,可是在同窗的提醒下,我發現了本身的問題了。衆所周知,直角三角形是a^2+b^2=c^2,可是double數據時並不能徹底將數據輸入成√2的形式,因此實際上在數據的處理上會有必定的差別,在同窗的提醒下我將判斷直角三角形兩邊平方的和等關於第三邊的平方改爲兩邊平方的和小於0.001從而解決偏差過大形成的答案誤差過大的問題。

        double x,y,z;
        Scanner in=new Scanner(System.in);
        x= in.nextDouble();
        y=in.nextDouble();
        z=in.nextDouble();
        if(x<1||x>200||y<1||y>200||z<1||z>200){
            System.out.println("Wrong Format");
        }
        else{
            if(x+y<=z||x+z<=y||y+z<=x){
                System.out.println("Not a triangle");
            }
            else if(x==y&&y==z){
                System.out.println("Equilateral triangle");
            }
            else if(x==y||y==z||x==z){
                if(x*x+y*y-z*z<0.001||x*x+z*z-y*y<0.001||y*y+z*z-x<0.001){
                    System.out.println("Isosceles right-angled triangle");
                }
                else{
                    System.out.println("Isosceles triangle");
                }
            }
            else if(x*x+y*y==z*z||x*x+z*z==y*y||y*y+z*z==x*x){
                System.out.println("Right-angled triangle");
            }
            else{
                System.out.println("General triangle");
            }
        }
    }
}

最終這些第一次的大做業仍是把所有的測試點過了。

2. 第二次的大做業在後面三題是很是相關的說實話。在第一題只要正確的使用字符串的處理即可以輕鬆的將這道題給完成了,在處理這道題的時候使用了toCharArray()這個方法,經過將字符串轉化爲字符數組將這些一個個的字符進行分析便可。第二題的話就是將兩個字符串進行合併,這個我作的時候並無對這個進行仔細的分析,因此寫的時候直接創造了一個新的數組來存這兩個數組裏面的數據而後直接進行排序這樣題目也能過(其實這樣是一直偷懶的行爲吧),其實在後來我仔細思考了一下這題,發現這道題能夠對比兩個數組的每一個數據如何再來輸出,這樣對內存空間就不會有很大的浪費了。在後面的三題,能夠說是一個東西吧,由於他們沒有什麼太大的區別,無非就是增長了一些功能,還有就是功能複雜化了。在處理完第三題的時候就能夠一塊兒連着第四題第五題一塊兒構造了。這最後的三天的難點主要就是在判斷月份和是否閏年這裏了,由於平年只有365天,而潤年有366天,還有一個就是每月的天數不是徹底同樣的。在判斷n天以後是什麼日期就須要考慮好每月的狀況了。而我在處理這些時則是利用了一個變量來判斷這個月是幾月,而在輸出是就會隨着一開始輸入的那個month量(這個數據是輸入的月份,後面nextDate()這個方法在使用)而改變,可是在輸出以前month是一直在變的,這個就會致使在輸出時不是咱們想要輸出的那個month(若是不定義一個變量來保存month)。

3. 第三次做業的難度就明顯的上升了。此次雖然只有三題,可是這三題的難度卻和前兩次徹底不在一個等級上。建立一個Account類帳戶還好,只要把Account類裏面的不一樣的方法搞清楚,分門別類就能夠將這些功能逐漸完善。

Account account = new Account(id, InitialBalance, annualInterestRate);
        if (WithDrawMoney > InitialBalance || WithDrawMoney < 0) {
            System.out.println("WithDraw Amount Wrong");
        }
        account.deposit(StoredMoney);
        account.WithDraw(WithDrawMoney, StoredMoney);
        System.out.printf("The Monthly interest:%.2f\n", account.getMonthlyInterestRate(WithDrawMoney, StoredMoney));
        System.out.println("The Account'dateCreated:2020-07-31");

而我最後過的就是這兩個測試點,雖然測試了各類各樣的數據,可是仍是找不出任何問題,因而問了同窗發現當兩種測試數據均非法的時候最終答案輸出須要顯示提取非法再顯示存取非法,在通過一番操做後仍是過了(當時心裏仍是挺開心的,嘻嘻!)。第二題是日期,與第二次的大做業很相似,只是此次是將這些寫成一個類,幷包含三個私有屬性年(year)、月(month)、日(day),此次的測試點都很是的正常,一遍過。

重點來了,7-3是一元多項式求導,當時看到這題能夠說是沒有任何的頭緒,發現若是是隻是利用字符串拆分紅字符數組進行操做,一番操做後發現這幾乎是不可能完成的。老師的提醒用正則表達式才發現這題目仍是有方法作的。利用matches,group,split等各類操做後,提交答案,發現仍是一堆的錯誤,兩天的思考這道題發現仍是沒有解出來這題,提交看了下測試點,發現最終只有如下幾個過了,以下:

其實個人思路大概就是拆分分析而後操做一個個子字符串以後再將操做好的字符串輸出,可是操做起來的結果仍是不行,時間截至,個人這題也沒有所有完成。最大問題仍是出如今對字符串的拆分和操做,狀況的各類各樣,考慮的也比較多,因此此次的一元多項式求導並無完成。

4. 代碼的優化

(1)第一次的大做業就是基本的輸入輸出也就是進行無腦操做罷了,只須要把答案輸出正確就能夠,可是在思考排序的時候能夠考慮使用複雜度更低的排序方法,畢竟冒泡排序的複雜度O(n²)挺高的。這裏是我找到一些排序方法的複雜度,穩定性的狀況:

(2)第二次的大做業第一題也就是正常的字符串操做,而第二題就有很大的改進了。我直接開闢了一個新的數組而後排序,這樣是一個比較複雜的方法,當數據量大的時候這個就很是的複雜了。對於這題我認爲就能夠直接對兩個數組裏面的數據進行操做,對兩個數組裏面數據進行比較而後建立一個新的數組進行存放,哪一個數組裏面的數據小就先存放哪一個數據,這樣就只要遍歷一遍即可以直接將兩個數組裏面的數據排好序了。對於後面的三題在對月份操做的時候能夠簡化下判斷條件,我認爲個人操做有點過於複雜(一個一個月的分析),能夠將有31天的分爲一類,30天的分爲一類,而2月最特殊額外進行考慮,這樣就簡單多了。

(3)第三次的大做業就是在考慮類的操做時能夠將類的劃分變得更加清晰,使功能更加的容易體現出來。正則表達式的操做是最須要改進的,原本正則表達式就是一個比較難操做的東西。此次我並無將不一樣功能進行劃分(例如將判斷合法表達式寫成一個類,將字符串拆分寫成一個類),由於此次只是一元表達式的求導尚未考慮到sin,cos等這些狀況,因此影響還不是很大。其實如果將這些功能進行拆分的話,在操做起來時考慮的狀況天然也就更加周全了。

(期待大佬對個人描述有更好的的建議)

5.寫在最後-個人一點感想

總的來講吧,這三次的大做業就屬最後一次的一元多項式求導最複雜了,咱們也知道一個良好的程序給人的第一感受就是具備可讀性,可以一眼讓人看出你在幹什麼,而我此次的code並並沒很好的可讀性,由於在敲的時候沒有將代碼註釋,同時也沒有一個很好的前提規劃,導致在碼的時候可能思路會有點亂。Java提供了豐富的類庫,可是知識面的短小以致於在各類操做的時候使得代碼的複雜性明顯的上升。

面向對象能夠說是Java最重要的特性。Java語言的設計徹底是面向對象的,因此這仍是很是符合咱們的思考方式的,剛入Java,雖然有着C的基礎,可是面向過程的C忽然轉向面向對象的過程仍是有必定的差別的,一句話,思考的過程每每比無腦的操做是值當的。

在接下來的學習,我認爲最主要的是如何正確的理解這一語言的思考方式,只要路是對的,就不怕路遠。

這段時間的學習仍是有必定的缺陷的,但也還算能夠。在代碼的風格也也須要良好的改進,雖然如今大部分軟件都有代碼規範的功能,但本身有對code的排版也可使本身的代碼有着更好的理解。

最後,在上課,實驗等我感受能夠最好是傳授些基礎只是,畢竟有我的教授會在理解方面有着更好的理解。

 在接下來的生活要盡心盡力啦!!!

2021-04-04

相關文章
相關標籤/搜索