image.png

    1. package com.itheima.ATM;
    2. import java.util.ArrayList;
    3. import java.util.Random;
    4. import java.util.Scanner;
    5. /**
    6. * ATM系统入口类
    7. */
    8. public class ATMSystem {
    9. public static void main(String[] args) {
    10. // 1.定义一个账户类(面向对象编程)
    11. // 2. 定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作
    12. ArrayList<Account> accounts = new ArrayList<>(); // 里面存储的是Account类的对象
    13. // 展示系统的首页
    14. while (true) {
    15. System.out.println("===============黑马ATM系统====================");
    16. System.out.println("1.账户登录");
    17. System.out.println("2.账户开户");
    18. Scanner sc = new Scanner(System.in);
    19. System.out.println("请选择你的操作:");
    20. int command = sc.nextInt();
    21. switch (command){
    22. case 1:
    23. // 用户登录操作
    24. break;
    25. case 2:
    26. // 用户账户开户
    27. // 目前还没有register方法,按alt + enter键自动创建方法
    28. register(accounts,sc); // register注册的意思,
    29. break;
    30. default:
    31. System.out.println("你输入的操作命令不正确"); // 这里应该定义一个死循环,让用户一直输入(选中要循环的部分,按ctrl + alt + t)
    32. }
    33. }
    34. }
    35. // 该方法是private方法,只能在本类中使用(在这里,使用private也没关系,就在这个ATMSystem类访问
    36. /**
    37. *
    38. * @param accounts
    39. * @param sc // 由于下面要用到ScannerAPI,但是在新方法中创对象占内存,所以定义方法时,设置Scanner类 的传参即可使用该类的方法
    40. */
    41. private static void register(ArrayList<Account> accounts,Scanner sc) {
    42. System.out.println("===================系统开户操作=======================");
    43. // 1.创建一个账户对象,用于后期封装账户信息
    44. Account account = new Account();
    45. // 2.录入当前这个账户的信息,注入到账户对象中去
    46. System.out.println("请输入账户用户名:");
    47. String userName = sc.next();
    48. account.setUserName(userName); // 使用自己定义的Account类的方法
    49. while (true) {
    50. System.out.println("请输入你的密码:");
    51. String passWord = sc.next();
    52. System.out.println("请输入确认密码:");
    53. String okPassword = sc.next();
    54. if (passWord.equals(okPassword)){
    55. // 密码认证通过,可以注入给账户对象
    56. account.setPassword(okPassword);
    57. break; // 每次定义死循环一定要结束它,要不然后面写不了语句会报错Unreachable statement 无法到达的语句
    58. }else {
    59. System.out.println("对不起你输入的2次密码不一致,请重新确认"); // 为了让用户输入正确,将要循环的部分加入while死循环
    60. }
    61. }
    62. System.out.println("请你输入账户当次的限额"); // 死循环后面一定要写break要不然,这里会报错Unreachable statement
    63. double quotaMoney = sc.nextDouble(); // .nextDouble输入的是浮点型
    64. account.setQuotaMoney(quotaMoney);
    65. // 为账户随机一个8为且与其他账户的卡号不重复的号码,(独立功能,独立成方法)
    66. String cardId = getRandomCardid(accounts);//getRandomCardid是自己创建的方法
    67. account.setCardId(cardId); // 将新生成的cardID(不重复的) 传入这个account类中
    68. // 3.把账户对象添加到账户集合中去
    69. accounts.add(account);
    70. System.out.println("恭喜你," + userName + "先生/女士,您开户成功,您的卡号是:" + cardId + ",请您妥善保管卡号");
    71. }
    72. private static String getRandomCardid(ArrayList<Account> accounts) { // 为了避免不重复,可以将集合容器传入进形参
    73. Random r = new Random();
    74. while (true) {
    75. // 1.先生成8位数字
    76. String cardId = ""; // 定义一个容器,将每次遍历后的随机数字存在这个变量中
    77. // Random r = new Random(); // 定义了死循环后,这个随机数的对象就可以放到外面去,避免占用堆内存
    78. for (int i = 0; i < 8; i++) {
    79. cardId += r.nextInt(10);// 定义随机数的范围是0-9
    80. }
    81. // 2.判断这个这个8位的卡号是否与其他账户的卡号重复
    82. // 根据整个卡号去查询账户的对象
    83. Account acc = getAccountByCardId(cardId, accounts); // 这里的cardId是传入随机生成的
    84. if (acc == null){ // 如果为null则代表这个卡号没有重复,这个卡号是一个新卡号,可以使用这个卡号作为新注册账户的卡号
    85. return cardId; // 如果没有acc != null代表,卡号重复了,要使用死循环,再次生成新的卡号,再搜索
    86. }
    87. }
    88. }
    89. /**
    90. * 根据卡号查询出一个账户对象出来
    91. * cardId 卡号
    92. * accounts 全部账户的集合
    93. * 账户对象 | null
    94. */
    95. private static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){ // 这里的cardID是自己定义的形参
    96. for (int i = 0; i < accounts.size(); i++) {
    97. Account acc = accounts.get(i); // acc变量是用来存储集合中遍历出来的对象, 遍历出来的对象都可以使用account对象的方法get
    98. if (acc.getCardId().equals(cardId)){
    99. // 如果传入的卡号cardId与账户类的卡号一样,则返回该账户
    100. return acc;
    101. }
    102. }
    103. // 当遍历整个集合中的对象的卡号都不一样是:代表没有该卡号
    104. return null; // 查无此账户
    105. }
    106. }
    107. // 定义一个账户类
    108. package com.itheima.ATM;
    109. /**
    110. * 账户类
    111. */
    112. public class Account {
    113. /**
    114. * 成员变量,私有
    115. */
    116. private String cardId;
    117. private String userName; // 用户名
    118. private String password; // 密码
    119. private double money; // 账户余额
    120. private double quotaMoney; // 每次提取的额度 // quota是定额的意思
    121. public String getCardId() {
    122. return cardId;
    123. }
    124. public void setCardId(String cardId) {
    125. this.cardId = cardId;
    126. }
    127. public String getUserName() {
    128. return userName;
    129. }
    130. public void setUserName(String userName) {
    131. this.userName = userName;
    132. }
    133. public String getPassword() {
    134. return password;
    135. }
    136. public void setPassword(String password) {
    137. this.password = password;
    138. }
    139. public double getMoney() {
    140. return money;
    141. }
    142. public void setMoney(double money) {
    143. this.money = money;
    144. }
    145. public double getQuotaMoney() {
    146. return quotaMoney;
    147. }
    148. public void setQuotaMoney(double quotaMoney) {
    149. this.quotaMoney = quotaMoney;
    150. }
    151. }