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() + "\r\n");      //更新accountinformation.txt的内容
            bw1.write(account[i].getAccountname() + "\r\n");
            bw1.write(account[i].getAccountpassword() + "\r\n");
            bw1.write(Integer.toString(account[i].getAccountbalance()) + "\r\n");
            bw1.flush();
            bw2.write(account[i].getAccountID() + "\r\n");      //更新accountlist.txt的内容
            bw2.write(account[i].getAccountname() + "\r\n");
            bw2.write(account[i].getOperatedate() + "\r\n");
            bw2.write(Integer.toString(account[i].getOperatetype()) + "\r\n");
            bw2.write(Integer.toString(account[i].getAmount()) + "\r\n");
            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("\n\n\n***************************************************************");
                        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("\n\n\n***************************************************************");
            System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
            System.out.println("***************************************************************");
            System.out.println("    1、存款;\n    2、取款;\n    3、转账汇款;\n    4、修改密码;\n    5、查询余额;");
            System.out.print("***************************************************************\n请选择:");
            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("\n\n\n***************************************************************");
            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("\n\n\n***************************************************************");
                System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                System.out.println("***************************************************************");
                System.out.println("\t\t当前账户存款操作成功。");
                System.out.println("\t\t当前账户余额为:"+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("\n\n\n***************************************************************");
            System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
            System.out.println("***************************************************************");
            System.out.println("\t\t当前账户每日可以支取2万元。\n\t\t1、100元\n\t\t2、500元\n\t\t3、1000元\n\t\t4、1500元\n\t\t5、2000元\n\t\t6、5000元\n\t\t7、其他金额\n\t\t8、退卡\n\t\t9、返回");
            System.out.print("***************************************************************\n请选择:");
            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("\n\n\n***************************************************************");
                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("\n\n\n***************************************************************");
                System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
                System.out.println("***************************************************************");
                System.out.println("\t\t当前账户取款操作"+money+"元成功。");
                System.out.println("\t\t当前账户余额为:"+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("\n\n\n***************************************************************");
        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("\n\n\n***************************************************************");
                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("\n\n\n***************************************************************");
                    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("\n\n\n***************************************************************");
                        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("\n\n\n***************************************************************");
            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("\n\n\n***************************************************************");
                    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("\n\n\n***************************************************************");
        System.out.println("    欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
        System.out.println("***************************************************************");
        System.out.println("\t\t当前账户余额为:"+account[t].getAccountbalance()+"元");
        System.out.println("\t\t账户清单信息为:");
        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("\t"+j+"、"+date+"\t存款\t\t"+amount1+"元");
                j++;break;
            case "2":
                String amount2=account[t].operation[i].substring(11);
                System.out.println("\t"+j+"、"+date+"\t取款\t\t"+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("\t"+j+"、"+date+"\t转账汇款\t\t"+"向账户"+man+"转账"+amount3+"元");
                j++;break;
            case "4":
                String operate=account[t].operation[i].substring(11,17)+"修改为"+account[t].operation[i].substring(17);
                System.out.println("\t"+j+"、"+date+"\t修改账户密码\t"+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内。

posted @ 2018-09-23 20:04  星辰°  阅读(833)  评论(0编辑  收藏  举报