个人银行管理系统(改写)
1. 要求:
设计一个活期存储账户类,包含用户的账号、余额、年利率等信息,还可以实现显示账户信息、存款、取款、结算利息的操作。无论是存款、取款还是结算利息,都需要修改当前的余额并将余额的变动输出。
2. 背景
在现有的C++版本基础上进行改写,使用Java语言重新实现该系统,比较C++与Java在实现上的异同。
3.版本实现
简单类实现 ------1.0版本
注意:此版本相对于C++版本相差不大,无需做过多改动,注意用new 实例化对象的Java语言特点。
类的定义:
public class SavingsAccount {}
数据成员:
private int id; //账号
private double balance; //余额
private double rate; //存款的年利率
private int lastDate; //上次变更余额的时期
private double accumulation; //余额按日累加之和
类中方法:
public SavingsAccount(int date, int id, double rate) {} //构造方法
private void record(int date, double amount) {} //记录一笔账
private double accumulate(int date) {} //获得到指定日期为止的存款金额按日累积值
public int getId() {} //返回编号
public double getBalance() {} //返回余额
public double getRate() {} //返回存款的年利率
public void deposit(int date, double amount) {} //存入现金
public void withdraw(int date, double amount) {} //取出现金
public void settle(int date) {} //结算利息,每年1月1日调用一次该函数
public void show() {} //显示账户信息
public static void main(String[] args) {} //主函数,呈现所实现的功能
增添静态属性与方法 -------1.1版本
注意:在活期账户中添加一个用来记录各个账户的总金额的功能,同时可以获取这个总金额
除上版本的数据成员和成员方法外,增加:
static double total = 0; //所有账户的金额
同时在 record() 方法中增加 total += amount; 来实现 各个账户的总金额的计算
增加获取总金额的静态方法:
public static double getTotal() {} //显示总金额
增添字符串、对象数组 -------1.2版本
**注意:
- 增加一个日期date类,其中的子功能有:存储一个日期,返回年月日,判断是否为闰年,获取两日只差的天数,显示日期的功能。
- 使用字符串银行账号
- 为每笔账户增加说明性文字的功能
- 增加报告错位的功能**
date类的实现
//数据成员:
private int year;
private int month;
private int day;
private int totalDays;
final int DAYS_BEFORE_MONTH[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
//方法:
public Date(int year, int month, int day){}
public final int getYear(){}
public final int getMonth(){}
public final int getDay(){}
public final int getMaxDay(){}
public final boolean isLeapYear(){}
public final void show(){}
public final int distance(final Date date){}
另外对savingsaccount类中的数据类型做简单改动即可
继承与派生,抽象出父类,增添子类 -------1.3版本
注意:
1.增加了信用账户creditaccount类:
信用账户允许 透支,每一个信用账户都有一定的信用额度,总的透支金额应在这个额度之内;
如果项信用账户内存钱,不会有利息,但使用信用账户透支则需要支付利息,信用账户的利率一般以日为单位,为了简单从透支那一天其就开始计算利息;
信用账户每月进行以及结算,假定结算日为每月的1日
信用账户每年需要交一次年费,假定每年1月1日结算的时候扣缴年费
创建一个新类accumulator用来实现各个账户的按日累加和的功能,有该类题用计算一项数据的按日累加之和所需的接口,在两个派生类中分别将其实例化,通过该类的实例计算利息
2.类的设计:
account类:
private String id;
private double balance;
private static double total = 0;
protected Account(final Date date, final String id){}
protected void record(final Date date, double amount, final String desc){}
protected final void error(final String msg){}
public final String getId(){}
public final double getBalance(){}
public static double getTotal(){}
public void show(){}
accumulator类:
private date lastDate;
double value;
double sum;
public Accumulator(final date D, double value){}
public final double getSum(final date D){}
public void change(final date D, double value){}
public void reset(final date D, double value){}
savingsaccount类
public class savingsaccount extends account{
private accumulator acc;
private double rate;
public savingsaccount(final date D, final String id, double rate){}
public final double getRate(){}
public void deposit(final date D, double amount, final String desc){}
public void withdraw(final date D, double amount, final String desc){}
public void settle(final date D){}
}
creditaccount类
public class CreditAccount extends Account{
private Accumulator acc;
private double credit; private double rate; private double fee;
private final double getDebt(){}
public CreditAccount(final Date date, final String id, double credit, double rate, double fee) {}
public final double getCredit(){}
public final double getRate(){}
public final double getFee(){}
public final double getAvailableCredit(){}
public void deposit(final Date date, double amount, final String desc){}
public void withdraw(final Date date, double amount, final String desc){}
public void settle(final Date date){}
public final void show(){}
}
多态特性 -------1.4版本
注意:
这一版本改进上一般版本中的两个不足,1.改进测试方法的实现,使其更加的便于操作,管理2. 改进各账户之间的关系,使其更加容易操作
account类
abstract public class account {
abstract public void deposit(final Date date, double amount, final String desc);
abstract public void withdraw(final Date date, double amount, final String desc);
abstract public void settle(final Date date);
public void show() {}
}
date类
public final int sub(final date D){
return this.totalDays - date.totalDays;
}
主函数main实现
public static void main(String[] args) {
date D = new date(2018, 11, 1); //起始日期
//建立几个账户
savingsaccount sa1 = new savingsaccount(D, "S3755217", 0.015);
savingsaccount sa2 = new savingsaccount(D, "02342342", 0.015);
creditaccount ca = new creditaccount(D, "C5392394", 10000, 0.0005, 50);
account accounts[] = {sa1, sa2, ca};
final int n = accounts.length; //账户总数
System.out.print("(d)deposit (w)withdraw (s)show (c)change day (n)next month (e)exit \n");
Scanner sc = new Scanner(System.in);
String cmd;
do {
//显示日期和总金额
D.show();
System.out.print("\tTotal: " + account.getTotal() + "\tcommand>");
int index, day;
double amount;
String desc;
switch (cmd = sc.next()) {
case "d": //存入现金
index = sc.nextInt();
amount = (double)sc.nextDouble();
desc = sc.next();
accounts[index].deposit(D, amount, desc);
break;
case "w": //取出现金
index = sc.nextInt();
amount = (double)sc.nextDouble();
desc = sc.next();
accounts[index].withdraw(D, amount, desc);
break;
case "s": //查询各账户信息
for (int i = 0; i < n; i++) {
System.out.print("[" + i + "]" );
accounts[i].show();
System.out.print("\n");
}
break;
case "c": //改变日期
day = sc.nextInt();
if (day < D.getDay())
System.out.print("You cannot specify a previous day");
else if (day > D.getMaxDay())
System.out.print("Invalid day");
else
D = new date(D.getYear(), D.getMonth(), day);
break;
case "n": //进入下个月
if (D.getMonth() == 12)
D = new date(D.getYear() + 1, 1, 1);
else
D = new date(D.getYear(), D.getMonth() + 1, 1);
for (int i = 0; i < n; i++)
accounts[i].settle(D);
break;
}
} while (cmd !="end");
}
使用容器代替数组 -------1.5版本
注意:
在上一版本中,使用父类对象数组来处理不同派生类对象,从而实现多态性调用,本版本中使用Java中的 ArrayList 来代替原来的对象数组,以实现动态的改变大小,添加新账户的功能,只需在main创建对象数组即可
main类
ArrayList accounts = new ArrayList();