今天由于特殊原因,本来基础的增删改查,变成了ATM机的存储管理系统。
首先,拿到题后我就在想把这个题抽象成增删改查,这确实也是增删改查,但原先的题目是对数组中的元素进行改动,而这个题是对数组中的元素中的属性进行改动,在AccoutnManager中写的函数都要以数组中的元素进行运行。
在理解了这一点后,我选择在主菜单中单独定义一个Account类型的对象,在AccountManager中定义一个返回特定账号的函数,在运行时首先确认函数,之后将这个函数赋值给预先定义好的对象,直接对这个对象进行操作。
之后进行菜单的编写,我将菜单分为三部分,在执行输入账户后再转到密码,之后再转到操作界面。
这里我没有对用户的错误进行充分的考虑:
- 我忘记了String类型也可以用length函数,从而没有进行长度的筛查
- 在用户出错后,没有能返回到初始界面,没有写出一个完整的菜单循环
- 没有考虑多个用户,没有实现退卡的功能,例如转账操作,在进行一个用户向另一个用户转账后,需要去另一个账户进行查询,这时候重新启动程序不符合用户的需求,最好的是让程序一直跑着,可以重新输入一个账户,循环执行程序。
- 没有使用正则,对用户的输入规范没有限制
这些都是没有考虑周全的。
其次,我在删除函数中有一行忘记删除代码,让取款代码执行了两遍,导致结果出错,以及我的代码过于冗杂,基本就是什么时候缺少哪个东西了,直接加一个获取函数,缺什么补什么,如果可以统一写到构造器中会更好。
这次我意识到,在每一段代码执行结束后,最好都加上提示语,这样在运行时报错后,可以更好的找到出错的点。
更好的方法是写一段执行一段,但有时候,例如AccountManager中的函数,如果不单独写出一段执行代码就不能直接执行,需要在主菜单中执行,这种时候我认为没有必要执行看一下,如果分好板块的话,在报错后根据提示语句可以很快的找到出错的地方。
当然,如果可以直接执行,最好还是直接执行一下,写一段执行一下,保证每一步都不出错,最后的集合也就顺理成章可以跑起来了。
在注释方面,我写的注释非常少,代码的分区感并不强,尤其在三个菜单函数互相调用的代码,其中的for循环和if-else,还有输入所需要的变量,都乱成一团,如果让我隔几天再看这一段,我绝对看不懂,在写这部分的时候脑子是一团乱麻的,没有一个完整的框架。
题目要求预先存储至少五个账户的信息,我对对象数组初始化的知识掌握的不牢固,刚开始总是报错,后来才想起来对象数组中的元素需要重新进行初始化。我进行初始化的时候使用的方法是对五个对象的属性分别进行赋值,一个对象具有七个属性,五个对象就是三十五行代码,这实在太冗杂了。如果会对文件操作的话,可以在文件中预先设置好五个对象。
在对文件操作中,我对文件操作一窍不通,对输入输出流更是不懂,于是在考试中我就先放弃了对文件操作,只写出了在程序中执行的代码。当初在寒假时,曾经用C++写过类似的对文件操作,但在那之后就再也没用过相关知识了,再加上换了语言,可以说基本忘光了。
对文件操作,分为读和写,首先要定义出来对应的流,之后再指定文件位置,规范格式之后再对文件进行操作。
在进行任何修改后,可以通过清空原文件中的数据,再将数组重新导入文件,实现覆盖式修改。
定义执行文件操作对象的相关代码:
获取信息:FileReader fr = new FileReader(“文件名”);
输出信息:
FileWriter fw = new FileWriter(“文件名”);
PrintWriteer pw = new PrintWriter(fw);
对文件的操作,对于不熟练的我来说确实很繁琐,很多时候出错都不知道出在哪里,主要是对这种操作的原理不了解,通过代码操作编译器之外的文件,如果一步出错后面就都白搭,但是这种对文件操作之后还会应用到数据库中的,这些知识是需要完全掌握并熟练的,之后我会对这方面进行学习强化,并尝试了解他的原理。
这就是对这次考试的总结,总的来说我差的还是很多,在自己完全不懂的领域去找一些全是专业语言的博客也很痛苦,今后的路大抵都是这么走的,我会想方设法去寻找能让我学会的资源去学习。
package Account;
public class Account {
private String accountID;
private String accountname;
private String operatedate;
private int operatetype;
private String accountpassword;
private int accountbalance = 0;
private int amount;
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 getOperatedate() {
return operatedate;
}
public void setOperatedate(String operatedate) {
this.operatedate = operatedate;
}
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;
}
public Account(String accountID, String accountname, String operatedate, int operatetype, String accountpassword,
int accountbalance, int amount) {
super();
this.accountID = accountID;
this.accountname = accountname;
this.operatedate = operatedate;
this.operatetype = operatetype;
this.accountpassword = accountpassword;
this.accountbalance = accountbalance;
this.amount = amount;
}
public Account() {
super();
}
}
package AccountManager;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import Account.Account;
public class AccountManager {
public static void main(String args[]) {
Scanner input=new Scanner(System.in);
ArrayList<Account> A=new ArrayList<Account>();
int select1=1,flag1=0,flag2=0,flagq=0,flag4=0,k;
String q="q";
getInformation(A);
for(;;)
{
do
{
face(1);//账户对比
flag1=id(input.next(),A);
if(flag1==-2)
{face(0,12,A);
}
if(flag1==-1)
{face(0,13,A);
}
}while(flag1<0);
for(k=0;k<3;k++)
{
face(2);//密码对比
flag2=login(flag1,input.next(),A);
if(flag2<0) {
face(flag1,14,A);
}
if(flag2>0) {break;}
}
if(flag2>0&&k<3)
{
do
{
face(flag1,3,A);//主界面
try
{
select1=input.nextInt();
if(select1<=0) throw new Exception ();
}
catch(Exception e)
{
face(flag1,15,A);
}
switch(select1)
{
case 1://存款
{
cunkuan(flag1,A);
if(q.equals(input.next()))
{
q="";
flagq=1;
}
}break;
case 2://取款
{
flag4=qukuan(flag1,A);
if(flag4==2)continue;
if(flag4==1)flagq=1;
}break;
case 3://转账
{
zhuanzhang(flag1,A);
if(q.equals(input.next()))
{
q="";
flagq=1;
}
}break;
case 4://修改密码
{
resetpassward(flag1, A);
if(q.equals(input.next()))
{
q="";
flagq=1;
}
}break;
case 5://查看
{
face(flag1,10,A);
if(q.equals(input.next()))
{
q="";
flagq=1;
}
}break;
}
}while(flagq!=1);
}
else
{
face(flag1,11,A);
}
}
}
public static void getInformation(ArrayList<Account> A)//获得信息
{
try
{
FileReader fr=new FileReader("AccountInformation");
Scanner r=new Scanner(fr);
while(r.hasNext())
{
Account a=new Account();
a.setAccountid(r.next());
a.setAccountpassword(r.next());
a.setAccountname(r.next());
a.setAccountbalance(r.nextInt());
A.add(a);
}
fr.close();
r.close();
}
catch(Exception e)
{
System.out.println("文件写入失败");
}
}
public static void setInformation(ArrayList<Account> A)//写入信息
{
try
{
int i=0;
FileWriter fw=new FileWriter("AccountInformation");
PrintWriter pw=new PrintWriter(fw);
for(i=0;i<A.size();i++)
{
pw.println(A.get(i).getAccountid()+" "+A.get(i).getAccountpassword()+" "+ A.get(i).getAccountname()+" "+A.get(i).getaccountbalance());
}
pw.flush();
pw.close();
fw.close();
}
catch(Exception e)
{
System.out.println("文件写入失败");
}
}
public static String getList(int i,ArrayList<Account> A) //读取流水
{
try
{
FileReader fr=new FileReader("AccountList");
Scanner in=new Scanner(fr);
String iid=A.get(i).getAccountid();
String id=new String();
String s=new String();
String sum="";
int z=1;
while(in.hasNextLine())
{
id=in.next();
if(iid.equals(id))
{
s=id+" "+in.nextLine()+"
";
sum=sum+"( "+z+" ) "+s;
z++;
}
}
fr.close();
in.close();
return sum;
}
catch(Exception e)
{
System.out.println("文件读取失败");
return "";
}
}
public static void setList(int i,ArrayList<Account> A) //写入流水
{
try
{
Account a=A.get(i);
FileWriter fw=new FileWriter("AccountList",true);
PrintWriter pw=new PrintWriter(fw);
pw.println(a.getAccountid()+" "+a.getAccountname()+" "+ a.getOperatordate()+" "+a.getoperatortype()+" "+a.getAmount());
pw.flush();
pw.close();
fw.close();
}
catch(Exception e)
{
System.out.println("文件写入失败");
}
}
public static void zhuanzhang(int i,ArrayList<Account> A)
{
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,A);
z=input.next();
if((t=id(z,A))>=0)//判断
{
try
{
face(i,7,A);
m=input.nextInt();
if(m<=0)throw new Exception();
}
catch(Exception e)
{
face(i,13,A);
f1=1;
continue;
}
if(f1==0)//输入正确 开始转账
{
a=A.get(i);
b=A.get(t);
a.setAmount(-m);
b.setAmount(m);
A.set(i, a);
face(i,t,1,A);
x=input.next();
if(x.equals("Y")==true)
{
a.setOperatordate();
a.setOperatortype(3);
b.setOperatordate();
b.setOperatortype(3);
if(A.get(i).getaccountbalance()>=m)
{
a.setAccountbalance(a.getaccountbalance()-m);//取款
A.set(i, a);
setList(i, A);
b.setAccountbalance(b.getaccountbalance()+m);//存款
A.set(t, b);
setList(t, A);
setInformation(A);
face(i,t,2,A);
break;
}
else
{
face(i,19,A);
break;
}
}
else if(x.equals("N")==true)
{
break;
}
else
{
face(i,20,A);
}
}
}
}
}
public static void resetpassward(int i,ArrayList<Account> A)
{
Account a=new Account();
Scanner input=new Scanner(System.in);
String s1="",s2="",s3="";
int f1=0,f2=0,t=0;
face(i,8,A);
s1=input.next();
f1=login(i,s1,A);//密码正确
if(f1==1)
{
s2=input.next();
s3=input.next();
if(s2.equals(s3))//相等
{
if(s2.length()!=6)//格式
{
f2= -1;
face(i,16,A);
}
for(t=0;t<s2.length();t++)//格式
{
if(s2.charAt(t)<'0'||s2.charAt(t)>'9')
{
f2= -1;
face(i,16,A);
}
}
if(f2==0)
{
a=A.get(i);
a.setAmount(0);
a.setOperatortype(4);
a.setOperatordate();
a.setAccountpassword(s2);
A.set(i, a);
setList(i, A);
setInformation(A);
face(i,9,A);
}
}
else
{
face(i,17,A);
}
}
else
{
face(i,18,A);
}
}
public static int qukuan(int i,ArrayList<Account> A)
{
Account a=new Account();
Scanner input=new Scanner(System.in);
int f=0,m=0;
face(i,5,A);
do
{
try
{
f=input.nextInt();
if(f<=0)throw new Exception();
}
catch(Exception e)
{
face(i,15,A);
continue;
}
switch(f)
{
case 1:m=100;break;
case 2:m=500;break;
case 3:m=1000;break;
case 4:m=1500;break;
case 5:m=2000;break;
case 6:m=5000;break;
case 7:
{
try
{
m=input.nextInt();
if(m<=0)throw new Exception();
}
catch(Exception e)
{
face(i,15,A);
continue;
}
};break;
case 8:return 1;
case 9:return 2;
}
}while(f>8);
if(A.get(i).getaccountbalance()>=m)
{
a=A.get(i);
a.setAccountbalance(a.getaccountbalance()-m);
a.setAmount(m*-1);
a.setOperatortype(2);
a.setOperatordate();
A.set(i, a);
setList(i, A);
setInformation(A);
face(i,22,A);
}
else
{
face(i,19,A);
}
return 0;
}
public static void cunkuan(int i,ArrayList<Account> A)
{
Account a=new Account();
Scanner input=new Scanner(System.in);
int m=0,f=0;
face(i,4,A);
try
{
m=input.nextInt();
if(m<=0) throw new Exception();
}
catch(Exception e)
{
face(i,15,A);
f= -1;
}
a=A.get(i);
a.setAccountbalance(a.getaccountbalance()+m);
a.setAmount(m);
a.setOperatortype(1);
a.setOperatordate();
A.set(i, a);
setList(i, A);
setInformation(A);
if(f==0)
{
face(i,21,A);
}
}
public static int id(String accountID,ArrayList<Account> A)
{
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<A.size();i++)//查找 i 为账户序号
{
if(A.get(i).getAccountid().equals(accountID)==true)
{
return i;
}
}
return -1;
}
public static int login(int i,String accountpassword,ArrayList<Account> A)
{
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(A.get(i).getAccountpassword().equals(accountpassword)==true)//正误
{
return 1;
}
else
{
return -1;
}
}
public static void face(int select)
{
System.out.println("**********************************************");
System.out.println(" 欢迎使用中国工商银行自助柜台系统");
System.out.println("**********************************************");
switch(select)
{
case 1://输入账号
{
System.out.println(" 请输入你的账号");
}break;
case 2://输入密码
{
System.out.println(" 请输入你的密码");
}break;
}
}
public static void face(int i,int select,ArrayList<Account> A)
{
System.out.println("**********************************************");
System.out.println(" 欢迎"+A.get(i).getAccountname()+"使用中国工商银行自助柜台系统");
System.out.println("**********************************************");
switch(select)
{
case 3://主界面
{
System.out.println(" 1、 存款");
System.out.println(" 2、 取款");
System.out.println(" 3、 转账汇款");
System.out.println(" 4、 修改密码");
System.out.println(" 5、 查询余额");
}break;
case 4://存款
{
System.out.println(" 请输入存款金额");
}break;
case 5://取款
{
System.out.println(" "+A.get(i).getAccountname()+"账户当前账户每日可以支取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、5000元");
System.out.println(" 7、其他金额");
System.out.println(" 8、退卡");
System.out.println(" 9、返回");
}break;
case 6://输入转账账户
{
System.out.println(" 请输入转账账户:");
}break;
case 7://输入转账金额
{
System.out.println(" 请输入转账金额:");
}break;
case 8://修改密码
{
System.out.println(" 请输入当前密码:");
System.out.println(" 请输入修改密码:");
System.out.println(" 请输入确认密码:");
}break;
case 9://修改密码成功
{
System.out.println(" 当前账户修改密码成功");
}break;
case 10://显示余额和操作流程
{
System.out.println(" 当前账户余额为 "+A.get(i).getaccountbalance()+" 元。");
System.out.println(" 当前账户清单信息为:");
System.out.print(getList(i, A));
Account a=A.get(i);
a.setAmount(0);
a.setOperatortype(5);
a.setOperatordate();
setList(i, A);
}break;
case 11:
{
System.out.println(" 该账号三次录入密码错误,该卡已被系统没收,请与工商银行及时联系。");
}break;
case 12:
{
System.out.println(" 该卡不是工商卡");
}break;
case 13:
{
System.out.println(" 该账号不存在");
}break;
case 14:
{
System.out.println(" 密码录入错误");
}break;
case 15:
{
System.out.println(" 请输入正整数");
}break;
case 16:
{
System.out.println(" 密码格式错误");
}break;
case 17:
{
System.out.println(" 修改密码与确认密码不一致");
}break;
case 18:
{
System.out.println(" 当前密码录入错误");
}break;
case 19:
{
System.out.println(" 账户余额不足");
}break;
case 20:
{
System.out.println(" 请输入"Y"或"N"");
}break;
case 21:
{
System.out.println(" 当前账户存款款"+A.get(i).getAmount()+"成功。");
System.out.println(" 当前账户余额为 "+A.get(i).getaccountbalance()+" 元。");
}break;
case 22:
{
System.out.println(" 当前账户取款"+A.get(i).getAmount()+"成功。");
System.out.println(" 当前账户余额为 "+A.get(i).getaccountbalance()+" 元。");
}break;
}
}
public static void face(int i,int t,int select,ArrayList<Account> A)
{
String s=A.get(t).getAccountname();
String star=s.substring(1);
star="*"+star;
System.out.println("*********************************************");
System.out.println(" 欢迎"+A.get(i).getAccountname()+"使用中国工商银行自助柜台系统");
System.out.println("**********************************************");
switch(select)
{
case 1://确认
{
System.out.println(" 请确认是否向"+star+"转账"+A.get(i).getAmount()*-1+"元");
}break;
case 2:
{
System.out.println(" 当前账户成功向"+star+"转账"+A.get(i).getAmount()*-1+"元");
System.out.println(" 当前账户余额为 "+A.get(i).getaccountbalance()+" 元。");
}break;
}
}
}