• ATM机模拟系统


    实验要求

    https://pan.baidu.com/s/1Sq5joWyVsNhY8DYiyI4UmQ

    源代码

    /*信1705-1 20173458 王嘉梁*/
    package atm;
    import java.util.Scanner;
    import java.io.*;
    import java.util.Date;
    import java.text.SimpleDateFormat;
    class Account {
        private String accountID;
        private String accountname;
        private String operatedate;
        private int operatetype;
        private String accountpassword;
        private int accountbalance;
        private int amount;
        public String[] operation = new String[100];     //记录所有的操作
        int operationTimes;      //存取款、转账、改密、查询余额操作的次数
        public int inputTimes;         //录入密码错误的次数
        public void setAccountID(String a) {
            accountID=a;
        }
        public void setAccountname(String a) {
            accountname=a;
        }
        public void setOperatedate(String a) {
            operatedate=a;
        }
        public void setOperatetype(int a) {
            operatetype=a;
        }
        public void setAccountpassword(String a) {
            accountpassword=a;
        }
        public void setAccountbalance(int a) {
            accountbalance=a;
        }
        public void setAmount(int a) {
            amount=a;
        }
        public String getAccountID() {
            return accountID;
        }
        public String getAccountname() {
            return accountname;
        }
        public String getOperatedate() {
            return operatedate;
        }
        public int getOperatetype() {
            return operatetype;
        }
        public String getAccountpassword() {
            return accountpassword;
        }
        public int getAccountbalance() {
            return accountbalance;
        }
        public int getAmount() {
            return amount;
        }
        Account()
        {
            accountID=null;
            accountname=null;
            operatedate=null;
            operatetype=0;
            accountpassword=null;
            accountbalance=0;
            amount=0;
            for(int i=0;i<100;i++)
                operation[i]=null;
            operationTimes=0;
            inputTimes=0;
        }
    }
    class AccountManager{
        static Scanner sc = new Scanner(System.in);
        static Account[] account = new Account[10];
        static int m=0;
        public void informationInput() throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("accountinformation.txt")));
            String data = null;
            int i=1;
            while((data = br.readLine())!=null)    //将accountinformation.txt的内容导入到对象数组account内
            {
                switch(i)
                {
                case 1:account[m].setAccountID(data);break;
                case 2:account[m].setAccountname(data);break;
                case 3:account[m].setAccountpassword(data);break;
                case 4:account[m].setAccountbalance(Integer.parseInt(data));break;
                }
                i++;
                if(i>4)
                {
                    i=1;
                    m++;
                }
            }
            br.close();
        }
        public void listInput() throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("accountlist.txt")));
            String data;
            for(int i=1,j=0;i<5*m && j<m;i++)    //将accountlist.txt的内容导入到对象数组account内
            {
                data = br.readLine();
                if(i%5==3)
                    account[j].setOperatedate(data);
                else if(i%5==4)
                    account[j].setOperatetype(Integer.parseInt(data));
                else if(i%5==0)
                {
                    account[j].setAmount(Integer.parseInt(data));
                    j++;
                }
            }
            br.close();
        }
        AccountManager() throws IOException {
            for(int i=0;i<10;i++)
                account[i] = new Account();
            informationInput();
            listInput();
        }
        public void outputAll() throws IOException {
            BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("accountinformation.txt")));
            BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("accountlist.txt")));for(int i=0;i<m && i<=10;i++)
            {
                bw1.write(account[i].getAccountID() + "
    ");      //更新accountinformation.txt的内容
                bw1.write(account[i].getAccountname() + "
    ");
                bw1.write(account[i].getAccountpassword() + "
    ");
                bw1.write(Integer.toString(account[i].getAccountbalance()) + "
    ");
                bw1.flush();
                bw2.write(account[i].getAccountID() + "
    ");      //更新accountlist.txt的内容
                bw2.write(account[i].getAccountname() + "
    ");
                bw2.write(account[i].getOperatedate() + "
    ");
                bw2.write(Integer.toString(account[i].getOperatetype()) + "
    ");
                bw2.write(Integer.toString(account[i].getAmount()) + "
    ");
                bw2.flush();
            }
            bw1.close();
            bw2.close();
        }
        public int input() throws IOException {
            String regex = "[0-9]{8}";
            System.out.println("***************************************************************");
            System.out.println("    欢迎使用中国工商银行自动柜员系统");
            System.out.println("***************************************************************");
            System.out.print("        请输入您的账号:");
            String ID = sc.next();
            boolean isExist = false;
            if(ID.matches(regex))    //判断是否为数字和数字位数是否为8位
            {
                for(int i=0;i<m;i++)     //在accountinformation.txt里寻找账号信息
                    if(ID.compareTo(account[i].getAccountID())==0)
                    {
                        isExist=true;
                        while(account[i].inputTimes<3)
                        {
                            System.out.println("
    
    
    ***************************************************************");
                            System.out.println("    欢迎"+account[i].getAccountname()+"使用中国工商银行自助柜员系统");
                            System.out.println("***************************************************************");
                            System.out.print("        请输入您的密码:");
                            String pw = sc.next();
                            if(pw.compareTo(account[i].getAccountpassword())==0)   //密码输入正确
                                return i;
                            else
                                System.out.println("密码录入错误");
                            account[i].inputTimes++;
                        }
                        System.out.println("该账号三次录入密码错误,该卡已被系统没收,请与工行及时联系处理");
                    }
                if(isExist==false)
                {
                    System.out.println("该账号不存在");        //没有找到
                    return -1;
                }
            }
            else
                System.out.println("该卡不是工行卡");      //不符合要求
            return -1;
        }
        public int face(int t) throws IOException {
            int i=1;
            do
            {
                System.out.println("
    
    
    ***************************************************************");
                System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                System.out.println("***************************************************************");
                System.out.println("    1、存款;
        2、取款;
        3、转账汇款;
        4、修改密码;
        5、查询余额;");
                System.out.print("***************************************************************
    请选择:");
                String s = sc.next();
                switch(s)
                {
                case "1":i=save(t);break;
                case "2":i=take(t);break;
                case "3":transfer(t);break;
                case "4":changePassword(t);break;
                case "5":findBalance(t);break;
                case "Q":i=0;break;
                case "q":i=0;break;
                default:System.out.println("请正确选择!");
                }
            }while(i!=0);
            return -1;   //返回值为-1使主函数while语句结束,重新输入账号密码
        }
        public int save(int t) throws IOException {
            do
            {
                String regex = "[0-9]+";
                System.out.println("
    
    
    ***************************************************************");
                System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                System.out.println("***************************************************************");
                System.out.print("    请输入存款金额:");
                String s=sc.next();
                if(s.matches(regex))
                {
                    account[t].setAccountbalance(account[t].getAccountbalance()+Integer.parseInt(s));
                    System.out.println("
    
    
    ***************************************************************");
                    System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                    System.out.println("***************************************************************");
                    System.out.println("		当前账户存款操作成功。");
                    System.out.println("		当前账户余额为:"+account[t].getAccountbalance()+"元");
                    System.out.println("****************************************************************");
                    Date d = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    account[t].setOperatedate(sdf.format(d));
                    account[t].setOperatetype(1);
                    account[t].setAmount(Integer.parseInt(s));
                    account[t].operation[account[t].operationTimes]="1"+sdf.format(d)+s;  //用于存储所有进行过的存款操作,格式为操作类型、操作时间、操作金额
                    account[t].operationTimes++;
                    outputAll();
                    return 1;    //1为存款成功
                }
                else if(s.compareTo("q")==0)
                    return 0;   //0为返回输入账号密码界面
                else
                    System.out.println("输入金额有误");
            }while(true);
        }
        public int take(int t) throws IOException{
            do
            {
                System.out.println("
    
    
    ***************************************************************");
                System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                System.out.println("***************************************************************");
                System.out.println("		当前账户每日可以支取2万元。
    		1、100元
    		2、500元
    		3、1000元
    		4、1500元
    		5、2000元
    		6、5000元
    		7、其他金额
    		8、退卡
    		9、返回");
                System.out.print("***************************************************************
    请选择:");
                String s=sc.next();
                int money=0;
                switch(s)
                {
                case "1":money=100;break;
                case "2":money=500;break;
                case "3":money=1000;break;
                case "4":money=1500;break;
                case "5":money=2000;break;
                case "6":money=5000;break;
                case "7":
                    System.out.println("
    
    
    ***************************************************************");
                    System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                    System.out.println("***************************************************************");
                    System.out.print("    请输入取款金额:");
                    String regex = "[0-9]+";
                    String str=sc.next();
                    if(str.matches(regex))
                        money=Integer.parseInt(str);
                    else
                        System.out.println("输入金额有误");
                    break;
                case "8":return 0;     //回到输入账号密码界面
                case "9":return 1;     //回到选择功能界面
                default:System.out.println("请正确选择!");
                }
                if(money==0)
                    continue;
                else if(account[t].getAccountbalance()<money)
                    System.out.println("账户余额不足");
                else
                {
                    account[t].setAccountbalance(account[t].getAccountbalance()-money);
                    System.out.println("
    
    
    ***************************************************************");
                    System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                    System.out.println("***************************************************************");
                    System.out.println("		当前账户取款操作"+money+"元成功。");
                    System.out.println("		当前账户余额为:"+account[t].getAccountbalance()+"元");
                    System.out.println("****************************************************************");
                    Date d = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    account[t].setOperatedate(sdf.format(d));
                    account[t].setOperatetype(2);
                    account[t].setAmount(money);
                    account[t].operation[account[t].operationTimes]="2"+sdf.format(d)+Integer.toString(money);    //用于存储所有进行过的取款操作
                    account[t].operationTimes++;
                    outputAll();
                }
            }while(true);
        }
        public void transfer(int t) throws IOException{
            System.out.println("
    
    
    ***************************************************************");
            System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
            System.out.println("***************************************************************");
            System.out.print("    请输入转账账户:");
            String ID=sc.next();
            boolean isExist = false;
            for(int i=0;i<m;i++)     //在accountinformation.txt里寻找账号信息
                if(ID.compareTo(account[i].getAccountID())==0)
                {
                    isExist=true;
                    System.out.println("
    
    
    ***************************************************************");
                    System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                    System.out.println("***************************************************************");
                    System.out.print("    请输入金额:");
                    int money=sc.nextInt();
                    if(account[t].getAccountbalance()<money)
                        System.out.println("账户余额不足");
                    else
                    {
                        StringBuffer name = new StringBuffer(account[i].getAccountname());     //隐藏被转账者账户姓名
                        name.replace(0, 1, "*");
                        System.out.println("
    
    
    ***************************************************************");
                        System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                        System.out.println("***************************************************************");
                        System.out.println("    请确认是否向"+name.toString()+"转账"+money+"元。(y/n)");
                        String s=sc.next();
                        if(s.compareTo("Y")==0||s.compareTo("y")==0)
                        {
                            account[t].setAccountbalance(account[t].getAccountbalance()-money);
                            account[i].setAccountbalance(account[i].getAccountbalance()+money);
                            Date d = new Date();
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                            account[t].setOperatedate(sdf.format(d));
                            account[t].setOperatetype(3);
                            account[t].setAmount(money);
                            account[t].operation[account[t].operationTimes]="3"+sdf.format(d)+account[i].getAccountID()+Integer.toString(money);    //用于存储进行过的转账操作
                            account[t].operationTimes++;
                            outputAll();
                            System.out.println("
    
    
    ***************************************************************");
                            System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                            System.out.println("***************************************************************");
                            System.out.println("    当前账户向"+name.toString()+"成功转账"+money+"元。");
                            System.out.println("    当前账户余额为:"+account[t].getAccountbalance()+"元");
                            System.out.println("***************************************************************");
                        }
                    }
                }
            if(isExist==false)
                System.out.println("该账号不存在");        //没有找到被转账者账户
        }
        public void changePassword(int t) throws IOException{
            do
            {
                System.out.println("
    
    
    ***************************************************************");
                System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                System.out.println("***************************************************************");
                System.out.print("    请输入当前密码:");
                String oldPassword=sc.next();
                if(oldPassword.compareTo(account[t].getAccountpassword())!=0)
                    System.out.println("当前密码录入错误");
                else
                {
                    System.out.print("    请输入修改密码:");
                    String newPassword=sc.next();
                    System.out.print("    请输入确认密码:");
                    String confirmPassword=sc.next();
                    if(newPassword.compareTo(confirmPassword)!=0)
                        System.out.println("修改密码与确认密码不一致");
                    else
                    {
                        Date d = new Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                        account[t].setOperatedate(sdf.format(d));
                        account[t].setOperatetype(4);
                        account[t].setAmount(0);
                        account[t].operation[account[t].operationTimes]="4"+sdf.format(d)+account[t].getAccountpassword()+newPassword;     //用于存储进行过的改密操作
                        account[t].operationTimes++;
                        account[t].setAccountpassword(newPassword);
                        outputAll();
                        System.out.println("
    
    
    ***************************************************************");
                        System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                        System.out.println("***************************************************************");
                        System.out.print("    当前账户密码修改成功");
                        return;
                    }
                }
            }while(true);
        }
        public void findBalance(int t) throws IOException{
            Date d = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            account[t].setOperatedate(sdf.format(d));
            account[t].setOperatetype(4);
            account[t].setAmount(0);
            outputAll();
            System.out.println("
    
    
    ***************************************************************");
            System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
            System.out.println("***************************************************************");
            System.out.println("		当前账户余额为:"+account[t].getAccountbalance()+"元");
            System.out.println("		账户清单信息为:");
            for(int i=0,j=1;i<account[t].operationTimes;i++)
            {
                String s1=account[t].operation[i].substring(0,1);
                String date=account[t].operation[i].substring(1,11);
                switch(s1)
                {
                case "1":
                    String amount1=account[t].operation[i].substring(11);
                    System.out.println("	"+j+"、"+date+"	存款		"+amount1+"元");
                    j++;break;
                case "2":
                    String amount2=account[t].operation[i].substring(11);
                    System.out.println("	"+j+"、"+date+"	取款		"+amount2+"元");
                    j++;break;
                case "3":
                    String man=account[t].operation[i].substring(11,19);
                    String amount3=account[t].operation[i].substring(19);
                    System.out.println("	"+j+"、"+date+"	转账汇款		"+"向账户"+man+"转账"+amount3+"元");
                    j++;break;
                case "4":
                    String operate=account[t].operation[i].substring(11,17)+"修改为"+account[t].operation[i].substring(17);
                    System.out.println("	"+j+"、"+date+"	修改账户密码	"+operate);
                    j++;break;
                }
            }
            System.out.println("***************************************************************");
        }
    }
    public class ATM {
        public static void main(String[] args) throws IOException {
            AccountManager am = new AccountManager();
            do
            {
                int t=am.input();
                while(t>=0)
                    t=am.face(t);
            }while(true);
        }
    }

    感受

      看了一个暑假的java黑马程序员基础视频,做了一大堆的笔记,同时也自己做出了学生信息存储模拟系统,然而却因为一个重大的错误造成了这次考试的不及格,总分20的一道程序题,我才得了11分。在这个程序里,我用的是对象数组来存储所有用户的数据,但是我忘了在声明对象数组之后给对象数组赋初值,所以文件的内容基本都没有导入到程序内。因为内容基本没有导入,所以后边写的所有方法都是无用功,程序只有一个输入账号的界面,可以跳转到输入密码界面,但显示的却不正确,主界面也无法进入,只得了注释分和结构分。其实之前做的学生信息存储模拟系统也是用对象数组来存储数据的,但是因为时间有点长,也没有重新看一遍自己写的程序,所以犯下了错误,以后我会牢记这个错误不会再犯的。还有一方面是因为我一直忙于写方法,只调试了一次,发现可以进入输入密码界面,我就以为程序没问题,以后再写程序,我会多次调试,多方面思考。能正常运行的程序才是程序,通不过调试,程序就算不上完成。

      这个ATM机模拟程序需要两个txt文件:accountinformation.txt、accountlist.txt。两个文件分别存储相同用户的不同信息,如果文件内无内容,程序就无法运行。

      accountinformation.txt内书写格式为:

      accountID

      accountname

      accountpassword

      accountbalance

      ……

      accountlist.txt内书写格式为:

      accountID

      accountname

      operatedate

      operatetype

      amount

      ……

      程序内operatedate、operatetype、amount这三个变量存储的都是最近一次的改变,不会存储全部进行过的操作,所有进行过的操作会存储在字符串数组operation内。

  • 相关阅读:
    django orm 以列表作为筛选条件进行查询
    申请Let's Encrypt通配符HTTPS证书
    redis集群部署及踩过的坑
    MySQL的索引是什么?怎么优化?
    Session管理之超时设置和强制下线
    在MySQL中使用explain查询SQL的执行计划
    基于Docker搭建MySQL主从复制
    这些年一直记不住的 Java I/O
    高并发大容量NoSQL解决方案探索
    php 如何生成静态页
  • 原文地址:https://www.cnblogs.com/dream0-0/p/9696458.html
Copyright © 2020-2023  润新知