100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 银行系统(atm机)实现登陆注册存款取款转账

银行系统(atm机)实现登陆注册存款取款转账

时间:2019-06-24 14:42:39

相关推荐

银行系统(atm机)实现登陆注册存款取款转账

简单银行系统实现登陆…

博客内容使用类和方法,编写一个银行客户端系统,实现:用户登录,注册,存钱,取钱,转账,退卡等功能。主要代码如下。

里面涉及到的数组扩容,请参考我上片博客。

逻辑上是输入银行卡号和密码然后验证登录,我这里设置成l用户名和密码,所以请理解下(懒哈,但实现原理都是一样的);

类:BankCard//银行卡信息

class BankCard {private String clientName;//用户名private String password;//密码private int accountNum;//账号private int leftMoney;//余额public BankCard(String clientName, String password, int accountNum, int leftMoney) {this.clientName = clientName;this.password = password;this.accountNum = accountNum;this.leftMoney = leftMoney;}//有参构造方法public BankCard() { }//无参public String getClientName() { }public void setClientName(String clientName) {}//其余的一些get和set方法就不一一罗列了}

Book类

class Bank{public static void main(String[] args) {//初始化一些值BankCard [] bankcards = new BankCard[4];BankCard bk0 = new BankCard("reba","reba123",1,10000);BankCard bk1 = new BankCard("jzya","jzyal123",2,1);BankCard bk2 = new BankCard("jack","jack123",3,129);BankCard bk3 = new BankCard("tom","tom123",4,12312);bankcards[0]=bk0;bankcards[1]=bk1;bankcards[2]=bk2;bankcards[3]=bk3;Scanner scanner = new Scanner(System.in);String name = "";String password = "";//功能实现部分while (true){System.out.println("请选择:");System.out.println("1.登录 2.注册 3.退出");int select = scanner.nextInt();if(select == 3)return;switch (select){case 1:{System.out.println("登录:");name = scanner.next();password = scanner.next();if(login(bankcards,name,password)){System.out.println("登录成功!!!");}else {System.out.println("登录失败,请核对你的账户和密码");}System.out.println("请输入选择");while (true){System.out.println("1.存钱 2.取钱 3.转账 4.退卡");//写一个ShowCount 显示操作后用户还有多少钱int choice = scanner.nextInt();if(choice==4){//跳出存钱子菜单break;}switch (choice){case 1:{System.out.println("请输入要存的钱数");int saveMoney=scanner.nextInt();SaveMoney(bankcards,saveMoney,name);//都能登录进来,账户存在,存钱肯定成功System.out.println("存钱成功");showAccount(bankcards,name);break;}case 2:{System.out.println("请输入提取的金额:");int takeMoney=scanner.nextInt();if(takeMoney(bankcards,takeMoney,name)) {System.out.println("取款成功,你提取了"+takeMoney+"¥");showAccount(bankcards,name);}else{System.out.println("金额不足!");}break;}case 3:{System.out.println("请输入接收方账户名和转账金额");String aimName= scanner.next();int transMoney = scanner.nextInt();if(transfer(bankcards,name,aimName,transMoney)) {System.out.println("转账成功");showAccount(bankcards,name);}else {System.out.println("转账失败");break;}}default:System.out.println("输入无效");}}break;//跳出case1}case 2:{System.out.println("请设置用户名和密码");/*注册时,默认扩展内存为原来数组长度加1*/BankCard bankCard[]= new BankCard[bankcards.length+1];for(int i=0;i<bankcards.length;i++){//把原来数组的值拷贝过去bankCard[i]=bankcards[i];}bankcards = bankCard;//初始化新对象数组的最后一个元素,即最后一个元素,防止空指针异常BankCard bkTemp = new BankCard(" "," ",0,0);//这里设置默认的账号和余额为0bankcards [bankcards.length-1]=bkTemp;if(register(bankcards,name,password)){System.out.println("注册成功");}else {System.out.println("注册失败");}break;}default:System.out.println("输入错误");}}}

Book类里面的几个方法:

1.登录

public static boolean login(BankCard bankcards[],String name,String password){if(bankcards==null)return false;for(int i=0;i<bankcards.length;i++){if (bankcards[i].getClientName().equals(name)&&bankcards[i].getPassword().equals(password))return true;}return false;}

就从这块开始,我写的是“用户名和密码匹配”而不是真正银行里的“卡号和密码匹配”,有的不想改,懒(笑哭ing)。就是从键盘输入用户名和密码,和已经初始化的那些匹配,匹配到了返回true,main函数里调用结果为true,输出输出登录成功,进入下一级菜单(存钱 取钱 转账 退卡)

2.注册账号

public static boolean register(BankCard bankcards[],String name,String password){Scanner scanner = new Scanner(System.in);name = scanner.next();password = scanner.next();for(int i=0;i<bankcards.length;i++){if (bankcards[i].getClientName().equals(name)&&bankcards[i].getPassword().equals(password)){return false;}else if(bankcards[i].getAccountNum()==0){//在main方法里定义了accountNum从1开始,将扩容后新的accountNum初始化为0,为0则注册到此处bankcards[i].setClientName(name);bankcards[i].setPassword(password);bankcards[i].setAccountNum(bankcards.length);bankcards[i].setLeftMoney(0);return true;}}return false;}

这块涉及到了数组的扩容,main方法里数组长度定义为4,通过扩容,使得有空间存放新注册的用户。逻辑上就是输入想要注册的用户名和密码,要是已存在的此名字的用户,那就注册失败,没有设置主键,就把名字当做主键,虽然实际上有重名的,但要是账号为主键就没事。

3.存款

public static void SaveMoney(BankCard bankcards[],int saveMoney,String name){//登录进来 所以账户肯定存在 不再做判断for(int i=0;i<bankcards.length;i++){if(bankcards[i].getClientName().equals(name)){//用姓名匹配bankcards[i].setLeftMoney(bankcards[i].getLeftMoney()+saveMoney);}}}

存款(取款)在登录成功后的子菜单下,所以登录成功后说明账户存在,把从main方法里传进的参数,加到用户的余额上就行。说到这,刚测试时随便存了个100000000000结果报错,溢出。所以还是把余额设置为String类型为好。

4.取款

public static boolean takeMoney(BankCard bankcards[],int takeMoney,String name){for(int i=0;i<bankcards.length;i++){if(bankcards[i].getClientName().equals(name)){if((bankcards[i].getLeftMoney()-takeMoney)>=0){bankcards[i].setLeftMoney(bankcards[i].getLeftMoney()-takeMoney);return true;}}}return false;}

取款和存款基本一样,逻辑上,判断账户余额>=取款金额,那就能取,然后把余额把取款金额减掉就行。限额,加个if语句判断一下就行,这块没写。要是分析代码和功能,那应该这个方法返回值定义为int或其类型,布尔类型只能用来判断“取款成功”和“取款失败”,无法把因为限额等存款原因返回。当然可以把输出语句写到成员方法里,那连返回值都不用了,但不建议把输出打印这些写在成员方法里。

5.显示账户状态

public static void showAccount(BankCard bankcards[],String name){for(int i=0;i<bankcards.length;i++){if(bankcards[i].getClientName().equals(name)) {System.out.println("账户名: " + bankcards[i].getClientName()+ " 卡号: "+ bankcards[i].getAccountNum() + " 余额 " + bankcards[i].getLeftMoney());}}}

显示用户状态,这个是内嵌在存款,取款,转账成功的页面内显示的,意思就是当完成交易可以提醒用户当前账户状态(用户名 账号 余额)。可以把这个嵌到登录成功后的菜单,用户登录后就可以查看账户当前状态。

6.转账

public static boolean transfer(BankCard bankcards[],String name,String aimName,int transMoney){if(name.equals(aimName))return false;//自己不能给自己转账for(int i=0;i<bankcards.length;i++){if(bankcards[i].getClientName().equals(name)&&(bankcards[i].getLeftMoney()-transMoney)>=0){for(int j=0;j<bankcards.length;j++){if(bankcards[j].getClientName().equals(aimName)){bankcards[j].setLeftMoney(bankcards[j].getLeftMoney()+transMoney);bankcards[i].setLeftMoney(bankcards[i].getLeftMoney()-transMoney);return true;}}}}return false;}

转账这块,我用的双重循环和双重if判定,当登录用户账户余额>=要转账金额&&收款人账户存在才可以进行转账操作。总觉得有点啰嗦这样写,但没有找到好方法。大神有好方法麻烦指点一下。

总结

一,对象数组,要使用必须先对其进行初始化,不然会遇到空指针异常。不像基本数据类型的数组,系统会有默认值。

二,类中二要素“属性,方法”,注意写有参构造方法和无参构造方法。注意属性和方法的修饰权限,private ,public,protect,package.默认不写的话,就是包访问权限“package”,即一个包下都可以访问。

三,布尔类型作为方法返回值,在main方法里用来判断,有局限性,即“只能判断是否,不能判断为什么”。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。