测试:ATM
2020年9月22日进行了Java测试——ATM机的模拟,大致内容如下:
ATM机的账户记录Account有账户的唯一性标识,用户的姓名,操作日期,操作类型,账户密码和当前余额。当用户插卡后显示,输入密码界面,用户输入正确密码(用户输入三次错误密码后提示卡已被锁定,无法操作),弹出选择界面,可以实现存款、取款、转账汇款、修改密码、查询余额等功能。此外,还需要AccountInformation.txt文件作为账户基本信息库保存至少五位用户的信息和AccountList.txt文件作为操作的流水信息库。
此次程序,功能很多、很杂。通过题目分析,可以知道该程序还有十分多的图形界面。所以我们可以首先构建出大体框架,把程序的主要内容先写出来,具体功能的实现可以稍后再写。只有把程序界面运行正确,可以正常进行到所需要的界面,再填充其中的功能。如果一个功能用户操作失败(密码输入错误等),调回到主界面,也需要思考一下怎样进行实现。另外,需要注意的是,写完一个功能的实现一定要进行调试。否则,如果全部写完再进行调试,很难去发现错误的地点,这也就很难去改正。
功能方面,实现功能并不是很难。但重要的是需要通过文件来进行,这样难度一下子增加了不少。如何通过用户的ID来读取文件知道该用户的密码、怎样将操作流水信息记录到AccountList文件中、怎样将指定用户的信息进行修改并保存到文件中?文件操作真的是一大难点。困扰我的是,计算机怎么知道哪行是什么,比如第一行是用户1的ID,第二行是用户1的密码。如果要修改用户1的密码,怎样把文件中的用户1的密码进行删除并进行改正。在进行AccountList账户操作流水信息保存时需要用到Date类来读取系统时间,且显示格式为“xxxx-xx-xx”形式。这样的知识命名是学过的,但怎么也想不起来是怎么用的,太痛苦了吧!!这也再一次印证了Java写好的类中有很多方法,反正对我来说很难去记住,所以这也就需要多去看、多去用。
通过这一次的测试,总结需要再次将文件的读写、Date类、Calendar类好好学习记忆,灵活运用至程序中。此外还学习到写程序时现将大体框架写完,不要拘泥于一个小的功能实现,如果一直卡在一个地方,很难去完成一个程序。先把框架写好,在去逐步完善所需要的功能,就像是盖房子一样,这才是程序的写法。
Account类
public class Account { private String accountID; private String accountName; private String operateData; private int operateType; private String accountPassword; private int accountBalance; private int amount; public static int num = 5; public String getAccountID() { return accountID; } public void setAccountID(String accountID) { this.accountID = accountID; } public String getAccountName() { return accountName; } public void setAccountName(String accountName) { this.accountName = accountName; } public String getOperateData() { return operateData; } public void setOperateData(String operateData) { this.operateData = operateData; } public int getOperateType() { return operateType; } public void setOperateType(int operateType) { this.operateType = operateType; } public String getAccountPassword() { return accountPassword; } public void setAccountPassword(String accountPassword) { this.accountPassword = accountPassword; } public int getAccountBalance() { return accountBalance; } public void setAccountBalance(int accountBalance) { this.accountBalance = accountBalance; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } }
AccountManager类
import java.io.*; import java.util.Scanner; public class AccountManager extends Account{ static String accountID1; static String accountPassword1; public static void main(String[] args) throws IOException { Account a = new Account(); //a.setAccountName("Gazikel"); //a.setAccountPassword("123456"); //a.setAccountID("20194077"); //a.setAccountBalance(10000000); Scanner sc = new Scanner(System.in); System.out.println("信1905-2 20194077 郭智昊"); //Account[] arr = new Account[5]; //arr[0].setAccountID("20194077"); // arr[0].setAccountPassword("123456"); // arr[0].setAccountBalance(1000); //arr[0].setAccountName("Gazikel"); initialize(); loginIn(a); password(a); function(a); } public static void initialize() throws IOException { Account[] arr = new Account[5]; arr[0]=new Account(); arr[0].setAccountID("20194077"); arr[0].setAccountName("Gazikel"); arr[0].setAccountPassword("550609"); arr[0].setAccountBalance(10000); arr[1] = new Account(); arr[1].setAccountID("20194078"); arr[1].setAccountName("A"); arr[1].setAccountPassword("248796"); arr[1].setAccountBalance(200); arr[2] = new Account(); arr[2].setAccountID("20194079"); arr[2].setAccountName("B"); arr[2].setAccountPassword("456541"); arr[2].setAccountBalance(400); arr[3] = new Account(); arr[3].setAccountID("20194080"); arr[3].setAccountName("C"); arr[3].setAccountPassword("351243"); arr[3].setAccountBalance(300); arr[4] = new Account(); arr[4].setAccountID("20194081"); arr[4].setAccountName("D"); arr[4].setAccountPassword("679541"); arr[4].setAccountBalance(1000); FileWriter fw = new FileWriter("E:\\accountinformation.txt"); for (int i = 0; i < 5; i++) { fw.write(arr[i].getAccountID()+'\n'); fw.write(arr[i].getAccountName()+'\n'); fw.write(arr[i].getAccountPassword()+'\n'); fw.write(arr[i].getAccountBalance()+'\n'); } fw.flush(); fw.close(); } public static void reader(Account arr[]) throws FileNotFoundException { int i = 0; int j = 0; String str; int money; Scanner sc = new Scanner(new File("E:\\accountinformation.txt")); while (sc.hasNextLine()) { switch (j) { case 0: arr[i] = new Account(); str = sc.nextLine(); arr[i].setAccountID(str); j++; break; case 1: arr[i] = new Account(); str = sc.nextLine(); arr[i].setAccountName(str); j++; break; case 2: arr[i] = new Account(); str = sc.nextLine(); arr[i].setAccountPassword(str); j++; break; case 3: arr[i] = new Account(); money = sc.nextLine(); arr[i].setAccountBalance(money); j = 0; i++; break; } } } public static void loginIn(Account a) throws FileNotFoundException { Account[] arr = new Account[num]; reader(arr); int flag = 0; String s; Scanner sc = new Scanner(System.in); System.out.println("***************************************************************"); System.out.println(" 欢迎使用中国工商银行自动柜员系统"); System.out.println("****************************************************************"); System.out.print(" 请输入您的账号:"); s = sc.nextLine(); a.setAccountID(s); try { int ID = Integer.parseInt(a.getAccountID()); if (ID < 10000000 || ID > 99999999) { System.out.println("该卡不是工行卡"); } } catch (NumberFormatException e) { e.printStackTrace(); } for (int i = 0; i < num; i++) { if (a.getAccountID() == arr[i].getAccountID()) { flag = 1; } } if (flag == 0) { System.out.println("该账号不存在"); } } public static void password(Account a) throws FileNotFoundException { char ch;; int flag = 0; Scanner sc1 = new Scanner(System.in); Scanner sc2 = new Scanner(new File("E:\\accountinformation.txt")); String password; System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println("请输入您的密码:"); for (int i = 0; i < 3; i++) { password = sc1.nextLine(); if (password.equals(a.getAccountPassword())){ flag = 1; break; } else System.out.println("密码输入错误"); if (flag == 0) { System.out.println("该账号三次录入密码错误,该卡已被系统没收,请与工行及时联系处理。"); } } } public static void function(Account a){ System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 1、存款"); System.out.println(" 2、取款"); System.out.println(" 3、转账汇款"); System.out.println(" 4、修改密码"); System.out.println(" 5、查询余额"); int s; Scanner sc = new Scanner(System.in); s = sc.nextInt(); a.setOperateType(s); switch (a.getOperateType()) { case 1 : deposit(a); break; case 2: withdrawl(a); break; case 3: huiKuan(a); break; case 4: xiuGai(a); break; case 5: search(a); break; } } public static void deposit(Account a) { String str; Scanner sc = new Scanner(System.in); System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); while(true) { System.out.println("请输入存款金额:"); int s = sc.nextInt(); if (s % 2 != 0) { System.out.println("输入金额有误"); continue; } else { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户存款操作成功。"); System.out.println(" 当前账户余额为:"+s+"元"); //将该条记录作为操作流水信息记录到文件中,并修改账户余额 char ch; ch = sc.next().charAt(0); if (ch == 'q') { function(a); } } } } public static void withdrawl(Account a){ System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户每日可以支取2万元。"); System.out.println(" 1、100元"); System.out.println(" 2、500元"); System.out.println(" 3、1000元"); System.out.println(" 4、1500元"); System.out.println(" 5、2000元"); System.out.println(" 6、2000元"); System.out.println(" 7、其他金额"); System.out.println(" 8、退卡"); System.out.println(" 9、返回"); System.out.println("****************************************************************"); int s; Scanner sc = new Scanner(System.in); s = sc.nextInt(); switch (s) { case 1: if (a.getAccountBalance() >= 100) { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户取款操作100元成功。"); System.out.println(" 当前账户余额为:"+(a.getAccountBalance()-100)+"元"); System.out.println("****************************************************************"); } else { System.out.println("账户余额不足"); } break; case 2: if (a.getAccountBalance() >= 500) { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户取款操作500元成功。"); System.out.println(" 当前账户余额为:"+(a.getAccountBalance()-500)+"元"); System.out.println("****************************************************************"); } else { System.out.println("账户余额不足"); } break; case 3: if (a.getAccountBalance() >= 1000) { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户取款操作1000元成功。"); System.out.println(" 当前账户余额为:"+(a.getAccountBalance()-1000)+"元"); System.out.println("****************************************************************"); } else { System.out.println("账户余额不足"); } break; case 4: if (a.getAccountBalance() >= 1500) { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户取款操作1500元成功。"); System.out.println(" 当前账户余额为:"+(a.getAccountBalance()-1500)+"元"); System.out.println("****************************************************************"); } else { System.out.println("账户余额不足"); } break; case 5: if (a.getAccountBalance() >= 2000) { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户取款操作2000元成功。"); System.out.println(" 当前账户余额为:"+(a.getAccountBalance()-2000)+"元"); System.out.println("****************************************************************"); } else { System.out.println("账户余额不足"); } break; case 6: if (a.getAccountBalance() >= 5000) { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户取款操作5000元成功。"); System.out.println(" 当前账户余额为:"+(a.getAccountBalance()-5000)+"元"); System.out.println("****************************************************************"); } else { System.out.println("账户余额不足"); } break; case 7: int money; System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.print(" 请输入取款金额:"); money = sc.nextInt(); System.out.println("****************************************************************"); if (a.getAccountBalance() >= money) { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountID()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户取款操作"+money+"元成功。"); System.out.println(" 当前账户余额为:"+(a.getAccountBalance()-money)+"元"); System.out.println("****************************************************************"); } else { System.out.println("账户余额不足"); } break; case 8: break; case 9: break; } char ch = sc.next().charAt(0); if (ch == 'q') { function(a); } } public static void huiKuan(Account a){ Account b = new Account(); Scanner sc = new Scanner(System.in); System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println("请输入转账账户:"); String s = sc.nextLine(); char ch = sc.next().charAt(0); if (ch == 'q') { function(a); } } public static void xiuGai(Account a) { String s1, s2, s3; Scanner sc = new Scanner(System.in); System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.print(" 请输入当前密码:"); s1 = sc.nextLine(); if (s1.equals(a.getAccountPassword())) { } else { System.out.println("当前密码录入错误"); } System.out.print(" 请输入修改密码:"); s2 = sc.nextLine(); System.out.print(" 请输入确定密码:"); s3 = sc.nextLine(); if (s3.equals(s2)) { System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("***************************************************************"); System.out.println(" 当前账户密码修改成功"); System.out.println("***************************************************************"); } else { System.out.println("修改密码与确认密码不一致"); } char ch = sc.next().charAt(0); if (ch == 'q') { function(a); } } public static void search(Account a){ Scanner sc1 = new Scanner(System.in); System.out.println("***************************************************************"); System.out.println("欢迎"+a.getAccountName()+"使用中国工商银行自助柜员系统"); System.out.println("****************************************************************"); System.out.println(" 当前账户余额为:"+a.getAccountBalance()+"元"); System.out.println(" 账户清单信息为:"); char ch = sc1.next().charAt(0); if (ch == 'q') { function(a); } } }
其实代码可以更加简洁,代码中界面实现部分有很多相同的地方,可以通过写一个方法来进行输出界面。