1. 程式人生 > 其它 >前三次pta-blog

前三次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;預設值為false
9 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"