目录
一、简易自动提款机的题目要求:
- 创建用户类User(包含卡号、姓名、密码、余额等属性),用户开卡时录入的姓名和密码(自动分配一个卡号、初始金额设置为0)。
- 使用ArrayList或LinkedList存储全部注册用户
形式如:ArrayList<User> userList = new ArrayList<User>();
- 实现功能
(1)存款
(2)取款(如果余额不足要提示)
(3)查询余额(只能查看当前卡号的余额) - 技术要求,使用异常处理用户的错误输入(即程序保护容错功能)。
二、思维过程
老师说写程序的时候,最重要的是思路,有了思路之后,一切的东西都会变得更加具体化,这是一个必要的过程。我们在思考东西的时候写下来就能够更好的思考事物之间的逻辑关系了。
所以我们在思考一些简单问题的时候也要多想想这些具体是怎么实现的?这每一步都是怎么来的?这很重要。
三、代码实现
IUserManager接口:用于写一些抽象方法/用户集合
public interface IUserManager {
ArrayList<UserBean> ulist = new ArrayList<UserBean>();
}
UserBean类:用户标准类
ID、Name、password、money
toString:提供一个查看当前类状态的方法
userBean构造方法:需要提供用户名称和现在要存的钱
package com.hzyc.hw1209;
public class UserBean {
private int ID;
private String Name;
private String Password;
private int money;
public UserBean(int ID, String Name, int money) {
this.setID(ID);
this.setName(Name);
this.setMoney(money);
}
public String toString() {
return "卡号为[" + this.ID + "]的用户\n" +
this.Name + "的账户余额为:¥" + this.money;
}
public int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getPassword() {
return Password;
}
public void setPassword(String password) {
Password = password;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
UserManager:用户管理类
newUser开卡方法 (包含一个newCountMoney:提供扣除开卡费方法 )
saveMoney:提供存钱方法
getMoney:提供取钱方法,如果取钱数目超过,则不可以被取出。
checkMoney:提供查看【当前账户】的钱财方法
findUser:提供登录方法,根据自己的密码从ulist里面找到自己的账户
checkpsw:提供一个查看密码是否正确的方法,用于核验密码的正确性。
package com.hzyc.hw1209;
import com.sun.xml.internal.bind.v2.model.core.ID;
import java.util.Scanner;
public class UserManager implements IUserManager {
Scanner sc = new Scanner(System.in);
int flag = 2000;
public int findUser(int ID) {
try {
if (ID > flag) {
System.out.println("输入有误,请重新输入用户ID");
findUser(sc.nextInt());
}
//核验密码成功,则返回正确的index
if (checkpsw(ID)) {
int tub = 0;
for (int i = 0; i < ulist.size(); i++) {
if (ulist.get(i).getID() == ID) {
tub = i;
}
}
return tub;
}
} catch (Exception e) {
}
return -1;
}
public boolean checkpsw(int ID) {
System.out.println("请输入密码以核验身份");
String str = sc.next();
int index = 0;
//遍历所有用户,找到对应的ID
for (int i = 0; i < ulist.size(); i++) {
if (ulist.get(i).getID() == ID) {
index = i;
}
}
return ulist.get(index).getPassword().equals(str);
}
public void newUser() {
System.out.println("现在正在为您开卡,请输入姓名和储蓄:【姓名-金钱-密码】");
try {
String str = sc.next();
String[] newStr = str.split("-");
flag += 4;
UserBean user = new UserBean(flag, newStr[0], Integer.parseInt(newStr[1]));
//为用户设置密码
user.setPassword(newStr[2]);
//开户
newCountMoney(user);
ulist.add(user);
System.out.println("开卡成功,现在" + user);
} catch (Exception e) {
System.out.println("输入有误,请重新输入");
}
}
public void newCountMoney(UserBean u) {
u.setMoney(u.getMoney() - 5);
System.out.println("扣除开卡费:¥5,成功!");
}
public void saveMoney(int index) {
System.out.println("请输入您想要存储多少钱");
try {
ulist.get(index).setMoney(ulist.get(index).getMoney() + sc.nextInt());
System.out.println("存钱成功!");
System.out.println(ulist.get(index));
System.out.println("-----------------------------");
} catch (Exception e) {
System.out.println("您的存钱有误,请存入整数的钱");
}
}
public void getMoney(int index) {
System.out.println("请输入您想要取出多少钱");
int moneybe = ulist.get(index).getMoney() - sc.nextInt();
if (moneybe < 0) {
System.out.println("对不起,您的存款不够");
} else {
ulist.get(index).setMoney(moneybe);
}
}
public void checkMoney(int index) {
try {
System.out.println("您现在的账户状态为:");
System.out.println(ulist.get(index));
} catch (Exception e) {
System.out.println("密码错误!!正在返回系统主页面");
}
}
}
Workflow流程类
star作为外层菜单 选择: 1.开户流程; 2.登录流程;
loginFlow是【核验密码】的流程
要登录==核对自己的账户信息
正确则可以进入自己的账户进行下一步操作, 密码错误则返回主菜单(star方法)
loggedFlow成功登录进入该菜单,
登录后用户的菜单:
【流程】: 1.存款; 2.取款; 3.查看; 4.退出;
import java.util.Scanner;
public class Workflow {
Scanner sc = new Scanner(System.in);
UserManager mgr = new UserManager();
int index = 0;
void star() {
System.out.println("\n\n*************欢迎使用本系统****************\n" +
"请开始您的操作:【1】开户【2】登录");
int choose1 = sc.nextInt();
switch (choose1) {
case 1:
mgr.newUser();
star();
break;
case 2:
//核对密码,密码错误则返回主菜单
loginFlow();
break;
}
loggedFlow();
}
void loginFlow() {
System.out.println("请输入您的卡号:");
Scanner sc = new Scanner(System.in);
index = mgr.findUser(sc.nextInt());
System.out.println("您的账户状态为:");
mgr.checkMoney(index);
if (index == -1){
star();
}
}
void loggedFlow() {
System.out.println("请进行您的操作:");
outhere:
while (true) {
System.out.println("\n\n*************欢迎多存钱****************\n" +
"请选择操作:【1】存款【2】取款【3】查询余额【4】退出系统");
try {
int choose = sc.nextInt();
switch (choose) {
case 1:
mgr.saveMoney(index);
break;
case 2:
mgr.getMoney(index);
break;
case 3:
mgr.checkMoney(index);
break;
case 4:
break outhere;
}
} catch (Exception e) {
System.out.println("您的输入有误,请重新输入。");
}
}
star();
}
}
平平无奇测试类
public class tst {
public static void main(String[] args) {
Workflow w =new Workflow();
w.star();
}
}
四、have a try!
五、总结:
1.程序流程
IUserManager
userManager
newUser开卡方法
newCountMoney\n提供扣除开卡费方法
saveMoney\n提供存钱方法
getMoney\n提供取钱方法,如果取钱数目超过,则不可以被取出。
checkMoney\n提供查看【当前账户】的钱财方法
findUser\n提供登录方法,根据自己的密码从ulist里面找到自己的账户
checkpsw\n提供一个查看密码是否正确的方法,用于核验密码的正确性。
userBean
ID、Name、password、money
标准用户类
toString\n提供一个查看当前类状态的方法
userBean构造方法:\n需要提供用户名称和现在要存的钱
Workflow
star作为外层菜单\n选择:\n1.开户流程;\n2.登录流程;
loginFlow是核验密码的流程\n需要登录==核对自己的账户信息\n正确则可以进入自己的账户进行下一步操作,密码错误则返回主菜单(star方法)
loggedFlow成功登录进入该菜单,登录后用户的菜单\n【流程】:\n1.存款;\n2.取款;\n3.查看;\n4.退出;
2.对trycatch 的理解
在这个程序里面我加了很多try/catch语句,也加深了对trycatch 的理解:
try-catch语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。
个人认为trycatch的作用:
(一)是防止程序在正常使用中突发退出的,可以加强程序的健壮性。
(二)它允许你修正错误。
我们可以假设一个场景,如果我们在使用淘宝的过程中,在使用电脑的过程中,程序不是弹出一个窗口告诉我们,“你的密码输入错误,请重新输入”,而是直接一下子就崩溃了,整个页面都没了,可想而知,trycatch 的重要性了。
3.Tips:
Throwable类是Error和Exception的父类