0
点赞
收藏
分享

微信扫一扫

【java】模拟银行ATM机器的儿童玩具

TiaNa_na 2022-04-01 阅读 45
javaeclipse

目录

一、实验内容

二、提示要点和要求

三、功能设计

1.系统功能分析与设计

(1)初始化文本文件(TextData类):

(2)文本文件的更新(UpdateText类):

(3)创建银行卡账户(Card、DepositCard、CreditCard类):

(4)Bank类:

(5)Demo类:

2.各功能使用说明

总结



一、实验内容

假设某游戏公司推出一款模拟银行ATM机器的儿童玩具,邀请你开发一个应用,设计必要的类实现你能想到的功能,包括查询、存钱、取钱等。以下是玩具样式(来源于网络,仅供参考),观察硬件条件(输入输出等)。

二、提示要点和要求

  1. 显示屏为4行的纯文本显示屏,显示宽度为10个字,待机状态显示当前时间
  2. 设计两类账户,一个是储蓄卡(借记卡),一个是信用卡(贷记卡)
  3. 设计相应功能,至少有:查询,取钱,存钱,转账(包括同一用户名下账号互转和不同用户账号转账)
  4. 至少用到以下Java知识点:继承、多态、接口、异常处理、文件IO
  5. 实现文件存储,在系统内创建一个data.txt文件,里面每一行记录一个用户的一个账户的余额情况,其结构举例:

001 张三 1234 1 100

分别代表:[用户id] [姓名] [卡号] [账户类型如1表示储蓄账户2表示信用卡] [余额]

三、功能设计

1.系统功能分析与设计

(1)初始化文本文件(TextData类):

用TextData类创建并插入初始数据,实现文件存储,在系统内创建一个data.txt文件,里面每一行记录一个用户的一个账户的余额情况。

  • 若为储蓄卡,则是:[用户id] [姓名] [卡号] [账户类型如1表示储蓄账户2表示信用卡] [余额]
  • 若是信用卡,则是:[用户id] [姓名] [卡号] [账户类型如1表示储蓄账户2表示信用卡] [余额] [初始信用额度] [当前信用额度]

代码如下(TextData类):

package system;

public class TextData {

public static void main(String[] args) throws Exception {
java.io.File file = new java.io.File("D:\\data.txt");
if(file.exists()) {
file.delete();
}
try(
java.io.PrintWriter output = new java.io.PrintWriter(file);
) {
output.println("001 李一 1001 1 200");
output.println("002 李二 1002 1 0");
output.println("003 李三 1003 1 100");
output.println("004 李四 1004 1 500");
output.println("005 李五 1005 1 300");
output.println("006 李六 1006 1 100");
output.println("007 李七 1007 1 60");
output.println("008 李八 1008 2 700 1000 1000");
output.println("009 李九 1009 2 0 800 500");
output.println("010 李十 1010 2 100 1500 1500");
output.println("011 李一 1011 2 700 500 500");
output.println("012 李二 1012 2 300 500 500");
output.println("013 李三 1013 2 0 1000 300");
output.println("014 王一 1014 1 100");
output.println("015 王二 1015 1 400");
output.println("016 王三 1016 1 500");
output.println("017 王四 1017 2 0 3000 1500");
output.println("018 王五 1019 2 100 1000 1000");
output.println("019 王一 1024 2 100 1500 1500");
output.println("020 王二 1025 2 100 2000 2000");
}
if(file.exists()) {
System.out.println("文件创建成功!");
}
}
}

(2)文本文件的更新(UpdateText类):

设置UpdateText类,用来查找原来的卡信息的那行,并将修改后的数据替换到文本文件里的该行。

代码如下(UpdateText类):

package system;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class UpdateText {
public UpdateText() {
}

public void updateLine(String oldStr,String newStr) throws Exception {
File file = new File("D:\\data.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
StringBuffer bf = new StringBuffer();
String r1 = null;

while((r1 = br.readLine()) != null) {
if(r1.indexOf(oldStr) == 0)
bf.append(newStr +"\r\n");
else
bf.append(r1 + "\r\n");
}
br.close();
BufferedWriter out = new BufferedWriter(new FileWriter(file));
out.write(bf.toString());
out.flush();
out.close();
}
}

(3)创建银行卡账户(Card、DepositCard、CreditCard类):

创建三个类,Card、DepositCard、CreditCard类,三类依次继承,后者继承前者,原本是后两者都继承前者,但因为转账方法保存在CreditCard类里,储蓄卡和信用卡共用了一个转账方法,所以就改成了依次继承。

Card类有七个属性,包含用户id、姓名、卡号、账户类型、余额五个属性,方法有对这五个属性的get和set的方法以及toString方法,toString方法用来返回一张卡的五个属性,从而用以更新文本文件。又有原卡信息、更改后的卡信息两个属性,分别用来保存储蓄卡和信用卡存钱、取钱、转账前后的toString返回的信息。

代码如下(Card类):

package account;

public abstract class Card {
private String id;
private String name;
private String number;
private int type; //1为储蓄卡,2为信用卡
private int balance = 0;
public String oldStr;
public String newStr;

public Card() {
}

public Card(String id, String name, String number, int type, int balance) {
super();
this.id = id;
this.name = name;
this.number = number;
this.type = type;
this.balance = balance;
}

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getBalance() {
return balance;
}
public void setBalance(int d) {
this.balance = d;
}

public String getOldStr() {
return oldStr;
}

public void setOldStr(String oldStr) {
this.oldStr = oldStr;
}

public String getNewStr() {
return newStr;
}

public void setNewStr(String newStr) {
this.newStr = newStr;
}

public abstract void saveMoney(int money);
public abstract void takeMoney(int money);
public abstract String getInfo();

public String toString() {
return getId()+" "+getName()+" "+getNumber()+" "+getType()+" "+getBalance();
}

protected abstract int getCredit();
protected abstract int getMaxOverdraft();
protected abstract void setMaxOverdraft(int credit);
}

DepositCard包含更新类一个属性,用以在存钱、取钱、转账时将更改后余额或当前信用额度更新在文本文件中。还有存钱、取钱和查询三个方法,转账方法共用CreditCard类中的。

代码如下(DepositCard类):

package account;

public class DepositCard extends Card {
system.UpdateText update = new system.UpdateText();

public DepositCard() {
}

public DepositCard(String id, String name, String number, int type, int balance) {
super(id,name,number,type,balance);
}

public void saveMoney(int money) { //存钱
try {
setOldStr(toString());
setBalance((int) (getBalance() + money));
System.out.println("存入:"+ money +"\n余额:" + getBalance());
setNewStr(toString());
update.updateLine(getOldStr(), getNewStr());
} catch (Exception e) {
e.printStackTrace();
}
}

public void takeMoney(int money) { //取钱
setOldStr(toString());
if(money > getBalance())
System.out.println("余额不足!");
else {
try {
setBalance(getBalance() - money);
setNewStr(toString());
System.out.println("取出:"+ money +"\n余额:" + getBalance());
update.updateLine(getOldStr(), getNewStr());
} catch (Exception e) {
e.printStackTrace();
}
}
}

public String getInfo() { //查询
if(getId() == null)
return "没有账号信息!";
else
return "账户ID:" + getId() +
"\n余额:" + getBalance();
}

public void transMoney(Card toCard, int amount) { //转账,子类中重写
}

public String toString() {
return super.toString();
}

@Override
protected int getCredit() {
return 0;
}

@Override
protected int getMaxOverdraft() {
return 0;
}

@Override
protected void setMaxOverdraft(int credit) {
}
}

CreditCard包含原信用额度、当前信用额度和更新三个属性,更新属性作用一样。该类中有前两个属性的get、set方法,以及存钱、取钱、查询、转账的方法。

代码如下(CreditCard类):

package account;

public class CreditCard extends DepositCard{
private int credit = 10000; //信用额度
private int maxOverdraft = credit; //最大透支额度

system.UpdateText update = new system.UpdateText();

public CreditCard() {
}

public CreditCard(String id, String name, String number, int type, int balance, int credit,int maxOverdraft) {
super(id,name,number,type,balance);
this.credit = credit;
this.maxOverdraft = maxOverdraft;
}

public int getCredit() {
return credit;
}

public void setCredit(int credit) {
double flag = credit - this.credit;
this.credit = credit;
this.maxOverdraft += flag;
}

public int getMaxOverdraft() {
return maxOverdraft;
}

public void setMaxOverdraft(int maxOverdraft) {
this.maxOverdraft = maxOverdraft;
}

@Override
public void saveMoney(int money) { //存钱
setOldStr(toString());
if(money > (credit - maxOverdraft)) {
setBalance(getBalance() + money -(credit - maxOverdraft));
this.maxOverdraft = this.credit;
}
else {
this.maxOverdraft += money;
}
setNewStr(toString());
try {
update.updateLine(getOldStr(), getNewStr());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("存入:"+ money +"\n余额:" + getBalance());
System.out.println("额度:" + this.maxOverdraft);
System.out.println("原额度:" + this.credit);
}

@Override
public void takeMoney(int money) { //取钱
setOldStr(toString());
if(getBalance() >= money) {
setBalance(getBalance() - money);
System.out.println("取出:"+ money +"\n余额:" + getBalance());
System.out.println("额度:" + this.maxOverdraft);
System.out.println("原额度:" + this.credit);
}
else if(money > getBalance() && money <= (maxOverdraft + getBalance())) {
maxOverdraft -=(money - getBalance());
setBalance(0);
System.out.println("取出:"+ money +"\n余额:" + getBalance());
System.out.println("额度:" + this.maxOverdraft);
System.out.println("原额度:" + this.credit);
}
else {
System.out.println("余额不足!");
}
setNewStr(toString());
try {
update.updateLine(getOldStr(), getNewStr());
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public String getInfo() { //查询
if(getId() == null)
return "没有账号信息!";
else
return "账户ID:" + getId() +
"\n余额:" + getBalance() +
"\n额度:" + this.maxOverdraft +
"\n原额度:" + this.credit;
}

@Override
public void transMoney(Card toCard,int amount) { //转账
setOldStr(toString());
if(toCard == null || amount <= 0) {
System.out.println("参数错误!");
}
else if(amount > getBalance())
System.out.println("余额不足!");
else if(toCard.getType() == 1){ //转储蓄卡
toCard.setBalance(toCard.getBalance() + amount);
setBalance(getBalance() - amount);
System.out.println("转账成功!\n已转:"+ amount);
}
else if(toCard.getType() == 2){ //转给信用卡
if(amount > (toCard.getCredit() - toCard.getMaxOverdraft())) {
toCard.setBalance(toCard.getBalance() + amount -(toCard.getCredit() - toCard.getMaxOverdraft()));
toCard.setMaxOverdraft(toCard.getCredit());
}
else
toCard.setMaxOverdraft(toCard.getMaxOverdraft()+amount);
setBalance(getBalance() - amount);
System.out.println("转账成功!\n已转:"+ amount);
}
setNewStr(toString());
try {
update.updateLine(getOldStr(), getNewStr());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("余额:" + getBalance());
}

@Override
public String toString() {
return super.toString()+" "+getCredit()+" "+getMaxOverdraft();
}
}

(4)Bank类:

确定是否开机。只包含一个isOpen属性。

代码如下(Bank类):

package atm;

public class Bank {
private static boolean isOpen;

public Bank(boolean isOpen) {
this.isOpen = isOpen;
}

public static boolean isOpen() {
return isOpen;
}

public void setOpen(boolean isOpen) {
this.isOpen = isOpen;
}
}

(5)Demo类:

测试类,用Bank类确定是否开机,关机时显示当前系统时间,开机时进行查询、存钱、转账给储蓄卡和信用卡、取钱。

代码如下(Demo类):

package atm;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;

import account.Card;
import account.DepositCard;
import account.CreditCard;

import atm.Bank;

public class Demo {

public static void main(String[] args) throws Exception {
Bank bank = new Bank(false);
while(!Bank.isOpen()) { //未插卡,关机时,显示时间
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Timer timer = new Timer();

System.out.println(sdf.format(new Date()));
bank.setOpen(true);
System.out.println("\n");
}
if(Bank.isOpen()) { //插卡,开机时
Card c1 = new CreditCard("008","李八","1008",2,700,1000,1000); //插入卡
Card c2 = new DepositCard("001","李一","1001",1,200); //目标转账卡1
Card c3 = new CreditCard("011","李一","1011",2,700,500,500); //目标转账卡2

//查询
System.out.println(c1.getInfo());
System.out.println("\n");
System.out.println(c2.getInfo());
System.out.println("\n");

//存钱
c1.saveMoney(200);
System.out.println("\n");

//c1转账到c2
((CreditCard) c1).transMoney(c2,300);
System.out.println("\n");

//c1转账到c3
((CreditCard) c1).transMoney(c3,100);
System.out.println("\n");

//取钱
c1.takeMoney(1000);
}
}

}

2.各功能使用说明

  • 时间

  • 查询

  • 存钱

  • 转账给储蓄卡

  • 转账给信用卡

  • 取钱


总结

课程作业,未设计图形界面,有待改进。

举报

相关推荐

0 条评论