银行管理系统第七章~第九章

**第七八九章的Account、 Accumulator、CreditAccount、Date、 SavingsAccount基本上都差不多,所以我就只写了一遍

Account

package Bank7_10;

import static java.lang.StrictMath.floor;

public class Account {
    private Accumulator acc;
    private final String id;	 //账号
    private double balance;		//余额
    private static double total = 0;
    private double accumulation;
    private Date lastDate;
    private double rate;

    protected Account(final Date date, final String id) {
        this.id = id;
        balance = 0;
        date.show();
        System.out.println("\t#" + id + " created");
    }

    private final double accumulate(final Date date)  {
        return accumulation + balance * date.distance(lastDate);
    }
    public String getId() { return id; }
    public double getBalance() { return balance; }
    public static double getTotal() { return total; }

    public void record(final Date date, double amount, final String desc) {
        amount = floor(amount * 100 + 0.5) / 100;	//保留小数点后两位
        balance += amount;
        total += amount;
        date.show();
        System.out.println( "\t#"+id+"\t"+amount+"\t"+balance+"\t"+desc );
    }

    public void settle(final Date date) {
        double interest = accumulate(date) * rate	//计算年息
                / date.distance(new Date(date.getYear() - 1, 1, 1));
        if (interest != 0)
            record(date, interest, "interest");
        accumulation = 0;
    }

    public void withdraw(final Date date, double amount,final String desc)
    {
        if (amount > getBalance()) {
            error("not enough money");
        } else {
            record(date, -amount, desc);
            acc.change(date, getBalance());
        }
    }

    public void deposit(final Date date, double amount,final String desc)
    {
        record(date, amount, desc);
        acc.change(date, getBalance());
    }
    //取出现金

    public void show(){
        System.out.println(getId()+"\tBalance: " +this.balance);
    }

    public final void error(final String msg){
        System.out.println("Error: "+id+" "+msg);
    }
}

Accumulator

package Bank7_10;

public 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 final 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;

    }


CreditAccount

package Bank7_10;

public class CreditAccount extends Account{//信用账户类

    private Accumulator acc;	//辅助计算利息的累加器
    private double credit;		//信用额度
    private double rate;		//欠款的日利率
    private double fee;			//信用卡年费

    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)
    {
        super(date, id);
        this.credit=credit;
        this.rate=rate;
        this.fee=fee;
        acc = new Accumulator(date, 0);

    }

    public double getAvailableCredit() {	//获得可用信用
        if (getBalance() < 0)
            return credit + getBalance();
        else
            return credit;
    }
    //存入现金
    public void deposit(final Date date, double amount,final String desc)
    {
        record(date, amount, desc);
        acc.change(date, getDebt());
    }
    //取出现金
    public void withdraw(final Date date, double amount,final String desc)
    {
        if (amount - getBalance() > credit) {
            error("not enough credit");
        } else {
            record(date, -amount, desc);
            acc.change(date, getDebt());
        }
    }
    //结算利息和年费,每月1日调用一次该函数
    public void settle(final Date date)
    {
        double interest = acc.getSum(date) * rate;
        if (interest != 0)
            record(date, interest, "interest");
        if (date.getMonth() == 1)
            record(date, -fee, "annual fee");
        acc.reset(date, getDebt());
    }

    public void show()
    {
        super.show();
        System.out.println( "\tAvailable credit:" + this.getAvailableCredit());
    }
}


Date

package Bank7_10;

import static java.lang.StrictMath.floor;

public class Date {
    private int day;
    private int month;
    private int year;
    private int totalDays;
    private final int[] DAYS_BEFORE_MONTH
            = new int[]{ 0, 31, 59, 90, 120,
            151, 181, 212, 243, 273, 304, 334, 365 };

    boolean isLeapYear(){//是否为闰年
        if(year%100==0){
            if(year%400==0)
                return true;
            else
                return false;
        }else{
            if(year%4==0)
                return true;
            else
                return false;
        }
    }

    public int getYear(){ return year;}
    public int getMonth(){ return month;}
    public int getDay(){ return day;}

    public Date(int year, int month, int day){
        this.day = day;
        this.month = month;
        this.year = year;
        if (day <= 0 || day > getMaxDay()) {
            System.out.println("Invalid date: ");
            show();
            System.out.println();
            System.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++;
    }

    public final int getMaxDay() {
        if (isLeapYear() && month == 2)
            return 29;
        else
            return DAYS_BEFORE_MONTH[month]- DAYS_BEFORE_MONTH[month - 1];
    }


    public final void show(){
        System.out.println(getYear()+"-"+getMonth()+"-"+getDay());
    }

    public final int distance(final Date date) {
        return totalDays-date.totalDays;
    }
}

SavingsAccount

package Bank7_10;

public class SavingsAccount extends Account {//储蓄账户类

    private Accumulator acc;	//辅助计算利息的累加器
    private double rate;		//存款的年利率

    //构造函数
    public SavingsAccount(final Date date,final String id, double rate)
    {
        super(date,id);
        this.rate = rate;
        acc=new Accumulator(date,0);
    }
    public double getRate() { return rate; }
    //存入现金
    public void deposit(final Date date, double amount,final String desc)
    {
        record(date, amount, desc);
        acc.change(date, getBalance());
    }
    //取出现金
    public void withdraw(final Date date, double amount,final String desc)
    {
        if (amount > getBalance()) {
            error("not enough money");
        } else {
            record(date, -amount, desc);
            acc.change(date, getBalance());
        }
    }
    //结算利息,每年1月1日调用一次该函数
    public void settle(final Date date)
    {
        double interest = acc.getSum(date) * rate / date.distance(new Date(date.getYear() - 1, 1, 1));	//计算年息
        if (interest != 0)
            record(date, interest, "interest");
        acc.reset(date, getBalance());
    }
}

第七章

7_10

package Bank7_10;

public class Demo7_10 {
    public static void main(String[] args) {
        Bank7_10.Date date = new Bank7_10.Date(2008, 11, 1);	//起始日期
        //建立几个账户
        SavingsAccount sa1 = new SavingsAccount(date, "S3755217", 0.015);
        SavingsAccount sa2 = new SavingsAccount(date, "02342342", 0.015);
        CreditAccount ca = new CreditAccount(date, "C5392394", 10000, 0.0005, 50);
        //11月份的几笔账目
        sa1.deposit(new Bank7_10.Date(2008, 11, 5), 5000, "salary");
        ca.withdraw(new Bank7_10.Date(2008, 11, 15), 2000, "buy a cell");
        sa2.deposit(new Bank7_10.Date(2008, 11, 25), 10000, "sell stock 0323");
        //结算信用卡
        ca.settle(new Bank7_10.Date(2008, 12, 1));
        //12月份的几笔账目
        ca.deposit(new Bank7_10.Date(2008, 12, 1), 2016, "repay the credit");
        sa1.deposit(new Bank7_10.Date(2008, 12, 5), 5500, "salary");
        //结算所有账户
        sa1.settle(new Bank7_10.Date(2009, 1, 1));
        sa2.settle(new Bank7_10.Date(2009, 1, 1));
        ca.settle(new Bank7_10.Date(2009, 1, 1));
        //输出各个账户信息
        System.out.println();
        sa1.show();
        System.out.println();
        sa2.show();
        System.out.println();
        ca.show();
        System.out.println();
        System.out.println("Total:"+ SavingsAccount.getTotal());
    }
}

第八章

8_8

package Bank8_8;

import Bank7_10.*;

import java.io.IOException;
import java.util.Scanner;

public class Demo8_8 {
    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        Bank7_10.Date date = new Bank7_10.Date(2008, 11, 1);	//起始日期
        //建立几个账户
        SavingsAccount sa1 = new SavingsAccount(date, "S3755217", 0.015);
        SavingsAccount sa2 = new SavingsAccount(date, "02342342", 0.015);
        CreditAccount ca = new CreditAccount(date, "C5392394", 10000, 0.0005, 50);
        Account[] accounts =new Account[]{ sa1, sa2, ca};
        final int n = accounts.length;	//账户总数

        System.out.println("(d)deposit (w)withdraw (s)show (c)change day (n)next month (e)exit" );
        char cmd;
        do {
            //显示日期和总金额
            date.show();
            System.out.println("\tTotal: "+Account.getTotal()+"\tcommand> ");

            int index, day;
            double amount;
            String desc;
            cmd = (char)System.in.read();
            System.out.println(cmd);
            switch (cmd) {
                case 'd':	//存入现金
                    index = in.nextInt();
                    amount = in.nextInt();
                    desc = in.nextLine();
                    accounts[index].deposit(date, amount, desc);
                    break;
                case 'w':	//取出现金
                    index = in.nextInt();
                    amount = in.nextInt();
                    desc = in.nextLine();
                    accounts[index].withdraw(date, amount, desc);
                    break;
                case 's':	//查询各账户信息
                    for (int i = 0; i < n; i++) {
                        System.out.println("[‘ << i << ’]");
                        accounts[i].show();
                        System.out.println();
                    }
                    break;
                case 'c':	//改变日期
                    day = in.nextInt();
                    if (day < date.getDay())
                        System.out.println( "You cannot specify a previous day");
                    else if (day > date.getMaxDay())
                        System.out.println("Invalid day");
                    else
                        date = new Bank7_10.Date(date.getYear(), date.getMonth(), day);
                    break;
                case 'n':	//进入下个月
                    if (date.getMonth() == 12)
                        date = new Bank7_10.Date(date.getYear() + 1, 1, 1);
                    else
                        date = new Bank7_10.Date(date.getYear(), date.getMonth() + 1, 1);
                    for (int i = 0; i < n; i++)
                        accounts[i].settle(date);
                    break;
            }
        } while (cmd != 'e');
    }
}

第九章

9_16

package Bank9_16;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import Bank7_10.*;

public class Demo9_16 {
    public static void main(String[] args) throws IOException {
        Bank7_10.Date date = new Bank7_10.Date(2008, 11, 1);	//起始日期
        ArrayList<Account> accounts = new ArrayList<>(0);	//创建账户数组,元素个数为0
        //System.out.println("(a)add account (d)deposit (w)withdraw (s)show (c)change day (n)next month (e)exit");
        char cmd;
        do {
            //显示日期和总金额
            date.show();
            System.out.println("\tTotal: " + Account.getTotal() + "\t");

            System.out.println("(a)add account(增加账户) (d)deposit(存入现金) (w)withdraw(取出现金) (s)show(查询各账户信息)");
            System.out.println("(c)change day(改变日期) (n)next month(进入下个月) (e)exit(退出)");
            System.out.println("有"+accounts.size()+"个账户");
            System.out.println("command:");

            char type;
            int index, day;
            double amount, credit, rate, fee;//rate 年利率; credit 信用
            String id, desc;//id 账号
            Account account;//一个账户
            Scanner in = new Scanner(System.in);

            cmd = in.next().charAt(0);
            switch (cmd) {
                case 'a':	//增加账户
                    System.out.print("请输入账户类型(s为储蓄卡):");
                    type = in.next().charAt(0);
                    in.nextLine();
                    System.out.print("请输入账户id:");
                    id = in.nextLine();
                    if (type == 's') {
                        System.out.print("年利率:");
                        rate = in.nextDouble();
                        account = new SavingsAccount(date, id, rate);
                    } else {
                        System.out.print("信用:");
                        credit = in.nextDouble();
                        System.out.print("利率:");
                        rate = in.nextDouble();
                        System.out.print("金额:");
                        fee = in.nextDouble();
                        account = new CreditAccount(date, id, credit, rate, fee);
                    }
                    accounts.add(account);
                    accounts.trimToSize();
                    break;
                case 'd':	//存入现金
                    System.out.print("账户:");
                    index = in.nextInt();
                    System.out.print("存入金额:");
                    amount = in.nextDouble();
                    System.out.print("说明:");
                    in.nextLine();
                    desc = in.nextLine();
                    accounts.get(index-1).deposit(date, amount, desc);
                    break;
                case 'w':	//取出现金
                    System.out.print("账户:");
                    index = in.nextInt();
                    System.out.print("取出金额:");
                    amount = in.nextDouble();
                    System.out.print("说明:");
                    in.nextLine();
                    desc = in.nextLine();
                    accounts.get(index-1).withdraw(date, amount, desc);
                    break;
                case 's':	//查询各账户信息
                    for (int i = 0; i < accounts.size(); i++) {
                        System.out.print(i+1+": ");
                        accounts.get(i).show();
                        System.out.println();
                    }
                    break;
                case 'c':	//改变日期
                    System.out.print("输入天数:");
                    day = in.nextInt();
                    if (day < date.getDay())
                        System.out.println("You cannot specify a previous day");
                    else if (day > date.getMaxDay())
                        System.out.println("Invalid day");
                    else
                        date = new Bank7_10.Date(date.getYear(), date.getMonth(), day);
                    break;
                case 'n':	//进入下个月
                    if (date.getMonth() == 12)
                        date = new Bank7_10.Date(date.getYear() + 1, 1, 1);
                    else
                        date = new Bank7_10.Date(date.getYear(), date.getMonth() + 1, 1);
                    for (int i = 0; i < accounts.size(); i++){
                        accounts.get(i).settle(date);
                        if(i<(accounts.size()-1)) {
                            System.in.read();}
                    }
                    break;
            }
        } while (cmd != 'e');

        for (int i = 0; i < accounts.size(); i++)
            accounts.remove(i);

    }
}

收获

1.java中继承用extends
2.java中一个.java文件只能有一个public类
3.被final修饰的变量只可被赋一次值,被final修饰的方法不可被覆盖,被final修饰的类不可被继承
4.java中从键盘输入用Scanner in = new Sacnner(System.in),输入int型:in.nextInt(),输入char 型:in.next().charAt(0)(.next()是一个方法,改方法返回一个对象,比如是String,那么java.util.Scanner.next()就可以理解为一个String型的对象,所以有一个0),输入String型:in.nextLine(),且在输入String之前要用in.nextLine();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值