PTA題目集4~6的總結

cyzzl發表於2024-06-09

前言

1.第四次題目集的7-1在答題程式-3的基礎上新增了一些內容,輸入的內容增加,並且輸入的格式有更加靈活,很好的考察了我們對於資訊的處理能力、對正規表示式相關知識點的掌握還有使用物件導向方法程式設計的熟練度。此外,相比於前面三題,這次題目的要求更加***鑽和細緻,非常考驗我們當前對於Java語言的熟練度以及較強的邏輯思維和演算法設計能力。這次題目的工作量相對較大,對我來說操作難度比較大,難以完成。

2.第五次題目集的7-1家居強電電路模擬程式-1是一道非常新穎的題目,與我們的的實際生活緊密相連,題幹非常的長,容易使人望而生畏。這就很考驗我們的資訊閱讀和資訊提取的能力,需要從長篇大論中總結出與我們編寫Java程式有關的資料和條件加以整合,還是比較麻煩的。但是當你把題目的思路理清之後,程式的設計和編寫也就相對輕鬆。本次作業用到了Java中繼承、多型的知識,讓我對涉及到的Java知識點更加熟悉,同時還用到了電路相關的基礎知識,綜合性比較強。

3.第六次題目集的7-1家居強電電路模擬程式-2繼承了前一次的題目,與第一次不同的是這次要考慮受控裝置的電阻,受控裝置多了一種落地扇,並且引入了並聯電路,增加了題目的複雜性和變化性,初看時有些棘手。本題同樣運用到了繼承和多型的知識,主要是演算法和邏輯方面需要考慮更多的情況。一開始以為第二次迭代只是簡單的在第一次迭代的基礎上進行稍微的改動和演算法的完善,可是按照題目的要求思考下去,發現本次題目與第一次相比有很大的變動,主函式基本上全都進行了改動,並沒有想象中的那麼簡單,寫起來還是比較麻煩和費時間的。

設計與分析

用於處理學生答題情況的輸入和輸出。主要功能包括:

  • 讀取輸入的學生資訊、試題資訊和答題情況,儲存在相應的資料結構中。
  • 根據輸入的答題情況,計算學生的得分,並輸出結果。
  • 支援刪除試題資訊的功能。
  • 判斷輸入格式是否正確

具體實現細節如下:

  1. 使用Scanner類從標準輸入讀取資料。
  2. 定義了兩個Map物件,questionMap用於儲存試題資訊,testPaperMap用於儲存試卷資訊。
  3. 定義了一個List物件,students用於儲存學生資訊。
  4. 使用while迴圈不斷讀取輸入,直到遇到"end"為止。
  5. 根據輸入的字串,判斷是哪種型別的輸入,並進行相應的處理。
  6. 對於"#N:"開頭的字串,表示試題資訊,將其儲存到questionMap中。
  7. 對於"#T:"開頭的字串,表示試卷資訊,將其儲存到testPaperMap中。
  8. 對於"#X:"開頭的字串,表示學生資訊,將其儲存到students列表中。
  9. 對於"#S:"開頭的字串,表示答題情況,根據答題情況計算學生的得分,並輸出結果。
  10. 對於"#D:"開頭的字串,表示刪除試題資訊,從questionMap中移除對應的試題。
  11. 如果輸入的字串不符合預期格式,輸出"wrong format"提示。

程式碼實現了一個簡單的學生答題系統,可以處理學生資訊、試題資訊和答題情況的輸入和輸出。

2.第五次題目集7-1首先根據題目要求建立好所有的類,再根據細節對類的屬性和方法等進行補充。UML類圖如下:

本題的重點在於透過讀取控制裝置的狀態獲得電路的總電壓,再根據總電壓求出各受控裝置的亮度或速度。容易被忽略的是,本題中的控制裝置——開關可以重複出現,而連續調速器和分檔調速器最多隻能出現其一併且不能同時出現,而且只能直接連VCC。假如電路中有連續調速器或者分檔調速器,根據輸入資訊讀取level,再計算出電路電壓,最後判斷開關是否全部開啟;假如電路中既沒有分檔調速器,也沒有連續調速器,只需要判斷開關是否全部開啟(如果電路中存在開關的話),若全部開啟電壓為220V,否則為0V。得到電路的總電壓後就可以根據受控裝置的條件求出相應的亮度(或轉速)。

白熾燈求亮度的方法如下: 日光燈求亮度的方法如下:

吊扇求速度的方法如下: 根據分檔調速器獲取電壓的方法如下:

根據連續調速器獲取電壓的方法如下:             根據開關獲取電壓的方法如下:

將輸入的資訊讀取後放在ArrayList裡面,方便操作。

題目囉裡囉唆說了一大堆,其中最主要的資訊就在上面,將這些資訊提取出來之後,思路就會變得比較清晰,程式碼寫起來就比較流暢。

3.第六次題目集7-1在第五次的基礎上增加了一些要求。UML類圖如下:

增加了並聯電路,要考慮受控裝置的電阻,讓電路變得更加複雜,所要考慮的東西也更多了。

以串聯電路類為主體,從單個的串聯電路開始分析。

該方法讀取一條串聯電路中的所有電路裝置,放在ArrayList陣列裡,同時得到裝置的名字。

該方法用於判斷一條串聯電路是否處於通路狀態(是返回true,否返回false)。 該方法用於返回處於通路狀態下的一條串聯電路上所有受控裝置的總電阻。

大概的思路如下:

  • 讀取輸入資訊,根據輸入資訊建立相應的串聯電路類和並聯電路類物件
  • 讀取輸入資訊中所有開關的操作情況
  • 根據所有控制裝置的狀態求出主電路的電壓
  • 求出各並聯電路的電阻進而求出整個電路(主電路)的總電阻
  • 計算求出每個串聯電路(除主電路外)的分壓
  • 根據受控裝置的分壓求出每個受控裝置的亮度(或轉速)
  • 根據題目要求排序輸出所有電路裝置的工作狀態

踩坑心得

主要說說第五、六次題目集踩的坑和犯的錯。

  • 沒有充分理解題目的意思,忽略了一些細節。比如,一開始做題時以為開關也只能出現一次,但是又沒有發現是這個問題,所以不管怎麼改還是這麼多分,最後經過同學提醒後才醒悟過來沒有考慮到這種情況,浪費了很多時間,追悔莫及。
  • 沒有養成良好的編寫程式碼的習慣。寫程式碼時常常忽略用private將成員變數私有化,對有些Java知識點的概念比較模糊,還有很大的進步空間。
  • 寫程式碼的時候容易寫著寫著腦子就亂了,邏輯混亂,需要多寫多練多思考加強程式設計能力。
  • 寫出來的程式碼比較冗長且可讀性不是很強,還需要最佳化自己寫的程式碼,讓它變得更加簡練高效並且邏輯清晰。
  • 在計算並聯電路電阻的時候沒有考慮到其分路電阻為零時的情況,造成求出來的並聯電路電阻出錯,無法得到正確答案。
  • 一開始沒有考慮到並聯電路的所有分路都不處於通路狀態的情況,導致得到的總電壓不為0。
  • 在面對難題的時候態度不夠端正,覺得難和花時間就選擇不去寫,錯過了前面幾次可以讓自己的程式設計能力獲得進步的機會,在Java課程上的學習還是有些許懈怠。世上無難事,只要肯登攀,以後的題目不管難度怎樣都要花時間去思考、去練習,這樣才能取得進步。

總結

透過這三次題目集的磨練,我不僅鞏固了Java基礎語法,還應用了物件導向程式設計(OOP)的原則,如封裝、繼承和多型性,使我對Java的應用有了更廣泛的瞭解。

透過家居強電電路模擬程式的開發,我學習到了如何用Java實現複雜邏輯的建模,以及如何將實際問題轉化為程式可解決的方式。答題模擬程式的編寫則加強了我對集合框架的使用,以及資料結構和演算法的應用,提高了我的程式設計能力和程式碼效率。同時,對於String、ArrayList、HashMap等常用知識點也在多次運用中更加熟練,收穫不少。

儘管在知識掌握上取得了一定的進步,但也存在一些不足之處。例如,對於複雜的電路模擬,我發現我的演算法設計能力還有待提高,程式最佳化方面也缺乏經驗;同時,在答題模擬程式中,我對於複雜問題的分析和解決能力還不夠強,需要進一步加強演算法和資料結構的學習,Java程式設計的能力還有很大的進步空間。

針對上述不足,我計劃採取以下措施進行改進:

  1. 加強演算法學習:透過學習電腦科學中的高階演算法和資料結構,提高問題解決的效率和質量。

  2. 實踐專案最佳化:透過效能分析和調優,提升程式執行效率,增強程式碼的可維護性和可擴充套件性。

  3. 學習設計模式:深入理解並實踐常見的設計模式,提高軟體設計的合理性和程式碼的複用性。

  4. 跨學科應用:由於家居強電電路涉及電子學知識,我需要補充相關領域的知識,以更好地理解和類比電路的行為。

透過這三次題目集的訓練,我不僅提升了自己的程式設計技能,還學會了如何將程式設計知識應用於實際問題解決中。接下來的重點是提高自己在演算法設計、程式最佳化和跨學科應用方面的能力,以適應更復雜和挑戰性的程式設計任務。

相關文章