ATM机类结构设计(一)

7-5 ATM机类结构设计(一)

分数 84

作者 段喜龙

单位 南昌航空大学

设计ATM仿真系统,具体要求参见作业说明。
OO作业8-1题目说明.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

代码长度限制

20 KB

时间限制

400 ms

内存限制

64 MB

我滴代码

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		String input = in.nextLine();
		while(!input.equals("#")) {
			String[] gets = input.split("\\s+");
			if(gets.length==1) {
				ATM atm = new ATM();
				atm.checkmoney(gets[0]);
			}else {
				ATM atm = new ATM();
				atm = atm.getATM(gets[2]);
				if(atm == null) {
					System.out.println("Sorry,the ATM's id is wrong.");
				}else {
					atm.changemoney(gets[0],gets[1],Double.parseDouble(gets[3]));
				}
			}
			input = in.nextLine();
		}

	}

}

class ATM {

	String number;
	String bankname;
	
	public ATM getATM(String nubmer) {
		UnionPay union = UnionPay.getUnionPay();
		for(Bank bank:union.banks) {
			for(ATM atm:bank.atms) {
				if(nubmer.equals(atm.number)) {
					return atm;
				}
			}
		}
		return null;
	}

	public void changemoney(String cardnumber,String password,double money) {
		UnionPay union = UnionPay.getUnionPay();
		String username = "";
		String bankname = "";
		Account account = null;
		Card card = null;
		for(Bank bank:union.banks) {
			bankname = bank.name;
			for(User user:bank.users) {
				username = user.name;
				for(Account accounts:user.accounts) {
					account = accounts;
					for(Card cardo:account.cards) {
						if(cardo.number.equals(cardnumber)) {
							if(cardo.number.equals(cardnumber)) {
								card = cardo;
								break;
							}
						}
					}
					if(card!=null) {
						break;
					}
				}
				if(card!=null) {
					break;
				}
			}
			if(card!=null) {
				break;
			}
		}
		if(card == null) {
			System.out.println("Sorry,this card does not exist.");
			return;
		}
		if(!card.password.equals(password)) {
			System.out.println("Sorry,your password is wrong.");
			return;
		}
		if(!this.bankname.equals(bankname)) {
			System.out.println("Sorry,cross-bank withdrawal is not supported.");
			return;
		}
		if(money<=0) {
			account.money -= money;
			System.out.println(username+"在"+bankname+"的"+this.number+"号ATM机上存款¥"+String.format("%.2f", Math.abs(money)));
		}else {
			if(account.money<money) {
				System.out.println("Sorry,your account balance is insufficient.");
                return;
			}else {
				account.money -= money;
				System.out.println(username+"在"+bankname+"的"+this.number+"号ATM机上取款¥"+String.format("%.2f", Math.abs(money)));
			}
		}
		System.out.println("当前余额为¥"+String.format("%.2f", account.money));
	}
	
	public void checkmoney(String cardnumber) {
		UnionPay union = UnionPay.getUnionPay();
		String username = "";
		String bankname = "";
		Account account = null;
		Card card = null;
		for(Bank bank:union.banks) {
			bankname = bank.name;
			for(User user:bank.users) {
				username = user.name;
				for(Account accounts:user.accounts) {
					account = accounts;
					for(Card cardo:account.cards) {
						if(cardo.number.equals(cardnumber)) {
							if(cardo.number.equals(cardnumber)) {
								card = cardo;
								break;
							}
						}
					}
					if(card!=null) {
						break;
					}
				}
				if(card!=null) {
					break;
				}
			}
			if(card!=null) {
				break;
			}
		}
		if(card == null) {
			System.out.println("Sorry,this card does not exist.");
			return;
		}
		System.out.println("¥"+String.format("%.2f", account.money));
	}
	
	public ATM() {
		
	}
	public ATM(String number) {
		super();
		this.number = number;
		if(number.equals("01")||number.equals("02")||number.equals("03")||number.equals("04")) {
			this.bankname = "中国建设银行";
		}else {
			this.bankname = "中国工商银行";
		}
	}
}

class UnionPay {

	public static UnionPay union = null;
	
	Bank[] banks = new Bank[2];
	
	public static UnionPay getUnionPay() {
		if(union!=null) {
			return union;
		}
		union = new UnionPay();
		return union;
	}
	
	private UnionPay() {
		Card[] card1 = {new Card("6217000010041315709"),new Card("6217000010041315715")};
		Card[] card2 = {new Card("6217000010041315718")};
		Card[] card3 = {new Card("6217000010051320007")};
		Card[] card4 = {new Card("6222081502001312389")};
		Card[] card5 = {new Card("6222081502001312390")};
		Card[] card6 = {new Card("6222081502001312399"),new Card("6222081502001312400")};
		Card[] card7 = {new Card("6222081502051320785")};
		Card[] card8 = {new Card("6222081502051320786")};
		Account[] account1 = {new Account("3217000010041315709",card1),new Account("3217000010041315715",card2)};
		Account[] account2 = {new Account("3217000010051320007",card3)};
		Account[] account3 = {new Account("3222081502001312389",card4),new Account("3222081502001312390",card5),new Account("3222081502001312399",card6)};
		Account[] account4 = {new Account("3222081502051320785",card7),new Account("3222081502051320786",card8)};
		User[] user1 = {new User(account1,"杨过"),new User(account2,"郭靖")};
		User[] user2 = {new User(account3,"张无忌"),new User(account4,"韦小宝")};
		ATM[] atm1 = {new ATM("01"),new ATM("02"),new ATM("03"),new ATM("04")};
		ATM[] atm2 = {new ATM("05"),new ATM("06")};
		banks[0] = new Bank("中国建设银行",user1,atm1);
		banks[1] = new Bank("中国工商银行",user2,atm2);
	}
}

class Bank {

	String name;
	User[] users;
	ATM[] atms;
	public Bank(String name, User[] users, ATM[] atms) {
		super();
		this.name = name;
		this.users = users;
		this.atms = atms;
	}
	
}

class User {

	Account[] accounts;
	String name;
	public User(Account[] accounts, String name) {
		super();
		this.accounts = accounts;
		this.name = name;
	}
}

class Account {

	String nubmer;
	Card[] cards;
	double money = 10000;
	public Account(String nubmer, Card[] cards) {
		super();
		this.nubmer = nubmer;
		this.cards = cards;
	}
	
}

class Card {

	String number;
	String password = "88888888";
	
	
	public Card(String number) {
		super();
		this.number = number;
	}

	public Card(String number, String password) {
		super();
		this.number = number;
		this.password = password;
	}
}

我滴总结

这是一道非常好的类设计练习题,非常值得多花点时间去仔细看。

几个类之间的联系,几个类之间的关系非常的微妙。

比如银联只能有一个,所以我使用了单例。

比如银行里存储的信息,是用户包含了账户信息然后包含卡

还是一张卡对应一个用户。

非常值得深思。

在这里给个我的类图吧

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值