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上一些难题的思路以及一些平时触及很少的一些测试点,这样可以在我们遇到一个测试点测了很久都测不出来时节省一些时间,毕竟过于隐蔽或少见的测试点对于提升我们的编程能力并没有什么帮助。

pta第一次博客的更多相关文章

  1. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  2. oo 第一次博客作业

    oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...

  3. [BUAA软工]第一次博客作业---阅读《构建之法》

    [BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

  4. Java第一次博客作业

    第一次博客作业 目录 三次作业题目详情 作业中的错误分析 感想与心得 题目详情 题目1:第一次作业: 类图: 题目2 类图: 题目3 类图: 题目4 题目5 题目6 类图: 题目7 类图: 题目8 第 ...

  5. C语言第一次博客作业——输入输出格式

    一.PTA实验作业 注意:本次PTA实验共有8个题目,在博客上只要贴:4个题目就可以,分别为: 题目1:7-3 温度转换 (1分) 题目2:7-4 将x的平方赋值给y (2分) 题目3:7-6 是不是 ...

  6. C语言第一次博客作业—输入输出

    一.PTA实验作业 题目1:7-3 温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1 ...

  7. 第一次博客作业 <西北师范大学| 周安伟>

     1.助教博客链接:https://home.cnblogs.com/u/zaw-315/ 2.本周点评的作业数:3份,有留言互动. 3.本周点评有困难的地方: https://www.cnblogs ...

  8. OO第一次博客总结

    虽然早在开学之前就已耳闻过OO这门课的威力,也在寒假自学了一些java的语法,但在真正面对OO这样的工程训练时才发现寒假所学的那点语法简直不值一提,也深刻的感受到在这个过程中自己的提升确实很快,毕竟d ...

  9. java的第一次博客

    一枚16年本科毕业的java程序员,至今工作两年,这是我的第一个博客. 谢谢!!!

随机推荐

  1. mybatis 09: 动态sql --- part1

    作用 可以定义代码片段 可以进行逻辑判断 可以进行循环处理(批量处理),使条件判断更为简单 使用方式 通过mybatis中与动态sql有关的标签来实现 < sql >标签 + < i ...

  2. java-循环

    1.循环:反复执行一段相同或相似的代码(逻辑相似或者相同)2.循环三要素: 1.循环变量的初始化 2.循环的条件(以循环变量为基础) 3.循环变量的改变(向着循环的结束变)循环变量:在整个循环过程中所 ...

  3. ModelBox开发体验:使用YOLOv3做口罩检测

    摘要:本案例将在ModelBox中使用YOLO v3模型,实现一个简单的口罩检测应用 本文分享自华为云社区<ModelBox开发体验Day05开发案例-使用YOLOv3做口罩检测>,作者: ...

  4. Typora的破解

    Typora是什么? Typora是一款支持实时预览的Markdown文本编辑器.支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.即时渲染使得你写Markdown就想是写Word文档 ...

  5. 02_Django-路由配置-HTTP协议的请求和响应

    02_Django-路由配置-HTTP协议的请求和响应 视频:https://www.bilibili.com/video/BV1vK4y1o7jH 博客:https://blog.csdn.net/ ...

  6. HC32L110(五) Ubuntu20.04 VSCode的Debug环境配置

    目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...

  7. 高阶 CSS 技巧在复杂动效中的应用

    最近我在 CodePen 上看到了这样一个有意思的动画: 整个动画效果是在一个标签内,借助了 SVG PATH 实现.其核心在于对渐变(Gradient)的究极利用. 完整的代码你可以看看这里 -- ...

  8. 输入法词库解析(三)紫光拼音词库.uwl

    详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...

  9. Python数据科学手册-Pandas:向量化字符串操作、时间序列

    向量化字符串操作 Series 和 Index对象 的str属性. 可以正确的处理缺失值 方法列表 正则表达式. Method Description match() Call re.match() ...

  10. 7. Ceph 高级篇 - RBD块设备回收站、快照、克隆

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485298&idx=1&sn=b83fda07 ...