pta題目集1~3次題目總結Blog
一:前言
首先,總結一下這幾周的java學習和對pta題目集的分析。這學期我才剛剛接觸到java語言的學習中來,但由於先前學習過C語言,所以入門起來還是相對輕鬆的。PTA題目集的第一次作業題目難度相對簡單,主要就是考察java語言的一些基本運用(字串,陣列等簡單運用)和簡單的編寫,雖然題比較多,但是都是比較容易就能完成的。第二次作業相對來說難度就有所提高,主要考察字串的一些用法,剛剛做的時候由於對一些java自帶的類不熟,所以還是有點難度的,雖然只有三道題不過完成得還是有些艱難。第三次作業難度應該是最大的,雖然也是隻有三道題,但是每道題的題量也是很大的,剛剛拿到是甚至無從下手,經過多方查詢資料自學相關內容後才磕磕絆絆得完成,而且完成得並不是特別好,還是非常遺憾的。
二:設計分析與總結
(1)PTA題目集一:
1.設計分析
題目集一的作業相對簡單,程式碼的長度也比較小,都是一些比較簡單的輸入輸出,做為我們接觸java程式設計的第一次作業還是非常友好的,測試點都非常容易得都通過了,所有其實並沒有什麼好分析的。
2.踩坑心得
如此簡單的題目其實也有坑的,我第一次提交時也有不過的點,經過研究題目我發現,是我的輸出格式不對導致的,控制輸出格式後再輸出就成功通過了,經過這次踩坑,我也學會了使用類似於:String D1 = String.format("%02d", D);的格式控制方法,也是有很多收穫的。
(2)PTA題目集二:
1.設計分析
題目:
題目集二的作業難度有所提升,但是1,3題還是很基礎的,2題的難度相對更大,所以,我在這裡主要分析2題。第2題是模擬串列埠接收處理程式,需要我們分析輸入的一串由0和1數字,然後根據要求進行相應的判斷,再根據判斷進行不同的輸出,其中需要判斷的點很多,包括資料足不足11位,有無起始位,空閒位,結束符,奇偶判斷是否通過等,判斷起來相對複雜,比較繁瑣。更進一步理解題目,我們會發現,除了最基本的11位字數判斷,用到最多的還有起始位“0”的判斷,只有找到起始位“0”,才能進行下一步的判斷,所有,我們在這裡把起始位“0”的判斷分成一個單獨的區域:
這樣,我們每次需要判斷起始位“0”時只需要引用panduan()就能完成了。然後就是編寫主函式,先判斷前提,是否足11位,是否有起始符“0”,如果都滿足再進行下一步判斷,一步步判斷空閒位,結束符和奇偶判斷,用迴圈判斷,依次輸出。這樣這道題就解決了,做完了發現其實難度並不是很高,只是有些許繁瑣而已,將其中一些部分做成方法確實簡便了很多,剩下的就是迴圈判斷,用charAt()鎖定字元判斷的方法非常好用,由於11位數字的判斷點很有規律,所以操作起來並不難,剩下的只需要自己細心就行了,程式碼附下:
import java.util.Scanner; public class Main { //判斷 private static boolean panduan(char[] chars, int len) { boolean ling = false; for (int i = 0; i < len; i++) if (chars[i] == '0') { ling = true; break; } return ling; } public static void main(String[] args) { Scanner in = new Scanner(System.in); String str = in.next(); int c = 1; char[] str2 = str.toCharArray(); if (str.length() >= 11 && panduan(str2, str.length())) { String str3; for (int i = 0; i < str.length(); i++) { int n = 0; if (str2[i] == '0' && str.length() - i >= 11) { str3 = str.substring(i + 1, i + 11); for (int j = 0; j < 8; j++) n = n + str3.charAt(j); //n&1:與操作,判斷 n 二進位制最右一位是否為 1 。奇==1 偶==0 final boolean duan = ((n & 1) == 1 && str3.charAt(8) == '0') || ((n & 1) == 0 && str3.charAt(8) == '1'); if (duan==true) { if (str3.charAt(9) != '1') { System.out.println(c++ + ":" + "validate error"); } else { System.out.println(c++ + ":" + str3.substring(0, 8));//0到7 } } else if (!(str3.charAt(9) != '1')) { System.out.println(c + ":parity check error"); c++; } else { System.out.println(c+ ":validate error"); c++; } i = i + 10; } } } else { System.out.println("null data"); } } }
2.踩坑心得
在做這道題時,我也遇到了一些坑,比如輸出格式的控制等,我剛開始時沒有做到判斷正確輸出後提行在進行判斷輸出,並且遞加前面的序號(沒有什麼經驗),但是經過我的思考,我發現再增加一個大迴圈就可以實現判斷輸出後繼續重複判斷剩下的字元輸出,在每次判斷後遞加“1”就可以完成序號的遞加,再控制控制格式,題目就完成了。還有就是奇偶判斷,我學到了n&1這樣的操作,能夠更簡便得進行奇偶判斷,也算是很有收穫。
3.改進建議
其實,後來我發現我的編碼還有很多改進的空間,比如,我可以把別的判斷也單獨做成方法,這樣的話我的程式碼會更加簡潔明瞭,更容易看懂。
(3)PTA題目集三q1:
1.設計分析
題目:
先看題目,我們要讀取輸入座標的各個座標的數值,判斷是否格式輸入正確,是否非法輸入,輸入點是否重合,滿足各個判斷後再進行兩點座標距離的計算,看似很簡單,其實暗藏難點,對於我來說,要取出輸入座標的數值(帶符號)是很難的,於是我開始在網上學習,找到了用substring()擷取字串的方法(其實很麻煩,後面學會了正則表示式),成功分割出數值:
也算是解決了這個難點,剩下的判斷就非常好做了,這次我採用了分很多方法的方式,使得main函式很簡潔,包括panduan1(),panduan2(),juli()等,程式碼附下:
import java.util.Scanner; public class Main { //距離 void jishuan(double a1,double a2,double a3,double a4) { double s1; s1 = Math.sqrt((a1-a3)*(a1-a3)+(a2-a4)*(a2-a4)); System.out.println(s1); } //判斷1 int panduan1(String s) { int ttt=0; int tt=0; for(int i = 0;i<s.length();i++) { if(s.charAt(i)==',') { tt++; } } if(tt<=1) { System.out.println("Wrong Format"); } else { for(int i=0;i<s.length();i++) { if(s.charAt(i)=='+'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.')) { System.out.println("Wrong Format"); } else if(s.charAt(i)=='-'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.')) { System.out.println("Wrong Format"); } else if(s.charAt(i)=='.'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.')) { System.out.println("Wrong Format"); } else if(s.charAt(i)=='0'&&s.charAt(i+1)=='0') { ttt=4; } else { ttt=1; } } } return ttt; } //判斷2 int panduan2(String s) { int c=0; int vvv=0; for(int i = 0;i<s.length();i++) { if(s.charAt(i)==',') { c++; } } if(c>2) { System.out.println("wrong number of points"); } else { vvv=1; } return vvv; } // public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); Main js = new Main(); if(js.panduan1(s)==1&&js.panduan2(s)==1) { //x1 String x1 = s.substring(0, s.indexOf(",")); double a1 = Double.parseDouble(x1); //y1 String y1 = s.substring(x1.length()+1,s.indexOf(" ")); double a2 = Double.parseDouble(y1); //y2 int index=s.indexOf(","); index=s.indexOf(",", index+1); String y2=s.substring(index+1); double a4 = Double.parseDouble(y2); //x2 String x2 = s.substring(s.indexOf(" ")+1,index); double a3 = Double.parseDouble(x2); js.jishuan(a1,a2,a3,a4); } } }
2.踩坑心得
這道題的坑點比想象中要多很多,其中輸入格式的判斷折磨了我好久,我一直在苦苦的找什麼時候會屬於格式錯誤,但始終有格式錯誤的測試點過不了,折騰了很久還是沒有發現,由於不知道測試點設定的是什麼,所以一直留了測試點沒有過,看來是我實力還不夠好,還需要多加練習才行。
3.改進建議
在擷取字串中座標數值時,我使用了很麻煩的substring()方法,一個一個手動去擷取的,雖然說取出的數字都是正確的,但是真的很麻煩,程式碼也很長,一點都不清晰明瞭,這裡如果使用正則表示式的分割功能其實會簡單很多,而且要取出超過2個座標點的座標數值也能輕易辦到,十分靈活。
(4)PTA題目集三q2:
1.設計分析
題目:
這到題需要我們輸入一串字串,根據判斷我們輸入的選項和座標來進行判斷,包括格式判斷,點重合判斷,不符合要求判斷等,並且根據輸入的選項進行不同的操作。這道題相對上一道題來說難度提升了不少,不僅要判斷輸入的選項,座標點的數量也增加了,且變得不確定了,所以我們上一題使用的擷取字串中數字的方法變得不再適用,於是我學了正則表示式,只需要用它把字串從指定字元處切斷,將分割開的字元存入陣列中便可以了,具體操作方法如下:
這樣我們就可以靈活得提取字串中的內容並轉化為double型別了。最核心的問題解決了,剩下的就是老套路,編寫判斷的方法和操作的方法就行了,要判斷輸入的選項其實很簡單,只需要用charAt()判斷字串輸入的第一個字是幾,再跳轉到對應的方法中就可以完成了,實現起來也很簡單,如下:
其中fangfa1(),fangfa2(),fangfa3(),fangfa4(),fangfa5()就是編寫的對應的方法了,此外幾個判斷的方法也要單獨做成函式,這樣引用起來就非常簡單了,每個選項對應方法的編寫其實都是一些一些簡單的數學公式,如果忘了的話,網上都是可以查到的,並沒有什麼難度,將上述東西結合起來,就編寫完成了,程式碼附下:
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { boolean panduan(String s) { boolean flag = false; int m=0; //else if((s.charAt(0)!='1'&&s.charAt(0)!='2'&&s.charAt(0)!='3'&&s.charAt(0)!='4'&&s.charAt(0)!='5')||s.charAt(1)!=':') //{ //System.out.println("Wrong Format") //} //else //{ for(int i = 0;i<s.length();i++) { if(s.charAt(i)=='+'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.'||s.charAt(i+1)==' ')) { System.out.println("Wrong Format");break; } else if(s.charAt(i)=='-'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.'||s.charAt(i+1)==' ')) { System.out.println("Wrong Format");break; } else if(s.charAt(i)=='.'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.'||s.charAt(i+1)==' ')) { System.out.println("Wrong Format");break; } else if(s.charAt(i)==' '&&(s.charAt(i+1)=='.'||s.charAt(i+1)==' ')) { System.out.println("Wrong Format");break; } else if((s.charAt(0)!='1'&&s.charAt(0)!='2'&&s.charAt(0)!='3'&&s.charAt(0)!='4'&&s.charAt(0)!='5')||s.charAt(1)!=':') { System.out.println("Wrong Format");flag=true;break; } else { int c=0; for(int j = 0;j<s.length();j++) { if(s.charAt(j)==',') { c++; } } if(s.charAt(0)=='1'&&c!=2) { flag=false; } else if(s.charAt(0)=='2'&&c!=3) { flag=false; } else if(s.charAt(0)=='3'&&c!=3) { flag=false; } else if(s.charAt(0)=='4'&&c!=4) { flag=false; } else if(s.charAt(0)=='5'&&c!=4) { flag=false; } else if(m==0) { flag=true; } } } return flag; } //---------------------------------------------------正則表示式引用---------------------------------------------------------- //輸入方法一 void fangfa1(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); if(x1==x2&&y1==y2) { System.out.println("points coincide"); } else if(x1==x2&&y1!=y2) { System.out.println("Slope does not exist"); } else { double k = (y2-y1)/(x2-x1); System.out.println(k); } } //輸入方法二 void fangfa2(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); if(x3==x2&&y3==y2) { System.out.println("points coincide"); } else { double L = Math.abs((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3)/Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)); System.out.println(L); } } //輸入方法三 void fangfa3(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); double S = Math.abs((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)); if(S<=1e-6) { System.out.println("true"); } else { System.out.println("false"); } } //輸入方法四 void fangfa4(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); String X4 = arr[7]; double x4 = Double.valueOf(X4.toString()); String Y4 = arr[8]; double y4 = Double.valueOf(Y4.toString()); if(x1==x2&&y1==y2||x3==x4&&y3==y4) { System.out.println("points coincide"); } else if((x1==x2&&y1!=y2)&&(x3==x4&&y3!=y4)) { System.out.println("true"); } else { double k1 = (y2-y1)/(x2-x1); double k2 = (y4-y3)/(x4-x3); if(k1==k2) { System.out.println("true"); } else { System.out.println("false"); } } } //輸入方法五 void fangfa5(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); String X4 = arr[7]; double x4 = Double.valueOf(X4.toString()); String Y4 = arr[8]; double y4 = Double.valueOf(Y4.toString()); if(x1==x2&&y1==y2||x3==x4&&y3==y4) { System.out.println("points coincide"); } else if((x1==x2&&y1!=y2)&&(x3==x4&&y3!=y4)) { System.out.println("is parallel lines,have no intersection point"); } else { double k1 = (y2-y1)/(x2-x1); double k2 = (y4-y3)/(x4-x3); if(k1==k2) { System.out.println("is parallel lines,have no intersection point"); } else { double x5=((x2-x1)*(x4*y3-x3*y4)-(x4-x3)*(x2*y1-x1*y2))/((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1)); double y5=((x4*y3-x3*y4)*(y1-y2)-(x2*y1-x1*y2)*(y3-y4))/((x1-x2)*(y3-y4)-(x3-x4)*(y1-y2)); //double x5 = (x1*(y2-y1)/(x2-x1)-x3*(y4-y3)/(x4-x3)+y3-y1)/(y2-y1)/(x2-x1)-(y4-y3)/(x4-x3); //double y5 = (y2-y1)*(x5-x1)/(x2-x1)+y1; // double x5= ((x2 - x1) * (x3 - x4) * (y3 - y1)-x3 * (x2 - x1) * (y3 - y4) + x1 * (y2 - y1) * (x3 - x4))/((y2 - y1) * (x3 - x4) - (x2 - x1) * (y3 - y4)); //double y5=((y2 - y1) * (y3 - y4) * (x3 - x1) - y3 * (y2 - y1) * (x3 - x4) + y1 * (x2 - x1) * (y3 - y4))/((y2 - y1) * (y3 - y4) - (y2 - y1) * (x3 - x4)); if((x5-x1)*(y2-y1)==(x2-x1)*(y5-y1)&&Math.min(x1,x2)<x5&&x5<Math.max(x1,x2)&&Math.min(y1,y2)<y5&&y5<Math.max(y1,y2)) { System.out.println(x5+","+y5+" ture"); } else if((x5-x3)*(y4-y3)==(x4-x3)*(y5-y3)&&Math.min(x3,x4)<x5&&x5<=Math.max(x3,x4)&&Math.min(y3,y4)<y5&&y5<Math.max(y3,y4)) { System.out.println(x5+","+y5+" ture"); } else { System.out.println(x5+","+y5+" false"); } } } } //主函式------------------------------------------------------------------------------------------------------------------- public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); Main js = new Main(); if(!js.panduan(s)) { System.out.println("wrong number of points"); } else { if(s.charAt(0)=='1') { js.fangfa1(s); } else if(s.charAt(0)=='2') { js.fangfa2(s); } else if(s.charAt(0)=='3') { js.fangfa3(s); } else if(s.charAt(0)=='4') { js.fangfa4(s); } else if(s.charAt(0)=='5') { js.fangfa5(s); } } } }
2.踩坑心得
這道題著實有很多坑,我還犯了很低階的錯誤,剛開始我執行程式碼時一直執行不了,後來才發現時沒有引正則表示式的import,如果要用正則表示式,記得加上:
別犯和我一樣的,的錯誤。還有就是和上題一樣的格式錯誤總是找不全,且至今沒有找到
也不知道時哪裡出了問題,一定要想辦法解決。還有就是交點計算的公式,特別繁瑣,一不小心就會寫錯出事,當時我交點一直都過不了,後面發現是公式錯了,大家一定要小心再小心,特別是在用這些複雜的公式時,要格外注意。
3.改進建議
在寫完PTA後,我發現,其實我的程式碼還是太長太麻煩了,應該把所以點的擷取放在一個方法裡面,不用再每個要用的地方都去擷取,不僅麻煩,還一點都不美觀,屬實是費力不討好錒,寫之前應該考慮一下這方面的設計才行呀。
(5)PTA題目集三q3:
1.設計分析
題目:
相對於前兩道題,其實編寫框架的難度其實一樣,難點在於具體的選項中的方法的實現特別有難度,特別是第4,5選項的實現很難(說實話,換成數學題我都不會),在網上找了很多資料都沒有找到解決方法,所以說,這道題我只得了一半分。這道題還有一個難點就是輸出保留的控制,四捨五入保留6位小數,不足6位小數,不保留,我當時思考了了好久才想到數乘以1000000再向10取餘來判斷是否要保留小數的情況:
這樣就能控制輸出的格式了,完整程式碼附下:
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.text.DecimalFormat; public class Main { //判斷 boolean panduan(String s) { boolean flag = false; if((s.charAt(0)!='1'&&s.charAt(0)!='2'&&s.charAt(0)!='3'&&s.charAt(0)!='4'&&s.charAt(0)!='5')||s.charAt(1)!=':') { System.out.println("Wrong Format");flag=true; } else { for(int i = 0;i<s.length();i++) { if(s.charAt(i)=='+'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.'||s.charAt(i+1)==' ')) { System.out.println("Wrong Format");break; } else if(s.charAt(i)=='-'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.'||s.charAt(i+1)==' ')) { System.out.println("Wrong Format");break; } else if(s.charAt(i)=='.'&&(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'||s.charAt(i+1)=='.'||s.charAt(i+1)==' ')) { System.out.println("Wrong Format");break; } else if(s.charAt(i)==' '&&(s.charAt(i+1)=='.'||s.charAt(i+1)==' ')) { System.out.println("Wrong Format");break; } else { int c=0; for(int j = 0;j<s.length();j++) { if(s.charAt(j)==',') { c++; } } if(s.charAt(0)=='1'&&c!=3) { flag=false; } else if(s.charAt(0)=='2'&&c!=3) { flag=false; } else if(s.charAt(0)=='3'&&c!=3) { flag=false; } else if(s.charAt(0)=='4'&&c!=5) { flag=false; } else if(s.charAt(0)=='5'&&c!=4) { flag=false; } else { flag=true; } } } } return flag; } //1 void fangfa1(String s) { int m=-1; String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); double s1 = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); double s2 = Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)); double s3 = Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)); if(s1+s2<=s3||s1+s3<=s2||s2+s3<=s1) { System.out.println("data error"); } else { if(s1==s2&&s1==s3&&s2==s3) { m=0; System.out.println("true true"); } else if((s1==s2||s1==s3||s2==s3)&&m!=0) { System.out.println("true false"); } else if(s1!=s2&&s2!=s3&&s1!=s3) { System.out.println("false false"); } } } //2 void fangfa2(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); double s1 = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); double s2 = Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)); double s3 = Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)); if(s1+s2<=s3||s1+s3<=s2||s2+s3<=s1) { System.out.println("data error"); } else { double Z=s1+s2+s3; if((Z*1e6)%10!=0) { System.out.printf("%.6f ",Z); }else { System.out.print(Z+" "); } double L = Math.abs((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3)/Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)); double B = s2*L/2; if((B*1e6)%10!=0) { System.out.printf("%.6f ",B); } else{ System.out.print(B+" "); } double xz=(x1+x2+x3)/3; double yz=(y1+y2+y3)/3; if((xz*1e6)%10!=0) { System.out.printf("%.6f",xz); System.out.print(","); } else { System.out.print(xz+","); } if((yz*1e6)%10!=0) { System.out.printf("%.6f",yz); } else{ System.out.print(yz); } //System.out.println(A1+" "+A2+" "+A3+","+A4); } } //3 void fangfa3(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); double s1 = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); double s2 = Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)); double s3 = Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)); if(s1+s2<=s3||s1+s3<=s2||s2+s3<=s1) { System.out.println("data error"); } else { if(Math.abs(s1*s1+s2*s2-s3*s3)==0||Math.abs(s1*s1+s3*s3-s2*s2)==0|Math.abs(s2*s2+s3*s3-s1*s1)==0) { System.out.println("false true false"); } else if(s1*s1+s2*s2-s3*s3<0||s1*s1+s3*s3-s2*s2<0|s2*s2+s3*s3-s1*s1<0) { System.out.println("true false false"); } else if(s1*s1+s2*s2-s3*s3>0||s1*s1+s3*s3-s2*s2>0|s2*s2+s3*s3-s1*s1>0) { System.out.println("false false true"); } } } //4 void fangfa4(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); String X4 = arr[7]; double x4 = Double.valueOf(X4.toString()); String Y4 = arr[8]; double y4 = Double.valueOf(Y4.toString()); String X5 = arr[9]; double x5 = Double.valueOf(X5.toString()); String Y5 = arr[10]; double y5 = Double.valueOf(Y5.toString()); double s1 = Math.sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3)); double s2 = Math.sqrt((x4-x5)*(x4-x5)+(y4-y5)*(y4-y5)); double s3 = Math.sqrt((x3-x5)*(x3-x5)+(y3-y5)*(y3-y5)); if(s1+s2<=s3||s1+s3<=s2||s2+s3<=s1) { System.out.println("data error"); } else if(x1==x2&&y1==y2) { System.out.println("points coincide"); } else{ System.out.println("points coincide"); } } //5 void fangfa5(String s) { String reg = "\\:|\\,|\\ "; String[] arr = s.split(reg); String X1 = arr[1]; double x1 = Double.valueOf(X1.toString()); String Y1 = arr[2]; double y1 = Double.valueOf(Y1.toString()); String X2 = arr[3]; double x2 = Double.valueOf(X2.toString()); String Y2 = arr[4]; double y2 = Double.valueOf(Y2.toString()); String X3 = arr[5]; double x3 = Double.valueOf(X3.toString()); String Y3 = arr[6]; double y3 = Double.valueOf(Y3.toString()); String X4 = arr[7]; double x4 = Double.valueOf(X4.toString()); String Y4 = arr[8]; double y4 = Double.valueOf(Y4.toString()); double s1 = Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); double s2 = Math.sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4)); double s3 = Math.sqrt((x2-x4)*(x2-x4)+(y3-y4)*(y3-y4)); if(s1+s2<=s3||s1+s3<=s2||s2+s3<=s1) { System.out.println("data error"); } else{ System.out.println("in the triangle"); } } //主函式-------------------------------------------------------------------------------------------------------------------- public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); Main js = new Main(); if(!js.panduan(s)) { System.out.println("wrong number of points"); } else { if(s.charAt(0)=='1') { js.fangfa1(s); } else if(s.charAt(0)=='2') { js.fangfa2(s); } else if(s.charAt(0)=='3') { js.fangfa3(s); } else if(s.charAt(0)=='4') { js.fangfa4(s); } else if(s.charAt(0)=='5') { js.fangfa5(s); } } } }
2.踩坑心得
此題坑太多,首先就是保留小數的控制,在輸出時不能直接輸出,要先判斷是否需要保留,然後再輸出。還有就是格式的老問題,無論如何,有幾個格式錯誤的點始終過不了,不知道什麼原因:
我會花時間再想辦法解決一下。
3.改進建議
其實應該把座標數值的擷取放在一個方法裡面,這樣會更加簡便,還有就是可以把三角形單獨分為一類,判斷是否可以組成三角形等等,不用再在每一個方法裡再去寫了,這樣會做很多重複的無用功,總之,以後再編寫程式時要多考慮這方面的問題,少走彎路。
三:總結
通過這階段的Java學習以及對這三次題目集的編寫,我學到了特別多的東西,包括一些用法如正則表示式等實用的東西,同時也增長了我編寫java程式的熟練度,讓我真真正正地進入了java學習的大門,同時,我也存在很多問題,我對Java語言的運用還是不夠熟練,遇到一些問題還是需要通過百度搜索來解決,非常浪費時間,導致我完成PTA的速度很慢,甚至也導致我最後一題還沒有完成完整就結束了,下次我要更加抓緊時間完成,不留到後面幾天才慌忙地去做,並且我還要繼續加緊時間學習java,掌握基本的一些方法運用,以後遇到問題不至於沒有任何頭緒而再去學習,為我的程式設計生涯打好堅實的基礎。
同時,我也希望在PTA題目集的測試點的提示可以給明確一點,因為有的點真的不知道是什麼,特別難過,要弄出來要花費大量的時間與精力,這樣很不好。
四:結語
這是第一階段的java學習成果總結而成的我的第一個部落格,之後學習java的路還很長,我要不斷努力去研究,做到最好的自己。