wang BLOG-1

 

 (1)

  PTA大作业1包含的知识比较多,有较多的判断和很多格式,int float double类型的定义和输入和if判断符合要求的输入题量较多,难度一般,题目代码较少。

  PTA大作业2包含的知识比较全面,涉及大量的String类方法采用了较多的if和for循环设计。例如equals、substring、charAt、toCharArray、ASCII转换等。主要是对String类的使用和判断输入是否合法。题量较少,难度一般。

  PTA大作业3包含的知识比较全面,有大量的输入合法要求需要设计很多要求来保证输入的有效性,需要让大部分的符号非法,从而实现数值字符串的转换为double的数据数值有效。2、3题可以在一题的基础上完成合法输入,通过立标致的方法来确定数据合不合法。多条件来完成不同的功能。题量小,但难度较大,代码量比较大,容易出现错误。

  总而言之,经过PTA三次作业对于知识的使用更加熟练了,对于完成Java.程序更加得心应手,对于Java程序的设计更加有效了。

  (2)设计与分析

PTA2 7-2

串口字符解析

import java.util.Scanner;
public class Main{
public static void main (String[] args)
{
Scanner input = new Scanner(System.in);//p是奇偶;q是结束符
String result =input.nextLine();
int a=result.indexOf('0');
int b=0,c=1,p=0,q=0;
if(result.length()<11||result.indexOf("0")==-1)
System.out.println("null data");
else
{
while(a!=-1)
{
b=0;
p=1;
q=1;
for(int i=a;i<a+9;i++)
{
if(result.charAt(i)=='1')
b++;
}
if((result.charAt(a+9)=='0'&&b%2==0)||(result.charAt(a+9)=='1'&&b%2!=0))
p=0;
if(result.charAt(a+10)=='0')
q=0;
if((p==0&&q==0)||(p==1&&q==0))
System.out.println(c+":"+"validate error");
else if(p==0&&q==1)
System.out.println(c+":"+"parity check error");
else if(p==1&&q==1)
System.out.println(c+":"+result.substring(a+1,a+9));
c++;
a=result.indexOf('0',a+11);
}
}
}
}

这是一个串口输入判断合法输入的问题要对他输入内容判断是否符和要求

主要采用这样的判断

if((result.charAt(a+9)=='0'&&b%2==0)||(result.charAt(a+9)=='1'&&b%2!=0))
p=0;
if(result.charAt(a+10)=='0')
q=0;

立p、q标志来判断,主要的两个要求以这个为基础使用for循环对输入多次判断满不满足要求,同时也通过for循环完成对输入内容的移动

如 :for a=result.indexOf('0',a+11);

采用分段,多次判断输入内容并移动同时也对分段进行相应的判断。主要为一个合法字串有11个字符以这个为一个段判断特殊位置的字符是否满足要求。

完成输出结果

 

 

PTA3 7-1

点线形系列1-计算两点之间的距离

输入两个坐标可以带各种符号输入后面通过判断条件是否进行功能合法输入符号有“+ - .0123456789”对输入进行分段每个段都要符和数字要求除了+3这类数据也合法通过提取字符串的子段完成对这个符号的剔除有很多的情况不符合数字要求 +或++或0.3+3或00.0或-等;设计很多判断来剔除这种例子的存在。

String []a=result.split(",| ");

通过这串来完成对字符串进行分段。

通过标志 p q 对不符合进行p=0q=0进行要求剔除

 

 

 这些代码来对不合理的输入进行剔除,对上面的代码进行for循环对多个分段进行判断只要有一个分段错误就输入不合法。

public static double Position(String name){
String c=new String();
int g=name.length();
c=name.substring(1,g);
double o=0;
if(name.charAt(0)=='+')
{
o=Double.parseDouble(c);
}
if(name.charAt(0)=='-')
{
o=Double.parseDouble(c);
o=0-o;
}
if(name.charAt(0)>=48&&name.charAt(0)<=57)
{
o=Double.parseDouble(name);
}
return o;。

这是本题的核心代码构造一个方法来对进行多次使用完成对字符串转换成一个double类型的数据。

for(int j=0;j<a[i].length();j++)
{
if(a[i].charAt(j)=='+'||a[i].charAt(j)=='-')
number++;
if(a[i].charAt(j)=='.')
v++;
if(a[i].charAt(j)>=43&&a[i].charAt(j)<=57&&a[i].charAt(j)!='/'&&a[i].charAt(j)!=',')
m++;
}

对分段的字符子段进行统计以便实现后续判断;

部分运行结果如下:

 

 

 PTA3 7-2

点线形系列2-线的计算

1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。分析:满足7-1的要求再调用7-1的一个方法在添加if判断完成要求
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。分析:也是基于7-1再设计一串实现这个功能的代码

3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。分析:添加一个坐标再判断第一个坐标到第二个坐标和第三个坐标成的直线的距离是否为零。

4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.分析:求两个点构成的直线的斜率是否相等。
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。分析:求交点两直线的斜率不相同,判断交点的x y在不在一条直线的两个端点的x y的范围。

首先,对输入字符串的进行截取将第一个字符取出来方便进行选项。

char a1=result.charAt(0);

后面,截取后面的字符串到一个新的字符串

b1=result.length();
String result1=result.substring(2,b1);

再对新的字符串进行分段

String []a=result1.split(",| ");

再添加一个标志g

关键的判断代码

if(a1=='1')
{
if(p==1)
{
x1=Position(a[0]);
y1=Position(a[1]);
x2=Position(a[2]);
y2=Position(a[3]);
if(x1==x2&&y1==y2)
u=0;
}
if(p==1&&q1==0&&u==1)
System.out.print("wrong number of points");
else if(p==0&&u==1)
System.out.print("Wrong Format");
else if(q1==1&&p==1&&u==1)
{
if(x2-x1==0)
{System.out.print("Slope does not exist");}
System.out.print((y2-y1)/(x2-x1));
}
else if(u==0)
System.out.print("points coincide");
}
if(a1=='2')
{
if(p==1)
{
x1=Position(a[0]);
y1=Position(a[1]);
x2=Position(a[2]);
y2=Position(a[3]);
x3=Position(a[4]);
y3=Position(a[5]);
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3))
u=0;
}
if(p==1&&q2==0&&u==1)
System.out.print("wrong number of points");
else if(p==0&&u==1)
System.out.print("Wrong Format");
else if(q2==1&&p==1&&u==1)
{
if(x3-x2==0)
{System.out.print(Math.abs(x1-x2));}
System.out.print(Math.abs((y3-y2)/(x3-x2)*x1-y1+y2-(y3-y2)/(x3-x2)*x2)/Math.sqrt(1+Math.pow((y3-y2)/(x3-x2),2)));
}
else if(u==0)
System.out.print("points coincide");
}
if(a1=='3')
{
if(p==1)
{
x1=Position(a[0]);
y1=Position(a[1]);
x2=Position(a[2]);
y2=Position(a[3]);
x3=Position(a[4]);
y3=Position(a[5]);
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3))
u=0;
}
if(p==1&&q2==0&&u==1)
System.out.print("wrong number of points");
else if(p==0&&u==1)
System.out.print("Wrong Format");
else if(q2==1&&p==1&&u==1)
{
if(x3-x2==0)
{
if(x1==x2)
System.out.print("true");
else
System.out.print("false");
}
else if(x3-x2!=0)
{
if(Math.abs((y3-y2)/(x3-x2)*x1-y1+y2-(y3-y2)/(x3-x2)*x2)/Math.sqrt(1+Math.pow((y3-y2)/(x3-x2),2))==0)
System.out.print("true");
else
System.out.print("false");
}

}
else if(u==0)
System.out.print("points coincide");
}
if(a1=='4')
{
if(p==1)
{
x1=Position(a[0]);
y1=Position(a[1]);
x2=Position(a[2]);
y2=Position(a[3]);
x3=Position(a[4]);
y3=Position(a[5]);
x4=Position(a[6]);
y4=Position(a[7]);
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)||(x1==x4&&y1==y4)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4))
u=0;
}
if(p==1&&q3==0&&u==1)
System.out.print("wrong number of points");
else if(p==0&&u==1)
System.out.print("Wrong Format");
else if(q3==1&&p==1&&u==1)
{
if(x4-x3==0)
{
if(x2-x1==0&&Math.abs((y1-y2)/(x1-x2)*x3-y3+y2-(y1-y2)/(x1-x2)*x2)/Math.sqrt(1+Math.pow((y1-y2)/(x1-x2),2))!=0)
System.out.print("true");
else
System.out.print("false");
}
else if(x4-x3!=0)
{
if(x2-x1!=0&&Math.abs((y1-y2)/(x1-x2)*x3-y3+y2-(y1-y2)/(x1-x2)*x2)/Math.sqrt(1+Math.pow((y1-y2)/(x1-x2),2))!=0&&(y1-y2)/(x1-x2)==(y3-y4)/(x3-x4))
System.out.print("true");
else
System.out.print("false");
}

}
else if(u==0)
System.out.print("points coincide");
}
if(a1=='5')
{
if(p==1)
{
x1=Position(a[0]);
y1=Position(a[1]);
x2=Position(a[2]);
y2=Position(a[3]);
x3=Position(a[4]);
y3=Position(a[5]);
x4=Position(a[6]);
y4=Position(a[7]);
m1=(y2-y1)/(x2-x1);
m2=(y4-y3)/(x4-x3);
n1=y1-m1*x1;
n2=y3-m2*x3;
max=x1;
min=x2;
if(x1<x2)
{
max=x2;
min=x1;
}
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)||(x1==x4&&y1==y4)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4))
u=0;
}
if(p==1&&q3==0&&u==1)
System.out.print("wrong number of points");
else if(p==0&&u==1)
System.out.print("Wrong Format");
else if(q3==1&&p==1&&u==1)
{
if(x4-x3==0&&Math.abs((y1-y2)/(x1-x2)*x3-y3+y2-(y1-y2)/(x1-x2)*x2)/Math.sqrt(1+Math.pow((y1-y2)/(x1-x2),2))!=0)
{
if(x2-x1==0)
System.out.print("is parallel lines,have no intersection point");
else
{
x5=(n2-n1)/(m1-m2);
y5=m1*x5+n1;
if(x5>min&&x5<max)
System.out.print(x5+","+y5+" "+"true");
else
System.out.print(x5+","+y5+" "+"false");
}
}
else if(x4-x3!=0)
{
if(x2-x1!=0&&(y1-y2)/(x1-x2)==(y3-y4)/(x3-x4)&&Math.abs((y1-y2)/(x1-x2)*x3-y3+y2-(y1-y2)/(x1-x2)*x2)/Math.sqrt(1+Math.pow((y1-y2)/(x1-x2),2))!=0)
System.out.print("is parallel lines,have no intersection point");
else
{
x5=(n2-n1)/(m1-m2);
y5=m1*x5+n1;
if(x5>min&&x5<max)
System.out.print(x5+","+y5+" "+"true");
else
System.out.print(x5+","+y5+" "+"false");
}
}

}
else if(u==0)
System.out.print("points coincide");
}

 

部分运行结果

 

 

 PTA3 7-3

点线形系列3-三角形的计算

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"

分析:1.调用Position方法完成点的数值判断求三条边的距离调用if判断是否是等腰三角形、等边三角形

   2.设计求取面积周长的代码和求的重心坐标

   3.判断是否三角形再判断三角形类型

      4.求直线与直线的交点判断是否在两个点连成的线段。

首先,对输入字符串的进行截取将第一个字符取出来方便进行选项。

char a1=result.charAt(0);

后面,截取后面的字符串到一个新的字符串

b1=result.length();
String result1=result.substring(2,b1);

再对新的字符串进行分段

String []a=result1.split(",| ");

再添加一个标志g

            d1=Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));
            d2=Math.sqrt(Math.pow(x3-x1,2)+Math.pow(y3-y1,2));
            d3=Math.sqrt(Math.pow(x3-x2,2)+Math.pow(y3-y2,2));

求边长的代码

d1+d2>d3&&d1+d3>d2&&d2+d3>d1&&((d1!=d2&&d2==d3)||(d1!=d3&&d2==d3)||(d2!=d3&&d1==d3))

判断是否为三角形

if((d1*d1>d2*d2+d3*d3)||(d2*d2>d1*d1+d3*d3)||(d3*d3>d1*d1+d2*d2))//钝角判断
                System.out.print("true ");
            else
                System.out.print("false ");
            if((d1*d1==d2*d2+d3*d3)||(d2*d2==d1*d1+d3*d3)||(d3*d3==d1*d1+d2*d2))//直角判断
                System.out.print("true ");
            else
                System.out.print("false ");
            if((d1*d1<d2*d2+d3*d3)&&(d2*d2<d1*d1+d3*d3)&&(d3*d3<d1*d1+d2*d2))//锐角判断
                System.out.print("true");
            else
                System.out.print("false");

 

部分运行结果

 

 (3)采坑心得

00输入判断有点问题出现输出不了的情况

判断直角三角形三边的平方相等要转换成一中两个减一个小于一个范围更符合数据判断

 

Math.abs(a*a+b*b-c*c)<0.00001||Math.abs(a*a+c*c-b*b)<0.00001||Math.abs(b*b+c*c-a*a)<0.00001

方法使用格式错误字符串比较用equals而不是==。

(4)改进建议

对一些要多次使用的手段构造成方法是代码更加简洁,多采用标志来判断

(5)总结

三次PTA作业下来感觉题目难度在上升代码总数大大增加对String类更加熟悉了Strng类需要继续学习字符串转数字等知识需要更深刻的学习。

 

posted @ 2022-04-09 23:43  SpiritKing  阅读(67)  评论(0)    收藏  举报