0
点赞
收藏
分享

微信扫一扫

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

TiaNa_na 2022-04-01 阅读 46
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 条评论