前言
這次的作業是第一次部落格作業的迭代和新的一個大作業的兩次迭代三次大作業的組合。
1.第四次大作業
這次大作業輸入資訊分為5種:題目資訊、試卷資訊、答卷資訊、學生資訊、刪除題目資訊。資訊可能會打亂且順序混合輸入。需要正規表示式判斷是否滿足格式,只有正確的格式才能進行儲存。這次還是利用ArrayList和HashMap實現對未知大小的資訊進行儲存。(1)增加了多選題這一種題目種類,這種需要將答案進行合理的分割並進行儲存,實現對多種不全選答案進行判斷。(2)對輸入填空題的判斷也有了新的要求,比如答案中有或等需要與標準答案進行比對,如果答案全部包含在正確答案中且不完全相等,這時候可以算是半對,當含有一個錯誤就整題錯誤。(3)這次對輸入順序也有了改變,只要是正確格式的資訊都可以以任意的先後順序輸入各類不同的資訊。(4)這次還對多張資訊進行了新的規定,這次考慮到多個同學有多張不同的試卷,輸出順序優先學號、試卷浩,按從小到大按學號排序再按試卷號。這是這次第一部分大作業的最後一次迭代了,難度和題量相對而言比較大,但是在第三次大作業的基礎上進行修改還是比較好完成的。
2.第五次大作業
這次大作業是一次全新的改變,這次的目的是設計傢俱強電電路的模擬程式。這次總共裝置有兩個大類,分別是控制裝置和受控裝置。控制裝置分為:開關、分檔調速器、連續調速器,受控裝置分為:燈具和風扇,這次的燈具包括白熾燈和日光燈,風扇只有吊扇一種,然後將每個連線處成對錶示設計類將全部裝置儲存並根據電壓、開關和調速器來計算這個受控裝置的亮度或轉速。這是新的一部分大作業的第一次作業,所以難度比較小,但是因為受控裝置的種類很多,需要運用大量的類來定義大量不同型別的物件,所以題量比較大,需要對所有類進行有效梳理,否則容易混亂。
3.第六次大作業
第六次的大作業在第五次的大作業的基礎上增加了許多,比如增加了電扇裡面加了落地扇,將原本的一條串聯改為串並聯同時增加了幾種子類,此次迭代在上一次的大作業的基礎上發生了一些比較大的改變:(1)受控裝置:增加了落地扇並給每種電器都增加了電阻.(2)輸入格式:從原來的單獨輸入變為包含線上路資訊中輸入,並增加了一個字母M來表示並聯電路。(3)電路結構:由只含有一條串聯電路變為線路中包含一個並聯電路。完成此次大作業我們不僅要完全剖析題目中的資訊、需要清楚的理解子類與父類之間的關係和呼叫等方式,還要靈活運用正規表示式將輸入樣例進行拆分並儲存,儲存後再將每種不同型別的資訊儲存到不同的連結串列中,過程極其嚴謹,要清楚理清各個類之間的呼叫關係,方便後面的儲存和呼叫。這次大作業對於我來說難度比較大,題量也很大,任然需要對所有類進行有效的梳理,否則任然容易混亂。
設計與分析
以下是我對每次大作業的程式碼分析:
1.第四次大作業
這一次的新增了選擇題和多選題,總體結構沒有太大的改變,在輸入時我新增加了判斷是否開頭為“Z”和“S”的判斷並記錄下來,在判斷結果對錯時這兩種題目的判斷函式。還增加了多個同學有多張不同答卷的情況,需要在輸出時對試卷進行排序。
多選題標準答案是在輸入時將多個結果切割儲存,判斷結果對錯時遍歷這些正確的答案,假如全部正確則是true,錯一個則是false,其他則是輸出partially correct。
填空題的給分與正常判分差別不是很大,不是全對的情況下,只要改變判斷是否答案包含在標準答案之中,即可判斷是否是半對還是錯誤。
輸出對試卷排序則是在輸出前將答卷先按試卷號從小到大排序,再根據答卷的學號進行第二次排序,這樣答卷的順序就是先學號再試卷號從小到大的順序進行排序了,再按照原來的函式進行輸出結果就好了。
2.第五次大作業
因為這次有許多的種類,需要設計許多類去定義這些種類的電器,而且要理清楚處這些類的使用。首先分別設定這幾個類的連結串列,然後讀取輸入的資料(以“end”結尾),判斷輸入的是哪種型別的資料並存入連結串列中,存入時我用的是“if-else”來分別儲存。儲存完成後,檢視是否有調速器,若有則計算出調速後的電壓,並用v將其記錄下來。接著迴圈各個受控裝置的連結串列輸出其資訊,判斷燈的亮度以及吊扇的轉速分別傳入電壓並用change和speed方法來計算。
3.第六次大作業
這次是第五次的迭代,增加了落地扇和並聯電路,需要我們對並聯電路的分壓進行判斷。但是這次我使用了繼承來劃分不同的電器種類,我設計了一個總的父類時電器類,可以儲存他們的名字和狀態,在設計兩個小的子類分別是控制電器和受控電器,受控電器裡我增加了電阻這個屬性,接下來我再在這兩個大類下設計了所有的開關、調速器、燈和電扇的類。這樣設計類可以在後面的呼叫中更好的呼叫他們,省去許多的判斷,也可以讓我們的類更加簡潔明瞭。此題同樣建立這幾類的連結串列再讀取,將全部資訊儲存完成後就用五個for迴圈開始對各個連結串列中的資訊根據名字中的編號進行排序,排序完成後與上題相同計算出調速後的電壓值用v記錄,然後對lines進行迴圈找到主路對主路上的裝置進行各項資訊的計算並用change函式對其資訊改寫。主路判斷完成後迴圈並聯路線中的line連結串列對其路線中的裝置進行計算並改寫(state為0則直接跳過)。所有資訊全部計算並改寫完成後按照上一題一樣的順序對各項裝置資訊進行輸出。
三、踩坑心得
1.第四次大作業
對輸出排序時順序搞錯了,想直接先根據學號排序後再進行試卷號排序,但是沒有想清楚第二次排序時會將學號重新打亂,導致並沒有像我們需要的那樣先按學號排序,再按試卷號排序
只要將排序的函式改成如下就可以進行正確的排序,並可以正確輸出結果
這個錯誤讓我意識到事情的排列順序需要我們進行詳細的思考再進行實施,不能想當然按照我們自己的思路去隨意對輸出的東西進行排序,這也難怪往往很難得到我們需要的結果,所以我們應該在寫程式碼之前將思路理清,設計好再進行編譯。
2.第五次大作業
未考慮到分檔調速器已經到達最小檔或已經到達最大檔時繼續減小擋位或者繼續增加擋位時應該如何計算電路上的電壓,導致輸出錯誤
只需要改變分檔調速器的擋位控制,即當處於最小檔時無法繼續減小,最大檔時無法繼續增大,改成以下的方法即可解決這個問題
未考慮到Java自己的計算精度導致本來想直接將分檔調速器的各個檔位直接設為0,0.3,0.6,0.9,後面計算檔位時直接除以3即可得到,但是當我這樣執行時,0.9除以3時得到的是2.99,導致直接強制型別轉換時會變為2,是的擋位有誤差,所以需要修改,將檔位設為0,1,2,3,再在計算時將其乘以0.3,這樣的結果就不會發生錯誤,即按如下對分檔調速器進行修改
這兩個錯誤對我都對我有很大的收穫,因為這次的兩個錯誤並不是老師在題面中提出的要求或者思路,而是要基於我們對現實生活的經驗和對java的精度理解。
前面一個讓我意識到在設計一個程式去執行一個事情時需要自己對這個程式有自己的理解不能一味地靠老師告訴我們哪裡需要注意,哪裡需要設計一個東西來保護電路的正常進行,需要自己思考好設計出的東西需要能經歷什麼特殊情況的時候能正常的執行。再根據得到的成績繼續完善自己的思路,記住自己漏考慮的地方,下次再遇到同樣類似的情況下能有效避免。
後面那個問題則暴露了我對Java基本概念還是模糊的,無法正確使用java中的計算,從而導致結果的錯誤,這種錯的是十分基礎的,而且很難測出來是哪裡出現了錯誤,需要一步一步地去推,所以應該加強對這些基本知識的瞭解,讓我們的程式少走一些彎路。
3.第六次大作業
將日光燈的開關判斷編寫錯誤,導致輸出日關燈亮度時輸出的值是錯誤的
應該將getState改成getV,getState是判斷這個日光燈是否亮,而在輸入電壓之前日光燈不是亮的導致輸出亮度永遠是0,需要改成一下方法
這個錯誤讓我以後知道了在判斷時需要思考到底是要判斷在什麼條件下才能進行下面步驟,而不能想當然,隨便寫一個if-else上去,導致整個程式的輸出錯誤,而且因為這個錯誤十分小,而導致檢查十分困難,從而浪費大量時間。
四、改進建議
1.第四次大作業
這次作業就是前幾次作業的新迭代,改進的地方沒有太多。
2.第五次大作業
這次大作業新開了一個程式,但是我覺得和現實生活中的電路不太能對應的上,比如說大功率電器不應該進行串聯,我們也不會將多個小功率電器進行串聯使用,避免因為電路過載而導致危險。而且這次作業的佈置時間離上一次過去的很久,導致很久沒寫大作業思路已經有點不清晰,雖然題面已經出出來了,但是因為樣例不夠導致不知道從哪裡入手。
3.第六次大作業
這次大作業是在第五次大作業的基礎上進行的迭代,但是第五次串聯大量電器還是沒有改變,這次加的是並聯電路,根據這個設計程式來考察我們對這些的設計類還是可以鍛鍊我們的思考能力的。
五、總結
1.這三次大作業讓我知道了何用面對物件的設計方式設計我的程式,學會利用類設計物件,並將不同的物件進行分類儲存。
2.學會了如何使用正規表示式判斷一段字串是否符合需求,並對字串進行分割。
3.學會了ArrayList和HashMap,知道如何在不知道大小的情況下儲存一系列資料,並進行增刪改查。
4.對於正規表示式還需要進一步的學習,加強練習,達到對正規表示式的熟練運用。
5.對於物件的一些調取功能還不是特別熟練,需要培養更加清晰的邏輯思路。
6.新的大作業對類的呼叫以及一些繼承傳遞有著很多的應用,但是現在對這些方法的使用還是有點不太熟練。
7.程式碼越來越長,需要我們在每次編寫時思路理清,在以後編寫程式時應該先想好應該如何設計類以及如何呼叫,再來編寫程式碼,這樣可以讓我們省去很多時間。
8.希望老師能在課堂上適當提醒一些想不到的樣例,開拓我們的思路。