基于Java编程的简单ATM银行自助系统的实现

这个项目是看网上教学视频,然后自己逐个敲得代码。

完成这个项目之后,作为Java小白,我感触颇多,这其中体会到了写代码的乐趣,和沉浸在其中的快感。还在编写的时候,遇到过很多问题,中间就是各种绞尽脑汁想解决方案,有些时候一个很简单的问题,需要想一个多小时才解决。虽然花的时间多,但是解决之后,心情是真的愉悦,那份心情难以言说。当然只有自己亲手去做,才体会得到的。

为什么敲这个项目呢?

是因为刚刚学完了Java基础入门,想着用这个项目练手,巩固所学,并且总结。我觉得这样的学习才是比较有乐趣的。前提是自己想学,不是别人逼你。现在开始的每一天,基本上每天的学习时间都在增加,以前可能一天就半个小时一个小时,后面慢慢加到一上午,一下午,到后面甚至一整天沉浸其中也不为过。

以上是我的一点小感想,分享一下,与君共勉!可以看到我的文章啥的都没怎么布局,排版也不行,因为我单纯就是想用这个blog记录一下自己的学习。读者莫怪^_^

以下就是项目实现过程和代码(能力有限,诸多不足之处,请见谅,以后深入学习之后,还能改进):

首先定义一个账户类Account(其中包括,卡号,姓名,性别,密码,余额,以及取款额度)

定义一个ATM类,实现系统所需要的各种功能

定义一个测试类Demo,对系统进行测试

package com.mexin.atmdemo;

public class Account {
    private String idcard;  //卡号
    private String username;//用户名
    private char sex;//性别
    private String password;//密码
    private double balance; //余额
    private double limit;//限额

    //无参构造

    public Account() {
    }

    //有参构造

    public Account(String idcard, String username, char sex, String password, double balance, double limit) {
        this.idcard = idcard;
        this.username = username;
        this.sex = sex;
        this.password = password;
        this.balance = balance;
        this.limit = limit;
    }


    //setter,getter方法

    public String getIdcard() {
        return idcard;
    }

    public void setIdcard(String idcard) {

        this.idcard = idcard;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) { this.username = username; }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public double getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }
}

package com.mexin.atmdemo;

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

/*
* 定义一个ATM系统类,其中包括实现ATM的所有功能的方法*/

public class ATM {
    /*
    * 构建一个私有的集合,用来存储账户
    * private:关键字(私有的)
    * ArrayList:集合
    * <Account>:<类型>:账户类
    * accounts:账户类的对象名称
    * new ArrayList<>():new一个 accounts对象的集合*/
    private ArrayList<Account> accounts = new ArrayList<>();

    /*创建一个Scanner对象命名sc
    *扫描用户的键盘输入
    *放在最前面只需要定义一个即可,后面的方法都可以调用*/
    private Scanner sc = new Scanner(System.in);

    //创建一个全局账户类对象loginuser,用于记录当前正在登录的用户的所有信息
    private Account loginuser ;

    /*系统欢迎页的构建
    * 需要有一个整体框架
    * 需要展示的功能:用户登录,用户开户
    * 需要对欢迎界面的说明:告诉用户如何使用本ATM系统*/
    public void welcome(){
        while (true) {
            System.out.println("===============欢迎使用Mexin银行ATM系统===============");
            System.out.println("1.<用户登录>");
            System.out.println("2.<用户开户>");
            System.out.println("【说明】");
            System.out.println("【如果需要使用本系统,必须要持有本系统的账户】");
            System.out.println("【登录用户才可以进行其他操作】");
            System.out.println("【如果没有账户,可以选择用户开户】");
            System.out.println("【Mexin银行ATM系统欢迎您的使用!!!】");

            //提示用户进行操作
            System.out.println("请选择您想要之进行的操作(输入1或者2):");

            //定义一个String类型的 command 变量 用于接收用户输入的操作
            String command = sc.next();

            //通过使用switch来判断用户的选择
            switch (command){
                case "1":           //command = 1
                    userlogin();    //执行用户登录的方法
                    break;          //结束switch
                case "2":           //command = 2
                    oppenaccounts();//执行用户开户的方法
                    break;
                default:            //输入其他命令则提示错误
                    System.out.println("您输入的命令不存在,请重新输入:");
            }
        }
    }

    /*构建开户方法
    * 1.需要用户输入姓名,性别,设置密码(需要两次)
    * 2.上述如果输入错误,需要重复,直到输入正确为止*/
    private void oppenaccounts(){
        System.out.println("===============创建账户===============");

        //定义一个Account类型的 局部变量 acc
        Account acc = new Account();

        /*提示用户进行开户的相关步骤*/
        System.out.println("请输入您的真实姓名:");
        String name = sc.next();

        //setUsername():该方法是赋值
        acc.setUsername(name);

        while (true) {
            System.out.println("请输入您的性别:");

            //这里需要做一个判断,如果用户输入错了非男非女,则不能通过
            //因为sc.next()没有sc.nextChar(),所以采用charAt()方法取
            //charAt():根据括号里的索引值进行字符获取,0取第一个字符
            char sex = sc.next().charAt(0);
            if (sex == '男' || sex == '女') {
                //将性别赋给acc
                acc.setSex(sex);
                //跳出死循环
                break;
            } else {
                //如果输入其他字符,则提示重新输入,由于有死循环,所以会循环到开头
                System.out.println("您输入的性别有误,请重新输入:");
            }
        }
        while (true){
            //设置密码
            System.out.println("请设置您的账户密码:");
            String password = sc.next();

            System.out.println("请确认您的密码(再次输入设置的密码):");
            String okpassword = sc.next();

            //判断两次输入的密码是否一致
            //equals():比较两个变量的内容是否一致
            if(okpassword.equals(password)){

                acc.setPassword(okpassword);
                System.out.println("密码设置成功!!");
                //结束循环
                break;
            }else {
                System.out.println("两次输入的密码不一致,请重新输入:");
            }
        }

        //设置单次取款上限
        System.out.println("请输入您单次能提取的最大金额:");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

        //信息全部填好之后,满足开卡条件,为账户随机开卡(卡号为8位数,每一个卡号不能重复)
        //直接调用卡号生成方法ceeateidcard(),生成一个卡号
        String newidcard = createidcard();
        acc.setIdcard(newidcard);

        //卡号生成完成之后,将账户存入集合中,开户完成
        accounts.add(acc);
        System.out.println("恭喜您,开户成功!!!");
        System.out.println("您的账户卡号是:" + acc.getIdcard());
    }
    //随机生成一个卡号的方法
    private String createidcard(){
        while (true) {
            //Random类:随机产生一个随机数
            Random r = new Random();

            //定义一个字符串变量,用于存放卡号
            String idcard = "";

            //循环8次,产生8个 0-9 的随机数
            for (int i = 0; i < 8 ; i++) {
                //定义一个整型变量,接收随机数
                int id = r.nextInt(10);
                idcard += id;
            }

            //判断idcard里面的卡号是否和之前的账户卡号重复,如果没有则返回卡号
            Account acc = getAccountByidcard(idcard);
            if(acc == null){
                return idcard;
            }
        }
    }
    //getAccountByidcard()方法通过卡号来检查新开的卡号是否重复
    private Account getAccountByidcard(String idcard){
        for (int i = 0; i < accounts.size(); i++) {
            //创建一个Account类型的局部变量acc,接收集合里的对象
            Account acc = accounts.get(i);
            if (acc.getIdcard().equals(idcard)){
                //如果生成的卡号,与账户里面的卡号重复了,则返回卡号
                return acc;
            }
        }
        //如果没有重复,返回null
        return null;
    }

    /*用户登录功能
    * 1.判断accous集合是否有账户,如果没有则提醒开户
    * 2.根据卡号登录,验证卡号的正确性
    * 3.输入密码,验证密码
    * 4.登录成功后需要进入新的功能展示页*/
    private void userlogin(){
        //判断集合长度是否为零
        if(accounts.size() == 0){
            System.out.println("对不起,系统里面无账户,请先开户!!!");
            return;
        }
        //用户登录
        System.out.println("===============用户登录===============");
        while (true) {
            System.out.println("请输入您的卡号:");
            String id = sc.next();

            //通过getAccountByidcard()方法查找集合里的卡号,赋给acc
            Account acc = getAccountByidcard(id);
            if(acc == null){
                System.out.println("您输入的卡号不存在!!请确认再重新输入:");
            }else {
                while (true) {
                    System.out.println("请输入您的密码:");
                    String password = sc.next();

                    //判断输入的密码和设置的密码是否一致
                    if(acc.getPassword().equals(password)){
                        //将登录成功的账户acc赋给loginuser记录,方便后续各种操作
                        loginuser = acc;
                        System.out.println("恭喜您," + acc.getUsername() + "," + "卡号:" + acc.getIdcard() + "登录成功!");

                        //提示登录成功后,displayinterface()方法进入用户功能展示页
                        displayinterface();

                        //结束循环
                        return;
                    }else {
                        System.out.println("您输入的密码有误,请重新输入:");
                    }
                }
            }
        }
    }

    //创建用户功能展示页
    private void displayinterface(){
        while (true) {
            System.out.println("===============功能列表===============");
            System.out.println("【1.查询当前用户信息】");
            System.out.println("【2.查询余额】");
            System.out.println("【3.存款】");
            System.out.println("【4.取款】");
            System.out.println("【5.转账】");
            System.out.println("【6.修改密码】");
            System.out.println("【7.修改最大单次取款限额】");
            System.out.println("【8.退出】");
            System.out.println("【9.注销用户】");

            //提示用户进行功能选择
            System.out.println("请选择您要执行的功能(输入数字即可):");
            int command = sc.nextInt();

            switch (command){
                case 1 :
                    //查询当前用户信息
                    lookinginformation();
                    break;
                case 2 :
                    //查询余额
                    lookingmoney();
                    break;
                case 3 :
                    //存款
                    deposit();
                    break;
                case 4 :
                    //取款
                    withdraw();
                    break;
                case 5:
                    //转账
                    transfer();
                    break;
                case 6 :
                    //修改密码
                    updatepassword();
                    return;
                case 7 :
                    //修改最大单次取款限额
                    updatelimit();
                    break;
                case 8 :
                    //退出
                    System.out.println("感谢您的使用,祝您生活愉快!!");
                    return;
                case 9 :
                    //注销用户
                    if(logout()){
                        return;
                    }
                    break;
            }
        }
    }

    //创建查询用户的方法
    private void lookinginformation(){
        System.out.println("===============" + loginuser.getUsername() + "的用户信息如下===============");
        System.out.println("用户姓名:" + loginuser.getUsername());
        System.out.println("用户性别:" + loginuser.getSex());
        System.out.println("用户卡号:" + loginuser.getIdcard());
        System.out.println("用户余额:" + loginuser.getBalance());
        System.out.println("单次取款额度:" + loginuser.getLimit());
    }

    //创建查询余额的方法
    private void lookingmoney(){
        System.out.println("===============查询余额===============");
        System.out.println("当前余额:" + loginuser.getBalance());
    }

    //创建存款的方法
    private void deposit(){
        System.out.println("===============存款===============");
        System.out.println("请放入您要存的钱:");
        double deposit = sc.nextDouble();
        //余额加上要存进去的钱
        loginuser.setBalance(loginuser.getBalance() + deposit);
        System.out.println("交易完成!!!");
        System.out.println("当前余额:" + loginuser.getBalance());
        //结束该方法
        return;
    }

    /*创建取款的方法
    * 1.首先判断账户余额是否为零
    * 2.余额是否大于100
    * 3.取款是否低于余额
    * 4.取款是否低于设置的单次取款上限*/
    private void withdraw(){
        System.out.println("===============取款===============");
        double money = loginuser.getBalance();
        if (money == 0 ){
            System.out.println("对不起,您的账户余额为 0 ,请先存款,再来操作哦!^_^");
            return;
        }
        while (true) {
            System.out.println("请输入您要交易的金额:");
            double withdraw = sc.nextDouble();
            if(money < 100 && money > 0 ){
                System.out.println("对不起,您当前账户余额不足100,无法取出,请联系工作人员!!");
            }else if (money >= 100 && withdraw <= loginuser.getLimit() && money >= withdraw){
                money = money - withdraw;
                loginuser.setBalance(money);
                System.out.println("交易完成!!");
                System.out.println("当前余额:" + loginuser.getBalance());
                break;
            }else if(money < withdraw){
                System.out.println("对不起,您的余额不足!!无法交易!!");
                System.out.println("当前余额:" + loginuser.getBalance());
            }else {
                System.out.println("对不起,您单次取款金额超过上限" + loginuser.getLimit() + ",无法操作!!");
                System.out.println("您有两种途径解决:");
                System.out.println("1.修改最大单次取款限额");
                System.out.println("2.每次取款不要高于您设置的取款上限");
            }
        }
    }

    /*创建转账的方法
    * 1.查询当前账户余额是否等于0
    * 2.查询系统里是否有两个以上的账户存在
    * 3.利用卡号查询进行转账
    * 4.验证转账对象的身份
    * 5.转账金额要小于余额*/
    private void transfer(){
        System.out.println("===============转账===============");
        //查询当前账户余额是否等于0
        if (loginuser.getBalance() == 0 ){
            System.out.println("您当前账户中没有钱,不支持转账");
            return;
        }

        //查询系统里是否有两个以上的账户存在
        if (accounts.size() < 2){
            System.out.println("当前系统没有两个以上的账户,无法进行转账操作");
            return;
        }

        //利用卡号查询进行转账
        while (true) {
            System.out.println("请输入您要转账的用户卡号:");
            String id = sc.next();
            //利用id查找账户
            Account acc = getAccountByidcard(id);
            if (acc == null){
                //如果查找返回null说明卡号错误,或者不存在
                System.out.println("您输入的卡号有误或者不存在,请确认");
            }else {
                //账户存在,认证姓氏
                //substring(),从索引值处开始获取字符,把姓氏用*替代,把名字取出来拼接在一起
                String name = "*" + acc.getUsername().substring(1);
                while (true) {
                    System.out.println("请输入【" +name + "】的姓氏");
                    String Prename = sc.next();
                    //startsWith()方法,判断字符串是否以某个字符开始
                    if(acc.getUsername().startsWith(Prename)){
                        //验证通过
                        while (true) {
                            System.out.println("请输入要转账的金额:");
                            double transfer = sc.nextDouble();
                            if (transfer > loginuser.getBalance()){
                                System.out.println("您的余额不足,无法转账");
                                System.out.println("当前余额:" + loginuser.getBalance());
                            }else {
                                loginuser.setBalance(loginuser.getBalance() - transfer);
                                acc.setBalance(acc.getBalance() + transfer);
                                System.out.println("转账成功!");
                                System.out.println("当前余额:" + loginuser.getBalance());
                                return;
                            }
                        }
                    }else {
                        System.out.println("您输入的姓氏有误!,请重新输入");
                    }
                }
            }
        }
    }

    /*创建修改密码的方法*/
    private void updatepassword(){
        System.out.println("===============修改密码===============");
        while (true) {
            System.out.println("请输入您当前的密码:");
            String password = sc.next();
            String okpassword = loginuser.getPassword();
            //验证密码是否正确
            if (okpassword.equals(password)){
                while (true) {
                    System.out.println("请输入新密码:");
                    String newpassword = sc.next();

                    System.out.println("请再次输入新密码:");
                    String Anewpassword = sc.next();

                    if(Anewpassword.equals(newpassword)){
                        loginuser.setPassword(Anewpassword);
                        System.out.println("密码修改完成,请退出重新登录生效哦!!");
                        return;
                    }else {
                        System.out.println("两次密码不一致,请重新输入");
                    }
                }
            }else {
                System.out.println("您输入的密码不正确,请重新输入。");
            }
        }
    }

    //创建修改最大单次取款限额的方法
    private void updatelimit(){
        System.out.println("===============修改限额===============");
        System.out.println("当前最大单次取款限额:" + loginuser.getLimit());
        System.out.println("请输入您要修改的额度为:");
        double updatelimit = sc.nextDouble();
        loginuser.setLimit(updatelimit);
        System.out.println("修改成功!!,当前最大单次取款限额:" + updatelimit);
    }

    /*注销用户
    * 1.询问是否注销
    * 2.账户里面有余额,不能注销
    * 3.注销需要返回欢迎页
    * 4.不注销需要返回功能展示页*/
    private boolean logout(){
        System.out.println("===============注销账户===============");
        System.out.println("您确定要注销当前账户吗?(输入数字:【1.是/2.否】),:");
        int answer = sc.nextInt();
        if (answer == 1){
            if(loginuser.getBalance() >= 100){
                System.out.println("您当前账户余额大于100,无法注销");
            }else {
                accounts.remove(loginuser);
                System.out.println("注销完成!感谢您的使用!");
                return true;
            }
        }else {
            return false;
        }
        return false;
    }
}

package com.mexin.atmdemo;

public class Demo { //这是一个测试类,用于测试写好的系统
    public static void main(String[] args) { //主方法
        //1.先要创建一个ATM对象,才可以开始测试。

        ATM atm = new ATM();

        //创建对象后,才可以调用方法。

        atm.welcome();  //调用welcome()方法进入到ATM系统欢迎页。
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Mexin

如果你觉得对你有用,请点赞收藏

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

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

打赏作者

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

抵扣说明:

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

余额充值