银行自动存取一体机例题

银行自动存取一体机

关键技术解析

在JAVA语言中,允许子类继承父类的构造方法,构造方法的继承需要遵守以下规则:

1.若父类是无参的构造方法,则子类无条件的继承改构造方法。

2.   若子类无自己的构造方法,则他将继承父类的无参构造方法作为自己的构造方法;

若子类有自己的构造方法,则在创建子类对象时,它将先执行继承自父类的无参构造方法,

然后在执行自己的构造方法。

3,若父类是有参数的构造方法,子类可以在自己的构造方法中使用super关键字来调用它,

但这个调用语句必须是子类构造方法的第一个可执行语句。


EnterAmountOfMoney类的主要作用是录入数据

package Bank;
import java.io.BufferedReader;
import java.io.InputStreamReader;

//EnterAmountOfMoney类的主要作用是录入数据。
public class EnterAmountOfMoney {
	public static String scan()// 可以从键盘上录入数据
	{
		String str = "";
		try {
			BufferedReader buf = new BufferedReader(new InputStreamReader(
					System.in));
			str = buf.readLine();
		} catch (Exception e) {
		}
		return str;
	}
	public static int scanInt()// 将从键盘上录入数据转换成int型数据
	{
		int temp = 0;
		try {
			temp = Integer.parseInt(scan());
		} catch (Exception e) {
			System.out.println("[?á]:输入不合法,请输入整数:");
		}
		return temp;
	}
}
Common-Card类普通用户的功能实现
package Bank;

//普通用户的功能实现
public class Common_Card {
	String name;	// 账户名
	int ID;		// 账户ID
	int password;	// 密码
	int money;		// 金额
	Common_Card(String name, int ID, int password, int money) {// 构造方法
		this.name = name;
		this.ID = ID;
		this.password = password;
		this.money = money;
	}
	boolean CheckMoney(int m) {// 取款操作
		System.out.println("正在操作,请稍候……!");
		if (m < 0) {
			if (saveMoney(-m)) {
				return true;
			}
			else
				return false;
		} else {
			if (m > money) {
				System.out.println("[?á]:该账户不可透支,本次操作中断!");
				return false;
			}
			this.money -= m;
			System.out.println("[√]:操作成功");
			return true;
		}
	}
	boolean saveMoney(int m) {// 存款操作
		System.out.println("正在验钞,请稍候……!");
		if (m < 0) {
			if (CheckMoney(-m))
				return true;
			else
				return false;
		} else {
			this.money += m;
			System.out.println("[√]:操作成功");
			return true;
		}
	}
	void search() {				// 显示余额操作
		System.out.println(name + "[ID:" + ID + "] 余额:" + money + "元");
	}
	boolean checkpassword() {	// 检察密码操作
		int i;
		for (i = 0; i < 3; i++) {
			if (i > 0)
				System.out.println("[?á]:密码错误,请输入密码:");
			int pw = EnterAmountOfMoney.scanInt();
			if (pw == password)
				return true;
		}
		if (i == 3)
			System.out.println("[?á]:密码输入出错3次,操作中断!");
		return false;
	}
	void operating(Common_Card st[]) {// 正在执行所选择的项目
		while (true) {
			this.printReceipt();
			int cmd = EnterAmountOfMoney.scanInt();
			switch (cmd) {
			case 1: {
				System.out.println("请输入存款数:");
				int m = EnterAmountOfMoney.scanInt();
				saveMoney(m);
				break;
			}
			case 2: {
				System.out.println("请输入取款数:");
				int m = EnterAmountOfMoney.scanInt();
				CheckMoney(m);
				break;
			}
			case 3:
				search();
				break;
			case 0:
				Machine.end = 0;
				return;
			}
		}
	}
	static void printReceipt() {// 功能提示界面
		System.out.println("我爱我家自动提款机普通用户操作界面");
		System.out.println("——————");
		System.out.println("[存款——1]");
		System.out.println("[取款——2]");
		System.out.println("[余额——3]");
		System.out.println("[退卡——0]");
		System.out.println("——————");
	}
}
Vip-Card类VIP用户功能实现。
package Bank;
//vip用户的功能实现
//vip用户继承了普通用户,普通用户所拥有的功能vip用户全部有
public class Vip_Card extends Common_Card {
	Vip_Card(String name, int ID, int password, int money) {// 构造方法
		super(name, ID, password, money);
	}
	boolean CheckMoney(int m)// 不仅具有存取款的功能还具有可以透支的功能
	{
		System.out.println("正在操作,请稍候……!");
		if (m < 0) {
			if (saveMoney(-m)) {
				return true;
			} else
				return false;
		} else {
			if (m - 5000 > money) {
				System.out.println("[?á]:该账户透支不可超过5000元,本次操作中断!");
				return false;
			}
			this.money -= m;
			System.out.println("[√]:操作成功!");
			return true;
		}
	}
	void TransferMoney(Common_Card st[])// 转账的功能
	{
		System.out.println("请输入目标帐户ID:");
		int id = EnterAmountOfMoney.scanInt();
		int i;
		for (i = 0; i < st.length; i++) {
			if (st[i].ID == id) {
				System.out.println("请输入转账金额:");
				int m = EnterAmountOfMoney.scanInt();
				if (m < 0) {
					System.out.println("请输入目标帐户密码:");
					if (st[i].checkpassword() == false)
						return;
				}
				if (this.CheckMoney(m)) {
					st[i].saveMoney(m);
					System.out.println("[√]:转账成功!");
				} else {
					System.out.println("[?á]:转账失败!");
				}
				break;
			}
		}
		if (i == st.length)
			System.out.println("[?á]:用户不存在!");
	}
	void operating(Common_Card st[])// 正在操作
	{
		while (true) {
			this.printReceipt();
			int cmd = EnterAmountOfMoney.scanInt();
			switch (cmd) {
			case 1: {
				System.out.println("请输入存款数:");
				int m = EnterAmountOfMoney.scanInt();
				saveMoney(m);
				break;
			}
			case 2: {
				System.out.println("请输入取款数:");
				int m = EnterAmountOfMoney.scanInt();
				CheckMoney(m);
				break;
			}
			case 3:
				search();
				break;
			case 4:
				TransferMoney(st);
				break;
			case 0:
				Machine.end = 0;
				return;
			}
		}
	}
	static void printReceipt() {// Vip用户功能提示操作界面
		System.out.println("我爱我家自动提款机-Vip用户操作界面");
		System.out.println("——————");
		System.out.println("[存款——1]");
		System.out.println("[取款——2]");
		System.out.println("[余额——3]");
		System.out.println("[转账——4]");
		System.out.println("[退卡——0]");
		System.out.println("——————");
	}
}
测试类

package Bank;

public class Machine {

	static int end = 1;
	public static void main(String[] args) {
		Common_Card st[] = new Common_Card[4];// 创建一个有4个用户的数组
		// 创建2个普通用户
		st[0] = new Common_Card("未知", 999, 999, 0);
		st[1] = new Common_Card("聂庆亮", 200981501, 10010, 100000);
		// 创建2个VIP用户
		st[2] = new Vip_Card("乐乐", 200981511, 583911, 13000);
		st[3] = new Vip_Card("尹继平", 200981512, 1324114, 22000);
		while (true) {
			if (end == 0) {// 用于退卡操作
				System.out.println("谢谢您的使用,再见");
				return;
			}
			System.out.println("请输入帐户ID:[0:退出]");
			int id = EnterAmountOfMoney.scanInt();	// 获取从键盘上输入的数据
			if (id == 0)
				return;
			int i;
			for (i = 0; i < st.length; i++) {
				if (st[i].ID == id) {				// 如果用户帐户ID正确则输入密码
					System.out.println("请输入帐户密码:");
					if (st[i].checkpassword()) {		// 调用Common_Card类的checkpassword进行核查
						st[i].operating(st);		// 如果密码输入正确则调用
						break;
					}
				}
			}
			if (i == st.length) {
				System.out.println("[?á]:该用户不存在!");
			}
		}
	}
}









作者:冲天之峰    20160607

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 账户类(满50) 版本1:满10 设计Account1 类,包含: ■ 一个名为 id 的int 类型的私有数据域(默认值为 0),长度为 6 位。 ■ 一个名为 balance的double 类型的私有数据域(默认值为 0)。 ■ 一个名为 annualInterestRate 的double 类型的私有数据域存储当前利率(默认值为 0)。 假设所有的账户都有相同的利率。 ■ 一个名为 dateCreated 的Date 类型的私有数据域存储账户的开户日期。 ■ 一个能创建默认账户的无参构造方法。 ■ 一个能创建带特定 id 和初始余额的构造方法,初始余额不能为负数。 ■ id 、balance和annualInterestRate 的访问器和修改器。 ■ dateCreated 的访问器。 ■ 一个名为 getMonthlyInterestRate 的方法返回月利率。 ■ 一个名为 withDraw 的方法从账户提取特定金额。 ■ 一个名为 deposit 的方法向账户存人特定金额。 ■ double 类型的数据域保留 2 位小数。 ■ 成员方法和数据域应进行基本的合理性检查。 设计测试类 ATMMachine1: ■ 创建一个有 100 个账户的数组,其 id 为0,1,2,...99, 并初始化收支为 1000 美元。 ■ 主菜单如下(可参考教材文版 P296或英文版 P367): Main menu 1: check balance 2: withdraw 3: deposit 版本2:满20 扩展Account1 类为Account2 类: ■ Account2 类继承 Account1 类。 ■ 为Account2 类新增一个名为 password 的String 类型的私有数据域存储账号密码。 password 只能为字母或数字,长度不能小于 6 且不能大于 10。密码显示时为*******。 ■ 为Account2 类新增一个名为 name的String 类型的私有数据域存储客户名字。 ■ 为Account2 类新增一个名为 transactions 的ArrayList 类型的新数据域,其为客户存 储交易记录。这要求新建一个名为 Transaction 的类,类的定义请参照教材文版 P327或英 文版P404。每笔交易都是 Transaction 类的一个实例。 ■ 新增一个带初始余额的构造方法,其 id 随机产生,但不能与当前系统的 id 重复。 若初始余额的参数为负数,则抛出一个自定义异常并在当前构造方法进行处理。 ■ 重写方法 withDraw ,要求支取的金额为 100 的整数倍,并且当日支取金额不能超过 5000,支取金额不允许透支。每进行一次操作应向 transactions 数组线性表添加一笔交易。 ■ 重写方法 deposit ,要求每进行一次操作应向 transactions 数组线性表添加一笔交易。 ■ 新增一个方法 changePassword ,只有旧密码正确,新密码符合要求,且两次输入相 同的情况下才可以成功修改密码 设计测试类 ATMMachine2,其主菜单如下(可参考教材文版 P296或英文版 P367): Main menu 0:create a account 1: check balance 2: withdraw 3: deposit 4:details of the transaction 5: change password 6:exit ■ 若用户选择新建一个账号,则应提示用户输入账号 password 、balance 和 annualInterestRate ,其 id 随机产生。新产生的账户应序列化到名为 accounts.dat 的文件。 所有账户只能通过这种方式产生。 ■ 所有用户操作结果应同步到 accounts.dat 文件相应账户。 ■ 所有用户操作应有友好、简介的提示语。 版本3:满20 请参照银行的 AT M机界面,在 Account2 类的基础上开发一个 GUI 界面的AT M系统。 要求界面应模拟小键盘,并且账户信息读、写于文件 accounts.dat 。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值