实验要求
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内。