银行系统(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);//这里设置默认的账号和余额为0 bankcards [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); } } }
存款(取款)在登录成功后的子菜单下,所以登录成功后说明账户存在, 1f7f2 把从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方法里用来判断,有局限性,即“只能判断是否,不能判断为什么”。
- 银行管理系统 实现用户注册 登录 存、取款 交易记录查询和修改用户信息等功能
- 实现一个简单的银行储蓄系统,承担活期用户的存款和取款业务 (只是初步的写出)
- [c语言]模拟银行atm机,实现存款、取款等业务
- .NET-简单的银行系统,完成查询余额,转账,存款,取款
- 一个注册、登陆系统的实现
- 使用MVC实现用户登录注册系统—银行管理系统
- 2.为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员输入系统,如果是存款,系统纪录存款人姓名、住址、存款类型、存款日期、利率等信息,并打印出存款单给储户;如果是取款,系统计算利息并打印利息清单给储户。
- 2.为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员键入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利率等信息,并印出存款单给储户;如果是取款,系统计算利息并印出利息清单给储户。 请写出问题定义并分析此系统的可行性。
- C语言实现 ATM机存取款系统
- PHP+Apache+MySQL实现简易的注册登陆系统
- 为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员输入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利率等信息,并印出存款单给储户;如果是取款,系统计算利息并印出利息清单给储户。 写出问题定义并分析系统的可行性。
- django快速实现完整登录系统,把登陆注册串在一起并增加cookie(六)
- 利用python实现简单登陆注册系统
- JAVA实现简单系统登陆注册模块
- (Android实战系统一)对话框实现登陆注册功能
- 2-2 为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员键入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利率等信息,并印出存款单给储户;如果是取款,系统计算利息并印出利息清单给储户。请写出问题定义并分析此系统的可行性。
- JAVA小项目-银行管理系统(图形化界面)6-存款与取款
- JAVA实现简单系统登陆注册模块的设计(附详细代码分析)
- php+mysql实现用户注册登陆的方法
- phpcms实现微信登陆(无需注册,直接存入)