第三次blog作业

前言:主要考察类的继承、多态性使用方法以及接口的应用,以及实际编程能力,题量少但比较复杂,需考量许多细节。

一、图形卡片排序游戏

目标 :掌握类的继承、多态性使用方法以及接口的应用。

要求 :(1)卡片大小排序游戏规则

        考虑一款适合于小学生的卡片(Card)排序游戏,其规则为随机发放一些卡片给学生,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种 卡片的相应参数,要求学生能够迅速求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排 序,同时求出所有卡片的面积之和。

       (2)Comparable 接口的应用

         要求对卡片排序时使用 Comparable 接口, 即 Card 类需要实现 Comparable 接口中的 CompareTo()方法。

程序功能需求:

     (1)实现功能

        本程序仅用于为学生所玩的游戏提供正确答案的功能,即根据学生得到的卡片种类与数量,给出 排序前和排序后的卡片顺序,同时给出所有卡片的面积之和。

      (2)输入输出规则

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

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

输入、输出字符编码采用 utf-8 格式,例如,逗号为英文半角字符“,”,而非中文全角字符“,”。、

类图:

 

 

 SourceMonitor的生成报表:

 

 

 

 

 

 代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;


public class Main {
    public static boolean checkABC(double a,double b,double c)
    {
        if(a<0||b<0||c<0)
        {
            return false;
        }
        else
            return true;
    }
    
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(); 
        }
       
        CardList cardlist = new CardList(list);
        if(!cardlist.Check())
        {
            System.out.println("Wrong Format");
            System.exit(0);
        }
        cardlist.showResult();
        input.close();

    }        

}

class Shape{
    private String shapeName;
    public String getShapeName() {
        return shapeName;
    }
    public void setShapeName(String shapeName) {
        this.shapeName = shapeName;
    }
    public Shape(){
    }
    public double getArea() {//求图形面积
        return 0.0;
    }
    public boolean Check() {
        return true;
    }
}
class Circle extends Shape {
    private double radius;   //半径

    public Circle(double radius){
        this.radius = radius;
    }
    
    public void setRadius(double radius){
        this.radius = radius;
    }
    
    public double getRadius(){
        return radius;
    }
    
    public double getArea(){
        return Math.PI * radius * radius;
    }
    
    public  boolean Check(double radius) {
        if(radius<=0) {
            return false;
        }
        else
            return true;
    }

} 


class Rectangle extends Shape {
    private double width;   //
    private double 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;
    }

    
    public Rectangle(double width,double length) {
        this.width = width;
        this.length = length;
    }
    public double getArea() {
        return width * length;
    }
    
    public  boolean Check(double width,double length){
        if(width<0||length<0){
            return false;
        }
        else
            return true;
    }

}


class Triangle extends Shape{
    private double side1;   //边长1
    private double side2;   //边长2
    private double side3;   //边长3
    
    public double getWidth() {
        return side1;
    }

    public void setWidth(double width) {
        this.side1 = width;
    }

    public double getLength() {
        return side2;
    }

    public void setLength(double length) {
        this.side2 = length;
    }

    public double getHeight() {
        return side3;
    }

    public void setHeight(double height) {
        this.side3 = height;
    }

    
    public Triangle(double width,double length,double height) {
        this.side1 = width;
        this.side2 = length;
        this.side3=height;
    }
    public double getArea() {
        double s = (side1+side2+side3)/2.0;
        return (double)Math.sqrt(s*(s-side1)*(s-side2)*(s-side3));
    }
    public boolean Check(double n1, double n2, double n3) {
        if ((n1 + n2 > n3) && (n2 + n3 > n1) && (n1 + n3 > n2) && (n1>0) && (n2>0) && (n2>0)) {
            return true;
        } else {
            return false;
        }    
    }
}

class Trapezoid extends Shape {
    private double shangdi;   //上底
    private double xiadi;   //下底
    private double gao;   //
    
    public double getWidth() {
        return shangdi;
    }

    public void setWidth(double width) {
        this.shangdi = width;
    }

    public double getLength() {
        return xiadi;
    }

    public void setLength(double length) {
        this.xiadi = length;
    }

    public double getHeight() {
        return gao;
    }

    public void setHeight(double height) {
        this.gao = height;
    }

    
    public Trapezoid(double width,double length,double height) {
        this.shangdi = width;
        this.xiadi = length;
        this.gao=height;
    }
    public double getArea() {
        return (shangdi+xiadi)*gao/2;
    }
     public  Boolean Check(double shangdi,double xiadi,double gao) {
        if(shangdi<0||xiadi<0||gao<0){
            return false;
        }
        else
            return true;
    }
}

class Card {
    Shape shape;
    public Shape getShape() {
        return shape;
    }
    public void setShape(Shape shape) {
        this.shape = shape;
    }
    public Card(Shape shape) {
        // TODO Auto-generated constructor stub
        this.shape=shape;
    }
        
}

class CardList{
    ArrayList<Card> cardList= new ArrayList<Card>();
    CardList (ArrayList<Integer> list){
        for(int i=0;i<list.size();i++){
            if(list.get(i)==1){
                double radius=Main.input.nextDouble();
                Circle circle=new Circle(radius);
                Card card=new Card(circle);
                card.getShape().setShapeName("Circle");
                cardList.add(card);    
            }
            if(list.get(i)==2){
                double width=Main.input.nextDouble();
                double length=Main.input.nextDouble();
                Rectangle rectangle=new Rectangle(width,length);
                Card card=new Card(rectangle);
                card.getShape().setShapeName("rectangle");
                cardList.add(card);    
            }
            if(list.get(i)==3){
                double x=Main.input.nextDouble();
                double y=Main.input.nextDouble();
                double z=Main.input.nextDouble();
                Triangle triangle=new Triangle(x,y,z);
                Card card=new Card(triangle);
                card.getShape().setShapeName("triangle");
                cardList.add(card);    
            }
            if(list.get(i)==4){
                double x=Main.input.nextDouble();
                double y=Main.input.nextDouble();
                double z=Main.input.nextDouble();
                Trapezoid traperoid=new Trapezoid(x,y,z);
                Card card=new Card(traperoid);
                card.getShape().setShapeName("Trapezoid");
                cardList.add(card);    
            }
        }
    }
            public boolean Check() {
                for(int i=0;i<cardList.size();i++){
                    if(!cardList.get(i).getShape().Check()){
                        return false;
                    }
                }
                return true;
            }
            public void CardSort() {
                for(int k=0;k<cardList.size();k++){
                    for(int i=k+1;i<cardList.size();i++){
                        if(cardList.get(k).getShape().getArea()<cardList.get(i).getShape().getArea())
                            Collections.swap(cardList, k, i);
                    }                
                }
            }
            public double getAllArea() {
                double s=0;
                for(int i=0;i<cardList.size();i++)
                    s=s+cardList.get(i).getShape().getArea();
                return s;
            }
            public void showResult() {
                System.out.printf("The original list:\n");
                for(int i=0;i<cardList.size();i++){
                    System.out.print(cardList.get(i).getShape().getShapeName()+":");
                    System.out.printf("%.2f"+" ",cardList.get(i).getShape().getArea());
                }
                System.out.printf("\n");
                System.out.printf("The sorted list:\n");
                CardSort();
                for(int i=0;i<cardList.size();i++){
                    System.out.print(cardList.get(i).getShape().getShapeName()+":");
                    System.out.printf("%.2f"+" ",cardList.get(i).getShape().getArea());
                }
                    System.out.printf("\n");
                System.out.printf("Sum of area:%.2f\n",getAllArea());
            }
}

 

 二、ATM机类结构设计

目标 :编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。 背景 :(1)相关概念说明

⚫中国银联(China UnionPay):成立于 2002 年 3 月,是经国务院同意,中 国人民银行批准设立的中国银行卡联合组织,总部设于上海。主要负责建设和 运营全国统一的银行卡跨行信息交换网络、提供银行卡跨行信息交换相关的专 业化服务、管理和经营“银联”品牌、制定银行卡跨行交易业务规范和技术标 准。其包含多家银行机构。

⚫银行(Bank):是依法成立的经营货币信贷业务的金融机构,是商品货币经 济发展到一定阶段的产物。

⚫银行用户(User):能够在银行办理相应业务的用户。一个银行机构可以拥 有多个银行用户及多个银行账户,一个用户也可以在多个银行机构开立账户。

⚫银行账户(Account):客户在银行开立的存款账户、贷款账户、往来账户 的总称。一个银行用户可以拥有多个银行账户。

⚫银行卡(Card):经批准由商业银行(含邮政金融机构) 向社会发行的具有 消费信用、转账结算、存取现金等全部或部分功能的信用支付工具。一个银行 账户可以发行多张银行卡。

⚫ ATM(Automated Teller Machine),自动柜员机,因大部分用于取款,又 称自动取款机。它是一种高度精密的机电一体化装置,利用磁性代码卡或智能 卡实现金融交易的自助服务,代替银行柜面人员的工作。可提取现金、查询存 款余额、进行账户之间资金划拨、余额查询等工作。一般 ATM 机隶属于某一银 行机构。

设计要求: 尝试使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设 计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进 行扩充和完善。 注意:为降低难度,本次作业限定银行卡均为借记卡(不能透支),且不允许跨行办理相关业务(例如在中国建设银行的 ATM 机上对其他银行的账户进行操 作)。

程序功能需求 (1)实现功能

⚫ 基础数据的初始化;

⚫ 用户存款、取款及查询余额功能。

(2)初始化数据

表 1 银行相关数据 

表 2 用户相关数据

 

注意:系统的测试用例均采用如上数据,且所有卡号密码默认为“88888888”。

输入格式:

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

  • 存款、取款功能输入数据格式: 卡号 密码 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

注: (1) 输入、输出字符编码采用 utf-8 格式,例如,逗号为英文半角字符“,”, 而非中文全角字符“,”。(2) 一旦检测到输入有误,则程序立即停止运行,之前正确的输入则给予相应 的输出。

设计要求 (1)务必注意本题目中的各实体类之间的关系,尤其是一对多的组合关系。(2)对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。 (3)编程时考虑面向对象中的封装性本题目中的应用以及是否有能够扩展 的衍生需求。 

类图:

 SourceMonitor的生成报表

 

 

 

 

 

 代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;



public class Main {
    public static void main(String[] args) {
        UnionPay unionPay = new UnionPay();
        unionPay.name = "中国银联";
        Bank bank1 = new Bank();
        bank1.name="中国建设银行";
        Bank bank2 = new Bank();
        bank2.name="中国工商银行";
        unionPay.banks.add(bank1);
        unionPay.banks.add(bank2);
        List<ATM> atms = new ArrayList<>();
        for(int i=0;i<6;++i) {
            ATM atm = new ATM();
            atm.id = "0"+((i+1)+"");
            atms.add(atm);
            if(i<4) {
                bank1.atms.add(atm);
            }
            else {
                bank2.atms.add(atm);
            }
        }
        atms.get(0).bank = bank1;
        atms.get(1).bank = bank1;
        atms.get(2).bank = bank1;
        atms.get(3).bank = bank1;
        atms.get(4).bank = bank2;
        atms.get(5).bank = bank2;
        
        User user1 = new User();
        user1.name = "杨过";
        user1.bank = bank1;
        User user2 = new User();
        user2.name = "郭靖";
        user2.bank = bank1;
        User user3 = new User();
        user3.name = "张无忌";
        user3.bank = bank2;
        User user4 = new User();
        user4.name = "韦小宝";
        user4.bank = bank2;
        
        Account account1 = new Account();
        account1.id = "3217000010041315709";
        Account account2 = new Account();
        account2.id = "3217000010041315715";
        Account account3 = new Account();
        account3.id = "3217000010051320007";
        Account account4 = new Account();
        account4.id = "3222081502001312389";
        Account account5 = new Account();
        account5.id = "3222081502001312390";
        Account account6 = new Account();
        account6.id = "3222081502001312399";
        Account account7 = new Account();
        account7.id = "3222081502051320785";
        Account account8 = new Account();
        account8.id = "3222081502051320786";
        
        user1.accounts.add(account1);
        user1.accounts.add(account2);
        user2.accounts.add(account3);
        user3.accounts.add(account4);
        user3.accounts.add(account5);
        user3.accounts.add(account6);
        user4.accounts.add(account7);
        user4.accounts.add(account8);
        
        Card card1 = new Card();
        card1.id = "6217000010041315709";
        Card card2 = new Card();
        card2.id = "6217000010041315715";
        Card card3 = new Card();
        card3.id = "6217000010041315718";
        Card card4 = new Card();
        card4.id = "6217000010051320007";
        Card card5 = new Card();
        card5.id = "6222081502001312389";
        Card card6 = new Card();
        card6.id = "6222081502001312390";
        Card card7 = new Card();
        card7.id = "6222081502001312399";
        Card card8 = new Card();
        card8.id = "6222081502001312400";
        Card card9 = new Card();
        card9.id = "6222081502051320785";
        Card card10 = new Card();
        card10.id = "6222081502051320786";
        
        card1.account = account1;
        card2.account = account1;
        card3.account = account2;
        card4.account = account3;
        card5.account = account4;
        card6.account = account5;
        card7.account = account6;
        card8.account = account6;
        card9.account = account7;
        card10.account = account8;
        
        account1.cards.add(card1);
        account1.cards.add(card2);
        account1.cards.add(card3);
        account2.cards.add(card4);
        account3.cards.add(card5);
        account3.cards.add(card6);
        account3.cards.add(card7);
        account3.cards.add(card8);
        account4.cards.add(card9);
        account4.cards.add(card10);
        
        String s;
        Scanner input = new Scanner(System.in);
        
        Map<String, Card> idToCard = new HashMap<String, Card>();
        idToCard.put("6217000010041315709", card1);
        idToCard.put("6217000010041315715", card2);
        idToCard.put("6217000010041315718", card3);
        idToCard.put("6217000010051320007", card4);
        idToCard.put("6222081502001312389", card5);
        idToCard.put("6222081502001312390", card6);
        idToCard.put("6222081502001312399", card7);
        idToCard.put("6222081502001312400", card8);
        idToCard.put("6222081502051320785", card9);
        idToCard.put("6222081502051320786", card10);
        
        Map<String,ATM> idToATM = new HashMap<>();
        idToATM.put("01", atms.get(0));
        idToATM.put("02", atms.get(1));
        idToATM.put("03", atms.get(2));
        idToATM.put("04", atms.get(3));
        idToATM.put("05", atms.get(4));
        idToATM.put("06", atms.get(5));
        
        Map<String, Bank> idToBank = new HashMap<>();
        idToBank.put("6217000010041315709", bank1);
        idToBank.put("6217000010041315715", bank1);
        idToBank.put("6217000010041315718", bank1);
        idToBank.put("6217000010051320007", bank1);
        idToBank.put("6222081502001312389", bank2);
        idToBank.put("6222081502001312390", bank2);
        idToBank.put("6222081502001312399", bank2);
        idToBank.put("6222081502001312400", bank2);
        idToBank.put("6222081502051320785", bank2);
        idToBank.put("6222081502051320786", bank2);
        
        Map<String, User> idToUser = new HashMap<String, User>();
        idToUser.put("6217000010041315709", user1);
        idToUser.put("6217000010041315715", user1);
        idToUser.put("6217000010041315718", user1);
        idToUser.put("6217000010051320007", user2);
        idToUser.put("6222081502001312389", user3);
        idToUser.put("6222081502001312390", user3);
        idToUser.put("6222081502001312399", user3);
        idToUser.put("6222081502001312400", user3);
        idToUser.put("6222081502051320785", user4);
        idToUser.put("6222081502051320786", user4);
        
        
        while(true) {
            s = input.nextLine();
            if(s.equals("#")) {
                break;
            }
            String[] strs = s.split("\\s+");
//            for(int i=0;i<strs.length;++i) {
//                System.out.println(i+":"+strs[i]);
//            }
            if(strs.length==1) {
                if(idToCard.get(strs[0])==null) {
                    System.out.println("Sorry,this card does not exist.");
                }
                else {
                    System.out.printf("¥%.02f", idToCard.get(strs[0]).account.money);
                    System.out.println("");
                }
            }
            else {
                if(idToATM.get(strs[2])==null) {
                    System.out.println("Sorry,the ATM's id is wrong.");
                }
                else if(!strs[1].equals("88888888")) {
                    System.out.println("Sorry,your password is wrong.");
                }
                else if(idToCard.get(strs[0])==null) {
                    System.out.println("Sorry,this card does not exist.");
                }
                else if(idToCard.get(strs[0]).account.money<Double.parseDouble(strs[3])) {
                    System.out.println("Sorry,your account balance is insufficient.");
                }
                else if(!idToBank.get(strs[0]).name.equals(idToATM.get(strs[2]).bank.name)){
                    System.out.println("Sorry,cross-bank withdrawal is not supported.");
                }
                else {
                    double money = Double.parseDouble(strs[3]);
                    if(money>0) {
                        System.out.print(idToUser.get(strs[0]).name+"在"+idToUser.get(strs[0]).bank.name+"的"+strs[2]+"号ATM机上取款¥");
                        System.out.printf("%.02f",money);
                        System.out.println("");
                        idToCard.get(strs[0]).account.money-=(money);
                        System.out.printf("当前余额为¥%.02f",idToCard.get(strs[0]).account.money);
                        System.out.println("");
                    }
                    else {
                        System.out.print(idToUser.get(strs[0]).name+"在"+idToUser.get(strs[0]).bank.name+"的"+strs[2]+"号ATM机上存款¥");
                        System.out.printf("%.02f",-money);
                        System.out.println("");
                        idToCard.get(strs[0]).account.money+=(-money);
                        System.out.printf("当前余额为¥%.02f",idToCard.get(strs[0]).account.money);
                        System.out.println("");
                    }
                }
            }
        }
    }
}

//银联
class UnionPay{
    String name;
    List<Bank> banks = new ArrayList<>();
}
//银行
class Bank{
    String name;
    List<ATM> atms = new ArrayList<>();
}
//用户
class User{
    String name;
    Bank bank = new Bank();
    List<Account> accounts = new ArrayList<>();
}
//银行账户
class Account{
    String id;
    List<Card> cards = new ArrayList<>();
    double money = 10000;
}
//银行卡
class Card{
    String id;
    Account account;
}
//ATM机
class ATM{
    String id;
    Bank bank;
}

ATM机类结构设计二

目标 :编写一个银行 ATM 机的模拟程序,能够完成用户的取款以及查询余额功能。

背景 :(1)相关概念说明

⚫中国银联(China UnionPay):成立于 2002 年 3 月,是经国务院同意,中 国人民银行批准设立的中国银行卡联合组织,总部设于上海。主要负责建设和 运营全国统一的银行卡跨行信息交换网络、提供银行卡跨行信息交换相关的专 业化服务、管理和经营“银联”品牌、制定银行卡跨行交易业务规范和技术标 准。其包含多家银行机构。

⚫银行(Bank):是依法成立的经营货币信贷业务的金融机构,是商品货币经 济发展到一定阶段的产物。

⚫银行用户(User):能够在银行办理相应业务的用户。一个银行机构可以拥 有多个银行用户及多个银行账户,一个用户也可以在多个银行机构开立账户。

⚫银行账户(Account):客户在银行开立的存款账户、贷款账户、往来账户 的总称。银行账户分为借记账户和贷记账户两种,其中,借记账户不能够透支 取款,而贷记账户可以透支取款(可能需要支付手续费)。一个银行用户可以 拥有多个银行账户。

⚫银行卡(Card):经批准由商业银行(含邮政金融机构) 向社会发行的具有 消费信用、转账结算、存取现金等全部或部分功能的信用支付工具。根据账户 的不同,银行卡一般分为借记卡(针对借记账户)和信用卡(针对贷记账户) 两类。一个银行账户可以发行多张银行卡。 ⚫ ATM(Automated Teller Machine),自动柜员机,因大部分用于取款,又 称自动取款机。它是一种高度精密的机电一体化装置,利用磁性代码卡或智能 卡实现金融交易的自助服务,代替银行柜面人员的工作。可提取现金、查询存 款余额、进行账户之间资金划拨、余额查询等工作。一般 ATM 机隶属于某一银 行机构。

设计要求: 尝试使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进 行扩充和完善。

注意:本次作业中银行卡包含借记卡和信用卡两类,且允许跨行办理相关业 务(例如在中国建设银行的 ATM 机上使用中国工商银行的银行卡进行业务操作)。

程序功能需求 (1)实现功能 ⚫ 基础数据的初始化; ⚫ 用户取款及查询余额功能。

(2)初始化数据

表 1 银行相关数据

 

 表 2 用户相关数据

 

 

 (3)业务假定 1)系统的测试用例均采用如上数据,且所有卡号密码默认为“88888888”, 初始余额均为 10000 元。 2)手续费默认均从银行卡所对应的账户中自动扣除。 3)跨行业务手续费收取比例由 ATM 机隶属银行决定,例如,用户手持中国 工商银行的银行卡在中国建设银行的 ATM 上进行取款操作,则手续费收取比例为 中国建设银行的相应比例,按初始化数据中的规定为取款金额的 2%。 4)跨行查询余额不收取手续费。 5)透支取款手续费由中国银联统一规定为 5%,最大透支金额均为 50000 元。

输入格式:

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

  • 取款功能输入数据格式: 卡号 密码 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

注: (1) 输入、输出字符编码采用 utf-8 格式,例如,逗号为英文半角字符“,”, 而非中文全角字符“,”。 (2) 一旦检测到输入有误,则程序立即停止运行,之前正确的输入则给予相应 的输出。

设计要求 (1)务必注意本题目中的各实体类之间的关系,尤其是一对多的组合关系。 (2)对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。 (3)在“合成复用原则”及“单一职责原则”基础上,尽量对上次作业的程 序进行重构,使之符合 “开-闭”原则。

类图:

 

 

 

 SourceMonitor的生成报表:

 

 

 

 

 

代码:

package yinhang2;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
UnionPay unionPay = new UnionPay();
unionPay.name = "中国银联";
Bank bank1 = new Bank();
bank1.name="中国建设银行";
bank1.shouxufei = 0.02;
Bank bank2 = new Bank();
bank2.name="中国工商银行";
bank2.shouxufei = 0.03;
Bank bank3 = new Bank();
bank3.name="中国农业银行";
bank3.shouxufei = 0.04;
unionPay.banks.add(bank1);
unionPay.banks.add(bank2);
unionPay.banks.add(bank3);
List<ATM> atms = new ArrayList<>();
for(int i=0;i<11;++i) {
ATM atm = new ATM();
atm.id = "0"+((i+1)+"");
atms.add(atm);
if(i<4) {
bank1.atms.add(atm);
}
else if(i>4&&i<6){
bank2.atms.add(atm);
}
else {
bank3.atms.add(atm);
}
}
atms.get(0).bank = bank1;
atms.get(1).bank = bank1;
atms.get(2).bank = bank1;
atms.get(3).bank = bank1;
atms.get(4).bank = bank2;
atms.get(5).bank = bank2;
atms.get(6).bank = bank3;
atms.get(7).bank = bank3;
atms.get(8).bank = bank3;
atms.get(9).bank = bank3;
atms.get(10).bank = bank3;

User user1 = new User();
user1.name = "杨过";
user1.bank = bank1;
User user2 = new User();
user2.name = "郭靖";
user2.bank = bank1;
User user3 = new User();
user3.name = "张无忌";
user3.bank = bank2;
User user4 = new User();
user4.name = "韦小宝";
user4.bank = bank2;
User user5 = new User();
user5.name = "张三丰";
user5.bank = bank1;
User user6 = new User();
user6.name = "令狐冲";
user6.bank = bank2;
User user7 = new User();
user7.name = "乔峰";
user7.bank = bank3;
User user8 = new User();
user8.name = "洪七公";
user8.bank = bank3;

Account account1 = new Account();
account1.id = "3217000010041315709";
account1.type = "借记账户";
account1.yh = "中国建设银行";
Account account2 = new Account();
account2.id = "3217000010041315715";
account2.type = "借记账户";
account2.yh = "中国建设银行";
Account account3 = new Account();
account3.id = "3217000010051320007";
account3.type = "借记账户";
account3.yh = "中国建设银行";
Account account4 = new Account();
account4.id = "3222081502001312389";
account4.type = "借记账户";
account4.yh = "中国工商银行";
Account account5 = new Account();
account5.id = "3222081502001312390";
account5.type = "借记账户";
account5.yh = "中国工商银行";
Account account6 = new Account();
account6.id = "3222081502001312399";
account6.type = "借记账户";
account6.yh = "中国工商银行";
Account account7 = new Account();
account7.id = "3222081502051320785";
account7.type = "借记账户";
account7.yh = "中国工商银行";
Account account8 = new Account();
account8.id = "3222081502051320786";
account8.type = "借记账户";
account8.yh = "中国工商银行";
Account account9 = new Account();
account9.id = "3640000010045442002";
account9.type = "贷记账户";
account9.yh = "中国建设银行";
Account account10 = new Account();
account10.id = "3640000010045441009";
account10.type = "贷记账户";
account10.yh = "中国工商银行";
Account account11 = new Account();
account11.id = "3630000010033431001";
account11.type = "贷记账户";
account11.yh = "中国农业银行";
Account account12 = new Account();
account12.id = "3630000010033431008";
account12.type = "贷记账户";
account12.yh = "中国农业银行";
user1.accounts.add(account1);
user1.accounts.add(account2);
user2.accounts.add(account3);
user3.accounts.add(account4);
user3.accounts.add(account5);
user3.accounts.add(account6);
user4.accounts.add(account7);
user4.accounts.add(account8);
user5.accounts.add(account9);
user6.accounts.add(account10);
user7.accounts.add(account11);
user8.accounts.add(account12);

Card card1 = new Card();
card1.id = "6217000010041315709";
Card card2 = new Card();
card2.id = "6217000010041315715";
Card card3 = new Card();
card3.id = "6217000010041315718";
Card card4 = new Card();
card4.id = "6217000010051320007";
Card card5 = new Card();
card5.id = "6222081502001312389";
Card card6 = new Card();
card6.id = "6222081502001312390";
Card card7 = new Card();
card7.id = "6222081502001312399";
Card card8 = new Card();
card8.id = "6222081502001312400";
Card card9 = new Card();
card9.id = "6222081502051320785";
Card card10 = new Card();
card10.id = "6222081502051320786";

Card card11 = new Card();
card11.id = "6640000010045442002";
Card card12 = new Card();
card12.id = "6640000010045442003";
Card card13 = new Card();
card13.id = "6640000010045441009";
Card card14 = new Card();
card14.id = "6630000010033431001";
Card card15 = new Card();
card15.id = "6630000010033431008";

card1.account = account1;
card2.account = account1;
card3.account = account2;
card4.account = account3;
card5.account = account4;
card6.account = account5;
card7.account = account6;
card8.account = account6;
card9.account = account7;
card10.account = account8;

card11.account = account9;
card12.account = account9;
card13.account = account10;
card14.account = account11;
card15.account = account12;

account1.cards.add(card1);
account1.cards.add(card2);
account2.cards.add(card3);
account3.cards.add(card4);
account4.cards.add(card5);
account5.cards.add(card6);
account6.cards.add(card7);
account6.cards.add(card8);
account7.cards.add(card9);
account8.cards.add(card10);
account9.cards.add(card11);
account9.cards.add(card12);
account10.cards.add(card13);
account11.cards.add(card14);
account12.cards.add(card15);
String s;
Scanner input = new Scanner(System.in);

Map<String, Card> idToCard = new HashMap<String, Card>();
idToCard.put("6217000010041315709", card1);
idToCard.put("6217000010041315715", card2);
idToCard.put("6217000010041315718", card3);
idToCard.put("6217000010051320007", card4);
idToCard.put("6222081502001312389", card5);
idToCard.put("6222081502001312390", card6);
idToCard.put("6222081502001312399", card7);
idToCard.put("6222081502001312400", card8);
idToCard.put("6222081502051320785", card9);
idToCard.put("6222081502051320786", card10);
idToCard.put("6640000010045442002", card11);
idToCard.put("6640000010045442003", card12);
idToCard.put("6640000010045441009", card13);
idToCard.put("6630000010033431001", card14);
idToCard.put("6630000010033431008", card15);

Map<String,ATM> idToATM = new HashMap<>();
idToATM.put("01", atms.get(0));
idToATM.put("02", atms.get(1));
idToATM.put("03", atms.get(2));
idToATM.put("04", atms.get(3));
idToATM.put("05", atms.get(4));
idToATM.put("06", atms.get(5));
idToATM.put("07", atms.get(6));
idToATM.put("08", atms.get(7));
idToATM.put("09", atms.get(8));
idToATM.put("10", atms.get(9));
idToATM.put("11", atms.get(10));

Map<String, Bank> idToBank = new HashMap<>();
idToBank.put("6217000010041315709", bank1);
idToBank.put("6217000010041315715", bank1);
idToBank.put("6217000010041315718", bank1);
idToBank.put("6217000010051320007", bank1);
idToBank.put("6222081502001312389", bank2);
idToBank.put("6222081502001312390", bank2);
idToBank.put("6222081502001312399", bank2);
idToBank.put("6222081502001312400", bank2);
idToBank.put("6222081502051320785", bank2);
idToBank.put("6222081502051320786", bank2);

idToBank.put("6640000010045442002", bank1);
idToBank.put("6640000010045442003", bank1);
idToBank.put("6640000010045441009", bank2);
idToBank.put("6630000010033431001", bank3);
idToBank.put("6630000010033431008", bank3);

Map<String, User> idToUser = new HashMap<String, User>();
idToUser.put("6217000010041315709", user1);
idToUser.put("6217000010041315715", user1);
idToUser.put("6217000010041315718", user1);
idToUser.put("6217000010051320007", user2);
idToUser.put("6222081502001312389", user3);
idToUser.put("6222081502001312390", user3);
idToUser.put("6222081502001312399", user3);
idToUser.put("6222081502001312400", user3);
idToUser.put("6222081502051320785", user4);
idToUser.put("6222081502051320786", user4);

idToUser.put("6640000010045442002", user5);
idToUser.put("6640000010045442003", user5);
idToUser.put("6640000010045441009", user6);
idToUser.put("6630000010033431001", user7);
idToUser.put("6630000010033431008", user8);
while(true) {
s = input.nextLine();
if(s.equals("#")) {
break;
}
String[] strs = s.split("\\s+");
// System.out.println("length = "+strs.length);
if(strs.length==1) {
if(idToCard.get(strs[0])==null) {
System.out.println("Sorry,this card does not exist.");
}
else {
System.out.printf("业务:查询余额 ¥%.02f",idToCard.get(strs[0]).account.money);
System.out.println("");
}
}
else {
if(idToATM.get(strs[2])==null) {
System.out.println("Sorry,the ATM's id is wrong.");
}
else if(!strs[1].equals("88888888")) {
System.out.println("Sorry,your password is wrong.");
}
else if(idToCard.get(strs[0])==null) {
System.out.println("卡号:"+strs[0]);
System.out.println("Sorry,this card does not exist.");
}
else {
double money = Double.parseDouble(strs[3]);
Card card = idToCard.get(strs[0]);
Account account = card.account;
User user = idToUser.get(strs[0]);
Bank bank = idToBank.get(strs[0]);
ATM atm = idToATM.get(strs[2]);
if(account.type.equals("借记账户")) {
// System.out.println("借记账号");
double nowMoney = money;
if(!atm.bank.name.equals(account.yh)) {
// System.out.println("需要手续费");
nowMoney = money*(1+atm.bank.shouxufei);
}
if(idToCard.get(strs[0]).account.money<nowMoney) {
System.out.println("Sorry,your account balance is insufficient.");
}
else {
System.out.print("业务:取款 "+user.name+"在"+bank.name+"的"+atm.id+"号ATM机上取款¥");
System.out.printf("%.02f", money);
System.out.println("");
idToCard.get(strs[0]).account.money-=nowMoney;
System.out.printf("当前余额为¥%.02f",idToCard.get(strs[0]).account.money);
System.out.println("");
}
}
else if(account.type.equals("贷记账户")) {
double nowMoney = money;
if(!atm.bank.name.equals(account.yh)) {
// System.out.println("跨行所在银行:"+atm.bank.name+", 手续费为"+atm.bank.shouxufei);
nowMoney+=money*atm.bank.shouxufei;
}
if(idToCard.get(strs[0]).account.money<money) {
if(idToCard.get(strs[0]).account.money>0) {
nowMoney+=(money-idToCard.get(strs[0]).account.money)*0.05;
}
else {
nowMoney+=money*0.05;
}
}
if(-(idToCard.get(strs[0]).account.money-nowMoney)>50000) {
System.out.println("Sorry,your account balance is insufficient.");
}
else {
System.out.print("业务:取款 "+user.name+"在"+bank.name+"的"+atm.id+"号ATM机上取款¥");
System.out.printf("%.02f", money);
System.out.println("");
idToCard.get(strs[0]).account.money-=nowMoney;
System.out.printf("当前余额为¥%.02f",idToCard.get(strs[0]).account.money);
System.out.println("");
}
}
}
}
}
}
}

//银联
class UnionPay {
String name;
List<Bank> banks = new ArrayList<>();
}

//银行
class Bank {
String name;
double lv;
double shouxufei;
List<ATM> atms = new ArrayList<>();
}

//用户
class User {
String name;
Bank bank = new Bank();
List<Account> accounts = new ArrayList<>();
}

//银行账户
class Account {
String id;
String type;
String yh;
List<Card> cards = new ArrayList<>();
double money = 10000;
}

//银行卡
class Card {
String id;
Account account;
}

//ATM机
class ATM {
String id;
Bank bank;
}

 

 

总结:主要是提升了解决实际问题的能力,通过这段时间学习为将来开发实际程序积累了经验。

 

posted @ 2021-06-20 23:54  新人啊  阅读(120)  评论(0)    收藏  举报