银行管理系统(c变java)设计报告

一.课程设计要求与目的

  • 模仿个人银行账户管理系统的c++版本(4-8),使用java语言重新实现该系统,比较c++与java在实现上的异同,熟练掌握java语法
  • 根据需求演化,逐步完善个人银行账户管理系统的功能,改进代码,体会面对对象思想的封装继承与多态

二.课程设计进展记录

1.个人银行账户管理系统1.0
1.1 系统需求:建立账户,可对账户进行存钱取钱操作,结算年息,得出余额
1.2系统设计:

- 存钱,取钱,计算利息,展示余额,记录每一笔余额变化
- 存钱,取钱,计算利息都需要调用到记录record函数

1.3系统实现:

public class SavingsAccount1 {
    private int id;				//账号
    private double balance;		//余额
    private double rate;		//存款的年利率
    private int lastDate;		//上次变更余额的时期
    private double accumulation;	//余额按日累加之和
    **//记录一笔帐,date为日期,amount为金额,desc为说明**
    private void **record**(int date, double amount){
        accumulation = accumulate(date);
        lastDate = date;
        amount = Math.floor(amount * 100 + 0.5) / 100;	//保留小数点后两位
        balance += amount;
        System.out.println(date+"\t#"+id+"\t"+amount+"\t"+balance);
    }
    //获得到指定日期为止的存款金额按日累积值
    final private double accumulate(int date) {
        return accumulation + balance * (date - lastDate);
    }
    public SavingsAccount1(int date,int id,double rate){    }
    int getId() { return id; }
    double getBalance() { return balance; }
    double getRate() { return rate; }
    //存入现金
    public void **deposit**(int date, double amount){*record(date,amount);*}
    //取出现金
    public void **withdraw**(int date, double amount){
        if (amount > getBalance())
            System.out.println("Error: not enough money");
        else
            *record(date, -amount);*
    }
    //结算利息,每年1月1日调用一次该函数
    public void **settle**(int date){
        double interest = accumulate(date) * rate / 365;//计算年息
        if (interest != 0)
            record(date, interest);
        accumulation = 0;
    }
    //显示账户信息
    public void **show**(){System.out.println("#"+id+"\tBalance: "+balance); }

1.4系统测试:
在这里插入图片描述
2.个人银行账户管理系统2.0
2.1系统需求:相对于1.0版本,多了统计所有账户金额功能
2.2系统设计:

-相对于2.0版本,多了获取总账户金额的函数
-record函数内部也相应加上统计总金额的代码

2.3系统实现:

属性多了private static double total;	//所有账户的总金额
private void record(int date, double amount){
        accumulation = accumulate(date);
        lastDate = date;
        amount = Math.floor(amount * 100 + 0.5) / 100;	//保留小数点后两位
        balance += amount;
        **total+=amount;**
        System.out.println(date+"\t#"+id+"\t"+amount+"\t"+balance);
    }
    其余函数无变化

2.4系统测试:
在这里插入图片描述
3.个人银行账户管理系统3.0
3.1系统需求:相较于2.0版本,日期精确为了具体年月日;每笔存款取款明确了用途与来源。
3.2系统设计:

-相对于2.0版本,新增了Date类
-账户类将*变更余额的时期*类型从int改为了Date----->两个类之间产生联系
-记录,存钱,取钱函数相应增加了传参入口,传入字符串
-加入了日期的展示(show)
-计算日期的差,从int直接相加减变成了两个对象总日期属性相加减

3.3系统实现:

class Date{
    final int DAYS_BEFORE_MONTH[]= new int[]{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
    private int year;//年
    private int month;//月
    private int day;//日
    private int totalDays;//该日期是从公元元年1月1日开始的第几天
    public Date(int year, int month, int day){//用年、月、日构造日期
        this.year=year;
        this.month=month;
        this.day=day;
        if (day <= 0 || day>getMaxDay()) {
            System.out.println("Invalid date: ");
            show();
            System.out.println();
            //exit(1);
        }
        int years = year - 1;
        totalDays = years * 365 + years / 4 - years / 100 + years / 400
                + DAYS_BEFORE_MONTH[month - 1] + day;
        if (isLeapYear() && month > 2) totalDays++;
    }
    final int getYear() { return year; }
    final int getMonth() { return month; }
    final int getDay() { return day; }
    final int getMaxDay(){
        if (isLeapYear() && month == 2)
            return 29;
        else
            return DAYS_BEFORE_MONTH[month]- DAYS_BEFORE_MONTH[month - 1];
    }	//获得当月有多少天
    final boolean isLeapYear() {	//判断当年是否为闰年
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }
    final void show(){System.out.println(getYear()+"-"+getMonth()+"-"+getDay()); }	//输出当前日期
    final int distance(final Date date) {     //计算两个日期之间差多少天
        return totalDays - date.totalDays;
    }
}

3.4系统测试:
在这里插入图片描述
4.个人银行账户管理系统4.0
4.1系统需求:相较于3.0版本,多了信用账户类,有了信用额度,欠款日利率,信用卡年费的概念
4.2系统设计:

-由于有信用账户类以及储蓄账户类,所以采用了两个子类继承Account类
-设计了Date类与Accumulator类(辅助计算利息的累加器),与账户类对象形成联系

4.3系统实现:

class Accumulator {	//将某个数值按日累加
    private Date lastDate;	//上次变更数值的时期
    private double value;	//数值的当前值
    private double sum;		//数值按日累加之和
    //构造函数,date为开始累加的日期,value为初始值
    public Accumulator(final Date date, double value){
        lastDate=date;
        this.value=value;
        sum=0;
    }
    //获得到日期date的累加结果
    public double getSum(final Date date) {
        return sum + value * date.distance(lastDate);
    }
    //在date将数值变更为value
    public void change(final Date date, double value) {
        sum = getSum(date);
        lastDate = date;
        this.value = value;
    }
    //初始化,将日期变为date,数值变为value,累加器清零
    public void reset(final Date date, double value) {
        lastDate = date;
        this.value = value;
        sum = 0;
    }
}
static class CreditAccount extends Account { //信用账户类
        private Accumulator acc;    //辅助计算利息的累加器
        private double credit;        //信用额度
        private double rate;        //欠款的日利率
        private double fee;            //信用卡年费
        final private double getDebt() {    //获得欠款额
            double balance = getBalance();
            return (balance < 0 ? balance : 0);
        }
        public CreditAccount(final Date date, final String id, double credit, double rate, double fee, final Accumulator acc1) { }     //构造函数
        final public double getCredit() { return credit;}
        final public double getRate() {return rate; }
        final public double getFee() { return fee; }
        final public double getAvailableCredit() {    //获得可用信用
            if (getBalance() < 0)
                return credit + getBalance();
            else
                return credit;
        }
        void deposit(final Date date, double amount, final String desc) { }     //存入现金
        void withdraw(final Date date, double amount, final String desc) { }        //取出现金
        void settle(final Date date) { }        //结算利息和年费,每月1日调用一次该函数
        public void show() {
            super.show();
            System.out.println("\tAvailable credit:" + getAvailableCredit());
        }
    }

4.4系统测试:
在这里插入图片描述
5.个人银行账户管理系统5.0
5.1系统需求:相较于4.0版本,多了用户选择,自定义的功能
5.2系统设计:主要修改在主函数内部,其他功能函数无大变化
5.3系统实现:

char cmd;
        Scanner scanner = new Scanner(System.in);

        do {
            date.show();
            System.out.print("\tTotal: "+Account.getTotal()+"\tcommand> ");
            int index,day;
            double amount;
            String decs;
            cmd = scanner.next().charAt(0);
            switch (cmd) {
                case 'd':
                    System.out.print("Index> ");
                    index = scanner.nextInt();
                    System.out.print("Amount> ");
                    amount = scanner.nextInt();
                    System.out.print("Decs> ");
                    Scanner sc = new Scanner(System.in);
                    decs = sc.nextLine();
                    accounts[index].deposit(date,amount,decs);
                    break;
                case 'w':
                    System.out.print("Index> ");
                    index = scanner.nextInt();
                    System.out.print("Amount> ");
                    amount = scanner.nextInt();
                    System.out.print("Decs> ");
                    sc = new Scanner(System.in);
                    decs = sc.nextLine();
                    accounts[index].withdraw(date,amount,decs);
                    break;

                case 's':
                    for(int i = 0; i<n; i++) {
                        System.out.print("["+i+"]");
                        accounts[i].show();
                    }
                    break;
                case 'c':
                    day = scanner.nextInt();
                    if(day > date.getDay()) {
                        System.out.print("You cannot specify a previous day");
                    } else if(day > date.getMaxDay()) {
                        System.out.print("Invalid day");
                    } else {
                        date = new Date(date.getYear(),date.getMonth(),day);
                    }
                    break;
                case 'n':
                    if(date.getMonth() == 12) {
                        date = new Date(date.getYear()+1,1,1);
                    } else {
                        date = new Date(date.getYear(), date.getMonth()+1, 1 );
                    }
                    for (Account value : accounts) {
                        value.settle(date);
                    }
                    break;
            }

        } while (cmd != 'e');

5.4系统测试:
在这里插入图片描述
!!!!!需要注意,改变过程中:!!!!!!!

  • const变final
  • c语言需要头文件,using namespacestd;java不需要,只需要各类中完成即可
  • Java类之间的使用不用遵循先声明再使用的规则,而C++必需先声名才可以使用
  • java是boolean;c++是bool
  • Java类外不能有变量的声明,而C++可以有作为C++的全局变量。
  • 类的属性、方法定义写法不同
  • 构造函数初始化不同
  • 调用父类构造方法(super vs 直接父类名)
  • 传参类型为类对象时不同,一个地址,一个直接引用
  • 运算符重载
    (int operator - (const Date& date) const {
    return totalDays - date.totalDays;
    } vs java无运算符重载)
  • 纯虚函数 vs 抽象方法
  • -静态变量调用方法不同:Account::getTotal() vs Account.getTotal()
  • 空行:cout << endl; vs System.out.println();
  • 对象建立不同,直接声明 vs new方法
  • 输出方法不同(cout vs sout)
  • 输入方法 (char cmd;cin>>cmd; vs
char cmd;
        Scanner scanner = new Scanner(System.in);
        do {
            date.show();
            System.out.print("\tTotal: "+Account.getTotal()+"\tcommand> ");
            int index,day;
            double amount;
            String decs;
            cmd = scanner.next().charAt(0);
 )
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值