皓远的第二次博客作业(最新pta集,链表练习及期中考试总结)
前言:
- 知识点运用:正则表达式,有关图形设计计算的表达式和算法,链表的相关知识,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(* ̄▽ ̄*)ブ。

浙公网安备 33010602011771号