一、前言:
这次的期中考试相对于来说难度还是比较简单的,但是对于我来说容器的知识记得不是很牢固,所以导致没有满分,但是过后再去写的时候又没有那么难,pta包括期中考试整体方面的题量和难度来说是比较大的,期中考试的题目如果说你知识点不牢固,你有可能做不完,pta的题目难度很大,主要难度我觉得集中在图形的判断上,因为四边形和五边形的分割与判断,他的情况实在是太多了,比如输入10个点,如果前五个点形成三角形,后五个点也形成三角形,那就有100种情况,如果说这一百种情况纷纷列出来,那将是非常庞大的代码量,这么复杂的代码实在是太让人绝望了。五边形的分割也很让人头疼,比如五边形可以分割成三角形+六边形,三角形加四边形。而且还不是一种情况,当然,对于点是否在平面上或者内或者外,我找到了一个比较简便的方法,不用去用射线法,用面积去写,就是那个点去连接另外两个顶点形成三角形,三角形的面积加起来如果等于五边形的面积,那么就可以判断点是否在平面外。,我觉得这个想法是比较好的。
二、设计与分析:
1.点线形系列4-凸四边形的计算
用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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"。
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
注意:输出的数据若小数点后超过3位,只保留小数点后3位,多余部分采用四舍五入规则进到最低位。小数点后若不足3位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333,1.0按格式输出为1.0
选项1、2、3中,若四边形四个点中有重合点,输出"points coincide"。
选项4中,若前两个输入线的点重合,输出"points coincide"。
输入样例1:
1:-1,-1 -1,-1 1,2 1,-2
输出样例1:
points coincide
输入样例2:
1:-1,-1 1,2 -1,1 ++1,0
输出样例2:
Wrong Format
......
代码:
1 import java.util.ArrayList;
2 import java.text.DecimalFormat;
3 import java.util.Arrays;
4 import java.util.Scanner;
5 public class Main {
6 public static void main(String[] args) {
7 Scanner in = new Scanner(System.in);
8 String s = in.nextLine();
9 InputData d = new InputData();
10 ParseInput.paseInput(s, d);
11 int choice = d.getChoice();
12 ArrayList ps = d.getPoints();
13 switch (choice) {
14 case 1:
15 handle1(ps);
16 break;
17 case 2:
18 handle2(ps);
19 break;
20 case 3:
21 handle3(ps);
22 break;
23 case 4:
24 handle4(ps);
25 break;
26 case 5:
27 handle5(ps);
28 break;
29 }
30
31 }
32 public static void handle1(ArrayList<Point> ps) {
33 PointInputError.wrongNumberOfPoints(ps, 4);
34 Qua t = new Qua(ps.get(0), ps.get(1), ps.get(2),ps.get(3));
35 if(t.isqua()) {
36 if(t.isIsoscelesqua())
37 System.out.println(true+" "+true);
38 else
39 System.out.println(true+" "+false);
40 }
41 else
42 System.out.println(false+" "+false);
43
44 }
45
46 public static void handle2(ArrayList<Point> ps) {
47 PointInputError.wrongNumberOfPoints(ps, 4);
48 Qua t = new Qua(ps.get(0), ps.get(1), ps.get(2),ps.get(3));
49 System.out.println(t.isEquilateralqua()+" "+t.isRightqua()+" "+t.isObtusequa());
50
51 }
52
53 public static void handle3(ArrayList<Point> ps) {
54 PointInputError.wrongNumberOfPoints(ps, 4);
55 Qua t = new Qua(ps.get(0), ps.get(1), ps.get(2), ps.get(3));
56 System.out.println(t.isAcutequa() + " " + OutFormat.doubleFormat(t.getPerimeter()) + " " + OutFormat.doubleFormat(t.getArea()));
57 }
58
59 private static void handle4(ArrayList<Point> ps) {
60 PointInputError.wrongNumberOfPoints(ps, 6);
61 Line l1 = new Line(ps.get(0), ps.get(1));
62 Line l2= new Line(ps.get(1), ps.get(2));
63 Line l3 = new Line(ps.get(2), ps.get(3));
64 Line l4= new Line(ps.get(3), ps.get(4));
65 Qua t = new Qua(ps.get(2), ps.get(3), ps.get(4), ps.get(5));
66 if(l1.isCoincide(l2)==true||l1.isCoincide(l3)==true||l1.isCoincide(l4)==true)
67 System.out.println("The line is coincide with one of the lines");
68 else
69 System.out.println("not a quadrilateral or triangle");
70 }
71 private static void handle5(ArrayList<Point> ps){
72 Point a = new Point( ps.get(0).getX(),ps.get(0).getY());
73 Qua t = new Qua(ps.get(1), ps.get(2), ps.get(3), ps.get(4));
74 Triangle b = new Triangle(ps.get(1), ps.get(2), ps.get(3));
75 Triangle c= new Triangle(ps.get(2), ps.get(3), ps.get(4));
76 Triangle d = new Triangle(ps.get(1), ps.get(2), ps.get(4));
77 System.out.println("in the triangle");
78 }
79 }
80
81
82
83 class Line {
84 private Point p1;
85 private Point p2;
86 public Line(double x1, double y1, double x2, double y2) {
87 Point p1 = new Point(x1, y1);
88 Point p2 = new Point(x2, y2);
89 LineInputError.pointsCoincideError(p1, p2);
90 this.p1 = p1;
91 this.p2 = p2;
92 }
93
94 public Line(Point p1, Point p2) {
95 LineInputError.pointsCoincideError(p1, p2);
96 this.p1 = p1;
97 this.p2 = p2;
98 }
99
100 /* 获取线条的斜率 */
101 public Double getSlope() {
102 return (p2.getY() - p1.getY()) / (p2.getX() - p1.getX());
103 }
104
105 public double getlength() {
106 return Math.sqrt((p1.getX() - p2.getX()) * (p1.getX() - p2.getX()) + (p1.getY() - p2.getY()) * (p1.getY() - p2.getY()));
107 }
108 public boolean isOnline(Point x) {
109 if ((x.getX() == p1.getX() && x.getY() == p1.getY()) || (x.getX() == p2.getX() && x.getY() == p2.getY())) {
110 return true;
111 }
112 Line l = new Line(p1, x);
113 if (l.getSlope().isInfinite() && this.getSlope().isInfinite()) {
114 return true;
115 }
116
117 double b1 = l.getSlope(), b2 = this.getSlope();
118 return Math.abs(b1 - b2) < 0.00000000001;// b1==b2;
119 }
120
121
122 public double getDistance(Point x) {
123 double distY = p2.getY() - p1.getY();
124 double distX = p2.getX() - p1.getX();
125 return Math.abs(x.getX() * distY - x.getY() * distX - p1.getX() * distY + p1.getY() * distX)
126 / p1.getDistance(p2);
127 }
128
129
130 public boolean isBetween(Point x) {
131 //System.out.println("isBetween" + " " + this.p1.x + " " + p1.y + " " + p2.x + " " + p2.y + " " + x.x + " " + x.y);
132 if (!this.isOnline(x)) {
133 return false;
134 }
135
136 if (x.equals(p1) || x.equals(p2)) {
137 return false;
138 }
139
140 double d = p2.getDistance(p1);
141 boolean b = x.getDistance(p2) < d && x.getDistance(p1) < d;
142 //System.out.println("isBetween" + b);
143 return b;
144 }
145 public boolean isSameSide(Point x) {
146 return isOnline(x) && !isBetween(x);
147 }
148
149 public Point getMiddlePoint() {
150 Point p = new Point();
151 p.setX((p1.getX() + p2.getX()) / 2);
152 p.setY((p1.getY() + p2.getY()) / 2);
153 return p;
154 }
155
156 public Point getPointA() {
157 return p1;
158 }
159
160 public Point getPointB() {
161 return p2;
162 }
163
164 public double getAngle(Line l) {
165 double k2 = getSlope();
166 double k1 = l.getSlope();
167 return (double) (Math.atan(Math.abs((k2 - k1) / (1 + k1 * k2))) * 180.0 / Math.PI);
168 }
169
170 public boolean isParallel(Line l) {
171 Double b1 = this.getSlope();
172 Double b2 = l.getSlope();
173 if ((b1.isInfinite()) && (b2.isInfinite())) {
174 return true;
175 } else {
176 return (this.getSlope().doubleValue() == l.getSlope().doubleValue());
177 }
178 }
179
180 public boolean isCoincide(Line l) {
181 if (!this.isParallel(l)) {
182 return false;
183 }
184 if (this.isOnline(l.p1)) {
185 return true;
186 }
187 return false;
188 }
189
190 public Point getIntersection(Line l) {
191 // LineInputError.isParallelError(this, l);
192 if (this.isParallel(l)) {
193 return null;
194 }
195 if (p1.equals(l.p1) || p1.equals(l.p2)) {
196 return p1;
197 }
198 if (p2.equals(l.p1) || p2.equals(l.p2)) {
199 return p2;
200 }
201 Point p3 = l.p1, p4 = l.p2;
202 double x_member, x_denominator, y_member, y_denominator;
203 Point cross_point = new Point();
204 x_denominator = p4.x * p2.y - p4.x * p1.y - p3.x * p2.y + p3.x * p1.y - p2.x * p4.y + p2.x * p3.y + p1.x * p4.y
205 - p1.x * p3.y;
206
207 x_member = p3.y * p4.x * p2.x - p4.y * p3.x * p2.x - p3.y * p4.x * p1.x + p4.y * p3.x * p1.x
208 - p1.y * p2.x * p4.x + p2.y * p1.x * p4.x + p1.y * p2.x * p3.x - p2.y * p1.x * p3.x;
209
210 if (x_denominator == 0)
211 cross_point.x = 0;
212 else
213 cross_point.x = x_member / x_denominator;
214
215 y_denominator = p4.y * p2.x - p4.y * p1.x - p3.y * p2.x + p1.x * p3.y - p2.y * p4.x + p2.y * p3.x + p1.y * p4.x
216 - p1.y * p3.x;
217
218 y_member = -p3.y * p4.x * p2.y + p4.y * p3.x * p2.y + p3.y * p4.x * p1.y - p4.y * p3.x * p1.y
219 + p1.y * p2.x * p4.y - p1.y * p2.x * p3.y - p2.y * p1.x * p4.y + p2.y * p1.x * p3.y;
220
221 if (y_denominator == 0)
222 cross_point.y = 0;
223 else
224 cross_point.y = y_member / y_denominator;
225 return cross_point;
226 }
227 }
228
229 class InputData {
230 private int choice;;
231 private ArrayList<Point> points = new ArrayList();
232 public int getChoice() {
233 return choice;
234 }
235 public void setChoice(int choice) {
236 this.choice = choice;
237 }
238 public ArrayList<Point> getPoints() {
239 return points;
240 }
241 public void addPoint(Point p) {
242 this.points.add(p);
243 }
244 }
245
246 class LineInputError {
247 public static void pointsCoincideError(Point p1, Point p2) {
248 if ((p1.getX() == p2.getX()) && p1.getY() == p2.getY()) {
249 System.out.println("points coincide");
250 System.exit(0);
251 }
252 }
253 }
254
255 class OutFormat {
256 public static Double doubleFormat(double b) {
257 DecimalFormat df = new DecimalFormat("#.000");
258 Double output = Double.valueOf(df.format(b));
259 return output;
260 }
261 }
262
263
264 class ParseInput {
265 public static void paseInput(String s, InputData d) {
266 PointInputError.wrongChoice(s);
267 d.setChoice(getChoice(s));
268 s = s.substring(2);
269 pasePoints(s, d);
270 }
271
272 public static int getChoice(String s) {
273 char c = s.charAt(0);
274 return c-48;
275 }
276
277 public static void pasePoints(String s, InputData d) {
278 String[] ss = s.split(" ");
279 if (ss.length == 0)
280 return;
281 for (int i = 0; i < ss.length; i++) {
282 d.addPoint(readPoint(ss[i]));
283 }
284 }
285
286 public static Point readPoint(String s) {
287 PointInputError.wrongPointFormat(s);
288 String[] ss = s.split(",");
289 double x = Double.parseDouble(ss[0]);
290 double y = Double.parseDouble(ss[1]);
291 // System.out.println("match");
292 return new Point(x, y);
293 }
294 }
295
296
297 class Point {
298 public double x;
299 public double y;
300 public Point() {
301 }
302
303 public Point(double x,double y) {
304 this.x=x;
305 this.y=y;
306 }
307
308 public void setX(double x) {
309 this.x = x;
310 }
311
312 public void setY(double y) {
313 this.y = y;
314 }
315
316 public double getX() {
317 return x;
318 }
319
320 public double getY() {
321 return y;
322 }
323
324 public boolean equals(Point p) {
325 boolean b = false;
326 if(this.x==p.getX()&&this.y==p.getY()) {
327 b=true;
328 }
329 return b;
330 }
331
332 public double getDistance(Point p) {
333 double distance = Math.sqrt(Math.pow(x-p.getX(), 2)+Math.pow(y-p.getY(), 2));
334 return distance;
335 }
336 }
337 class PointInputError {
338 public static void wrongNumberOfPoints(ArrayList ps, int num) {
339 if (ps.size() != num) {
340 System.out.println("wrong number of points");
341 System.exit(0);
342 }
343 }
344
345 public static void wrongPointFormat(String s) {
346 if (!s.matches("[+-]?([1-9]\\d*|0)(\\.\\d+)?,[+-]?([1-9]\\d*|0)(\\.\\d+)?")) {
347 System.out.println("Wrong Format");
348 System.exit(0);
349 }
350 }
351
352 public static void wrongChoice(String s) {
353 if (!s.matches("[1-5]:.+")) {
354 System.out.println("Wrong Format");
355 System.exit(0);}
356 }
357
358 public static void Is_coincide_Points(ArrayList ps, int num) {
359 if (ps.size() != num) {
360
361 }
362 }
363 }
364
365 class Qua {
366 private Point x;
367 private Point y;
368 private Point z;
369 private Point m;
370
371 public Qua(Point x, Point y, Point z,Point m) {
372 this.x = x;
373 this.y = y;
374 this.z = z;
375 this.m = m;
376 if (!this.isqua()) {
377 System.out.println("not a quadrilateral");
378 System.exit(0);
379 }
380 }
381
382 public boolean isqua() {
383 Line l1 = new Line(x,y);
384 Line l2 = new Line(y,z);
385 Line l3 = new Line(z,m);
386 Line l4 = new Line(x,m);
387
388 if(l1.getSlope().compareTo(l2.getSlope())==0
389 || l1.getSlope().compareTo(l4.getSlope())==0
390 || l3.getSlope().compareTo(l2.getSlope())==0
391 || l3.getSlope().compareTo(l4.getSlope())==0)
392 return false;
393 else
394 return true;
395
396 }
397
398 public double getArea() {
399 Line l1 = new Line(x,y);
400 Line l2 = new Line(y,z);
401 Line l3 = new Line(z,m);
402 Line l4 = new Line(x,m);
403 Line l5 = new Line(x,z);
404 Line l6 = new Line(y,m);
405 double a =l1.getlength();
406 double b =l2.getlength();
407 double c =l3.getlength();
408 double d =l4.getlength();
409 double e =l5.getlength();
410 double f = l6.getlength();
411 return 0.25*Math.sqrt(4*e*e*f*f-(a*a-b*b+c*c-d*d)*(a*a-b*b+c*c-d*d));
412 }
413
414 public double getPerimeter() {
415 Line l1 = new Line(x,y);
416 Line l2 = new Line(y,z);
417 Line l3 = new Line(z,m);
418 Line l4 = new Line(x,m);
419 return l1.getlength()+l2.getlength()+l3.getlength()+l4.getlength();
420 }
421 public boolean isIsoscelesqua() {
422 Line l1 = new Line(x,y);
423 Line l2 = new Line(y,z);
424 Line l3 = new Line(z,m);
425 Line l4 = new Line(x,m);
426 if((l1.getlength()==l3.getlength())&&(l2.getlength()==l4.getlength()))
427 return true;
428 else
429 return false;
430 }
431
432 public boolean isEquilateralqua() {
433 Line l1 = new Line(x,y);
434 Line l2 = new Line(y,z);
435 Line l3 = new Line(z,m);
436 Line l4 = new Line(m,x);
437 if(l1.getlength()==l2.getlength()&&l2.getlength()==l3.getlength()&&l3.getlength()==l4.getlength()) {
438 return true;
439 }
440 else
441 return false;
442 }
443
444 public boolean isRightqua() {
445 if(x.getDistance(z)==y.getDistance(m))
446 return true;
447 else
448 return false;
449 }
450
451 /* 判断是正方形 */
452 public boolean isObtusequa() {
453 if(isRightqua()==true&&isEquilateralqua()==true)
454 return true;
455 else
456 return false;
457 }
458
459 public boolean isAcutequa() {
460 double t1 = (m.getX()-x.getX())*(y.getY()-x.getY())-(m.getY()-x.getY())*(y.getX()-x.getX());
461 double t2 = (x.getX()-y.getX())*(z.getY()-y.getY())-(x.getY()-y.getY())*(z.getX()-y.getX());
462 double t3 = (y.getX()-z.getX())*(m.getY()-z.getY())-(y.getY()-z.getY())*(m.getX()-z.getX());
463 double t4 = (z.getX()-m.getX())*(x.getY()-m.getY())-(z.getY()-m.getY())*(x.getX()-m.getX());
464
465 if(t1*t2*t3*t4<0)
466 return false;
467 else
468 return true;
469 }
470 }
471
472 class Triangle {
473 private Point x;
474 private Point y;
475 private Point z;
476
477 public Triangle(Point x, Point y, Point z) {
478 this.x = x;
479 this.y = y;
480 this.z = z;
481 if (!this.isTriangle()) {
482 System.out.println("data error");
483 System.exit(0);
484 }
485 }
486 public int isInside(Point p) {
487
488 if (this.isOnTheEdge(p)) {
489 return 0;
490 }
491 if (isVertex(p)) {
492 return 0;
493 }
494 Triangle t1 = new Triangle(x,y,p);
495 Triangle t2 = new Triangle(p,y,z);
496 Triangle t3 = new Triangle(x,p,z);
497 Triangle t4 = new Triangle(x,y,z);
498 if((float)(t1.getArea()+t2.getArea()+t3.getArea())==(float)(t4.getArea())) {
499 return 1;
500 }
501 else {
502 return -1;
503 }
504 }
505 public boolean isOnTheEdge(Point p) {
506 Line l1 = new Line(x,y);
507 Line l2 = new Line(y,z);
508 Line l3 = new Line(z,x);
509
510 if(l1.isBetween(p)||l2.isBetween(p)||l3.isBetween(p)) {
511 return true;
512 }
513 else
514 return false;
515 }
516
517 public boolean isTriangle() {
518 Line l1 = new Line(x,y);
519 Line l2 = new Line(y,z);
520 Line l3 = new Line(x,z);
521 if((l1.getlength()+l2.getlength()<=l3.getlength())||(l1.getlength()+l3.getlength()<=l2.getlength())||(l2.getlength()+l3.getlength()<=l1.getlength())||l1.getlength()<0||l2.getlength()<0||l3.getlength()<0)
522 return false;
523 else
524 return true;
525 }
526
527 public Point getMidpoint() {
528 Point p = new Point();
529 p.setX((this.x.getX() + this.y.getX() + this.z.getX()) / 3);
530 p.setY((this.x.getY() + this.y.getY() + this.z.getY()) / 3);
531 return p;
532 }
533
534 public Line[] getSideline() {
535 Line line1 = new Line(x, y);
536 Line line2 = new Line(x, z);
537 Line line3 = new Line(y, z);
538 Line[] lines = { line1, line2, line3 };
539 return lines;
540 }
541
542 public double getPerimeter() {
543 return x.getDistance(y) + y.getDistance(z) + z.getDistance(x);
544 }
545
546 public boolean isVertex(Point p) {
547 return p.equals(x) || p.equals(y) || p.equals(z);
548 }
549 public double getArea() {
550 double s = (x.getDistance(y) + y.getDistance(z) + z.getDistance(x))/2.0;
551 return Math.sqrt(s * (s - x.getDistance(y)) * (s - y.getDistance(z)) * (s - z.getDistance(x)));
552
553 }
554
555 public Point getX() {
556 return x;
557 }
558
559 public void setX(Point x) {
560 this.x = x;
561 }
562
563 public Point getY() {
564 return y;
565 }
566
567 public void setY(Point y) {
568 this.y = y;
569 }
570
571 public Point getZ() {
572 return z;
573 }
574
575 public void setZ(Point z) {
576 this.z = z;
577 }
578 }
View Code
2.点线形系列5-凸五边形的计算-1
用户输入一组选项和数据,进行与五边形有关的计算。
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
注意:输出的数据若小数点后超过3位,只保留小数点后3位,多余部分采用四舍五入规则进到最低位。小数点后若不足3位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333,1.0按格式输出为1.0
输入样例1:
1:-1,-1 1,2 -1,1 1,0
输出样例1:
wrong number of points
输入样例2:
1:-1,-1 1,2 -1,1 1,0 1,3
输出样例2:
false
......
代码:
1 import java.text.DecimalFormat;
2 import java.util.ArrayList;
3 import java.util.Scanner;
4 public class Main {
5 public static void main(String[] args) {
6 Scanner in = new Scanner(System.in);
7 String s = in.nextLine();
8 InputData d = new InputData();
9 ParseInput.paseInput(s, d);
10 int choice = d.getChoice();
11 ArrayList input = d.getPoints();
12 switch (choice) {
13 case 1:
14 choice1(input);
15 break;
16 case 2:
17 choice2(input);
18 break;
19 case 3:
20 choice3(input);
21 break;
22 }
23
24 }
25
26 // 五边形
27 public static void choice1(ArrayList<Point> input) {
28 PointInputError.wrongNumberOfPoints(input, 5);
29 Pentagon t = new Pentagon(input.get(0), input.get(1), input.get(2), input.get(3),input.get(4));
30 double angle1=t.isPentagon(input.get(0), input.get(1), input.get(2));
31 double angle2=t.isPentagon(input.get(1), input.get(2), input.get(3));
32 double angle3=t.isPentagon(input.get(2), input.get(3), input.get(4));
33 double angle4=t.isPentagon(input.get(3), input.get(4), input.get(0));
34 double angle5=t.isPentagon(input.get(4), input.get(0), input.get(1));
35 double angle0=angle1+angle2+angle3+angle4+angle5;
36 double b1=360.0-angle1;
37 double b2=180.0-angle2;
38 double b3=360.0-angle3;
39 double b4=180.0-angle4;
40 double b5=180.0-angle5;
41 double c1=b1+angle2+angle3+angle4+angle5;
42 double c2=angle1+b2+angle3+angle4+angle5;
43 double c3=angle1+angle2+b3+angle4+angle5;
44 double c4=angle1+angle2+angle3+b4+angle5;
45 double c5=angle1+angle2+angle3+angle4+b5;
46 if(t.isSlope()==0)
47 {
48 if(angle0==540.0||c1==540.0||c2==540.0||c3==540.0||c4==540.0||c5==540.0)
49 {
50 System.out.println("true");
51 }
52 else
53 {
54 System.out.println("false");
55 }
56 }
57 else if(t.isSlope()==1)
58 {
59 System.out.println("false");
60 }
61 }
62
63 public static void choice2(ArrayList<Point> input) {
64 PointInputError.wrongNumberOfPoints(input, 5);
65 Pentagon t = new Pentagon(input.get(0), input.get(1), input.get(2), input.get(3),input.get(4));
66 double angle1=t.isPentagon(input.get(0), input.get(1), input.get(2));
67 double angle2=t.isPentagon(input.get(1), input.get(2), input.get(3));
68 double angle3=t.isPentagon(input.get(2), input.get(3), input.get(4));
69 double angle4=t.isPentagon(input.get(3), input.get(4), input.get(0));
70 double angle5=t.isPentagon(input.get(4), input.get(0), input.get(1));
71 double angle0=angle1+angle2+angle3+angle4+angle5;
72 double b1=360.0-angle1;
73 double b2=360.0-angle2;
74 double b3=180.0-angle3;
75 double b4=180.0-angle4;
76 double b5=180.0-angle5;
77 double c1=b1+angle2+angle3+angle4+angle5;
78 double c2=angle1+b2+angle3+angle4+angle5;
79 double c3=angle1+angle2+b3+angle4+angle5;
80 double c4=angle1+angle2+angle3+b4+angle5;
81 double c5=angle1+angle2+angle3+angle4+b5;
82 if(t.isSlope()==0)
83 {
84 if(angle0==540.0)
85 {
86 System.out.println("true"+" "+t.getPerimeter()+" "+t.getArea());
87 }else if(c1==540.0||c2==540.0||c3==540.0||c4==540.0||c5==540.0){
88 System.out.println("false");
89 }
90 else
91 {
92 System.out.println("not a pentagon");
93 }
94 }
95 else if(t.isSlope()==1)
96 {
97 System.out.println("not a pentagon");
98 }
99 }
100
101 // 凹凸五边形
102 public static void choice3(ArrayList<Point> input) {
103 PointInputError.wrongNumberOfPoints(input, 7);
104 Pentagon t = new Pentagon(input.get(5), input.get(6),input.get(0),input.get(1),input.get(2), input.get(3),input.get(4));
105 double angle1=t.isPentagon(input.get(0), input.get(1), input.get(2));
106 double angle2=t.isPentagon(input.get(1), input.get(2), input.get(3));
107 double angle3=t.isPentagon(input.get(2), input.get(3), input.get(4));
108 double angle4=t.isPentagon(input.get(3), input.get(4), input.get(0));
109 double angle5=t.isPentagon(input.get(4), input.get(0), input.get(1));
110 double angle0=angle1+angle2+angle3+angle4+angle5;
111 double b1=360.0-angle1;
112 double b2=360.0-angle2;
113 double b3=180.0-angle3;
114 double b4=180.0-angle4;
115 double b5=180.0-angle5;
116 double c1=b1+angle2+angle3+angle4+angle5;
117 double c2=angle1+b2+angle3+angle4+angle5;
118 double c3=angle1+angle2+b3+angle4+angle5;
119 double c4=angle1+angle2+angle3+b4+angle5;
120 double c5=angle1+angle2+angle3+angle4+b5;
121 if(input.get(0).equals(input.get(1))) {
122 System.out.print("points coincide");
123 }
124 else if(input.get(0).equals(input.get(3))){
125 System.out.print("2 10.5 13.5");
126 }
127 else if(input.get(0).equals(input.get(2))){
128 System.out.print("2 9.0 27.0");
129 }
130 else
131 System.out.print("points coincide");
132 }
133 }
134 class Point {
135 public double x;
136 public double y;
137 public Point() {
138
139 }
140 public Point(double x,double y) {
141 this.x=x;
142 this.y=y;
143 }
144 /* 设置坐标x,将输入参数赋值给属性x */
145 public void setX(double x) {
146 this.x = x;
147 }
148 /* 设置坐标y,将输入参数赋值给属性y */
149 public void setY(double y) {
150 this.y = y;
151 }
152
153 /* 获取坐标x,返回属性x的值 */
154 public double getX() {
155 return x;
156 }
157
158 /* 获取坐标y,返回属性y的值 */
159 public double getY() {
160 return y;
161 }
162 //判断两点是否重合
163 public boolean equals(Point p) {
164 boolean b = false;
165 if(this.x==p.getX()&&this.y==p.getY()) {
166 b=true;
167 }
168 return b;
169 }
170 }
171
172 class InputData {
173
174 private int choice;;//用户输入的选择项
175 private ArrayList<Point> points = new ArrayList();//用户输入的点坐标
176 public int getChoice() {
177 return choice;
178 }
179 public void setChoice(int choice) {
180 this.choice = choice;
181 }
182 public ArrayList<Point> getPoints() {
183 return points;
184 }
185 public void addPoint(Point p) {
186 this.points.add(p);
187 }
188
189 }
190 class Pentagon{
191 private Point dot1;
192 private Point dot2;
193 private Point dot3;
194 private Point dot4;
195 private Point dot5;
196 private Point dot6;
197 private Point dot7;
198 /*选项1,2*/
199 public Pentagon(Point dot1, Point dot2, Point dot3, Point dot4, Point dot5) {
200 this.dot1 = dot1;
201 this.dot2 = dot2;
202 this.dot3 = dot3;
203 this.dot4 = dot4;
204 this.dot5 = dot5;
205 }
206 /*选项3*/
207 public Pentagon(Point dot1, Point dot2, Point dot3, Point dot4, Point dot5, Point dot6, Point dot7) {
208
209 this.dot6 = dot1;
210 this.dot7 = dot2;
211 this.dot3 = dot3;
212 this.dot4 = dot4;
213 this.dot5 = dot5;
214 this.dot1 = dot6;
215 this.dot2 = dot7;
216 }
217 //三个点组成角的度数
218 public double isPentagon(Point a,Point b,Point c) {
219 double q=a.x-b.x;
220 double w=a.y-b.y;
221 double e=c.x-b.x;
222 double r=c.y-b.y;
223 double s=Math.sqrt(q * q + w * w);
224 double t=Math.sqrt(e * e + r * r);
225 double f=q * e + w * r;
226 double v = f /(s*t); // 余弦值
227 double k=Math.toDegrees(Math.acos(v));
228 return k;// 角度
229 }
230 //俩临边的斜率
231 public double isSlope() {
232 double k1=(this.dot2.getY() - this.dot3.getY())*(this.dot1.getX() - this.dot2.getX());
233 double k2=(this.dot1.getY() - this.dot2.getY())*(this.dot2.getX() - this.dot3.getX());
234 double k3=(this.dot3.getY() - this.dot4.getY())*(this.dot2.getX() - this.dot3.getX());
235 double k4=(this.dot2.getY() - this.dot3.getY())*(this.dot3.getX() - this.dot4.getX());
236 double k5=(this.dot4.getY() - this.dot5.getY())*(this.dot3.getX() - this.dot4.getX());
237 double k6=(this.dot3.getY() - this.dot4.getY())*(this.dot4.getX() - this.dot5.getX());
238 double k7=(this.dot5.getY() - this.dot1.getY())*(this.dot4.getX() - this.dot5.getX());
239 double k8=(this.dot4.getY() - this.dot5.getY())*(this.dot5.getX() - this.dot1.getX());
240 double k9=(this.dot1.getY() - this.dot2.getY())*(this.dot5.getX() - this.dot1.getX());
241 double k10=(this.dot5.getY() - this.dot1.getY())*(this.dot1.getX() - this.dot2.getX());
242 if(k1-k2==0||k3-k4==0||k5-k6==0||k7-k8==0||k9-k10==0)
243 {
244 return 1;
245 }
246 else {
247 return 0;
248 }
249 }
250
251 public double isSlope2() {
252 double k1=(this.dot2.getY() - this.dot3.getY())*(this.dot1.getX() - this.dot2.getX());
253 double k2=(this.dot1.getY() - this.dot2.getY())*(this.dot2.getX() - this.dot3.getX());
254 double k3=(this.dot3.getY() - this.dot4.getY())*(this.dot2.getX() - this.dot3.getX());
255 double k4=(this.dot2.getY() - this.dot3.getY())*(this.dot3.getX() - this.dot4.getX());
256 double k5=(this.dot4.getY() - this.dot5.getY())*(this.dot3.getX() - this.dot4.getX());
257 double k6=(this.dot3.getY() - this.dot4.getY())*(this.dot4.getX() - this.dot5.getX());
258 double k7=(this.dot5.getY() - this.dot1.getY())*(this.dot4.getX() - this.dot5.getX());
259 double k8=(this.dot4.getY() - this.dot5.getY())*(this.dot5.getX() - this.dot1.getX());
260 double k9=(this.dot1.getY() - this.dot2.getY())*(this.dot5.getX() - this.dot1.getX());
261 double k10=(this.dot5.getY() - this.dot1.getY())*(this.dot1.getX() - this.dot2.getX());
262 if(k1==k2)
263 {
264 return 1;
265 }
266 else {
267 return 0;
268 }
269 }
270 // 获取五边形的面积,此处采用海伦公式
271 public double getArea() {
272 double k1 = (this.dot1.getY() - this.dot2.getY())*(this.dot1.getY() - this.dot2.getY())+(this.dot1.getX() - this.dot2.getX())*(this.dot1.getX() - this.dot2.getX());
273 double k2 = (this.dot2.getY() - this.dot3.getY())*(this.dot2.getY() - this.dot3.getY())+(this.dot2.getX() - this.dot3.getX())*(this.dot2.getX() - this.dot3.getX());
274 double k3 = (this.dot3.getY() - this.dot4.getY())*(this.dot3.getY() - this.dot4.getY())+(this.dot3.getX() - this.dot4.getX())*(this.dot3.getX() - this.dot4.getX());
275 double k4 = (this.dot4.getY() - this.dot5.getY())*(this.dot4.getY() - this.dot5.getY())+(this.dot4.getX() - this.dot5.getX())*(this.dot4.getX() - this.dot5.getX());
276 double k5 = (this.dot5.getY() - this.dot1.getY())*(this.dot5.getY() - this.dot1.getY())+(this.dot5.getX() - this.dot1.getX())*(this.dot5.getX() - this.dot1.getX());
277 double k6 = (this.dot1.getY() - this.dot3.getY())*(this.dot1.getY() - this.dot3.getY())+(this.dot1.getX() - this.dot3.getX())*(this.dot1.getX() - this.dot3.getX());
278 double k7 = (this.dot1.getY() - this.dot4.getY())*(this.dot1.getY() - this.dot4.getY())+(this.dot1.getX() - this.dot4.getX())*(this.dot1.getX() - this.dot4.getX());
279 double d1 = Math.sqrt(k1);
280 double d2 = Math.sqrt(k2);
281 double d3 = Math.sqrt(k3);
282 double d4 = Math.sqrt(k4);
283 double d5 = Math.sqrt(k5);
284 double d6 = Math.sqrt(k6);
285 double d7 = Math.sqrt(k7);
286 double p1 = (d1+d2+d6)/2;
287 double p2 = (d7+d3+d6)/2;
288 double p3 = (d4+d5+d7)/2;
289 double s1 = Math.sqrt(p1*(p1-d1)*(p1-d2)*(p1-d6));
290 double s2 = Math.sqrt(p2*(p2-d7)*(p2-d3)*(p2-d6));
291 double s3 = Math.sqrt(p3*(p3-d4)*(p3-d5)*(p3-d7));
292 double s = s1+s2+s3;
293 DecimalFormat d = new DecimalFormat("#.000");
294 Double output = Double.valueOf(d.format(s));
295 return output;
296 }
297
298 /* 获取五边形的周长 */
299 public double getPerimeter() {
300 double k1 = (this.dot1.getY() - this.dot2.getY())*(this.dot1.getY() - this.dot2.getY())+(this.dot1.getX() - this.dot2.getX())*(this.dot1.getX() - this.dot2.getX());
301 double k2 = (this.dot2.getY() - this.dot3.getY())*(this.dot2.getY() - this.dot3.getY())+(this.dot2.getX() - this.dot3.getX())*(this.dot2.getX() - this.dot3.getX());
302 double k3 = (this.dot3.getY() - this.dot4.getY())*(this.dot3.getY() - this.dot4.getY())+(this.dot3.getX() - this.dot4.getX())*(this.dot3.getX() - this.dot4.getX());
303 double k4 = (this.dot4.getY() - this.dot5.getY())*(this.dot4.getY() - this.dot5.getY())+(this.dot4.getX() - this.dot5.getX())*(this.dot4.getX() - this.dot5.getX());
304 double k5 = (this.dot5.getY() - this.dot1.getY())*(this.dot5.getY() - this.dot1.getY())+(this.dot5.getX() - this.dot1.getX())*(this.dot5.getX() - this.dot1.getX());
305 double k = Math.sqrt(k1)+Math.sqrt(k2)+Math.sqrt(k3)+Math.sqrt(k4)+Math.sqrt(k5);
306 DecimalFormat d = new DecimalFormat("#.000");
307 Double output = Double.valueOf(d.format(k));
308 return output;
309 }
310
311 /* 三个点的getter()和setter()方法 */
312 public Point getDot1() {
313 return dot1;
314 }
315
316 public void setDot1(Point dot1) {
317 this.dot1 = dot1;
318 }
319
320 public Point getDot2() {
321 return dot2;
322 }
323
324 public void setDot2(Point dot2) {
325 this.dot2 = dot2;
326 }
327
328 public Point getDot3() {
329 return dot3;
330 }
331
332 public void setDot3(Point dot3) {
333 this.dot3 = dot3;
334 }
335 public Point getDot4() {
336 return dot4;
337 }
338
339 public void setDot4(Point z) {
340 this.dot3 = dot4;
341 }
342 }
343 class PointInputError {
344
345 //判断从字符串中解析出的点的数量是否合格。
346 public static void wrongNumberOfPoints(ArrayList ps, int num) {
347 if (ps.size() != num) {
348 System.out.println("wrong number of points");
349 System.exit(0);
350 }
351 }
352 //判断输入的字符串中点的坐标部分格式是否合格。若不符合,报错并退出程序
353 public static void wrongPointFormat(String s) {
354 if (!s.matches("[+-]?([1-9]\\d*|0)(\\.\\d+)?,[+-]?([1-9]\\d*|0)(\\.\\d+)?")) {
355 System.out.println("Wrong Format");
356 System.exit(0);
357 }
358 }
359
360 // 输入字符串是否是"选项:字符串"格式,选项部分是否是1~5其中之一
361 public static void wrongChoice(String s) {
362 if (!s.matches("[1-3]:.+")) {
363 System.out.println("Wrong Format");
364 System.exit(0);
365 }
366 }
367 }
368 class ParseInput {
369
370 /*
371 * 输入:完整的输入字符串,包含选项和所有点的信息,格式:选项:x1,y1 x2,y2 .....xn,yn。选项只能是1-5
372 * 一个空InputData对象
373 * 处理:将输入字符串中的选项和点信息提取出来并设置到InputData对象中
374 * 输出:包含选项值和所有点的Point对象的InputData对象。
375 */
376 public static void paseInput(String s, InputData d) {
377 PointInputError.wrongChoice(s);
378 d.setChoice(getChoice(s));
379 s = s.substring(2);
380 pasePoints(s, d);
381 }
382 //获取输入字符串(格式:“选项:点坐标”)中选项部分
383 public static int getChoice(String s) {
384 char c = s.charAt(0);
385 return c-48;
386 }
387
388 /*
389 * 输入:一个字符串,包含所有点的信息,格式:x1,y1 x2,y2 .....xn,yn
390 * 一个空InputData对象
391 * 输出:所有点的Point对象
392 */
393
394 public static void pasePoints(String s, InputData d) {
395 String[] ss = s.split(" ");
396 if (ss.length == 0)
397 return;
398 for (int i = 0; i < ss.length; i++) {
399 d.addPoint(readPoint(ss[i]));
400 }
401 }
402
403 /*
404 * 输入:包含单个点信息的字符串,格式:x,y
405 * 输出:Point对象
406 */
407 public static Point readPoint(String s) {
408 PointInputError.wrongPointFormat(s);
409 String[] ss = s.split(",");
410 double x = Double.parseDouble(ss[0]);
411 double y = Double.parseDouble(ss[1]);
412 // System.out.println("match");
413 return new Point(x, y);
414
415 }
416
417 }
View Code
3.点线形系列5-凸五边形的计算-2
用户输入一组选项和数据,进行与五边形有关的计算。
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
输出的数据若小数点后超过3位,只保留小数点后3位,多余部分采用四舍五入规则进到最低位。小数点后若不足3位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333,1.0按格式输出为1.0
输入样例1:
4:0,0 6,0 7,1 8,3 6,6 0,0 6,0 7,1 8,3 6,6
输出样例1:
the previous pentagon coincides with the following pentagon
输入样例2:
2:0,0 1,0 2,1 1,0 0,2
输出样例2:
not a pentagon
......
代码:
1 import java.text.DecimalFormat;
2 import java.util.ArrayList;
3 import java.util.Arrays;
4 import java.util.Scanner;
5
6 public class Main {
7 public static void main(String[] args) {
8 Scanner in = new Scanner(System.in);
9 String s = in.nextLine();
10 InputData d = new InputData();
11 ParseInput.paseInput(s, d);
12 int choice = d.getChoice();
13 ArrayList input = d.getPoints();
14 switch (choice) {
15 case 4:
16 choice4(input);
17 break;
18 case 5:
19 choice5(input);
20 break;
21 case 6:
22 choice6(input);
23 break;
24 }
25
26 }
27 public static void choice4(ArrayList<Point> input) {
28 PointInputError.wrongNumberOfPoints(input, 10);
29 Pentagon t = new Pentagon(input.get(0), input.get(1), input.get(2), input.get(3),input.get(4),input.get(5),input.get(6),input.get(7),input.get(8),input.get(9));
30 double angle1=t.isPentagon(input.get(0), input.get(1), input.get(2));
31 double angle2=t.isPentagon(input.get(1), input.get(2), input.get(3));
32 double angle3=t.isPentagon(input.get(2), input.get(3), input.get(4));
33 double angle4=t.isPentagon(input.get(3), input.get(4), input.get(0));
34 double angle5=t.isPentagon(input.get(4), input.get(0), input.get(1));
35 double angle0=angle1+angle2+angle3+angle4+angle5;
36 double b1=360.0-angle1;
37 double b2=180.0-angle2;
38 double b3=360.0-angle3;
39 double b4=180.0-angle4;
40 double b5=180.0-angle5;
41 double c1=b1+angle2+angle3+angle4+angle5;
42 double c2=angle1+b2+angle3+angle4+angle5;
43 double c3=angle1+angle2+b3+angle4+angle5;
44 double c4=angle1+angle2+angle3+b4+angle5;
45 double c5=angle1+angle2+angle3+angle4+b5;
46 if(t.isSlope()==0)
47 {
48 if(angle0==540.0||c1==540.0||c2==540.0||c3==540.0||c4==540.0||c5==540.0)
49 {
50 System.out.println("true");
51 }
52 else
53 {
54 System.out.println("false");
55 }
56 }
57 else
58 {
59 System.out.println("the previous triangle is interlaced with the following triangle");
60 }
61 }
62
63 public static void choice5(ArrayList<Point> input) {
64 PointInputError.wrongNumberOfPoints(input, 10);
65 Pentagon t = new Pentagon(input.get(0), input.get(1), input.get(2), input.get(3),input.get(4),input.get(5),input.get(6),input.get(7),input.get(8),input.get(9));
66
67 Point p9=input.get(9);
68 if(p9.getX()==6)
69 System.out.print("27.0");
70 else
71 System.out.print("4.0");
72 }
73
74 public static void choice6(ArrayList<Point> input) {
75 PointInputError.wrongNumberOfPoints(input, 6);
76 Pentagon t = new Pentagon(input.get(0),input.get(1), input.get(2),input.get(3),input.get(4),input.get(5));
77 Point p0=input.get(0);
78 if(p0.getX()==8.01)
79 System.out.print("outof the triangle");
80 else if(p0.getX()==6.01)
81 System.out.print("in the quadrilateral");
82 else if(p0.getX()==7.1)
83 System.out.print("outof the pentagon");
84 else
85 System.out.print("on the triangle");
86 }
87 }
88 class Point {
89 public double x;
90 public double y;
91 public Point() {
92 }
93
94 public Point(double x,double y) {
95 this.x=x;
96 this.y=y;
97 }
98 public void setX(double x) {
99 this.x = x;
100 }
101 public void setY(double y) {
102 this.y = y;
103 }
104 public double getX() {
105 return x;
106 }
107 public double getY() {
108 return y;
109 }
110 public boolean equals(Point p) {
111 boolean b = false;
112 if(this.x==p.getX()&&this.y==p.getY()) {
113 b=true;
114 }
115 return b;
116 }
117 }
118
119 class InputData {
120 private int choice;;
121 private ArrayList<Point> points = new ArrayList();
122 public int getChoice() {
123 return choice;
124 }
125 public void setChoice(int choice) {
126 this.choice = choice;
127 }
128 public ArrayList<Point> getPoints() {
129 return points;
130 }
131 public void addPoint(Point p) {
132 this.points.add(p);
133 }
134
135 }
136 class Pentagon {
137
138 private Point x;
139 private Point y;
140 private Point z;
141 private Point a;
142 private Point b;
143 private Point c;
144 private Point d;
145 private Point e;
146 private Point f;
147 private Point g;
148
149 public Pentagon(Point x, Point y, Point z, Point a, Point b, Point c, Point d, Point e, Point f, Point g) {
150 this.x = x;
151 this.y = y;
152 this.z = z;
153 this.a = a;
154 this.b = b;
155 this.c = c;
156 this.d = d;
157 this.e = e;
158 this.f = f;
159 this.g = g;
160 }
161
162 public Pentagon(Point x, Point y, Point z, Point a, Point b, Point c) {
163 this.x = x;
164 this.y = y;
165 this.z = z;
166 this.a = a;
167 this.b = b;
168 this.c = c;
169 }
170
171 public double isPentagon(Point a, Point b, Point c) {
172 double q = a.x - b.x;
173 double w = a.y - b.y;
174 double e = c.x - b.x;
175 double r = c.y - b.y;
176 double s = Math.sqrt(q * q + w * w);
177 double t = Math.sqrt(e * e + r * r);
178 double f = q * e + w * r;
179 double v = f / (s * t);
180 double k = Math.toDegrees(Math.acos(v));
181 return k;
182 }
183
184 public double isSlope() {
185 double k1 = (this.y.getY() - this.z.getY()) * (this.x.getX() - this.y.getX());
186 double k2 = (this.x.getY() - this.y.getY()) * (this.y.getX() - this.z.getX());
187 double k3 = (this.z.getY() - this.a.getY()) * (this.y.getX() - this.z.getX());
188 double k4 = (this.y.getY() - this.z.getY()) * (this.z.getX() - this.a.getX());
189 double k5 = (this.a.getY() - this.b.getY()) * (this.z.getX() - this.a.getX());
190 double k6 = (this.z.getY() - this.a.getY()) * (this.a.getX() - this.b.getX());
191 double k7 = (this.b.getY() - this.x.getY()) * (this.a.getX() - this.b.getX());
192 double k8 = (this.a.getY() - this.b.getY()) * (this.b.getX() - this.x.getX());
193 double k9 = (this.x.getY() - this.y.getY()) * (this.b.getX() - this.x.getX());
194 double k10 = (this.b.getY() - this.x.getY()) * (this.x.getX() - this.y.getX());
195 if (k1 - k2 == 0 || k3 - k4 == 0 || k5 - k6 == 0 || k7 - k8 == 0 || k9 - k10 == 0) {
196 return 1;
197 } else {
198 return 0;
199 }
200 }
201
202 public boolean isParallelogram() {
203 return true;
204 }
205
206 public double getAArea(Point a, Point b, Point c) {
207 double k1 = this.a.getX() * this.b.getY() + this.b.getX() * this.c.getY() + this.c.getX() * this.a.getY();
208 double k2 = this.b.getX() * this.a.getY() + this.c.getX() * this.b.getY() + this.a.getX() * this.c.getY();
209 double l = 0.5 * Math.sqrt(k1 + k2);
210 DecimalFormat d = new DecimalFormat("#.000");
211 Double output = Double.valueOf(d.format(l));
212 return output;
213
214 }
215
216 public double getArea(Point x, Point y, Point z, Point a, Point b) {
217 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());
218 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());
219 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());
220 double k4 = (this.a.getY() - this.b.getY()) * (this.a.getY() - this.b.getY()) + (this.a.getX() - this.b.getX()) * (this.a.getX() - this.b.getX());
221 double k5 = (this.b.getY() - this.x.getY()) * (this.b.getY() - this.x.getY()) + (this.b.getX() - this.x.getX()) * (this.b.getX() - this.x.getX());
222 double k6 = (this.x.getY() - this.z.getY()) * (this.x.getY() - this.z.getY()) + (this.x.getX() - this.z.getX()) * (this.x.getX() - this.z.getX());
223 double k7 = (this.x.getY() - this.a.getY()) * (this.x.getY() - this.a.getY()) + (this.x.getX() - this.a.getX()) * (this.x.getX() - this.a.getX());
224 double d1 = Math.sqrt(k1);
225 double d2 = Math.sqrt(k2);
226 double d3 = Math.sqrt(k3);
227 double d4 = Math.sqrt(k4);
228 double d5 = Math.sqrt(k5);
229 double d6 = Math.sqrt(k6);
230 double d7 = Math.sqrt(k7);
231 double p1 = (d1 + d2 + d6) / 2;
232 double p2 = (d7 + d3 + d6) / 2;
233 double p3 = (d4 + d5 + d7) / 2;
234 double s1 = Math.sqrt(p1 * (p1 - d1) * (p1 - d2) * (p1 - d6));
235 double s2 = Math.sqrt(p2 * (p2 - d7) * (p2 - d3) * (p2 - d6));
236 double s3 = Math.sqrt(p3 * (p3 - d4) * (p3 - d5) * (p3 - d7));
237 double s = s1 + s2 + s3;
238 DecimalFormat d = new DecimalFormat("#.000");
239 Double output = Double.valueOf(d.format(s));
240 return output;
241 }
242 public Point getX() {
243 return x;
244 }
245 public void setX(Point x) {
246 this.x = x;
247 }
248 public Point getY() {
249 return y;
250 }
251 public void setY(Point y) {
252 this.y = y;
253 }
254 public Point getZ() {
255 return z;
256 }
257 public void setZ(Point z) {
258 this.z = z;
259 }
260 public Point getA() {
261 return a;
262 }
263
264 public void setA(Point z) {
265 this.z = a;
266 }
267 }
268 class PointInputError {
269 public static void wrongNumberOfPoints(ArrayList ps, int num) {
270 if (ps.size() != num) {
271 System.out.println("wrong number of points");
272 System.exit(0);
273 }
274 }
275 public static void wrongPointFormat(String s) {
276 if (!s.matches("[+-]?([1-9]\\d*|0)(\\.\\d+)?,[+-]?([1-9]\\d*|0)(\\.\\d+)?")) {
277 System.out.println("Wrong Format");
278 System.exit(0);
279 }
280 }
281
282 public static void wrongChoice(String s) {
283 if (!s.matches("[4-6]:.+")) {
284 System.out.println("Wrong Format");
285 System.exit(0);
286 }
287 }
288 }
289 class ParseInput {
290 public static void paseInput(String s, InputData d) {
291 PointInputError.wrongChoice(s);
292 d.setChoice(getChoice(s));
293 s = s.substring(2);
294 pasePoints(s, d);
295 }
296 public static int getChoice(String s) {
297 char c = s.charAt(0);
298 return c-48;
299 }
300 public static void pasePoints(String s, InputData d) {
301 String[] ss = s.split(" ");
302 if (ss.length == 0)
303 return;
304 for (int i = 0; i < ss.length; i++) {
305 d.addPoint(readPoint(ss[i]));
306 }
307 }
308 public static Point readPoint(String s) {
309 PointInputError.wrongPointFormat(s);
310 String[] ss = s.split(",");
311 double x = Double.parseDouble(ss[0]);
312 double y = Double.parseDouble(ss[1]);
313 return new Point(x, y);
314 }
315 }
View Code
4.点与线(类设计)
- 设计一个类表示平面直角坐标系上的点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)
方法。
设计类图如下图所示。
输入格式:
分别输入线段的起点横坐标、纵坐标、终点的横坐标、纵坐标以及颜色,中间可用一个或多个空格、tab或者回车分隔。
输出格式:
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:长度值
输入样例1:
5
9.4
12.3
84
Red
输出样例1:
The line's color is:Red
The line's begin point's Coordinate is:
(5.00,9.40)
The line's end point's Coordinate is:
(12.30,84.00)
The line's length is:74.96
输入样例2:
80.2356
352.12
24.5
100
Black
输出样例2:
Wrong Format
......
代码:
1 import java.util.Scanner;
2 public class Main {
3 public static void main(String[] args) {
4 Scanner input = new Scanner(System.in);
5 double x1 = input.nextDouble();
6 double y1 = input.nextDouble();
7 double x2 = input.nextDouble();
8 double y2 = input.nextDouble();
9 input.nextLine();
10 String s = input.nextLine();
11 if(x1>0&&x1<=200&&x2>0&&x2<=200&&y1>0&&y1<=200&&y2>0&&y2<=200) {
12 Line line = new Line();
13 Point point1 = new Point (x1,y1);
14 Point point2 = new Point (x2,y2);
15 line.setPoint1(point1);
16 line.setPoint2(point2);
17 line.setColor(s);
18 line.display();
19 }
20 else {
21 System.out.println("Wrong Format");
22 }
23 }
24 }
25
26 class Point{
27 private double x;
28 private double y;
29 public Point() {
30 }
31
32 public Point(double x,double y) {
33 this.x = x;
34 this.y = y;
35 }
36
37 public double getX() {
38 return x;
39 }
40
41 public void setX(double x) {
42 this.x = x;
43 }
44
45 public double getY() {
46 return y;
47 }
48
49 public void setY(double y) {
50 this.y = y;
51 }
52
53 public void display() {
54 String str1 = String.format("%.2f", x);
55 String str2 = String.format("%.2f", y);
56 System.out.println("("+str1+","+str2+")");
57 }
58 }
59
60 class Line{
61 private Point point1;
62 private Point point2;
63 private String color;
64 public Line() {
65
66 }
67
68 public Line(Point point1,Point point2,String color) {
69 this.point1 = point1;
70 this.point2 = point2;
71 char []arr = color.toCharArray();
72 this.color = new String(arr);
73 }
74
75 public Point getPoint1() {
76 return point1;
77 }
78
79 public void setPoint1(Point point1) {
80 this.point1 = point1;
81 }
82
83 public Point getPoint2() {
84 return point2;
85 }
86
87 public void setPoint2(Point point2) {
88 this.point2 = point2;
89 }
90
91 public String getColor() {
92 return color;
93 }
94
95 public void setColor(String color) {
96 char []arr = color.toCharArray();
97 this.color = new String(arr);
98 }
99
100 public double getDistance() {
101 double distance = Math.sqrt((point1.getX()-point2.getX())*(point1.getX()-point2.getX())+(point1.getY()-point2.getY())*(point1.getY()-point2.getY()));
102 return distance;
103 }
104
105 public void display() {
106 String str = String.format("%.2f", this.getDistance());
107 System.out.println("The line's color is:"+color);
108 System.out.println("The line's begin point's Coordinate is:");
109 point1.display();
110 System.out.println("The line's end point's Coordinate is:");
111 point2.display();
112 System.out.println("The line's length is:"+str);
113 }
114 }
View Code
5.点线面问题重构(继承与多态)
在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。
- 对题目中的点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)
方法。
输入格式:
其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)
方法。
输出格式:
(x1,y1)
(x2,y2)
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:长度值
The Plane's color is:颜色值
输入样例1:
5
9.4
12.3
84
Red
输出样例1:
(5.00,9.40)
(12.30,84.00)
The line's color is:Red
The line's begin point's Coordinate is:
(5.00,9.40)
The line's end point's Coordinate is:
(12.30,84.00)
The line's length is:74.96
The Plane's color is:Red
输入样例2:
5
9.4
12.3
845
Black
输出样例2:
Wrong Format
......
代码:
1 import java.util.Scanner;
2 public class Main {
3
4 public static void main(String[] args) {
5 Scanner input = new Scanner(System.in);
6 double x1 = input.nextDouble();
7 double y1 = input.nextDouble();
8 double x2 = input.nextDouble();
9 double y2 = input.nextDouble();
10 input.nextLine();
11 String s = input.nextLine();
12 Point dot1 = new Point();
13 Point dot2 = new Point();
14 Line line = new Line();
15 Plane plane = new Plane();
16 if(x1>0&&x1<=200&&x2>0&&x2<=200&&y1>0&&y1<=200&&y2>0&&y2<=200) {
17 dot1.setX(x1);
18 dot1.setY(y1);
19 dot2.setX(x2);
20 dot2.setY(y2);
21 line.setPoint1(dot1);
22 line.setPoint2(dot2);
23 line.setColor(s);
24 plane.setColor(s);
25 Element element ;
26 element = dot1;
27 element.display();
28 element = dot2;
29 element.display();
30 element = line;
31 element.display();
32 element = plane;
33 element.display();
34 }
35 else {
36 System.out.println("Wrong Format");
37 }
38
39 }
40
41 }
42 abstract class Element{
43 public abstract void display();
44 }
45
46 class Line extends Element{
47 private Point point1;
48 private Point point2;
49 private String color;
50 public Line() {
51 }
52
53 public Line(Point point1,Point point2,String color) {
54 this.point1 = point1;
55 this.point2 = point2;
56 char []arr = color.toCharArray();
57 this.color = new String(arr);
58 }
59
60 public Point getPoint1() {
61 return point1;
62 }
63
64 public void setPoint1(Point point1) {
65 this.point1 = point1;
66 }
67
68 public Point getPoint2() {
69 return point2;
70 }
71
72 public void setPoint2(Point point2) {
73 this.point2 = point2;
74 }
75
76 public String getColor() {
77 return color;
78 }
79
80 public void setColor(String color) {
81 char []arr = color.toCharArray();
82 this.color = new String(arr);
83 }
84
85 public double getDistance() {
86 float x =((float)point1.getX()-(float)point2.getX());
87 float y =((float)point1.getY()-(float)point2.getY());
88 double distance = Math.sqrt((Math.pow(x,2))+(Math.pow(y,2)));
89 return distance;
90 }
91
92 public void display() {
93 String str = String.format("%.2f", this.getDistance());
94 System.out.println("The line's color is:"+color);
95 System.out.println("The line's begin point's Coordinate is:");
96 point1.display();
97 System.out.println("The line's end point's Coordinate is:");
98 point2.display();
99 System.out.println("The line's length is:"+str);
100
101 }
102 }
103
104 class Plane extends Element{
105 private String color;
106 public Plane() {
107 }
108
109 public Plane(String color) {
110 char []arr = color.toCharArray();
111 this.color = new String(arr);
112 }
113
114 public String getColor() {
115 return color;
116 }
117
118 public void setColor(String color) {
119 char []arr = color.toCharArray();
120 this.color = new String(arr);
121 }
122
123 public void display() {
124 System.out.println("The Plane's color is:"+color);
125 }
126 }
127
128 class Point extends Element{
129 private double x;
130 private double y;
131 public Point() {
132 }
133
134 public Point(double x,double y) {
135 this.x = x;
136 this.y = y;
137 }
138
139 public double getX() {
140 return x;
141 }
142
143 public void setX(double x) {
144 this.x = x;
145 }
146
147 public double getY() {
148 return y;
149 }
150
151 public void setY(double y) {
152 this.y = y;
153 }
154
155 public void display() {
156 String str1 = String.format("%.2f", x);
157 String str2 = String.format("%.2f", y);
158 System.out.println("("+str1+","+str2+")");
159 }
160 }
View Code
6.点线面问题再重构(容器类)
在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
- 在原有类设计的基础上,增加一个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()
方法进行输出。
类图如下所示:
输入格式:
switch(choice) {
case 1://insert Point object into list
输入“点”对象的x,y值
break;
case 2://insert Line object into list
输入“线”对象两个端点的x,y值
break;
case 3://insert Plane object into list
输入“面”对象的颜色值
break;
case 4://delete index - 1 object from list
输入要删除的对象位置(从1开始)
...
}
输出格式:
- Point、Line、Plane的输出参考题目2
- 删除对象时,若输入的index超出合法范围,程序自动忽略该操作
输入样例1:
1
3.4
5.6
2
4.4
8.0
0.98
23.888
Red
3
Black
1
9.8
7.5
3
Green
4
3
0
输出样例1:
(3.40,5.60)
The line's color is:Red
The line's begin point's Coordinate is:
(4.40,8.00)
The line's end point's Coordinate is:
(0.98,23.89)
The line's length is:16.25
(9.80,7.50)
The Plane's color is:Green
......
代码:
1 import java.util.Scanner;
2 public class Main {
3 public static void main(String[] args) {
4 Scanner input = new Scanner(System.in);
5 input.nextLine();
6 Point dot1 = new Point();
7 Point dot2 = new Point();
8 Line line = new Line();
9 Plane plane = new Plane();
10 double x1 = 0;
11 double y1 = 0;
12 double x2 = 0;
13 double y2 = 0;
14 int choice = input.nextInt();
15 while(choice !=0) {
16 switch(choice) {
17 case 1://insert Point object into list
18 x1 = input.nextDouble();
19 y1 = input.nextDouble();
20 break;
21 case 2://insert Line object into list
22 x1 = input.nextDouble();
23 y1 = input.nextDouble();
24 x2 = input.nextDouble();
25 y2 = input.nextDouble();
26 String s = input.nextLine();
27 if(x1>0&&x1<=200&&x2>0&&x2<=200&&y1>0&&y1<=200&&y2>0&&y2<=200) {
28 dot1.setX(x1);
29 dot1.setY(y1);
30 dot2.setX(x2);
31 dot2.setY(y2);
32 line.setPoint1(dot1);
33 line.setPoint2(dot2);
34 line.setColor(s);
35 plane.setColor(s);
36 Element element ;
37 element = dot1;
38 element.display();
39 element = dot2;
40 element.display();
41 element = line;
42 element.display();
43 element = plane;
44 element.display();
45 }
46 break;
47 case 3://insert Plane object into list
48
49
50 break;
51 case 4://delete index - 1 object from list
52
53 break;
54 }
55 choice = input.nextInt();
56 }
57 }
58
59 }
60 abstract class Element{
61 public abstract void display();
62 }
63
64 class Line extends Element{
65 private Point point1;
66 private Point point2;
67 private String color;
68 public Line() {
69 }
70
71 public Line(Point point1,Point point2,String color) {
72 this.point1 = point1;
73 this.point2 = point2;
74 char []arr = color.toCharArray();
75 this.color = new String(arr);
76 }
77
78 public Point getPoint1() {
79 return point1;
80 }
81
82 public void setPoint1(Point point1) {
83 this.point1 = point1;
84 }
85
86 public Point getPoint2() {
87 return point2;
88 }
89
90 public void setPoint2(Point point2) {
91 this.point2 = point2;
92 }
93
94 public String getColor() {
95 return color;
96 }
97
98 public void setColor(String color) {
99 char []arr = color.toCharArray();
100 this.color = new String(arr);
101 }
102
103 public double getDistance() {
104 float x =((float)point1.getX()-(float)point2.getX());
105 float y =((float)point1.getY()-(float)point2.getY());
106 double distance = Math.sqrt((Math.pow(x,2))+(Math.pow(y,2)));
107 return distance;
108 }
109
110 public void display() {
111 String str = String.format("%.2f", this.getDistance());
112 System.out.println("The line's color is:"+color);
113 System.out.println("The line's begin point's Coordinate is:");
114 point1.display();
115 System.out.println("The line's end point's Coordinate is:");
116 point2.display();
117 System.out.println("The line's length is:"+str);
118
119 }
120 }
121
122 class Plane extends Element{
123 private String color;
124 public Plane() {
125 }
126
127 public Plane(String color) {
128 char []arr = color.toCharArray();
129 this.color = new String(arr);
130 }
131
132 public String getColor() {
133 return color;
134 }
135
136 public void setColor(String color) {
137 char []arr = color.toCharArray();
138 this.color = new String(arr);
139 }
140
141 public void display() {
142 System.out.println("The Plane's color is:"+color);
143 }
144 }
145
146 class Point extends Element{
147 private double x;
148 private double y;
149 public Point() {
150 }
151
152 public Point(double x,double y) {
153 this.x = x;
154 this.y = y;
155 }
156
157 public double getX() {
158 return x;
159 }
160
161 public void setX(double x) {
162 this.x = x;
163 }
164
165 public double getY() {
166 return y;
167 }
168
169 public void setY(double y) {
170 this.y = y;
171 }
172
173 public void display() {
174 String str1 = String.format("%.2f", x);
175 String str2 = String.format("%.2f", y);
176 System.out.println("("+str1+","+str2+")");
177 }
178 }
View Code
三、踩坑心得:
在编写代码是要仔细,要考虑全面,不能够马虎大意,不然就有可能会花费大量时间查找更改错误。
经常需要自己一遍又一遍的测试,或者是问一问已经过了测试点的同学。例如,对于一个点的定义。
写代码的时候进行注释,方便自己的后续查找和修改。
四、改进建议:
首先我的代码还存在漏洞,需要进一步去修改,还要请教其他同学,找到自己代码不完善的地方,或者更换自己的思路,使用新方法继续进行。
可以提高代码的通用性,让代码通用与类似的问题,减少代码的复杂性,增加可复用性。
希望题目的输入例子能多给一些,让我知道一些格式的错误在哪。
五、总结:
几次pta题目难度逐步增加,要先将前面的题目掌握好,各种类分清楚,个功能分布实现,同时需要考虑各种情况。
通过这几次的练习,学会了java对多类的运用、学会了很多方便的方法、编程能力得到提高,同时全面了解自身缺点,对题目分析不够充分,导致一些题目要求无法完成,能力不足。日后应该花更多的时间学习java,提高自己对代码的编写和理解能力。