SCAU java实验9:银行账户存取款业务

实验9:银行账户存取款业务
题目类别: 实验

关键字: 掌握继承、覆盖、多态、对象类型转换、ArrayList及范型

内容要求:

要求编写程序模拟银行账户的存、取款操作。按要求完成以下步骤:

步骤 1:编写程序 Account.java,其中定义银行账户类 Account。该类中有账号、姓名、存款余额等数据域,余额默认是 0;有存款、取款、获取当前余额等方法。其中账号为长度为 12 位数字的字符串,姓名为字符串,存款余额为 double。

步骤 2:编写名为 CreditAccount 类的信用卡账户类。该类继承自 Account 类,增加一个透支限额(double)数据域,透支限额默认为 1000。同时该类账户取款时允许透支,但不能超过透支限额。

步骤 3:编写名为 SavingAccount 的储蓄账户类 SavingAccount。该类继承自 Account 类。该类账户取款时不允许透支。

步骤 4:编写名为 Bank 的模拟银行类,

使用线性表定义一个数据域存储多个类型可能是信用卡账户或储蓄账户的对象,建议使用ArrayList,注意使用范型;对数据域进行封装。该类包含以下方法:

开户:即增加一个新的账户,注意:不允许两个账户的账号相同

销户:即删除一个已有的账户

查询账户:根据一个账号,查询有无该账号的账户

统计目前银行的存款总余额的方法。

统计目前银行的信用卡账户总透支金额的方法。

统计目前总账户数。

统计目前信用卡账户数

统计目前储蓄卡账户数

步骤 5:编写客户端类 Client.java 完成以下功能:

编写一个静态方法,创建一个银行对象,并随机生成 10 个账号从 1000 0000 0000

0000 到 1000 0000 0000 0009、类型不同的账户。

main 方法中模拟几次开户操作。

main 方法中模拟几次销户操作。

模拟几个对指定账号的存款和取款操作。

输出银行的总账户数、总余额、总透支数、各类具体账户数。

提交:打包为可以执行的JAR文档,其中要包含源程序文件。

Account 类

package Main;

public class Account {
    private String name;
    private String account;
    private double Money = 0;

    public Account(String account) {
        this.account = account;
    }

    public Account() {
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public void setMoney(double money) {
        Money = money;
    }

    public String getName() {
        return name;
    }

    public String getAccount() {
        return account;
    }

    public double getMoney() {
        return Money;
    }

    public void saveMoney(double m) {
        this.Money += m;
    }

    public void takeMoney(double m) {
        this.Money -= m;
    }
}

bank类

package Main;

import java.util.ArrayList;

public class Bank {
    private ArrayList<Account> accountArrayList = new ArrayList<>();

    public void setAccountArrayList(ArrayList<Account> accountArrayList) {
        this.accountArrayList = accountArrayList;
    }

    public ArrayList<Account> getAccountArrayList() {
        return accountArrayList;
    }

    public int getAccount(String theAccount){
        //取得账号
        for (int i = 0; i < accountArrayList.size(); i++) {
            if (accountArrayList.get(i).getAccount().equals(theAccount)) {
                return i;
            }
        }
        return -1;
    }

    public int getAccountType(String theAccount){
        for (Account account : accountArrayList) {
            if (account.getAccount().equals(theAccount)) {
                if (account.getClass().getName().equals(CreditAccount.class.getName())) {
                    return 1;
                } else return 0;
            }
        }
        return 0;
    }

    public void addNewAccount(Account newOne) {
        //开户:即增加一个新的账户,注意:不允许两个账户的账号相同
        for (Account account : accountArrayList) {
            if (account.getAccount().equals(newOne.getAccount())) {
                //System.out.println("存在相同账号");
                return;
            }
        }
        accountArrayList.add(newOne);
    }

    public void deleteTheAccount(String deleteOne) {
        //销户:即删除一个已有的账户
        for (int i = 0; i < accountArrayList.size(); i++) {
            if (accountArrayList.get(i).getAccount().equals(deleteOne)) {
                accountArrayList.remove(i);
                return;
            }
        }
    }

    public boolean isExistTheAccount(Account checkOne) {
        //查询账户:根据一个账号,查询有无该账号的账户
        for (Account account : accountArrayList) {
            if (account.getAccount().equals(checkOne.getAccount())) {
                //System.out.println("存在相同账号");
                return true;
            }
        }
        return false;
    }

    public double getSumMoney() {
        //统计目前银行的存款总余额的方法。
        double sum = 0;
        for (Account account : accountArrayList) {
            sum += account.getMoney();
        }
        return sum;
    }

    public  double getAllOverdraftLimit(){
        double sum=0;
        //统计目前银行的信用卡账户总透支金额的方法
        for (Account account : accountArrayList) {
            if (account.getClass().getName().equals(CreditAccount.class.getName())) {
                if(account.getMoney()<0)
                sum += account.getMoney();
            }
        }
        return sum;
    }

    public int getAccountNumber() {
        //统计目前总账户数
        return accountArrayList.size();
    }

    public int getCreditAccountNumber() {
        //统计目前信用卡账户数
        int sum = 0;
        for (Account account : accountArrayList) {
            if (account.getClass().getName().equals(CreditAccount.class.getName())) {
                sum++;
            }
        }
        return sum;
    }

    public int getSavingAccountNumber() {
        //统计目前储蓄卡账户数
        int sum = 0;
        for (Account account : accountArrayList) {
            if (account.getClass().getName().equals(SavingAccount.class.getName())) {
                sum++;
            }
        }
        return sum;
    }

}

Client类

package Main;

import java.util.Random;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        Random random = new Random();
        Bank bank = new Bank();
        String[] accountNum = {"100000000000", "100000000001", "100000000002", "100000000003", "100000000004",
                "100000000005", "100000000006", "100000000007", "100000000008", "100000000009"
        };
        System.out.println("随机生成 10 个账号");
        int f1 = 0, f2 = 0;
        for (int i = 0; i < 10; i++) {
            boolean t = random.nextBoolean();
            if (t) {
                f1++;
                bank.addNewAccount(new CreditAccount(accountNum[i]));
            } else {
                f2++;
                bank.addNewAccount(new SavingAccount(accountNum[i]));
            }
        }
        System.out.println("信用卡数=" + f1 + "  储蓄卡数=" + f2);
        System.out.println("------------------------------------------");
        System.out.print("输入模拟几次开户操作:");
        Scanner reader = new Scanner(System.in);
        int creativeNum = reader.nextInt();

        for (int i = 0; i < creativeNum; i++) {
            System.out.print("请选择开户类型(1)信用卡,(2)储蓄卡:");
            int t = reader.nextInt();
            String accountName = (long) ((random.nextDouble()) * Math.pow(10, 12)) + "";
            while (bank.isExistTheAccount(new Account(accountName))){
                accountName = (long) ((random.nextDouble()) * Math.pow(10, 12)) + "";
            }

            if (t==1) {
                System.out.println("信用卡 账号: " + accountName);
                bank.addNewAccount(new CreditAccount(accountName));
            } else {
                System.out.println("储蓄卡 账号: " + accountName);
                bank.addNewAccount(new SavingAccount(accountName));
            }
            //System.out.println(bank.getAccountArrayList().get(i + 10).getClass().getName() + " " + bank.getAccountArrayList().get(i + 10).getAccount() + "\n");
        }
        System.out.println("------------------------------------------");
        System.out.print("输入模拟几次销户操作:");
        int destroyNum = reader.nextInt();
        while (destroyNum < 0 || destroyNum > bank.getAccountArrayList().size()) {
            System.out.print("输入次数越界请重新输入:");
            destroyNum = reader.nextInt();
        }
        boolean deFlag;
        for (int i = 0; i < destroyNum; i++) {
            System.out.print("请输入删除的账号:");
            String destroyAccount = reader.next();
            deFlag = bank.isExistTheAccount(new Account(destroyAccount));
            if (!deFlag) {
                System.out.println("不存在此账号,请重新输入");
                i--;
            }else {
                bank.deleteTheAccount(destroyAccount);
                System.out.println("删除成功\n");
            }

        }
        System.out.println("------------------------------------------");
        System.out.println("对指定账号的存款和取款");
        int op;
        String name;
        int flag = 0;
        double money;
        int type;
        while (true) {
            flag=0;
            System.out.println("\n请输入账号:(输入0退出)");
            name = reader.next();
            if (name.equals("0")) {
                break;
            }
            if (!bank.isExistTheAccount(new Account(name))) {
                System.out.println("不存在此账号,请重新输入!");
                continue;
            }
            int theAccountNum = bank.getAccount(name);
            type = bank.getAccountType(name);
            System.out.print("账户类型:");
            double limit=0;
            if(type==1){
                System.out.println("信用卡");
                 limit =  ((CreditAccount) bank.getAccountArrayList().get(theAccountNum)).getOverdraftLimit();
            }else System.out.println("储蓄卡");
            while (flag != 1) {
                System.out.println();
                System.out.println("账户余额:" + bank.getAccountArrayList().get(theAccountNum).getMoney());
                if(type==1){
                    System.out.println("当前可取款金额:"+(bank.getAccountArrayList().get(theAccountNum).getMoney()+ limit));
                }
                System.out.println("请选择存款或取款");
                System.out.println("输入”1“存款,输入“2”取款,输入“3”退出");
                op = reader.nextInt();
                switch (op) {
                    case 1 -> {
                        System.out.print("请输入存款金额:");
                        money = reader.nextDouble();
                        bank.getAccountArrayList().get(theAccountNum).saveMoney(money);
                    }
                    case 2 -> {
                        System.out.println("请输入取款金额:");
                        money = reader.nextDouble();
                        if (type == 1) {
                            if (money > bank.getAccountArrayList().get(theAccountNum).getMoney() + limit) {
                                System.out.println("取款金额超出金额上限!取款失败");
                                break;
                            }
                        } else {
                            if (money > bank.getAccountArrayList().get(theAccountNum).getMoney()) {
                                System.out.println("取款金额超出金额上限!取款失败");
                                break;
                            }
                        }
                        bank.getAccountArrayList().get(theAccountNum).takeMoney(money);
                    }
                    case 3 -> flag = 1;
                }
            }
        }

        System.out.println("银行的总账户数:" + bank.getAccountArrayList().size());
        System.out.println("总余额:" + bank.getSumMoney());
        System.out.println("总透支数:" +Math.abs( bank.getAllOverdraftLimit()));
        System.out.println("各类具体账户数:" + bank.getAccountNumber());
        System.out.println("信用卡账户:" + bank.getCreditAccountNumber());
        System.out.println("储蓄卡账户:" + bank.getSavingAccountNumber());
        //reader.close();
    }
}

CreditAccount (继承Account)

package Main;

public class CreditAccount extends Account {
    private double overdraftLimit = 1000;

    public CreditAccount(String account) {
        this.setAccount(account);
    }
    public double getOverdraftLimit() {
        return overdraftLimit;
    }
}

SavingAccount (继承Account)

package Main;

public class SavingAccount extends Account{

    public SavingAccount(String account) {
        this.setAccount(account);
    }
}

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行存取款系统数据库设计 《 银行存取款系统数据库设计 》数据库分析与设计 学 院: 商学院 学 号: 姓 名: 专 业: 信息管理与信息系统 班 级: 14信管 学 期: 2015-2016(1) 银行存取款系统数据库设计全文共27页,当前为第1页。 银行存取款系统数据库设计全文共27页,当前为第1页。 1.需求分析 (1)用户的基本需求: 用户对银行存取款客户端的要求不高,他们需要的是自己通过直接操作来获得自己所需要的服务,如存款、取款、转账、查询、修改密码、缴费等。每一个功能,用户都可以根据系统的提示一步一步往下进行,并且操作方便、简单、快捷,极大的节约了用户办理业务间。 (2)系统设计的目标: 针对银行业务种类繁多、客户需求量大等现象,为了减少银行工作人员的工作任务,延长业务办理的间,方便客户,通过用户与银行存取款客户端,使用户自己就可以在客户端上完成存款、取款、查询余额、转账、修改密码的基础功能,是的银行业务科学化,提高账户管理水平和工作效率。 银行存取款系统数据库设计全文共27页,当前为第2页。 银行存取款系统数据库设计全文共27页,当前为第2页。 (3)系统总体框架: 取款管理银行帐户管理系统数据查询统计帐户管理普通管理管理员管理卡 管 理客户操作存取款取款安装拆除开户销户办卡挂失查询 取款管理 银行帐户管理系统 数据查询统计 帐户管理 普 通 管 理 管理员管理 卡 管 理 客户操作 存取款 取款安装拆除 开户销户 办卡 挂失 查询 银行存取款系统数据库设计全文共27页,当前为第3页。 银行存取款系统数据库设计全文共27页,当前为第3页。 (4)业务流程图: 存款流程图 现金和存折(银行卡)用户填写开户单据 现金和存折(银行卡) 用户填写开户单据 填写是否正确 填写是否正确 否 输入账号和存款金额 输入账号和存款金额 是 将客户信息输入电脑 将客户信息输入电脑 存入金额 存入金额 客户保留密码 客户保留密码 客户存款凭证单 客户存款凭证单 客户签字 客户签字 回执客户存款(银行)卡 回执客户存款(银行)卡 银行存取款系统数据库设计全文共27页,当前为第4页。 银行存取款系统数据库设计全文共27页,当前为第4页。 取款流程图 存折或银行卡 存折或银行卡 工作人员输入银行账号 工作人员输入银行账号 否 客户输入密码 客户输入密码 否密码是否正确 密码是否正确 取款金额 是 取款金额 取款凭证单 取款凭证单 客户签字 客户签字 取款记录 取款记录 回执现金和取款凭证 回执现金和取款凭证 银行存取款系统数据库设计全文共27页,当前为第5页。 银行存取款系统数据库设计全文共27页,当前为第5页。 (5)数据流: 系统顶层数据流程图: 存取款管理系统 存取款管理系统 用户户 用户户 系统输入数据 第一层数据流图 用户存款信息输入 用户存款信息输入 用户 用户 用户存款信息 用户取款信息输入 用户取款信息输入 用户取款信息 银行存取款系统数据库设计全文共27页,当前为第6页。 银行存取款系统数据库设计全文共27页,当前为第6页。 (6)数据字典: 数据流名称:储户信息 数据结构: 账号(ZH) 银行(YH) 密码(MM) 姓名(XM) 身份证号(SFZH) 性别(XB) 年龄(NL) 地址(DZ) 存款余额(CKYE) 数据流名称:银行存款 数据结构: 存款单号(CKDH) 账号(ZH) 日期(RQ) 存款方式(CKFS) 存款金额(JE) 银行存取款系统数据库设计全文共27页,当前为第7页。 银行存取款系统数据库设计全文共27页,当前为第7页。 数据流名称:银行取款 数据结构: 取款单号(CKDH) 账号(ZH) 日期(RQ) 取款方式(CKFS) 金额(JE) 银行存取款系统数据库设计全文共27页,当前为第8页。 银行存取款系统数据库设计全文共27页,当前为第8页。 2.概念结构设计 (1)系统E-R图 性别姓名身份证号 性别 姓名 身份证号 账号 账号 年龄储户 年龄 储户 存款余额地址 存款余额 地址 密码银行 密码 银行 日期 日期 存款方式 存款方式 账号存款单 账号 存款单 存款单号 存款单号 金额 金额 银行存取款系统数据库设计全文共27页,当前为第9页。 银行存取款系统数据库设计全文共27页,当前为第9页。 取款方式日期 取款方式 日期 取款单号取款单账号 取款单号 取款单 账号 金额 金额 储户 储户 1 1 取款存款 取款 存款 N N N 取款单存款单 取款单 存款单 银行存取款系统数据库设计全文共27页,当前为第10页。 银行存取款系统数据库设计全文共27页,当前为第10页。 3.逻辑结构设计 储户(账号、银行、密码、姓名、身份证号、性别、年龄、地址、存款余额) 存款单(存款单号、账

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值