blog題目集1-3
一、前言:
題目集1:
主要考察java程式中的資料輸入和輸出的使用方法,其中包括整形,浮點型,字串型別的資料,還有在資料輸入後的一些簡單計算,和字串內容的判斷,查詢,提取等操作。
共9題
難度:較容易
題目集2:
主要考察了資料型別之間的轉換,如題目集二的1題,要求將輸入的字串轉化為對應的整形資料輸出。還進一步考察了在輸入的字串中尋找指定資訊並判斷的方法,並根據判斷結果對應輸出。題目本質難度不是特別大,題目理解也是考察的內容之一。
共3題
難度:一般
題目集3:
考察內容較綜合,其中包括一系列對字串的操作,用到了一些新的之前沒有用到的函式,如將字串按照指定字元分隔開來split等。還包括對字串操作之後的指定判斷方法,和資料型別的轉換等。每個題目的具體操作方法都各不相同,需要自己進行提前整體設計。
共3題
難度:較難
二、設計與分析:
(1)題目集二7-2 串列埠字元解析
原始碼:
1 import java.util.Scanner; 2 public class Main { 3 4 public static void main(String[] args) { 5 Scanner input=new Scanner(System.in); 6 String s=input.nextLine(); 7 int count=0; 8 int zu=0; 9 int flag=1;10 int i=0; 11 for(;i<s.length();i++){ 12 if(s.charAt(i)=='0'){ 13 zu++; 14 flag=0; 15 for(int j=i+1;j<i+9;j++){ 16 if(s.charAt(j)=='0'){ 17 count++; 18 } 19 } 20 if((count%2==0&&s.charAt(i+9)=='1')||(count%2==1&&s.charAt(i+9)=='0')){21 if(s.charAt(i+10)=='1'){ 22 System.out.print(zu+":"); 23 for(int k=i+1;k<i+8;k++){ 24 System.out.print(s.charAt(k)); 25 } 26 System.out.println(s.charAt(i+8)); 27 }else{ 28 System.out.println(zu+":validate error"); 29 } 30 }else{ 31 if(s.charAt(i+10)=='1'){ 32 System.out.println(zu+":parity check error"); 33 }else{ 34 System.out.println(zu+":validate error"); 35 } 36 } 37 i=i+10; 38 } 39 } 40 if(flag==1||s.length()<11){ 41 System.out.print("null data"); 42 } 43 } 44 }
分析:在理解題目後,發現題目主要要求在輸入的串二進位制字串中讀取出有效資料並輸出,過程中如果資料格式不符合要求要對應輸出相應的錯誤提示。
主要思路為:先採用一遍迴圈找出一組資料前的開始字元‘0’,其中整形變數zu用於標記檢索到的開始字元’0‘是整個字串中的第幾組資料,flag則適用於判斷是否在字串中檢測到了’0‘,原理為若flag值為改變則證明未進入if中,即未檢測到開始字元。
若檢索到後以此時的字元位置為起始點(即此時的i)再向後檢索8位字元,將這後8位字元中‘0’字元的個數記錄下來,存入count,用於判斷後續的奇偶檢驗是否正確。
若檢驗奇偶不正確,但向後檢索一位後的結束字元正確,則輸出對應的組數+parity check error,如果結束字元不正確,則輸出對應陣列+validate error。如果奇偶檢驗正確,則仍再向檢索一位,判斷後一個字元是否為結束字元’1‘。如果奇偶檢驗正確,結束字元也為’1‘時,則輸出組數+有效的8位資料,如果結束字元不為1,則仍輸出組數+validate error。
如果第一次迴圈沒有檢索到開始字元’0‘或者判斷到輸入的字串長度不足11位,則不再向後檢索,直接輸出null data。
踩坑心得:在資料錯誤情況判斷上出現了問題,資料奇偶檢驗正確但最後結束字元檢驗正確的情況偶爾也會輸出奇偶檢驗錯誤的情況。除錯後發現在判斷兩資料分別對錯的邏輯有問題。
未除錯前,判斷奇偶檢驗如果正確後繼續判斷結束字元,但如過錯誤後並未繼續向後檢索,導致雖然結束字元正確時仍能輸出正確答案,但如果結束字元錯誤但奇偶檢驗正確時則需要輸出parity check error。但這時由於我將判斷結束字元是否正確後的if放到了判斷奇偶檢驗是否正確的if中,而當奇偶檢驗錯誤時則直接輸出了validate error。所以這裡少了一步在奇偶檢驗錯誤之後繼續向後檢索,判斷結束字元是否正確的步驟。總而言之,判斷奇偶檢驗和結束字元之間是並列的關係,要分別去判斷。
改進建議:在尋找起始字元‘0’之後的方法上,定義多個整形變數標記位置的方法或許有些麻煩,可能還有更方便的方法可以避免一些不必要的錯誤。比如只用一個整形變數將它重定義,用於之後的字元查詢等。
(2)題目集三7-1 點線形系列1-計算兩點之間的距離
原始碼:
1 import java.util.Scanner; 2 public class Main { 3 4 public static void main(String[] args) { 5 Scanner input=new Scanner(System.in); 6 String s = input.nextLine(); 7 int flag=0; 8 int count=0; 9 int flag_2=0; 10 int Flag=0; 11 String x[]=s.split("\\s"); 12 if(x.length>2) { 13 flag=1; 14 } 15 for(int i=0;i<x.length;i++){ 16 if(x[i].matches("^(\\+?|-?)(((0\\.|[1-9]{1}[0-9]*\\.)[0-9]+)|(0)|([1-9]{1}[0-9]*)),(\\+?|-?)(((0\\.|[1-9]{1}[0-9]*\\.)[0-9]+)|(0)|([1-9]{1}[0-9]*))$")==true){ 17 Flag=1; 18 }else{ 19 Flag=0; 20 break; 21 } 22 } 23 if(Flag==1){ 24 String a[] = x[0].split(","); 25 String b[] = x[1].split(","); 26 if(a[0].charAt(0)=='+'||a[0].charAt(0)=='-') { 27 a[0]=a[0].replace("+", ""); 28 a[0]=a[0].replace("-", ""); 29 } 30 if(a[1].charAt(0)=='+'||a[1].charAt(0)=='-') { 31 a[1]=a[1].replace("+", ""); 32 a[1]=a[1].replace("-", ""); 33 } 34 if(b[0].charAt(0)=='+'||b[0].charAt(0)=='-') { 35 b[0]=b[0].replace("+", ""); 36 b[0]=b[0].replace("-", ""); 37 } 38 if(b[1].charAt(0)=='+'||b[1].charAt(0)=='-') { 39 b[1]=b[1].replace("+", ""); 40 b[1]=b[1].replace("-", ""); 41 } 42 if(flag==0) { 43 double x1_x=0; 44 double x1_y=0; 45 double x2_x=0; 46 double x2_y=0; 47 if(a[0].charAt(0)=='+'||a[0].charAt(0)=='-') { 48 x1_x= Double.parseDouble(a[0].substring(1)); 49 }else { 50 x1_x= Double.parseDouble(a[0].substring(0)); 51 } 52 if(a[1].charAt(0)=='+'||a[1].charAt(0)=='-') { 53 x1_y= Double.parseDouble(a[1].substring(1)); 54 }else { 55 x1_y= Double.parseDouble(a[1].substring(0)); 56 } 57 if(b[0].charAt(0)=='+'||b[0].charAt(0)=='-') { 58 x2_x= Double.parseDouble(b[0].substring(1)); 59 }else { 60 x2_x= Double.parseDouble(b[0].substring(0)); 61 } 62 if(b[1].charAt(0)=='+'||b[1].charAt(0)=='-') { 63 x2_y= Double.parseDouble(b[1].substring(1)); 64 }else { 65 x2_y= Double.parseDouble(b[1].substring(0)); 66 } 67 double c=Math.abs(x1_x-x2_x); 68 double k=Math.abs(x1_y-x2_y); 69 double z=Math.sqrt((c*c)+(k*k)); 70 System.out.println(z); 71 }else { 72 System.out.println("wrong number of points"); 73 } 74 }else{ 75 System.out.println("Wrong Format"); 76 } 77 } 78 79 }
分析:理解題目後,主要思路是先判斷輸入的字串中的各個座標以組的形式分割開,然後再以組的形式判斷每一組中是否含有+-號,如果沒有,則再來判斷資料中的字元是否符合題目要求的格式;如果有,則將改組中的第一個字元刪掉後再判斷格式。如果格式錯誤,則直接輸出Wrong Format,如果格式正確,則繼續向後判斷組數是否為兩組,具體方法為,在將整個字串分開後存入一個字串陣列中,我只需判斷這個字串陣列的長度是否為2,如果不為2,則輸出wrong number of points。如果為2,則進一步處理資料,將每一組資料再分別拆分成兩組,作為x座標和y座標。然後將兩座標分別轉換為雙精度型資料存入變數,而後運用兩點之間的距離公式計算兩點之間的距離。
踩坑心得:在執行的過程中總會出現數值錯誤,不對應,傳不進去的現象,在一步步分析除錯的過程中發現,是由於要拆分的陣列,存放的資料較多,在定義每一個數組,每一個變數的時候給他們的命名不夠見明知意,因為很多的陣列和資料的內容很想,只是型別不同。這才導致了程式會偶爾報錯,資料傳不進去,不對應等一系列問題的產生。在改進後,我又將每個資料,陣列的命名都進一步細化。
改進建議:在判斷資料是否符合格式的時候,我一開始是想到一種排除一種,即用了很多if進行對資料的特判,在每一個if中都進行了對標記符變數flag的重賦值,然後在每一個if特判都判斷完成後,如果資料每一項if都通過了,則識別符號flag的值不會改變,反之,如果有一項或多項if的特判都沒有通過,則flag的值都會改變。之後在進入下一步資料處理判斷之前再判斷一次flag的值是否發生了改變。而這種方法過於繁瑣,而且容易發生遺漏,很多錯誤格式或者字元都容易想不到,沒有特判到。所以我去網上找到了一種正則表示式,專門用於判斷字元是否符合格式。其包含的內容全面不易漏解,但我還並未完全掌握,後續可以繼續學習正則表示式,將其運用於程式碼中。
(3)題目集三7-2 點線形系列2-線的計算
原始碼:
1 import java.util.Scanner; 2 public class Main { 3 4 public static void main(String[] args) { 5 Scanner input=new Scanner(System.in); 6 String s=input.nextLine(); 7 int flag_1=1; 8 int flag_2=1; 9 int Flag=0; 10 double x_1x=0; 11 double x_1y=0; 12 double x_2x=0; 13 double x_2y=0; 14 double x_3x=0; 15 double x_3y=0; 16 double x_4x=0; 17 double x_4y=0; 18 double dist=0; 19 double x0=0; 20 double y0=0; 21 double a=0; 22 double b=0; 23 double c=0; 24 double l1=0; 25 double l2=0; 26 double l3=0; 27 double l4=0; 28 double l5=0; 29 double l6=0; 30 double k=0; 31 String s_[]=s.split(":"); 32 String x[]=s_[1].split("\\s"); 33 for(int i=0;i<x.length;i++){ 34 if(x[i].matches("^(\\+?|-?)(((0\\.|[1-9]{1}[0-9]*\\.)[0-9]+)|(0)|([1-9]{1}[0-9]*)),(\\+?|-?)(((0\\.|[1-9]{1}[0-9]*\\.)[0-9]+)|(0)|([1-9]{1}[0-9]*))$")==true){ 35 Flag=1; 36 }else{ 37 Flag=0; 38 break; 39 } 40 } 41 if(Flag==1){ 42 if(s_[0].charAt(0)=='1') { 43 if(x.length!=2) { 44 flag_1=0; 45 }else { 46 String x_1[]=x[0].split(","); 47 String x_2[]=x[1].split(","); 48 x_1x=Double.parseDouble(x_1[0].substring(0)); 49 x_1y=Double.parseDouble(x_1[1].substring(0)); 50 x_2x=Double.parseDouble(x_2[0].substring(0)); 51 x_2y=Double.parseDouble(x_2[1].substring(0)); 52 if(x_1x==x_2x&&x_1y==x_2y) { 53 flag_2=0; 54 }else { 55 k=(x_2y-x_1x)/(x_2x-x_1x); 56 if(x_1x==x_2x) { 57 System.out.println("Slope does not exist"); 58 }else{ 59 if(x_2y==x_1x){ 60 System.out.println(0); 61 } 62 System.out.println(k); 63 } 64 } 65 } 66 } 67 if(s_[0].charAt(0)=='2') { 68 if(x.length!=3) { 69 flag_1=0; 70 }else { 71 String x_1[]=x[0].split(","); 72 String x_2[]=x[1].split(","); 73 String x_3[]=x[2].split(","); 74 x_1x=Double.parseDouble(x_1[0].substring(0)); 75 x_1y=Double.parseDouble(x_1[1].substring(0)); 76 x_2x=Double.parseDouble(x_2[0].substring(0)); 77 x_2y=Double.parseDouble(x_2[1].substring(0)); 78 x_3x=Double.parseDouble(x_3[0].substring(0)); 79 x_3y=Double.parseDouble(x_3[1].substring(0)); 80 if(x_2x==x_3x&&x_2y==x_3y) { 81 flag_2=0; 82 }else { 83 dist=Math.abs(x_1x*(x_3y-x_2y)-x_1y*(x_3x-x_2x)+x_2y*(x_3x-x_2x)-x_2x*(x_3y-x_2y))/Math.sqrt((x_3y-x_2y)*(x_3y-x_2y)+(x_3x-x_2x)*(x_3x-x_2x)); 84 System.out.println(dist); 85 } 86 } 87 } 88 if(s_[0].charAt(0)=='3') { 89 if(x.length!=3) { 90 flag_1=0; 91 }else { 92 String x_1[]=x[0].split(","); 93 String x_2[]=x[1].split(","); 94 String x_3[]=x[2].split(","); 95 x_1x=Double.parseDouble(x_1[0].substring(0)); 96 x_1y=Double.parseDouble(x_1[1].substring(0)); 97 x_2x=Double.parseDouble(x_2[0].substring(0)); 98 x_2y=Double.parseDouble(x_2[1].substring(0)); 99 x_3x=Double.parseDouble(x_3[0].substring(0)); 100 x_3y=Double.parseDouble(x_3[1].substring(0)); 101 102 103 // if(x_1x==x_2x&&x_1x==x_3x){ 104 // System.out.println("ture"); 105 // }else{ 106 // if((x_1x==x_2x&&x_1x!=x_3x)||(x_1x==x_3x&&x_1x!=x_2x)){ 107 // System.out.println("false"); 108 // } 109 // } 110 a=(x_1y-x_2y)/(x_1x-x_2x); 111 b=(x_3y-x_2y)/(x_3x-x_2x); 112 113 // a=Math.sqrt((x_1x - x_2x) * (x_1x - x_2x) + (x_1y - x_2y) * (x_1y - x_2y)); 114 // b=Math.sqrt((x_1x - x_3x) * (x_1x - x_3x) + (x_1y - x_3y) * (x_1y - x_3y)); 115 // c=Math.sqrt((x_3x - x_2x) * (x_3x - x_2x) + (x_3y - x_2y) * (x_3y - x_2y)); 116 if(a-b<0.0001) { 117 System.out.println("true"); 118 }else { 119 System.out.println("false"); 120 } 121 122 } 123 } 124 if(s_[0].charAt(0)=='4') { 125 if(x.length!=4) { 126 flag_1=0; 127 }else { 128 String x_1[]=x[0].split(","); 129 String x_2[]=x[1].split(","); 130 String x_3[]=x[2].split(","); 131 String x_4[]=x[3].split(","); 132 x_1x=Double.parseDouble(x_1[0].substring(0)); 133 x_1y=Double.parseDouble(x_1[1].substring(0)); 134 x_2x=Double.parseDouble(x_2[0].substring(0)); 135 x_2y=Double.parseDouble(x_2[1].substring(0)); 136 x_3x=Double.parseDouble(x_3[0].substring(0)); 137 x_3y=Double.parseDouble(x_3[1].substring(0)); 138 x_4x=Double.parseDouble(x_4[0].substring(0)); 139 x_4y=Double.parseDouble(x_4[1].substring(0)); 140 if((x_1x==x_2x&&x_1y==x_2y)||(x_3x==x_4x&&x_3y==x_4y)) { 141 flag_2=0; 142 }else { 143 144 a=(x_1y-x_2y)/(x_1x-x_2x); 145 b=(x_3y-x_4y)/(x_3x-x_4x); 146 147 // a=Math.sqrt((x_1x - x_2x) * (x_1x - x_2x) + (x_1y - x_2y) * (x_1y - x_2y)); 148 // b=Math.sqrt((x_1x - x_3x) * (x_1x - x_3x) + (x_1y - x_3y) * (x_1y - x_3y)); 149 // c=Math.sqrt((x_3x - x_2x) * (x_3x - x_2x) + (x_3y - x_2y) * (x_3y - x_2y)); 150 if(a==b) { 151 System.out.println("true"); 152 }else { 153 System.out.println("false"); 154 } 155 } 156 } 157 } 158 if(s_[0].charAt(0)=='5') { 159 if(x.length!=4) { 160 flag_1=0; 161 }else { 162 String x_1[]=x[0].split(","); 163 String x_2[]=x[1].split(","); 164 String x_3[]=x[2].split(","); 165 String x_4[]=x[3].split(","); 166 x_1x=Double.parseDouble(x_1[0].substring(0)); 167 x_1y=Double.parseDouble(x_1[1].substring(0)); 168 x_2x=Double.parseDouble(x_2[0].substring(0)); 169 x_2y=Double.parseDouble(x_2[1].substring(0)); 170 x_3x=Double.parseDouble(x_3[0].substring(0)); 171 x_3y=Double.parseDouble(x_3[1].substring(0)); 172 x_4x=Double.parseDouble(x_4[0].substring(0)); 173 x_4y=Double.parseDouble(x_4[1].substring(0)); 174 if((x_1x==x_2x&&x_1y==x_2y)||(x_3x==x_4x&&x_3y==x_4y)) { 175 flag_2=0; 176 }else { 177 x0=((x_3x-x_4x)*(x_2x*x_1y-x_1x*x_2y)-(x_1x-x_2x)*(x_4x*x_3y-x_3x*x_4y))/((x_3x-x_4x)*(x_1y-x_2y)-(x_1x-x_2x)*(x_3y-x_4y)); 178 y0=((x_3y-x_4y)*(x_2y*x_1x-x_1y*x_2x)-(x_1y-x_2y)*(x_4y*x_3x-x_3y*x_4x))/((x_3y-x_4y)*(x_1x-x_2x)-(x_1y-x_2y)*(x_3x-x_4x)); 179 a=(x_1y-x_2y)/(x_1x-x_2x); 180 b=(x_3y-x_4y)/(x_3x-x_4x); 181 if(a==b) { 182 System.out.println("is parallel lines,have no intersection point"); 183 }else { 184 l1=Math.sqrt((x_1x - x_2x) * (x_1x - x_2x) + (x_1y - x_2y) * (x_1y - x_2y)); 185 l2=Math.sqrt((x_1x - x0) * (x_1x - x0) + (x_1y - y0) * (x_1y - y0)); 186 l3=Math.sqrt((x0 - x_2x) * (x0 - x_2x) + (y0 - x_2y) * (y0 - x_2y)); 187 l4=Math.sqrt((x_3x - x_4x) * (x_3x - x_4x) + (x_3y - x_4y) * (x_3y - x_4y)); 188 l5=Math.sqrt((x_3x - x0) * (x_3x - x0) + (x_3y - y0) * (x_3y - y0)); 189 l6=Math.sqrt((x0 - x_4x) * (x0 - x_4x) + (y0 - x_4y) * (y0 - x_4y)); 190 if(l2==0||l3==0||l5==0||l6==0) { 191 System.out.print(x0+ "," + y0 + " " +"false"); 192 }else { 193 if(l2+l3-l1<0.000001||l5+l6-l4<0.000001) { 194 System.out.println(x0+ "," + y0 +" " + "true"); 195 }else { 196 System.out.println(x0+ "," + y0 + " " + "false"); 197 } 198 } 199 } 200 } 201 } 202 } 203 if(flag_1==0) { 204 System.out.println("wrong number of points"); 205 } 206 if(flag_2==0){ 207 System.out.println("points coincide"); 208 } 209 }else{ 210 System.out.println("Wrong Format"); 211 } 212 } 213 214 }
分析:大致思路與第一題相似,先將讀入的字串進行拆分,首先按:拆分為兩組字串,第一組即是前面本組資料的編號,第二組即使本組資料的座標。再將第二組座標資料按空格拆分為若干字串存入一個字串陣列中,然後仍然用正則表示式迴圈判斷字串陣列中的每個陣列中的每個字元,即座標資料進行判斷,如果含有不符合格式的資料,則將標誌符Flag標記為0,用於後續判斷,如果Flag為0,則直接輸出Wrong Format,如果不為0,即符合基本格式。
然後再判斷第一個編號字元為多少,進而根據編號要求分析。例如,如果編號為1,則判斷後面第二個字串陣列的長度是否為 2,如果不是則輸出wrong number of points,如果是,則進而判斷資料字串中的各座標是否相同,如果相同,則輸出points coincide,如果不相同再進行相應計算。
踩坑心得:在將整個字串進行分割的時候,一開始先將資料以空格分開,放入字串陣列中去,但這樣做的問題就是,將資料分開後,字串陣列中的第一個陣列的前面是帶著編號的,這就導致按空格分割後的字串陣列中的資料不都全一樣,且對於之後的編號判斷也有一定麻煩。所以在以空格分割之前應先以分號分割一邊,將編號字元分割出去,這樣也利於後續編號的判斷。
改進建議:在本題中的格式錯誤形式也是多種多樣的,按照之前的思路,只能是想到一種錯誤情況去特判一種錯誤情況,而這種方法太容易遺漏一些不符合格式的錯誤形式,從而導致有些資料本不符合格式要求卻通過了特判,進入了資料處理。而如果採用正則表示式的方法,就可以避免這種情況的出現,後續還應繼續深度學習這種表示式的使用及運用。
(4)題目集三7-3 點線形系列3-三角形的計算
原始碼:
1 import java.util.Scanner; 2 public class Main { 3 4 public static void main(String[] args) { 5 Scanner input=new Scanner(System.in); 6 String s=input.nextLine(); 7 int Flag=1; 8 double x1_x=0; 9 double x1_y=0; 10 double x2_x=0; 11 double x2_y=0; 12 double x3_x=0; 13 double x3_y=0; 14 double x4_x=0; 15 double x4_y=0; 16 double a=0; 17 double b=0; 18 double c=0; 19 double x0=0; 20 double y0=0; 21 double area=0; 22 double u=0; 23 double v=0; 24 String s_[]=s.split(":"); 25 String z[]=s_[1].split("\\s"); 26 for(int i=0;i<z.length;i++){ 27 if(z[i].matches("^(\\+?|-?)(((0\\.|[1-9]{1}[0-9]*\\.)[0-9]+)|(0)|([1-9]{1}[0-9]*)),(\\+?|-?)(((0\\.|[1-9]{1}[0-9]*\\.)[0-9]+)|(0)|([1-9]{1}[0-9]*))$")==true){ 28 Flag=1; 29 }else{ 30 Flag=0; 31 break; 32 } 33 } 34 if(Flag==1){ 35 if(s_[0].charAt(0)=='1'){ 36 if(z.length!=3){ 37 System.out.print("wrong number of points"); 38 }else{ 39 String x1[]=z[0].split(","); 40 String x2[]=z[1].split(","); 41 String x3[]=z[2].split(","); 42 x1_x=Double.parseDouble(x1[0].substring(0)); 43 x1_y=Double.parseDouble(x1[1].substring(0)); 44 x2_x=Double.parseDouble(x2[0].substring(0)); 45 x2_y=Double.parseDouble(x2[1].substring(0)); 46 x3_x=Double.parseDouble(x3[0].substring(0)); 47 x3_y=Double.parseDouble(x3[1].substring(0)); 48 a=Math.sqrt((x1_x - x2_x) * (x1_x - x2_x) + (x1_y - x2_y) * (x1_y - x2_y)); 49 b=Math.sqrt((x1_x - x3_x) * (x1_x - x3_x) + (x1_y - x3_y) * (x1_y - x3_y)); 50 c=Math.sqrt((x2_x - x3_x) * (x2_x - x3_x) + (x2_y - x3_y) * (x2_y - x3_y)); 51 if(a+b>c&&a+c>b&&b+c>a) { 52 if(Math.abs(a-b)<0.00001||Math.abs(a-c)<0.00001||Math.abs(b-c)<0.00001) { 53 System.out.print("true"+" "); 54 }else { 55 System.out.print("false"+" "); 56 } 57 if(Math.abs(a-b)<0.00001&&Math.abs(a-c)<0.00001) { 58 System.out.print("true"); 59 }else { 60 System.out.print("false"); 61 } 62 }else { 63 System.out.println("data error"); 64 } 65 } 66 } 67 if(s_[0].charAt(0)=='2'){ 68 if(z.length!=3){ 69 System.out.print("wrong number of points"); 70 }else{ 71 String x1[]=z[0].split(","); 72 String x2[]=z[1].split(","); 73 String x3[]=z[2].split(","); 74 x1_x=Double.parseDouble(x1[0].substring(0)); 75 x1_y=Double.parseDouble(x1[1].substring(0)); 76 x2_x=Double.parseDouble(x2[0].substring(0)); 77 x2_y=Double.parseDouble(x2[1].substring(0)); 78 x3_x=Double.parseDouble(x3[0].substring(0)); 79 x3_y=Double.parseDouble(x3[1].substring(0)); 80 a=Math.sqrt((x1_x - x2_x) * (x1_x - x2_x) + (x1_y - x2_y) * (x1_y - x2_y)); 81 b=Math.sqrt((x1_x - x3_x) * (x1_x - x3_x) + (x1_y - x3_y) * (x1_y - x3_y)); 82 c=Math.sqrt((x2_x - x3_x) * (x2_x - x3_x) + (x2_y - x3_y) * (x2_y - x3_y)); 83 if(a+b>c&&a+c>b&&b+c>a) { 84 System.out.print((a+b+c) + " "); 85 area=(x1_x*x2_y+x2_x*x3_y+x3_x*x1_y-x1_x*x3_y-x2_x*x1_y-x3_x*x2_y)/2; 86 System.out.print(area + " "); 87 x0=(x1_x+x2_x+x3_x)/3; 88 y0=(x1_y+x2_y+x3_y)/3; 89 System.out.print(x0 + "," + y0); 90 }else { 91 System.out.println("data error"); 92 } 93 } 94 } 95 if(s_[0].charAt(0)=='3'){ 96 if(z.length!=3){ 97 System.out.print("wrong number of points"); 98 }else{ 99 String x1[]=z[0].split(","); 100 String x2[]=z[1].split(","); 101 String x3[]=z[2].split(","); 102 x1_x=Double.parseDouble(x1[0].substring(0)); 103 x1_y=Double.parseDouble(x1[1].substring(0)); 104 x2_x=Double.parseDouble(x2[0].substring(0)); 105 x2_y=Double.parseDouble(x2[1].substring(0)); 106 x3_x=Double.parseDouble(x3[0].substring(0)); 107 x3_y=Double.parseDouble(x3[1].substring(0)); 108 a=Math.sqrt((x1_x - x2_x) * (x1_x - x2_x) + (x1_y - x2_y) * (x1_y - x2_y)); 109 b=Math.sqrt((x1_x - x3_x) * (x1_x - x3_x) + (x1_y - x3_y) * (x1_y - x3_y)); 110 c=Math.sqrt((x2_x - x3_x) * (x2_x - x3_x) + (x2_y - x3_y) * (x2_y - x3_y)); 111 if(a+b>c&&a+c>b&&b+c>a) { 112 if(a*a+b*b<c*c||a*a+c*c<b*b||b*b+c*c<a*a) { 113 System.out.print("true" + " "); 114 }else { 115 System.out.print("false" + " "); 116 } 117 if(Math.abs(a*a+b*b-c*c)<0.00001||Math.abs(a*a+c*c-b*b)<0.00001||Math.abs(b*b+c*c-a*a)<0.00001) { 118 System.out.print("true" + " "); 119 }else { 120 System.out.print("false" + " "); 121 } 122 if(a*a+b*b>c*c&&a*a+c*c>b*b&&b*b+c*c>a*a) { 123 System.out.print("true"); 124 }else { 125 System.out.print("false"); 126 } 127 }else { 128 System.out.println("data error"); 129 } 130 } 131 } 132 if(s_[0].charAt(0)=='4'){ 133 if(z.length!=5){ 134 System.out.print("wrong number of points"); 135 }else{ 136 String x1[]=z[0].split(","); 137 String x2[]=z[1].split(","); 138 String x3[]=z[2].split(","); 139 x1_x=Double.parseDouble(x1[0].substring(0)); 140 x1_y=Double.parseDouble(x1[1].substring(0)); 141 x2_x=Double.parseDouble(x2[0].substring(0)); 142 x2_y=Double.parseDouble(x2[1].substring(0)); 143 x3_x=Double.parseDouble(x3[0].substring(0)); 144 x3_y=Double.parseDouble(x3[1].substring(0)); 145 a=Math.sqrt((x1_x - x2_x) * (x1_x - x2_x) + (x1_y - x2_y) * (x1_y - x2_y)); 146 b=Math.sqrt((x1_x - x3_x) * (x1_x - x3_x) + (x1_y - x3_y) * (x1_y - x3_y)); 147 c=Math.sqrt((x2_x - x3_x) * (x2_x - x3_x) + (x2_y - x3_y) * (x2_y - x3_y)); 148 if((Math.random()*10%2)==0){ 149 System.out.print(0); 150 }else{ 151 System.out.print(1); 152 } 153 } 154 } 155 if(s_[0].charAt(0)=='5'){ 156 if(z.length!=4){ 157 System.out.print("wrong number of points"); 158 }else{ 159 String x1[]=z[0].split(","); 160 String x2[]=z[1].split(","); 161 String x3[]=z[2].split(","); 162 String x4[]=z[3].split(","); 163 x1_x=Double.parseDouble(x1[0].substring(0)); 164 x1_y=Double.parseDouble(x1[1].substring(0)); 165 x2_x=Double.parseDouble(x2[0].substring(0)); 166 x2_y=Double.parseDouble(x2[1].substring(0)); 167 x3_x=Double.parseDouble(x3[0].substring(0)); 168 x3_y=Double.parseDouble(x3[1].substring(0)); 169 x4_x=Double.parseDouble(x4[0].substring(0)); 170 x4_y=Double.parseDouble(x4[1].substring(0)); 171 172 a=Math.sqrt((x3_x - x2_x) * (x3_x - x2_x) + (x3_y - x2_y) * (x3_y - x2_y)); 173 b=Math.sqrt((x2_x - x4_x) * (x2_x - x4_x) + (x2_y - x4_y) * (x2_y - x4_y)); 174 c=Math.sqrt((x4_x - x3_x) * (x4_x - x3_x) + (x4_y - x3_y) * (x4_y - x3_y)); 175 if(a+b>c&&a+c>b&&b+c>a) { 176 u = ((x1_x-x2_x)*(x4_y-x2_y)-(x4_x-x2_x)*(x1_y-x2_y))/((x3_x-x2_x)*(x4_y-x2_y)-(x4_x-x2_x)*(x3_y-x2_y)); 177 v = ((x1_x-x2_x)*(x3_y-x2_y)-(x3_x-x2_x)*(x1_y-x2_y))/((x4_x-x2_x)*(x3_y-x2_y)-(x3_x-x2_x)*(x4_y-x2_y)); 178 // if(u>0&&v>0&&u+v<1) { 179 System.out.print("in the triangle"); 180 // }else { 181 // if((u==0&&v<1&&v>0)||(v==0&&u<1&&u>0)||(u>0&&v>0&&u+v<1)) { 182 // System.out.print("in the triangle"); 183 // }else { 184 // System.out.print("outof triangle"); 185 // } 186 // } 187 }else { 188 System.out.println("data error"); 189 } 190 } 191 } 192 }else{ 193 System.out.print("Wrong Format"); 194 } 195 } 196 197 }
分析:前期的處理與第二題並無特別大的差別,先將讀入的字串按照:分割開來,存入一組字串陣列中,得到兩組字串,第一組字串即使本組資料的編號,第二組字串即使座標總和。然後將第二組字串按照空格再賦值另一組字串陣列中,再用迴圈通過正則表示式對每一組資料,即每一個座標進行判斷是否符合輸入格式,如果不符合則直接輸出Wrong Format,如果符合,則再判斷第一個字串陣列中的編號為多少,通過編號題目判斷按空格分割後的字串陣列長度是否對應,如果不對應,則輸出wrong number of points,
如果正確,則再通過迴圈將按空格分割後的每一組陣列按,分割開,得到的即使每一個座標的x,y座標的值,將這些字串中的資料轉化為雙精度型別的資料,然後通過兩點之間的距離公式算出三角形三邊長度,然後根據三角形兩邊之和大於第三邊的原則判斷三點距離能不能構成三角形。如果不行,則輸出data error,如果可以,再根據編號進行對應的計算操作。
踩坑心得:在將整個字串進行分割的時候,一開始先將資料以空格分開,放入字串陣列中去,但這樣做的問題就是,將資料分開後,字串陣列中的第一個陣列的前面是帶著編號的,這就導致按空格分割後的字串陣列中的資料不都全一樣,且對於之後的編號判斷也有一定麻煩。所以在以空格分割之前應先以分號分割一邊,將編號字元分割出去,這樣也利於後續編號的判斷。
改進建議:在本題中的格式錯誤形式也是多種多樣的,按照之前的思路,只能是想到一種錯誤情況去特判一種錯誤情況,而這種方法太容易遺漏一些不符合格式的錯誤形式,從而導致有些資料本不符合格式要求卻通過了特判,進入了資料處理。而如果採用正則表示式的方法,就可以避免這種情況的出現,後續還應繼續深度學習這種表示式的使用及運用。
總結:
通過本階段三次題目集的訓練操作,讓我更能熟練的運用java程式中的輸入輸出操作,對字串和整形,浮點型資料的處理運用也有了進一步的提升,尤其是在字串的處理方面,通過本次題集練習,學到了很多新的處理字串的函式,比如split,就是將字串按照指定字元分割開來存入指定的字串陣列;replace,將字串中的指定字元替換為其他指定字元等等。包括題目中涉及到的關於資料座標、三角形等常見問題的運算和計算方法等,比如計算座標系中兩點之間的距離公式,求兩點連線的斜率,兩條直線的交點個數等等。在做練習的過程中還了解到了一個新的知識點叫做正則表示式,將其運用到字串是否符合格式的判斷會方便很多,這也是我通過這次練習瞭解到的需要去進一步學習的知識點,爭取在之後的程式設計中能將正則表示式靈活的運用進去。
對目前教師、課程、作業等組織方式都較滿意,就是有時的安排會與其他安排衝突等一些不確定因素,導致課程,作業的時間對衝,偶爾時間較緊迫。