目錄
- pta第一次博客
- 1.前言
- 2.設計與分析
- 第二次作業第二題
- 第三次作業第一題
- 第三次作業第二題
- 第三次作業第三題
- 3.踩坑心得:
- 4.改進建議
- 5.總結
pta第一次博客
1.前言
這三次pta里,第一次的難度是最低的,基本上只要會基礎的格式,對java有一定的了解就能輕松解決,第二次難度較低,只要掌握一些字串的相應函式就能解決,第三次作業難度就相對提升了很大一個階段,需要熟悉并熟練運用正則運算式來處理字串,還需要熟練對類的劃分和參考,
2.設計與分析
第二次作業第二題
1.題目:
RS232是串口常用的通信協議,在異步通信模式下,串口可以一次發送58位資料,收發雙方之間沒有資料發送時線路維持高電平,相當于接收方持續收到資料“1”(稱為空閑位),發送方有資料發送時,會在有效資料(58位,具體位數由通信雙方提前設定)前加上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
試題分析
本題主要是要熟悉對字串資料的處理,其中如果結束符不為1和結束符與奇偶校驗均不合格時輸出是一樣的,所以可以先判斷結束符是否合格,
源代碼展示:
查看代碼
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input =new Scanner(System.in);
String a=input.nextLine();
int i,j=1,n,m=0;
if(a.length()<11)
{
System.out.print("null data");
return;
}
for(i=0;i<a.length();i++)
{
if(a.charAt(i)=='0')
break;
if(i==a.length()-1&&a.charAt(i)!='0')
{
System.out.print("null data");
return;
}
}
for(i=0;i<a.length();i++)
{
if(a.charAt(i)=='0')
{
if(a.length()-i<10)
return;
m=0;
for(n=i+1;n<i+10;n++)
{
if(a.charAt(n)=='1')
m++;
}
if(a.charAt(i+10)!='1')
{
System.out.println(j+":"+"validate error");
j++;i+=10;
continue;
}
else if(m%2==0)
{
System.out.println(j+":"+"parity check error");
j++;i+=10;
continue;
}
else
{
System.out.println(j+":"+a.substring(i+1,i+9));
j++;i+=10;
}
}
}
}
}
SourceMonitor生成的報表內容:


代碼分析總結:
本題的難度不是很高,比較中等偏低,但因為剛開始接觸java,還是按照當初C語言的方式就行編碼,導致代碼復用性較低,之后還是要多加改進,
第三次作業第一題
1.題目:
輸入連個點的坐標,計算兩點之間的距離
輸入格式:
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
試題分析
本題主要考核正則運算式的使用,判斷兩點的資料是否合法以及點的數量是否合格,資料不合格則輸出"Wrong Format“,坐標點的數量超過兩個,輸出“wrong number of points”
源代碼展示:
查看代碼
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.nextLine();
String[] point=input.split(" ");
String s[]=null;
if(point.length>2)
{
System.out.println("wrong number of points");
return ;
}
int i=0,j=0;
for(i=0;i<point.length;i++)
{
s=point[i].split(",");
for(j=0;j<s.length;j++)
{
if(!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)"))
{
System.out.println("Wrong Format");
return ;
}
}
}
double x1,y1,x2,y2,l;
s=point[0].split(",");
x1=((s[0]);
y1=Double.valueOf(s[1]);
s=point[1].split(",");
x2=Double.valueOf(s[0]);
y2=Double.valueOf(s[1]);
if(x1==x2&&y1==y2)
{
System.out.println("Wrong Format");
return ;
}
l=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
System.out.println(l);
}
}
SourceMonitor生成的報表內容:


代碼分析總結:
本次寫題還是因為習慣了C語言的寫法,將主要演算法全塞在main函式中,復用性不行,
第三次作業第二題
題目:
用戶輸入一組選項和資料,進行與直線有關的計算,選項包括:
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) {
Scanner in = new Scanner(System.in);
String S= in.nextLine();
if(S.charAt(1)!=':')
{
System.out.println("Wrong Format");
return;
}
String[] str=S.split(":");
if("1".equals(str[0]))
{
Point2 s1=new Point2();
s1.input=str[1];
s1.getpoint();
}
else if("2".equals(str[0]))
{
Point3 s2=new Point3();
s2.input=str[1];
s2.getpoint();
System.out.println(s2.l);
}
else if("3".equals(str[0]))
{
Point3 s2=new Point3();
s2.input=str[1];
s2.getpoint();
if(s2.p==1)
System.out.println("true");
else
System.out.println("false");
}
else if("4".equals(str[0]))
{
Point4 s3=new Point4();
s3.input=str[1];
s3.getpoint();
if(s3.p==1)
System.out.println("true");
else
System.out.println("false");
}
else if("5".equals(str[0]))
{
Point4 s3=new Point4();
s3.input=str[1];
s3.getpoint();
if(s3.p==1)
System.out.println("is parallel lines,have no intersection point");
else if(s3.n==1)
System.out.println(s3.x0+","+s3.y0+" "+"true");
else
System.out.println(s3.x0+","+s3.y0+" "+"false");
}
else
{
System.out.println("Wrong Format");
}
}
}
class Point2 {
String input;
String[] point;
String[] s;
double x1,y1,x2,y2,k;
public void getpoint() {
int i,j;
point=input.split(" ");
for(i=0;i<point.length;i++)
{
s=point[i].split(",");
if(s.length!=2)
{
System.out.println("Wrong Format");
System.exit(0);
}
for(j=0;j<s.length;j++)
{
if(!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)"))
{
System.out.println("Wrong Format");
System.exit(0);
}
}
}
if(point.length!=2)
{
System.out.println("wrong number of points");
System.exit(0);
}
s=point[0].split(",");
x1=Double.valueOf(s[0]);
y1=Double.valueOf(s[1]);
s=point[1].split(",");
x2=Double.valueOf(s[0]);
y2=Double.valueOf(s[1]);
if(x1==x2&&y1==y2)
{
System.out.println("points coincide");
System.exit(0);
}
if(x1==x2)
{
System.out.println("Slope does not exist");
System.exit(0);
}
k=(y1-y2)/(x1-x2);
System.out.println(k);
}
}
class Point3 {
String input;
String[] point;
String[] s;
double x1,y1,x2,y2,x3,y3,l,p=0;
public void getpoint() {
int i,j;
point = input.split(" ");
for (i = 0; i < point.length; i++) {
s = point[i].split(",");
if(s.length!=2)
{
System.out.println("Wrong Format");
System.exit(0);
}
for (j = 0; j < s.length; j++) {
if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
if(point.length!=3)
{
System.out.println("wrong number of points");
System.exit(0);
}
s = point[0].split(",");
x1 = Double.valueOf(s[0]);
y1 = Double.valueOf(s[1]);
s = point[1].split(",");
x2 = Double.valueOf(s[0]);
y2 = Double.valueOf(s[1]);
s = point[2].split(",");
x3 = Double.valueOf(s[0]);
y3 = Double.valueOf(s[1]);
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3))
{
System.out.println("points coincide");
System.exit(0);
}
if(x2==x3)
l=x1-x2;
else
l=((y2-y3)*x1-(x2-x3)*y1-y2*x3+y3*x2)/(Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)));
l=Math.abs(l);
if(l<0.001)
p=1;
}
}
package pta23;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String S = in.nextLine();
if (S.charAt(1) != ':') {
System.out.println("Wrong Format");
return;
}
String[] str=S.split(":");
if("1".equals(str[0]))
{
Point3 s1=new Point3();
s1.input=str[1];
s1.getpoint();
if(s1.dy==1)
System.out.print("true ");
else
System.out.print("false ");
if(s1.db==1)
System.out.print("true");
else
System.out.print("false");
}
if("2".equals(str[0])) {
Point3 s1 = new Point3();
s1.input = str[1];
s1.getpoint();
System.out.println(s1.C+" "+s1.S+" "+s1.x0+","+s1.y0);
}
if("3".equals(str[0]))
{
Point3 s1 = new Point3();
s1.input = str[1];
s1.getpoint();
if(s1.d==1)
System.out.print("true ");
else
System.out.print("false ");
if(s1.z==1)
System.out.print("true ");
else
System.out.print("false ");
if(s1.r==1)
System.out.print("true");
else
System.out.print("false");
}
}
}
class Point3 {
String input;
String[] point;
String[] s;
double x1, y1, x2, y2, x3, y3, l1,l2,l3,dy=0,db=0,C,S,x0,y0,z=0,d=0,r=0;
public void getpoint() {
int i, j;
point = input.split(" ");
for (i = 0; i < point.length; i++) {
s = point[i].split(",");
if (s.length != 2) {
System.out.println("Wrong Format");
System.exit(0);
}
for (j = 0; j < s.length; j++) {
if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
if (point.length != 3) {
System.out.println("wrong number of points");
System.exit(0);
}
s = point[0].split(",");
x1 = Double.valueOf(s[0]);
y1 = Double.valueOf(s[1]);
s = point[1].split(",");
x2 = Double.valueOf(s[0]);
y2 = Double.valueOf(s[1]);
s = point[2].split(",");
x3 = Double.valueOf(s[0]);
y3 = Double.valueOf(s[1]);
if ((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)){
System.out.println("points coincide");
System.exit(0);
}
l1=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
l2=Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
l3=Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
if(l1+l2-l3<=0)
{
System.out.println("data error");
System.exit(0);
}
if(l1==l2||l2==l3||l1==l3)
dy=1;
if(l1==l2&&l2==l3)
db=1;
C=l1+l2+l3;
S=Math.sqrt(C/2*(C/2-l1)*(C/2-l2)*(C/2-l3));
x0=(x1+x2+x3)/3;
y0=(y1+y2+y3)/3;
String X0=String.format("%."+6+"f",x0);String Y0=String.format("%."+6+"f",y0);
String C0=String.format("%."+6+"f",C);String S0=String.format("%."+6+"f",S);
x0= Double.valueOf(X0);y0= Double.valueOf(Y0);C= Double.valueOf(C0);S= Double.valueOf(S0);
double a,b,c;
c=(l1*l1+l2*l2-l3*l3)/2*l1*l2;
b=(l1*l1-l2*l2+l3*l3)/2*l1*l3;
a=(-l1*l1+l2*l2+l3*l3)/2*l3*l2;
if(Math.abs(a)<=0.001||Math.abs(b)<=0.001||Math.abs(c)<=0.001)
z=1;
else if(a<0||b<0||c<0)
d=1;
else if(a>0&&b>0&&c>0)
r=1;
}
}
if((x1==x2&&x3!=x4)||(x1!=x2&&x3==x4))
{
A1=y1-y2;B1=x2-x1;C1=y2*x1-y1*x2;
A2=y3-y4;B2=x4-x3;C2=y4*x3-y3*x4;
x0=(B2*C1-B1*C2)/(B1*A2-B2*A1);
y0=(A2*C1-A1*C2)/(A1*B2-A2*B1);
if((x0>x1&&x0<x2)||(x0>x2&&x0<x1)||(x0<x3&&x0>x4)||(x0<x4&&x0>x3))
n=1;
return ;
}
if(x1==x2&&x3==x4)
{
p=1;
return;
}
k1=(y1-y2)/(x1-x2);
k2=(y3-y4)/(x3-x4);
if(Math.abs(k1-k2)<=0.000001)
{
p=1;
return;
}
if(p==0)
{
A1=y1-y2;B1=x2-x1;C1=y2*x1-y1*x2;
A2=y3-y4;B2=x4-x3;C2=y4*x3-y3*x4;
x0=(B2*C1-B1*C2)/(B1*A2-B2*A1);
y0=(A2*C1-A1*C2)/(A1*B2-A2*B1);
if((x0>x1&&x0<x2)||(x0>x2&&x0<x1)||(x0<x3&&x0>x4)||(x0<x4&&x0>x3))
n=1;
}
}
}
SourceMonitor生成的報表內容:


代碼分析總結:
寫本題我對java的了解深入了一點,學會了將各個要求分為多個類,但還是不熟練,有些偷懶,例如把點與線的兩個操作放到一個類里去判斷,導致代碼的復用性降低,復雜度提升,同時沒有把正則運算式判斷歸到一個類里,導致有大量重復的代碼,
第三次作業第三題
題目:
用戶輸入一組選項和資料,進行與三角形有關的計算,選項包括:
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) {
Scanner in = new Scanner(System.in);
String S = in.nextLine();
if (S.charAt(1) != ':') {
System.out.println("Wrong Format");
return;
}
String[] str=S.split(":");
if("1".equals(str[0]))
{
Point3 s1=new Point3();
s1.input=str[1];
s1.getpoint();
if(s1.dy==1)
System.out.print("true ");
else
System.out.print("false ");
if(s1.db==1)
System.out.print("true");
else
System.out.print("false");
}
if("2".equals(str[0])) {
Point3 s1 = new Point3();
s1.input = str[1];
s1.getpoint();
System.out.println(s1.C+" "+s1.S+" "+s1.x0+","+s1.y0);
}
if("3".equals(str[0]))
{
Point3 s1 = new Point3();
s1.input = str[1];
s1.getpoint();
if(s1.d==1)
System.out.print("true ");
else
System.out.print("false ");
if(s1.z==1)
System.out.print("true ");
else
System.out.print("false ");
if(s1.r==1)
System.out.print("true");
else
System.out.print("false");
}
if("4".equals(str[0]))
{
Point5 s5 = new Point5();
s5.input = str[1];
s5.getpoint();
String s1=String.format("%."+6+"f",s5.s1);String s2=String.format("%."+6+"f", s5.s2);
s5.s1= Double.parseDouble(s1);s5.s2= Double.parseDouble(s2);
if(s5.s1>s5.s2)
System.out.println(2+" "+s5.s2+" "+s5.s1);
else
System.out.println(2+" "+s5.s1+" "+s5.s2);
}
if("5".equals(str[0])) {
Point4 s4 = new Point4();
s4.input = str[1];
s4.getpoint();
if (s4.in == 1)
System.out.println("in the triangle");
else
System.out.println("outof the triangle");
}
}
}
class Point3 {
String input;
String[] point;
String[] s;
double x1, y1, x2, y2, x3, y3, l1,l2,l3,dy=0,db=0,C,S,x0,y0,z=0,d=0,r=0;
public void getpoint() {
int i, j;
point = input.split(" ");
for (i = 0; i < point.length; i++) {
s = point[i].split(",");
if (s.length != 2) {
System.out.println("Wrong Format");
System.exit(0);
}
for (j = 0; j < s.length; j++) {
if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
if (point.length != 3) {
System.out.println("wrong number of points");
System.exit(0);
}
s = point[0].split(",");
x1 = Double.valueOf(s[0]);
y1 = Double.valueOf(s[1]);
s = point[1].split(",");
x2 = Double.valueOf(s[0]);
y2 = Double.valueOf(s[1]);
s = point[2].split(",");
x3 = Double.valueOf(s[0]);
y3 = Double.valueOf(s[1]);
if ((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)){
System.out.println("points coincide");
System.exit(0);
}
l1=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
l2=Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
l3=Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
if(l1+l2-l3<=0)
{
System.out.println("data error");
System.exit(0);
}
if(l1==l2||l2==l3||l1==l3)
dy=1;
if(l1==l2&&l2==l3)
db=1;
C=l1+l2+l3;
S=Math.sqrt(C/2*(C/2-l1)*(C/2-l2)*(C/2-l3));
x0=(x1+x2+x3)/3;
y0=(y1+y2+y3)/3;
String X0=String.format("%."+6+"f",x0);String Y0=String.format("%."+6+"f",y0);
String C0=String.format("%."+6+"f",C);String S0=String.format("%."+6+"f",S);
x0= Double.valueOf(X0);y0= Double.valueOf(Y0);C= Double.valueOf(C0);S= Double.valueOf(S0);
double a,b,c;
c=(l1*l1+l2*l2-l3*l3)/2*l1*l2;
b=(l1*l1-l2*l2+l3*l3)/2*l1*l3;
a=(-l1*l1+l2*l2+l3*l3)/2*l3*l2;
if(Math.abs(a)<=0.001||Math.abs(b)<=0.001||Math.abs(c)<=0.001)
z=1;
else if(a<0||b<0||c<0)
d=1;
else if(a>0&&b>0&&c>0)
r=1;
}
}
class Point5 {
String input;
String[] point;
String[] s;
double x1, y1, x2, y2, x3, y3, x4, y4,x5,y5,l1,l2,l3,s1,s2=0;
int jd=0;
public void getpoint() {
int i, j;
point = input.split(" ");
for (i = 0; i < point.length; i++) {
s = point[i].split(",");
if (s.length != 2) {
System.out.println("Wrong Format");
System.exit(0);
}
for (j = 0; j < s.length; j++) {
if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
if (point.length != 5) {
System.out.println("wrong number of points");
System.exit(0);
}
s = point[0].split(",");
x1 = Double.valueOf(s[0]);
y1 = Double.valueOf(s[1]);
s = point[1].split(",");
x2 = Double.valueOf(s[0]);
y2 = Double.valueOf(s[1]);
s = point[2].split(",");
x3 = Double.valueOf(s[0]);
y3 = Double.valueOf(s[1]);
s = point[3].split(",");
x4 = Double.valueOf(s[0]);
y4 = Double.valueOf(s[1]);
s = point[4].split(",");
x5 = Double.valueOf(s[0]);
y5 = Double.valueOf(s[1]);
if (x1==x2&&y1==y2){
System.out.println("points coincide");
System.exit(0);
}
if((x3==x4&&y3==y4)||(x3==x5&&y3==y5)||x4==x5&&y4==y5)
{
System.out.println("data error");
System.exit(0);
}
l1=Math.sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4));
l2=Math.sqrt((x3-x5)*(x3-x5)+(y3-y5)*(y3-y5));
l3=Math.sqrt((x4-x5)*(x4-x5)+(y4-y5)*(y4-y5));
if(l1+l2-l3<=0.000001)
{
System.out.println("data error");
System.exit(0);
}
double A1,A2,A3,A4,B1,B2,B3,B4,C1,C2,C3,C4,x6,y6,x7,y7,x8,y8,S;
A1=y1-y2;B1=x2-x1;C1=y2*x1-y1*x2;
A2=y3-y4;B2=x4-x3;C2=y4*x3-y3*x4;
A3=y3-y5;B3=x5-x3;C3=y5*x3-y3*x5;
A4=y4-y5;B4=x5-x4;C4=y5*x4-y4*x5;
double h=(A4*x3+B4*y3+C4)/(Math.sqrt(A4*A4+B4*B4));
h=Math.abs(h);
S=0.5*l3*h;
x6=(B2*C1-B1*C2)/(B1*A2-B2*A1);
y6=(A2*C1-A1*C2)/(A1*B2-A2*B1);
x7=(B3*C1-B1*C3)/(B1*A3-B3*A1);
y7=(A3*C1-A1*C3)/(A1*B3-A3*B1);
x8=(B4*C1-B1*C4)/(B1*A4-B4*A1);
y8=(A4*C1-A1*C4)/(A1*B4-A4*B1);
double q1=A1*x3+B1*y3+C1,q2=A1*x4+B1*y4+C1,q3=A1*x5+B1*y5+C1;
if((Math.abs(q1)<=0.000001&&Math.abs(q2)<=0.000001)||(Math.abs(q3)<=0.000001&&Math.abs(q1)<=0.000001)||(Math.abs(q3)<=0.000001&&Math.abs(q2)<=0.000001))
{
System.out.println("The point is on the edge of the triangle");
System.exit(0);
}
if(Math.abs(q1)<=0.000001||Math.abs(q2)<=0.000001||Math.abs(q3)<=0.000001)
{
jd=jd+1;
}
if(A1/B1!=A2/B2)
{
if((x6<x3&&x6>x4)||(x6<x4&&x6>x3)||(y6<y3&&y6>y4)||(y6<y4&&y6>y3))
jd=jd+1;
}
if(A1/B1!=A3/B3)
{
if((x7<x3&&x7>x5)||(x7<x5&&x7>x3)||(y7<y3&&y7>y5)||(y7<y5&&y7>y3))
jd=jd+1;
}
if(A1/B1!=A4/B4)
{
if((x8<x5&&x8>x4)||(x8<x4&&x8>x5)||(y8<y5&&y8>y4)||(y8<y4&&y8>y5))
jd=jd+1;
}
if(jd<2)
{
System.out.println(jd);
System.exit(0);
}
else {
if ((((x6 <= x3 && x6 >= x4) || (x6 <= x4 && x6 >= x3)) && ((x7 <= x3 && x7 >= x5) || (x7 <= x5 && x7 >= x3))&&x6!=x7)) {
double len1=Math.sqrt(Math.pow(x6-x7,2)+Math.pow(y6-y7,2));
double h1=Math.abs(A1*x3+B1*y3+C1)/Math.sqrt(Math.pow(A1,2)+Math.pow(B1,2));
s1=len1*h1/2;
s2=S-s1;
}
if (s2 <= 0.000001) {
if (((x6 <= x3 && x6 >= x4) || (x6 <= x4 && x6 >= x3)) && ((x8 <= x4 && x8 >= x5) || (x8 <= x5 && x8 >= x4))&&x6!=x8) {
double z1 = Math.sqrt((x6 - x8) * (x6 - x8) + (y6 - y8) * (y6 - y8));
double z2 = Math.sqrt((x6 - x4) * (x6 - x4) + (y6 - y4) * (y6 - y4));
double z3 = Math.sqrt((x4 - x8) * (x4 - x8) + (y4 - y8) * (y4 - y8));
double c1 = z1 + z2 + z3;
s1 = Math.sqrt(c1 / 2 * (c1 / 2 - z1) * (c1 / 2 - z2) * (c1 / 2 - z3));
s2 = S - s1;
}
if (s2 <= 0.000001) {
if (((x7 <= x3 && x7 >= x5) || (x7 <= x5 && x7 >= x3)) && ((x8 <= x4 && x8 >= x5) || (x8 <= x5 && x8 >= x4))) {
double z1 = Math.sqrt((x8 - x7) * (x8 - x7) + (y8 - y7) * (y8 - y7));
double z2 = Math.sqrt((x7 - x5) * (x7 - x5) + (y7 - y5) * (y7 - y5));
double z3 = Math.sqrt((x5 - x8) * (x5 - x8) + (y5 - y8) * (y5 - y8));
double c1 = z1 + z2 + z3;
s1 = Math.sqrt(c1 / 2 * (c1 / 2 - z1) * (c1 / 2 - z2) * (c1 / 2 - z3));
s2 = S - s1;
}
}
}
}
}
}
class Point4 {
String input;
String[] point;
String[] s;
double x1, y1, x2, y2, x3, y3, x4, y4, l1, l2, l3, l4,l5,l6,s1,s2,s3,C,S;
int in=1;
public void getpoint() {
int i, j;
point = input.split(" ");
for (i = 0; i < point.length; i++) {
s = point[i].split(",");
if (s.length != 2) {
System.out.println("Wrong Format");
System.exit(0);
}
for (j = 0; j < s.length; j++) {
if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
if (point.length != 4) {
System.out.println("wrong number of points");
System.exit(0);
}
s = point[0].split(",");
x1 = Double.valueOf(s[0]);
y1 = Double.valueOf(s[1]);
s = point[1].split(",");
x2 = Double.valueOf(s[0]);
y2 = Double.valueOf(s[1]);
s = point[2].split(",");
x3 = Double.valueOf(s[0]);
y3 = Double.valueOf(s[1]);
s = point[3].split(",");
x4 = Double.valueOf(s[0]);
y4 = Double.valueOf(s[1]);
double A1,A2,A3,B1,B2,B3,C1,C2,C3;
A1=y2-y3;B1=x3-x2;C1=y3*x2-y2*x3;
A2=y2-y4;B2=x4-x2;C2=y4*x2-y2*x4;
A3=y3-y4;B3=x4-x3;C3=y4*x3-y3*x4;
double q1=A1*x1+B1*y1+C1,q2=A2*x1+B2*y1+C2,q3=A3*x1+B3*y1+C3;
if(Math.abs(q1)==0||Math.abs(q2)==0||Math.abs(q3)==0)
{
System.out.println("on the triangle");
System.exit(0);
}
l1=Math.sqrt((x2-x3)*(x2-x3)+(y3-y2)*(y3-y2));
l2=Math.sqrt((x2-x4)*(x2-x4)+(y2-y4)*(y2-y4));
l3=Math.sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));
if(l1+l2-l3<=0)
{
System.out.println("data error");
System.exit(0);
}
l4=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
l5=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
l6=Math.sqrt((x1-x4)*(x1-x4)+(y1-y4)*(y1-y4));
double c1=l1+l4+l5,c2=l2+l4+l6,c3=l3+l5+l6;
s1=Math.sqrt(c1/2*(c1/2-l1)*(c1/2-l4)*(c1/2-l5));
s2=Math.sqrt(c2/2*(c2/2-l2)*(c2/2-l4)*(c2/2-l6));
s3=Math.sqrt(c3/2*(c3/2-l3)*(c3/2-l5)*(c3/2-l6));
C=l1+l2+l3;
S=Math.sqrt(C/2*(C/2-l1)*(C/2-l2)*(C/2-l3));
if(s1+s2+s3-S>0.000001)
in=0;
}
}
SourceMonitor生成的報表內容:


代碼分析總結:
本題是我目前寫過最難的一道題,選項四的各種特殊情況讓我加入了大量的判斷,且因為我對類的運用還不熟練,使用了大量的引數,選線四部分的代碼可以說是沒有一點復用性,非常的糟糕,后續必須對其中的類就行進一步的細致劃分,選項五因為我實在是看不懂射線法的原理,所以偷懶了,用的面積比較法,勉強過了,
3.踩坑心得:
第二次作業第二題因為我理解錯了奇偶校驗的意思,誤以為奇偶校驗位是1就行,導致一直過不去,問了同學才改正過來;
改前

改后

第三次作業第一題只要是有一些陰間測驗點,例如0.和0.0這兩個坐標是不合格的,測驗了很久才測驗出來;
改前

改后

第三次作業第二題對線與線繼續操作時利用了斜率,但卻忘了斜率不存在的情況,導致某個測驗點一直過不去;
改前

改后

第三次作業第三題中我在寫選項四時因為判斷直線過頂點時有漏洞,導致了誤判,使得計算結果出錯,改了4,5個小時一行行代碼刪刪改改才找到問題,還有因為海倫公式在面對大資料的計算時很容易超出取值上限,導致了計算精度出錯,也認識到了一昧的取巧還是會有壞處,,還有一個小插曲就是老師的題目有問題,選項5里題目里要求點不在三角形里時輸出”outof triangle“,但測驗點里卻要求輸出“outof the triangle”,這個測驗點也花了我10多分鐘,
改前

改后

4.改進建議
對類的定義和呼叫還是不熟練,7-2和7-3中的正則運算式其實可以額外定義一個類來實作,從而避免大量的相同代碼,避免代碼冗余,也提高了這一部分的復用性,同時將分割好的字串轉變為double型別的數時也使用了大量的重復代碼,可以將這部分代碼劃分出一個類來提高復用性,
5.總結
1.這三次pta作業下來,我對Java的認知有了很大的提升,也認識到了java面向物件的好處以及重要性,在寫出演算法前,應該先將要實作的功能細劃分為多個類,將各個類的功能任務分清楚,在去在類里撰寫主要演算法,這樣既可以提升寫代碼的速度,還可以提升代碼的復用性以及自己的思維邏輯能力;
2.我對正則運算式有了較深的理解,也看到了在面對規定格式下正則運算式的實用性,
建議:希望老師上課時能講一講pta上一些難題的思路以及一些平時觸及很少的一些測驗點,這樣可以在我們遇到一個測驗點測了很久都測不出來時節省一些時間,畢竟過于隱蔽或少見的測驗點對于提升我們的編程能力并沒有什么幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510877.html
標籤:其他
