pta作业总结
目录
1.前言
2.设计与分析
3.心得
4.改进建议
5.总结
1.前言
在新学期中我们初步学习了java这门新的计算机语言,相较于上学期学习的c语言,Java与其有部分的相同之处,但又有许多差异。其中大部分的程序都要通过类来完成,我也刚刚才适应使用这种新的编程语言,在一段时间的Java学习后,老师发布了三次pta作业用于我们自我检验自身学习成果,并帮助我们将自己所学知识在实践中灵活运用。
在前三次pta作业中,考查了字符串的运用,字符串的强制类型转换,提取字符串的内容并进行相应运算。第一次题目难度不大,第二次难度适中,第三次个人认为难度较大,以至于得到的成绩很不理想。题目量随难度成反比,但是每道题目都很又代表性,值得深入去思考和反复修改。特别是第三次作业,虽然只有三道题,但是每道题的难度都很大,且题目之间层层递进,每道题都建立在上道题的基础上而衍生出新的问题。对于初步学习Java的我来说很具有挑战性。
2.设计与分析
一.
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
输入样例:
在这里给出一组输入。例如:
1111011101011111111111
输出样例:
在这里给出相应的输出。例如:
1:11101011
输入样例1:
在这里给出一组输入。例如:
11110111010111111001001101111111011111111101111
输出样例1:
在这里给出相应的输出。例如:
1:11101011
2:01001101
3:validate error
输入样例2:
输入数据不足11位。例如:
111101
输出样例2:
在这里给出相应的输出。例如:
null data
输入样例3:
输入数据全1没有起始位。例如:
1111111111111111
输出样例3:
在这里给出相应的输出。例如:
null data
输入样例4:
输入数据全1没有起始位。例如:
111101110101111111101111111101
输出样例4:
在这里给出相应的输出。例如:
1:11101011
2:parity check error
输入样例5:
两组数据结束符和奇偶校验均不合格。例如:
111000000000000011100000000000000
输出样例5:
在这里给出相应的输出。例如:
1:validate error
2:validate error
输入样例6:
两组数据,数据之间无空闲位。例如:
1110000000001100111000001
输出样例6:
在这里给出相应的输出。例如:
1:00000000
2:01110000
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 num=in.nextLine();
boolean flag=false;
flag=whole(num);
boolean flag_1 = whole_1(num);
int j=1,i;
if(num.length()<11||flag||flag_1)
{
System.out.println("null data");
}
else
for(i = 0;i<num.length();)
{
char a=num.charAt(i);
if(num.length()-i<10)
break;
if(a=='0')
{
if(num.length()-i==10)
{
String temp=num.substring(i+1);
}
else
{
String temp=num.substring(i+1,i+11);
i=i+11;
String zy=temp.substring(0,9);
if(temp.substring(9).equals("1"))//结束位
{
if(bintodec(zy))//奇偶
{
System.out.println(j+":"+temp.substring(0,8));
j++;
}
else
{
System.out.print(j+":"+"parity check error");
j++;
}
}
else if(!(temp.substring(9).equals("1")))
{
if(!(bintodec(zy)))//结束+奇偶
{
System.out.print(j+":"+"validate error");
j++;
}
else
{
System.out.print(j+":"+"validate error");
j++;
}
}
}
}else
i++;
}
}
public static boolean whole(String num)
{
boolean flag=false;
for(int i = 0;i<num.length();i++)
{
if(num.charAt(i)=='1')
{
flag=true;
}
else
{
flag=false;
break;
}
}
return flag;
}
public static boolean whole_1(String num)
{
boolean flag=false;
for(int i = 0;i<num.length();i++)
{
if(num.charAt(i)!='1'&&num.charAt(i)!='0')
{
flag=true;
break;
}
}
return flag;
}
public static boolean bintodec(String num)
{
int i=0;
int result=0;
while (i<num.length())
{
result=result*2+(int)(num.charAt(i)-'0');
i++;
}
if(result%2!=0)
{
return true;
}
else
{
return false;
}
}
}
输入连个点的坐标,计算两点之间的距离
输入格式:
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
输入样例:
整数输入。例如:
0,0 1,1
输出样例:
在这里给出相应的输出。例如:
1.4142135623730951
输入样例1:
带符号double类型实数输入。例如:
+2,-2.3 0.9,-3.2
输出样例1:
在这里给出相应的输出。例如:
1.42126704035519
输入样例2:
格式非法。例如:
++2,-2.3 0.9,-3.2
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
输入样例3:
点的数量超过两个。例如:
+2,-2.3 0.9,-3.2 +2,-2.3
输出样例3:
在这里给出相应的输出。例如:
wrong number of points
源代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String arr = in.nextLine();
double s=0;
String []a = arr.split(" ");
if(a.length>2)
{
System.out.print("wrong number of points");
}
else
{
String []a1 = a[0].split(",");
String []a2 = a[1].split(",");
char[] b=a1[0].toCharArray();
char[] c=a1[1].toCharArray();
char[] d=a2[0].toCharArray();
char[] e=a2[1].toCharArray();
else
{
double x1,y1,x2,y2;
x1 = Double.parseDouble(a1[0]);
y1 = Double.parseDouble(a1[1]);
x2 = Double.parseDouble(a2[0]);
y2 = Double.parseDouble(a2[1]);
s = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
System.out.printf("%f",s);
}
}
}
}
总结:本题考查数组分段提取,并进行相关点距离的运算,我首先将用户输入的字符串进行长度判断,若长度不符合要求,则输出长度错误提醒用户,若长度无错误,截取前两个字符进行判断,若用户输入两个符合,则报错,否则截取后面的字符并用强制类型转换成两个坐标的横纵坐标。进行距离运算。
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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",
输出格式:
见题目描述。
输入样例1:
选项1,两点重合。例如:
1:-2,+5 -2,+5
输出样例:
在这里给出相应的输出。例如:
points coincide
输入样例2:
选项1,斜率无穷大的线。例如:
1:-2,3 -2,+5
输出样例:
在这里给出相应的输出。例如:
Slope does not exist
输入样例3:
选项1,斜率无穷大。例如:
1:-2,3 -2,+5
输出样例:
在这里给出相应的输出。例如:
Slope does not exist
输入样例4:
选项1,符合格式输入,带符号/不带符号数混合。例如:
1:-2.5,3 -2,+5.3
输出样例:
在这里给出相应的输出。例如:
4.6
输入样例5:
选项2,计算第一个点到另外两点连线的垂直距离。例如:
2:0,1 1,0 2,0
输出样例:
在这里给出相应的输出。例如:
1.0
输入样例6:
选项3,判断三个点是否在一条线上。例如:
3:0,1 2,2 5,3
输出样例:
在这里给出相应的输出。例如:
false
输入样例7:
选项4,判断两条线是否平行。例如:
4:0,1 0,2 2,1 3,0
输出样例:
在这里给出相应的输出。例如:
false
输入样例8:
选项5,判断两条线的交点。例如:
5:0,0 -1,-1 0,2 3,-1
输出样例:
在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:
1.0,1.0 true
输入样例9:
选项5,判断两条线的交点。但两条线平行例如:
5:0,0 -1,-1 2,3 3,4
输出样例:
在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:
is parallel lines,have no intersection point
源代码如下
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
int a=0,m=0,n=0;
double x1=0,y1=0,x2=0,y2=0,x3=0,y3=0,x4=0,y4=0,z=0,u=0,h=0,k=0,v=0,k1=0;
double z1=0,z2=0;
Scanner input=new Scanner(System.in);
String s=input.nextLine();
String s1[]=s.split(":");
String s2=s1[1];
Judge judge=new Judge();
if(s.charAt(0)=='1')
{
a=judge.get(s2,2);
if(a==1)
{
String s3[]=s2.split(" ");
String s4[]=s3[0].split(",");
String s5[]=s3[1].split(",");
x1=Double.parseDouble(s4[0]);
y1=Double.parseDouble(s4[1]);
x2=Double.parseDouble(s5[0]);
y2=Double.parseDouble(s5[1]);
if(x1==x2)
{
System.out.println("Slope does not exist");
}
}
}
else if(s.charAt(0)=='2')
{
a=judge.get(s2,3);
if(a==1)
{
String s3[]=s2.split(" ");
String s4[]=s3[0].split(",");
String s5[]=s3[1].split(",");
String s6[]=s3[2].split(",");
x1=Double.parseDouble(s4[0]);
y1=Double.parseDouble(s4[1]);
x2=Double.parseDouble(s5[0]);
y2=Double.parseDouble(s5[1]);
x3=Double.parseDouble(s6[0]);
y3=Double.parseDouble(s6[1]);
z1=Math.abs((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3);
z2=Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3));
z=z1/z2;
System.out.println(z);
}
}
else if(s.charAt(0)=='3')
{
a=judge.get(s2,3);
if(a==1)
{
String s3[]=s2.split(" ");
String s4[]=s3[0].split(",");
String s5[]=s3[1].split(",");
String s6[]=s3[2].split(",");
x1=Double.parseDouble(s4[0]);
y1=Double.parseDouble(s4[1]);
x2=Double.parseDouble(s5[0]);
y2=Double.parseDouble(s5[1]);
x3=Double.parseDouble(s6[0]);
y3=Double.parseDouble(s6[1]);
if((y1-y2)/(x1-x2)==(y2-y3)/(x2-x3)||(x1==x2&&x2==x3))
{
System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
else if(s.charAt(0)=='4')
{
a=judge.get(s2,4);
if(a==1)
{
String s3[]=s2.split(" ");
String s4[]=s3[0].split(",");
String s5[]=s3[1].split(",");
String s6[]=s3[2].split(",");
String s7[]=s3[3].split(",");
x1=Double.parseDouble(s4[0]);
y1=Double.parseDouble(s4[1]);
x2=Double.parseDouble(s5[0]);
y2=Double.parseDouble(s5[1]);
x3=Double.parseDouble(s6[0]);
y3=Double.parseDouble(s6[1]);
x4=Double.parseDouble(s7[0]);
y4=Double.parseDouble(s7[1]);
if((y1-y2)/(x1-x2)==(y3-y4)/(x3-x4))
{
System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
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",
输入样例1:
选项4,定义线的两点重合。例如:
4:1,0 1,0 0,0 2,0 4,0
输出样例:
在这里给出相应的输出。例如:
points coincide
输入样例2:
选项4,构成三角形的三个点在一条线上,无法构成三角形。例如:
4:1,0 0,2 0,0 0,0 4,0
输出样例:
在这里给出相应的输出。例如:
data error
输入样例3:
选项1,判断等腰、等边三角形。例如:
1:-2,0 2,0 0,4
输出样例:
两个判断结果。例如:
true false
输入样例4:
选项2,输出边长、面积、重心坐标。例如:
2:0,0 3,0 0,1
输出样例:
在这里给出相应的输出。例如:
7.162278 1.5 1.0,0.333333
输入样例5:
选项3,钝角、直角、锐角的判断。例如:
3:0,1 1,0 2,0
输出样例:
在这里给出相应的输出。例如:
true false false
输入样例6:
选项4,直线与三角形交点的数量等于2,输出数量值以及三角形被分割的两部分面积。例如:
4:1,0 0,2 0,0 0,2 4,0
输出样例:
在这里给出相应的输出。例如:
2 1.0 3.0
输入样例7:
选项4,直线与三角形交点的数量少于两个,只输出数量值。例如:
4:-1,0 1,2 0,1 0,-1 2,0
输出样例:
在这里给出相应的输出。例如:
1
输入样例8:
选项5,用射线法判断点是否在三角形内部。例如:
5:0.5,0.5 0,0 0,2 4,0
输出样例:
在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:
in the triangle
输入样例9:
选项5,用射线法判断点是否在三角形内部。例如:
5:0,0 -1,-1 2,3 3,4
输出样例:
在这里给出相应的输出。例如:
outof the triangle
{
System.out.print("data error");
}
else
{
if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)<(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)||(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)<(x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)||(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)<(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
{
System.out.print("true ");
}
else
{
System.out.print("false ");
}
if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)==(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)||(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)==(x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)||(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)==(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
{
System.out.print("true ");
}
else
{
System.out.print("false ");
}
if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)>(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)&&(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)>(x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)&&(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)>(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
{
System.out.print("true");
}
else
{
System.out.print("false");
}
}
}
}
else if(s.charAt(0)=='4')
{
a=judge.get(s2,5);
if(a==1)
{
String s3[]=s2.split(" ");
String s4[]=s3[0].split(",");
String s5[]=s3[1].split(",");
String s6[]=s3[2].split(",");
String s7[]=s3[3].split(",");
String s8[]=s3[4].split(",");
x1=Double.parseDouble(s4[0]);
y1=Double.parseDouble(s4[1]);
x2=Double.parseDouble(s5[0]);
y2=Double.parseDouble(s5[1]);
x3=Double.parseDouble(s6[0]);
y3=Double.parseDouble(s6[1]);
x4=Double.parseDouble(s7[0]);
y4=Double.parseDouble(s7[1]);
x5=Double.parseDouble(s8[0]);
y5=Double.parseDouble(s8[1]);
int num1=0;
if((y3-y4)/(x3-x4)==(y4-y5)/(x4-x5)||(x3==x4&&x4==x5))
{
System.out.print("data error");
}
else
{
int num=0;
double x=0,y=0;
if(x1==x2&&x3==x4&&x2==x3)
{
System.out.println("The point is on the edge of the triangle");
}
else if(x1==x2&&x3!=x4)
{
x=x1;
y=x*(y3-y4)/(x3-x4)+(y3*x4-y4*x3)/(x3-x4);
num=num+1;
}
else if(x1!=x2&&x3==x4)
{
x=x3;
y=x*(y1-y2)/(x1-x2)+(y1*x2-y2*x1)/(x1-x2);
num=num+1;
}
else if(x1!=x2&&x3!=x4)
{
if((y1-y2)/(x1-x2)==(y3-y4)/(x3-x4)&&(y1-y2)/(x1-x2)==(y2-y3)/(x2-x3))
{
System.out.println("The point is on the edge of the triangle");
}
else
{
x=-((y3*x4-y4*x3)/(x3-x4)-(y1*x2-y2*x1)/(x1-x2))/((y1-y2)/(x1-x2)-(y3-y4)/(x3-x4));
y=x*(y1-y2)/(x1-x2)+(y1*x2-y2*x1)/(x1-x2);
num=num+1;
}
}
if(num==1)
{
if(x3>x4)
{
if(x<x3&&x>x4)
{
px[num1]=x;
py[num1]=y;
num1=num1+1;
mq1=1;
}
}
else
{
if(x<x4&&x>x3)
{
px[num1]=x;
py[num1]=y;
num1=num1+1;
mq1=1;
}
}
}
num=0;
x=0;
y=0;
if(x1==x2&&x1==x4&&x4==x5)
{
System.out.println("The point is on the edge of the triangle");
}
else if(x1==x2&&x5!=x4)
{
x=x1;
y=x*(y5-y4)/(x5-x4)+(y5*x4-y4*x5)/(x5-x4);
num=num+1;
}
else if(x1!=x2&&x5==x4)
{
x=x5;
y=x*(y1-y2)/(x1-x2)+(y1*x2-y2*x1)/(x1-x2);
num=num+1;
}
else if(x1!=x2&&x5!=x4)
{
if((y1-y2)/(x1-x2)==(y5-y4)/(x5-x4)&&(y1-y2)/(x1-x2)==(y2-y5)/(x2-x5))
{
System.out.println("The point is on the edge of the triangle");
}
else
{
x=-((y5*x4-y4*x5)/(x5-x4)-(y1*x2-y2*x1)/(x1-x2))/((y1-y2)/(x1-x2)-(y5-y4)/(x5-x4));
y=x*(y1-y2)/(x1-x2)+(y1*x2-y2*x1)/(x1-x2);
num=num+1;
}
}
if(num==1)
{
if(x5>x4)
{
if(x<x5&&x>x4)
{
px[num1]=x;
py[num1]=y;
num1=num1+1;
mq2=1;
}

浙公网安备 33010602011771号