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;
}
}
我滴总结
这是一道非常好的类设计练习题,非常值得多花点时间去仔细看。
几个类之间的联系,几个类之间的关系非常的微妙。
比如银联只能有一个,所以我使用了单例。
比如银行里存储的信息,是用户包含了账户信息然后包含卡
还是一张卡对应一个用户。
非常值得深思。
在这里给个我的类图吧