- 前言
本次Blog是对6-9周所做的PTA以及期中考试进行多方面总结,四边形、五边形以及期中考试。对知识点,题量,难度等方面进行分析。
首先是第四次大作业,考察了正则表达式、四边形以及银行业务类。因为从三角形开始用类进行编写,难度在第三次的基础上也增加了不少,题量虽然不大,但是在此次作业也花了很多时间,对多边形的类和方法也有了更好的掌握。
第五次作业难度也是层层递进,方法与类也是越变越多,考虑的情况也更加复杂,时间花的更多但完成度也是越来越低,自身能力还得提升。
最后就是期中考试,对类的设计,继承与多态,以及容器类进行一次较为简单的题目测试。总共三道题目,难度不是很大但也因为一些细节问题没拿到满分。
- 第四次PTA
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
1:输入四个点坐标,判断是否是四边形、平行四边形,判断结果输出true/false,结果之间以一个英文空格符分隔。
2:输入四个点坐标,判断是否是菱形、矩形、正方形,判断结果输出true/false,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
3:输入四个点坐标,判断是凹四边形(false)还是凸四边形(true),输出四边形周长、面积,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
4:输入六个点坐标,前两个点构成一条直线,后四个点构成一个四边形或三角形,输出直线与四边形(也可能是三角形)相交的交点数量。如果交点有两个,再按面积从小到大输出四边形(或三角形)被直线分割成两部分的面积(不换行)。若直线与四边形或三角形的一条边线重合,输出"The line is coincide with one of the lines"。若后四个点不符合四边形或三角形的输入,输出"not a quadrilateral or triangle"。
后四个点构成三角形的情况:假设三角形一条边上两个端点分别是x、y,边线中间有一点z,另一顶点s:
1)符合要求的输入:顶点重复或者z与xy都相邻,如x x y s、x z y s、x y x s、s x y y。此时去除冗余点,保留一个x、一个y。
2) 不符合要求的输入:z 不与xy都相邻,如z x y s、x z s y、x s z y
5:输入五个点坐标,输出第一个是否在后四个点所构成的四边形(限定为凸四边形,不考虑凹四边形)或三角形(判定方法见选项4)的内部(若是四边形输出in the quadrilateral/outof the quadrilateral,若是三角形输出in the triangle/outof the triangle)。如果点在多边形的某条边上,输出"on the triangle或者on the quadrilateral"。若后四个点不符合四边形或三角形,输出"not a quadrilateral or triangle"。 设计与分析: 在三角形基础上设计一个四边形的类,包含判断四边形的方法,判断凸凹的方法,计算面积周长的方法,以及判断是否是菱形、矩形、正方形的方法,交点个数方法在线类中实现。 部分重要代码与类图:
class Quadrilateral { Point x = new Point(); Point y = new Point(); Point z = new Point(); Point a = new Point(); Line xy = new Line(); Line yz = new Line(); Line za = new Line(); Line ax = new Line(); Line ya = new Line(); Line xz = new Line(); Triangle tr = new Triangle(); // public Quadrilateral() { // // } void Quadrilateral_set(Point x, Point y, Point z, Point a) { this.x = x; this.y = y; this.z = z; this.a = a; xy = new Line(x, y); yz = new Line(y, z); za = new Line(z, a); ax = new Line(a, x); ya = new Line(y, a); xz = new Line(x, z); } /* 判断x\y\z\a四个点的坐标是否能构成一个四边形 */ public boolean ifQuadrilateral() { if (xy.parallel(yz) == -1 && yz.parallel(za) == -1 && za.parallel(ax) == -1 && ax.parallel(xy) == -1) { if (!(xy.if_in_line(xy.jiaodian(za)) && za.if_in_line(xy.jiaodian(za))) && !(yz.if_in_line(yz.jiaodian(ax)) && ax.if_in_line(yz.jiaodian(ax)))) return true; } return false; } //判断四个点是否组成三角形 public boolean sidianif_triangle() { if (x.checkpoint(y) && !x.checkpoint(a) && !x.checkpoint(z) && !a.checkpoint(z)) { tr.sjxbian(x, z, a); return true; } if (x.checkpoint(a) && !x.checkpoint(y) && !x.checkpoint(z) && z.checkpoint(y)) { tr.sjxbian(x, y, z); return true; } if (x.checkpoint(z) && !x.checkpoint(y) && !x.checkpoint(a) && !y.checkpoint(a)) { tr.sjxbian(x, y, a); return true; } if (x.checkpoint(y) && !y.checkpoint(z) && !y.checkpoint(a) && !z.checkpoint(a)) { tr.sjxbian(y, z, a); return true; } if (ya.if_in_line(x) || ya.if_in_line(z) || xz.if_in_line(y) || xz.if_in_line(a)) return true; return false; } /* 判断是否平行四边形 */ public boolean ifParallelogram() { double k1 = (this.x.getY() - this.y.getY()) * (this.x.getY() - this.y.getY()) + (this.x.getX() - this.y.getX()) * (this.x.getX() - this.y.getX()); double k2 = (this.y.getY() - this.z.getY()) * (this.y.getY() - this.z.getY()) + (this.y.getX() - this.z.getX()) * (this.y.getX() - this.z.getX()); double k3 = (this.z.getY() - this.a.getY()) * (this.z.getY() - this.a.getY()) + (this.z.getX() - this.a.getX()) * (this.z.getX() - this.a.getX()); double k4 = (this.a.getY() - this.x.getY()) * (this.a.getY() - this.x.getY()) + (this.a.getX() - this.x.getX()) * (this.a.getX() - this.x.getX()); if (k1 == k3 && k2 == k4) { return true; } else { return false; } } /* 获取四边形的面积,此处采用海伦公式 public double getArea() { } */ /* 获取四边形的周长 */ public double getPerimeter() { double k1 = (this.x.getY() - this.y.getY()) * (this.x.getY() - this.y.getY()) + (this.x.getX() - this.y.getX()) * (this.x.getX() - this.y.getX()); double k2 = (this.y.getY() - this.z.getY()) * (this.y.getY() - this.z.getY()) + (this.y.getX() - this.z.getX()) * (this.y.getX() - this.z.getX()); double k3 = (this.z.getY() - this.a.getY()) * (this.z.getY() - this.a.getY()) + (this.z.getX() - this.a.getX()) * (this.z.getX() - this.a.getX()); double k4 = (this.a.getY() - this.x.getY()) * (this.a.getY() - this.x.getY()) + (this.a.getX() - this.x.getX()) * (this.a.getX() - this.x.getX()); return Math.sqrt(k1) + Math.sqrt(k2) + Math.sqrt(k3) + Math.sqrt(k4); } /* 判断是否菱形 */ public boolean ifLozenge() { double k1 = (this.x.getY() - this.y.getY()) * (this.x.getY() - this.y.getY()) + (this.x.getX() - this.y.getX()) * (this.x.getX() - this.y.getX()); double k2 = (this.y.getY() - this.z.getY()) * (this.y.getY() - this.z.getY()) + (this.y.getX() - this.z.getX()) * (this.y.getX() - this.z.getX()); double k3 = (this.z.getY() - this.a.getY()) * (this.z.getY() - this.a.getY()) + (this.z.getX() - this.a.getX()) * (this.z.getX() - this.a.getX()); double k4 = (this.a.getY() - this.x.getY()) * (this.a.getY() - this.x.getY()) + (this.a.getX() - this.x.getX()) * (this.a.getX() - this.x.getX()); if (k1 == k2 && k2 == k3 && k3 == k4) { return true; } else { return false; } } /* 判断是否矩形 */ public boolean ifEquilateralQuadrilateral() { double k1 = (this.x.getY() - this.y.getY()) * (this.x.getY() - this.y.getY()) + (this.x.getX() - this.y.getX()) * (this.x.getX() - this.y.getX()); double k2 = (this.y.getY() - this.z.getY()) * (this.y.getY() - this.z.getY()) + (this.y.getX() - this.z.getX()) * (this.y.getX() - this.z.getX()); double k3 = (this.z.getY() - this.a.getY()) * (this.z.getY() - this.a.getY()) + (this.z.getX() - this.a.getX()) * (this.z.getX() - this.a.getX()); double k4 = (this.a.getY() - this.x.getY()) * (this.a.getY() - this.x.getY()) + (this.a.getX() - this.x.getX()) * (this.a.getX() - this.x.getX()); double k5 = (this.x.getX() - this.z.getX()) * (this.x.getX() - this.z.getX()) + (this.x.getY() - this.z.getY()) * (this.x.getY() - this.z.getY()); double k6 = (this.y.getX() - this.a.getX()) * (this.y.getX() - this.a.getX()) + (this.y.getY() - this.a.getY()) * (this.y.getY() - this.a.getY()); if (k1 == k3 && k2 == k4 && k5 == k6) { return true; } else if ((xy.xielv() * yz.xielv() == -1 && xy.check_slope() && yz.check_slope()) || (!xy.check_slope() && yz.check_slope()) || (xy.check_slope() && !yz.check_slope())) { return true; } else { return false; } } /* 判断是否正方形 */ public boolean ifRightQuadrilateral() { double k1 = (this.x.getY() - this.y.getY()) * (this.x.getY() - this.y.getY()) + (this.x.getX() - this.y.getX()) * (this.x.getX() - this.y.getX()); double k2 = (this.y.getY() - this.z.getY()) * (this.y.getY() - this.z.getY()) + (this.y.getX() - this.z.getX()) * (this.y.getX() - this.z.getX()); double k3 = (this.z.getY() - this.a.getY()) * (this.z.getY() - this.a.getY()) + (this.z.getX() - this.a.getX()) * (this.z.getX() - this.a.getX()); double k4 = (this.a.getY() - this.x.getY()) * (this.a.getY() - this.x.getY()) + (this.a.getX() - this.x.getX()) * (this.a.getX() - this.x.getX()); double k5 = (this.x.getX() - this.z.getX()) * (this.x.getX() - this.z.getX()) + (this.x.getY() - this.z.getY()) * (this.x.getY() - this.z.getY()); double k6 = (this.y.getX() - this.a.getX()) * (this.y.getX() - this.a.getX()) + (this.y.getY() - this.a.getY()) * (this.y.getY() - this.a.getY()); if (k1 == k2 && k2 == k3 && k3 == k4 && k5 == k6 && ifEquilateralQuadrilateral()) { return true; } else { return false; } } public static Double doubleFormat(double b) { DecimalFormat df = new DecimalFormat("#.000"); Double output = Double.valueOf(df.format(b)); return output; } /* 判断是否凹四边形 还是凸四边形*/ public void ifTuAo() { double s1, c1; double k1 = Math.sqrt(Math.pow(this.y.getX() - this.x.getX(), 2) + Math.pow(this.y.getY() - this.x.getY(), 2)); double k2 = Math.sqrt(Math.pow(this.z.getX() - this.a.getX(), 2) + Math.pow(this.z.getY() - this.a.getY(), 2)); double k3 = Math.sqrt(Math.pow(this.x.getX() - this.a.getX(), 2) + Math.pow(this.x.getY() - this.a.getY(), 2)); double k4 = Math.sqrt(Math.pow(this.y.getX() - this.z.getX(), 2) + Math.pow(this.y.getY() - this.z.getY(), 2)); double c = k1 + k2 + k3 + k4; double s = 0.5 * Math.abs(x.x * y.y + y.x * z.y + z.x * a.y + a.x * x.y - y.x * x.y - z.x * y.y - a.x * z.y - x.x * a.y); double t1 = (a.x - x.x) * (y.y - x.y) - (a.y - x.y) * (y.x - x.x); double t2 = (x.x - y.x) * (z.y - y.y) - (x.y - y.y) * (z.x - y.x); double t3 = (y.x - z.x) * (a.y - z.y) - (y.y - z.y) * (a.x - z.x); double t4 = (z.x - a.x) * (x.y - a.y) - (z.y - a.y) * (x.x - a.x); s1 = doubleFormat(s); c1 = doubleFormat(c); if (t1 * t2 * t3 * t4 > 0) { System.out.print("true " + c1 + " " + s1); return; } else { System.out.print("false " + c1 + " " + s1); return; } } public boolean ifinQuadrilateral(Point p) { double S;//四边形面积 double s = this.x.calculate_distance(this.y); double s1 = this.x.calculate_distance(this.a); double s2 = this.y.calculate_distance(this.z); double s3 = this.z.calculate_distance(this.a); Point d = new Point(); d.x = (this.x.getX() + this.y.getX()) / 2; d.y = (this.x.getY() + this.y.getY()) / 2; double l1 = yz.linedistance(d); double l2 = ax.linedistance(d); double l3 = za.linedistance(d); S = (s3 * l3) / 2 + (s2 * l1) / 2 + (s1 * l2) / 2; double m1 = (xy.linedistance(p) * s)/2; double m2 = (yz.linedistance(p) * s2)/2; double m3 = (za.linedistance(p) * s3)/2; double m4 = (ax.linedistance(p) * s1)/2; return Math.abs(S - m1 -m2 -m3 -m4) < 0.0000001; } }View Code 踩坑心得: 因为前一次作业用了斜率方法判断三角形,但是也会有斜率不存在的情况导致判断测试点过不了,为了以后判断多边形所以改用了判断多边形方法,邻边不平行,对边交点不在线段上。一开始正则表达式判断放错了位置,导致会产生输入点个数的低级错误,还有精度问题,一开始设为1e-16导致精度太小,找了很久才发现这个问题,因为自身能力问题所以选项四没有完成编写,只有大概思路。 改进建议: 通过上面图片可以看出代码复杂度较高,对方法应该放在哪个类里还需更加明确,写好注释,在调用的时候才不会浪费多余时间,思路需要更加严谨,判断方法应该考虑更多特殊情况。 2.7-3 设计一个银行业务类 分数 20 作者 吴光生 单位 新余学院
编写一个银行业务类BankBusiness,具有以下属性和方法:
(1)公有、静态的属性:银行名称bankName,初始值为“中国银行”。
(2)私有属性:账户名name、密码password、账户余额balance。
(3)银行对用户到来的欢迎(welcome)动作(静态、公有方法),显示“中国银行欢迎您的到来!”,其中“中国银行”自动使用bankName的值。
(4)银行对用户离开的提醒(welcomeNext)动作(静态、公有方法),显示“请收好您的证件和物品,欢迎您下次光临!”
(5)带参数的构造方法,完成开户操作。需要账户名name、密码password信息,同时让账户余额为0。
(6)用户的存款(deposit)操作(公有方法,需要密码和交易额信息),密码不对时无法存款且提示“您的密码错误!”;密码正确、完成用户存款操作后,要提示用户的账户余额,例如“您的余额有1000.0元。”。
(7)用户的取款(withdraw)操作(公有方法,需要密码和交易额信息)。密码不对时无法取款且提示“您的密码错误!”;密码正确但余额不足时提示“您的余额不足!”;密码正确且余额充足时扣除交易额并提示用户的账户余额,例如“请取走钞票,您的余额还有500.0元。”。
编写一个测试类Main,在main方法中,先后执行以下操作:
(1)调用BankBusiness类的welcome()方法。
(2)接收键盘输入的用户名、密码信息作为参数,调用BankBusiness类带参数的构造方法,从而创建一个BankBusiness类的对象account。
(3)调用account的存款方法,输入正确的密码,存入若干元。密码及存款金额从键盘输入。
(4)调用account的取款方法,输入错误的密码,试图取款若干元。密码及取款金额从键盘输入。
(5)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额大于余额)。密码及取款金额从键盘输入。
(6)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额小于余额)。密码及取款金额从键盘输入。
(7)调用BankBusiness类的welcomeNext()方法。
import java.util.Scanner; public class Main { public static void main(String[] args) { BankBusiness.welcome(); Scanner input = new Scanner(System.in); String name = input.next(); String password = input.next(); BankBusiness yonhu = new BankBusiness(name, password); yonhu.deposit(input.next(), input.nextDouble()); yonhu.withdraw(input.next(), input.nextDouble()); yonhu.withdraw(input.next(), input.nextDouble()); yonhu.withdraw(input.next(), input.nextDouble()); BankBusiness.welcomeNext(); } } class BankBusiness{ public static String bankName = "中国银行"; private String name,password; private double balance;//私有变量 public static void welcome(){ System.out.println(bankName+"欢迎您的到来!"); } public static void welcomeNext(){ System.out.println("请收好您的证件和物品,欢迎您下次光临!"); } public BankBusiness(String name,String password){ this.name=name; this.password=password; this.balance=0; } public void deposit(String password,double cunk){ if(!password.equals(this.password)){ System.out.println("您的密码错误!"); return; } this.balance+=cunk; System.out.println("您的余额有"+this.balance+"元。"); } public void withdraw(String password,double qukuan){ if(!password.equals(this.password)){ System.out.println("您的密码错误!"); return; }if(this.balance<qukuan){ System.out.println("您的余额不足!"); return; }this.balance-=qukuan; System.out.println("请取走钞票,您的余额还有"+this.balance+"元。"); } }View Code 踩坑心得: 第三题还是较为简单,根据题目题干编写类与方法还是比较容易完成。
- 第五次PTA
用户输入一组选项和数据,进行与五边形有关的计算。
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
1:输入五个点坐标,判断是否是五边形,判断结果输出true/false。
2:输入五个点坐标,判断是凹五边形(false)还是凸五边形(true),如果是凸五边形,则再输出五边形周长、面积,结果之间以一个英文空格符分隔。 若五个点坐标无法构成五边形,输出"not a pentagon"
3:输入七个点坐标,前两个点构成一条直线,后五个点构成一个凸五边形、凸四边形或凸三角形,输出直线与五边形、四边形或三角形相交的交点数量。如果交点有两个,再按面积从小到大输出被直线分割成两部分的面积(不换行)。若直线与多边形形的一条边线重合,输出"The line is coincide with one of the lines"。若后五个点不符合五边形输入,若前两点重合,输出"points coincide"。
以上3选项中,若输入的点无法构成多边形,则输出"not a polygon"。输入的五个点坐标可能存在冗余,假设多边形一条边上两个端点分别是x、y,边线中间有一点z,另一顶点s:
1)符合要求的输入:顶点重复或者z与xy都相邻,如:x x y s、x z y s、x y x s、s x y y。此时去除冗余点,保留一个x、一个y。
2) 不符合要求的输入:z不与xy都相邻,如:z x y s、x z s y、x s z y
设计与分析:
设计一个五边行的类,判断是否为五边形,判断凹凸性,考虑五边形五个点的构造,五点构成四边形或者三角形。做选项3需要考虑线与五边形交点的情况,一个交点还是两个交点,也有可能与边重合,因为只考虑凸五边形,然后用计算四边形或者三角形的面积方法进行面积输出。
部分重要代码以及类图:
class Pentagon { Point a = new Point(); Point b = new Point(); Point c = new Point(); Point d = new Point(); Point e = new Point(); Line ab = new Line(); Line bc = new Line(); Line cd = new Line(); Line de = new Line(); Line ea = new Line(); Line ac = new Line(); Line be = new Line(); Line ad = new Line(); Line bd = new Line(); Line ec = new Line(); Quadrilateral q = new Quadrilateral(); public ArrayList<Point> points(){ ArrayList<Point> points = new ArrayList<>(); points.add(a); points.add(b); points.add(c); points.add(d); points.add(e); return points; } //构造五边形 public void set_Pentagon(Point a, Point b, Point c, Point d, Point e) { this.a = a; this.b = b; this.c = c; this.d = d; this.e = e; ab = new Line(a, b); bc = new Line(b, c); cd = new Line(c, d); de = new Line(d, e); ea = new Line(e, a); ac = new Line(a, c); be = new Line(b, e); ad = new Line(a, d); bd = new Line(b, d); ec = new Line(e, c); } //去掉三点共线的中点 public void qudian(ArrayList<Point> points){ Line line = new Line(); for (int i = 0; i < points.size(); i++) { int num1 = i + 1; int num2 = i + 2; if (num1 >= points.size()) { num1 = num1 - points.size(); } if (num2 >= points.size()) { num2 = num2 - points.size(); } if (line.sdgx(points.get(i), points.get((i + 1) % points.size()), points.get((i + 2) % points.size()))) { points.remove(points.get((i + 2) % points.size())); } } } public boolean ifPentagon() { Line line = new Line(); ArrayList<Point> points = new ArrayList<>(); points.add(a); points.add(b); points.add(c); points.add(d); points.add(e); for (int i = 0; i < points.size(); i++) { int num1 = i + 1; int num2 = i + 2; if (num1 >= points.size()) { num1 = num1 - points.size(); } if (num2 >= points.size()) { num2 = num2 - points.size(); } if (line.sdgx(points.get(i), points.get((i + 1) % 5), points.get((i + 2) % 5))) { return false; } } if (ab.parallel(bc) == -1 && bc.parallel(cd) == -1 && cd.parallel(de) == -1 && de.parallel(ea) == -1 && ea.parallel(ab) == -1) { if (!(ab.if_in_line(ab.jiaodian(cd)) && cd.if_in_line(ab.jiaodian(cd))) && !(ab.if_in_line(ab.jiaodian(de)) && de.if_in_line(ab.jiaodian(de))) && !(bc.if_in_line(ea.jiaodian(bc)) && ea.if_in_line(ea.jiaodian(bc))) && !(de.if_in_line(bc.jiaodian(de)) && bc.if_in_line(bc.jiaodian(de))) && !(cd.if_in_line(cd.jiaodian(ea)) && ea.if_in_line(cd.jiaodian(ea)))) return true; } return false; } //凸为true 凹为false public boolean ifTuAo() { if ((a.chachen(b, c) && b.chachen(c, d) && c.chachen(d, e) && d.chachen(e, a) && e.chachen(a, b)) || (!a.chachen(b, c) && !b.chachen(c, d) && !c.chachen(d, e) && !d.chachen(e, a) && !e.chachen(a, b))) return true; else return false; } // public boolean Wudian_Pentagon() { //} //计算五边形周长 public double calculate_C() { double c1, c2, c3, c4, c5; c1 = a.calculate_distance(b); c2 = b.calculate_distance(c); c3 = c.calculate_distance(d); c4 = d.calculate_distance(e); c5 = e.calculate_distance(a); double C = c1 + c2 + c3 + c4 + c5; return C; } public double calculate_S() { double s1, s2, s3; double l1, l2, l3;//三角形底边 double g1, g2, g3;//三角形三条高 l1 = b.calculate_distance(c); l2 = c.calculate_distance(d); l3 = d.calculate_distance(e); g1 = bc.linedistance(a); g2 = cd.linedistance(a); g3 = de.linedistance(a); s1 = l1 * g1 * 0.5; s2 = l2 * g2 * 0.5; s3 = l3 * g3 * 0.5; double S = s1 + s2 + s3; return S; } }View Code
踩坑心得:
这次作业也没有踩很多坑,因为每次作业大同小异,更多是难度上的增加,情况更加多种多样,但明显一次比一次更加熟练。
改进建议:选项3分割面积依旧没有拿到满分,情况多种多样,还是超出了能力范围,可以看到这次代码质量并不好,深度还是复杂度都超过了正常范围,需要减少代码中的冗余变量,以及简化if else的书写,可以多用switch。
2.
7-2 点线形系列5-凸五边形的计算-2 分数 50 作者 蔡轲 单位 南昌航空大学用户输入一组选项和数据,进行与五边形有关的计算。
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
4:输入十个点坐标,前、后五个点分别构成一个凸多边形(三角形、四边形、五边形),判断它们两个之间是否存在包含关系(一个多边形有一条或多条边与另一个多边形重合,其他部分都包含在另一个多边形内部,也算包含)。
两者存在六种关系:1、分离(完全无重合点) 2、连接(只有一个点或一条边重合) 3、完全重合 4、被包含(前一个多边形在后一个多边形的内部)5、交错 6、包含(后一个多边形在前一个多边形的内部)。
各种关系的输出格式如下:
1、no overlapping area between the previous triangle/quadrilateral/ pentagon and the following triangle/quadrilateral/ pentagon
2、the previous triangle/quadrilateral/ pentagon is connected to the following triangle/quadrilateral/ pentagon
3、the previous triangle/quadrilateral/ pentagon coincides with the following triangle/quadrilateral/ pentagon
4、the previous triangle/quadrilateral/ pentagon is inside the following triangle/quadrilateral/ pentagon
5、the previous triangle/quadrilateral/ pentagon is interlaced with the following triangle/quadrilateral/ pentagon
6、the previous triangle/quadrilateral/ pentagon contains the following triangle/quadrilateral/ pentagon
5:输入十个点坐标,前、后五个点分别构成一个凸多边形(三角形、四边形、五边形),输出两个多边形公共区域的面积。注:只考虑每个多边形被另一个多边形分割成最多两个部分的情况,不考虑一个多边形将另一个分割成超过两个区域的情况。
6:输入六个点坐标,输出第一个是否在后五个点所构成的多边形(限定为凸多边形,不考虑凹多边形),的内部(若是五边形输出in the pentagon/outof the pentagon,若是四边形输出in the quadrilateral/outof the quadrilateral,若是三角形输出in the triangle/outof the triangle)。输入入错存在冗余点要排除,冗余点的判定方法见选项5。如果点在多边形的某条边上,输出"on the triangle/on the quadrilateral/on the pentagon"。
以上4、5、6选项输入的五个点坐标可能存在冗余,假设多边形一条边上两个端点分别是x、y,边线中间有一点z,另一顶点s:
1)符合要求的输入:顶点重复或者z与xy都相邻,如:x x y s、x z y s、x y x s、s x y y。此时去除冗余点,保留一个x、一个y。
2) 不符合要求的输入:z不与xy都相邻,如:z x y s、x z s y、x s z y
- 期中考试PTA
-
设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:
(x,y)
,数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]
。若输入有误,系统则直接输出Wrong Format
-
设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:
``` The line's color is:颜色值 The line's begin point's Coordinate is: (x1,y1) The line's end point's Coordinate is: (x2,y2) The line's length is:长度值 ```
其中,所有数值均保留两位小数,建议可用
String.format("%.2f", data)
方法。设计类图如下图所示。
** 题目要求:在主方法中定义一条线段对象,从键盘输入该线段的起点坐标与终点坐标以及颜色,然后调用该线段的display()方法进行输出。**
- 以下情况为无效作业
- 无法运行
- 设计不符合所给类图要求
- 未通过任何测试点测试
- 判定为抄袭
设计与分析:
根据类图以及继承关系,分辨抽象类以及继承类,补充好主类,难度并不大。
踩坑心得:
掌握好了继承与抽象知识点,本题并不难,很顺利完成。
2.
7-2 点线面问题重构(继承与多态) 分数 40 作者 段喜龙 单位 南昌航空大学在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。
- 对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。
- 再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:
The Plane's color is:颜色
- 在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。示例代码如下:
类结构如下图所示。element = p1;//起点Point element.display(); element = p2;//终点Point element.display(); element = line;//线段 element.display(); element = plane;//面 element.display();
其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)
方法。
- 以下情况为无效作业
- 无法运行
- 设计不符合所给类图要求
- 未通过任何测试点测试
- 判定为抄袭
设计与分析:
本次新增一个类,element类作为父类,用子类分别构造对象,之后定义一个element引用,分别调用每个子类以及父类的dispel()。
import java.util.*; public class Main{ public static void main(String[] args) { //Point p1=new Point(); //Point p2=new Point(); Line line = new Line(); Scanner input = new Scanner(System.in); double x1, y1, x2, y2; x1 = input.nextDouble(); y1 = input.nextDouble(); x2 = input.nextDouble(); y2 = input.nextDouble(); String str = input.next(); if (x1 > 0 && x1 <= 200 && y1 > 0 && y1 <= 200 && x2 > 0 && x2 <= 200 && y2 > 0 && y2 <= 200) //控制输入坐标的范围 { Point p1 = new Point(); Point p2 = new Point(); p1.setX(x1); p1.setY(y1); p2.setX(x2); p2.setY(y2); line.setPoint1(p1); line.setPoint2(p2); line.setColor(str); Plane plane = new Plane();; plane.setColor(str); Element element; element = p1;//起点Point element.display(); element = p2;//终点Point element.display(); element = line;//线段 element.display(); element = plane;//面 element.display(); } else { System.out.println("Wrong Format"); } } } abstract class Element { abstract void display(); } class Point extends Element { private double x; private double y; Point() { } Point(double x, double y) { this.x = x; this.y = y; } double getX() { return x; } void setX(double x) { this.x = x; } double getY() { return y; } void setY(double y) { this.y = y; } public void display() { System.out.printf("(%.2f,%.2f)\n", x, y); } } class Line extends Element { private static Point point1; private static Point point2; static double l; static String color; Line() { } Line(Point p1, Point p2, String color) { this.setPoint1(p1); this.setPoint2(p2); this.color = color; } public Point getPoint1() { return point1; } public void setPoint1(Point point1) { this.point1 = point1; } public Point getPoint2() { return point2; } public void setPoint2(Point point2) { this.point2 = point2; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public static double getDistance() { double x1, x2, y1, y2; x1 = point1.getX(); y1 = point1.getY(); x2 = point2.getX(); y2 = point2.getY(); l = Math.sqrt((y1 - y2) * (y1 - y2) + (x1 - x2) * (x1 - x2)); return l; } public void display() { if (point1.getX() == point2.getX() && point1.getY() == point2.getY()) System.out.print("Wrong Format"); else { System.out.println("The line's color is:" + color); System.out.println("The line's begin point's Coordinate is:"); point1.display(); System.out.println("The line's end point's Coordinate is:"); point2.display(); System.out.println("The line's length is:"+String.format("%.2f",this.getDistance())); } } } class Plane extends Element { private String color; public Plane() { super(); } public Plane(String color) { super(); this.color = color; } public void setColor(String color) { this.color = color; } public String getColor() { return color; } public void display() { System.out.print("The " + "Plane's color is:" +this.color); } }View Code
踩坑心得:
第二次很疑惑,所有测试点过了但是没有满分,直到结束也没有发现错误,回到寝室发现一个可能的原因可能是输出格式,两位小数的原因,没有按照题目给的方式去编写。
改进建议:
采用String.format("%.2f", data)这个保留两位小数方法。
3. 7-3 点线面问题再重构(容器类) 分数 40 作者 段喜龙 单位 南昌航空大学在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
- 在原有类设计的基础上,增加一个GeometryObject容器类,其属性为
ArrayList<Element>
类型的对象(若不了解泛型,可以不使用<Element>
) - 增加该类的
add()
方法及remove(int index)
方法,其功能分别为向容器中增加对象及删除第index - 1
(ArrayList中index>=0)个对象 - 在主方法中,用户循环输入要进行的操作(choice∈[0,4]),其含义如下:
- 1:向容器中增加Point对象
- 2:向容器中增加Line对象
- 3:向容器中增加Plane对象
- 4:删除容器中第index - 1个数据,若index数据非法,则无视此操作
- 0:输入结束
输入结束后,按容器中的对象顺序分别调用每个对象的choice = input.nextInt(); while(choice != 0) { switch(choice) { case 1://insert Point object into list ... break; case 2://insert Line object into list ... break; case 3://insert Plane object into list ... break; case 4://delete index - 1 object from list int index = input.nextInt(); ... } choice = input.nextInt(); }
display()
方法进行输出。
类图如下所示:
- 以下情况为无效作业
- 无法运行
- 设计不符合所给类图要求
- 未通过任何测试点测试
- 判定为抄袭
设计与分析:
增加一个GeometryObject容器类,其属性为ArrayList<Element>
类型的对象,
向容器中增加Point对象
向容器中增加Line对象
向容器中增加Plane对象
删除容器中第index - 1个数据,若index数据非法,则无视此操作。
重要代码如下:
public static void main(String[] args) { double x1, y1, x2, y2; String color; Scanner input = new Scanner(System.in); int choice = 0, index = 0; GeometryObject container = new GeometryObject(); choice = input.nextInt(); while (choice != 0) { switch (choice) { case 1: x1 = input.nextDouble(); y1 = input.nextDouble(); container.add(new Point(x1, y1)); break; case 2: x1 = input.nextDouble(); y1 = input.nextDouble(); x2 = input.nextDouble(); y2 = input.nextDouble(); color = input.next(); container.add(new Line(new Point(x1, y1), new Point(x2, y2), color)); break; case 3: color = input.next(); container.add(new Plane(color)); break; case 4: index = input.nextInt(); container.remove(index); break; } choice = input.nextInt(); } for (Element element : container.getList()) { element.display(); } } }View Code
踩坑心得:
这题难度也不大,很顺利完成。
(6-9周)总结
这几周java的编程能力得到了很大提升,对类的多态,封装,继承,接口,抽象都有了初步的掌握。类方法的调用,用子类还是父类对象去调用都有了很好的区分,老师布置的作业实验也是难度不一,做了pta的作业之后再做实验更加得心应手,老师在课堂也举出了较多的例子解析java这些主要知识点,归根结底还是得靠自己多去敲,多钻研,多思考才是对代码能力提升的最好方式!
标签:总结,getX,double,Blog,getY,&&,new,第二次,Line From: https://www.cnblogs.com/dtyyyy-1016/p/16840101.html