第一次博客
PTA第一次博客
一、前言
这三次作业,第一次无疑是最简单的,这次作业的目的是想让我们入门,采用第二,三,四,五章便可以解决。第二次难度较第一次略有增加,有些题目可以采用正则表达式一步到位。第三次作业难度实现了跨越式的飞跃,相较于前一次呈指数级增长,需要我们能够能更加熟悉的使用类以及正则表达式来规避一些没有必要的赘余。
二、设计与分析
题目集2的7-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
源代码展示:
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
String a = in.next();
if(a.length()<11)
{
System.out.print("null data");
return;
}
if(a.matches("^[1]*$"))
{
System.out.print("null data");
return;
}
int start = 0,i=0,num = 1,sum = 0;
boolean parity = false,validate = false;
for(start = 0;start<a.length()-10;start++)
{
if(a.charAt(start)=='0')
{
System.out.print(num+":");
num++;
if(a.charAt(start+10)=='0')
{
validate = false;
}
else
{
validate = true;
sum = 0;
for(i=start+1;i<start+9;i++)
{//奇偶位判断(奇判断)
if(a.charAt(i)=='1')
{
sum++;
}
}
if(sum%2==0)
{
if(a.charAt(start+9)=='1')
{
parity = true;
}
else
{
parity = false;
}
}
else
{
if(a.charAt(start+9)=='0')
{
parity = true;
}
else
{
parity = false;
}
}
}
if(validate == true)
{
if(parity == true)
{
for(i=start+1;i<start+9;i++)
{
System.out.print(a.charAt(i));
}
System.out.print("\n");
}
else
{
System.out.println("parity check error");
}
}
else
{
System.out.println("validate error");
}
start = start + 10;
}
}
}
}
SourceMonitor生成的报表内容:


分析总结
这道题的难度实际上并不是那么大,但是由于是初次接触java,对java的语法还没有掌握的那么好,并且这道题还涉及到计算机组成原理中的奇偶校验位,那里的知识掌握的并不是那么的好,这对本题的编程带来了极大的不便。
题目集3的7-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) {
int f = 0;
int f1 = 1;
int x = 0;
Scanner input = new Scanner(System.in);
String str = input.nextLine();
for(int i=0;i < str.length();i++)
{
if(str.charAt(i)==' ')
{
if(str.charAt(i-1)>='0'&&str.charAt(i-1)<='9')
{
if(str.charAt(i+1)>='0'&&str.charAt(i+1)<='9'||str.charAt(i+1)=='+'||str.charAt(i+1)=='-')
{
f=1;
}
}
}
}
for(int i=0;i < str.length();i++)
{
if(str.charAt(i)=='+'&&str.charAt(i+1)=='+')
{
f=0;
break;
}
else if(str.charAt(i)=='-'&&str.charAt(i+1)=='+')
{
f=0;
break;
}
else if(str.charAt(i)=='+'&&str.charAt(i+1)=='-')
{
f=0;
break;
}
else if(str.charAt(i)=='-'&&str.charAt(i+1)=='-')
{
f=0;
break;
}
}
for(int i=0;i < str.length();i++)
{
if(str.charAt(i)==' ')
{
x++;
}
if(x>=2)
{
f=0;
f1=0;
System.out.print("wrong number of points\n");
break;
}
}
for(int i=0;i < str.length();i++)
{
if(str.charAt(i)=='0'&&str.charAt(i+1)=='0')
{
f=0;
}
}
double []a = new double[100];
int []b = new int[100];
int []c = new int[100];
int index1 = 0;
int index2 = 0;
int index3 = 0;
if(f==1){
for(int i=0;i < str.length();i++)
{
if(str.charAt(i)==',')
{
b[index1]=i;
index1++;
}
}
for(int i=0;i < str.length();i++)
{
if(str.charAt(i)==' ')
{
c[index2]=i;
index2++;
}
}
for(int i=b[1];i < str.length();i++)
{
if(str.charAt(i)==' ')
{
index3 = i;
}
else
index3 = str.length();
}
a[1]=Double.parseDouble(str.substring(0,b[0]));
a[2]=Double.parseDouble(str.substring(b[0]+1,c[0]));
a[3]=Double.parseDouble(str.substring(c[0]+1,b[1]));
a[4]=Double.parseDouble(str.substring(b[1]+1,index3));
double xy = Math.sqrt((a[1]-a[3])*(a[1]-a[3])+(a[2]-a[4])*(a[2]-a[4]));
System.out.print(xy);
}
else if(f==0&&f1==1)
{
System.out.print("Wrong Format\n");
}
}
}
SourceMonitor生成的报表内容:


分析总结
本道题涉及到数学知识,并且还要考虑到非法输入以及输入格式,输入还要求可以使用正负数。由于是初学java,对java的类的思想还不能完全接受,还是用C语言的思想写代码。
题目集3的7-2
题目:
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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 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");
}
}
SourceMonitor生成的报表内容:


分析总结
本道题要考虑斜率不存在以及斜率为0的情况,掌握有关的数学知识,否则将会给编程带来困难。并且还要考虑到非法输入以及输入格式,输入还要求可以使用正负数。由于是初学java,对java的类的思想还不能完全接受,还是用C语言的思想写代码,代码的复用性不强,这将会给下一题的编码带来一定的困难。这道题由于能力的原因,并没有实现全部要求的功能。
题目集3的7-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"
输入格式:
基本格式:选项+":"+坐标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 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");
}
}
SourceMonitor生成的报表内容:


分析总结
本道题要判断输入的点是否构成它要求的图形,掌握有关的数学知识,否则将会给编程带来困难。由于是初学java,还是用C语言的思想写代码,代码的复用性不强,有关部分可以用更加简洁的方式代替,例如正则表达式。这道题由于能力的原因,并没有实现全部要求的功能。
三、踩坑心得
第二次作业第二题的奇校验由于忘记了有关知识,导致写代码时忽略了一些问题。
注意:由于写题目时未考虑到将来要写博客,所以改正前的踩坑点将会没有截图,只有改正后的截图。

第三次作业的第二题存在着格式错误,点的数量错误以及计算交点的错误,但是很遗憾,直至最后都未能改正。


第三次作业的第二题存在输入两个重复的点的问题,这就造成实际上只有一条直线和一个点比较平行的情况
改前

改后

第三次作业的第三题的选项三,四,五都存在着由于考虑的情况不全面而产生的各种错误,但是很遗憾,直至最后都未能改正。

四、改进建议
前三次作业最大的问题就是披着java的外衣,但是里面全是C语言的肉,在一个类里面将所有问题解决。使用类使程序发挥java的优势,调用方法使程序更有层次性,可以规避面向过程的编程中出现的需要很麻烦才能解决的问题,在字符串处理上更加改进,避免误差,可以采用正则表达式,来省去很大的冗余。
五、总结
1.我在这三次作业中初步学会了java的基本语法,它与C语言有着很大出入,总结一下就是长着类似的肉,但是二者的根骨不同。同时也学习了如何使用正则表达式来规避麻烦的问题。
2.在这三次的作业中,我做得并不理想,原因是我并没有完全理解类的创建和使用,对字符串的处理也不行,有部分函数还不知道,导致有些地方无从下手,在今后的学习中,要深化对类的理解,学会运用网络资源搜寻程序所需相关函数,做得对程序精益求精,争取在现场的作业里做得更好。
3.在题目拿到手时,常常不知道从何处下手,同时还存在着考虑问题不全面的情况。
浙公网安备 33010602011771号