對(duì)前三次PTA作業(yè)的總結(jié)
一、前言
通過(guò)對(duì)前三次PTA作業(yè)的總結(jié),其中蘊(yùn)含著不少知識(shí)點(diǎn)。它讓真正開始接觸Java的我一點(diǎn)一點(diǎn)的滲入其中。其包含的知識(shí)點(diǎn)有Java代碼的大體結(jié)構(gòu),例如:
public class Main{
public static void main(String args[]){
}
}
接下來(lái)就是如何輸入:
Import java.util.Scanner;
這段代碼放在Main之外。
Scanner input=new Scanner(System.in);
輸入整數(shù)和字符串分別為:
int i=input.nextInt();
String str=input.next();
或 Srting str=input.nextLine();
當(dāng)然,我還學(xué)到了java中if~else語(yǔ)句嵌套使用,雖然C語(yǔ)言中也有,但用法還有有點(diǎn)區(qū)別的。此外,還有for循環(huán)語(yǔ)句也是其中知識(shí)點(diǎn)之一。
接下來(lái)就是構(gòu)造數(shù)組:
以整型數(shù)組為例:
Int []array=new int[10];
以上創(chuàng)造了長(zhǎng)度為10的整型數(shù)組。
之后還接觸到的知識(shí)點(diǎn)有如何保留兩位小數(shù):
System.out.println(Sting.format(%.2f,a));(假設(shè)a為變量)
然后還學(xué)到了給數(shù)組中的元素排序的函數(shù)。此函數(shù)要引入包“import java.util.ArrayList;” 之后使用Arrays.sort(s3);(s3為數(shù)組名);
接下來(lái)的知識(shí)點(diǎn)就是偏向數(shù)學(xué)的知識(shí)點(diǎn)了,有點(diǎn)燒腦。它需要一步一步的嵌套使用if~else,并且邏輯上還不能出現(xiàn)錯(cuò)誤,否則全盤重來(lái)。
此題就是第一次題目及判斷三角形的題目,后面會(huì)著重講解。
之后還學(xué)習(xí)了二進(jìn)制與十進(jìn)制之間的轉(zhuǎn)化。很多同學(xué)都使用了相關(guān)函數(shù),但是我使用的是別的方法,雖然相對(duì)復(fù)雜,但我還是理解的。我把字符數(shù)字的ASCII碼轉(zhuǎn)化成整型數(shù)字進(jìn)行運(yùn)算。在使用幾個(gè)循環(huán)就輸出了答案。
后面的知識(shí)點(diǎn)就是創(chuàng)造一個(gè)類了,并且在其中包含很多類方法。
最后一個(gè)也是最難的知識(shí)點(diǎn)就是正則表達(dá)式,說(shuō)實(shí)話我到現(xiàn)在還沒搞明白。
對(duì)于本三次作業(yè),題量倒不是很大,但是難度卻是有的。像每次作業(yè)最后一題,都花費(fèi)了我大量時(shí)間,可能一上午都寫不出來(lái),有點(diǎn)頭疼。需要不斷的摸索,才能勉強(qiáng)靠近輸出。
二、設(shè)計(jì)與分析
PTA第一次作業(yè)第一題,第三題,第四題,第六題的思路較為簡(jiǎn)單,雖然其中代碼可能較長(zhǎng),但都是沒有什么含金量的題目。接下來(lái)我講講其余題目。

以上為第一次作業(yè)第二題前面的重要的代碼,它的意思是隨機(jī)輸入一段字符串,然后從字符串第一個(gè)字符算起。后面就是一些簡(jiǎn)單的if~else判斷語(yǔ)句,就不做太多的講解了。

以上為第一次作業(yè)第五題的詳細(xì)代碼。可見代碼量不大,思路也不算難,唯一需要注意的就是十元,五元,一元,五角,兩分,一分等前面數(shù)字的運(yùn)算過(guò)程。只要注意這些,此題就很快解決。

此題為第一次作業(yè)第七題的部分代碼,大致內(nèi)容是幫數(shù)組中的元素進(jìn)行排序,我使用的是選擇排序,因?yàn)槲艺J(rèn)為這種排序方法要比冒泡排序簡(jiǎn)單一些,而且思路清晰明了。排序后后面就是一些輸出過(guò)程。也比較的簡(jiǎn)單。

此題為第一次作業(yè)第八題,我認(rèn)為它是具有一定難度的。首先它需要你很了解三角形的相關(guān)知識(shí),比如“兩邊之和大于第三邊”,“兩邊之差小于第三邊”等等。其次你還要知道判斷三角形的順序。如果你沒有按照順序判斷,比如你想判斷它是等腰直角三角形,但如果你把先前判斷等腰三角形或者直角三角形的代碼打在前面,它就直接輸出它為等腰三角形或者直角三角形,這樣就達(dá)不到你的要求。其他情況也類似。所以判斷的邏輯順序很重要。想對(duì)簡(jiǎn)單,但要通過(guò)全部的測(cè)試點(diǎn)還有有一點(diǎn)難度的。最后,就是精確度的問(wèn)題。在你判斷三角形邊長(zhǎng)的關(guān)系時(shí),不能把條件鎖死,要放寬點(diǎn)范圍,比如假設(shè)a,b,c為三角形三邊,判斷a+b>c時(shí),可以判斷a+b-c>0.000001,這樣的話就更精確。當(dāng)初我也是犯了這個(gè)錯(cuò)誤思考了很久才改過(guò)來(lái)的。接下來(lái)為此題的報(bào)表內(nèi)容:




此題為第二次作業(yè)的第一題將二進(jìn)制與十進(jìn)制互相轉(zhuǎn)化的題目。難度一般,但代碼長(zhǎng)度較長(zhǎng)。我首先把隨機(jī)輸入的字符串傳進(jìn)字符串?dāng)?shù)組,然后用for循環(huán)依次控制范圍把字符數(shù)字通過(guò)ASCII碼轉(zhuǎn)化為整型數(shù)字進(jìn)行運(yùn)算,最后在輸出。
接下來(lái)為第二次作業(yè)第三題,代碼長(zhǎng)度很長(zhǎng)。

本題先把錯(cuò)誤情況排除,使用for循環(huán)嵌套達(dá)到目的。具體算法如下:
先分月份進(jìn)行討論:
若為1,3,5,7,8,10,12月,
則若日期小于1或大于31,則輸出“Wrong format”;
若為4,6,9,11月,
則若日期小于1或大于30,則輸出“Wrong format”;
接下來(lái)判斷年份是否為閏年。
若為閏年,則若2月日期小于1或大于29,則輸出“Wrong format”;
否則若2月日期小于1或大于28,則輸出“Wrong format”;
如果輸入的是一個(gè)有效的輸入,則判斷該日期距離公年1月1日有多少天,在除7看余數(shù)為多少。

以上代碼為實(shí)現(xiàn)方法。
之后可以再用個(gè)switch~case語(yǔ)句輸出就行。
接下來(lái)我們就講解一下第二次作業(yè)第四題與第五題。
首先,第四題錯(cuò)誤條件判斷與第三題一模一樣,在此就不做講解了。
來(lái)看看如何判斷下一天日期。
那么,我們就必須做好判斷跨年,跨月判斷的準(zhǔn)備了。
先來(lái)分析分析跨年:

相信大家能看懂,一個(gè)if~else語(yǔ)句就搞定了。
接下來(lái)跨月也是一樣的道理:

最后就是正常日期輸入了:
輸出輸入日期的下一天就好。
當(dāng)然值得注意的是閏年與二月份的關(guān)系,要記得注意判斷。
接下來(lái)為第四題報(bào)表過(guò)程:


第五題也是一樣的方法。但唯一需要注意的就是第五題能前推也能后推0~10天,遇到這種情況我們也不需要慌張,只需把if里的判斷條件放大范圍就好。例如:

此為跨年的情況。我們注意到此判斷條件與第四題唯一的不同就是修改了范圍,其余代碼基本一樣,包括錯(cuò)誤輸入代碼、跨年跨月代碼,以及正常輸出代碼等等都相同。接下來(lái)為第五題報(bào)表過(guò)程:


接下來(lái)我們來(lái)分析一下第三次作業(yè)的題目
先來(lái)看看第一題。

以上為類的創(chuàng)建,其中包含類中的元素、類方法等等。
通過(guò)每個(gè)類方法對(duì)類中元素進(jìn)行操作,之后直接引用到主函數(shù)中,如下:

可見這樣主函數(shù)會(huì)顯得非常簡(jiǎn)潔明了,看起來(lái)非常舒服。
此題唯一的知識(shí)點(diǎn)就是創(chuàng)建一個(gè)新類,其余計(jì)算都非常簡(jiǎn)單。
需要注意的是若存款超過(guò)20000或者取款大于余額,會(huì)輸出Wrong;并且存款按0計(jì)算。
接下來(lái)看第二題:

題目要求要用到以上圖片的類方法。
則先創(chuàng)建一個(gè)類,在在類中寫入方法:

set+日期與get+日期的類方法是為了在主函數(shù)中給類中元素一個(gè)輸入來(lái)進(jìn)行接下來(lái)類方法的調(diào)用與運(yùn)算。本題算法運(yùn)算與上述題中算法相似,現(xiàn)在來(lái)看看主函數(shù)中類方法的調(diào)用:

現(xiàn)在來(lái)看看第三次作業(yè)的最后一題
首先它考察的主要是正則表達(dá)式,這是主要難點(diǎn)。
正則表達(dá)式是通過(guò)字符串來(lái)匹配具有相同格式的其他字符串,例如:

第一個(gè)正則表達(dá)式是匹配多項(xiàng)式,第二個(gè)則匹配多項(xiàng)式中的單項(xiàng)式。
假設(shè)定義一字符串為input,匹配它的正則表達(dá)式為sburegex,則用法為:

開始我沒有定義相關(guān)的包從而導(dǎo)致錯(cuò)誤,其包為:

分離單項(xiàng)式后,就要分別提取出每個(gè)單項(xiàng)式的系數(shù)和指數(shù)。因此我分別運(yùn)用了以下的正則表達(dá)式:

//提取系數(shù)

//提取指數(shù)
提取系數(shù)與指數(shù)后在分別存入數(shù)組中進(jìn)行運(yùn)算:


需要注意的是要轉(zhuǎn)化數(shù)組類型進(jìn)行運(yùn)算,先轉(zhuǎn)化為String型在化為int型:

轉(zhuǎn)化后根據(jù)導(dǎo)數(shù)的算法把系數(shù)與指數(shù)進(jìn)行運(yùn)算后在存入新的數(shù)組中,之后在,matcher1.find(),matcher1.group(),macther1.end()對(duì)結(jié)果進(jìn)行循環(huán)輸出。
存在的問(wèn)題:
當(dāng)指數(shù)與系數(shù)為1或-1時(shí),不知道怎么用正則表達(dá)式匹配,因此無(wú)法將1或-1存入數(shù)組,從而導(dǎo)致運(yùn)算接龍式錯(cuò)誤。接下來(lái)為此題報(bào)表過(guò)程:


三 、采坑心得
說(shuō)到坑的話,估計(jì)就第一次作業(yè)第八題和第二次作業(yè)第三題了。錯(cuò)誤點(diǎn)非常細(xì)。在每次提交代碼的過(guò)程中,我的調(diào)試調(diào)試結(jié)果時(shí)這樣的:



經(jīng)過(guò)我一步一步的細(xì)化與調(diào)整,終于最終得到了滿分。
有時(shí)我也出現(xiàn)過(guò)這樣的情況:

,我發(fā)現(xiàn)每次我都會(huì)犯下非常小的問(wèn)題,每調(diào)試一次,就解決其中一個(gè)問(wèn)題,經(jīng)過(guò)多次的調(diào)試,最終才能正確。就我個(gè)人而言,這也是我總結(jié)出來(lái)的一個(gè)方法:在以后寫代碼調(diào)試時(shí),不要以下想著全對(duì),正常情況就是經(jīng)過(guò)反復(fù)的調(diào)試才能做到全對(duì)的結(jié)果,因此,在以后寫代碼的過(guò)程中要時(shí)不時(shí)的進(jìn)行間斷性調(diào)試,不要把代碼打完在調(diào)試,這樣可以減少試錯(cuò)的時(shí)間,也可以讓大腦更清晰自己寫的代碼。不會(huì)讓自己不知道錯(cuò)在什么地方。
四、改進(jìn)建議
就我而言,本三次作業(yè)大部分題目代碼已經(jīng)很簡(jiǎn)單,比如給整型數(shù)組中的元素進(jìn)行大小排序、對(duì)兩個(gè)整型數(shù)進(jìn)行加減、還有相關(guān)的if~else語(yǔ)句,switch~case語(yǔ)句。需要簡(jiǎn)化的是定義的變量。有些變量可以多次使用,而我卻重新定義了很多沒有使用過(guò)的變量,完全可以刪去。并且在以后寫代碼時(shí),我可以把需要的變量全部在開頭定義好,而不是當(dāng)需要的時(shí)候再去定義,這樣顯得潦草麻亂。此外,我還要簡(jiǎn)化主函數(shù)。我要多學(xué)會(huì)定義新的類,把需要的方法全部在類里面定義好,最后直接放入主函數(shù)使用,這樣會(huì)看的很舒服。
五、總結(jié)
通過(guò)對(duì)這三次作業(yè)的總結(jié),我學(xué)會(huì)了如何輸入數(shù)據(jù),如何創(chuàng)建新的數(shù)組,如何把字符串存進(jìn)字符數(shù)組,如何調(diào)用函數(shù),如何創(chuàng)建新的類,如何在類里面創(chuàng)建方法,如何調(diào)用類里面的方法、以及如何保留2位小數(shù)輸出。
對(duì)老師教學(xué)的建議:希望老師以后作業(yè)最后一題難度可以小一些。補(bǔ)作業(yè)時(shí)間的間隔大一些,不然把時(shí)間全花在java上,其余課程沒時(shí)間完成作業(yè)。

浙公網(wǎng)安備 33010602011771號(hào)