皓远的第二次博客作业(最新pta集,链表练习及期中考试总结)

2023-02-22,,

前言:

知识点运用:正则表达式,有关图形设计计算的表达式和算法,链表的相关知识,Java类的基础运用,继承、容器与多态。
题量:相较于上次作业,这几周在java方面的练习花了更多的精力和时间,所要完成的任务都变得更新颖复杂,难度也逐渐增加。

设计与分析:

(这里主要挑了一些重点,及对笔者而言难度较大及体会深刻的题目)

    PTA题目集题目小结:

  ①题目集四——7-2(线的计算):

  题目:

用户输入一组选项和数据,进行与直线有关的计算。选项包括:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。

输入格式:

基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。
例如:1:0,0 1,1
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
不论哪个选项,如果格式、点数量都符合要求,但构成任一条线的两个点坐标重合,输出"points coincide",

输出格式:

见题目描述。

这里笔者先给出自己的源码:

  1 import java.util.Scanner;
2
3 public class Main {
4
5
6 public static void main(String[] args) {
7 // TODO Auto-generated method stub
8 Scanner in = new Scanner(System.in);
9 String s = in.nextLine();
10
11 // 选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y
12 //输入的选项
13 int choice = Integer.parseInt(s.substring(0, 1));
14 if(!(choice >= 1 && choice <= 5))
15 {
16 System.out.print("Wrong Format");
17 System.exit(0);
18
19 }
20
21 //判断有无':',并位置有无错误。
22 if(s.charAt(1)!=':')
23 {
24 System.out.print("Wrong Format");
25 System.exit(0);
26 }
27 int bool1 = s.indexOf(':',2);
28 if(bool1 != -1)
29 {
30 System.out.print("Wrong Format");
31 System.exit(0);
32 }
33
34 switch(choice)
35 {
36 case 1://计算斜率
37 {
38 int index_char = s.indexOf(':');
39 int index_x1 = s.indexOf(',');
40 int index_x2 = s.indexOf(',', index_x1+1);
41 int index_null1 = s.indexOf(" ");
42
43 //判断0是否在首位
44 for(int i = 0; i<s.length(); i++)
45 {
46 if(s.charAt(i) == '0')
47 {
48 if(i<s.length()-2)
49 {
50 if(s.charAt(i+1)=='0')
51 {
52 System.out.print("Wrong Format");
53 System.exit(0);
54 }
55
56 if(s.charAt(i+1)>'0' && s.charAt(i+1)<='9')
57 {
58 System.out.print("Wrong Format");
59 System.exit(0);
60 }
61 }
62 }
63 }
64
65 //点的数量
66 if(index_null1 == -1)
67 {
68 System.out.print("Wrong Format");
69 System.exit(0);
70 }
71 int index_null2 = s.indexOf(" ", index_null1+1);
72 if(index_null2 !=-1)
73 {
74 System.out.println("wrong number of points");
75 System.exit(0);
76 }
77
78 //判断逗号数量是否不对
79 int sum_char = 0;
80 for(int i = 1; i<s.length(); i++)
81 {
82 if(s.charAt(i) == ',')
83 sum_char ++;
84 }
85 if(sum_char != 2 )
86 {
87 System.out.print("Wrong Format");
88 System.exit(0);
89 }
90 if(s.indexOf(',', index_null1) == -1)
91 {
92 System.out.print("Wrong Format");
93 System.exit(0);
94 }
95
96
97 double x1 = Double.parseDouble(s.substring(index_char+1, index_x1));
98 double y1 = Double.parseDouble(s.substring(index_x1+1, index_null1));
99 double x2 = Double.parseDouble(s.substring(index_null1+1, index_x2));
100 double y2 = Double.parseDouble(s.substring(index_x2+1, s.length()));
101
102 if(x1 == x2 && y1 == y2)
103 {
104 System.out.println("points coincide");
105 System.exit(0);
106 }
107
108 if(x1 == x2)
109 {
110 System.out.println("Slope does not exist");
111 System.exit(0);
112 }
113 double k = (y1-y2)/(x1-x2);
114 System.out.print(k);
115 }break;
116
117 case 2://求一点到一直线的垂直距离
118 {
119 int index_char = s.indexOf(':');
120 int index_x1 = s.indexOf(',');
121 int index_x2 = s.indexOf(',', index_x1+1);
122 int index_x3 = s.indexOf(',', index_x2+1);
123 int index_null1 = s.indexOf(" ");
124 int index_null2 = s.indexOf(" ", index_null1+1);
125
126 //判断0是否在首位
127 for(int i = 0; i<s.length(); i++)
128 {
129 if(s.charAt(i) == '0')
130 {
131 if(i<s.length()-2)
132 {
133 if(s.charAt(i+1)=='0')
134 {
135 System.out.print("Wrong Format");
136 System.exit(0);
137 }
138
139 if(s.charAt(i+1)>'0' && s.charAt(i+1)<='9')
140 {
141 System.out.print("Wrong Format");
142 System.exit(0);
143 }
144 }
145 }
146 }
147
148 //点的数量
149 if(index_null1 == -1 || index_null2 == -1)
150 {
151 System.out.println("wrong number of points");
152 System.exit(0);
153 }
154 int index_null3 = s.indexOf(" ", index_null2+1);
155 if(index_null3 !=-1)
156 {
157 System.out.println("wrong number of points");
158 System.exit(0);
159 }
160
161 //判断逗号数量是否不对
162 int sum_char = 0;
163 for(int i = 1; i<s.length(); i++)
164 {
165 if(s.charAt(i) == ',')
166 sum_char ++;
167 }
168 if(sum_char != 3 )
169 {
170 System.out.print("Wrong Format");
171 System.exit(0);
172 }
173 if(s.indexOf(',', index_null1) == -1)
174 {
175 System.out.print("Wrong Format");
176 System.exit(0);
177 }
178 if(s.indexOf(',', index_null2) == -1)
179 {
180 System.out.print("Wrong Format");
181 System.exit(0);
182 }
183
184
185 double x1 = Double.parseDouble(s.substring(index_char+1, index_x1));
186 double y1 = Double.parseDouble(s.substring(index_x1+1, index_null1));
187 double x2 = Double.parseDouble(s.substring(index_null1+1, index_x2));
188 double y2 = Double.parseDouble(s.substring(index_x2+1, index_null2));
189 double x3 = Double.parseDouble(s.substring(index_null2+1, index_x3));
190 double y3 = Double.parseDouble(s.substring(index_x3+1, s.length()));
191
192 // if(x1 == x2 && y1 == y2)
193 // {
194 // System.out.println("points coincide");
195 // System.exit(0);
196 // }
197 // if(x1 == x3 && y1 == y3)
198 // {
199 // System.out.println("points coincide");
200 // System.exit(0);
201 // }
202 if(x2 == x3 && y2 == y3)
203 {
204 System.out.println("points coincide");
205 System.exit(0);
206 }
207
208 double k1 = (y2-y1)/(x2-x1);
209 double k2 = (y3-y2)/(x3-x2);
210
211 if(k1 == k2)
212 {
213 System.out.print("0.0");
214 System.exit(0);
215 }
216 else
217 {
218 double a = Math.sqrt((Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2)));
219 double b = Math.sqrt((Math.pow((x1-x3), 2) + Math.pow((y1-y3), 2)));
220 double c = Math.sqrt((Math.pow((x2-x3), 2) + Math.pow((y2-y3), 2)));
221 double p = (a+b+c)/2;
222 double area = Math.sqrt(p*(p-a)*(p-b)*(p-c));//海伦公式
223 double distance = 2*area/c;
224 System.out.printf("%.1f",distance);
225 }
226
227 }break;
228
229 case 3://判断三点是否在同一条直线上
230 {
231 int index_char = s.indexOf(':');
232 int index_x1 = s.indexOf(',');
233 int index_x2 = s.indexOf(',', index_x1+1);
234 int index_x3 = s.indexOf(',', index_x2+1);
235 int index_null1 = s.indexOf(" ");
236 int index_null2 = s.indexOf(" ", index_null1+1);
237
238 //判断0是否在首位
239 for(int i = 0; i<s.length(); i++)
240 {
241 if(s.charAt(i) == '0')
242 {
243 if(i<s.length()-2)
244 {
245 if(s.charAt(i+1)=='0')
246 {
247 System.out.print("Wrong Format");
248 System.exit(0);
249 }
250
251 if(s.charAt(i+1)>'0' && s.charAt(i+1)<='9')
252 {
253 System.out.print("Wrong Format");
254 System.exit(0);
255 }
256 }
257 }
258 }
259
260 if(index_null1 == -1 || index_null2 == -1)
261 {
262 System.out.print("Wrong Format");
263 System.exit(0);
264 }
265 int index_null3 = s.indexOf(" ", index_null2+1);
266 if(index_null3 !=-1)
267 {
268 System.out.println("wrong number of points");
269 System.exit(0);
270 }
271
272 //判断逗号数量是否不对
273 int sum_char = 0;
274 for(int i = 1; i<s.length(); i++)
275 {
276 if(s.charAt(i) == ',')
277 sum_char ++;
278 }
279 if(sum_char != 3 )
280 {
281 System.out.print("Wrong Format");
282 System.exit(0);
283 }
284 if(s.indexOf(',', index_null1) == -1)
285 {
286 System.out.print("Wrong Format");
287 System.exit(0);
288 }
289 if(s.indexOf(',', index_null2) == -1)
290 {
291 System.out.print("Wrong Format");
292 System.exit(0);
293 }
294
295
296
297 double x1 = Double.parseDouble(s.substring(index_char+1, index_x1));
298 double y1 = Double.parseDouble(s.substring(index_x1+1, index_null1));
299 double x2 = Double.parseDouble(s.substring(index_null1+1, index_x2));
300 double y2 = Double.parseDouble(s.substring(index_x2+1, index_null2));
301 double x3 = Double.parseDouble(s.substring(index_null2+1, index_x3));
302 double y3 = Double.parseDouble(s.substring(index_x3+1, s.length()));
303
304
305 if(x1 == x2 && y1 == y2)
306 {
307 System.out.println("points coincide");
308 System.exit(0);
309 }
310 if(x1 == x3 && y1 == y3)
311 {
312 System.out.println("points coincide");
313 System.exit(0);
314 }
315 if(x2 == x3 && y2 == y3)
316 {
317 System.out.println("points coincide");
318 System.exit(0);
319 }
320
321 double k1 = (y2-y1)/(x2-x1);
322 double k2 = (y3-y2)/(x3-x2);
323
324 if(k1 == k2)
325 {
326 System.out.print("true");
327 System.exit(0);
328 }
329 else
330 {
331 System.out.print("false");
332 System.exit(0);
333 }
334
335 }break;
336
337 case 4://判断两条直线是否平行
338 {
339 int index_char = s.indexOf(':');
340 int index_x1 = s.indexOf(',');
341 int index_x2 = s.indexOf(',', index_x1+1);
342 int index_x3 = s.indexOf(',', index_x2+1);
343 int index_x4 = s.indexOf(',', index_x3+1);
344 int index_null1 = s.indexOf(" ");
345 int index_null2 = s.indexOf(" ", index_null1+1);
346 int index_null3 = s.indexOf(" ", index_null2+1);
347
348 //判断0是否在首位
349 for(int i = 0; i<s.length(); i++)
350 {
351 if(s.charAt(i) == '0')
352 {
353 if(i<s.length()-2)
354 {
355 if(s.charAt(i+1)=='0')
356 {
357 System.out.print("Wrong Format");
358 System.exit(0);
359 }
360
361 if(s.charAt(i+1)>'0' && s.charAt(i+1)<='9')
362 {
363 System.out.print("Wrong Format");
364 System.exit(0);
365 }
366 }
367 }
368 }
369
370 if(index_null1 == -1 || index_null2 == -1 || index_null3 == -1)
371 {
372 System.out.print("Wrong Format");
373 System.exit(0);
374 }
375
376 //判断逗号数量是否不对
377 int sum_char = 0;
378 for(int i = 1; i<s.length(); i++)
379 {
380 if(s.charAt(i) == ',')
381 sum_char ++;
382 }
383 if(sum_char != 4 )
384 {
385 System.out.print("Wrong Format");
386 System.exit(0);
387 }
388 if(s.indexOf(',', index_null1) == -1)
389 {
390 System.out.print("Wrong Format");
391 System.exit(0);
392 }
393 if(s.indexOf(',', index_null2) == -1)
394 {
395 System.out.print("Wrong Format");
396 System.exit(0);
397 }
398 if(s.indexOf(',', index_null3) == -1)
399 {
400 System.out.print("Wrong Format");
401 System.exit(0);
402 }
403
404
405 double x1 = Double.parseDouble(s.substring(index_char+1, index_x1));
406 double y1 = Double.parseDouble(s.substring(index_x1+1, index_null1));
407 double x2 = Double.parseDouble(s.substring(index_null1+1, index_x2));
408 double y2 = Double.parseDouble(s.substring(index_x2+1, index_null2));
409 double x3 = Double.parseDouble(s.substring(index_null2+1, index_x3));
410 double y3 = Double.parseDouble(s.substring(index_x3+1, index_null3));
411 double x4 = Double.parseDouble(s.substring(index_null3+1, index_x4));
412 double y4 = Double.parseDouble(s.substring(index_x4+1, s.length()));
413
414 if(x1 == x2 && y1 == y2)
415 {
416 System.out.println("points coincide");
417 System.exit(0);
418 }
419 if(x3 == x4 && y3 == y4)
420 {
421 System.out.println("points coincide");
422 System.exit(0);
423 }
424
425 //斜率不存在
426 if(x1 == x2)
427 {
428 if(x3 == x4)
429 {
430 System.out.print("true");
431 System.exit(0);
432 }
433 else
434 {
435 System.out.print("false");
436 System.exit(0);
437 }
438 }
439 else if(x3 == x4)
440 {
441 if(x1 == x2)
442 {
443 System.out.print("true");
444 System.exit(0);
445 }
446 else
447 {
448 System.out.print("false");
449 System.exit(0);
450 }
451 }
452 else//斜率存在
453 {
454 double k1 = (y2-y1)/(x2-x1);
455 double k2 = (y4-y3)/(x4-x3);
456
457 if(k1 == k2)
458 {
459 System.out.print("true");
460 System.exit(0);
461 }
462 else
463 {
464 System.out.print("false");
465 System.exit(0);
466 }
467 }
468
469 }break;
470
471 case 5://求交点坐标
472 {
473 int index_char = s.indexOf(':');
474 int index_x1 = s.indexOf(',');
475 int index_x2 = s.indexOf(',', index_x1+1);
476 int index_x3 = s.indexOf(',', index_x2+1);
477 int index_x4 = s.indexOf(',', index_x3+1);
478 int index_null1 = s.indexOf(" ");
479 int index_null2 = s.indexOf(" ", index_null1+1);
480 int index_null3 = s.indexOf(" ", index_null2+1);
481
482 //判断0是否在首位
483 for(int i = 0; i<s.length(); i++)
484 {
485 if(s.charAt(i) == '0')
486 {
487 if(i<s.length()-2)
488 {
489 if(s.charAt(i+1)=='0')
490 {
491 System.out.print("Wrong Format");
492 System.exit(0);
493 }
494
495 if(s.charAt(i+1)>'0' && s.charAt(i+1)<='9')
496 {
497 System.out.print("Wrong Format");
498 System.exit(0);
499 }
500 }
501 }
502 }
503
504 if(index_null1 == -1 || index_null2 == -1 || index_null3 == -1)
505 {
506 System.out.print("Wrong Format");
507 System.exit(0);
508 }
509 int index_null4 = s.indexOf(" ", index_null3+1);
510 if(index_null4 !=-1)
511 {
512 System.out.println("wrong number of points");
513 System.exit(0);
514 }
515
516 //判断逗号数量是否不对
517 int sum_char = 0;
518 for(int i = 1; i<s.length(); i++)
519 {
520 if(s.charAt(i) == ',')
521 sum_char ++;
522 }
523 if(sum_char != 4 )
524 {
525 System.out.print("Wrong Format");
526 System.exit(0);
527 }
528 if(s.indexOf(',', index_null1) == -1)
529 {
530 System.out.print("Wrong Format");
531 System.exit(0);
532 }
533 if(s.indexOf(',', index_null2) == -1)
534 {
535 System.out.print("Wrong Format");
536 System.exit(0);
537 }
538 if(s.indexOf(',', index_null3) == -1)
539 {
540 System.out.print("Wrong Format");
541 System.exit(0);
542 }
543
544
545
546 float x1 = Float.parseFloat(s.substring(index_char+1, index_x1));
547 float y1 = Float.parseFloat(s.substring(index_x1+1, index_null1));
548 float x2 = Float.parseFloat(s.substring(index_null1+1, index_x2));
549 float y2 = Float.parseFloat(s.substring(index_x2+1, index_null2));
550 float x3 = Float.parseFloat(s.substring(index_null2+1, index_x3));
551 float y3 = Float.parseFloat(s.substring(index_x3+1, index_null3));
552 float x4 = Float.parseFloat(s.substring(index_null3+1, index_x4));
553 float y4 = Float.parseFloat(s.substring(index_x4+1, s.length()));
554
555 if(x1 == x2 && y1 == y2)
556 {
557 System.out.println("points coincide");
558 System.exit(0);
559 }
560 if(x3 == x4 && y3 == y4)
561 {
562 System.out.println("points coincide");
563 System.exit(0);
564 }
565
566
567 //斜率不存在
568 if(x1 == x2)
569 {
570 if(x3 == x4)
571 {
572 System.out.print("is parallel lines,have no intersection point");
573 System.exit(0);
574 }
575 else
576 {
577 float k2 = (y3-y4)/(x3-x4);
578 float b2 = (x3*y4-x4*y3)/(x3-x4);
579
580 float x = x1;
581 float y = k2*x + b2;
582 float min = x3;
583 if(min > x4)
584 {
585 min = x4;
586 }
587 if(min > x1)
588 {
589 min = x1;
590 }
591
592 float max = x3;
593 if(max < x4)
594 {
595 max = x4;
596 }
597 if(max < x1)
598 {
599 max = x1;
600 }
601
602 if(x>min && x<max)
603 {
604 System.out.print(x+","+y+" "+"true");
605 System.exit(0);
606 }
607 else
608 {
609 System.out.print(x+","+y+" "+"false");
610 System.exit(0);
611 }
612
613 }
614 }
615 else if(x3 == x4)
616 {
617 if(x1 == x2)
618 {
619 System.out.print("is parallel lines,have no intersection point");
620 System.exit(0);
621 }
622 else
623 {
624 float k1 = (y1-y2)/(x1-x2);
625 float b1 = (x1*y2-x2*y1)/(x1-x2);
626
627
628 float x = x3;
629 float y = k1*x + b1;
630 float min = x1;
631 if(min > x2)
632 {
633 min = x2;
634 }
635 if(min > x3)
636 {
637 min = x3;
638 }
639
640 float max = x1;
641 if(max < x2)
642 {
643 max = x2;
644 }
645 if(max < x3)
646 {
647 max = x3;
648 }
649
650 if(x>min && x<max)
651 {
652 System.out.print(x+","+y+" "+"true");
653 System.exit(0);
654 }
655 else
656 {
657 System.out.print(x+","+y+" "+"false");
658 System.exit(0);
659 }
660
661 }
662 }
663 else//斜率存在
664 {
665 float k1 = (y1-y2)/(x1-x2);
666 float b1 = (x1*y2-x2*y1)/(x1-x2);
667 float k2 = (y3-y4)/(x3-x4);
668 float b2 = (x3*y4-x4*y3)/(x3-x4);
669
670
671 if(k1==k2)
672 {
673 System.out.print("is parallel lines,have no intersection point");
674 System.exit(0);
675 }
676 float x = (b2-b1)/(k1-k2);
677 float y = (b2-b1)/(k1-k2)*k1 + b1;
678 float min1 = x1;
679 float min2 = x3;
680 if(min1 > x2)
681 {
682 min1 = x2;
683 }
684 if(min2 > x4)
685 {
686 min2 = x4;
687 }
688 float min = min1;
689 if(min > min2)
690 {
691 min = min2;
692 }
693
694 float max1 = x1;
695 float max2 = x3;
696 if(max1 < x2)
697 {
698 max1 = x2;
699 }
700 if(max2 < x4)
701 {
702 max2 = x4;
703 }
704 float max = max1;
705 if(max < max2)
706 {
707 max = max2;
708 }
709
710
711 if(x>min && x<max)
712 {
713 System.out.print(x+","+y+" "+"true");
714 System.exit(0);
715 }
716 else
717 {
718 System.out.print(x+","+y+" "+"false");
719 System.exit(0);
720 }
721
722 }
723
724 }break;
725 default:
726 {
727 System.out.print("Wrong Format");
728 System.exit(0);
729 }
730 }
731
732
733 }
734
735 }

题目分析:题目的要求是比较直接的(只要按照题目的要求写过去,拿个30多分是没有问题的),笔者认为,主要难点有两个:i:信息的输入问题,如何从输入中得到

需要的信息及判断输入格式是否错误(这里笔者了解的有两个方向,正则表达式和字符串操作),这一点大家按照自己第一题的写法去写是没有什么大问题的。 ii:格式输

入错误的测试点,不知道大家是不是和笔者一样,将题目所有要求的代码实现了,题目所给的测试用例都通过了,但就是有一两个格式错误的测试点不能通过。可以这样说,

笔者在这题写代码花了半天,改bug卡了两天。最终,是因为一次偶然的机会,随便输入的一个样例测试(1: -3 ,01 -1,+1)发现结果不是输出wrong format,于是根据这个样例修改代码,

终于拿到了满分。

代码思路分析:这里笔者对正则表达式还不太熟练,因此对像这样类似的输入一整行数据,笔者是通过字符串操作切割提取出需要的的选项及坐标信息,进行一系列

的计算及操作。因此,按这种想法,思路是比较直接的(直接按题目要求一步一步写过去即可),写起来比较简单,但是代码重复很多,很多代码基本上都是复制前面

写好的代码粘贴过来的。也有很大一部分原因是笔者比较懒,不想将专门判断输入格式,及获取坐标信息的代码单独提出来专门做一个类或者方法,这样的话至少能

减少三百行代码。

踩坑心得:由于这题其实题目想法比较简单,只要耐着性子一步一步写过去其实都没有什么大问题的,所以笔者其实没有碰到什么很大的坑,唯一想说的就是,大家

写代码时可以多运用自己曾经学过的知识(尤其是数学),这样可以扩展你的思路。

例如:题目要求的第二点,如何求得点到直线的距离呢?

这里笔者刚开始的想法是用点到直线的距离公式,但再想一下发现不对,这样求直线的公式太麻烦了,再转念一想,求点到直线的距离不就是求这个点到已知线段

组成的三角形的高吗?三角形的高不就是面积的两倍除以这条已知线段的长度吗?已知线段的长度是非常好求的,那三角形的面积呢?笔者刚开始脑海中闪过的就是

初中学过的海伦公式,于是说干就干,这样,第二点就什么障碍都没了。

改进建议:就像笔者前面分析说的,如果将专门判断输入格式,及获取坐标信息的代码单独提出来专门做一个类或者方法,可以大大地减少代码。

 1 int index_char = s.indexOf(':');
2 int index_x1 = s.indexOf(',');
3 int index_x2 = s.indexOf(',', index_x1+1);
4 int index_x3 = s.indexOf(',', index_x2+1);
5 int index_null1 = s.indexOf(" ");
6 int index_null2 = s.indexOf(" ", index_null1+1);
7
8 //判断0是否在首位
9 for(int i = 0; i<s.length(); i++)
10 {
11 if(s.charAt(i) == '0')
12 {
13 if(i<s.length()-2)
14 {
15 if(s.charAt(i+1)=='0')
16 {
17 System.out.print("Wrong Format");
18 System.exit(0);
19 }
20
21 if(s.charAt(i+1)>'0' && s.charAt(i+1)<='9')
22 {
23 System.out.print("Wrong Format");
24 System.exit(0);
25 }
26 }
27 }
28 }
29
30 //点的数量
31 if(index_null1 == -1 || index_null2 == -1)
32 {
33 System.out.println("wrong number of points");
34 System.exit(0);
35 }
36 int index_null3 = s.indexOf(" ", index_null2+1);
37 if(index_null3 !=-1)
38 {
39 System.out.println("wrong number of points");
40 System.exit(0);
41 }
42
43 //判断逗号数量是否不对
44 int sum_char = 0;
45 for(int i = 1; i<s.length(); i++)
46 {
47 if(s.charAt(i) == ',')
48 sum_char ++;
49 }
50 if(sum_char != 3 )
51 {
52 System.out.print("Wrong Format");
53 System.exit(0);
54 }
55 if(s.indexOf(',', index_null1) == -1)
56 {
57 System.out.print("Wrong Format");
58 System.exit(0);
59 }
60 if(s.indexOf(',', index_null2) == -1)
61 {
62 System.out.print("Wrong Format");
63 System.exit(0);
64 }
65
66
67 double x1 = Double.parseDouble(s.substring(index_char+1, index_x1));
68 double y1 = Double.parseDouble(s.substring(index_x1+1, index_null1));
69 double x2 = Double.parseDouble(s.substring(index_null1+1, index_x2));
70 double y2 = Double.parseDouble(s.substring(index_x2+1, index_null2));
71 double x3 = Double.parseDouble(s.substring(index_null2+1, index_x3));
72 double y3 = Double.parseDouble(s.substring(index_x3+1, s.length()));

还有一点,就是判断输入格式是否错误的时候可以用正则表达式,这样可以强制输入必须是正确匹配的,不是直接输出wrong format,这样也可以

节省很多功夫。

  ②题目集六——7-3(银行类业务设计)

   题目:

编写一个银行业务类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()方法。

输入格式:

输入开户需要的姓名、密码
输入正确密码、存款金额
输入错误密码、取款金额
输入正确密码、大于余额的取款金额
输入正确密码、小于余额的取款金额

输出格式:

中国银行(银行名称)欢迎您的到来!
您的余额有多少元。
您的密码错误!
您的余额不足!
请取走钞票,您的余额还有多少元。
请收好您的证件和物品,欢迎您下次光临!

这里笔者先给出自己的源码:

 1 import java.util.Scanner;
2
3 class BankBusiness{
4 public static String bankname = "中国银行";
5 private String name;
6 private int password;
7 private double balance = 0;
8
9
10 public BankBusiness() {
11 super();
12 // TODO Auto-generated constructor stub
13 }
14
15 public void welcome() {//欢迎
16 System.out.println(bankname + "欢迎您的到来!");
17 }
18
19 public void welcomeNext() {//送客
20 System.out.println("请收好您的证件和物品,欢迎您下次光临!");
21 }
22
23 public BankBusiness(String name, int password) {
24 super();
25 this.name = name;
26 this.password = password;
27 }
28
29 public void deposit(int password,int sum_money) {//存款
30 if(password != this.password) {
31 System.out.println("您的密码错误!");
32 }
33 else
34 {
35 this.balance += sum_money;
36 System.out.println("您的余额有" + this.balance + "元。");
37 }
38 }
39
40 public void withdraw(int password,int sum_money) {//取款
41 if(password != this.password) {
42 System.out.println("您的密码错误!");
43 }
44 else {
45 if(sum_money > this.balance) {
46 System.out.println("您的余额不足!");
47 }
48 else {
49 this.balance -= sum_money;
50 System.out.println("请取走钞票,您的余额还有" + this.balance + "元。");
51 }
52 }
53 }
54
55
56
57 }
58 public class Main {
59
60 public static void main(String[] args) {
61 // TODO Auto-generated method stub
62 Scanner in = new Scanner(System.in);
63 BankBusiness account = new BankBusiness();
64 account.welcome();
65 String name_input = in.next();
66 int password_input = in.nextInt();
67 account = new BankBusiness(name_input, password_input);
68
69 account.deposit(in.nextInt(), in.nextInt());
70 account.withdraw(in.nextInt(), in.nextInt());
71 account.withdraw(in.nextInt(), in.nextInt());
72 account.withdraw(in.nextInt(), in.nextInt());
73 account.welcomeNext();
74
75 }
76
77 }

代码设计:

题目分析:相较于上次做的ATM类模拟系统,这一题,就显得简单多了,不过这里是通过类的设计实现的,也算是贴近我们

这门课程的学习内容吧。题目给的信息和提示很多,甚至连main方法的步骤都写出来了,所以这题难度不大,也是按照题目

提示一步一步写即可。

踩坑心得:

①:注意区分中英文,保险起见最好直接复制题目要的输出粘贴到代码上:

 

这里题目要求输出的感叹号其实都是中文的,可笔者想当然的认为都是英文的,所以后面改的时候出现了很多不必要的麻烦,

因此,为了减去不必要的麻烦,建议大家写输出结果的时候直接将题目给的粘贴过去即可。

②:没有必要的方法不要创建,培养良好的习惯。

这个在后面的期中考试分析部分会深刻的体现出来。

  2、链表练习: 

   (很惭愧,笔者的双向链表其实是不符合老师要求的,为避免误人子弟,这里就给出笔者单向链表的内容) 

  题目:

使用Java实现链表功能,具体功能如下(参考):

public interface LinearListInterface <E>{

public boolean isEmpty();

public int getSize();

public E get(int index);

public void remove(int index);

public void add(int index, E theElement);

public void add(E  element);

public void printList();

}

结构如下:

//LinkedList class

public class LList<E>{

private Node<E> head,curr,tail;//头结点(非第一个节点),当前节点,尾节点

private int size = 0;

}

//Node

public class Node<E>{

private E data;

private Node<E> next;

}

提交物:工程文件夹压缩文件,保证解压后可以直接import运行

笔者源码如下:

  1 //单向链表
2 import java.util.Scanner;
3
4 //泛型接口(E)
5 interface LinearListInterface<E> {
6
7 //判断链表数据是否为空
8 public boolean isEmpty();
9
10 //返回链表大小
11 public int size();
12
13 //返回链表指定下标的数据
14 public E get(int index);
15
16 //删除指定下标的信息
17 public void remove(int index);
18
19 //在指定下标处添加元素
20 public void add(int index, E theElement);
21
22 //在节点尾部添加元素
23 public void add(E element);
24
25 //输出链表中的所有信息
26 public void printList();
27 }
28
29 //LinkedList class(链表类)
30 class LList<E> implements LinearListInterface<E>{
31 private Node<E> head;
32 private Node<E> tail;
33 private Node<E> curr;
34 private int size;
35
36 public boolean isEmpty() {//判断链表数据是否为空
37 if(this.tail == null)
38 {
39 return false;
40 }
41 else
42 {
43 return true;
44 }
45 }
46
47 public int size() { //返回链表大小
48 return this.size;
49 }
50
51 public E get(int index) { //返回链表指定下标的数据
52 int sign = 0;//sign:对照(指针):确定index对应链表的地址
53 if(index>=0 && index<=size)
54 {
55 this.curr = head;
56 while(sign < index) {
57 this.curr = this.curr.next;
58 sign++;
59 }
60 return this.curr.o;//返回当前节点(sign = index)
61 }
62 else
63 {
64 return null;//输入下标超出链表可选范围
65 }
66 }
67
68 public void remove(int index) {//删除指定下标的信息
69 int sign = 0;
70 if(index>=0 && index<=size) {
71 if(sign == 0) {//目标为头部
72 this.head = this.head.next;//头节点指向下一个
73 this.size--;
74 }
75 else
76 {
77 this.curr = this.head;
78 while(sign < index-1) {
79 this.curr = this.curr.next;
80 sign++;
81 }
82 this.curr.next = this.curr.next.next;
83 }
84 this.size--;
85 }
86 }
87
88 public void add(int index, E theElement) { //在指定下标处添加元素
89 int count = 0;
90 if(index>=0&&index<=this.size)
91 {
92 if(index==0)
93 {
94 this.head = new Node<E>(theElement,this.head);//如果添加在头部,theElement成为新头节点
95 }
96 else
97 {
98 this.curr = head;
99 while(count<index-1)
100 {//找到要添加信息的节点的位置
101 this.curr = this.curr.next;
102 count++;
103 }
104 this.curr.next = new Node<E>(theElement,this.curr.next);
105 }
106 this.size++;
107 }
108
109 }
110
111
112 public void add(E element) {//在节点尾部添加元素
113 Node<E> node =new Node<E>(element,null);//新节点
114 this.curr = this.tail;
115 this.tail = node;
116 if(curr==null) {
117 head = node;
118 }else{
119 curr.next = node;
120 }
121 this.size++;
122 }
123
124 public void printList() {//输出链表中的所有信息
125 for(int i = 0;i<this.size;i++) {
126 System.out.print(get(i).toString()+" ");
127 }
128 }
129
130 }
131
132 //Node(节点类)
133 class Node<E>{
134 public E o;//数据域
135 public Node<E> next;//指针域
136 public Node(E o,Node<E> next) {
137 this.o = o;
138 this.next = next;
139 }
140 }
141
142
143 public class link {
144 //主方法
145 public static void main(String[] args) {
146 // TODO Auto-generated method stub
147
148 LList<Integer> list = new LList<Integer>();//接口
149 Scanner in = new Scanner(System.in);
150
151 System.out.println(" < 简单示例 > -->输入五个数据 ");
152 for(int i = 0;i<5;i++) {
153 list.add(in.nextInt());
154 }
155 System.out.println("所输入链表信息为:");
156 list.printList();//输出输入的数据
157
158 System.out.println("");
159 System.out.println("选择你要执行的链表操作:");
160 System.out.println("1.在指定下标添加节点信息");
161 System.out.println("2.在尾部添加节点信息");
162 System.out.println("3.退出");
163
164 int choice = in.nextInt();
165 while(true)
166 {
167 switch(choice)
168 {
169 case 1:
170 {
171 System.out.println("请输入指定下标:");
172 int index = in.nextInt();
173 System.out.println("请输入需添加的整型数据:");
174 int element = in.nextInt();
175 list.add(index, element);
176 System.out.println("\n增加第"+index+"节点后的链表:");
177 list.printList();//输出链表
178
179 System.out.println("");
180 System.out.println("选择你要执行的链表操作:");
181 System.out.println("1.在指定下标添加节点信息");
182 System.out.println("2.在尾部添加节点信息");
183 System.out.println("3.退出");
184 choice = in.nextInt();
185 }break;
186 case 2:
187 {
188 System.out.println("请输入需添加的信息:");
189 int index = in.nextInt();
190 list.add(index);
191 System.out.println("添加节点后的链表信息:");
192 list.printList();//输出链表
193
194 System.out.println("");
195 System.out.println("选择你要执行的链表操作:");
196 System.out.println("1.在指定下标添加节点信息");
197 System.out.println("2.在尾部添加节点信息");
198 System.out.println("3.退出");
199 choice = in.nextInt();
200 }break;
201 case 3:
202 {
203 System.exit(0);
204 }break;
205 default: System.exit(0);
206 }
207
208 }
209 }

 分析:笔者认为,相对于双向链表,单向链表比较直接,因为就像上学期c语言那样,只需关注一个next指针即可

,这样设计功能接口时思路也会比较清新,所以笔者比较适应单向链表。对于双向链表,笔者就会比较晕,不知道

怎么协调两个指针pre和next,当然,最后做是做出来的,但功能实现方面,肯定是没有完全符合老师给的要求的。

运行示例:

心得:说到运行,笔者就想说一下main方法的事情,因为在双向链表互评的时候,笔者改的三人,有两个是没有写main函数的

可老师要求的是要可以运行调试,可你没main方法,你是怎么运行的呢,就确定写完之后就一定是对的吗?因此,建议大家做事一定

要做到尽善尽美,这样你开心,别人也舒服。

  3、期中考试小结:

前言分析:这次期中考试题目不难,三题呈迭代进行,正如老师所说,上一题的源码可以直接复制到下一题使用,再进行修改即可。

第一题非常直接,笔者就不在这赘述了。

第二、三题:

源码:

  1 import java.util.Scanner;
2
3 import javax.lang.model.element.Element;
4
5 public class Main {
6
7 public static void main(String[] args) {
8 Scanner in = new Scanner(System.in);
9 Point point1 = new Point();
10 Point point2 = new Point();
11 Plane plane = new Plane();
12 double x1 = in.nextDouble();
13 double y1 = in.nextDouble();
14 double x2 = in.nextDouble();
15 double y2 = in.nextDouble();
16
17 if (x1 > 0 && x1 <= 200 && y1 > 0 && y1 <= 200 && x2 > 0 && x2 <= 200 && y2 > 0 && y2 <= 200) {
18 point1.setX(x1);
19 point1.setY(y1);
20 point2.setX(x2);
21 point2.setY(y2);
22 } else {
23 System.out.println("Wrong Format");
24 System.exit(0);
25 }
26 String color = in.next();
27 Line line = new Line(point1, point2, color);
28 plane.setColor(color);
29
30 // point1.display();
31 // System.out.println("");
32 // point2.display();
33 // System.out.println("");
34 // line.display();
35 // System.out.println("");
36 // plane.display();
37
38 // Element element;
39 // element = (Element) point1;// 起点Point
40 // ((Point) element).display();
41 //
42 // element = (Element) point2;// 终点Point
43 // ((Point) element).display();
44 //
45 // element = (Element) line;// 线段
46 // ((Line) element).display();
47 //
48 // element = (Element) plane;// 面
49 // ((Plane) element).display();
50 point1.display();
51 System.out.println("");
52 point2.display();
53 System.out.println("");
54 line.display();
55 System.out.println("");
56 plane.display();
57
58 }
59
60 }
61
62 class Point extends Elememt {
63 private double x;
64 private double y;
65
66 public Point() {
67 super();
68 // TODO Auto-generated constructor stub
69 }
70
71 public Point(double x, double y) {
72 super();
73 this.x = x;
74 this.y = y;
75 }
76
77 public double getX() {
78 return x;
79 }
80
81 public void setX(double x) {
82 this.x = x;
83 }
84
85 public double getY() {
86 return y;
87 }
88
89 public void setY(double y) {
90 this.y = y;
91 }
92
93 public void display() {
94 System.out.printf("(%.2f,%.2f)", this.x, this.y);
95 }
96
97 }
98
99 class Line extends Elememt {
100 private Point point1 = new Point();
101 private Point point2 = new Point();
102 private String color;
103
104 public Line() {
105 super();
106 // TODO Auto-generated constructor stub
107 }
108
109 public Line(Point point1, Point point2, String color) {
110 super();
111 this.point1 = point1;
112 this.point2 = point2;
113 this.color = color;
114 }
115
116 public Point getPoint1() {
117 return point1;
118 }
119
120 public void setPoint1(Point point1) {
121 this.point1 = point1;
122 }
123
124 public Point getPoint2() {
125 return point2;
126 }
127
128 public void setPoint2(Point point2) {
129 this.point2 = point2;
130 }
131
132 public String getColor() {
133 return color;
134 }
135
136 public void setColor(String color) {
137 this.color = color;
138 }
139
140 public double getDistance() {
141 double x = Math.pow((point1.getX() - point2.getX()), 2);
142 double y = Math.pow((point1.getY() - point2.getY()), 2);
143 return Math.sqrt(x + y);
144 }
145
146 public void display() {
147
148 System.out.println("The line's color is:" + this.color);
149 System.out.println("The line's begin point's Coordinate is:");
150 point1.display();
151 System.out.println("");
152 System.out.println("The line's end point's Coordinate is:");
153 point2.display();
154 System.out.println("");
155 System.out.printf("The line's length is:%.2f", this.getDistance());
156
157 }
158 }
159
160 abstract class Elememt {
161 public abstract void display();
162 }
163
164 class Plane extends Elememt {
165 private String color;
166
167 public Plane() {
168 super();
169 // TODO Auto-generated constructor stub
170 }
171
172 public Plane(String color) {
173 super();
174 this.color = color;
175 }
176
177 public String getColor() {
178 return color;
179 }
180
181 public void setColor(String color) {
182 this.color = color;
183 }
184
185 public void display() {
186 System.out.println("The Plane's color is:" + this.color);
187 }
188
189 }

首先,先给大家看个东西:

这是笔者写的代码的类图:

这是题目要求的类图:

怎么样,是不是没有对比没有伤害,/(ㄒoㄒ)/~~。

这也是笔者的心得之一:

一定一定要按要求写代码。

也许现在有很多像笔者一样,对java还不太熟悉,上学期c语言也没学太好的人,认为这样很难,直接一点不行吗?但我们必须要按原则做事,

正如老师所说,我们是做工程的,做事一定要严谨,这是对我们自己的将来负责。

在期中考试之后,笔者又根据老师给的代码对自己的代码进行改进,功夫不负有心人,笔者终于成功了,为了不再赘述,这里笔者就只给出改进完之后的类图:

看到是自己写的代码结构这么清晰(虽然借助了外力),笔者感到十分愉悦。

总结:

  笔者认为,这几周最大的收获就是可以完全靠自己(不问同学,不网上参考)写题目,并且可以拿到不错的成绩,

这是我自进这个专业以来第一次有这样的感觉,就是好像可以自己做点事情,因为笔者其实对编程这方面没有很大的

兴趣,因此并没有在这方面花太多时间,直到这学期,我才顿悟,这是我的专业啊,所以我一定要认真学,把前面落下

的都补上来,尤其是期中考试的时候,我切实的感受到那种快感,在一个安静的环境下,独自一人完成这些题目,并拿到

属于自己能力应该拿到的分数,这种感觉让我非常愉悦。

  但是,笔者也看到了自己还有很多不足之处,就比如说上面提到的类图的事,这让我明白我还有很多知识(如多态、

容器的常用类、面向对象的设计原则等)没有掌握,还有很多坏习惯还有待改正,这些也就是我下半段学期要做到事,

对此,我会不断努力,改进。

在这里笔者以自己的体悟建议大家,不要轻言放弃,现在还不会就加紧学,只要肯下功夫,一定可以突破自己的瓶颈。

对教学方面的改进建议:

  没什么特别想说的,就是希望可以早点转换成线下教学,o(* ̄▽ ̄*)ブ。

皓远的第二次博客作业(最新pta集,链表练习及期中考试总结)的相关教程结束。

《皓远的第二次博客作业(最新pta集,链表练习及期中考试总结).doc》

下载本文的Word格式文档,以方便收藏与打印。