9.22
题目:
数据结构测试要求:(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”键,退回系统录入账号界面。
代码:
package moniATM; import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncondingException; import java.nio.charset.Charset; import java.util.scanner; public class Account { private String accountID; private String accountname; private String operatedate; private int operatetype; private String accountpassword; private int accountbalance; private int amount; public Account() { } public Account(String IDcard, String Name, String Adress, String password, int balance) { this.accountID = accountID; this.accountname = accountname; this.operatedate = operatedate; this.operatetype=operatetype; this.accountpassword = accountpassword; this.accountbalance = accountbalance; } public void setaccountname(String acccountname) { this.accountname = accountname; } public void setsetaccountID() { this.accountID = accountID; } public void setoperatedate(String operatedate) { this.operatedate = operatedate; } public void setoperatetype(int operatetype) { this.operatetype =operatetype; } public void setaccountpassword(String accountpassword) { this.accountpassword = accountpassword; } public void setaccountbalance(int accountbalance) { this.accountbalance = accountbalance; } public void setamount(int amount) { this.amount = amount; } 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; } public void setAccount() { // TODO Auto-generated method stub } }
package moniATM; import java.io.FileWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncondingException; import java.util.Scanner; import com.sun.codemodel.internal.writer.FileCodeWriter; public class AccountManager { public Object accountID; public Object accountpassword; public class Main { private static final String NULL = null; private Object system; public void main(String[] args) throws UnsupportedEncodingException { char choise; int i = 0; boolean flag;//判断标识 Scanner sc = new Scanner(System.in); Account[] array = new Account[100]; public void setList(int i,ArrayList<Account> ac) { try { Account a=ac.get(i); } catch(Exception e) { System.out.println("文件写入失败"); } } for (int n = 0; n < 100; n++) { array[n] = new Account("asd", "asd", "asd", "asd", 1); } do { System.out.println("|**********************************************|"); System.out.println("| 欢迎使用中国工商银 |"); System.out.println("|**********************************************|"); System.out.println("| 请输入您的账号 |"); System.out.println("|**********************************************|"); System.out.println(""); boolean isNULL; if(isNULL) { System.out.println("|**********************************************|"); System.out.println("| 该卡不是工商卡 |"); System.out.println("|**********************************************|"); } else { System.out.println("********************************************"); System.out.println(" 欢迎使用中国工商银行自助柜员系统 "); System.out.println("********************************************"); System.out.println(" 请输入您的密码 "); System.out.println("********************************************"); } public void setInformation(ArrayList<Account> ac)//写入信息 { try { int i=0; FileWriter fw=new FileWriter("AccountInformation"); PrintWriter pw=new PrintWriter(fw); for(i=0;i<ac.size();i++) { pw.println(((Object) ac.get(i)).getAccountID()+" "+((Object) ac.get(i)).getAccontpassword()+" "+ ac.get(i).getAccountname()+" "+ac.get(i).getAccountbalance()); } pw.flush(); pw.close(); fw.close(); } { System.out.println("|**********************************************|"); System.out.println("| 密码输入错误,请重新输入 |"); System.out.println("|**********************************************|"); counter++; }while(counter<3); Lock_Sys(); if(isRight(accountID,accountpassword)) { System.out.println("|**********************************************|"); System.out.println("| 1.存款; |"); System.out.println("| 2.取款; |"); System.out.println("| 3.转账汇款: |"); System.out.println("| 4.修改密码 |"); System.out.println("| 5.查询 余额 |"); System.out.println("|**********************************************|"); } switch (choise) { case '1': System.out.println("|**********************************************|"); System.out.println("| 欢迎使用中国工商银行自助柜员系统 |"); System.out.println("| 请输入存款金额 |"); System.out.println("|**********************************************|"); if(isNULL) { System.out.println("|**********************************************|"); System.out.println("| 输入金额有误,返回取款页面 |"); } else { System.out.println("|**********************************************|"); System.out.println("| 欢迎使用中国工商银行自助柜员系统 |"); System.out.println("|**********************************************|"); System.out.println("| 存款成功 现金额为 |"); }; case '2':{ int amount; System.out.println("|**********************************************|"); System.out.println("| 欢迎使用中国工商银行自助柜员系统 |"); System.out.println("|**********************************************|"); System.out.println("| 当前账户每日可支取2万元 |"); System.out.println("| 1.100元 |"); System.out.println("| 2.200元 |"); System.out.println("| 3.500元 |"); System.out.println("| 4.1000元 |"); System.out.println("| 5.2000元 |"); System.out.println("| 6.5000元 |"); System.out.println("| 7.其他金额 |"); System.out.println("| 8.退卡 |"); System.out.println("| 9.退回 |"); System.out.println("|**********************************************|"); int t; t = sc.nextInt(); switch (t) { case 1:amount = 100;break; case 2:amount = 200;break; case 3:amount = 500;break; case 4:amount = 1000;break; case 5:amount = 2000;break; case 6:amount = 5000;break; } if(amount>array[0].getaccountbalance()) System.out.println("余额不足"); } case '3': System.out.println("|**********************************************|"); System.out.println("| 欢迎使用中国工商银行自助柜员系统 |"); System.out.println("|**********************************************|"); System.out.println("| 请输入转账金额 |"); System.out.println("|**********************************************|"); array[0].setamount(sc.nextInt()); Account a=new Account(); Account b=new Account(); Scanner input=new Scanner(System.in); String z="",x=""; int t=0,m=0,f1=0; while(f1==0) { face(i,6,ac); z=input.next(); if((t=id(z,ac))>=0)//判断 { try { face(i,7,ac); m=input.nextInt(); if(m<=0)throw new Exception(); } catch(Exception e) { face(i,13,ac); f1=1; continue; } if(f1==0)//输入正确 开始转账 { a=ac.get(i); b=ac.get(t); a.setAmount(-m); b.setAmount(m); ac.set(i, a); face(i,t,1,ac); x=input.next(); if(x.equals("Y")==true) { a.setOperatedate(); a.setOperatetype(3); b.setOperatedate(); b.setOperatetype(3); if(ac.get(i).getAccountbalance()>=m) { a.setAccountbalance(a.getAccountbalance()-m); ac.set(i, a); setList(i, ac); b.setAccountbalance(b.getAccountbalance()+m); ac.set(t, b); setList(t, ac); setInformation(ac); face(i,t,2,ac); break; } else { face(i,19,ac); break; } } else if(x.equals("N")==true) { break; } else { face(i,20,ac); } } } } } case '4': System.out.println("|**********************************************|"); System.out.println("| 欢迎使用中国工商银行自助柜员系统 |"); System.out.println("|**********************************************|"); System.out.println("| 请输入当前密码 |"); System.out.println("| 请输入修改密码 |"); System.out.println("| 请输入确认密码 |"); public int id(String accountID,ArrayList<Account> ac) { int i=0,t=0; if(accountID.length()!=8) { return -2; } for(t=0;t<accountID.length();t++) { if(accountID.charAt(t)<'0'||accountID.charAt(t)>'9') { return -2; } } for(i=0;i<ac.size();i++) { if(ac.get(i).getAccountID().equals(accountID)==true) { return i; } } return -1; } case '5': System.out.println("|**********************************************|"); System.out.println("| 欢迎使用中国工商银行自助柜员系统 |"); System.out.println("|**********************************************|"); System.out.println("| 当前账户余额为: "+array[0].getaccountbalance()+" 元 |"); System.out.println("| 账户清单信息为 |"); System.out.println("| 1.操作日期 操作类型 操作金额 |"); public int login(int i,String accountpassword,ArrayList<Account> ac) { int t=0; if(accountpassword.length()!=6) { return -1; } for(t=0;t<accountpassword.length();t++) { if(accountpassword.charAt(t)<'0'||accountpassword.charAt(t)>'9') { return -1; } } if(ac.get(i).getAccontpassword().equals(accountpassword)==true) { return 1; } else { return -1; } }
开学之初,java课程迎来了第一次考试。Java开学测试,测验的是在暑期期间,同学们自学java的结果。考试试题由课程老师,独自出题,难度系数约为完成了java基础课程的水平。
考试题目是实现ATM机的基本功能。考试要求为:ATM机的账户记录Account有账户的唯一性标识(8个数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0)。该程序模拟ATM的功能设计,当用户插卡后显示,输入密码界面,用户输入正确密码(用户输入错误密码,则提示该卡已被锁定,无法操作),则弹出选择界面:存款、取款、转账汇款、修改密码、查询余额。
考试开始前,应老师要求,在编程前十五分钟,我对老师发的文本要求,详细的捋顺了自己的思路。说真的,本来没什么感觉,因为以前的程序,嗯,还是称之为代码吧,之前的代码十分短小,编写起来可边写边看,边看边想,可是,程序量一旦大起来,便出现了,边玩一部分后,不得不回头修改之前代码缺漏的地方,往往很长的时间都用在了对之前代码的修改上,而当我将整体的思路捋顺后,在类中的函数便可以一次性编好,无需进行太大的修改,这是一个我需要养成的习惯。
说真的,对于java,在暑期我所花费的时间并不长,仅仅只是掌握了最最基础的类与函数。不得不说,学校要求学生先学习c与c++是有依据的。在学习java时,我会不由得将java与c++语言相通的地方进行比较,哪怕语言不同,但是语言的结构,函数的作用,类的封装还是大同小异的。循环函数,if语句,数组声明,switch语句仅仅经过一次的阅读,依照之前语言的经验,很快便上手了。
但是,和之前一样的是,我又一次卡在了对于文件的读取上。而且不像之前的c++有老师的指教,这一次的自学让我苦不堪言,文本的读取输出到屏幕上倒是十分简单,难就难在读取后要按照字符串的形式接受。在经过了长时间的自学后,我也只能取巧来完成相同的功能。利用readline函数,读取一行的字符接收到字符串上,来完成对字符的读取。
很惭愧,自己只能利用取巧的方式,怪也怪自己没有在暑期认真的学习,怨不得别人。
很难说出那种自学的快感和纠结的痛苦,静下心来阅读别人的程序,去领会他人的想法。了解他人程序后,又要去验证自己的一些小想法,去小改程序。都说天下文章一大抄,就看会抄不会抄。程序又何尝不是,站在巨人的肩膀上,确实要看的更远。
这一次开学测试,就像老师说的那样,认清自己,明白自己的不足,被打击后,坚强的站起来,不在倒下时放弃,就在倒下处雄起。很幸运自己遇到了这样的老师,他不是逼迫你,而是让你自己逼迫自己。