OOP第三次作业

  1. 前言:

  在三次作业中,第一次作业是两道卡片求值题,第一题只用到类、字段、方法、构造方法的知识。第二题则在此基础上增加了类的继承、字段与方法的增加与覆盖,几个图形类均继承自Shape,并增加了接口,达到多重继承的效果。

 

  第二次作业和第三次作业都是关于银行的一个程序,随着功能和规则增多难度逐渐增加。从设计层面,除了用于功能实现的ATMAccountUserCardUnionpayBank等等类,还必须添加连接这些单一职责类的“胶水”,但是我在第二次作业时没能写出这些“胶水”程序,导致我无法将我写出的庞杂冗长的程序运行实现。

 

  第三次作业,在老师讲解的基础上,我理解并增加了GetBalanceValidateDateWithdarw三个类。是不是看名称就知道这三个类的作用了,有了这三根金手指,我很快就写出了这个银行程序。只能说agent程序非常妙。

 

  1. 设计与分析:

三次作业的类图如下:

第七次作业

 

 

 

第八及第九次作业

 

 

 

圈复杂度分析结果如下:

第七次作业:

因为我按照pta的要求把所有类放进同一个文件了,所以分析结果只有总行数非常高,其它数据无法得出。

 

 

 

 

 

 

第八次及第九次作业:

因为是在老师的基础上改的,所以圈复杂度和函数深度头一次达标了(老泪纵横),比较高的数值只有函数数目和注释比例。

 

 

 

3.采坑心得:

      第七次作业因为是五一布置的,比较容易,但我还是有两个点一直通过不了,也来不及找出问题。第八次则完全没做出来,只拿了一个错误输入的分。

  第九次作业增加了几个用户和一个银行,这个只要仔细就可以了。然后卡被分成了贷记卡和信用卡,信用卡可以透支,我最初在Card类里增加了信用卡,但是运行错误了,改了好多次,最终在Account类里直接增加一个参数,在输入数据的时候就直接标记能透支和不能透支的账户,终于可以了。最后这次ATM可以跨行,将原本不能跨行的判断代码注释即可。

 

以下是三次作业的源码:

import java.util.ArrayList;

import java.util.Scanner;

import java.util.Collections;

 

public class Main {

    static Scanner input = new Scanner(System.in);

public static void main(String[] args) {

// TODO 自动生成的方法存根

 

        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();

        }

        if(list.size() == 0) {

System.out.println("Wrong Format");

            System.exit(0);

}

        DealCardList dealCardList = new DealCardList(list);

        if(!dealCardList.validate()){

            System.out.println("Wrong Format");

            System.exit(0);

        }

        dealCardList.showResult();

        input.close();

}

}

 

 

class DealCardList {

 ArrayList<Card> cardList = new ArrayList<>();

 ArrayList<Card> cir = new ArrayList<>();

 ArrayList<Card> rec = new ArrayList<>();

 ArrayList<Card> tri = new ArrayList<>();

 ArrayList<Card> tra = new ArrayList<>();

 

    public DealCardList() {

    }

 

public DealCardList(ArrayList<Integer> list) {

 

super();

 

for(int j : list) {

switch(j) {

case 1:

Card circle = new Card(new Circle(Main.input.nextDouble()));

circle.getShape().setShapeName("Circle");

cardList.add(circle);

cir.add(circle);

break;

case 2:

Card rectangle = new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));

rectangle.getShape().setShapeName("Rectangle");

cardList.add(rectangle);

rec.add(rectangle);

break;

case 3:

 Card triangle=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));

 triangle.getShape().setShapeName("Triangle");

                 cardList.add(triangle);

                 tri.add(triangle);

break;

case 4:

                Card trapezoid = new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));

                trapezoid.getShape().setShapeName("Trapezoid");

                cardList.add(trapezoid);

                tra.add(trapezoid);

break;

 

}

}

}

 

public boolean validate() {

 

for(int i=0;i<cardList.size();i++){

if(cardList.get(i).getShape().validate() == false)

return false;

}

 

return true;

}

 

 

public void cardSort(ArrayList<Card> list) {

for(int i = 0; i < list.size(); i ++) {

for(int j = i + 1; j < list.size(); j ++){

if(list.get(i).getShape().getArea() < list.get(j).getShape().getArea())

Collections.swap(list, i, j);

}

System.out.print(list.get(i).getShape());

}

 

}

 

public double getAllArea(ArrayList<Card> list) {

double sum = 0;

 

        for (Card card :list) {

            sum += card.getShape().getArea();

        }

 

return sum;

}

    

 

public void getMaxArea() {

double[] sum = new double[4];

double max = 0;

sum[0] = getAllArea(cir);

sum[1] = getAllArea(rec);

sum[2] = getAllArea(tri);

sum[3] = getAllArea(tra);

 

for(int i = 0; i < sum.length; i++) {

if(max < sum[i]) {

max = sum[i];

}

}

System.out.printf("%.2f",max);

 

}

public void showResult() {

        System.out.println("The original list:");

        System.out.print("[");

        for (Card card : cardList) {

            System.out.print(card.getShape());

        }

        System.out.println("]");

        

        System.out.println("The Separated List:");

        

        System.out.print("[");

        for (Card card : cir) {

            System.out.print(card.getShape());

        }

        System.out.print("]");

        

        System.out.print("[");

        for (Card card : rec) {

            System.out.print(card.getShape());

        }

        System.out.print("]");

        

        System.out.print("[");

        for (Card card : tri) {

            System.out.print(card.getShape());

        }

        System.out.print("]");

        

        System.out.print("[");

        for (Card card : tra) {

            System.out.print(card.getShape());

        }

        System.out.print("]");

        

        System.out.println();

 

        System.out.println("The Separated sorted List:");

        

        System.out.print("[");

        cardSort(cir);

        System.out.print("]");

        

        System.out.print("[");

        cardSort(rec);

        System.out.print("]");

        

        System.out.print("[");

        cardSort(tri);

        System.out.print("]");

        

        System.out.print("[");

        cardSort(tra);

        System.out.print("]");

        

        

        System.out.println();

        System.out.printf("The max area:");

 

        getMaxArea();

}

}

 

 

 

interface Comparable{

public int compareTo(Card card);

}

 

class Card implements Comparable{

    private Shape shape;

 

    public Card() {

    }

 

    public Card(Shape shape) {

        this.shape = shape;

    }

 

    public Shape getShape() {

        return shape;

    }

 

    public void setShape(Shape shape) {

        this.shape = shape;

    }

    

    @Override

    public int compareTo(Card card) {

        return -(int)(shape.getArea()-card.getShape().getArea());

    }

}

 

abstract class Shape {

    private String shapeName;

 

    public Shape() {

    }

 

    public Shape(String shapeName) {

        this.shapeName = shapeName;

    }

 

    public String getShapeName() {

        return shapeName;

    }

 

    public void setShapeName(String shapeName) {

        this.shapeName = shapeName;

    }

    

    public abstract double getArea();

    public abstract boolean validate();

 

 

    @Override

    public String toString() {

        return getShapeName()+":"+String.format("%.2f", getArea()) + " ";

    }

 

 

}

 

class Circle extends Shape{

 

private double radius;

 

public Circle(double radius) {

super();

this.radius = radius;

}

 

public double getRadius() {

return radius;

}

 

public void setRadius(double radius) {

this.radius = radius;

}

 

@Override

public double getArea() {

// TODO 自动生成的方法存根

return Math.PI*radius*radius;

}

 

@Override

public boolean validate() {

// TODO 自动生成的方法存根

if(radius < 0) {

return false;

}

return true;

}

 

}

 

class Triangle extends Shape{

private double side1;

private double side2;

private double side3;

public Triangle(double side1, double side2, double side3) {

super();

this.side1 = side1;

this.side2 = side2;

this.side3 = side3;

 

if(validate() == false) {

System.out.println("Wrong Format");

System.exit(0);

}

}

public double getSide1() {

return side1;

}

public void setSide1(double side1) {

this.side1 = side1;

}

public double getSide2() {

return side2;

}

public void setSide2(double side2) {

this.side2 = side2;

}

public double getSide3() {

return side3;

}

public void setSide3(double side3) {

this.side3 = side3;

}

 

@Override

public double getArea() {

// TODO 自动生成的方法存根

double p = ( side1 + side2 + side3 ) / 2;

 

return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));

}

 

@Override

public boolean validate() {

// TODO 自动生成的方法存根

if( ( side1 + side2) <= side3 || (side2 + side3 ) <= side1 || (side1 + side3 ) <= side2 || side1 < 0 || side2 < 0 || side3 < 0)

return false;

 

return true;

}

}

 

class Rectangle extends Shape{

 

private double width;

private double length;

 

 

public Rectangle(double width, double length) {

super();

this.width = width;

this.length = length;

 

}

 

public double getWidth() {

return width;

}

 

public void setWidth(double width) {

this.width = width;

}

 

public double getLength() {

return length;

}

 

public void setLength(double length) {

this.length = length;

}

 

@Override

public double getArea() {

// TODO 自动生成的方法存根

return width*length;

}

 

@Override

public boolean validate() {

if(width < 0|| length < 0) {

return false;

}

// TODO 自动生成的方法存根

return true;

}

 

}

 

class Trapezoid extends Shape{

 

private double upside;

private double downside;

private double height;

public Trapezoid() {

super();

// TODO 自动生成的构造函数存根

}

public Trapezoid(double upside, double downside, double height) {

super();

this.upside = upside;

this.downside = downside;

this.height = height;

}

public double getUpside() {

return upside;

}

public void setUpside(double upside) {

this.upside = upside;

}

public double getDownside() {

return downside;

}

public void setDownside(double downside) {

this.downside = downside;

}

public double getHeight() {

return height;

}

public void setHeight(double height) {

this.height = height;

}

 

public double getArea() {

// TODO 自动生成的方法存根

return (upside + downside) * height * 0.5 ;

}

 

 

public boolean validate() {

if(upside < 0|| downside < 0 || height < 0) {

return false;

}

// TODO 自动生成的方法存根

return true;

}

}

 

 

import java.util.ArrayList;

import java.util.Scanner;

import java.util.Collections;

 

public class Main {

    static Scanner input = new Scanner(System.in);

public static void main(String[] args) {

// TODO 自动生成的方法存根

 

        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();

        }

        if(list.size() == 0) {

System.out.println("Wrong Format");

            System.exit(0);

}

        DealCardList dealCardList = new DealCardList(list);

        if(!dealCardList.validate()){

            System.out.println("Wrong Format");

            System.exit(0);

        }

        dealCardList.showResult();

        input.close();

}

}

 

 

class DealCardList {

 ArrayList<Card> cardList = new ArrayList<>();

 ArrayList<Card> cir = new ArrayList<>();

 ArrayList<Card> rec = new ArrayList<>();

 ArrayList<Card> tri = new ArrayList<>();

 ArrayList<Card> tra = new ArrayList<>();

 

    public DealCardList() {

    }

 

public DealCardList(ArrayList<Integer> list) {

 

super();

 

for(int j : list) {

switch(j) {

case 1:

Card circle = new Card(new Circle(Main.input.nextDouble()));

circle.getShape().setShapeName("Circle");

cardList.add(circle);

cir.add(circle);

break;

case 2:

Card rectangle = new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));

rectangle.getShape().setShapeName("Rectangle");

cardList.add(rectangle);

rec.add(rectangle);

break;

case 3:

 Card triangle=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));

 triangle.getShape().setShapeName("Triangle");

                 cardList.add(triangle);

                 tri.add(triangle);

break;

case 4:

                Card trapezoid = new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));

                trapezoid.getShape().setShapeName("Trapezoid");

                cardList.add(trapezoid);

                tra.add(trapezoid);

break;

 

}

}

}

 

public boolean validate() {

 

for(int i=0;i<cardList.size();i++){

if(cardList.get(i).getShape().validate() == false)

return false;

}

 

return true;

}

 

 

public void cardSort(ArrayList<Card> list) {

for(int i = 0; i < list.size(); i ++) {

for(int j = i + 1; j < list.size(); j ++){

if(list.get(i).getShape().getArea() < list.get(j).getShape().getArea())

Collections.swap(list, i, j);

}

System.out.print(list.get(i).getShape());

}

 

}

 

public double getAllArea(ArrayList<Card> list) {

double sum = 0;

 

        for (Card card :list) {

            sum += card.getShape().getArea();

        }

 

return sum;

}

    

 

public void getMaxArea() {

double[] sum = new double[4];

double max = 0;

sum[0] = getAllArea(cir);

sum[1] = getAllArea(rec);

sum[2] = getAllArea(tri);

sum[3] = getAllArea(tra);

 

for(int i = 0; i < sum.length; i++) {

if(max < sum[i]) {

max = sum[i];

}

}

System.out.printf("%.2f",max);

 

}

public void showResult() {

        System.out.println("The original list:");

        System.out.print("[");

        for (Card card : cardList) {

            System.out.print(card.getShape());

        }

        System.out.println("]");

        

        System.out.println("The Separated List:");

        

        System.out.print("[");

        for (Card card : cir) {

            System.out.print(card.getShape());

        }

        System.out.print("]");

        

        System.out.print("[");

        for (Card card : rec) {

            System.out.print(card.getShape());

        }

        System.out.print("]");

        

        System.out.print("[");

        for (Card card : tri) {

            System.out.print(card.getShape());

        }

        System.out.print("]");

        

        System.out.print("[");

        for (Card card : tra) {

            System.out.print(card.getShape());

        }

        System.out.print("]");

        

        System.out.println();

 

        System.out.println("The Separated sorted List:");

        

        System.out.print("[");

        cardSort(cir);

        System.out.print("]");

        

        System.out.print("[");

        cardSort(rec);

        System.out.print("]");

        

        System.out.print("[");

        cardSort(tri);

        System.out.print("]");

        

        System.out.print("[");

        cardSort(tra);

        System.out.print("]");

        

        

        System.out.println();

        System.out.printf("The max area:");

 

        getMaxArea();

}

}

 

 

 

interface Comparable{

public int compareTo(Card card);

}

 

class Card implements Comparable{

    private Shape shape;

 

    public Card() {

    }

 

    public Card(Shape shape) {

        this.shape = shape;

    }

 

    public Shape getShape() {

        return shape;

    }

 

    public void setShape(Shape shape) {

        this.shape = shape;

    }

    

    @Override

    public int compareTo(Card card) {

        return -(int)(shape.getArea()-card.getShape().getArea());

    }

}

 

abstract class Shape {

    private String shapeName;

 

    public Shape() {

    }

 

    public Shape(String shapeName) {

        this.shapeName = shapeName;

    }

 

    public String getShapeName() {

        return shapeName;

    }

 

    public void setShapeName(String shapeName) {

        this.shapeName = shapeName;

    }

    

    public abstract double getArea();

    public abstract boolean validate();

 

 

    @Override

    public String toString() {

        return getShapeName()+":"+String.format("%.2f", getArea()) + " ";

    }

 

 

}

 

class Circle extends Shape{

 

private double radius;

 

public Circle(double radius) {

super();

this.radius = radius;

}

 

public double getRadius() {

return radius;

}

 

public void setRadius(double radius) {

this.radius = radius;

}

 

@Override

public double getArea() {

// TODO 自动生成的方法存根

return Math.PI*radius*radius;

}

 

@Override

public boolean validate() {

// TODO 自动生成的方法存根

if(radius < 0) {

return false;

}

return true;

}

 

}

 

class Triangle extends Shape{

private double side1;

private double side2;

private double side3;

public Triangle(double side1, double side2, double side3) {

super();

this.side1 = side1;

this.side2 = side2;

this.side3 = side3;

 

if(validate() == false) {

System.out.println("Wrong Format");

System.exit(0);

}

}

public double getSide1() {

return side1;

}

public void setSide1(double side1) {

this.side1 = side1;

}

public double getSide2() {

return side2;

}

public void setSide2(double side2) {

this.side2 = side2;

}

public double getSide3() {

return side3;

}

public void setSide3(double side3) {

this.side3 = side3;

}

 

@Override

public double getArea() {

// TODO 自动生成的方法存根

double p = ( side1 + side2 + side3 ) / 2;

 

return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));

}

 

@Override

public boolean validate() {

// TODO 自动生成的方法存根

if( ( side1 + side2) <= side3 || (side2 + side3 ) <= side1 || (side1 + side3 ) <= side2 || side1 < 0 || side2 < 0 || side3 < 0)

return false;

 

return true;

}

}

 

class Rectangle extends Shape{

 

private double width;

private double length;

 

 

public Rectangle(double width, double length) {

super();

this.width = width;

this.length = length;

 

}

 

public double getWidth() {

return width;

}

 

public void setWidth(double width) {

this.width = width;

}

 

public double getLength() {

return length;

}

 

public void setLength(double length) {

this.length = length;

}

 

@Override

public double getArea() {

// TODO 自动生成的方法存根

return width*length;

}

 

@Override

public boolean validate() {

if(width < 0|| length < 0) {

return false;

}

// TODO 自动生成的方法存根

return true;

}

 

}

 

class Trapezoid extends Shape{

 

private double upside;

private double downside;

private double height;

public Trapezoid() {

super();

// TODO 自动生成的构造函数存根

}

public Trapezoid(double upside, double downside, double height) {

super();

this.upside = upside;

this.downside = downside;

this.height = height;

}

public double getUpside() {

return upside;

}

public void setUpside(double upside) {

this.upside = upside;

}

public double getDownside() {

return downside;

}

public void setDownside(double downside) {

this.downside = downside;

}

public double getHeight() {

return height;

}

public void setHeight(double height) {

this.height = height;

}

 

public double getArea() {

// TODO 自动生成的方法存根

return (upside + downside) * height * 0.5 ;

}

 

 

public boolean validate() {

if(upside < 0|| downside < 0 || height < 0) {

return false;

}

// TODO 自动生成的方法存根

return true;

}

}

 

package 新建;

 

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("360101200012302552","张三丰","13800021124");

     User Linghuchong = new User("360502199805163221","令狐冲","13952110011");

     User Qiaofeng = new User("360201200513243326","乔峰","13025996587");

     User Hongqigong = new User("360201200513243326","洪七公","13025996587");

     //身份证,电话号码不确定

    

    

     Account ccbAcc1 = new Account("3217000010041315709",10000.00,Yangguo,ccb,0);

     Account ccbAcc2 = new Account("3217000010041315715",10000.00,Yangguo,ccb,0);

     Account ccbAcc3 = new Account("3217000010051320007",10000.00,Guojing,ccb,0);

     Account icbcAcc1 = new Account("3222081502001312389",10000.00,Zhangwuji,icbc,0);

     Account icbcAcc2 = new Account("3222081502001312390",10000.00,Zhangwuji,icbc,0);

     Account icbcAcc3 = new Account("3222081502001312399",10000.00,Zhangwuji,icbc,0);

     Account icbcAcc4 = new Account("3222081502051320785",10000.00,Weixiaobao,icbc,0);

     Account icbcAcc5 = new Account("3222081502051320786",10000.00,Weixiaobao,icbc,0);

     Account ccbAcc4 = new Account("3640000010045442002",10000.00,Zhangsanfeng,ccb,1);

     Account icbcAcc6 = new Account("3640000010045441009",10000.00,Linghuchong,icbc,1);

     Account abcAcc1 = new Account("3630000010033431001",10000.00,Qiaofeng,abc,1);

     Account abcAcc2 = new Account("3630000010033431008",10000.00,Hongqigong,abc,1);

     //创建账户

    

    

     ccb.addAccount(ccbAcc1);

     ccb.addAccount(ccbAcc2);

     ccb.addAccount(ccbAcc3);

     icbc.addAccount(icbcAcc1);

     icbc.addAccount(icbcAcc2);

     icbc.addAccount(icbcAcc3);

     icbc.addAccount(icbcAcc4);

     icbc.addAccount(icbcAcc5);

     ccb.addAccount(ccbAcc4);

     icbc.addAccount(icbcAcc6);

     abc.addAccount(abcAcc1);

     abc.addAccount(abcAcc2);

     //账户加入银行

    

     //System.out.println(ccb.getAccountList());

     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 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 ccbCard5 = new Card("6640000010045442002","88888888",ccbAcc4);

     Card ccbCard6 = new Card("6640000010045442003","88888888",ccbAcc4);

     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);

     icbcAcc1.addCard(icbcCard5);

     icbcAcc2.addCard(icbcCard6);

     icbcAcc3.addCard(icbcCard7);

     icbcAcc3.addCard(icbcCard8);

     icbcAcc4.addCard(icbcCard9);

     icbcAcc5.addCard(icbcCard10);

     ccbAcc4.addCard(ccbCard5);

     ccbAcc4.addCard(ccbCard6);

     icbcAcc6.addCard(icbcCard11);

     abcAcc1.addCard(abcCard1);

     abcAcc2.addCard(abcCard2);

     //卡号加入账户

    

     StringBuilder sb = new StringBuilder();

     //可连接的字符串sb,用于存储输入

     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 static ArrayList<Card> list = new ArrayList<Card>();

    private int flag=0;

    public Account() {

        super();

        // TODO Auto-generated constructor stub

    }   

 

    public Account(String accountNO, double balance, User user, Bank bank,int flag) {

super();

this.accountNO = accountNO;

this.balance = balance;

this.user = user;

this.bank = bank;

this.flag = flag;

    }

 

public int getFlag() {

return flag;

}

 

public void setFlag(int flag) {

this.flag = flag;

}

 

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;

}

}

 

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 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);//获取了一个对象

//System.out.println(account.getAccountNO());

double balance = account.getBalance();

 

/**

 * 校验卡密码是否正确

 */

if(!card.getCardPassword().equals(cardPassword)) {

System.out.println("Sorry,your password is wrong.");

System.exit(0);

}

 

/**

 * 校验取款金额是否大于余额

 */

 

if (amount >balance&&account.getFlag()==0) {

System.out.println("Sorry,your account balance is insufficient.");

System.exit(0);

}

else if(account.getFlag()==1&&(balance-amount*1.05)<-50000) {

System.out.println("Sorry,your account balance is insufficient.");

System.exit(0);

}

 

/**

 * 校验是否为跨行取款并获取余额

 */

if(account.getFlag()==0) {

if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {

 

if(aTM.getBank().getBankNO()=="1001")

account.setBalance(balance - amount-0.02*amount);

if(aTM.getBank().getBankNO()=="1002")

account.setBalance(balance - amount-0.03*amount);

 

if(aTM.getBank().getBankNO()=="1003")

account.setBalance(balance - amount-0.04*amount);

 

if (amount>account.getBalance()) {

System.out.println("Sorry,your account balance is insufficient.");

System.exit(0);

}

 

if(amount >= 0) {

showResult(account,1,aTM);

}else {

showResult(account,0,aTM);

}

//System.exit(0);

}

 

else {

account.setBalance(balance - amount);//取款更新余额操作

 

if(amount >= 0) {

showResult(account,1,aTM);

}else {

showResult(account,0,aTM);

}

 

}}//借记账户------------------------------------------

else {

 

if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {

if(amount>balance&&balance>0) {

if(aTM.getBank().getBankNO()=="1001")

account.setBalance(balance - amount-0.02*amount- (amount-balance)*0.05);

if(aTM.getBank().getBankNO()=="1002")

account.setBalance(balance - amount-0.03*amount- (amount-balance)*0.05);

 

if(aTM.getBank().getBankNO()=="1003")

account.setBalance(balance - amount-0.04*amount- (amount-balance)*0.05);

 

if (account.getBalance()<-50000) {

System.out.println("Sorry,your account balance is insufficient.");

System.exit(0);

}

 

 

if(amount >= 0) {

showResult(account,1,aTM);

}else {

showResult(account,0,aTM);

}

}//余额不足且余额为正

else if(amount>balance&&balance<=0) {

if(aTM.getBank().getBankNO()=="1001")

account.setBalance(balance - amount-0.02*amount- amount*0.05);

if(aTM.getBank().getBankNO()=="1002")

account.setBalance(balance - amount-0.03*amount- amount*0.05);

 

if(aTM.getBank().getBankNO()=="1003")

account.setBalance(balance - amount-0.04*amount- amount*0.05);

 

if (account.getBalance()<-50000) {

System.out.println("Sorry,your account balance is insufficient.");

System.exit(0);

}

 

 

if(amount >= 0) {

showResult(account,1,aTM);

}else {

showResult(account,0,aTM);

}

}

else {

if(aTM.getBank().getBankNO()=="1001")

account.setBalance(balance - amount-0.02*amount);

if(aTM.getBank().getBankNO()=="1002")

account.setBalance(balance - amount-0.03*amount);

 

if(aTM.getBank().getBankNO()=="1003")

account.setBalance(balance - amount-0.04*amount);

 

if (account.getBalance()-amount <-50000) {

System.out.println("Sorry,your account balance is insufficient.");

System.exit(0);

}

 

if(amount >= 0) {

showResult(account,1,aTM);

}else {

showResult(account,0,aTM);

}

//System.exit(0);

}

 

}//跨行办理

 

else {

 

    if(balance<amount&&balance>0) {

     account.setBalance(balance - (amount-balance)*0.05-amount);

    }

   

    else if(balance<amount&&balance<=0){

     account.setBalance(balance - amount*0.05-amount);

    }

    else

    account.setBalance(balance - amount);//取款更新余额操作

 

if (account.getBalance()-amount <-50000) {

System.out.println("Sorry,your account balance is insufficient.");

System.exit(0);

}

 

if(amount >= 0) {

showResult(account,1,aTM);

}else {

showResult(account,0,aTM);

}

}

 

}//贷记账户---------------------------

}

 

public void showResult(Account account,int flag,ATM aTM) {

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();

}

}

 

         4.改进建议:最后一次作业了,就不写什么改进建议了吧,建议百度不要老给我推值发广告我搜代码但我没秃呀没秃!

 

         5.总结:PTA里的测试点,测试用例主要从边界值,特殊值,错误输入值这三方面来检验。因此debug是必不可少的Debug可以在每一步中检查每一个值,表达式的变化,找到异常的数值,从而找出错误,这样会让测试更加简便。

经过本学期对JAVA的学习,我们对OOP也有所理解和感悟。面向对象程序设计有封装性、继承性与多态性三大技术特性。这三个技术特性的关系密切,封装可以使代码模块化,而继承可以实现父类子类之间模块的联系,再赋予多态用于接口,使接口重用。这样相互配合就可以提高代码的逻辑性和复用性。总结起来就是一句话OOP=对象+类+继承+多态+消息。

其次就是面向对象设计有两个基本原则,单一职责原则和开闭原则。单一职责原则是一个类只负责一项职责。而开闭原则是指应该对扩展开放,对修改关闭。换句话说,如果修改或者添加一个功能,应该是通过扩展原来的代码,而不是通过修改原来的代码。

最后要说的是UML图的应用。在平时的作业里我发现给了UML图程序实现起来就很轻松,而没有UML的程序就需要你自己去设计。“类”顾名思义起到了分类的作用,让你的程序更有逻辑性和可读性,成为你解决问题的框架。同时也提升了复用性。再结合封装性、继承性与多态性三大技术特性也就完成了OOP。

 

posted on 2021-06-20 11:45  hcjl  阅读(59)  评论(0)    收藏  举报

导航