對近期題目集的分析總結
前言:對這次題目集闡述一下自己的看法,這幾次的題目集主要考察我們近期對java知識點的學習情況,題目量雖然不多,但是難度從難到易;最令我印象深刻的是每一道題目的測試點多了許多,幾乎一分一個測試點,第一個題目集不難,題目相當基礎,考察了我們一些簡單的知識點,用上個學期學的c語言可以解決絕大部分問題,題目集二和題目集三難度提升飛快,對java知識點的掌握尤為重要;掌握的不好就難以寫出來,尤其是題目集三,需要熟練的掌握對java類的運用;還要結合相應的數學方法;如射線法求三角形交點等
設計與分析:題目集一;題目一 巴比倫法求平方根近似值
巴比倫法求n的近似值可以用以下公式:
nextGuess = (lastGuess+n/lastGuess)/2
程式初始執行時lastGuess可賦予一個最初的猜測值。當由公式求得的nextGuess和lastGuess相差較大時,把nextGuess的值賦給lastGuess,繼續以上過程,直至nextGuess和lastGuess幾乎相同,此時lastGuess或者nextGuess就是平方根的近似值。
本題要求:nextGuess和lastGuess的差值小於0.00001時認為兩者幾乎相同
輸入格式:
1、兩個浮點數,以空格分隔,第一個是n,第二個是lastGuess最初的猜測值。例如:2 1。
2、若輸入的兩個數中包含負數或者lastGuess初始輸入為0,認定為非法輸入
輸出格式:
1、輸出n的平方根近似值:lastGuess。例如:1.4142157
2、非法輸入時輸出:"Wrong Format"
原始碼:
踩坑心得:本題目輸出1.4142157為小數點後七位,用double型測試點過不了,我之前用double型並且用format函式保留七位小數答案雖然是一樣的但是測試點還是過不了,同學告訴我要用float型,用過之後才知道float型自動精確到小數點後七位。
題目二判斷三角形型別
輸入三角形三條邊,判斷該三角形為什麼型別的三角形。
輸入格式:
在一行中輸入三角形的三條邊的值(實型數),可以用一個或多個空格或回車分隔,其中三條邊的取值範圍均為[1,200]。
輸出格式:
(1)如果輸入資料非法,則輸出“Wrong Format”;
(2)如果輸入資料合法,但三條邊不能構成三角形,則輸出“Not a triangle”;
(3)如果輸入資料合法且能夠成等邊三角形,則輸出“Equilateral triangle”;
(3)如果輸入資料合法且能夠成等腰直角三角形,則輸出“Isosceles right-angled triangle”;
(5)如果輸入資料合法且能夠成等腰三角形,則輸出“Isosceles triangle”;
(6)如果輸入資料合法且能夠成直角三角形,則輸出“Right-angled triangle”;
(7)如果輸入資料合法且能夠成一般三角形,則輸出“General triangle”。
原始碼
執行測試
分析 本題原始碼通過if else if對輸入的三角形三條邊進行逐步判斷來實現題目要求,程式碼清晰可行。
踩坑心得:本體通過三邊的長度來判斷三角形的型別,極為重要的是裡面要對誤差進行判斷,如果比較長度時沒有比較誤差,編譯通過但是測試點過不了,題目拿不到多少分,誤差為0.000001。
題目集二
題目一
串列埠字元解析
RS232是串列埠常用的通訊協議,在非同步通訊模式下,串列埠可以一次傳送5~8位資料,收發雙方之間沒有資料傳送時線路維持高電平,相當於接收方持續收到資料“1”(稱為空閒位),傳送方有資料傳送時,會在有效資料(5~8位,具體位數由通訊雙方提前設定)前加上1位起始位“0”,在有效資料之後加上1位可選的奇偶校驗位和1位結束位“1”。請編寫程式,模擬串列埠接收處理程式,注:假定有效資料是8位,奇偶校驗位採用奇校驗。
輸入格式:
由0、1組成的二進位制資料流。例如:11110111010111111001001101111111011111111101111
輸出格式:
過濾掉空閒、起始、結束以及奇偶校驗位之後的資料,資料之前加上序號和英文冒號。
如有多個數據,每個資料單獨一行顯示。
若資料不足11位或者輸入資料全1沒有起始位,則輸出"null data",
若某個資料的結束符不為1,則輸出“validate error”。
若某個資料奇偶校驗錯誤,則輸出“parity check error”。
若資料結束符和奇偶校驗均不合格,輸出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error
原始碼
程式碼分析
先進行輸入資料合法檢測,檢測長度是否少於11,用函式panduanzero對函式進行檢驗輸入資料中是否含有0,有的話輸出null data,函式當中對輸入陣列進行遍歷檢測當中是否含有0,然後找到0,擷取0後八位,擷取後八位中都是1,輸出parity check error,用charAt函式檢測資料,用substring函式擷取字串,通過if else if逐步判斷分別進行結尾和奇偶效驗然後輸出。
踩坑心得:本題目有許多測試點用於校驗輸入是否合法,要編寫程式碼過濾掉非法字元,輸出幾行不同資料1,2,通過count++實現。
改進建議 可以通過編寫多個函式讓程式碼更加容易讀懂,更加簡潔明瞭,if判斷過於繁瑣有待改進,能變成的更加簡潔。
題目集三
題目一
點線形系列1-計算兩點之間的距離
輸入連個點的座標,計算兩點之間的距離
輸入格式:
4個double型別的實數,兩個點的x,y座標,依次是x1、y1、x2、y2,兩個點的座標之間以空格分隔,每個點的x,y座標以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
若輸入格式非法,輸出"Wrong Format"。
若輸入格式合法但座標點的數量超過兩個,輸出“wrong number of points”。
輸出格式:
計算所得的兩點之間的距離。例如:1.4142135623730951
原始碼
程式碼分析先通過if對輸入資料進行合法性校驗輸入格式有誤直接跳出,通過split方法對輸入資料進行處理去除資料當中的空格和逗號再用二維陣列儲存分隔後的資料,初始化陣列nums來儲存輸入資料當中提取出來的每個點橫縱座標的數值,通過try catch結構執行程式碼,通過parseDouble方法將輸入的字串當中的資料提取轉換成double型資料方便之後對資料進行運算,try後大括號當中執行出錯會直接跳到catch後面,parseDouble提取失敗則表示輸入非法直接輸出"Wrong Format",運用math方法對資料進行計算最後輸出兩點間距離。實現題目要求。
踩坑心得:輸入格式校驗的測試點難以通過之前一直是八分,後來發現輸入00也是一個非法資料,在程式碼當中加入if判斷輸入資料當中是否含有00的情況,輸入,-也算非法輸入,
加以改進
改進建議:通過parseDouble錄入資料,每個資料都完整寫出來了顯得有些繁瑣時間複雜度高,不太好看。可以通過for迴圈來解決i++實現逐步錄入資料
題目二 點線形系列2-線的計算
使用者輸入一組選項和資料,進行與直線有關的計算。選項包括:
1:輸入兩點座標,計算斜率,若線條垂直於X軸,輸出"Slope does not exist"。
2:輸入三個點座標,輸出第一個點與另外兩點連線的垂直距離。
3:輸入三個點座標,判斷三個點是否在一條線上,輸出true或者false。
4:輸入四個點座標,判斷前兩個點所構成的直線與後兩點構成的直線是否平行,輸出true或者false.
5:輸入四個點座標,計算輸出前兩個點所構成的直線與後兩點構成的直線的交點座標,x、y座標之間以英文分隔",",並輸出交叉點是否在兩條線段之內(不含四個端點)的判斷結果(true/false),判斷結果與座標之間以一個英文空格分隔。若兩條線平行,沒有交叉點,則輸出"is parallel lines,have no intersection point"。
輸入格式:
基本格式:選項+":"+座標x+","+座標y+" "+座標x+","+座標y。
例如:1:0,0 1,1
如果不符合基本格式,輸出"Wrong Format"。
如果符合基本格式,但輸入點的數量不符合要求,輸出"wrong number of points"。
不論哪個選項,如果格式、點數量都符合要求,但構成任一條線的兩個點座標重合,輸出"points coincide",
輸出格式:
見題目描述。
原始碼
程式碼實現 charAt讀取輸入資料的第一個字元儲存在choice中在通過switch case判斷實現不同計算的選擇,通過各點的資料計算斜率,如果x相等則與x軸垂直斜率無窮。
運用海倫公式求出面積,之後再算出點到直線的垂直距離,三個點當中前兩個點構成的直線的斜率和後兩個點構成的直線的斜率進行比較,如果相等則說明三個點在一條直線上,之後輸出,輸入四個點,比較兩條直線的斜率來判斷兩條直線是否平行。
踩坑心得 輸入格式校驗佔大量的測試點,應該編寫程式碼對輸入資料進行仔細校驗,應該判斷多種可能的錯誤情況。
改進意見:測試點沒有完全通過。要求五應該更加完善。
題目三 點線形系列3-三角形的計算
使用者輸入一組選項和資料,進行與三角形有關的計算。選項包括:
1:輸入三個點座標,判斷是否是等腰三角形、等邊三角形,判斷結果輸出true/false,兩個結果之間以一個英文空格符分隔。
2:輸入三個點座標,輸出周長、面積、重心座標,三個引數之間以一個英文空格分隔,座標之間以英文","分隔。
3:輸入三個點座標,輸出是鈍角、直角還是銳角三角形,依次輸出三個判斷結果(true/false),以一個英文空格分隔,
4:輸入五個點座標,輸出前兩個點所在的直線與三個點所構成的三角形相交的交點數量,如果交點有兩個,則按面積大小依次輸出三角形被直線分割成兩部分的面積。若直線與三角形一條線重合,輸出"The point is on the edge of the triangle"
5:輸入四個點座標,輸出第一個是否在後三個點所構成的三角形的內部(輸出in the triangle/outof triangle)。
必須使用射線法,原理:由第一個點往任一方向做一射線,射線與三角形的邊的交點(不含點本身)數量如果為1,則在三角形內部。如果交點有兩個或0個,則在三角形之外。若點在三角形的某條邊上,輸出"on the triangle"
輸入格式:
基本格式:選項+":"+座標x+","+座標y+" "+座標x+","+座標y。點的x、y座標之間以英文","分隔,點與點之間以一個英文空格分隔。
輸出格式:
基本輸出格式見每種選項的描述。
異常情況輸出:
如果不符合基本格式,輸出"Wrong Format"。
如果符合基本格式,但輸入點的數量不符合要求,輸出"wrong number of points"。
如果輸入的三個點無法構成三角形,輸出"data error"。
注意:輸出的資料若小數點後超過6位,只保留小數點後6位,多餘部分採用四捨五入規則進到最低位。小數點後若不足6位,按原始位數顯示,不必補齊。例如:1/3的結果按格式輸出為 0.333333,1.0按格式輸出為1.0
選項4中所輸入線的兩個點座標重合,輸出"points coincide"
原始碼
程式碼分析: 通過switch case結構實現功能分部,通過三個點的座標求出三角形三邊的長度再通過if比較三邊長度判斷是否是等腰三角形、等邊三角形。編寫程式碼實現數學公式運算求出三角形周長、面積、重心座標 運用split方法對輸入字串進行處理,去除字串當中的空格冒號逗號。比較三邊長度的平方來判斷是鈍角、直角還是銳角三角形。
踩坑心得 應當時刻注意錯誤輸入情況。
改進建議;測試點沒有全部通過 程式碼還需要完善
總結
通過這幾次的練習,學會了java對多類的運用。學會了很多方便的方法,程式設計能力得到提高。一些題目要求無法完成,能力不足。日後應該花更多的時間學習java,提高自己對程式碼的編寫和理解能力。
老師上課引用許多例子幫助學生理解課程,對學生上課作用很大,課程活躍新穎,質量相當不錯。