java題目集1~3總結Blog
一、前言
(1)大作業1:因為是第一次java作業,雖然題量比較多,共有9題,但是難度比較簡單,題目的內容與之前寫過的C語言題目很相像,都是輸入題目要求的數字後進行相應的計算,輸出結果。
第一題要求輸入兩個數值(身高、體重)進行身體質量指數(BMI)測算。
第二題要求輸入質量(以千克為單位)和長度(以米為單位)進行計量單位換算為以磅和英寸為單位的數值,與第一題一樣考察了我們對數字計算的處理能力。
第三題要求輸入10個數字並計算所有奇數的和,考察了我們建立陣列並進行相應的排除,最終得出答案的能力。
第四題要求輸入有關購房的一些資料,最後輸出房產稅費計算的結果,本題與之前幾題相比較為複雜,因為處理的資料和進行的計算步驟比較多。
第五題要求根據選項進行遊戲中種族和角色的選擇,此題難度較低,只需要進行簡單的判斷就能得到結果。
第六題是要求輸入我們學校中學生的學號,進行識別後輸出該學生的學院、班級等資訊,在此過程中還需要排除一些非法輸入,本題與之前題目不同的是需要對一個8位數字組成的學號進行分成四個部分的處理,考察了我們對數字除法和取餘及陣列的運用。
第七題是運用巴比倫法求平方根近似值,過程中需要運用迴圈等知識。
第八題需要在一個輸入的字串中提取出其中的二進位制數值序列,考察了對於字串的處理與應用。
第九題需要在輸入的三條邊基礎上判斷該三角形為什麼型別的三角形,這道題需要判斷的條件很多,相對比較複雜。
(2)大作業2:第二次Java大作業的題量比較少,只有三題,都考察了我們對於字串的處理,總體難度一般。
第一題要求輸入一個由英文字母組成的字串(大小寫均可),然後將所有英文字母轉換成它們在字母表中的序號,在此過程中我們需要了解相關字母的ASCII值,在字母ASCII值的範圍內轉化為數字。
第二題的題目要求比較複雜,要求輸入0、1組成的二進位制資料流,需要進行有效資料、奇偶校驗、結束符等操作和判斷,題目剛開始比較難理解,但理清思路後還是比較好入手的。
第三題與大作業1中的第六題比較類似,但此時輸入的學號是字串型別而不是整型,考察了我們對String的格式判斷與內容提取。
(3)大作業3:第三次Java大作業雖然題目少,但是每道題的難度都很大,需要我們正確地綜合運用所學的知識,並且每道題都與數學問題掛鉤,考驗了我們用java程式設計處理數學問題的能力。
第一題要求輸入兩個點的座標,計算兩點之間的距離,處理資料時需要排除字串中的逗號和空格,提取其中的座標數字,並且還需要排除非法格式和輸入。
第二題是一個處理點線形綜合問題的程式,其中有五個功能,並且每個功能要求輸入的座標數也不同,與數學相聯絡也大大加大了難度。
第三題是一個處理三角形的程式,與第二題有類似的地方,根據點座標來判斷三角形的各種問題十分麻煩,不僅需要數學知識,還要用程式碼將它正確解決。
二、設計與分析
1.題目集2的7-2分析
設計思路:將字串分解為一個個字元,對每個字元進行分析與判斷,找到其中的聯絡與規律,就可以進一步實現對字串的分析。
程式碼分析:
Scanner in = new Scanner(System.in);
String s = in.nextLine();
字串的初始化
for(i = 0; i < s.length(); i++) { char n = s.charAt(i); if(n=='0') { flag=1; } } if(i<11||flag==0) { System.out.print("null data"); return; }
利用s.charAt()提取字串中每個字元,並利用for迴圈遍歷整個字串,利用flag記錄字串中0的個數,如果字串中沒有0,則說明輸入資料全1沒有起始位,用i表示字串中的字元個數,如果i<11,說明輸入資料不足11位,這兩種情況都要輸出"null data"。
for(i = 0;i < s.length();i++) { char a = s.charAt(i); int num = 0; if(a=='0'&&s.charAt(i+10)=='1') { for(h = i+1;h < i+9;h++) { if(s.charAt(h)=='1') { num++; } }
繼續用s.charAt()處理字串,判斷有效資料之後是否為結束位“1”,假設h為第一位有效數字,利用num進行之後的奇偶校驗。if(num%2==0&&s.charAt(i+9)=='1') {
if(num%2==0&&s.charAt(i+9)=='1')
{
System.out.println(j+":"+s.charAt(i+1)+s.charAt(i+2)+s.charAt(i+3)+s.charAt(i+4)+s.charAt(i+5)+s.charAt(i+6)+s.charAt(i+7)+s.charAt(i+8));
i+=10;
j++;
}
else if(num%2!=0&&s.charAt(i+9)=='0')
{
System.out.println(j+":"+s.charAt(i+1)+s.charAt(i+2)+s.charAt(i+3)+s.charAt(i+4)+s.charAt(i+5)+s.charAt(i+6)+s.charAt(i+7)+s.charAt(i+8));
i+=10;
j++;
}
else
{
System.out.println(j+":"+"parity check error");
i+=10;
j++;
}
else if(a=='0'&&s.charAt(i+10)!=1)
{
System.out.println(j+":"+"validate error");
i+=10;
j++;
}
利用之前得到的num進行奇偶校驗,j用於記錄有效資料的序號,得到一組有效數字後就自加一次,保證序號相匹配。
小結:charAt (int index) 方法 是一個能夠用來檢索特定索引下的字元的String例項的 方法. charAt()方法 返回指定索引位置的 char 值。
2.題目集3的7-1分析
設計思路:將輸入的字串去掉逗號和空格,得到輸入的座標數字,再根據學過的數學公式兩點之間的距離公式,就可以得到結果。
程式碼分析:
String s2 = s.replaceAll(" ",","); String[] num = s2.split(","); double a = Double.parseDouble(num[0]); double b = Double.parseDouble(num[1]); double c = Double.parseDouble(num[2]); double d = Double.parseDouble(num[3]); double distance = Math.sqrt((a-c)*(a-c)+(b-d)*(b-d)); System.out.print(distance);
先利用replaceAll( )方法將空格替換成逗號,再用split( )方法去掉字串中的逗號,接著利用Double.parseDouble( )方法得到每個座標數字,最後進行數學計算輸出結果。
小結:replaceAll () 方法用指定的 HTML 內容或元素替換被選元素。 提示: replaceAll () 與 replaceWith () 作用相同。 差異在於語法:內容和選擇器的位置,以及 replaceWith () 能夠使用函式進行替換。
split() 方法用於把一個字串分割成字串陣列。
Double.parseDouble()是把括號裡面內容變成double型別的,其中括號中的引數必須是String型別,否則轉換會報錯。如果要變成int型別,則用Integer.parseInt()。
3.題目集3的7-2分析
設計思路:先識別輸入字串的第一個數字,進行不同方法的計算,再得到輸入的座標數字,根據數字再結合數學方法得出最後答案。
程式碼分析:
switch (xx) { case('1'): { fn1(s); break; } case('2'): { fn2(s); break; } case('3'): { fn3(s); break; } case('4'): { fn4(s); break; } case('5'): { fn5(s); break; } default: { System.out.print("Wrong Format"); }
利用switch()對得到的第一個代表選項的數字進行處理,使其進入相對應的方法。
之後的方法是繼續使用7-1中的三個方法,得到數字後進行數學方法計算。
4.題目集3的7-3分析
設計思路:與7-2相似,都是先識別輸入字串的第一個數字,進行不同方法的計算,再得到輸入的座標數字,先判斷是否能構成三角形,再判斷是否為正確格式,最後進行運算。
程式碼分析:
double a = Double.parseDouble(num[1]);
double b = Double.parseDouble(num[2]);
double c = Double.parseDouble(num[3]); double d = Double.parseDouble(num[4]);
double e = Double.parseDouble(num[5]);
double f = Double.parseDouble(num[6]); double d1 = Math.sqrt((a-c)*(a-c)+(b-d)*(b-d)); double d2 = Math.sqrt((a-e)*(a-e)+(b-f)*(b-f)); double d3 = Math.sqrt((c-e)*(c-e)+(d-f)*(d-f));
先得到座標數字,再用數學方法計算距離,進行檢驗後完成之後的計算。
if(Math.abs(d1-d2)<0.00001&&Math.abs(d1-d3)<0.00001&&Math.abs(d2-d3)<0.00001) { System.out.print("true true");
} else if((Math.abs(d1-d2)<0.00001&&Math.abs(d1-d3)>0.1)||(Math.abs(d2-d3)<0.00001&&Math.abs(d1-d3)>0.1)||(Math.abs(d1-d3)<0.00001&&Math.abs(d1-d2)>0.1))
{ System.out.print("true false"); } else {
System.out.print("false false"); }
進行三角形構成條件判斷,之後再進行等邊和等腰三角形的判斷,注意此時的距離為浮點型,判斷兩個浮點型是否相等不能直接 “==” 進行判斷,而是用Math.abs(d1- d2)<0.00001進行判斷。
三、踩坑心得
1.當題目中有許多條件時,可以將多個if語句替換為switch語句,使程式碼可讀性強、易於維護,需注意的是一般情況下break是不能少的,否則可能會出現意料之外的錯誤。沒有break,程式會繼續執行後面的程式碼。
2.在對字串進行處理時,最好先遍歷一遍整個字串,當不符合格式或輸入錯誤時直接提示使用者錯誤,否則可能導致結果出錯。
3.判斷兩個浮點型是否相等不能直接 “==” 進行判斷,而是用Math.abs(a - b)<0.00001進行判斷。
4.在7-3這種開頭有選項的題目中,需要注意此時表達選項的數字是提取出數字的陣列的第"0"位,之後的座標數字應該從"1"開始,如果沒有注意答案就出錯了。
5.對於全域性變數和區域性變數需要格外注意,不然容易導致結果出錯。全域性變數就是從定義的位置起,作用域覆蓋整個程式範圍的變數。而只在特定的過程或函式中可以訪問的變數,被稱為區域性變數。
四、改進建議
1.本次作業沒有使用類的方法,可以嘗試使用類來解決問題。
2.有些程式碼中有一部分功能相同,可以改成方法,使程式碼更加簡潔,也便於下次對程式碼進行修改。
3.7-3的難度很大,其中有部分較為複雜的數學問題沒有解決,可以通過查閱資料或者諮詢同學或老師找到正確的方法來解決。
4.在程式碼中多標明註釋,以便理解和下次修改。
五、總結
1.通過這三次的習題集,題目難度由易到難,且每道題目之間都有或多或少的相似之處給予我們靈感,循序漸進地更加全面地解決問題,通過作業,我加深了對字串,陣列,方法等的理解,對它們的使用也更加熟練。
2.學習了replaceAll ()、split()和Double.parseDouble()三種對處理字串的方法,replaceAll () 方法用指定的 HTML 內容或元素替換被選元素,split() 方法用於把一個字串分割成字串陣列。
Double.parseDouble()是把括號裡面內容變成double型別的,使我能夠更加方便地處理字串中蘊含的資訊。
3.在作業過程中不能想當然,遇到問題可以使用debug除錯找到出錯的地方,遇到不會的地方要積極查閱、利用身邊的資源。每次在作業中遇到無法解決的問題,我都會先在網上搜索資料和參考資料,如果還是無法解決,我會詢問成績較好的同學提供一些思路。
4.我認為第三次大作業的難度對於我來說還是很大的,對於一些還未解決的複雜的數學問題,我應該還沒有找到正確的方法,在處理數學問題與程式設計相結合的問題,我還有許多地方需要學習和提升。
5.三次大作業雖然沒有全部滿分,但是對於我的學習還是非常有幫助的,提高了我的動手能力,進步了我的專業知識。