前三次pta-blog
pta前三次作業總結
前言:這三次的實驗還是有成長之處的,但難度也是質的飛越,我做第一次的pta是比較輕鬆的,但做到了第三次難度提升的非常的大,一開始無從下手,知道看了看別人的,外加自己思考慢慢的做了出來,所以說看到難題不要怕,要迎難而上。
題集一:
概述的說就是對基本功的考察,如建立scanner類物件,以及輸入輸出,對函式的呼叫,if-else的利用,do-while語句運用,題目的數量適中,但主要還是簡單的原因,再多也可以寫的下去。
題集二:
這次的題目比較少,只有三題,但可操作性還是比較可以的,注意考查的對字串的理解,以及運用了提取字元和查詢特定字元的函式,這些都是通過自學掌握的,題目還是比較基礎的,適合用來練手。
題集三:
這次的題目是真的較為困難,對直線,點,三角形的判斷理解,可謂十分透徹,對正則表示式運用需要比較熟練,通過它來判斷輸入的字串的格式,需要定義陣列儲存資料等等。
設計與分析
題集一:
7-1 字母-數字轉換 (11 分)輸入一個由英文字母組成的字串(大小寫均可),將所有英文字母轉換成它們在字母表中的序號,例如:“AbbcD”轉換為“12234”。
輸入格式:
由英文字母組成的字串(大小寫均可)。例如:“AbbcD”
若包含非英文字母,視為非法輸入。
輸出格式:
所有英文字母轉換成它們在字母表中的序號,例如:“12234”。
非法輸入輸出"Wrong Format".
1 import java.util.Scanner; 2 public class Main { 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 Scanner zm=new Scanner(System.in); 6 String s; 7 s=zm.next(); 8 boolean flag=false;//布林型為false;預設值為false9 for(int i=0;i<s.length();i++) { 10 if(s.charAt(i)>='a'&&s.charAt(i)<='z'||s.charAt(i)>='A'&&s.charAt(i)<='z') 11 flag=true; 12 else 13 { 14 flag=false; 15 break; 16 } 17 } 18 int i; 19 if(flag==true) { 20 for(i=0;i<s.length();i++) { 21 if(s.charAt(i)>='a'&&s.charAt(i)<='z') 22 System.out.print(s.charAt(i)-'a'+1); 23 if(s.charAt(i)>='A'&&s.charAt(i)<='Z') 24 System.out.print(s.charAt(i)-'A'+1); 25 } 26 } 27 else System.out.print("Wrong Format"); 28 } 29 }
這個還是比較easy,沒有什麼拐彎抹角,直接正常思路往下寫就會有結果,我是第一次寫還是主要運用c語言的思路來寫,因為發現大部分c的思路java也是行的通的。
7-2 串列埠字元解析 (40 分) 串列埠字元解析1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner sc=new Scanner(System.in); 5 String nm=sc.nextLine(); 6 int a=nm.indexOf('0'); 7 int c=0; 8 int b=1; 9 int judge=0;//judege判斷函式是否正確; 10 if(a==-1||nm.length()<11) 11 System.out.print("null data"); 12 else 13 { 14 while(a!=-1) 15 { 16 for(int i=a;i<a+9;i++) 17 { 18 if(nm.charAt(i)=='1') 19 c++; 20 } 21 if(nm.charAt(a+10)!='1') 22 System.out.println(b+":"+"validate error"); 23 else if((c%2!=0&&nm.charAt(a+9)=='1')||(c%2==0&&nm.charAt(a+9)=='0')) 24 System.out.print(b+":" + "parity check error"); 25 else 26 System.out.println(b+":"+nm.substring(a+1,a+9)); 27 b++; 28 c=0; 29 a=nm.indexOf('0',a+11); 30 } 31 } 32 } 33 }
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
這個題目我出現了錯誤,我想是我對題目還沒有理解的緣故吧,分不清奇偶檢驗,過不去這個測試點
7-3 String的格式判斷與內容提取 (10 分)
學校學生學號格式定義如下:
2位年級號+2位學院號+2位班級號+2位序號,如19041103,
編寫程式處理用全院學生學號連線起來的長字串,學院編號為20,包括17、18、19、20四個年級,請從字串中提取特定兩個班級202017班、202061班同學的學號後四位輸出,輸出編號之間用空格分隔,不換行。
注意:需要排除非法輸入。
輸入格式:
全院學生學號組成的長字串(學號之間無分隔)
學號格式定義如下:
2位年級號+2位學院號+2位班級號+2位序號,如19041103,
輸出格式:
特定兩個班級202017班、202061班同學的學號後四位
如:1701 6103 1704
import java.util.Scanner; import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); String s; s=sc.nextLine(); int n=s.length()/8; int b=0; if(s.length()%8==0) { String a[][]=new String[n][8]; for(int i=0;i<n;i++) { for(int j=0;j<8;j++) { char b1=s.charAt(i*8+j); String str2=String.valueOf(b1);//將char b1轉化為字串 a[i][j]=str2; } if("2".equals(a[i][0])&&"0".equals(a[i][1])&&"2".equals(a[i][2])&&"0".equals(a[i][3])&&"1".equals(a[i][4])&&"7".equals(a[i][5])) { for(int k=4;k<8;k++) { if(k==4) { if(b==0) { b++; } else { System.out.print(" "); } } System.out.print(a[i][k]); } } if("2".equals(a[i][0])&&"0".equals(a[i][1])&&"2".equals(a[i][2])&&"0".equals(a[i][3])&&"6".equals(a[i][4])&&"1".equals(a[i][5])) { for(int c=4;c<8;c++) { if(c==4) { if(b==0) { b++; } else { System.out.print(" "); } } System.out.print(a[i][c]); } } } } else { System.out.print("Wrong Format"); } } }
這道題中用了許多函式都是書上的函式,c語言中也從未涉及過的,很鍛鍊我們的邏輯思維,以及判斷能力,大量使用了if語句,還有equal()函式來判斷字元,我的想法是將這個輸入進來的字元按照長度分成8個長度單位為一組,儲存在陣列中,然後用for迴圈,進行依次的判斷。
題集三(一做省略)
7-1 點線形系列1-計算兩點之間的距離 (10 分)
輸入連個點的座標,計算兩點之間的距離
輸入格式:
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
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in =new Scanner(System.in); String sc=in.nextLine(); double x1,y1,x2,y2; double distance; String[]str=new String[4]; int n=0,m=0,l=0; if(sc.matches((-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[,](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[ ](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)[,](-?|\\+?)([1-9][\\d]*\\.[0-9][\\d]*|[0]\\.[0-9]*|[1-9][\\d]*|0)) { for(n=0;n < sc.length(); n++) { if(sc.charAt(n) ==' '||sc.charAt(n) == ',' ){ str[m] = sc.substring(l,n); l = n+1; m++; } } str[m] = sc.substring(l,sc.length()); x1 = Double.parseDouble(str[0]);//強制型別轉化,操作如下雷同; y1 = Double.parseDouble(str[1]); x2 = Double.parseDouble(str[2]); y2 = Double.parseDouble(str[3]); if(sc.matches(b)) { distance=(double) Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); System.out.print(distance);} } else if(sc.matches((-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[ ](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)([ ](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*)[,](-?|\\+?)([1-9][\\d]*\\.[\\d]+|[0]\\.[\\d]+|[0]|[1-9][\\d]*))+== true) { System.out.print("wrong number of points"); } else System.out.print("Wrong Fomat"); } }
怎麼說呢,這三道題都是聯絡在一起的,彼此都需要運用一中的正則表示式,很需要邏輯以及耐心,一開始不會的,然後我翻了翻書,發現有正則表示式的規則匹配模式,就嘗試寫,但仍然有紕漏,注意pta給你報錯,也不指出那裡了,我也無法修改,輸入座標計算距離這個很簡單,但主要是對字串格式的判斷是最主要的難度。
7-2 點線形系列2-線的計算 (42 分)使用者輸入一組選項和資料,進行與直線有關的計算。選項包括:
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",
輸出格式:
見題目描述。
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); String sc=in.nextLine(); String m=sc.replace(":",","); String str[] = m.split(" |,"); if(sc.matches("1:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) { if(str.length==5) { double x1 = Double.parseDouble(str[1]);//強制型別轉化,操作如下雷同; double y1 = Double.parseDouble(str[2]); double x2 = Double.parseDouble(str[3]); double y2 = Double.parseDouble(str[4]); if(x1!=x2) { double slope; slope = (y2-y1)/(x2-x1); System.out.print(slope);} else if(x1==x2&&y1==y2) { System.out.print("points coincide"); } else System.out.print("Slope does not exist"); } } else if(sc.matches("2:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) { if(str.length==7) { double x1 = Double.parseDouble(str[1]);//強制型別轉化,操作如下雷同; double y1 = Double.parseDouble(str[2]); double x2 = Double.parseDouble(str[3]); double y2 = Double.parseDouble(str[4]); double x3 = Double.parseDouble(str[5]); double y3 = Double.parseDouble(str[6]); if(((x1==x2)&&(y1==y2))||((x2==x3)&&(y2==y3))||((x1==x3&&y1==y3))) { System.out.print("points coincide"); } else { double diatance; diatance = Math.abs(((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3)/(Math.sqrt(Math.pow(y2-y3, 2) +Math.pow(x2-x3, 2)))); System.out.print(diatance); } } else System.out.print("wrong number of points"); } else if(sc.matches("3:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) { if(str.length==7) { double x1 = Double.parseDouble(str[1]);//強制型別轉化,操作如下雷同; double y1 = Double.parseDouble(str[2]); double x2 = Double.parseDouble(str[3]); double y2 = Double.parseDouble(str[4]); double x3 = Double.parseDouble(str[5]); double y3 = Double.parseDouble(str[6]); if(((x1==x2)&&(y1==y2))||((x2==x3)&&(y2==y3))||((x1==x3&&y1==y3))) System.out.print("points coincide"); else{ if((y3-y2)/(x3-x2)==(y3-y1)/(x3-x1)||(y3-y1)/(x3-x1)==(y2-y1)/(x2-x1)||(y3-y2)/(x3-x2)==(y2-y1)/(x2-x1)) System.out.print("true"); else System.out.print("false"); } } else System.out.print("wrong number of points"); } else if(sc.matches("4:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")){ if(str.length==9) { double x1 = Double.parseDouble(str[1]);//強制型別轉化,操作如下雷同; double y1 = Double.parseDouble(str[2]); double x2 = Double.parseDouble(str[3]); double y2 = Double.parseDouble(str[4]); double x3 = Double.parseDouble(str[5]); double y3 = Double.parseDouble(str[6]); double x4 = Double.parseDouble(str[7]); double y4 = Double.parseDouble(str[8]); if(((x1==x2)&&(y1==y2))||((x2==x3)&&(y2==y3))||((x1==x3&&y1==y3))||(x1==x4)&&(y1==y4)||(x2==x4)&&(y2==y4)||(x3==x4)&&(y3==y4)) { System.out.print("points coincide");} else { if((y1-y2)/(x1-x2)==(y3-y4)/(x3-x4)) System.out.print("true"); else System.out.print("false"); } } else System.out.print("wrong number of points"); } else if(sc.matches("5:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")){ if(str.length==9) { double x1 = Double.parseDouble(str[1]);//強制型別轉化,操作如下雷同; double y1 = Double.parseDouble(str[2]); double x2 = Double.parseDouble(str[3]); double y2 = Double.parseDouble(str[4]); double x3 = Double.parseDouble(str[5]); double y3 = Double.parseDouble(str[6]); double x4 = Double.parseDouble(str[7]); double y4 = Double.parseDouble(str[8]); if(((x1==x2)&&(y1==y2))||((x2==x3)&&(y2==y3))||((x1==x3&&y1==y3))||(x1==x4)&&(y1==y4)||(x2==x4)&&(y2==y4)||(x3==x4)&&(y3==y4)) { System.out.print("points coincide");} else { double p,q; p = (y3*x4*x2-y4*x3*x2-y3*x4*x1+y4*x3*x1-y1*x2*x4+y2*x1*x4+y1*x2*x3-y2*x1*x3)/(x4*y2-x4*y1-x3*y2+x3*y1-x2*y4+x2*y3+x1*y4-x1*y3); q = (-y3*x4*y2+y4*x3*y2+y3*x4*y1-y4*x3*y1+y1*x2*y4-y1*x2*y3-y2*x1*y4+y2*x1*y3)/(y4*x2-y4*x1-y3*x2+x1*y3-y2*x4+y2*x3+y1*x4-y1*x3); if((p > x1 && p < x2) || (p > x2 && p < x1)) { if((q > y1 && q < y2) || (q > y2 && q < y1)) System.out.println(p + "," + q + " " + "true"); else System.out.println(p + "," + q + " " + "false"); } else if((p > x3 && p < x4) || (p > x4 && p < x3)) { if((q > y3 &&q < y4) || (q > y4 && q < y3)) System.out.println(p + "," + p + " " + "true"); else System.out.println(p + "," + q + " " + "false"); } else System.out.println(p + "," + q + " " + "false"); if((y1-y2)/(x1-x2)==(y3-y4)/(x3-x4)) System.out.print("is parallel lines,have no intersection point"); } } else System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } }
首先用這則表示式進行判斷匹配,如果符合就進行for迴圈,分別有五個功能,斜率,點線距離,平行,重合,點線上與線的內還是外部,都需要總和方面的考慮,非常的耗時耗力,做了幾天還是沒有滿分,格式錯誤,也不說是哪個格式錯誤,就很傷腦筋,上面五個點的數學公式都可以在網上copy到,無需自己進行演算。最難得還是正則,和上一題還是不同的真的會謝。
7-3 點線形系列3-三角形的計算 (48 分)使用者輸入一組選項和資料,進行與三角形有關的計算。選項包括:
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",
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); String s=input.nextLine(); String a=s.replace(":",","); String coord[] = a.split(",| "); input.close(); if(s.matches("1:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) { if(coord.length==7) { double x1 = Double.parseDouble(coord[1]); double y1 = Double.parseDouble(coord[2]); double x2 = Double.parseDouble(coord[3]); double y2 = Double.parseDouble(coord[4]); double x3 = Double.parseDouble(coord[5]); double y3 = Double.parseDouble(coord[6]); boolean judge=false,judge1=false,judge2=false; if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)||(x1==x2&&x1==x3))judge=false; else { if(x1==x2||x1==x3||x2==x3)judge=true; else { double slope1=(y1-y2)/(x1-x2); double slope2=(y1-y3)/(x1-x3); if(slope1!=slope2)judge=true; } } if(judge) { double line1=(y1-y2)*(y1-y2)+(x1-x2)*(x1-x2); double line2=(y1-y3)*(y1-y3)+(x1-x3)*(x1-x3); double line3=(y2-y3)*(y2-y3)+(x2-x3)*(x2-x3); if(line1==line2||line1==line3||line2==line3) { judge1=true; if(line1==line2&&line1==line3)judge2=true; } System.out.print(judge1+" "+judge2); } else System.out.print("data error"); } else System.out.print("wrong number of points"); } else if(s.matches("2:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) { if(coord.length==7) { double x1 = Double.parseDouble(coord[1]); double y1 = Double.parseDouble(coord[2]); double x2 = Double.parseDouble(coord[3]); double y2 = Double.parseDouble(coord[4]); double x3 = Double.parseDouble(coord[5]); double y3 = Double.parseDouble(coord[6]); boolean judge=false; if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)||(x1==x2&&x1==x3))judge=false; else { if(x1==x2||x1==x3||x2==x3)judge=true; else { double slope1=(y1-y2)/(x1-x2); double slope2=(y1-y3)/(x1-x3); if(slope1!=slope2)judge=true; } } if(judge) { double line1=Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2)); double line2=Math.sqrt((y1-y3)*(y1-y3)+(x1-x3)*(x1-x3)); double line3=Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)); double circumference=line1+line2+line3; double area=(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)/2; double x0=(x1+x2+x3)/3; double y0=(y1+y2+y3)/3; if(circumference*1e+6%10!=0) { String num1=String.format("%.6f",circumference); System.out.print(num1+" "); } else System.out.print(circumference+" "); if(area*1e+6%10!=0) { String num2=String.format("%.6f",area); System.out.print(num2+" "); } else System.out.print(area+" "); if(x0*1e+6%10!=0) { String num3=String.format("%.6f",x0); System.out.print(num3+" "); } else System.out.print(x0+","); if(y0*1e+6%10!=0) { String num4=String.format("%.6f",y0); System.out.print(num4); } else System.out.print(y0); } else System.out.print("data error"); } else System.out.print("wrong number of points"); } else if(s.matches("3:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) { if(coord.length==7) { double x1 = Double.parseDouble(coord[1]); double y1 = Double.parseDouble(coord[2]); double x2 = Double.parseDouble(coord[3]); double y2 = Double.parseDouble(coord[4]); double x3 = Double.parseDouble(coord[5]); double y3 = Double.parseDouble(coord[6]); boolean judge=false,judge1=false,judge2=false,judge3=false; if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)||(x1==x2&&x1==x3))judge=false; else { if(x1==x2||x1==x3||x2==x3)judge=true; else { double slope1=(y1-y2)/(x1-x2); double slope2=(y1-y3)/(x1-x3); if(slope1!=slope2)judge=true; } } if(judge) { double line1=(y1-y2)*(y1-y2)+(x1-x2)*(x1-x2); double line2=(y1-y3)*(y1-y3)+(x1-x3)*(x1-x3); double line3=(y2-y3)*(y2-y3)+(x2-x3)*(x2-x3); if(line1+line2>line3&&line1+line3>line2&&line2+line3>line1)judge1=true; else if(line1+line2==line3||line1+line3==line2&&line2+line3==line1)judge2=true; else judge3=true; System.out.print(judge3+" "+judge2+" "+judge1); } else System.out.print("data error"); } else System.out.print("wrong number of points"); } else if(s.matches("4:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) { if(coord.length==11) { double x1 = Double.parseDouble(coord[1]); double y1 = Double.parseDouble(coord[2]); double x2 = Double.parseDouble(coord[3]); double y2 = Double.parseDouble(coord[4]); double x3 = Double.parseDouble(coord[5]); double y3 = Double.parseDouble(coord[6]); double x4 = Double.parseDouble(coord[7]); double y4 = Double.parseDouble(coord[8]); double x5 = Double.parseDouble(coord[9]); double y5 = Double.parseDouble(coord[10]); boolean judge=false; if(x1==x2&&y1==y2)System.out.print("points coincide"); else { if((x3==x4&&y3==y4)||(x3==x5&&y3==y5)||(x4==x5&&y4==y5)||(x3==x4&&x3==x5))judge=false; else { if(x3==x4||x3==x5||x4==x5)judge=true; else { double slope1=(y3-y4)/(x3-x4); double slope2=(y3-y5)/(x3-x5); if(slope1!=slope2)judge=true; } } if(judge) { double distance1=((y1-y2)*x3+(x2-x1)*y3+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2)); double distance2=((y1-y2)*x4+(x2-x1)*y4+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2)); double distance3=((y1-y2)*x5+(x2-x1)*y5+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2)); if((distance1>0&&distance2>0&&distance3>0)||(distance1<0&&distance2<0&&distance3<0))System.out.print("0"); else if((distance1==0&&distance2*distance3>0)||(distance2==0&&distance1*distance3>0)||(distance3==0&&distance1*distance2>0))System.out.print("1"); else if((distance1==0&&distance2==0)||(distance1==0&&distance3==0)||(distance2==0&&distance3==0))System.out.print("The point is on the edge of the triangle"); else { System.out.print("2 "); } } else System.out.print("data error"); } } else System.out.print("wrong number of points"); } else if(s.matches("5:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) { if(coord.length==9) { double x1 = Double.parseDouble(coord[1]); double y1 = Double.parseDouble(coord[2]); double x2 = Double.parseDouble(coord[3]); double y2 = Double.parseDouble(coord[4]); double x3 = Double.parseDouble(coord[5]); double y3 = Double.parseDouble(coord[6]); double x4 = Double.parseDouble(coord[7]); double y4 = Double.parseDouble(coord[8]); boolean judge=false; if((x2==x3&&y2==y3)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4)||(x2==x3&&x2==x4))judge=false; else { if(x2==x3||x2==x4||x3==x4)judge=true; else { double slope1=(y2-y3)/(x2-x3); double slope2=(y2-y4)/(x2-x4); if(slope1!=slope2)judge=true; } } if(judge) { double distance1=((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3)/Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)); double distance2=((y2-y4)*x1+(x4-x2)*y1+x2*y4-y2*x4)/Math.sqrt((y2-y4)*(y2-y4)+(x2-x4)*(x2-x4)); double distance3=((y3-y4)*x1+(x4-x3)*y1+x3*y4-y3*x4)/Math.sqrt((y3-y4)*(y3-y4)+(x3-x4)*(x3-x4)); double area=(x2*y3+x3*y4+x4*y2-x2*y4-x3*y2-x4*y3)/2; double area1=(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)/2; double area2=(x1*y2+x2*y4+x4*y1-x1*y4-x2*y1-x4*y2)/2; double area3=(x1*y4+x4*y3+x3*y1-x1*y3-x4*y1-x3*y4)/2; if(area==(area1+area2+area3)) { if(distance1==0||distance2==0||distance3==0)System.out.print("on the triangle"); else System.out.print("in the triangle"); } else System.out.print("outof the triangle"); } else System.out.print("data error"); } else System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } }
如題所述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"
建立五個選項,分別執行他的功能,與題目二是一樣的思路,但最後兩個選項我實在無法參透,這道題只拿了20幾分,他對三角形的理解以及點與直線,點與點都很重要,並不能一概而論,每道題都層次遞進
我覺得老師用心良苦。
總結:
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"