开学考试——ATM
题目:
数据结构测试要求:(8分)
ATM机的账户记录Account有账户的唯一性标识(8个数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0)。
1、定义Account类,其中包括七个私有变量(accountID,accountname,operatedate,operatetype,accountpassword, accountbalance,)。(3分)
各成员的含义如下:
变量accountID为字符串类型String,用于存储学生的用户账号(由八位数字组成)。
变量accountname为字符串类型String,用于存储账户的名称。
变量operatedate为字符串类型String,用于存储操作的时间,由十位字符组成,显示格式为“2018-09-20”。
变量operatetype为int类型,用于存储操作账户的类型,具体描述为“1”表示存款,“2”表示取款,“3”表示转账汇款,“4”表示修改账户密码,“5”表示查询余额。
变量accountpassword为字符串类型String,用于用户密码,由六位数字组成。
变量accountbalance为整数类型int,用于存储账户余额,缺省为0。
变量amount为整数类型int,表示操作流水金额。
2、对每个变量定义get()(读取变量信息)和set()(设置变量信息)的方法。(3分)
3、定义accountinformation.txt作为账户基本信息库,基本信息包括accountID,accountname,accountpassword, accountbalance,要求事先实现至少存储五个账户的信息,定义accountlist.txt作为账户操作流水信息数据库,操作流水信息包括(accountID,accountname,operatedate,operatetype, amount)。(要求将学号作为帐号,将考生信息作为第一条记录)。(2分)
三、功能要求:(12分)
该程序模拟ATM的功能设计,当用户插卡后显示,输入密码界面,用户输入正确密码(用户输入错误密码,则提示该卡已被锁定,无法操作),则弹出选择界面:存款、取款、转账汇款、修改密码、查询余额。
注意:对accountinformation.txt和accountlist.txt数据库中的信息进行读写操作时,必须调用get()和set()方法,否则,出现一处扣除0.5分,直至扣完为止。
(1) 需要在程序开始的注释中注明班级、学号、姓名。(1分)
(2) 定义AccountManager类实现下列要求
(3)程序开始运行模拟用户插卡显示用户输入账号功能;(1分)
①界面设计:
***************************************************************
欢迎使用中国工商银行自动柜员系统
****************************************************************
请输入您的账号:
****************************************************************
②功能设计
用户在该界面输入账号信息,如果输入账号位数有误,提示“该卡不是工行卡”,如果输入账号信息在accountinformation.txt不存在,则提示“该账号不存在”,账号输入不成功,系统提示错误信息后返回输入账号界面;输入账号成功后,系统跳转到输入密码界面。
(4)用户输入密码功能;(1分)
①界面设计:
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
请输入您的密码:
****************************************************************
②功能设计
用户在该界面输入账号密码信息,如果密码录入错误(出现位数不对或与文件中该账号对应的密码不服),则提示“密码录入错误”,如果密码录入三次错误,则提示“该账号三次录入密码错误,该卡已被系统没收,请与工行及时联系处理”。单次密码输入不成功,系统提示错误信息,返回输入密码界面;三次密码输入不成功,系统提示错误信息,返回输入账号界面,密码输入成功,系统跳转到主界面。
(5)系统主界面如下图所示,选择相应的数字执行相应的功能。(1分)
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
1、 存款;
2、 取款;
3、 转账汇款;
4、 修改密码;
5、 查询余额;
****************************************************************
(6)存款功能:(2分)
存款操作流程:
①系统进入存款界面:
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
请输入存款金额;
****************************************************************
②用户在该界面输入存款金额后,如果输入不是正整数,提示用户“输入金额有误,返回取款界面;输入字母“q”,则返回系统输入账号界面,表示退出柜员机操作;输入正整数,则跳转到下图存款成功界面。
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
当前账户存款操作成功。
当前账户余额为:XXXX元
****************************************************************
③存款成功后将该条记录作为操作流水信息记录到accountlist.txt文件中,并修改accountinformation.txt中的账户余额。
④点击“q”键,退回系统录入账号界面
(7)取款功能:则显示100元、500元、1000元、1500元、2000元、5000元、其他金额、退卡、返回操作供用户选择(3分)
取款流程设计:
① 系统进入取款界面:
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
当前账户每日可以支取2万元。
1、100元
2、500元
3、1000元
4、1500元
5、2000元
6、5000元;
7、其他金额
8、退卡
9、返回
****************************************************************
②用户选择1-6选项时,判断账户余额是否不小于录入金额,如果小于,则提示“账户余额不足”,如果大于,则跳转到下图取款成功界面。
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
当前账户取款操作XXXX元成功。
当前账户余额为:XXXX元
****************************************************************
③用户选择7选项时,显示录入金额界面
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
请输入取款金额:
****************************************************************
判断账户余额是否不小于录入金额,如果小于,则提示“账户余额不足”,如果大于,则跳转到下图取款成功界面。
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
当前账户取款操作XXXX元成功。
当前账户余额为:XXXX元
****************************************************************
④取款成功后将该条记录作为操作流水信息记录到accountlist.txt文件中,并修改accountinformation.txt中的账户余额。
⑤用户选择“8”选项时,系统跳转到输入账户界面。
⑥用户选择“9”选项时,系统跳转到系统主界面。
(8)转账汇款功能:(1分)
系统流程如下所示:
①系统进入转账主界面
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
请输入转账账户;
****************************************************************
②用户在该界面输入判断该账户是否存在accountinformation.txt文件中,如果没有提示“该账户不存在”,如果有则跳转到转账金额界面。
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
请输入转账金额;
****************************************************************
③判断账户余额是否不小于录入金额,如果小于,则提示“账户余额不足”,如果大于,则跳转到下图转账确认成功界面。
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
请确认是否向*XX(将转账的用户名称第一个用*代替,其余正常显示)转账XXXX元。
****************************************************************
④单击“N”表示不确认转账,系统跳转到系统主界面;单击“Y”表示确认转账,系统跳转到转账成果界面,。
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
当前账户向*XX成功转账XXXX元。
当前账户余额为:XXXX元
****************************************************************
⑤转账汇款成功后将该条记录作为操作流水信息记录到accountlist.txt文件中,并修改accountinformation.txt中的账户余额。
⑥点击“q”键,退回系统录入账号界面
(9)修改密码功能:(1分)
修改密码操作流程:
① 系统进入修改密码界面:
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
请输入当前密码:
请输入修改密码:
请输入确认密码:
****************************************************************
② 当前密码录入错误,提示“当前密码录入错误”,系统返回修改密码界面,清空数据重新录入;修改后密码与确认密码不一致,提示“修改密码与确认密码不一致”,系统返回修改密码界面,清空数据重新录入。
③ 密码修改成功,系统跳转到密码修改成功界面。
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
当前账户密码修改成功
****************************************************************
④ 密码修改成功后将该条记录作为操作流水信息记录到accountlist.txt文件中,并修改accountinformation.txt中的账户密码。
⑤ 点击“q”键,退回系统录入账号界面
(10)查询功能:(1分)
查询操作流程:
①系统显示当前用户余额和操作流水信息:
***************************************************************
欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统
****************************************************************
当前账户余额为:XXXX元
账户清单信息为:
1、操作日期 操作类型(不用显示数字) 操作金额
2、操作日期 操作类型(不用显示数字) 操作金额
3、…………………………………………………………
****************************************************************
②点击“q”键,退回系统录入账号界面。
代码:
Account.java
1 public class Account { 2 3 private String accountID;//用于存储学生的用户账号(由八位数字组成)。 4 private String accountname;//用于存储账户的名称 5 private String operatedate;//用于存储操作的时间,由十位字符组成,显示格式为“2018-09-20”。 6 private int operatetype;//用于存储操作账户的类型 7 private String accountpassword;//用于用户密码,由六位数字组成。 8 private int accountbalance;//用于存储账户余额,缺省为0 9 private int amount;//表示操作流水金额 10 11 public String getAccountID() { 12 return accountID; 13 } 14 public void setAccountID(String accountID) { 15 this.accountID=accountID; 16 } 17 18 public String getAccountname() { 19 return accountname; 20 } 21 public void setAccountname(String accountname) { 22 this.accountname=accountname; 23 } 24 25 public String getOperatedate() { 26 return operatedate; 27 } 28 public void setOperatedate(String operatedate) { 29 this.operatedate=operatedate; 30 } 31 32 public int getOperatetype() { 33 return operatetype; 34 } 35 public void setOperatetype(int operatetype) { 36 this.operatetype=operatetype; 37 } 38 39 public String getAccountpassword() { 40 return accountpassword; 41 } 42 public void setAccountpassword(String accountpassword) { 43 this.accountpassword=accountpassword; 44 } 45 46 public int getAccountbalance() { 47 return accountbalance; 48 } 49 public void setAccountbalance(int accountbalance) { 50 this.accountbalance=accountbalance; 51 } 52 53 public int getAmount() { 54 return amount; 55 } 56 public void setAmount(int amount) { 57 this.amount=amount; 58 } 59 }
AccountManager.java
1 import java.io.BufferedWriter; 2 import java.io.FileWriter; 3 import java.io.IOException; 4 import java.util.Scanner; 5 6 public class AccountManager{ 7 public static int N=50; 8 static Account[] a=new Account[N]; 9 10 //模拟用户插卡显示用户输入账号功能 11 public void Print_Number() { 12 System.out.println("***************************************************************"); 13 System.out.println(" 欢迎使用中国工商银行自动柜员系统 "); 14 System.out.println("***************************************************************"); 15 System.out.println(" 请输入您的账号: "); 16 System.out.println(" "); 17 System.out.println("***************************************************************"); 18 } 19 20 //用户输入密码功能界面 21 public void Print_password() { 22 System.out.println("***************************************************************"); 23 System.out.println(" 欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统 "); 24 System.out.println("***************************************************************"); 25 System.out.println(" 请输入您的密码: "); 26 System.out.println(" "); 27 System.out.println("***************************************************************"); 28 } 29 30 //系统主界面 31 public void Print_M_ain() { 32 System.out.println("***************************************************************"); 33 System.out.println("\t欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统"); 34 System.out.println("****************************************************************"); 35 System.out.println("\t\t1、存款;"); 36 System.out.println("\t\t2、取款;"); 37 System.out.println("\t\t3、转账汇款;"); 38 System.out.println("\t\t4、修改密码;"); 39 System.out.println("\t\t5、查询余额;"); 40 System.out.println("****************************************************************"); 41 } 42 43 //存款界面 44 public void Print_Deposit(String t) { 45 System.out.println("***************************************************************"); 46 System.out.println("\t欢迎"+t+"使用中国工商银行自助柜员系统"); 47 System.out.println("***************************************************************"); 48 System.out.println("\t\t请输入存款金额;"); 49 System.out.println(); 50 System.out.println("***************************************************************"); 51 } 52 53 //存款成功界面 54 public void Scc_Deposit(String t,int x) { 55 System.out.println("***************************************************************"); 56 System.out.println("\t欢迎"+t+"使用中国工商银行自助柜员系统"); 57 System.out.println("***************************************************************"); 58 System.out.println("\t\t当前账户存款操作成功。"); 59 System.out.println("\t\t当前账户余额为:"+x); 60 System.out.println("***************************************************************"); 61 } 62 63 //取款界面 64 public void Need() { 65 System.out.println("***************************************************************"); 66 System.out.println("\t欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统"); 67 System.out.println("****************************************************************"); 68 System.out.println("\t\t当前账户每日可以支取2万元。"); 69 System.out.println("\t\t1、100元"); 70 System.out.println("\t\t2、500元"); 71 System.out.println("\t\t3、1000元"); 72 System.out.println("\t\t4、1500元"); 73 System.out.println("\t\t5、2000元"); 74 System.out.println("\t\t6、5000元;"); 75 System.out.println("\t\t7、其他金额"); 76 System.out.println("\t\t8、退卡"); 77 System.out.println("\t\t9、返回"); 78 System.out.println("****************************************************************"); 79 } 80 81 //事先实现至少存储五个账户的信息 82 public void Print() throws IOException { 83 System.out.println("请输入五个ATM的账户信息:"); 84 for(int i=0;i<2;i++) { 85 Scanner in=new Scanner(System.in); 86 a[i]=new Account(); 87 System.out.println("请输入第"+(i+1)+"个账户信息:"); 88 System.out.print("用户账号:"); 89 a[i].setAccountID(in.nextLine()); 90 System.out.print("账户名称:"); 91 a[i].setAccountname(in.nextLine()); 92 System.out.print("用户密码:"); 93 a[i].setAccountpassword(in.nextLine()); 94 System.out.print("账户余额:"); 95 a[i].setAccountbalance(in.nextInt()); 96 } 97 for(int i=0;i<2;i++) { 98 BufferedWriter out=new BufferedWriter(new FileWriter("accountinformation.txt",true)); 99 out.write(a[i].getAccountID()+"\t"+a[i].getAccountname()+"\t"+a[i].getAccountpassword()+"\t"+a[i].getAccountbalance()); 100 out.write("\n"); 101 out.close(); 102 } 103 } 104 105 106 //账户操作流水信息数据库 107 public void Information() throws IOException { 108 for(int i=0;i<2;i++) { 109 BufferedWriter out=new BufferedWriter(new FileWriter("accountlist.txt",true)); 110 out.write(a[i].getAccountID()+"\t"+a[i].getAccountname()+"\t"+a[i].getOperatedate()+"\t"+a[i].getOperatetype()+"\t"+a[i].getAmount()); 111 out.write("\n"); 112 out.close(); 113 } 114 } 115 116 //检查账号信息是否有误 117 public boolean Check(String ID) { 118 for(int i=0;i<a.length;i++) { 119 if(a[i]==null) 120 break; 121 if(a[i].getAccountID().contains(ID)) { 122 return true; 123 } 124 } 125 return false; 126 } 127 128 //输入密码界面 129 public boolean CheckPass(String password) { 130 for(int i=0;i<a.length;i++) { 131 if(a[i]==null) 132 break; 133 if(a[i].getAccountpassword().contains(password)) { 134 return true; 135 } 136 } 137 return false; 138 } 139 140 //转账汇款 141 public void L() { 142 System.out.println("***************************************************************"); 143 System.out.println("\t欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统"); 144 System.out.println("****************************************************************"); 145 System.out.println("\t\t请输入转账账户;"); 146 System.out.println(); 147 System.out.println("****************************************************************"); 148 } 149 150 ////修改密码 151 public void X() { 152 System.out.println("***************************************************************"); 153 System.out.println("\t欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统"); 154 System.out.println("****************************************************************"); 155 System.out.println("\t\t请输入当前密码:"); 156 System.out.println("\t\t请输入修改密码:"); 157 System.out.println("\t\t请输入确认密码:"); 158 System.out.println("****************************************************************"); 159 } 160 161 //查询金额 162 public void C() { 163 System.out.println("***************************************************************"); 164 System.out.println("\t欢迎XXXXXXXX(账户名称)使用中国工商银行自助柜员系统"); 165 System.out.println("***************************************************************"); 166 System.out.println("\t\t当前账户余额为:XXXX元"); 167 System.out.println("\t\t账户清单信息为:"); 168 System.out.println("\t\t1、操作日期 操作类型(不用显示数字) 操作金额"); 169 System.out.println("\t\t2、操作日期 操作类型(不用显示数字) 操作金额"); 170 System.out.println("\t\t3、…………………………………………………………"); 171 System.out.println("***************************************************************"); 172 } 173 public static void main(String[] args) throws IOException { 174 AccountManager people=new AccountManager(); 175 people.Print(); 176 people.Print_Number(); 177 Scanner in=new Scanner(System.in); 178 String ID=in.nextLine(); 179 if(people.Check(ID)==true) { 180 //跳转到输入密码界面 181 people.Print_password(); 182 int n=1; 183 for(int i=1; ;i++) { 184 String password=in.nextLine(); 185 if(people.CheckPass(password)==true) { 186 //跳转到主界面 187 people.Print_M_ain(); 188 int k=in.nextInt(); 189 if(k==1) {//存款 190 for(int p=0;i<a.length;i++) { 191 if(a[p]==null) 192 break; 193 if(a[p].getAccountID().contains(ID)) { 194 people.Print_Deposit(a[p].getAccountID()); 195 int o=in.nextInt(); 196 a[p].setAccountbalance(a[p].getAccountbalance()+o); 197 people.Scc_Deposit(a[p].getAccountID(),a[p].getAccountbalance()); 198 break; 199 } 200 } 201 }else if(k==2) {//取款 202 people.Need(); 203 }else if(k==3) {//转账汇款 204 people.L(); 205 }else if(k==4) {//修改密码 206 people.X(); 207 }else if(k==5) {//查询余额 208 people.C(); 209 }else { 210 System.out.println("输入错误!"); 211 } 212 } 213 if(i==3) { 214 System.out.println("该账号三次录入密码错误,该卡已被系统没收,请与工行及时联系处理"); 215 System.exit(0); 216 } 217 } 218 }else { 219 System.out.println("该账号不存在"); 220 } 221 } 222 }
总结:
今天下午是第一次上老师的java课,但是是开学考试,这是老师为了验收我们暑期在家自学java的效果,这次敲的程序是与ATM相关的,但是今天下午的几个小时,我只敲出一些代码,整体的代码并没有敲出来。
首先,我们需要建立两个类,分别是Account类和AccountManager类,Account类的代码很容易敲出来,主要是在今天下午的前段时间,我卡在了事先实现至少存储五个账户的信息这个地方,因为要输入用户账号、账户名称、用户密码和账户余额,因为这些在Account类里面属于私有变量,所以我无法用a[i].accountID=in.nextLine();来输入与账户有关的信息。在这里我卡了很长的时间,后面是换成a[i].setAccountID(in.nextLine());便可以输入了,之后呢,就是要将这些信息输入到txt文件中,但是,我一直在网上以及之前发的博客中搜索与将数据输入到文件中有关的知识,在此期间,我用过File、FileWriter,但是都没成功,没有能够将数据写入txt文件中,这也许和我建立的数组里面有空指针有关,最后我以一种追加的形式将数据输入到了txt文件中,即BufferedWriter out=new BufferedWriter(new FileWriter("accountinformation.txt",true));out.write();还有就是在将数据输入到文件的这个过程中,我之前写的是a[i].accountID,但是在我写的下面会有红色的波浪线,即是错的,那也得改,就改成了a[i].getAccountID();之前我一直不知道我们写的get()和set()是做什么用的,也许是做初始化用的,但是今天我发现,其实不是,之前的我一直将这个理解错了,其实get()和set()一个是可以用来输入的,一个可以用来输出,这个是从简单的方面来讲的,不过确实是今天下午在这个方面是感触最多的,毕竟之前一直都没理解过,甚至于可能自己将get()和set()这两个函数理解错误意思。
之后就是accountlist.txt作为账户操作流水信息数据库,这个我只能说是暂时有了一个大概的框架,因为我确实还没想出该怎么解决这个问题。
还有就是在界面设计这一方面,之前我一直就是有空格的地方就是用空格敲的,但是今天下午我在搜索的时候发现,他们有些人便是使用了”\t”来代替空格,确实,这样的方式相比于盲目的敲空格来说方便的多,加之,之前暑假我在写学生管理系统的时候,写的那个界面设计就是自己敲的空格,但是如果那个在eclipse上对齐了,但是如果运行的话,那便会非常的不美观,如果要运行后给我们展示的界面非常美观的话,那么在eclipse上的就会不对称。虽然之前我一直都知道有”\t”这个东西,但是我用的很少,更不用说我在写程序的时候会想到用它,但是今天,我发现,这个用着很方便,就看你在写程序的时候会不会想到这个点,当然,写程序,自然是要追求如何简便如何来。
还有就是空指针的问题,因为数组的容量设定的很大,如果没有用if语句将其设置好,可能就是出现空指针的问题。
后面就是我还稍微完成了存款功能的实现,不过,本来我以为我实现的很好,不过后面再测试程序的时候发现了在界面设计这一块的问题,因为需要将存储人的账号信息给显示出来,那么这就以为着在存储函数这一块需要带参数走。还有就是判断你所输入的账号信息是否存在以及密码是否正确,这个就可以用到boolean来判断,返回true和false,这一方面我在写学生管理系统的时候就写过这个,不过在这里还需要判断几位数等等,这一方面还需要重新实现一下。
最后,就是时间只剩下二十来分钟了,我还有好几个功能都没有实现,都只能暂时性的将他们的界面给写出来,但是相当于就是粘贴复制,不过其他功能的界面的设计并没有完善,还不算特别好,因为没有账户信息等等在上面,还有些功能内部的界面也没写出来,不过最主要的还是那个功能的本身,功能能够实现,界面也好做,就是今天自己这种题目看着不算难,但是就是需要一种设计观念,不能就是一上来就敲代码,这样的话,干什么可能都不知道,写程序可能也是写的毫无章法,这就是今天我的一些过失的地方了,还有就是自身技能的不熟练,对于一些函数啊什么的都不怎么熟练,这都需要加强练习,还有就是在写程序的时候一定要就是先把那个写程序的思路理清楚,那样才能够写的又快又好。