本周我们上JAVA课的时候进行了一次测试,本次测试以模拟中国工商银行自助机ATM的功能为大致要求,要求我们进行编写调试,以求达到试题要求。

测试要求我们能模拟ATM的功能设计,当用户插卡后显示,输入密码界面,用户输入正确密码(用户输入错误密码,则提示该卡已被锁定,无法操作),则弹出选择界面:存款、取款、转账汇款、修改密码、查询余额。对accountinformation.txt和accountlist.txt数据库中的信息进行读写操作时,必须调用get()和set()方法。

程序开始运行模拟用户插卡显示用户输入账号功能,

1.用户在该界面输入账号信息,如果输入账号位数有误,提示“该卡不是工行卡”,如果输入账号信息在accountinformation.txt不存在,则提示“该账号不存在”,账号输入不成功,系统提示错误信息后返回输入账号界面;输入账号成功后,系统跳转到输入密码界面。

2.用户在该界面输入账号密码信息,如果密码录入错误(出现位数不对或与文件中该账号对应的密码不服),则提示“密码录入错误”,如果密码录入三次错误,则提示“该账号三次录入密码错误,该卡已被系统没收,请与工行及时联系处理”。单次密码输入不成功,系统提示错误信息,返回输入密码界面;三次密码输入不成功,系统提示错误信息,返回输入账号界面,密码输入成功,系统跳转到主界面。

3.用户在该界面输入存款金额后,如果输入不是正整数,提示用户“输入金额有误,返回取款界面;输入字母“q”,则返回系统输入账号界面,表示退出柜员机操作;输入正整数,则跳转到下图存款成功界面。

4.存款成功后将该条记录作为操作流水信息记录到accountlist.txt文件中,并修改accountinformation.txt中的账户余额。

取款功能:

则显示100元、500元、1000元、1500元、2000元、5000元、其他金额、退卡、返回操作供用户选择。

转账汇款功能。

1.用户在该界面输入判断该账户是否存在accountinformation.txt文件中,如果没有提示“该账户不存在”,如果有则跳转到转账金额界面。

2.判断账户余额是否不小于录入金额,如果小于,则提示“账户余额不足”,如果大于,则跳转到下图转账确认成功界面。

3.单击“N”表示不确认转账,系统跳转到系统主界面;单击“Y”表示确认转账,系统跳转到转账成果界面,。

4.转账汇款成功后将该条记录作为操作流水信息记录到accountlist.txt文件中,并修改accountinformation.txt中的账户余额。

修改密码功能:

1. 系统进入修改密码界面:

2.当前密码录入错误,提示“当前密码录入错误”,系统返回修改密码界 面,清空数据重新录入;修改后密码与确认密码不一致,提示“修改密码与确认密码不一致”,系统返回修改密码界面,清空数据重新录入。

3. 密码修改成功后将该条记录作为操作流水信息记录到accountlist.txt文件中,并修改accountinformation.txt中的账户密码。

查询功能:

1.系统显示当前用户余额和操作流水信息:

2.点击“q”键,退回系统录入账号界面。

该程序源代码为:

//Account.java

//梁汉丞 信1705-3 20173643

package account1;

public class Account {
private String accountID;
private String accountname;
private String operatedate;
private int operatetype;
private int accountpassword;
private int accountbalance;
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 int getAccountpassword() {
return accountpassword;
}
public void setAccountpassword(int 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 void set(String id,String name,int password,int yuer)
{
accountID=id;
accountname=name;
accountpassword=password;
accountbalance=yuer;
}
public void set_1(String data,int liushui)
{
operatedate=data;

amount=liushui;
}

}

//AccountManage.java

//梁汉丞 信1705-3 20173643

package account1;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Vector;
import java.util.*;

//梁汉丞 20173643 信1705-3
public class AccountManager {
private static/*静态*/ Scanner/*输入*/can=new Scanner(System.in);
private Vector<Account> map=new Vector/*矢量*/<Account>();
private Iterator<Account> it;
private String cnum;//定义cnum,go,index,an变量
private int go;
private int index;
private int an;
private Account me=new Account();

public static void main(String[] args) { //String args[]的意思是用于接收用户输入的参数,如果程序中需要用户输入参数,那么这些参数就保存在数据args中.
AccountManager a=new AccountManager();
try {
a.daoru_1();
a.daoru_2();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

a.start();

}
public void start()//线程开启的方法
{
go=3;//3次的输入机会
index=0;
an=0;
System.out.println("***************************************************************");//输出第一个用户界面
System.out.println("\t欢迎使用中国工商银行自动柜员系统");
System.out.println("***************************************************************");
System.out.println("\t请输入您的账号:");
if(can.hasNext())
{
cnum=can.next();
}
if(cnum.length()==8)//如果输入的账号长度为8,则执行如下操作
{
// TODO 自动生成的方法存根

if(isfind(cnum))//如果在信息库里找到了相同账号,则跳转到下一界面
{
index=lookp(cnum)-1;
showpass();
}
else//否则输出"没有找到相关账户信息,请重新输入"
{
System.out.println("\t没有找到相关账户信息,请重新输入");
start();
}
}
else//如果账号长度不为8,则输出"输入的账户信息不是八位数,请重新输入"
{
System.out.println("\t输入的账户信息不是八位数,请重新输入");
start();
}

}
public void showpass()//声明showpass
{
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t请输入您的密码:");
if(can.hasNext())
{
cnum=can.next();
}
if(cnum.length()==6)//如果输入的数字长度为6,则执行如下操作
{
if(Integer.parseInt(cnum)==me.getAccountpassword())//如果输入的密码正确,则跳转至下一界面
{
insystem();
}
else//否则执行如下操作
{
if(go>0)
{
go--;
System.out.println("\t密码错误,请重新输入,还剩"+go+"次机会重新输入");
showpass();

}
else//如果输入次数达到三次,则输出"密码错误输入次数过多,返回账号输入菜单"并且返回第一界面
{
System.out.println("\t密码错误输入次数过多,返回账号输入菜单");
start();
}
}
}
else//输入的密码不是六位,输出"输入的密码信息不是六位数,请重新输入"
{
System.out.println("\t输入的密码信息不是六位数,请重新输入");
showpass();
}
}
public void insystem()
{
System.out.println("***************************************************************");
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t1.存款");
System.out.println("\t2.取款");
System.out.println("\t3.转账汇款");
System.out.println("\t4.修改密码");
System.out.println("\t5.查询余额");
int type=0;//声明type为0
if(can.hasNextInt())
{
type=can.nextInt();
}
func(type);//传递函数体的规则

}
public void func(int type)
{
if(type==1)//输入1为存款
{
cunkuan();
}
else if(type==2)//输入2为取款
{
qukuan();
}
else if(type==3)//输入3为转账
{
zhuanzhang();

}
else if(type==4)//输入4为修改密码
{
xiugai();
}
else if(type==5)//输入5为查询
{
chaxun();
}
}
public void zhuanzhang()//声明转账
{
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t请输入你要转账的账号:");
String type=null;
if(can.hasNext())
{
type=can.next();
}
if((an=lookp(type)-1)!=0)//
{
jine();
}
}
public void jine()//声明金额
{
int c=0;
System.out.println("\t请输入你要转账的金额:");
if(can.hasNextInt())
{
c=can.nextInt();
}
if(me.getAccountbalance()>=c)
{
Account ss=new Account();
me.setAccountbalance(me.getAccountbalance()-c);
me.setAmount(me.getAmount()-c);
ss=me;
map.get(an).setAccountbalance(map.get(an).getAccountbalance()+c);
map.get(an).setAmount(map.get(an).getAmount()+c);
map.setElementAt(ss, index);
try {
daochu_2();
daochu_1();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t当前账户转账成功");
System.out.println("\t当前账户余额为:"+me.getAccountbalance());
System.out.println("***************************************************************");
insystem();
}
else
{
System.out.println("金额不够,不能转");
zhuanzhang();
}
}

public void xiugai()
{
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t请输入你原来的密码:");
int type=0,g_old=0,g_new=0;
if(can.hasNextInt())
{
type=can.nextInt();
}
if(type==me.getAccountpassword())
{
System.out.println("\t请输入你要修改的密码:");
if(can.hasNextInt())
{
g_old=can.nextInt();

}
if(!(g_old>=100000&&g_old<=999999))
{
System.out.println("\t密码输入格式错误,请重新输入");
xiugai();
return;
}
System.out.println("\t请再次你输入你要修改的密码:");
if(can.hasNextInt())
{
g_new=can.nextInt();
}
if(g_new==g_old)
{
Account ss=new Account();
me.setAccountpassword(g_old);
ss=me;
map.setElementAt(ss, index);
try {
daochu_2();
daochu_1();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("\t密码修改成功");
insystem();
}
}
}
public void chaxun()//声明查询
{
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t当前账户余额为:"+me.getAccountbalance());
System.out.println("***************************************************************");
insystem();
}
public void qukuan()//声明取款
{
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t当前账户每日可以支取2万元。");
System.out.println("\t1.100元");
System.out.println("\t2.500元");
System.out.println("\t3.1000元");
System.out.println("\t4.1500元");
System.out.println("\t5.2000元");
System.out.println("\t6.5000元");
System.out.println("\t7.其他金额");
System.out.println("\t8.退卡");
System.out.println("\t9.返回");
int type=0;
if(can.hasNextInt())
{
type=can.nextInt();
}
cunkuani(type);

}
public void cunkuani(int type)//声明存款
{
boolean g_test=false;
Account ss=new Account();
if(type==1)//输入1
{

if(me.getAccountbalance()>=100)
{
g_test=true;
me.setAccountbalance(me.getAccountbalance()-100);
me.setAmount(me.getAmount()-100);
ss=me;
map.setElementAt(ss, index);
}
}
else if(type==2)//输入2
{
if(me.getAccountbalance()>=500)
{
g_test=true;
me.setAccountbalance(me.getAccountbalance()-500);
me.setAmount(me.getAmount()-500);
ss=me;
map.setElementAt(ss, index);
}
}
else if(type==3)//输入3
{
if(me.getAccountbalance()>=1000)
{
g_test=true;
me.setAccountbalance(me.getAccountbalance()-1000);
me.setAmount(me.getAmount()-1000);
ss=me;
map.setElementAt(ss, index);
}
}
else if(type==4)//输入4
{
if(me.getAccountbalance()>=1500)
{
g_test=true;
me.setAccountbalance(me.getAccountbalance()-1500);
me.setAmount(me.getAmount()-1500);
ss=me;
map.setElementAt(ss, index);
}
}
else if(type==5)//输入5
{
if(me.getAccountbalance()>=2000)
{
g_test=true;
me.setAccountbalance(me.getAccountbalance()-2000);
me.setAmount(me.getAmount()-2000);
ss=me;
map.setElementAt(ss, index);
}
}
else if(type==6)//输入6
{
if(me.getAccountbalance()>=5000)
{
g_test=true;
me.setAccountbalance(me.getAccountbalance()-5000);
me.setAmount(me.getAmount()-5000);
ss=me;
map.setElementAt(ss, index);
}
}
else if(type==7)//输入7
{
int num=0;
if(can.hasNextInt())
{
type=can.nextInt();
}
if(me.getAccountbalance()>=num)
{
g_test=true;
me.setAccountbalance(me.getAccountbalance()-num);
me.setAmount(me.getAmount()-num);
ss=me;
map.setElementAt(ss, index);
}
}
else if(type==8)//输入8
{
System.out.println("\t8.退卡成功");
start();
return;
}
else if(type==9)//输入9
{
insystem();
return;
}
if(g_test)
{

System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t当前账户取款成功");
System.out.println("\t当前账户余额为:"+me.getAccountbalance());
System.out.println("***************************************************************");
insystem();
}
}
public void cunkuan()//声明存款
{
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t请输入存款金额:");
int num=0;
if(can.hasNextInt())
{
num=can.nextInt();
}
else
{
if(can.hasNext())
{
cnum=can.next();
if(cnum.equals("q"))//实现输入q的时候返回第一界面
{
System.out.println("已经退出系统,返回账号界面");
}
else
{
System.out.println("输入错误,请重新输入");//
cunkuan();
}
}

}
if(num>0)
{
Account ss=new Account();
me.setAccountbalance(me.getAccountbalance()+num);
me.setAmount(me.getAmount()+num);
ss=me;
map.setElementAt(ss, index);
try {
daochu_2();
daochu_1();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
else
{
System.out.println("输入错误,请重新输入");
cunkuan();
}
qukuanchenggong();
insystem();

}
void qukuanchenggong()
{
System.out.println("***************************************************************");
System.out.println("\t欢迎 "+me.getAccountname()+" 使用中国工商银行自助柜员系统");
System.out.println("***************************************************************");
System.out.println("\t当前账户存款成功");
System.out.println("\t当前账户余额为:"+me.getAccountbalance());
System.out.println("***************************************************************");
}
public void daoru_1() throws IOException//声明导入1
{

File a=new File("accountinformation.txt");
FileInputStream b = new FileInputStream(a);
map.clear();
InputStreamReader c=new InputStreamReader(b,"UTF-8");
{
BufferedReader bufr =new BufferedReader(c);
String line = null;
while((line = bufr.readLine())!=null){
Account st=new Account();
String ook[]=line.toUpperCase().split(" ");
st.set(ook[0],ook[1], Integer.parseInt(ook[2]),Integer.parseInt(ook[3]));
map.add(st);
me=st;

}
bufr.close();
//System.out.println(sb.toString());

}
c.close();
b.close();
}
public void daoru_2() throws IOException//声明导入2
{

File a=new File("accountlist.txt");
FileInputStream b = new FileInputStream(a);
InputStreamReader c=new InputStreamReader(b,"UTF-8");
{
BufferedReader bufr =new BufferedReader(c);
String line = null;
int i=0;
//map.clear();
while((line = bufr.readLine())!=null){
Account st=new Account();
String ook[]=line.toUpperCase().split(" ");
st.set(map.get(i).getAccountID(),map.get(i).getAccountname(),map.get(i).getAccountpassword(),map.get(i).getAccountbalance());
st.set_1(ook[0],Integer.parseInt(ook[1]));
String temp_str="";
Date dt = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
temp_str=sdf.format(dt);

if(!temp_str.equals(ook[0]))
{
st.setAmount(0);
st.setOperatedate(temp_str);
//index=i;
}
me=st;
map.setElementAt(st, i);
i++;
}
bufr.close();
//System.out.println(sb.toString());

}
c.close();
b.close();
}
public void daochu_1() throws IOException//声明导出1
{
Account st=new Account();
File a=new File("accountinformation.txt");
FileOutputStream b = new FileOutputStream(a);
OutputStreamWriter c=new OutputStreamWriter(b,"UTF-8");
it=map.iterator();
int i=0;
while(it.hasNext())
{
i++;
if(i!=1)
c.append("\r\n");
st=it.next();
c.append(st.getAccountID()+" "+st.getAccountname()+" "+st.getAccountpassword()+" "+st.getAccountbalance());

}
c.close();
b.close();

}
public void daochu_2() throws IOException//声明导出2
{
Account st=new Account();
File a=new File("accountlist.txt");
FileOutputStream b = new FileOutputStream(a);
OutputStreamWriter c=new OutputStreamWriter(b,"UTF-8");
it=map.iterator();
int i=0;
while(it.hasNext())
{
i++;
if(i!=1)
c.append("\r\n");

st=it.next();
c.append(st.getOperatedate()+" "+st.getAmount());

}
c.close();
b.close();

}
//-----------------------------
public int lookp(String xuehao)
{
Account st=new Account();
int i=0;
it=map.iterator();
while(it.hasNext())
{
i++;
st=it.next();
if(st.getAccountID().equals(xuehao))
break;
}
return i;
}
public boolean isfind(String xuehao)
{
Account st=new Account();
it=map.iterator();
boolean ok=false;
while(it.hasNext())
{
st=it.next();
if(st.getAccountID().equals(xuehao))
{
me=st;
ok=true;
break;
}
}
return ok;
}

}

我们在调试这个程序之前需要创建accountinformation.txt和accountlist.txt两个文件,文件里保存用户信息。

截图如下:

以上是我的制作过程,经过这次测验,让我感受颇深。

JAVA测试编程的更多相关文章

  1. JAVA并发编程J.U.C学习总结

    前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...

  2. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  3. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  4. Java并发编程:Timer和TimerTask(转载)

    Java并发编程:Timer和TimerTask(转载) 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer ...

  5. 20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...

  6. Java并发编程核心方法与框架-CountDownLatch的使用

    Java多线程编程中经常会碰到这样一种场景:某个线程需要等待一个或多个线程操作结束(或达到某种状态)才开始执行.比如裁判员需要等待运动员准备好后才发送开始指令,运动员要等裁判员发送开始指令后才开始比赛 ...

  7. Java多线程编程核心技术---对象及变量的并发访问(二)

    数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...

  8. 20145213《Java程序设计》实验五Java网络编程及安全

    20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...

  9. 20145206《Java程序设计》实验五Java网络编程及安全

    20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...

随机推荐

  1. Python Signal 信号

    https://blog.csdn.net/kongxx/article/details/50976802 http://blog.itpub.net/7728585/viewspace-214206 ...

  2. WDA基础十三:常用模板管理

    常用的模板一般是SMW0和OAOR,根据不同需求来的. WAD有个不好的地方就是不支持GUI上的OLE和DOI,所以需要做转换,下面是常用的方式: FUNCTION ZCRM_DOWNLOAD_TEM ...

  3. CentOS虚拟机和物理机共享文件夹实现

    安装open-vm-tools: yum -y install  open-vm-tools yum -y  install open-vm-tools yum -y install  open-vm ...

  4. ZZW原创_imdpd导入时产生的错误

    1.ORA-39083: Object type OBJECT_GRANT failed to create with error Processing object type SCHEMA_EXPO ...

  5. java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close().

    java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close(). java.lang.Exception: DEBUG ...

  6. asp.net mvc中动作方法的重定向

    简单介绍一下mvc控制器下怎样重定向的其它页面 1.方式1:Response.Redirect重定向 //Response.Redirect方式跳转 Response.Redirect("~ ...

  7. Sql server中如何将表A和表B的数据合并(乘积方式)

    sql server中如何将表A 和表B的数据合并成乘积方式,也就是说表A有2条数据,表B有3条数据,乘积后有6条数据, 这就要用到sql中的笛卡尔积方式了 1.什么是笛卡尔积 笛卡尔积在SQL中的实 ...

  8. mac ci框架安装使用 memcached存session

    mac 安装memcached brew info memcached brew install memcached brew install memcached 安装过程具体不详细多讲 memcac ...

  9. css制作tips提示框,气泡框,制作三角形

    有时候我们的页面会需要这样的一些提示框或者叫气泡框,运用css,我们可以实现这样的效果. 为了实现上面的效果,我们首先要理解如何制作三角形. 当我们给一个DIV不同颜色的边框的时候,我们可以得到下面的 ...

  10. hdu3518

    题解: 后缀数组 枚举长度为k(1<=k<=len/2)的满足要求的子串个数 代码: #include<cstdio> #include<cmath> #inclu ...