这个项目是看网上教学视频,然后自己逐个敲得代码。
完成这个项目之后,作为Java小白,我感触颇多,这其中体会到了写代码的乐趣,和沉浸在其中的快感。还在编写的时候,遇到过很多问题,中间就是各种绞尽脑汁想解决方案,有些时候一个很简单的问题,需要想一个多小时才解决。虽然花的时间多,但是解决之后,心情是真的愉悦,那份心情难以言说。当然只有自己亲手去做,才体会得到的。
为什么敲这个项目呢?
是因为刚刚学完了Java基础入门,想着用这个项目练手,巩固所学,并且总结。我觉得这样的学习才是比较有乐趣的。前提是自己想学,不是别人逼你。现在开始的每一天,基本上每天的学习时间都在增加,以前可能一天就半个小时一个小时,后面慢慢加到一上午,一下午,到后面甚至一整天沉浸其中也不为过。
以上是我的一点小感想,分享一下,与君共勉!可以看到我的文章啥的都没怎么布局,排版也不行,因为我单纯就是想用这个blog记录一下自己的学习。读者莫怪^_^
以下就是项目实现过程和代码(能力有限,诸多不足之处,请见谅,以后深入学习之后,还能改进):
首先定义一个账户类Account(其中包括,卡号,姓名,性别,密码,余额,以及取款额度)
定义一个ATM类,实现系统所需要的各种功能
定义一个测试类Demo,对系统进行测试
package com.mexin.atmdemo; public class Account { private String idcard; //卡号 private String username;//用户名 private char sex;//性别 private String password;//密码 private double balance; //余额 private double limit;//限额 //无参构造 public Account() { } //有参构造 public Account(String idcard, String username, char sex, String password, double balance, double limit) { this.idcard = idcard; this.username = username; this.sex = sex; this.password = password; this.balance = balance; this.limit = limit; } //setter,getter方法 public String getIdcard() { return idcard; } public void setIdcard(String idcard) { this.idcard = idcard; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public double getLimit() { return limit; } public void setLimit(double limit) { this.limit = limit; } }
package com.mexin.atmdemo; import java.util.ArrayList; import java.util.Random; import java.util.Scanner; /* * 定义一个ATM系统类,其中包括实现ATM的所有功能的方法*/ public class ATM { /* * 构建一个私有的集合,用来存储账户 * private:关键字(私有的) * ArrayList:集合 * <Account>:<类型>:账户类 * accounts:账户类的对象名称 * new ArrayList<>():new一个 accounts对象的集合*/ private ArrayList<Account> accounts = new ArrayList<>(); /*创建一个Scanner对象命名sc *扫描用户的键盘输入 *放在最前面只需要定义一个即可,后面的方法都可以调用*/ private Scanner sc = new Scanner(System.in); //创建一个全局账户类对象loginuser,用于记录当前正在登录的用户的所有信息 private Account loginuser ; /*系统欢迎页的构建 * 需要有一个整体框架 * 需要展示的功能:用户登录,用户开户 * 需要对欢迎界面的说明:告诉用户如何使用本ATM系统*/ public void welcome(){ while (true) { System.out.println("===============欢迎使用Mexin银行ATM系统==============="); System.out.println("1.<用户登录>"); System.out.println("2.<用户开户>"); System.out.println("【说明】"); System.out.println("【如果需要使用本系统,必须要持有本系统的账户】"); System.out.println("【登录用户才可以进行其他操作】"); System.out.println("【如果没有账户,可以选择用户开户】"); System.out.println("【Mexin银行ATM系统欢迎您的使用!!!】"); //提示用户进行操作 System.out.println("请选择您想要之进行的操作(输入1或者2):"); //定义一个String类型的 command 变量 用于接收用户输入的操作 String command = sc.next(); //通过使用switch来判断用户的选择 switch (command){ case "1": //command = 1 userlogin(); //执行用户登录的方法 break; //结束switch case "2": //command = 2 oppenaccounts();//执行用户开户的方法 break; default: //输入其他命令则提示错误 System.out.println("您输入的命令不存在,请重新输入:"); } } } /*构建开户方法 * 1.需要用户输入姓名,性别,设置密码(需要两次) * 2.上述如果输入错误,需要重复,直到输入正确为止*/ private void oppenaccounts(){ System.out.println("===============创建账户==============="); //定义一个Account类型的 局部变量 acc Account acc = new Account(); /*提示用户进行开户的相关步骤*/ System.out.println("请输入您的真实姓名:"); String name = sc.next(); //setUsername():该方法是赋值 acc.setUsername(name); while (true) { System.out.println("请输入您的性别:"); //这里需要做一个判断,如果用户输入错了非男非女,则不能通过 //因为sc.next()没有sc.nextChar(),所以采用charAt()方法取 //charAt():根据括号里的索引值进行字符获取,0取第一个字符 char sex = sc.next().charAt(0); if (sex == '男' || sex == '女') { //将性别赋给acc acc.setSex(sex); //跳出死循环 break; } else { //如果输入其他字符,则提示重新输入,由于有死循环,所以会循环到开头 System.out.println("您输入的性别有误,请重新输入:"); } } while (true){ //设置密码 System.out.println("请设置您的账户密码:"); String password = sc.next(); System.out.println("请确认您的密码(再次输入设置的密码):"); String okpassword = sc.next(); //判断两次输入的密码是否一致 //equals():比较两个变量的内容是否一致 if(okpassword.equals(password)){ acc.setPassword(okpassword); System.out.println("密码设置成功!!"); //结束循环 break; }else { System.out.println("两次输入的密码不一致,请重新输入:"); } } //设置单次取款上限 System.out.println("请输入您单次能提取的最大金额:"); double limit = sc.nextDouble(); acc.setLimit(limit); //信息全部填好之后,满足开卡条件,为账户随机开卡(卡号为8位数,每一个卡号不能重复) //直接调用卡号生成方法ceeateidcard(),生成一个卡号 String newidcard = createidcard(); acc.setIdcard(newidcard); //卡号生成完成之后,将账户存入集合中,开户完成 accounts.add(acc); System.out.println("恭喜您,开户成功!!!"); System.out.println("您的账户卡号是:" + acc.getIdcard()); } //随机生成一个卡号的方法 private String createidcard(){ while (true) { //Random类:随机产生一个随机数 Random r = new Random(); //定义一个字符串变量,用于存放卡号 String idcard = ""; //循环8次,产生8个 0-9 的随机数 for (int i = 0; i < 8 ; i++) { //定义一个整型变量,接收随机数 int id = r.nextInt(10); idcard += id; } //判断idcard里面的卡号是否和之前的账户卡号重复,如果没有则返回卡号 Account acc = getAccountByidcard(idcard); if(acc == null){ return idcard; } } } //getAccountByidcard()方法通过卡号来检查新开的卡号是否重复 private Account getAccountByidcard(String idcard){ for (int i = 0; i < accounts.size(); i++) { //创建一个Account类型的局部变量acc,接收集合里的对象 Account acc = accounts.get(i); if (acc.getIdcard().equals(idcard)){ //如果生成的卡号,与账户里面的卡号重复了,则返回卡号 return acc; } } //如果没有重复,返回null return null; } /*用户登录功能 * 1.判断accous集合是否有账户,如果没有则提醒开户 * 2.根据卡号登录,验证卡号的正确性 * 3.输入密码,验证密码 * 4.登录成功后需要进入新的功能展示页*/ private void userlogin(){ //判断集合长度是否为零 if(accounts.size() == 0){ System.out.println("对不起,系统里面无账户,请先开户!!!"); return; } //用户登录 System.out.println("===============用户登录==============="); while (true) { System.out.println("请输入您的卡号:"); String id = sc.next(); //通过getAccountByidcard()方法查找集合里的卡号,赋给acc Account acc = getAccountByidcard(id); if(acc == null){ System.out.println("您输入的卡号不存在!!请确认再重新输入:"); }else { while (true) { System.out.println("请输入您的密码:"); String password = sc.next(); //判断输入的密码和设置的密码是否一致 if(acc.getPassword().equals(password)){ //将登录成功的账户acc赋给loginuser记录,方便后续各种操作 loginuser = acc; System.out.println("恭喜您," + acc.getUsername() + "," + "卡号:" + acc.getIdcard() + "登录成功!"); //提示登录成功后,displayinterface()方法进入用户功能展示页 displayinterface(); //结束循环 return; }else { System.out.println("您输入的密码有误,请重新输入:"); } } } } } //创建用户功能展示页 private void displayinterface(){ while (true) { System.out.println("===============功能列表==============="); System.out.println("【1.查询当前用户信息】"); System.out.println("【2.查询余额】"); System.out.println("【3.存款】"); System.out.println("【4.取款】"); System.out.println("【5.转账】"); System.out.println("【6.修改密码】"); System.out.println("【7.修改最大单次取款限额】"); System.out.println("【8.退出】"); System.out.println("【9.注销用户】"); //提示用户进行功能选择 System.out.println("请选择您要执行的功能(输入数字即可):"); int command = sc.nextInt(); switch (command){ case 1 : //查询当前用户信息 lookinginformation(); break; case 2 : //查询余额 lookingmoney(); break; case 3 : //存款 deposit(); break; case 4 : //取款 withdraw(); break; case 5: //转账 transfer(); break; case 6 : //修改密码 updatepassword(); return; case 7 : //修改最大单次取款限额 updatelimit(); break; case 8 : //退出 System.out.println("感谢您的使用,祝您生活愉快!!"); return; case 9 : //注销用户 if(logout()){ return; } break; } } } //创建查询用户的方法 private void lookinginformation(){ System.out.println("===============" + loginuser.getUsername() + "的用户信息如下==============="); System.out.println("用户姓名:" + loginuser.getUsername()); System.out.println("用户性别:" + loginuser.getSex()); System.out.println("用户卡号:" + loginuser.getIdcard()); System.out.println("用户余额:" + loginuser.getBalance()); System.out.println("单次取款额度:" + loginuser.getLimit()); } //创建查询余额的方法 private void lookingmoney(){ System.out.println("===============查询余额==============="); System.out.println("当前余额:" + loginuser.getBalance()); } //创建存款的方法 private void deposit(){ System.out.println("===============存款==============="); System.out.println("请放入您要存的钱:"); double deposit = sc.nextDouble(); //余额加上要存进去的钱 loginuser.setBalance(loginuser.getBalance() + deposit); System.out.println("交易完成!!!"); System.out.println("当前余额:" + loginuser.getBalance()); //结束该方法 return; } /*创建取款的方法 * 1.首先判断账户余额是否为零 * 2.余额是否大于100 * 3.取款是否低于余额 * 4.取款是否低于设置的单次取款上限*/ private void withdraw(){ System.out.println("===============取款==============="); double money = loginuser.getBalance(); if (money == 0 ){ System.out.println("对不起,您的账户余额为 0 ,请先存款,再来操作哦!^_^"); return; } while (true) { System.out.println("请输入您要交易的金额:"); double withdraw = sc.nextDouble(); if(money < 100 && money > 0 ){ System.out.println("对不起,您当前账户余额不足100,无法取出,请联系工作人员!!"); }else if (money >= 100 && withdraw <= loginuser.getLimit() && money >= withdraw){ money = money - withdraw; loginuser.setBalance(money); System.out.println("交易完成!!"); System.out.println("当前余额:" + loginuser.getBalance()); break; }else if(money < withdraw){ System.out.println("对不起,您的余额不足!!无法交易!!"); System.out.println("当前余额:" + loginuser.getBalance()); }else { System.out.println("对不起,您单次取款金额超过上限" + loginuser.getLimit() + ",无法操作!!"); System.out.println("您有两种途径解决:"); System.out.println("1.修改最大单次取款限额"); System.out.println("2.每次取款不要高于您设置的取款上限"); } } } /*创建转账的方法 * 1.查询当前账户余额是否等于0 * 2.查询系统里是否有两个以上的账户存在 * 3.利用卡号查询进行转账 * 4.验证转账对象的身份 * 5.转账金额要小于余额*/ private void transfer(){ System.out.println("===============转账==============="); //查询当前账户余额是否等于0 if (loginuser.getBalance() == 0 ){ System.out.println("您当前账户中没有钱,不支持转账"); return; } //查询系统里是否有两个以上的账户存在 if (accounts.size() < 2){ System.out.println("当前系统没有两个以上的账户,无法进行转账操作"); return; } //利用卡号查询进行转账 while (true) { System.out.println("请输入您要转账的用户卡号:"); String id = sc.next(); //利用id查找账户 Account acc = getAccountByidcard(id); if (acc == null){ //如果查找返回null说明卡号错误,或者不存在 System.out.println("您输入的卡号有误或者不存在,请确认"); }else { //账户存在,认证姓氏 //substring(),从索引值处开始获取字符,把姓氏用*替代,把名字取出来拼接在一起 String name = "*" + acc.getUsername().substring(1); while (true) { System.out.println("请输入【" +name + "】的姓氏"); String Prename = sc.next(); //startsWith()方法,判断字符串是否以某个字符开始 if(acc.getUsername().startsWith(Prename)){ //验证通过 while (true) { System.out.println("请输入要转账的金额:"); double transfer = sc.nextDouble(); if (transfer > loginuser.getBalance()){ System.out.println("您的余额不足,无法转账"); System.out.println("当前余额:" + loginuser.getBalance()); }else { loginuser.setBalance(loginuser.getBalance() - transfer); acc.setBalance(acc.getBalance() + transfer); System.out.println("转账成功!"); System.out.println("当前余额:" + loginuser.getBalance()); return; } } }else { System.out.println("您输入的姓氏有误!,请重新输入"); } } } } } /*创建修改密码的方法*/ private void updatepassword(){ System.out.println("===============修改密码==============="); while (true) { System.out.println("请输入您当前的密码:"); String password = sc.next(); String okpassword = loginuser.getPassword(); //验证密码是否正确 if (okpassword.equals(password)){ while (true) { System.out.println("请输入新密码:"); String newpassword = sc.next(); System.out.println("请再次输入新密码:"); String Anewpassword = sc.next(); if(Anewpassword.equals(newpassword)){ loginuser.setPassword(Anewpassword); System.out.println("密码修改完成,请退出重新登录生效哦!!"); return; }else { System.out.println("两次密码不一致,请重新输入"); } } }else { System.out.println("您输入的密码不正确,请重新输入。"); } } } //创建修改最大单次取款限额的方法 private void updatelimit(){ System.out.println("===============修改限额==============="); System.out.println("当前最大单次取款限额:" + loginuser.getLimit()); System.out.println("请输入您要修改的额度为:"); double updatelimit = sc.nextDouble(); loginuser.setLimit(updatelimit); System.out.println("修改成功!!,当前最大单次取款限额:" + updatelimit); } /*注销用户 * 1.询问是否注销 * 2.账户里面有余额,不能注销 * 3.注销需要返回欢迎页 * 4.不注销需要返回功能展示页*/ private boolean logout(){ System.out.println("===============注销账户==============="); System.out.println("您确定要注销当前账户吗?(输入数字:【1.是/2.否】),:"); int answer = sc.nextInt(); if (answer == 1){ if(loginuser.getBalance() >= 100){ System.out.println("您当前账户余额大于100,无法注销"); }else { accounts.remove(loginuser); System.out.println("注销完成!感谢您的使用!"); return true; } }else { return false; } return false; } }
package com.mexin.atmdemo; public class Demo { //这是一个测试类,用于测试写好的系统 public static void main(String[] args) { //主方法 //1.先要创建一个ATM对象,才可以开始测试。 ATM atm = new ATM(); //创建对象后,才可以调用方法。 atm.welcome(); //调用welcome()方法进入到ATM系统欢迎页。 } }