0


Java模拟实现ATM系统

文章目录


 ****转载请注明出处哦~ ~ ~****                                   

前言

前言:
自动取款机又称ATM(Automated Teller Machine的缩写),意思是自动柜员机,因大部分用于取款,又称自动取款机。它是一种高度精密的机电一体化装置,利用磁性代码卡或智能卡实现金融交易的自助服务,代替银行柜面人员的工作。可提取现金、查询存款余额、进行账户之间资金划拨、余额查询等工作;此项目是实现了模拟ATM系统。

一、项目需求是什么?

模拟实现银行ATM机系统,可以实现开户,登录账户,查询账户,存款,取款,转账,修改账户密码,注销账户。

二、技术选型

技术点分析:

面向对象分析,使用集合容器,程序流程控制,使用常见API。

1. 面型对象分析:

每个用户对象要对应一个账户对象:所以需要设计账户类Account。

2. 使用集合容器:

系统需要提供一个容器用于存储这些账户对象的信息,我们选ArrayList集合。

3. 程序流程控制:

需要结合分支、循环、跳转等相关操作控制程序的业务逻辑。

4. 使用常见API:

内容比较,分析,数据处理等需要用到String等常用API。

三、实现步骤

1.账户类、首页设计

在这里插入图片描述
在这里插入图片描述
分析:
① 每个用户一个账户对象,需要设计账户类,账户类至少包含(卡号、用户名、余额、取现额度、密码)。
② 需要定义一个ArrayList的集合用于存储账户对象。
③ 需要展示欢迎页包含2个功能:注册开户、登录账户。

2.用户开户功能实现

在这里插入图片描述

分析:
① 开户功能应该独立定义成方法,并传入当前集合对象给该方法。
private static void register(ArrayList accounts, Scanner sc) {

② 需要提示用户输入个人信息,开户的卡号是系统自动生成的8位数。
public static String createCardId()

③ 注意:自动生成的卡号不能与其他用户的卡号重复。

④ 最终把用户开户的信息封装成Account对象,存入到集合中。


3.用户登录功能实现

在这里插入图片描述
分析:
① 需要根据卡号去集合中查询对应的账户对象。

② 如果找到了账户对象,说明卡号存在,继续输入密码。

③ 如果密码也正确,则登录成功

4.用户操作页设计、查询账户、退出账户功能

在这里插入图片描述
分析
① 用户登录成功后,需要进入用户操作页。

② 查询就是直接展示当前登录成功的账户对象的信息。

③ 退出账户是需要回到首页的。

5.用户存款、取款功能

在这里插入图片描述
在这里插入图片描述
分析
① 存款和取款都是拿到当前用户的账户对象。

② 通过调用账户对象的set方法修改其余额

6.用户转账功能

在这里插入图片描述
分析
① 转账功能要分析对方账户是否存在的问题。

② 还要分析自己的余额是否足够的问题。

7.用户密码修改功能、销户功能

修改密码
销户
如果账户还有余额,则不可销户
在这里插入图片描述
分析
① 修改密码就是把当前对象的密码属性使用set方法进行更新。

② 销户是从集合对象中删除当前对象,并回到首页。

四、代码实现

ATMSystem类(ATM系统入口类):

package atmdemo;import java.util.ArrayList;import java.util.Random;import java.util.Scanner;/**
 * ATM系统的入口类
 */publicclassATMSystem{publicstaticvoidmain(String[] args){//1.定义账户类//2.定义一个集合容器,负责存储全部账户对象,进行相应操作
        ArrayList<Account> accounts =newArrayList<>();
        Scanner sc =newScanner(System.in);//3.展示系统的首页while(true){
            System.out.println("=======================欢迎使用ATM系统==================");
            System.out.println("1.登录账户");
            System.out.println("2.注册账户");
            System.out.println("请输入您的操作:");int common = sc.nextInt();switch(common){case1://登录操作login(accounts, sc);break;case2://注册操作register(accounts, sc);break;default:
                    System.out.println("您的输入操作有误,请重新输入!!!");}}}/**
     * 定义一个方法,实现登录功能
     *
     * @param accounts
     * @param sc
     */privatestaticvoidlogin(ArrayList<Account> accounts, Scanner sc){
        System.out.println("==================系统登录操作=================");//1.判断当时系统是否有账户if(accounts.size()==0){
            System.out.println("当前系统无任何账户,请先开户!!!");return;}//2.让用户输入卡号,根据卡号查询用户是否存在while(true){
            System.out.println("请输入您的卡号:");
            String cardId = sc.next();//判断卡号是否存在:根据卡号去账户集合中查询账户对象
            Account acc =judgeCardId(accounts, cardId);if(acc != null){while(true){
                    System.out.println("请您输入密码:");
                    String password = sc.next();if(acc.getPassword().equals(password)){
                        System.out.println(acc.getUsername()+"先生/女生密码正确,登陆成功!!!");//需要显示登录后的操作页showUserCommand(sc, acc, accounts);return;//结束登录后的操作页,回到首页}else{
                        System.out.println("密码不正确,请您重新输入!!!");}}}else{
                System.out.println("您输入的卡号不存在,请重新输入!!!");}}}/**
     * 登录成功后展示的页面
     */privatestaticvoidshowUserCommand(Scanner sc, Account acc, ArrayList<Account> accounts){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("请输入您的操作:");int command = sc.nextInt();switch(command){case1://查询账户showAccount(acc);break;case2://存款deposit(acc, sc);break;case3://取款withdrawMoney(acc, sc);break;case4://转账transfer(acc, sc,accounts);break;case5://修改密码changePassword(acc, sc);return;case6://退出
                    System.out.println("退出成功!!!");return;//退出操作页case7://注销账户if(logout(acc, sc, accounts)){return;}else{break;}default:
                    System.out.println("您输入的操作命令不正确!!!");}}}/**
     * 注销账户
     *
     * @param acc
     * @param sc
     * @param accounts
     */privatestaticbooleanlogout(Account acc, Scanner sc, ArrayList<Account> accounts){
        System.out.println("====================注销账户===================");
        System.out.println("您确定要销户吗?y/n");
        String s = sc.next();switch(s){case"y":if(acc.getMoney()>0){
                    System.out.println("账户还有余额,不可销户!!!");}else{
                    accounts.remove(acc);//注销账户
                    System.out.println("销户成功!!!");returntrue;}break;default:
                System.out.println("很好,当前用户继续保留!!!");}returnfalse;}/**
     * 定义一个方法,实现用户修改功能
     *
     * @param acc
     * @param sc
     */privatestaticvoidchangePassword(Account acc, Scanner sc){
        System.out.println("=====================修改密码==================");while(true){
            System.out.println("请"+ acc.getUsername()+"先生/女生输入要修改的密码:");
            String password = sc.next();
            System.out.println("请"+ acc.getUsername()+"先生/女生确认要修改的密码:");
            String okpassword = sc.next();if(okpassword.equals(password)){
                acc.setPassword(password);
                System.out.println("修改密码成功!!!");
                System.out.println("请重新登录账户!!!");return;}else{
                System.out.println("您输入的两次密码不一致,请重新输入!!!");}}}/**
     * 定义一个方法,实现转账用户功能
     *
     * @param acc
     * @param sc
     */privatestaticvoidtransfer(Account acc, Scanner sc,ArrayList<Account> accounts){
        System.out.println("======================转账=====================");
        String cardid= null;//判断输入的卡号是否存在while(true){
            System.out.println("请输入您要转账的卡号:");
            cardid = sc.next();if(judgeCardId(accounts,cardid)==null){
                System.out.println("您输入的卡号不存在,请重新输入!!!");}elseif(acc.getCardId().equals(cardid)){
                System.out.println("不可给自己转账,请重新输入!!!");}else{break;}}//遍历找到要转账的卡号for(int i =0; i < accounts.size(); i++){
            Account acc1=accounts.get(i);if(acc1.getCardId().equals(cardid)){//输入姓名,判断是否正确while(true){
                    System.out.println("请您补全姓名:");
                    String s1=acc1.getUsername().substring(0,1);
                    String s2=acc1.getUsername().substring(2);
                    System.out.println(s1+"*"+s2);
                    String name=sc.next();if(acc1.getUsername().equals(name)){break;}else{
                        System.out.println("您输入的姓名有误,请重新输入!!!");}}//判断金额if(acc.getMoney()==0){
                    System.out.println("您现在余额为0,请先存款后,才可以转账!!!");return;}while(true){
                    System.out.println("请输入您的转账金额:");double money = sc.nextDouble();if(money <= acc.getAmount()&& money <= acc.getMoney()){
                        acc.setMoney(acc.getMoney()- money);
                        acc1.setMoney(acc1.getMoney()+money);
                        System.out.println("转账成功!!!");break;}elseif(money > acc.getMoney()){
                        System.out.println("您的存款金额不足,请重新输入!!!");}elseif(money > acc.getAmount()){
                        System.out.println("您的转账金额超出限额,请重新输入!!!");}}}}}/**
     * 定义一个方法,实现取款功能,并输出查询账户
     *
     * @param acc
     * @param sc
     */privatestaticvoidwithdrawMoney(Account acc, Scanner sc){
        System.out.println("======================取款======================");if(acc.getMoney()==0){
            System.out.println("您现在余额为0,请先存款后,才可以取款!!!");return;}while(true){
            System.out.println("请输入您的取款金额:");double money = sc.nextDouble();if(money <= acc.getAmount()&& money <= acc.getMoney()){
                acc.setMoney(acc.getMoney()- money);
                System.out.println("取款成功!!!");break;}elseif(money > acc.getAmount()){
                System.out.println("您的取款金额超出限额,请重新输入!!!");}elseif(money > acc.getMoney()){
                System.out.println("您的存款金额不足,请重新输入!!!");}}showAccount(acc);}/**
     * 定义一个方法,实现存款功能,并输出查询账户
     *
     * @param acc
     */privatestaticvoiddeposit(Account acc, Scanner sc){
        System.out.println("======================存款======================");
        System.out.println("请输入您要存款的金额:");double money = sc.nextDouble();
        acc.setMoney(acc.getMoney()+ money);
        System.out.println("存款成功!!!");showAccount(acc);}/**
     * 定义一个方法,实现登录后查询账户的功能
     *
     * @param acc
     */privatestaticvoidshowAccount(Account acc){
        System.out.println("==================查询账户================");
        System.out.println("卡号:"+ acc.getCardId());
        System.out.println("户主:"+ acc.getUsername());
        System.out.println("余额:"+ acc.getMoney());
        System.out.println("限额:"+ acc.getAmount());}/**
     * 定义一个方法,实现用户开户功能
     *
     * @param accounts
     * @param sc
     */privatestaticvoidregister(ArrayList<Account> accounts, Scanner sc){
        System.out.println("=================系统开户操作===================");//1.创建一个Account账户类,用于封装账户信息(用户名,密码,卡号)
        Account account =newAccount();//2.录入当前账户信息,注入到账户对象中去//2.1 用户名
        System.out.println("请输入您的用户名:");
        String username = sc.next();
        account.setUsername(username);//2.2 密码while(true){
            System.out.println("请输入您的账户密码:");
            String password = sc.next();
            System.out.println("请您确认密码:");
            String okpassword = sc.next();if(okpassword.equals(password)){
                account.setPassword(okpassword);break;//要记得跳出循环!!!}else{
                System.out.println("您两次输入的密码不同,请重新输入!!!");}}//2.3 限额while(true){
            System.out.println("请输入您最大支付额度:");double amount = sc.nextDouble();if(amount >0){
                account.setAmount(amount);break;}else{
                System.out.println("您输入的不可为负数,请重新输入!!!");}}//2.3 卡号(运用一个方法,使得其随机生成一个8位的卡号,且不可重复的卡号)
        String cardId =getRandomCardId(accounts);
        System.out.println("恭喜"+ username +"先生/女生,开户成功!!!\n您的卡号为:"+ cardId);
        account.setCardId(cardId);//3.把账户对象添加到集合中去
        accounts.add(account);}/**
     * 定义一个方法,随机生成一个8位数的卡号
     *
     * @param accounts
     */privatestatic String getRandomCardId(ArrayList<Account> accounts){
        Random r =newRandom();while(true){
            String cardId ="";for(int i =0; i <8; i++){
                cardId += r.nextInt(10);}//定义方法,判断是否有重复的(只需看这个卡号,是否有账户即可)
            Account acc =judgeCardId(accounts, cardId);if(acc == null){return cardId;}}}/**
     * 查询该卡号是否有账户
     *
     * @param accounts
     * @param carId
     */privatestatic Account judgeCardId(ArrayList<Account> accounts, String carId){for(int i =0; i < accounts.size(); i++){
            Account acc = accounts.get(i);if(acc.getCardId().equals(carId)){return acc;}}return null;//查无此账户}}

Account类(账户类):

package atmdemo;/**
 * 定义一个账户类
 */publicclassAccount{/**
     * 成员变量
     */private String cardId;//卡号private String username;//用户名private String password;//密码privatedouble money;//余额privatedouble amount;//限额public String getCardId(){return cardId;}publicvoidsetCardId(String cardId){this.cardId = cardId;}public String getUsername(){return username;}publicvoidsetUsername(String username){this.username = username;}public String getPassword(){return password;}publicvoidsetPassword(String password){this.password = password;}publicdoublegetMoney(){return money;}publicvoidsetMoney(double money){this.money = money;}publicdoublegetAmount(){return amount;}publicvoidsetAmount(double amount){this.amount = amount;}}

总结

总结:
以上就是全部的内容,本文简单地分析介绍了ATM系统的实现,实现了开户,登录账户,查询账户,存款,取款,转账,修改密码,退出,销户的功能。以上功能均定义成独立的方法。

(如有不正确之处,请在评论区指正哦~ ~ ~)

投票


本文转载自: https://blog.csdn.net/qq_47387991/article/details/123497794
版权归原作者 程序猿 呕吼吼~~~ 所有, 如有侵权,请联系我们删除。

“Java模拟实现ATM系统”的评论:

还没有评论