ATM机模拟系统

时间:2023-11-22 13:20:44

实验要求

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() + "\r\n"); //更新accountinformation.txt的内容
bw1.write(account[i].getAccountname() + "\r\n");
bw1.write(account[i].getAccountpassword() + "\r\n");
bw1.write(Integer.toString(account[i].getAccountbalance()) + "\r\n");
bw1.flush();
bw2.write(account[i].getAccountID() + "\r\n"); //更新accountlist.txt的内容
bw2.write(account[i].getAccountname() + "\r\n");
bw2.write(account[i].getOperatedate() + "\r\n");
bw2.write(Integer.toString(account[i].getOperatetype()) + "\r\n");
bw2.write(Integer.toString(account[i].getAmount()) + "\r\n");
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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
System.out.println(" 欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println(" 1、存款;\n 2、取款;\n 3、转账汇款;\n 4、修改密码;\n 5、查询余额;");
System.out.print("***************************************************************\n请选择:");
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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
System.out.println(" 欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t\t当前账户存款操作成功。");
System.out.println("\t\t当前账户余额为:"+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("\n\n\n***************************************************************");
System.out.println(" 欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t\t当前账户每日可以支取2万元。\n\t\t1、100元\n\t\t2、500元\n\t\t3、1000元\n\t\t4、1500元\n\t\t5、2000元\n\t\t6、5000元\n\t\t7、其他金额\n\t\t8、退卡\n\t\t9、返回");
System.out.print("***************************************************************\n请选择:");
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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
System.out.println(" 欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t\t当前账户取款操作"+money+"元成功。");
System.out.println("\t\t当前账户余额为:"+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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
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("\n\n\n***************************************************************");
System.out.println(" 欢迎"+account[t].getAccountname()+"使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t\t当前账户余额为:"+account[t].getAccountbalance()+"元");
System.out.println("\t\t账户清单信息为:");
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("\t"+j+"、"+date+"\t存款\t\t"+amount1+"元");
j++;break;
case "2":
String amount2=account[t].operation[i].substring(11);
System.out.println("\t"+j+"、"+date+"\t取款\t\t"+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("\t"+j+"、"+date+"\t转账汇款\t\t"+"向账户"+man+"转账"+amount3+"元");
j++;break;
case "4":
String operate=account[t].operation[i].substring(11,17)+"修改为"+account[t].operation[i].substring(17);
System.out.println("\t"+j+"、"+date+"\t修改账户密码\t"+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内。