PTA前三次作业总结Bolg
hello 大家好,我是一个刚开始学习Java的小同志,第一次来这里写一个作业总结博客,如果内容有什么问题欢迎指出,若是博客排版有好的建议也请大家给予建议。下面开始正文。
一、前言
首先我来大致介绍下三次大作业的知识点、题量和难度
1、题量
这三次大作业题目最多的是第一次大作业是第二第三次题目数的3倍,分别是9、3、3。
2、难度
如果只看题量一直等到作业快截止的的时间做那你就错了,这会让你在第三次大作业提交前一天晚上通宵赶,也不一定老师设置的阴间测试点。最后两次作业一定要留够足够的时间,这三次作业的难度可以说是指数级上升。
3、知识点
(1)作业1
这次作业主要是练习一下Java中的输入、输出以及字符串函数的用法,提前熟悉字符串为后面作业打基础。
(2)作业2
这次的作业难度比第一次稍微提升一点,因为这次作业中考虑的情况要更多一点,这次作业要掌握字符串String类的知识点及其相关的处理函数等,还有就是要掌握正则表达式,当然其他方法也可以做,但小编建议大家在这次大作业中可以用正则表达式练练手,对后面作业完成有好处。
(3)作业3
这次作业难度剧增,主要是测试点比较难过。要掌握的知识点也更多,字符串转化为double等类型、一些数学函数的使用、数学中三角形的一些知识点、字符串的处理、匹配以及熟练掌握正则表达式使用。做重要的是作业三中我们一定要学会使用类,要开始面向对象,注重代码的复用性,提高代码可读性,要不然后面作业将会很难受。
二、程序设计与分析
第一次作业比较简单就不进行赘述,我这里将会对题目集二的7-2,题目集三的三个题进行分析。
第二次作业题目集二
7-2串口字符解析
题目
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
代码展示
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String in = input.nextLine();
int len = in.length();
char a = '0';
//若数据不足11位或者输入数据全1没有起始位
if(len < 11 || in.indexOf(a) == -1) {
System.out.println("null data");
}
else {
int i = in.indexOf(a);//i为字符串第一次出现‘0’的位置
int flag = 0;
while(i + 10 < in.length()) {
int temp = 0;
flag++;
//记录一段有效数据中的‘1’的位数
for (int j = 1; j <= 8; j++) {
if(in.charAt(i + j) == '1')
temp++;
}
//符合条件的
if(temp % 2 == 0 && in.charAt(i + 9) == '1' && in.charAt(i + 10) == '1') {
//flag++;
System.out.println(flag + ":" + in.substring(i + 1,i + 9));
}
else if(temp % 2 == 1 && in.charAt(i + 9) == '0' && in.charAt(i + 10) == '1') {
//flag++;
System.out.println(flag + ":" + in.substring(i + 1,i + 9));
}
//结束符不为‘1’
else if(in.charAt(i + 10) != '1') {
System.out.println(flag + ":" + "validate error");
}
//奇偶校验位不符合条件
else if((temp % 2 == 1 && in.charAt(i + 9) == '1' && in.charAt(i + 10) == '1') || (temp % 2 == 0 && in.charAt(i + 9) == '0' && in.charAt(i + 10) == '1')) {
System.out.println(flag + ":" + "parity check error");
}
else {
System.out.println(flag + ":" + "validate error");
}
i = in.indexOf(a ,i + 11);
if(i == -1)//在i+10位置后没有出现‘0’字符
break;
}
}
}
}
SourceMonitor的生成报表

解释与心得
本题可以通过一般逻辑思维,根据题意即可解得,判断各种条件。由分析图可以看出我这题的代码复杂度和深度都比较高,并且只有一个类,不是很好。
第三次大作业
7-1 点线形系列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
代码展示
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String in = input.nextLine();
Judge judge = new Judge();
double[] point = judge.point(in);
double distance = Math.sqrt(Math.pow((point[2] - point[0]),2) + Math.pow((point[3] - point[1]),2));
System.out.println(distance);
}
}
class Judge {
public double[] point(String s) {
double[] pt = new double[10];
String regex = "[+-]?(0|(0\\.[0-9]+)|([1-9][0-9]*(\\.[0-9]+)?))$";
String[] strings = s.split(" ");
for (int i = 0; i < strings.length; i++) {
String[] s1 = strings[i].split(",");
if(s1[0].matches(regex) && s1[1].matches(regex)) {
pt[i * 2 ] = Double.parseDouble(s1[0]);
pt[i * 2 + 1] = Double.parseDouble(s1[1]);
}
else {
System.out.println("Wrong Format");
System.exit(0);
}
}
if(strings.length != 2) {
System.out.println("wrong number of points");
System.exit(0);
}
return pt;
}
}
SourceMonitor的生成报表

解释与心得
本题主要是接收两点坐标,然后求的两点之间距离。主要用到正则表达式、以及将字符串转换为其他类型数据。重点在于判断点的格式问题。本题我用了两个类,一个判断类,判断输入的格式,还有一个测试类对题目要求进行计算。通过上图分析本题代码的复杂度和深度还算在正常范围内。但是我的类设计不是很好,应该将计算两点距离设计成一个方法放在独立的点类中,
7-2点线形系列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.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Line line = new Line();
Scanner input = new Scanner(System.in);
String in = input.nextLine();
Judge division = new Judge();
division.judge(in);//分割字符串,分为点
if(!division.number()) {
System.out.println("wrong number of points");
return;
}
if (!division.coincidence(division.pt))//判断点是否重合
return;
if (division.getIndex() == 1) {
line.setMN(division.pt.get(0), division.pt.get(1));
if (line.slope() == 0) {
System.out.println("Slope does not exist");
} else {
System.out.println(line.slope());
}
} else if (division.getIndex() == 2) {
//Line line1 = new Line();
line.setMN(division.pt.get(1), division.pt.get(2));
//line.slope();//求直线斜率
line.equation();//求直线方程
if ((division.pt.get(0).getX() == division.pt.get(1).getX() && division.pt.get(0).getY() == division.pt.get(1).getY()) || (division.pt.get(0).getX() == division.pt.get(2).getX() && division.pt.get(0).getY() == division.pt.get(2).getY())) {
System.out.println("points coincide");
}
else {
double dis = line.p_to_l(division.pt.get(0), line);
System.out.println(dis);
}
}
else if (division.getIndex() == 3) {
if (line.threeline(division.pt.get(0), division.pt.get(1), division.pt.get(2))) {
System.out.println("true");
} else {
System.out.println("false");
}
}
else if(division.getIndex() == 4) {
Line line1 = new Line();line1.setMN(division.pt.get(0),division.pt.get(1));
Line line2 = new Line();line2.setMN(division.pt.get(2),division.pt.get(3));
if(line1.fourpoint(line2)) {
System.out.println("true");
}
else {
System.out.println("false");
}
}
else if(division.getIndex() == 5) {
Line line1 = new Line();
line1.setMN(division.pt.get(0), division.pt.get(1));
line1.equation();
Line line2 = new Line();
line2.setMN(division.pt.get(2), division.pt.get(3));
line2.equation();
Point inst = line1.intersection(line2);//交点坐标
if(line1.fourpoint(line2)) {
System.out.println("is parallel lines,have no intersection point");
}
else {
if(line1.pointupline(inst) || line2.pointupline(inst)) {
System.out.println(inst.getX() + "," + inst.getY() + " " + "true");
}
else {
System.out.println(inst.getX() + "," + inst.getY() + " " + "false");
}
}
}
}
}
class Judge {
ArrayList<Point> pt = new ArrayList<>();
private int index;
public int getIndex() {
return index;
}
public void judge(String s) {
int flag =0;
String regex = "[1-5]:([+-]?(0|(0\\.[0-9]+)|([1-9][0-9]*(\\.[0-9]+)?)),[+-]?(0|(0\\.[0-9]+)|([1-9][0-9]*(\\.[0-9]+)?))\\s?)+$";
if(s.matches(regex)) {
String[] string01 = s.split(":");
index = Integer.parseInt(string01[0]);
String[] strings = string01[1].split(" ");
for (int i = 0; i < strings.length; i++) {
Point pot = new Point();
String[] s1 = strings[i].split(",");
pot.setX(Double.parseDouble(s1[0]));
pot.setY(Double.parseDouble(s1[1]));
pt.add(pot);
}
}
else {
System.out.println("Wrong Format");
System.exit(0);
}
}
public boolean number(){
if((pt.size() == 2 && this.index == 1) || (pt.size() == 3 && (this.index == 2 || this.index == 3)) || (pt.size() == 4 && (this.index == 4 || this.index == 5))) {
return true;
}
else
return false;
}
//判断点是否重合
public boolean coincidence(ArrayList<Point> a) {
if(a.size() % 2 == 0) {
for (int i = 0; i < a.size(); i+=2) {
for (int j = i+1; j < a.size(); j++) {
//System.out.println(a.get(i).getX() + "," + a.get(j).getX() + "," + a.get(i).getY() + "," + a.get(j).getY());
if(a.get(i).getX() == a.get(j).getX() && a.get(i).getY() == a.get(j).getY()) {
System.out.println("points coincide");
return false;
}
}
}
}
else {
for (int i = 0; i < a.size(); i++) {
for (int j = i+1; j < a.size(); j++) {
//System.out.println(a.get(i).getX() + "," + a.get(j).getX() + "," + a.get(i).getY() + "," + a.get(j).getY());
if(a.get(i).getX() == a.get(j).getX() && a.get(i).getY() == a.get(j).getY()) {
System.out.println("points coincide");
return false;
}
}
}
}
return true;
}
}
class Point {
private double x;
private double y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
/*传入一个点
计算两点间的距离
返回两点间距离
*/
public double distance(Point a) {
double dis = 0;
dis = Math.sqrt(Math.pow((a.x - this.x),2) + Math.pow((a.y - this.y),2));
return dis;
}
}
class Line {
Point m,n;
private double b;//y=kx+b
private double k;
private double A;
private double B;
private double C;
public Point getM() {
return m;
}
public void setMN(Point m,Point n) {
this.m = m;
this.n = n;
}
public Point getN() {
return n;
}
public void setM(Point m) {
this.m = m;
}
public double getA() {
return A;
}
public void setA(double a) {
A = a;
}
public double getC() {
return C;
}
public void setC(double c) {
C = c;
}
public double getK() {
return k;
}
public void setK(double k) {
this.k = k;
}
public double getB() {
return B;
}
//直线的斜率
double slope() {
double se;
if(m.getX() == n.getX())
return 0;
se = (m.getY()-n.getY())/(m.getX()-n.getX());
k = se;
return se;
}
public void equation() {
double b;
b = m.getY() - slope()*m.getX();
A = m.getY() - n.getY();
B = n.getX() - m.getX();
C = n.getX() * m.getY() - m.getX() * n.getY();
}
//点到直线的距离
public double p_to_l(Point a,Line l) {
if(l.slope() == 0) {
return Math.abs(l.getM().getX()-a.getX());
}
else {
double b = l.getM().getY() - slope()*l.getM().getX();;
return Math.abs(l.getK()*a.getX()-a.getY()+b)/(Math.sqrt(1+l.getK()*l.getK()));
}
}
//判断三点一线
boolean threeline(Point a, Point b, Point c) {
Line line1 = new Line();
Line line2 = new Line();
line1.setMN(a,b);
line2.setMN(b,c);
if(line2.slope() == line1.slope())
return true;
else
return false;
}
boolean fourpoint(Line a) {
if(a.slope() == this.slope())
return true;
else
return false;
}
//求两直线交点坐标
public Point intersection(Line a) {
Point point = new Point();
double det = this.getA() * a.getB() - a.getA() * this.getB();
if(det == 0)
return point;
point.setX(Math.round(( a.getB() * this.getC() - this.getB() * a.getC() )/det));
point.setY(Math.round(( this.getA() * a.getC() - a.getA() * this.getC() )/det));
return point;
}
public boolean pointupline(Point a) {
if(a.getX() > Math.min(m.getX(),n.getX()) && a.getX() < Math.max(m.getX(),n.getX()) )
return true;
else
return false;
}
}
SourceMonitor的生成报表内容以及PowerDesigner的相应类图


解释与心得
本题通过前几个题的训练总结,设置了多个类,提高了代码的复用性,使得整个代码的平均复杂度、深度都更加低。本题首先接受用户输入通过一个判断类进行输入的判断,然后将输入的坐标存储到点类的字符串数组。在设置一个线类,里面主要进行有关线计算。体会是每次拿到题应该设计好类,
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"
输入格式:
基本格式:选项+":"+坐标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.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Line line1 = new Line();
Line line2 = new Line();
Line line3 = new Line();
triangle three= new triangle();
Scanner input = new Scanner(System.in);
String in = input.nextLine();
Judge division = new Judge();
division.judge(in);//分割字符串,分为点
if(!division.number()) {
System.out.println("wrong number of points");
return;
}
if (division.getIndex() == 1) {
line1.setMN(division.pt.get(0),division.pt.get(1));
line2.setMN(division.pt.get(1),division.pt.get(2));
line3.setMN(division.pt.get(2),division.pt.get(0));
three.setL1(line1);three.setL2(line2);three.setL3(line3);
line1.equation();line2.equation();line3.equation();
if(!three.istriangle()) {
System.out.println("data error");
return;
}
if(three.istwoline()) {
System.out.print("true" + " ");
}
else
System.out.print("false" + " ");
if(three.threeline())
System.out.println("true");
else
System.out.println("false");
}
else if (division.getIndex() == 2) {
line1.setMN(division.pt.get(0),division.pt.get(1));
line2.setMN(division.pt.get(1),division.pt.get(2));
line3.setMN(division.pt.get(2),division.pt.get(0));
three.setL1(line1);three.setL2(line2);three.setL3(line3);
line1.equation();line2.equation();line3.equation();
if(!three.istriangle()) {
System.out.println("data error");
return;
}
Point point = three.focus();
double area = three.area();
double pri = three.Perimeter();
System.out.println(sswr(pri) + " " + sswr(area) + " " + sswr(point.getX()) + "," + sswr(point.getY()));
}
else if (division.getIndex() == 3) {
line1.setMN(division.pt.get(0),division.pt.get(1));
line2.setMN(division.pt.get(1),division.pt.get(2));
line3.setMN(division.pt.get(2),division.pt.get(0));
three.setL1(line1);three.setL2(line2);three.setL3(line3);
line1.equation();line2.equation();line3.equation();
if(!three.istriangle()) {
System.out.println("data error");
return;
}
double a = three.getcos(division.pt.get(0),division.pt.get(1),division.pt.get(2));
double b = three.getcos(division.pt.get(1),division.pt.get(2),division.pt.get(0));
double c = three.getcos(division.pt.get(2),division.pt.get(0),division.pt.get(1));
a = Math.toDegrees(Math.acos(a));b = Math.toDegrees(Math.acos(b));c = Math.toDegrees(Math.acos(c));
// if(a - 90 > 0.01 || b - 90 > 0.01 || c- 90 > 0.01)
// System.out.print("true");
// else
// System.out.print("false");
if(Math.abs(a - 90) < 0.01 || Math.abs(b - 90) < 0.01 || Math.abs(c - 90) < 0.01)
System.out.print("false" + " " + "true" + "false");
else if(90 - a > 0.01 && 90 - b > 0.01 && 90 - c > 0.01)
System.out.println("false" + " " + "false" + " " + "true");
else
System.out.println("true" + " " + "false" + " " + "false");
}
else if(division.getIndex() == 4) {
if(division.pt.get(0).getX() == division.pt.get(1).getX() && division.pt.get(0).getY() == division.pt.get(1).getY()) {
System.out.println("points coincide");
return;
}
Line line = new Line();
line.setMN(division.pt.get(0),division.pt.get(1));
line1.setMN(division.pt.get(2),division.pt.get(3));
line2.setMN(division.pt.get(3),division.pt.get(4));
line3.setMN(division.pt.get(4),division.pt.get(2));
three.setL1(line1);three.setL2(line2);three.setL3(line3);
line1.equation();line2.equation();line3.equation();line.equation();
if(!three.istriangle()) {
System.out.println("data error");
return;
}
three.OneTriangle(line);
// System.out.println("1");
}
else if(division.getIndex() == 5) {
line1.setMN(division.pt.get(1),division.pt.get(2));
line2.setMN(division.pt.get(2),division.pt.get(3));
line3.setMN(division.pt.get(3),division.pt.get(1));
three.setL1(line1);three.setL2(line2);three.setL3(line3);
line1.equation();line2.equation();line3.equation();
if(!three.istriangle()) {
System.out.println("data error");
return;
}
double s1 = three.area2(division.pt.get(0),division.pt.get(1),division.pt.get(2));
double s2 = three.area2(division.pt.get(0),division.pt.get(3),division.pt.get(2));
double s3 = three.area2(division.pt.get(0),division.pt.get(1),division.pt.get(3));
double s = three.area();
if((s1 + s2 + s3) - s > 0.01) {
System.out.println("outof the triangle");
return;
}
for (int i = 1; i < 4; i++) {
if(division.pt.get(i).CheckPoint(division.pt.get(0))) {
System.out.println("on the triangle");
return;
}
}
if(line1.pointupline2(division.pt.get(0)) || line2.pointupline2(division.pt.get(0)) || line3.pointupline2(division.pt.get(0))) {
System.out.println("on the triangle");
return;
}
System.out.println("in the triangle");
}
}
public static double sswr(double s) {
String str=String.valueOf(s);
String substring = str.substring(str.indexOf(".") + 1);
int str_len;
if(substring.length()>6)
{
str_len=6;
}else {
str_len=substring.length();
}
String formats="%."+str_len+"f";
String out=String.format(formats,s);
double res=Double.parseDouble(out);
return res;
}
}
class Judge {
ArrayList<Point> pt = new ArrayList<>();
private int index;
public int getIndex() {
return index;
}
public void judge(String s) {
int flag =0;
String regex = "[1-5]:([+-]?(0|(0\\.[0-9]+)|([1-9][0-9]*(\\.[0-9]+)?)),[+-]?(0|(0\\.[0-9]+)|([1-9][0-9]*(\\.[0-9]+)?))\\s?)+$";
if(s.matches(regex)) {
String[] string01 = s.split(":");
index = Integer.parseInt(string01[0]);
String[] strings = string01[1].split(" ");
for (int i = 0; i < strings.length; i++) {
Point pot = new Point();
String[] s1 = strings[i].split(",");
pot.setX(Double.parseDouble(s1[0]));
pot.setY(Double.parseDouble(s1[1]));
pt.add(pot);
}
}
else {
System.out.println("Wrong Format");
System.exit(0);
}
}
public boolean number(){
if((pt.size() == 3 && (this.index == 2 || this.index == 3 || this.index == 1)) || (pt.size() == 5 && this.index == 4 ) || (pt.size() == 4 && this.index == 5)) {
return true;
}
else
return false;
}
//判断点是否重合
public boolean coincidence(ArrayList<Point> a) {
if(a.size() % 2 == 0) {
for (int i = 0; i < a.size(); i+=2) {
for (int j = i+1; j < a.size(); j++) {
//System.out.println(a.get(i).getX() + "," + a.get(j).getX() + "," + a.get(i).getY() + "," + a.get(j).getY());
if(a.get(i).getX() == a.get(j).getX() && a.get(i).getY() == a.get(j).getY()) {
System.out.println("points coincide");
return false;
}
}
}
}
else {
for (int i = 0; i < a.size(); i++) {
for (int j = i+1; j < a.size(); j++) {
//System.out.println(a.get(i).getX() + "," + a.get(j).getX() + "," + a.get(i).getY() + "," + a.get(j).getY());
if(a.get(i).getX() == a.get(j).getX() && a.get(i).getY() == a.get(j).getY()) {
System.out.println("points coincide");
return false;
}
}
}
}
return true;
}
}
class Point {
private double x;
private double y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
/*传入一个点
计算两点间的距离
返回两点间距离
*/
public double distance(Point a) {
double dis;
dis = Math.sqrt(Math.pow((a.x - this.x),2) + Math.pow((a.y - this.y),2));
return dis;
}
public boolean CheckPoint(Point p){
if( Math.abs(this.getX() - p.getX() )< 0.01 && Math.abs(this.getY() - p.getY() )< 0.01){
return true;
}
else
return false;
}
}
class Line {
Point m,n;
private double b;//y=kx+b
private double k;
private double A;
private double B;
private double C;
public Point getM() {
return m;
}
public void setMN(Point m,Point n) {
this.m = m;
this.n = n;
}
public Point getN() {
return n;
}
public void setM(Point m) {
this.m = m;
}
public double getA() {
return A;
}
public void setA(double a) {
A = a;
}
public double getC() {
return C;
}
public void setC(double c) {
C = c;
}
public double getK() {
return k;
}
public void setK(double k) {
this.k = k;
}
public double getB() {
return B;
}
//直线的斜率
double slope() {
double se;
if(m.getX() == n.getX())
return 0;
se = (m.getY()-n.getY())/(m.getX()-n.getX());
k = se;
return se;
}
public void equation() {
double b;
b = m.getY() - slope()*m.getX();
A = n.getY() - m.getY();
B = m.getX() - n.getX();
C = n.getX() * m.getY() - m.getX() * n.getY();
}
//点到直线的距离
double p_to_l(Point a,Line l) {
//double dis = Math.abs(l.getA()*a.getX() + l.getB()*a.getY() + l.getC())/Math.sqrt(l.A * l.A + l.B* l.B);
//return dis;
if(l.slope() == 0) {
return Math.abs(l.getM().getX()-a.getX());
}
else {
double b = l.getM().getY() - slope()*l.getM().getX();;
return Math.abs(l.getK()*a.getX()-a.getY()+b)/(Math.sqrt(1+l.getK()*l.getK()));
}
}
//判断三点一线
boolean threeline(Point a, Point b, Point c) {
Line line1 = new Line();
Line line2 = new Line();
line1.setMN(a,b);
line2.setMN(b,c);
if(line2.slope() == line1.slope())
return true;
else
return false;
}
boolean fourpoint(Line a) {
if(Math.abs(a.slope() - this.slope()) < 0.000001)
return true;
else
return false;
}
//求两直线交点坐标
public Point intersection(Line a) {
Point point = new Point();
if(a.slope() == this.slope())
return null;
double det = this.getA() * a.getB() - a.getA() * this.getB();
if(det == 0)
return null;
point.setX(( this.getB() * a.getC() - a.getB() * this.getC() )/det);
point.setY(( a.getA() * this.getC() - this.getA() * a.getC() )/det);
return point;
}
public boolean pointupline(Point a) {
if(Math.abs(a.distance(this.getM()) + a.distance(this.getN()) - this.distance()) < 0.01)
return true;
else
return false;
}
public boolean pointupline2(Point a) {
if(a.getX() > Math.min(m.getX(),n.getX()) && a.getX() < Math.max(m.getX(),n.getX()) && a.getY() > Math.min(m.getY(),n.getY()) && a.getY() < Math.max(m.getY(),n.getY())
&& this.isallline(a))
return true;
else
return false;
}
public double distance() {
double dis;
dis = Math.sqrt(Math.pow((m.getX() - n.getX()),2) + Math.pow((m.getY() - n.getY()),2));
return dis;
}
public boolean isallline(Point a) {
if(Math.abs( getA() * a.getX() + getB() * a.getY() + getC() ) < 0.01)
return true;
return false;
}
}
class triangle{
private Line l1 = new Line();
private Line l2 = new Line();
private Line l3 = new Line();
public Line getL1() {
return l1;
}
public void setL1(Line l1) {
this.l1 = l1;
}
public Line getL2() {
return l2;
}
public void setL2(Line l2) {
this.l2 = l2;
}
public Line getL3() {
return l3;
}
public void setL3(Line l3) {
this.l3 = l3;
}
public boolean istriangle(){
if(l1.isallline(l2.getN()) || l2.isallline(l3.getN()) || l3.isallline(l1.getN()))
return false;
// if(this.l1.slope() == this.l2.slope()) {
// return true;
// }
return true;
}
public boolean istwoline() {
if(Math.abs(l1.distance() - l2.distance()) < 0.000001 || Math.abs(l2.distance() - l3.distance()) < 0.000001 || Math.abs(l2.distance() - l3.distance()) < 0.000001 ) {
return true;
}
else
return false;
}
public boolean threeline() {
if(Math.abs(l1.distance() - l2.distance()) < 0.000001 && Math.abs(l1.distance() - l3.distance()) < 0.000001 && Math.abs(l2.distance() - l3.distance()) < 0.000001 ) {
return true;
}
else
return false;
}
public double Perimeter() {
return l1.distance() + l2.distance() + l3.distance();
}
public double area() {
double s = this.Perimeter() * 0.5;
return Math.sqrt(s * (s - l1.distance())* (s - l2.distance()) * (s - l3.distance()));
}
public double area2(Point a,Point b,Point c) {
double d1,d2,d3;
d1 = a.distance(b);d2 = b.distance(c);d3 = a.distance(c);
double s = 0.5 * (d1 + d2 + d3);
return Math.sqrt(s * (s - d1) * (s - d2) * (s - d3));
}
public Point focus() {
Point weight = new Point();
weight.setX((l1.getM().getX() + l1.getN().getX() + l2.getN().getX())*1.0/3);
weight.setY((l1.getM().getY() + l1.getN().getY() + l2.getN().getY())*1.0/3);
return weight;
}
public double getcos(Point a,Point b,Point c) {
double l1 = a.distance(b);
double l2 = a.distance(c);
double l3 = b.distance(c);
return (l1 * l1 + l2 * l2 - l3 * l3 )/(2 * l1 * l2);
}
public void OneTriangle(Line line){
List<Line> lineList = new ArrayList<>();
lineList.add(l1);lineList.add(l2);lineList.add(l3);
List<Point> list = new ArrayList<>();
int cnt = 0;
Point u;
for(int i=0;i<lineList.size();i++){
u = lineList.get(i).intersection(line);
boolean flag = false;
if( u != null){
// System.out.println(lineList.get(i).getM().getX() + " " + lineList.get(i).getM().getY() );
// System.out.println(lineList.get(i).getN().getX() + " " + lineList.get(i).getN().getY() );
if(lineList.get(i).pointupline(u)){
flag = true;
}
for (Point p : list){
if( p.CheckPoint(u) ){
flag = false;
break;
}
}
if(flag){
list.add(u);
//System.out.println(u.getX() + " " + u.getY() );
cnt++;
}
}
}
if(cnt < 2){
System.out.println(cnt);
}
else {
double s1,s2,s;
System.out.print("2 ");
Line lline = new Line();
lline.setMN(list.get(0), list.get(1) );
Point p1 = list.get(0),p2 = list.get(1);
Point m;
if(l1.isallline(p1) && l2.isallline(p2) || l2.isallline(p2) && l1.isallline(p1))
m = l1.getN();
else if( l1.isallline(p1) && l3.isallline(p2) || l3.isallline( p2) && l1.isallline(p1) )
m = l1.getM();
else
m = l2.getN();
triangle triangle1 = new triangle();
s1 = triangle1.area2(m,list.get(0),list.get(1));
s1 = Main.sswr(s1);
s = this.area();
s = Main.sswr(s);
s2 = s - s1;
s2 = Main.sswr(s2);
System.out.println(Math.min(s1,s2) + " " + Math.max(s1,s2));
}
}
}
SourceMonitor的生成报表内容以及PowerDesigner的相应类图


解释与心得
本题是这三次作业中最难的一个题,这个题需要建立多个类,这样可以提高代码的复用性,在上一个题中通过建立类使得这个题节省了一部分时间,点类和线类还有判断类在这个题中依然可以用。这个题一定要注意公式的正确性,一定不要写错公式,如果测试点一直过不去不如换个公式解法试试看,也许就过了。由上图可知本题我的代码除了最大复杂度有点超出其他都还在范围内。最大复杂度有待改善。应该是因为选项4的判断那块造成的。
踩坑心得
1、在Java中判断两个非整型类的数字相比时一定不要用“==”去判断,要通过两数相减求绝对值小于某一个精度的方法
Math.abs(a-b)<0.000001//判断a和b是否相等。
2、Arraylist的使用还有他和数组有些函数用法不一样,比如长度是.size()不是.length这让我搞了好一会,花了一二十分钟才知道自己问题在哪。一定要提前学习。尤其是Java基础知识要尽早学,别等老师讲,有可能学期结束了都等不到,有些东西靠人不如靠己。
3、在做第三次题集时直线尽量用一般式,你会比用直线的其他方程少许多阴间测试点的纠缠。
4、做题前一定要理解题,不要一上手就开始敲代码,一定要仔细审题,不要遗漏任何有必要的废话,这句话可能会导致你的格式、或数据处理、或者你判断的顺序错误导致测试点过不去,折腾半天,明明毫无问题就是过不了,最后才发现是格式问题。
5、在题集三7-3中选项3中一般先判断直角三角形这样有可能会少几个测试点烦你。
6、题集三7-3选项五我没有使用射线发,实力太菜不会射线法,我用的面积法稍微偷了下懒,建议大家使用射线法,毕竟是题目要求的,存在即合理。
7、在做题的时候变量名一定要清楚易懂,避免写公式时被绕进去,导致公式写错,还检查不出来。公式一定一定要写正确,我在题集三中求两直线交点公式写错弄了一下午,还以为我的代码逻辑有问题,一直在检查。

图中为正确代码,我当时弄错了this和a的位置导致det算错写始终有几个点过不去。
改进建议
1、题集三的7-3题我的最大复杂度有待改进,这题代码应该从选项四那块,优化算法,那块所用算法太暴力,复杂度太高。
2、代码的注释还不够,写着写着就忘记注释,以后写代码要注意代码的注释。以及代码的格式问题。提高代码的可读性。
总结
在这几次的作业中我学会了类的概念,通过类来提高代码的复用性,减少了许多代码的CV,使得代码的可读性更高,更简洁,封装后更可以随意调用,更加方便。当然还有好多地方不足,比如在代码的规范性,代码的简洁性还都需要提高,就像题集三7-3中主函数的几个选项里代码太繁琐应该适当的包装使其简化。还有我应该去继续加深学习Java 的基础知识并不断地深入,提前学习。要不断练习并转变思维尽快有面向过程转向面向面向对象。
希望老师每次下课前告知下节课的学习重点,留一些预习时间使得上课时更轻松一些。

浙公网安备 33010602011771号