Java之《ATM自动取款机》(面向对象)

《JAVA编程基础》项目说明

一、项目名称:

   基于JAVA控制台版本银行自动取款机

项目要求:

    实现银行自动取款机的以下基本操作功能:读卡、取款、查询。(自动取款机中转账、修改密码不作要求)

具体要求:

    读卡:因不能使用真正的银行卡,要求用户输入虚拟账号,输入密码,程序判断账号密码是否匹配,如果用户输入账号密码不匹配,提示用户输入不正确;如果用户连续三次输入错误,提示用户账号冻结。此时程序退出。

图1:

    进入主界面:当用户输入正确的账号密码后,进入主取款机服务主界面。界面提示用户可以使用的服务,如查询、取款、转账(功能无需实现)、退卡。用户可以选择对应的服务编号,进入相应的操作界面。

图2:

    取款:当用户选择取款,进入取款界面,提示用户输入取款金额。用户输入完毕回车,程序应该进行判断用户取款金额,如果取款金额在存款金额范围之内,取款成功,并且将用户存款更新;否则提示用户余额不足,取款失败。

图3:

图4:

    查询:当用户选择余额查询,显示用户当前可用余额。

图5:

    退卡:用户选择退卡,则感谢用户使用该服务,程序退出。

图6:

其他要求:用户在账号密码正确进入主界面后,只要不退卡,可以循环操作。具体循环操作次数不固定;用户每选择一项服务并操作完后,给出相应的提示,并提示用户返回主界面。

二、测试代码如下:

(1)用户类:

package com.fs.demo;

public class User {
    public String accountNumber;
    public String password;
    public double sum;
    public User(){
        this.accountNumber="1234";
        this.password="5678";
        this.sum=8888.0;
    }
    public User(String accountNumber,String password,double sum){
        this.accountNumber=accountNumber;
        this.password=password;
        this.sum=sum;
    }


}

(2)测试类: (以下虽然能满足项目需求,但此代码不足。其实可以简化:改成调用方法去处理每个模块也能达到需求,这样的目的就是当遇到比较大的项目时便于代码的后期维护)

package com.fs.test;
import com.fs.demo.*;
import java.util.*;
public class Test01 {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        User user =new User();
        System.out.println("********欢迎使用中国民生银行自动取款服务********");
        System.out.println("**      请输入你的账号:                  **");
        String accountNum= sc.next();
        while(!accountNum.equals(user.accountNumber)){
            System.out.println("该账号输入有误,请重新输入正确账号:");
            accountNum=sc.next();
        }
        System.out.println("**      请输入你的密码:                  **");
        String password=sc.next();
        int i=1;//记录输入错误密码次数
        while(!password.equals(user.password)){
            if(i==1||i==2) {
                System.out.println("你已连续输入错误密码" + i + "次。若连续三次密码输入错误,该账号将被冻结!");
                System.out.println("请你重新输入正确密码:");
                password = sc.next();
                if(!password.equals(user.password)) {
                    i++;
                }
            }
            if(i==3){
                System.out.println("你已连续输入错误密码3次,该账号将已被冻结!");
                break;
            }
        }
        if(accountNum.equals(user.accountNumber)&&password.equals(user.password)){
            System.out.println("银行卡账号登录成功!");
            System.out.println("********欢迎使用中国民生银行自动取款服务********");
            System.out.println("**     1.查询            2.取款          **");
            System.out.println("**     3.转账            4.退卡          **");
            System.out.println("请选择您需要的服务:");
            int select=sc.nextInt();
            while(true) {
                if (select == 1) {
                    System.out.println("********欢迎使用中国民生银行自动取款服务********");
                    System.out.println("******** 查询成功!!        ********");
                    System.out.println("您查询的账号的总余额为:" + user.sum + "元");
                    System.out.println();
                    System.out.println("********返回请选择5****************");
                    int flag1=sc.nextInt();
                    if(flag1==5){
                        System.out.println("********欢迎使用中国民生银行自动取款服务********");
                        System.out.println("**     1.查询            2.取款          **");
                        System.out.println("**     3.转账            4.退卡          **");
                        System.out.println("请选择您需要的服务:");
                        select=sc.nextInt();
                    }
                }
                if (select == 2) {
                    System.out.println("********欢迎使用中国民生银行自动取款服务********");
                    System.out.println("**       请输入您要取款的金额:");
                    double sum = sc.nextDouble();
                    System.out.println("******** 取款成功!!        ********");
                    System.out.println("您的账号余额还剩:" + (user.sum - sum) + "元");
                    user.sum=(user.sum-sum);
                    System.out.println();
                    System.out.println("********返回请选择5****************");
                    int flag1=sc.nextInt();
                    if(flag1==5){
                        System.out.println("********欢迎使用中国民生银行自动取款服务********");
                        System.out.println("**     1.查询            2.取款          **");
                        System.out.println("**     3.转账            4.退卡          **");
                        System.out.println("请选择您需要的服务:");
                        select=sc.nextInt();
                    }
                }
                if (select == 3) {
                    System.out.println("********欢迎使用中国民生银行自动取款服务********");
                    System.out.println("**  请分别输入您要转账的目的银行卡的账号和密码:");
                    User user1 = new User(sc.next(), sc.next(), 4000.0);
                    System.out.println("**       请输入您要转账的金额:");
                    double sum = sc.nextDouble();
                    System.out.println("******** 转账成功!!        ********");
                    System.out.println("您的账号余额还剩:" + (user.sum - sum) + "元");
                    System.out.println("目的银行卡账号:" + user1.accountNumber + ",的余额还剩:" + (user1.sum + sum) + "元");
                    user.sum=(user.sum - sum); //重新调整原来账户余额
                    System.out.println();
                    System.out.println("********返回请选择5****************");
                    int flag1=sc.nextInt();
                    if(flag1==5){
                        System.out.println("********欢迎使用中国民生银行自动取款服务********");
                        System.out.println("**     1.查询            2.取款          **");
                        System.out.println("**     3.转账            4.退卡          **");
                        System.out.println("请选择您需要的服务:");
                        select=sc.nextInt();
                    }
                }
                if (select == 4) {
                    System.out.println("********欢迎使用中国民生银行自动取款服务********");
                    System.out.println("******** 退卡成功!!        ********");
                    return;
                }
            }
        }
    }
}

三、代码运行结果:

(1) 当我们的用户输入的账号与ATM里实际已经注册好的账号不匹配时:会提示输入账号有误。(当然肯定还能更细节一点,此处可以随项目需求去补充和删改)而且当我们输入的密码错误三次,就会自动冻结账号。(也就是结束程序运行的进程)

(2)其他测试,四种ATM取款机提供的服务均可以使用。

 

接着上面:

 

当我们的用户选择退卡时:就可以提示退卡成功,并结束进程。 

四、后期还可以对它进行改善,比如需求变更、简化代码、异常的捕获处理、安全权限等等很多问题。

  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 账户类(满分50分) 版本1:满分10 分 设计Account1 类,包含: ■ 一个名为 id 的int 类型的私有数据域(默认值为 0),长度为 6 位。 ■ 一个名为 balance的double 类型的私有数据域(默认值为 0)。 ■ 一个名为 annualInterestRate 的double 类型的私有数据域存储当前利率(默认值为 0)。 假设所有的账户都有相同的利率。 ■ 一个名为 dateCreated 的Date 类型的私有数据域存储账户的开户日期。 ■ 一个能创建默认账户的无参构造方法。 ■ 一个能创建带特定 id 和初始余额的构造方法,初始余额不能为负数。 ■ id 、balance和annualInterestRate 的访问器和修改器。 ■ dateCreated 的访问器。 ■ 一个名为 getMonthlyInterestRate 的方法返回月利率。 ■ 一个名为 withDraw 的方法从账户提取特定金额。 ■ 一个名为 deposit 的方法向账户存人特定金额。 ■ double 类型的数据域保留 2 位小数。 ■ 成员方法和数据域应进行基本的合理性检查。 设计测试类 ATMMachine1: ■ 创建一个有 100 个账户的数组,其 id 为0,1,2,...99, 并初始化收支为 1000 美元。 ■ 主菜单如下(可参考教材中文版 P296或英文版 P367): Main menu 1: check balance 2: withdraw 3: deposit 版本2:满分20 分 扩展Account1 类为Account2 类: ■ Account2 类继承 Account1 类。 ■ 为Account2 类新增一个名为 password 的String 类型的私有数据域存储账号密码。 password 只能为字母或数字,长度不能小于 6 且不能大于 10。密码显示时为*******。 ■ 为Account2 类新增一个名为 name的String 类型的私有数据域存储客户名字。 ■ 为Account2 类新增一个名为 transactions 的ArrayList 类型的新数据域,其为客户存 储交易记录。这要求新建一个名为 Transaction 的类,类的定义请参照教材中文版 P327或英 文版P404。每笔交易都是 Transaction 类的一个实例。 ■ 新增一个带初始余额的构造方法,其 id 随机产生,但不能与当前系统的 id 重复。 若初始余额的参数为负数,则抛出一个自定义异常并在当前构造方法中进行处理。 ■ 重写方法 withDraw ,要求支取的金额为 100 的整数倍,并且当日支取金额不能超过 5000,支取金额不允许透支。每进行一次操作应向 transactions 数组线性表添加一笔交易。 ■ 重写方法 deposit ,要求每进行一次操作应向 transactions 数组线性表添加一笔交易。 ■ 新增一个方法 changePassword ,只有旧密码正确,新密码符合要求,且两次输入相 同的情况下才可以成功修改密码 设计测试类 ATMMachine2,其主菜单如下(可参考教材中文版 P296或英文版 P367): Main menu 0:create a account 1: check balance 2: withdraw 3: deposit 4:details of the transaction 5: change password 6:exit ■ 若用户选择新建一个账号,则应提示用户输入账号 password 、balance 和 annualInterestRate ,其中 id 随机产生。新产生的账户应序列化到名为 accounts.dat 的文件中。 所有账户只能通过这种方式产生。 ■ 所有用户操作结果应同步到 accounts.dat 文件中相应账户中。 ■ 所有用户操作应有友好、简介的提示语。 版本3:满分20 分 请参照银行的 AT M机界面,在 Account2 类的基础上开发一个 GUI 界面的AT M系统。 要求界面应模拟小键盘,并且账户信息读、写于文件 accounts.dat 。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁岁岁平安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值