l  前言

  1. 不知不觉间我大一的课程《面向对象程序设计》已经快要进入尾声,在这堂课上我学到了很多。
  2. 题目集涉及到的知识点比较综合,题量较多,为的是让我们尽快面向对象的基本思路和架构,难度个人认为中偏上。
  3. 解题思路倒是清晰明了,有的需要实现类图,有的则是清晰的告诉解题者设计思路。

l  设计与分析

一、题目集7(7-1)、(7-2)两道题目的递进式设计分析总结

7-1 图形卡片排序游戏 (40 分)

掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书 2020-OO第07次作业-1指导书V1.0.pdf

输入格式:

  • 首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
  • 然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。

输出格式:

  • 如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format
  • 如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
  1. 排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
  2. 排序后的各图形类型及面积,格式同排序前的输出;
  3. 所有图形的面积总和,格式为Sum of area:总面积值

输入样例1:

在这里给出一组输入。例如:

1 5 3 2 0
 

输出样例1:

在这里给出相应的输出。例如:

Wrong Format
 

输入样例2:

在这里给出一组输入。例如:

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5
 

输出样例2:

在这里给出相应的输出。例如:

The original list:
Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 
The sorted list:
Circle:98.52 Triangle:4.02 Rectangle:3.22 Trapezoid:1.14 
Sum of area:106.91
 

输入样例3:

在这里给出一组输入。例如:

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 8.4
 

输出样例3:

在这里给出相应的输出。例如:

Wrong Format

 

 根据本题设计出类图如下所示:

源代码如下:

 

 

复制代码
复制代码

import java.util.Scanner;
import java.util.*;
public class Main {
    public static Scanner input = new Scanner(System.in);
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        int num = input.nextInt();
        while(num != 0){
            if(num < 0 || num > 4){
                System.out.println("Wrong Format");
                System.exit(0);
            }
            list.add(num);
            num = input.nextInt();
        }
        DealCardList dealCardList = new DealCardList(list);
        if(!dealCardList.validate()){
            System.out.println("Wrong Format");
            System.exit(0);
        }
        dealCardList.showResult();
        input.close();
    }

}
class DealCardList{
    public DealCardList(ArrayList<Integer> list) {
        this.list = list;
    }
    ArrayList<card> cardl=new ArrayList<>();
    ArrayList<Integer> list;
    boolean validate(){
        for (int i = 0; i < list.size(); i++) {
            card a=null;
            if(list.get(i)==1)
            {
                double b=Main.input.nextDouble();
                if(b<=0)
                    return false;
                a = new Circle(b);
            }
            else if(list.get(i)==2)
            {
                double b=Main.input.nextDouble();
                double c=Main.input.nextDouble();
                if(b<=0||c<=0)
                    return false;
                a = new Rectangle(b,c);
            }
            else if(list.get(i)==3)
            {
                double b=Main.input.nextDouble();
                double c=Main.input.nextDouble();
                double d=Main.input.nextDouble();
                if(b>0&&c>0&&d>0&&d+b>c&&b+c>d&&c+d>b)
                    ;
                else
                    return false;
                a = new Triangle(b,c,d);
            }
            else if(list.get(i)==4)
            {
               double b=Main.input.nextDouble();
                double c=Main.input.nextDouble();
                double d=Main.input.nextDouble();
                if(b>0&&c>0&&d>0)
                    ;
                else
                    return false;
                a = new Trapezoid(b,c,d);
            }
            cardl.add(a);
        }
        return true;
   }
    void showResult()
    {
        double sum=0;
        System.out.println("The original list:");
        for (int i = 0; i < cardl.size(); i++) {
            switch (list.get(i)){
                case 1:
                    System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");
                    break;
                case 2:
                    System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
                case 3:
                    System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
                case 4:
                    System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
            }

        }
        System.out.println();
        System.out.println("The sorted list:");
        Collections.sort(cardl);
        for (int i = 0; i < cardl.size(); i++) {
            switch (list.get(i)){
            case 1:
                System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");
                break;
            case 2:
                System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
            case 3:
                System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
            case 4:
                System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
        }

        
            sum+=cardl.get(i).getS();
        }
        System.out.println();
        System.out.println("Sum of area:"+String.format("%.2f", sum));
    }
}
class card implements Comparable<card>
{
     double s;
    public double getS() {
        return s;
    }
    public void setS(double s) {
        this.s = s;
    }
    @Override
    public int compareTo(card o) {
        if(this.s>o.s)
            return -1;
        else if(this.s<o.s)
            return 1;
        else return 0;
    }
}
class Circle extends card{
     double a;
     public String toString()
     {
         return "Circle:";
     }
    public Circle(double a) {
        this.a = a;
        s=Math.PI*a*a;
    }
}
class  Rectangle extends card{
    public String toString()
     {
         return "Rectangle:";
     }
    public Rectangle(double a, double b) {
        this.a = a;
        this.b = b;
        s=a*b;
    }
    double a;
    double b;
    
}
class  Triangle extends card{
    public String toString()
     {
         return "Triangle:";
     }
    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
        double p  = (a+b+c)/2;
        s= Math.sqrt(p*(p-a)*(p-b)*(p-c));
    }

    double a;
    double b;
    double c;
}
class  Trapezoid extends card{
    public String toString()
     {
         return "Trapezoid:";
     }
    public Trapezoid(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
        s = (a+b)/2*c;
    }

    double a;
    double b;
    double c;
 
}
复制代码
复制代码

 

7-2 图形卡片分组游戏 (60 分)

掌握类的继承、多态性使用方法以及接口的应用。 具体需求参考作业指导书。

2021-OO第07次作业-2指导书V1.0.pdf

输入格式:

  • 在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:1 3 4 2 1 3 4 2 1 3 0
  • 根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。

输出格式:

  • 如果图形数量非法(<=0)或图形属性值非法(数值<0以及三角形三边不能组成三角形),则输出Wrong Format
  • 如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
  1. 排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
  2. 输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
  3. 各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
  4. 各组中面积之和的最大值输出,格式为The max area:面积值

输入样例1:

在这里给出一组输入。例如:

1 5 3 2 0
 

输出样例1:

在这里给出相应的输出。例如:

Wrong Format
 

输入样例2:

在这里给出一组输入。例如:

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5
 

输出样例2:

在这里给出相应的输出。例如:

The original list:
[Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 ]
The Separated List:
[Circle:98.52 ][Rectangle:3.22 ][Triangle:4.02 ][Trapezoid:1.14 ]
The Separated sorted List:
[Circle:98.52 ][Rectangle:3.22 ][Triangle:4.02 ][Trapezoid:1.14 ]
The max area:98.52
 

输入样例3:

在这里给出一组输入。例如:

2 1 2 1 1 3 3 4 4 1 1 1 2 1 0
2.3 3.5 2.5 4.5 2.1 2.6 8.5 3.2 3.1 3.6 8.5 7.5 9.1245 6.5 3.4 10.2 11.2 11.6 15.4 5.8 2.13 6.2011 2.5 6.4 18.65
 

输出样例3:

在这里给出相应的输出。例如:

The original list:
[Rectangle:8.05 Circle:19.63 Rectangle:9.45 Circle:21.24 Circle:226.98 Triangle:4.65 Triangle:29.80 Trapezoid:50.49 Trapezoid:175.56 Circle:105.68 Circle:14.25 Circle:120.81 Rectangle:16.00 Circle:1092.72 ]
The Separated List:
[Circle:19.63 Circle:21.24 Circle:226.98 Circle:105.68 Circle:14.25 Circle:120.81 Circle:1092.72 ][Rectangle:8.05 Rectangle:9.45 Rectangle:16.00 ][Triangle:4.65 Triangle:29.80 ][Trapezoid:50.49 Trapezoid:175.56 ]
The Separated sorted List:
[Circle:1092.72 Circle:226.98 Circle:120.81 Circle:105.68 Circle:21.24 Circle:19.63 Circle:14.25 ][Rectangle:16.00 Rectangle:9.45 Rectangle:8.05 ][Triangle:29.80 Triangle:4.65 ][Trapezoid:175.56 Trapezoid:50.49 ]
The max area:1601.31
 

输入样例4:

在这里给出一组输入。例如:

1 1 3 0
6.5 12.54 3.6 5.3 6.4
 

输出样例4:

在这里给出相应的输出。例如:

The original list:
[Circle:132.73 Circle:494.02 Triangle:9.54 ]
The Separated List:
[Circle:132.73 Circle:494.02 ][][Triangle:9.54 ][]
The Separated sorted List:
[Circle:494.02 Circle:132.73 ][][Triangle:9.54 ][]
The max area:626.75

源代码如下:

import java.util.Scanner;
import java.util.*;
public class Main {
    public static Scanner input = new Scanner(System.in);
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        int num = input.nextInt();
        while(num != 0){
            if(num < 0 || num > 4){
                System.out.println("Wrong Format");
                System.exit(0);
            }
            list.add(num);
            num = input.nextInt();
        }
        DealCardList dealCardList = new DealCardList(list);
        if(!dealCardList.validate()){
            System.out.println("Wrong Format");
            System.exit(0);
        }
        dealCardList.showResult();
        input.close();
    }

}
class DealCardList{
    public DealCardList(ArrayList<Integer> list) {
        this.list = list;
    }
    ArrayList<card> cardl=new ArrayList<>();
    ArrayList<Integer> list;
    boolean validate(){
        for (int i = 0; i < list.size(); i++) {
            card a=null;
            if(list.get(i)==1)
            {
                double b=Main.input.nextDouble();
                if(b<=0)
                    return false;
                a = new Circle(b);
            }
            else if(list.get(i)==2)
            {
                double b=Main.input.nextDouble();
                double c=Main.input.nextDouble();
                if(b<=0||c<=0)
                    return false;
                a = new Rectangle(b,c);
            }
            else if(list.get(i)==3)
            {
                double b=Main.input.nextDouble();
                double c=Main.input.nextDouble();
                double d=Main.input.nextDouble();
                if(b>0&&c>0&&d>0&&d+b>c&&b+c>d&&c+d>b)
                    ;
                else
                    return false;
                a = new Triangle(b,c,d);
            }
            else if(list.get(i)==4)
            {
               double b=Main.input.nextDouble();
                double c=Main.input.nextDouble();
                double d=Main.input.nextDouble();
                if(b>0&&c>0&&d>0)
                    ;
                else
                    return false;
                a = new Trapezoid(b,c,d);
            }
            cardl.add(a);
        }
        return true;
   }
    void showResult()
    {
        if(cardl.size()==0)
        {
            System.out.println("Wrong Format");
             System.exit(0);
        }
        System.out.println("The original list:");
        
        if(cardl.size()!=0)
        {
            System.out.print("[");
            for (int i = 0; i < cardl.size(); i++) {
                switch (list.get(i)){
                    case 1:
                        System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");
                        break;
                    case 2:
                        System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
                    case 3:
                        System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
                    case 4:
                        System.out.print(cardl.get(i).toString()+String.format("%.2f", cardl.get(i).getS())+" ");break;
                }
            }
            System.out.print("]");
        }
        ArrayList<card> cardl1=new ArrayList<>();
        ArrayList<card> cardl2=new ArrayList<>();
        ArrayList<card> cardl3=new ArrayList<>();
        ArrayList<card> cardl4=new ArrayList<>();
        for (int i = 0; i < cardl.size(); i++) {
            if(cardl.get(i).toString().equals("Circle:"))
                cardl1.add(cardl.get(i));
            else if(cardl.get(i).toString().equals("Rectangle:"))
                cardl2.add(cardl.get(i));
            else if(cardl.get(i).toString().equals("Triangle:"))
                cardl3.add(cardl.get(i));
            else if(cardl.get(i).toString().equals("Trapezoid:"))
                cardl4.add(cardl.get(i));
        }
        System.out.println();
        System.out.println("The Separated List:");
        if(cardl.size()!=0)
        {
            System.out.print("[");
            for (int i = 0; i < cardl1.size(); i++) {
                
                     System.out.print(cardl1.get(i).toString()+String.format("%.2f", cardl1.get(i).getS())+" ");
                     
                         
                     
             }
            System.out.print("]");
            System.out.print("[");
             for (int i = 0; i < cardl2.size(); i++) {
                 
                     
                 System.out.print(cardl2.get(i).toString()+String.format("%.2f", cardl2.get(i).getS())+" ");
              
         }
             System.out.print("]");
             System.out.print("[");
             for (int i = 0; i < cardl3.size(); i++) {
                 
                     
                 System.out.print(cardl3.get(i).toString()+String.format("%.2f", cardl3.get(i).getS())+" ");
                
                     
               
         }
             System.out.print("]");
             System.out.print("[");
             for (int i = 0; i < cardl4.size(); i++) {
                 
                    
                 System.out.print(cardl4.get(i).toString()+String.format("%.2f", cardl4.get(i).getS())+" ");
                
         }
             System.out.print("]");
        }
        
        Collections.sort(cardl1);
        Collections.sort(cardl2);
        Collections.sort(cardl3);
        Collections.sort(cardl4);
        System.out.println();
        System.out.println("The Separated sorted List:");
        double sum1=0;
        double sum2=0;
        double sum3=0;
        double sum4=0;
        double sum=0;
        if(cardl.size()!=0)
        {
            System.out.print("[");
            for (int i = 0; i < cardl1.size(); i++) {
                
                     System.out.print(cardl1.get(i).toString()+String.format("%.2f", cardl1.get(i).getS())+" ");
                     
                         
                     sum1+=cardl1.get(i).getS();
             }
            System.out.print("]");
            System.out.print("[");
             for (int i = 0; i < cardl2.size(); i++) {
                 
                     
                 System.out.print(cardl2.get(i).toString()+String.format("%.2f", cardl2.get(i).getS())+" ");
                 sum2+=cardl2.get(i).getS();
         }
             System.out.print("]");
             System.out.print("[");
             for (int i = 0; i < cardl3.size(); i++) {
                 
                     
                 System.out.print(cardl3.get(i).toString()+String.format("%.2f", cardl3.get(i).getS())+" ");
                
                     
                 sum3+=cardl3.get(i).getS();
         }
             System.out.print("]");
             System.out.print("[");
             for (int i = 0; i < cardl4.size(); i++) {
                 
                    
                 System.out.print(cardl4.get(i).toString()+String.format("%.2f", cardl4.get(i).getS())+" ");
                
                    
                 sum4+=cardl4.get(i).getS();
         }
             System.out.print("]");
        }
        System.out.println();
        if(sum1>sum)
            sum=sum1;
        if(sum2>sum)
            sum=sum2;
        if(sum3>sum)
            sum=sum3;
        if(sum4>sum)
            sum=sum4;
        System.out.println("The max area:"+String.format("%.2f", sum));
    }
}
class card implements Comparable<card>
{
     double s;
    public double getS() {
        return s;
    }
    public void setS(double s) {
        this.s = s;
    }
    @Override
    public int compareTo(card o) {
        if(this.s>o.s)
            return -1;
        else if(this.s<o.s)
            return 1;
        else return 0;
    }
}
class Circle extends card{
     double a;
     public String toString()
     {
         return "Circle:";
     }
    public Circle(double a) {
        this.a = a;
        s=Math.PI*a*a;
    }
}
class  Rectangle extends card{
    public String toString()
     {
         return "Rectangle:";
     }
    public Rectangle(double a, double b) {
        this.a = a;
        this.b = b;
        s=a*b;
    }
    double a;
    double b;
    
}
class  Triangle extends card{
    public String toString()
     {
         return "Triangle:";
     }
    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
        double p  = (a+b+c)/2;
        s= Math.sqrt(p*(p-a)*(p-b)*(p-c));
    }

    double a;
    double b;
    double c;
}
class  Trapezoid extends card{
    public String toString()
     {
         return "Trapezoid:";
     }
    public Trapezoid(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
        s = (a+b)/2*c;
    }

    double a;
    double b;
    double c;
  
}

    本两次习题集有着很强的递进关系,首先在习题集一中,题目的要求是让我们设计出程序使得完成对不同类的图片的面积进行排序和输出。在第二次的习题集中则让我们先将图形类进行分类,而后在分好类的图形组中进行各个图形面积的排序与输出

    题目一中我们使用ArrayList与否不影响题目的解决,但是题目集二我们必须使用Arraylist等集合框架才能分组储存几个图形类,之后再进行求面积和排序等工作

  解题思路:按部就班的用代码实现类图中规定的属性和方法,并通过不断的调试与分析,最终得出能通过所有测试点的代码提交即可。


 

二、题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

 

7-1 ATM机类结构设计(一) (100 分)

设计ATM仿真系统,具体要求参见作业说明。 OO作业8-1题目说明.pdf(https://images.ptausercontent.com/93fc7ad6-5e85-445a-a759-5790d0baab28.pdf)

输入格式:

每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:

  • 存款、取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。
  • 查询余额功能输入数据格式: 卡号

输出格式:

①输入错误处理

  • 如果输入卡号不存在,则输出Sorry,this card does not exist.
  • 如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.
  • 如果输入银行卡密码错误,则输出Sorry,your password is wrong.
  • 如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.
  • 如果检测为跨行存取款,则输出Sorry,cross-bank withdrawal is not supported.

②取款业务输出

输出共两行,格式分别为:

[用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]

当前余额为¥[金额]

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

③存款业务输出

输出共两行,格式分别为:

[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]

当前余额为¥[金额]

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

④查询余额业务输出

¥[金额]

金额保留两位小数。

输入样例1:

在这里给出一组输入。例如:

6222081502001312390 88888888 06 -500.00
#
 

输出样例1:

在这里给出相应的输出。例如:

张无忌在中国工商银行的06号ATM机上存款¥500.00
当前余额为¥10500.00
 

输入样例2:

在这里给出一组输入。例如:

6217000010041315709  88888888 02 3500.00
#
 

输出样例2:

在这里给出相应的输出。例如:

杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥6500.00
 

输入样例3:

在这里给出一组输入。例如:

6217000010041315715
#
 

输出样例3:

在这里给出相应的输出。例如:

¥10000.00
 

输入样例4:

在这里给出一组输入。例如:

6222081502001312390 88888888 06 -500.00
6222081502051320786 88888888 06 1200.00
6217000010041315715 88888888 02 1500.00
6217000010041315709  88888888 02 3500.00
6217000010041315715
#
 

输出样例4:

在这里给出相应的输出。例如:

张无忌在中国工商银行的06号ATM机上存款¥500.00
当前余额为¥10500.00
韦小宝在中国工商银行的06号ATM机上取款¥1200.00
当前余额为¥8800.00
杨过在中国建设银行的02号ATM机上取款¥1500.00
当前余额为¥8500.00
杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥5000.00
¥5000.00

源代码如下:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static Scanner input = new Scanner(System.in);
    public static void main(String[] args){
        Bank bank1 = new Bank();
        bank1.setName("中国建设银行");
        Bank bank2 = new Bank();
        bank2.setName("中国工商银行");
        
        
        User 杨过 = new User();
        杨过.setName("杨过");
        User 郭靖 = new User();
        郭靖.setName("郭靖");
        User 张无忌 = new User();
        张无忌.setName("张无忌");
        User 韦小宝 = new User();
        韦小宝.setName("韦小宝");
        
        
        ATM atm01 = new ATM(bank1,"01");
        ATM atm02 = new ATM(bank1,"02");
        
        ATM atm03 = new ATM(bank1,"03");
        
        ATM atm04 = new ATM(bank1,"04");
        
        ATM atm05 = new ATM(bank2,"05");

        ATM atm06 = new ATM(bank2,"06");
    
         
        ArrayList<ATM> atmb1 = new ArrayList<ATM>();
        atmb1.add(atm01);
        atmb1.add(atm02);
        atmb1.add(atm03);
        atmb1.add(atm04);
        bank1.setAtm(atmb1);
        ArrayList<ATM> atmb2 = new ArrayList<ATM>();
        atmb2.add(atm05);
        atmb2.add(atm06);
        bank2.setAtm(atmb2);
        
        Account account1 = new Account();
        account1.setMoney(10000.00);
        account1.setUser(杨过);
        account1.setBank(bank1);
        account1.setNum("3217000010041315709");
        
        Account account2 = new Account();
        account2.setMoney(10000.00);
        account2.setUser(杨过);
        account2.setBank(bank1);
        account2.setNum("3217000010041315715");
        
        Account account3 = new Account();
        account3.setMoney(10000.00);
        account3.setUser(郭靖);
        account3.setBank(bank2);
        account3.setNum("3217000010051320007");
        
        Account account4 = new Account();
        account4.setMoney(10000.00);
        account4.setUser(张无忌);
        account4.setBank(bank2);
        account4.setNum("3222081502001312389");
        
        Account account5 = new Account();
        account5.setMoney(10000.00);
        account5.setUser(张无忌);
        account5.setBank(bank2);
        account5.setNum("3222081502001312390");
        
        Account account6 = new Account();
        account6.setMoney(10000.00);
        account6.setUser(张无忌);
        account6.setBank(bank2);
        account6.setNum("3222081502001312399");
        
        Account account7 = new Account();
        account7.setMoney(10000.00);
        account7.setUser(韦小宝);
        account7.setBank(bank2);
        account7.setNum("3222081502051320785");
        
        Account account8 = new Account();
        account8.setMoney(10000.00);
        account8.setUser(韦小宝);
        account8.setBank(bank2);
        account8.setNum("3222081502051320786");

        
        Card card1 = new Card();
        card1.setAccount(account1);
        card1.setNum("6217000010041315709");
        Card card2 = new Card();
        card2.setAccount(account1);
        card2.setNum("6217000010041315715");
        Card card3 = new Card();
        card3.setAccount(account2);
        card3.setNum("6217000010041315718");
        Card card4 = new Card();
        card4.setAccount(account3);
        card4.setNum("6217000010051320007");
        Card card5 = new Card();
        card5.setAccount(account4);
        card5.setNum("6222081502001312389");
        Card card6 = new Card();
        card6.setAccount(account5);
        card6.setNum("6222081502001312390");
        Card card7 = new Card();
        card7.setAccount(account6);
        card7.setNum("6222081502001312399");
        Card card8 = new Card();
        card8.setAccount(account6);
        card8.setNum("6222081502001312400");
        Card card9 = new Card();
        card9.setAccount(account7);
        card9.setNum("6222081502051320785");
        Card card10 = new Card();
        card10.setAccount(account8);
        card10.setNum("6222081502051320786");
        
        
        ArrayList<Card> cards = new ArrayList<Card>();
        cards.add(card1);
        cards.add(card2);
        cards.add(card3);
        cards.add(card4);
        cards.add(card5);
        cards.add(card6);
        cards.add(card7);
        cards.add(card8);
        cards.add(card9);
        cards.add(card10);
        ArrayList<String[]> sites = new ArrayList<String[]>();
        String a;
        int ymy =0;
        for(int i=0;;i++)
        {
            a=input.nextLine();
            if(a.equals("#"))
            {
                break;
            }
            sites.add(a.split(" +"));
        }
         for (String[] i : sites) {
                 for(Card k : cards)
                 {
                     if(i[0].equals(k.getNum()))
                     {
                         ymy=1;
                         if(i.length==1)
                         {
                             System.out.println("¥"+String.format("%.2f", k.getAccount().getMoney()));
                             break;
                         }
                         if(i[2].matches("0[1-6]"))
                         {
                             if(i[1].equals("88888888"))
                             {
                                 if(Double.parseDouble(i[3])-k.getAccount().getMoney()<0)
                                 {
                                     ArrayList <ATM> l =k.getAccount().getBank().getAtm();
                                     int ymy1=0;
                                     for (ATM o : l) {
                                         if(o.getNum().equals(i[2]))
                                         {
                                            //终于他妈的能取钱了
                                             k.getAccount().setMoney(k.getAccount().getMoney()-Double.parseDouble(i[3]));
                                             if(Double.parseDouble(i[3])>0)
                                                 System.out.println(k.getAccount().getUser().getName()+"在"+k.getAccount().getBank().getName()+"的"+i[2]+"号ATM机上取款¥"+i[3]);
                                             else
                                                 System.out.println(k.getAccount().getUser().getName()+"在"+k.getAccount().getBank().getName()+"的"+i[2]+"号ATM机上存款¥"+String.format("%.2f", -Double.parseDouble(i[3])));

                                             System.out.println("当前余额为¥"+String.format("%.2f", k.getAccount().getMoney()));
                                             ymy1=1;
                                         }
                                         else
                                         {
                                            continue;
                                         }
                                     }
                                    if(ymy1==0)
                                    {
                                         System.out.println("Sorry,cross-bank withdrawal is not supported.");
                                         System.exit(0);
                                    }
                                 }
                                 else {
                                     
                                     System.out.println("Sorry,your account balance is insufficient.");
                                     System.exit(0);
                                 }
                                    
                             }
                             else
                             {
                                 System.out.println("Sorry,your password is wrong.");
                                 System.exit(0);
                             }
                                 
                         }
                         else
                         {
                             System.out.println("Sorry,the ATM's id is wrong.");
                             System.exit(0);

                         }
                             
                     }
                     else
                     {
                         continue;
                     }
                         
                 }
                 if(ymy==0)
                 {
                     System.out.println("Sorry,this card does not exist.");
                     System.exit(0);
                 }
            }
         
        /* int q=0;
            Card b;
            for(Card i:card)
            {
                if(in[0].equals(i.getNum()))
                {
                    b=i;
                    q=1;
                    break;
                }
            }
            if(a==0)
            {
                System.out.println("Sorry,this card does not exist.");
                System.exit(0);
            }
            if(!num.equals(in[2]))
            {
                System.out.println("Sorry,the ATM's id is wrong.");
                System.exit(0);
            }
            if(!b.getPassWord().equals(in[1]))
            {
                System.out.println("Sorry,your password is wrong.");
                System.exit(0);
            }
            if(!num.equals(in[2]))
            {
                System.out.println("Sorry,cross-bank withdrawal is not supported.");
                System.exit(0);
            }
            if(card.getAccount().getBank()!=bank)
            {
                System.out.println("")
            }
        }*/
    }
}
class Bank{
    public Bank(String name, ArrayList<ATM> atm) {
        super();
        this.name = name;
        this.atm = atm;
    }
    public Bank() {
        // TODO 自动生成的构造函数存根
    }
    private String name;
    private ArrayList <Account> Accounts;
    private ArrayList <ATM> atm;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public ArrayList<Account> getAccounts() {
        return Accounts;
    }
    public void setAccounts(ArrayList<Account> accounts) {
        Accounts = accounts;
    }
    public ArrayList<ATM> getAtm() {
        return atm;
    }
    public void setAtm(ArrayList<ATM> atm) {
        this.atm = atm;
    }
    
}
class Account{
    private User user;
    private Bank bank;
    private String num;
    private double money;
    private ArrayList <Card> card;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Bank getBank() {
        return bank;
    }
    public void setBank(Bank bank) {
        this.bank = bank;
    }
    public String getNum() {
        return num;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    public ArrayList<Card> getCard() {
        return card;
    }
    public void setCard(ArrayList<Card> card) {
        this.card = card;
    }
}
class User{
    private String name;
    private ArrayList <Account> accounts;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public ArrayList<Account> getAccounts() {
        return accounts;
    }
    public void setAccounts(ArrayList<Account> accounts) {
        this.accounts = accounts;
    }
}
class Card{
    private Account account;
    private String num;
    private String passWord="88888888";
    public Account getAccount() {
        return account;
    }
    public void setAccount(Account account) {
        this.account = account;
    }
    public String getNum() {
        return num;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}
class ATM{
    private Bank bank;
    private String num;
    public String getNum() {
        return num;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public Bank getBank() {
        return bank;
    }
    public void setBank(Bank bank) {
        this.bank = bank;
    }
    public ATM(Bank bank, String num) {
        super();
        this.bank = bank;
        this.num = num;
    }
    public ATM() {
        // TODO 自动生成的构造函数存根
    }
}
/*class ChinaUnionPay
{
    
}*/

  本题要求编写一个银行ATM机的模拟程序能够完成用户的存款、取款以及查询余额功能,需要分别设计银行类Bank,用户类User,卡类card,银联类UnionPay,机器类ATM,账户类Account之后设计好他们之间类与类之间的关系,其中以关联为主。

 

7-1 ATM机类结构设计(二) (100 分)

 

设计ATM仿真系统,具体要求参见作业说明。 OO作业9-1题目说明.pdf,在作业说明中我们可以得知本次的设计需要我们根据账户的不同,银行卡一般分为借记卡针对借记账户和信用卡针对贷记账户两类其中信用卡可以透支消费,但是透支消费会额外扣除账户里的金额

此外,还有跨行取款这一新操作,也是需要额外收费的业务

 

输入格式:

 

每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:

 

  • 取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔)
  • 查询余额功能输入数据格式: 卡号

 

输出格式:

 

①输入错误处理

 

  • 如果输入卡号不存在,则输出Sorry,this card does not exist.
  • 如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.
  • 如果输入银行卡密码错误,则输出Sorry,your password is wrong.
  • 如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.

 

②取款业务输出

 

输出共两行,格式分别为:

 

业务:取款 [用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]

 

当前余额为¥[金额]

 

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

 

③查询余额业务输出

 

业务:查询余额 ¥[金额]

 

金额保留两位小数。

 

输入样例1:

 

在这里给出一组输入。例如:

 

6222081502001312390 88888888 06 500.00
#

 

 

 

输出样例1:

 

在这里给出相应的输出。例如:

 

业务:取款 张无忌在中国工商银行的06号ATM机上取款¥500.00
当前余额为¥9500.00

 

 

 

输入样例2:

 

在这里给出一组输入。例如:

 

6217000010041315709  88888888 06 3500.00
#

 

 

 

输出样例2:

 

在这里给出相应的输出。例如:

 

业务:取款 杨过在中国工商银行的06号ATM机上取款¥3500.00
当前余额为¥6395.00

 

 

 

输入样例3:

 

在这里给出一组输入。例如:

 

6217000010041315715
#

 

 

 

输出样例3:

 

在这里给出相应的输出。例如:

 

业务:查询余额 ¥10000.00

 

 

 

输入样例4:

 

在这里给出一组输入。例如:

 

6222081502001312390 88888888 01 500.00
6222081502051320786 88888888 06 1200.00
6217000010041315715 88888888 02 1500.00
6217000010041315709  88888888 02 3500.00
6217000010041315715
#

 

 

 

输出样例4:

 

在这里给出相应的输出。例如:

 

业务:取款 张无忌在中国建设银行的01号ATM机上取款¥500.00
当前余额为¥9490.00
业务:取款 韦小宝在中国工商银行的06号ATM机上取款¥1200.00
当前余额为¥8800.00
业务:取款 杨过在中国建设银行的02号ATM机上取款¥1500.00
当前余额为¥8500.00
业务:取款 杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥5000.00
业务:查询余额 ¥5000.00

 

 

 

输入样例5:

 

在这里给出一组输入。例如:

 

6640000010045442002 88888888 09 3000
6640000010045442002 88888888 06 8000
6640000010045442003 88888888 01 10000
6640000010045442002
#

 

 

 

输出样例5:

 

在这里给出相应的输出。例如:

 

业务:取款 张三丰在中国农业银行的09号ATM机上取款¥3000.00
当前余额为¥6880.00
业务:取款 张三丰在中国工商银行的06号ATM机上取款¥8000.00
当前余额为¥-1416.00
业务:取款 张三丰在中国建设银行的01号ATM机上取款¥10000.00
当前余额为¥-11916.00
业务:查询余额 ¥-11916.00

 

源代码如下:

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        UnionPay unionPay = new UnionPay();

        Bank ccb = new Bank("1001","中国建设银行");
        Bank icbc = new Bank("1002","中国工商银行");
        Bank abc = new Bank("1003","中国农业银行");
        unionPay.addBank(ccb);
        unionPay.addBank(icbc);
        unionPay.addBank(abc);

        ATM aTM1 = new ATM("01",ccb);
        ATM aTM2 = new ATM("02",ccb);
        ATM aTM3 = new ATM("03",ccb);
        ATM aTM4 = new ATM("04",ccb);
        ATM aTM5 = new ATM("05",icbc);
        ATM aTM6 = new ATM("06",icbc);
        ATM aTM7 = new ATM("07",abc);
        ATM aTM8 = new ATM("08",abc);
        ATM aTM9 = new ATM("09",abc);
        ATM aTM10 = new ATM("10",abc);
        ATM aTM11 = new ATM("11",abc);

        ccb.addATM(aTM1);
        ccb.addATM(aTM2);
        ccb.addATM(aTM3);
        ccb.addATM(aTM4);
        icbc.addATM(aTM5);
        icbc.addATM(aTM6);
        abc.addATM(aTM7);
        abc.addATM(aTM8);
        abc.addATM(aTM9);
        abc.addATM(aTM10);
        abc.addATM(aTM11);

        User Yangguo = new User("360101200102122324","杨过","13856223254");
        User Guojing = new User("360101200012302552","郭靖","13800021124");
        User Zhangwuji = new User("360502199805163221","张无忌","13952110011");
        User Weixiaobao = new User("360201200513243326","韦小宝","13025996587");
        User Zhangsanfeng = new User("360201200513243326","张三丰","13025996587");
        User Linghuchong = new User("360201200513243326","令狐冲","13025996587");
        User Qiaofeng = new User("360201200513243326","乔峰","13025996587");
        User Hongqigong = new User("360201200513243326","洪七公","13025996587");

        Account ccbAcc1 = new Account("3217000010041315709","debit",10000.00,Yangguo,ccb);
        Account ccbAcc2 = new Account("3217000010041315715","debit",10000.00,Yangguo,ccb);
        Account ccbAcc3 = new Account("3217000010051320007","debit",10000.00,Guojing,ccb);
        Account ccbAcc4 = new Account("3640000010045442002","credit",10000.00,Zhangsanfeng,ccb);
        Account icbcAcc1 = new Account("3222081502001312389","debit",10000.00,Zhangwuji,icbc);
        Account icbcAcc2 = new Account("3222081502001312390","debit",10000.00,Zhangwuji,icbc);
        Account icbcAcc3 = new Account("3222081502001312399","debit",10000.00,Zhangwuji,icbc);
        Account icbcAcc4 = new Account("3222081502051320785","debit",10000.00,Weixiaobao,icbc);
        Account icbcAcc5 = new Account("3222081502051320786","debit",10000.00,Weixiaobao,icbc);
        Account icbcAcc6 = new Account("3640000010045441009","credit",10000.00,Linghuchong,icbc);
        Account abcAcc1 = new Account("3630000010033431001","credit",10000.00,Qiaofeng,abc);
        Account abcAcc2 = new Account("3630000010033431008","credit",10000.00,Hongqigong,abc);


        ccb.addAccount(ccbAcc1);
        ccb.addAccount(ccbAcc2);
        ccb.addAccount(ccbAcc3);
        ccb.addAccount(ccbAcc4);
        icbc.addAccount(icbcAcc1);
        icbc.addAccount(icbcAcc2);
        icbc.addAccount(icbcAcc3);
        icbc.addAccount(icbcAcc4);
        icbc.addAccount(icbcAcc5);
        icbc.addAccount(icbcAcc6);
        abc.addAccount(abcAcc1);
        abc.addAccount(abcAcc2);



        Yangguo.addAccount(ccbAcc1);
        Yangguo.addAccount(ccbAcc2);
        Guojing.addAccount(ccbAcc3);
        Zhangwuji.addAccount(icbcAcc1);
        Zhangwuji.addAccount(icbcAcc2);
        Zhangwuji.addAccount(icbcAcc3);
        Weixiaobao.addAccount(icbcAcc4);
        Weixiaobao.addAccount(icbcAcc5);
        Zhangsanfeng.addAccount(ccbAcc4);
        Linghuchong.addAccount(icbcAcc6);
        Qiaofeng.addAccount(abcAcc1);
        Hongqigong.addAccount(abcAcc2);

        Card ccbCard1 = new Card("6217000010041315709","88888888",ccbAcc1);
        Card ccbCard2 = new Card("6217000010041315715","88888888",ccbAcc1);
        Card ccbCard3 = new Card("6217000010041315718","88888888",ccbAcc2);
        Card ccbCard4 = new Card("6217000010051320007","88888888",ccbAcc3);
        Card ccbCard5 = new Card("6640000010045442002","88888888",ccbAcc4);
        Card ccbCard6 = new Card("6640000010045442003","88888888",ccbAcc4);
        Card icbcCard5 = new Card("6222081502001312389","88888888",icbcAcc1);
        Card icbcCard6 = new Card("6222081502001312390","88888888",icbcAcc2);
        Card icbcCard7 = new Card("6222081502001312399","88888888",icbcAcc3);
        Card icbcCard8 = new Card("6222081502001312400","88888888",icbcAcc3);
        Card icbcCard9 = new Card("6222081502051320785","88888888",icbcAcc4);
        Card icbcCard10 = new Card("6222081502051320786","88888888",icbcAcc5);
        Card icbcCard11 = new Card("6640000010045441009","88888888",icbcAcc6);
        Card abcCard1 = new Card("6630000010033431001","88888888",abcAcc1);
        Card abcCard2 = new Card("6630000010033431008","88888888",abcAcc2);

        ccbAcc1.addCard(ccbCard1);
        ccbAcc1.addCard(ccbCard2);
        ccbAcc2.addCard(ccbCard3);
        ccbAcc3.addCard(ccbCard4);
        ccbAcc4.addCard(ccbCard5);
        ccbAcc4.addCard(ccbCard6);
        icbcAcc1.addCard(icbcCard5);
        icbcAcc2.addCard(icbcCard6);
        icbcAcc3.addCard(icbcCard7);
        icbcAcc3.addCard(icbcCard8);
        icbcAcc4.addCard(icbcCard9);
        icbcAcc5.addCard(icbcCard10);
        icbcAcc6.addCard(icbcCard11);
        abcAcc1.addCard(abcCard1);
        abcAcc2.addCard(abcCard2);

        StringBuilder sb = new StringBuilder();

        String data;

        while(!((data = input.nextLine()).equals("#"))) {
            sb.append(data + "\n");
        }

        String[] dt = sb.toString().split("\n");
        for(int i = 0; i < dt.length; i++) {
            String[] dataLine = dt[i].toString().split("\\s+");

            if(dataLine.length == 1) {
                GetBalance gb = new GetBalance(unionPay);
                System.out.println("业务:查询余额 "+String.format("¥%.2f", gb.getBalance(dataLine[0])));
            }else {
                Withdraw wd = new Withdraw(unionPay,dataLine[0],dataLine[1],dataLine[2],Double.parseDouble(dataLine[3]));
                wd.withdraw();
            }
        }
    }
}

class Bank {
    private String bankNO;
    private String bankName;
    private ArrayList<Account> accountList = new ArrayList<Account>();
    private ArrayList<ATM> ATMList = new ArrayList<ATM>();

    public Bank() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Bank(String bankNO, String bankName) {
        super();
        this.bankNO = bankNO;
        this.bankName = bankName;
    }

    public String getBankNO() {
        return bankNO;
    }

    public void setBankNO(String bankNO) {
        this.bankNO = bankNO;
    }

    public String getBankName() {
        return bankName;
    }

    public void setBankName(String bankName) {
        this.bankName = bankName;
    }

    public void addAccount(Account account) {
        this.accountList.add(account);
    }

    public void removeAccount(Account account) {
        this.accountList.remove(account);
    }

    public void addATM(ATM aTM) {
        this.ATMList.add(aTM);
    }

    public void removeATM(ATM aTM) {
        this.ATMList.remove(aTM);
    }

    public ArrayList<Account> getAccountList() {
        return accountList;
    }

    public void setAccountList(ArrayList<Account> accountList) {
        this.accountList = accountList;
    }

    public ArrayList<ATM> getATMList() {
        return ATMList;
    }

    public void setATMList(ArrayList<ATM> aTMList) {
        ATMList = aTMList;
    }
}

class User {
    private String ID;
    private String name;
    private String Phone;
    ArrayList<Account> list = new ArrayList<Account>();

    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

    public User(String iD, String name, String phone) {
        super();
        ID = iD;
        this.name = name;
        Phone = phone;
    }

    public String getID() {
        return ID;
    }

    public void setID(String iD) {
        ID = iD;
    }

    public String getPhone() {
        return Phone;
    }

    public void setPhone(String phone) {
        Phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void addAccount(Account account) {
        this.list.add(account);
    }

    public void removeAccount(Account account) {
        this.list.remove(account);
    }
}

class Account {
    private String accountNO;
    private double balance = 0;
    private User user = null;
    private Bank bank = null;
    private String type;
    private static ArrayList<Card> list = new ArrayList<Card>();

    public Account() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Account(String accountNO,String type, double balance, User user, Bank bank) {
        super();
        this.accountNO = accountNO;
        this.balance = balance;
        this.user = user;
        this.bank = bank;
        this.type = type;
    }

    public void addCard(Card card) {
        list.add(card);
    }

    public void removeCard(Card card) {
        list.remove(card);
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public String getAccountNO() {
        return accountNO;
    }

    public void setAccountNO(String accountNO) {
        this.accountNO = accountNO;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Bank getBank() {
        return bank;
    }

    public void setBank(Bank bank) {
        this.bank = bank;
    }

    public ArrayList<Card> getList() {
        return list;
    }

    public void setList(ArrayList<Card> list) {
        Account.list = list;
    }

    public static Account getAmountbyCardNO(String cardNO) {
        Iterator<Card> cardItr = Account.list.iterator();
        Card card = null;

        while(cardItr.hasNext()) {
            card = cardItr.next();
            if(card.getCardNO().equals(cardNO)) {
                return card.getAccount();
            }
        }

        return null;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

class Card {
    private String cardNO;
    private String cardPassword;
    private Account account = null;

    public Card() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Card(String cardNO, String cardPassword, Account account) {
        super();
        this.cardNO = cardNO;
        this.cardPassword = cardPassword;
        this.account = account;
    }

    public String getCardNO() {
        return cardNO;
    }

    public void setCardNO(String cardNO) {
        this.cardNO = cardNO;
    }

    public String getCardPassword() {
        return cardPassword;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public void setCardPassword(String cardPassword) {
        this.cardPassword = cardPassword;
    }

    public boolean checkCard() {
        Pattern p = Pattern.compile("\\d{16}+");
        Matcher m = p.matcher(this.cardNO);
        return m.matches();
    }

    public boolean checkPassword(String password) {
        return this.cardPassword.equals(password);
    }
}

class ATM {
    private String ATMID;
    private Bank bank = null;

    public ATM() {
        super();
        // TODO Auto-generated constructor stub
    }

    public ATM(String aTMID, Bank bank) {
        super();
        ATMID = aTMID;
        this.bank = bank;
    }

    public String getATMID() {
        return ATMID;
    }

    public void setATMID(String aTMID) {
        ATMID = aTMID;
    }

    public Bank getBank() {
        return bank;
    }

    public void setBank(Bank bank) {
        this.bank = bank;
    }
}

class Withdraw {
    private UnionPay unionPay;
    private String cardNO;
    private String cardPassword;
    private String ATMID;
    private String type;
    private double amount;

    public Withdraw() {
        super();
        // TODO Auto-generated constructor stub
    }


    public Withdraw(UnionPay unionPay, String cardNO, String cardPassword, String aTMID, double amount) {
        super();
        this.unionPay = unionPay;
        this.cardNO = cardNO;
        this.cardPassword = cardPassword;
        ATMID = aTMID;
        this.amount = amount;
    }

    public Withdraw(String cardNO, String cardPassword, String aTMID, double amount) {
        super();
        this.cardNO = cardNO;
        this.cardPassword = cardPassword;
        ATMID = aTMID;
        this.amount = amount;
    }


    public void withdraw() {
        /**
         * 校验该卡是否存在
         */
        Card card = ValidateData.getCardbyCardNO(unionPay, cardNO);
        if(card == null) {
            System.out.println("Sorry,this card does not exist.");
            System.exit(0);
        }

        /**
         * 校验ATM是否存在
         */
        ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID);
        if(aTM == null) {
            System.out.println("Sorry,the ATM's id is wrong.");
            System.exit(0);
        }

        Account account = Account.getAmountbyCardNO(cardNO);
        double balance = account.getBalance();

        /**
         * 校验卡密码是否正确
         */
        if(!card.getCardPassword().equals(cardPassword)) {
            System.out.println("Sorry,your password is wrong.");
            System.exit(0);
        }

        /**         8888888888888888888888888888888888888888888888888888888888888888888888888888
         * 校验取款金额是否大于余额,分析是借记卡还是信用卡,更新账户余额。
         */
        if(account.getType().equals("debit")){
            if (amount > balance) {
                System.out.println("Sorry,your account balance is insufficient.");
                System.exit(0);
            }
            if (account.getBank().getBankNO() != aTM.getBank().getBankNO())
            {
                if(aTM.getBank().getBankNO().equals("1001"))
                {
                    if (amount*1.02 > balance) {
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    account.setBalance((balance - amount)-amount*0.02);//取款更新余额操作
                }

                if(aTM.getBank().getBankNO().equals("1002"))
                {
                    if (amount*1.03 > balance) {
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    account.setBalance((balance - amount)-amount*0.03);//取款更新余额操作
                }


                if(aTM.getBank().getBankNO().equals("1003"))
                {
                    if (amount*1.04 > balance) {
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    account.setBalance((balance - amount)-amount*0.04);//取款更新余额操作
                }


            }

            else
                account.setBalance(balance - amount);

        }
        else{
            if (amount > balance+50000-50000*0.05) {
                System.out.println("Sorry,your account balance is insufficient.");
                System.exit(0);
            }
            if (account.getBank().getBankNO() != aTM.getBank().getBankNO())
            {
                if(aTM.getBank().getBankNO().equals("1001"))
                {
                    if (amount*1.02 > balance+50000-50000*0.05) {
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    if(balance - amount*1.02>=0)
                        account.setBalance((balance - amount)-amount*0.02);//取款更新余额操作
//                    else if(balance<0)
//                        account.setBalance(balance - amount*1.05-amount*0.02);
                    else if(balance - amount<0)
                        account.setBalance((balance - amount)*1.05-amount*0.02);//取款更新余额操作
                    else
                        account.setBalance(balance - amount*1.05-amount*0.02);
                }

                if(aTM.getBank().getBankNO().equals("1002"))
                {
                    if (amount*1.03 > balance+50000-50000*0.05) {
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    if(balance - amount*1.02>=0)
                        account.setBalance((balance - amount)-amount*0.03);//取款更新余额操作
                    else if(balance<0)
                        account.setBalance(balance - amount*1.05-amount*0.03);
                    else
                        account.setBalance((balance - amount)*1.05-amount*0.03);//取款更新余额操作
                }
                if(aTM.getBank().getBankNO().equals("1003"))
                {
                    {
                        if (amount*1.04 > balance+50000-50000*0.05) {
                            System.out.println("Sorry,your account balance is insufficient.");
                            System.exit(0);
                        }
                        if(balance - amount*1.02>=0)
                            account.setBalance((balance - amount)-amount*0.04);//取款更新余额操作
                        else if(balance<0)
                            account.setBalance(balance - amount*1.05-amount*0.04);
                        else
                            account.setBalance((balance - amount)*1.05-amount*0.04);//取款更新余额操作
                    }
                }

            }
            else
            {
                if(balance - amount>=0)
                    account.setBalance((balance - amount));//取款更新余额操作
                else if(balance<0)
                {
                    account.setBalance(balance -amount*1.05);
                }
                else
                    account.setBalance((balance - amount)*1.05);
            }


        }
        /**         888888888888888888888888888888888888888888888888888888888888888888888
         * 校验是否为跨行取款
         if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
         System.out.println("Sorry,cross-bank withdrawal is not supported.");
         System.exit(0);
         }

         */

        if(amount >= 0) {
            showResult(account,1);
        }else {
            showResult(account,0);
        }

    }

    public void showResult(Account account,int flag) {
        ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID);
        String type = "";
        if(flag == 1) {
            type = "取款";
        }else {
            type = "存款";
            amount *= -1;
        }
        String userName = account.getUser().getName();
        String bankName = aTM.getBank().getBankName();
        System.out.println("业务:"+type+" "+userName + "在" +
                bankName + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount));
        System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance()));
    }
}

class ValidateData {
    /**
     * 校验卡号是否存在
     * @param unionPay
     * @param cardNO
     * @return
     */
    public static Card getCardbyCardNO(UnionPay unionPay,String cardNO) {
        Card card = null;
        Iterator<Bank> bankItr = unionPay.getBankList().iterator();

        while(bankItr.hasNext()) {
            ArrayList<Account> accountList = bankItr.next().getAccountList();
            Iterator<Account> accountItr = accountList.iterator();
            while(accountItr.hasNext()) {
                ArrayList<Card> cardList = accountItr.next().getList();
                Iterator<Card> cardItr = cardList.iterator();
                while(cardItr.hasNext()) {
                    card = cardItr.next();
                    if(card.getCardNO().equals(cardNO)) {
                        return card;
                    }
                }
            }
        }
        return null;
    }

    /**
     * 校验ATM ID是否存在
     * @param unionPay
     * @param ATMID
     * @return
     */
    public static ATM getATMbyATMID(UnionPay unionPay,String ATMID) {
        Iterator<Bank> bankItr = unionPay.getBankList().iterator();
        Bank bank = null;
        ATM aTM = null;

        while(bankItr.hasNext()) {
            bank = bankItr.next();
            Iterator<ATM> aTMItr = bank.getATMList().iterator();

            while(aTMItr.hasNext()) {
                aTM = aTMItr.next();
                if(aTM.getATMID().equals(ATMID)) {
                    return aTM;
                }
            }
        }
        return null;
    }
}

class UnionPay {
    private ArrayList<Bank> bankList = new ArrayList<Bank>();

    public UnionPay() {
        super();
        // TODO Auto-generated constructor stub
    }

    public UnionPay(ArrayList<Bank> bankList) {
        super();
        this.bankList = bankList;
    }

    public ArrayList<Bank> getBankList() {
        return bankList;
    }

    public void setBankList(ArrayList<Bank> bankList) {
        this.bankList = bankList;
    }

    public void addBank(Bank bank) {
        this.bankList.add(bank);
    }

    public void removeBank(Bank bank) {
        this.bankList.remove(bank);
    }
}

class GetBalance {
    private UnionPay unionPay;

    public GetBalance() {
        super();
        // TODO Auto-generated constructor stub
    }

    public GetBalance(UnionPay unionPay) {
        super();
        this.unionPay = unionPay;
    }

    public double getBalance(String cardNO) {
        return ValidateData.getCardbyCardNO(unionPay, cardNO).getAccount().getBalance();
    }
}



//存款进来肯定不对因为withdraw方法全是考虑amount为+

  第二次的设计只需要我们对第一次的账户类进行修改,而后将atm中的取款操作进行改进使其实现透支取款和跨行取款的业务

解题思路:按部就班的用代码实现类图中规定的属性和方法,并通过不断的调试与分析,最终得出能通过所有测试点的代码提交即可。

l  采坑心得

  写代码从来都不是一蹴而就的,bug与异常肯定再所难免,在此我来谈谈本次习题除了语法错误还有关于yi'shi的细节之外导致我没有通过测试点的大几个“坑”

 

 

         1. 子类继承父类的一个小坑

 

子类继承父类,如果重写了父类构造方法中包含的方法(如此次测试的init()方法),一定要注意,在子类中声明的变量(如此次测试的sonStr1和sonStr2),即使初始化了,仍会是默认值(此次为String类型,所以为null),如果子类声明的变量是和父类同名的变量,会以父类的为准。子类继承父类,只有重写方法有效,重写属性无效。在子类声明的变量,无论是否初始化了,在父类的构造方法阶段,都不能拿到子类声明的变量属性,只有执行到子类的构造方法,才能得到。因此一定要注意是不是做好空处理,不然就是崩溃问题

 

         2. java多态注意事项

 

1、private 修饰的方法没有多态特性

  

复制代码
 public class PrivateOverride {
        
        /**
         * dddd
         */
        private void f(){
            System.out.println("private f()");
        }
        
        public static void main(String[] args) {
            PrivateOverride po = new Derived();
            po.f();
        }
    }
    class Derived extends PrivateOverride {
        /**
         * eeee
         */
        public void f(){
            
            System.out.println("public f()");
        }
    }
复制代码

 



输入结果为private f()

因为父类的方法都是私有的,自然不会被子类重写,而呈现多态特性。


2、成员变量不呈现多态特性,只针对方法(非静态,非私有)

   

复制代码
class Super{
        public int field = 0;
        public int getField(){
            return field;
        }
    }
    class Sub extends Super{
        public int field = 1;
        public int getField(){
            return field;
        }
        
        public int getSuperField(){
            return super.field;
        }
    }
    public class FieldAccess {
     
        public static void main(String[] args) {
            Super sup = new Sub();
            System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
            Sub sub = new Sub();
            System.out.println("sub.field = " +
                    sub.field + ", sub.getField() = " +
                    sub.getField() +
                    ", sub.getSuperField() = " +
                    sub.getSuperField());
        }
    }
复制代码

 


输入结果:

    sup.field = 0, sup.getField() = 1
    sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0


3、静态方法也不呈现多态特性

 

复制代码
  class StaticSuper{
        public static String staticGet(){
            return "Base staticGet()";
        }
        
        public String dynamicGet(){
            return "Base dynamicGet()";
        }
    }
    class StaticSub extends StaticSuper{
        public static String staticGet(){
            return "Derived staticGet()";
        }
        public String dynamicGet(){
            return "Derived dynamicGet()";
        }
    }
    public class StaticPolymorphism {
     
        public static void main(String[] args) {
            StaticSuper  sup = new StaticSub();
            System.out.println(sup.staticGet());
            System.out.println(sup.dynamicGet());
        }
    }
复制代码

 



输入结果:

    Base staticGet()
    Derived dynamicGet()

  

l  改进建议

  丰富测试样例,使其具有普遍性,以便保证最终提交的程序没有bug

l  总结

   通过以上的编程练习,进行了对JAVA语言的进一步学习。众所周知面向对象编程的三大核心是:封装,继承,多态。现在我对这三者都有所了解和实践,对其有一定的掌握,在面向对象的程序设计上又有了新的进步。所谓继承,即子类与父类,继承的设计可以极大的提高我们代码的复用性。而多态提高了代码的维护性(继承保证);提高了代码的扩展性。为以后职业生涯的发展奠定了基础,在成为顶级软件工程师的道路上又迈出了坚实的一步,以后的道路能少走弯路,希望以后的学习生涯能顺风顺水。

 
 
posted on 2021-06-20 11:50  要成为山巅的男人  阅读(116)  评论(0)    收藏  举报