个人银行管理系统

个人银行管理系统(改写)

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版本

**注意:

  1. 增加一个日期date类,其中的子功能有:存储一个日期,返回年月日,判断是否为闰年,获取两日只差的天数,显示日期的功能。
  2. 使用字符串银行账号
  3. 为每笔账户增加说明性文字的功能
  4. 增加报告错位的功能**

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();

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值