前言:本项目为了更深的理解java语言的面向对象原理
目录
2、开户功能应该独立定义成方法,并传入当前集合对象给该方法。
一、项目目标
模拟实现银行ATM机系统,实现开户,登录账户,查询账户,存款,取款,转账,修改账户密码,注销账户
二、技术分析
1、面向对象
每个用户对象要对应一个账户对象:所以需要设计账户类Account
2、使用集合进行存储用户数据
系统需要提供一个容器用于存储这些账户对象的信息,利用ArrayList集合及其方法
3、简单的流程控制
结合顺序、选择、循环、等相关操作控制程序的业务逻辑
三、实现步骤
1、Test类进行测试
创建一个ATM对象
public class Test {
public static void main(String[] args) {
//创建一个ATM的对象
ATM atm = new ATM();
//用对象调用start()方法,启动程序
atm.start();
}
}
2、Account类账户对象
private String cardId;//卡号
private String userName;//用户名称
private char sex;//性别'男'或'女'
private String password;//密码
private double money;//余额
private double limit;//取现限额
每个用户一个账户对象,需要设计账户类,账户类至少包含(卡号、用户名、性别、余额、取现额度、密码)
需要定义一个ArrayList的集合用于存储账户对象。
还要给出相应的get()和set()方法,方便存取数值
3、ATM类银行系统
1、用户展示界面
需要展示欢迎页包含2个功能:用户登录、用户开户
System.out.println("-----欢迎你进入到ATM系统-----");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择您的操作:");
2、开户功能应该独立定义成方法,并传入当前集合对象给该方法。
private void creataccount()
需要提示用户输入个人信息,开户的卡号是系统自动生成的8位数。
public static String createCardId()
注意:自动生成的卡号不能与其他用户的卡号重复。
最后把用户开户的信息封装成Account对象,存入到集合中。
3、用户登录
需要根据卡号去集合中查询对应的账户对象。
如果找到了账户对象,说明卡号存在,继续输入密码。
如果密码也正确,则登录成功
4、用户查询账户、退出账户功能
用户登录成功后,需要进入用户操作页。
查询就是直接展示当前登录成功的账户对象的信息。
退出账户是需要回到首页的。
5.用户存款、取款功能
存款和取款都是拿到当前用户的账户对象。
通过调用账户对象的set方法修改其余额
6.用户转账功能
转账功能要分析最少有两个账户是否存在的问题。
还要分析自己的余额是否足够的问题。
7.用户密码修改功能、销户功能
修改密码就是把当前对象的密码属性使用set方法进行更新。
注意:如果账户还有余额,则不可销户
销户是从集合对象中删除当前对象,并回到首页。
修改密码时要输入当前密码,修改成功后要回到欢迎界面
四、完整代码
1、Account类
public class Account {
private String cardId;//卡号
private String userName;//用户名称
private char sex;//性别'男'或'女'
private String password;//密码
private double money;//余额
private double limit;//取现限额
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName + (sex == '男' ?"先生":"女士");// == ""?"": "",利用三目运算输出先生或女士
}
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 getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
}
2、ATM类
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accountlist = new ArrayList<>();
private Scanner sc = new Scanner(System.in);
private Account loginAcc;//作为登录后的用户
/**启动*/
public void start(){
while (true) {
System.out.println("-----欢迎你进入到ATM系统-----");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择您的操作:");
int command = sc.nextInt();
switch(command){
case 1:
//用户登录
login();
break;
case 2:
//用户开户
creataccount();
break;
default:
System.out.println("您的输入有误,请重新输入!");
}
}
}
/** 用户登录*/
private void login(){
System.out.println("您正在进行登录操作~~");
//判断系统中有没有账户
if(accountlist.size() == 0){
System.out.println("当前系统中无账户,请先开户~~");
return;
}
//存在账户,输入卡号登录
while (true) {
System.out.println("请输入您的卡号:");
String cardId = sc.next();
Account acc = Isused(cardId);//Isused()方法判断账户中有没有对应的卡号
//如果没有卡号,我这里要求再次输入用while循环
if(acc == null){
System.out.println("系统中没有找到您输入的卡号,请确认~~");
}else{
while (true) {
System.out.println("请输入您的密码:");
String password = sc.next();
//判断密码是否正确
if(acc.getPassword().equals(password)){
System.out.println("恭喜您," + acc.getUserName() + "登录成功!" + "您的卡号是:" + acc.getCardId());
//登录成功后的其他功能
loginAcc = acc;
showUserCommand();
return;//跳出并结束当前方法,回到start()方法
}else{
System.out.println("您输入的密码有误,请确认");//提示用户再次登录
}
}
}
}
}
/** 展示登录后操作界面*/
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户的处理:");
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、注销当前账户");
int command = sc.nextInt();
switch (command){
case 1:
//查询账户
showLoginAccount();
break;
case 2:
//存款
depositMoney();
break;
case 3:
//取款
drawMoney();
break;
case 4:
//转账
transferMoney();
break;
case 5:
//密码修改
updataPassword();
return;
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您退出系统成功~~");
return;//跳出并结束当前方法
case 7:
//注销当前账户
if(deleteAccount()){
return;
}
break;
default:
System.out.println("您的输入有误,请确认~~");
}
}
}
/**1、查询账户*/
private void showLoginAccount(){
System.out.println("当前您的账户信息如下:");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("账户:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
/** 2、存款*/
private void depositMoney(){
System.out.println("您正在进行存钱:");
System.out.println("请输入您的存款金额:");
double money = sc.nextDouble();
//更新当前账户的余额
loginAcc.setMoney(loginAcc.getMoney() + money);
//提示用户
System.out.println("恭喜您,您存钱是:"+ money + "您现在的余额是:" + loginAcc.getMoney());
}
/** 3、取款*/
private void drawMoney(){
System.out.println("您正在取钱:");
//判断余额是否大于100
if(loginAcc.getMoney() < 100){
System.out.println("您的余额不足100,不能取钱~~");
return;
}
while (true) {
//输入取款金额
System.out.println("请输入您的取款金额:");
double money = sc.nextDouble();
//判断余额是否足够
if(loginAcc.getMoney() >= money){
//余额足够
//还要判断是否超过了限额
if(money > loginAcc.getLimit()){
System.out.println("您输入的金额超过了限额,你的限额是:" + loginAcc.getLimit());
}else{
//到这里,就可以取钱了,只需要更新余额就可以了
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("您取款成功,取款金额是:" + money + ",剩余额度是:" + loginAcc.getMoney());
return;//退出当先方法,这里用break也可以
}
}else{
System.out.println("余额不足,您的余额是:" + loginAcc.getMoney());
}
}
}
/** 4、转账*/
private void transferMoney(){
System.out.println("您正在进行转账:");
//判断用户数量>=2才可以转账
if(accountlist.size() < 2){
System.out.println("系统中只有您一个账户无法转账~~");
}
//判断自己是否有钱
if(loginAcc.getMoney() == 0){
System.out.println("您自己都没钱,就不要转了~~");
}
//可以转账了
while (true) {
System.out.println("请您输入对方的卡号:");
String cardId = sc.next();
//判断对方的卡号是否正确
Account acc = Isused(cardId);
if(acc == null){
System.out.println("您输入的对方卡号不存在~~");
}else{
//对方账户存在就可以转账了
while (true) {
System.out.println("请您输入转账金额:");
double money = sc.nextDouble();
//判断余额是否大于转账金额
if(loginAcc.getMoney() >= money){
//更新余额即可
loginAcc.setMoney(loginAcc.getMoney() - money);
acc.setMoney(acc.getMoney() + money);
System.out.println("您转账成功~~");
return;
}else{
System.out.println("您的余额不足转账~~,您最多可以转账:" + loginAcc.getMoney());
}
}
}
}
}
/** 5、密码修改*/
private void updataPassword(){
System.out.println("您正在修改密码:");
while (true) {
System.out.println("请确认当前密码:");
String password = sc.next();
if(loginAcc.getPassword().equals(password)){
while (true) {
System.out.println("请输入新密码:");
String newpassword = sc.next();
System.out.println("请再次输入新密码:");
String okpassword = sc.next();
if(newpassword.equals(okpassword)){
loginAcc.setPassword(okpassword);
System.out.println("您的密码修改成功~~");
return;
}else{
System.out.println("您输入的两次密码不一致~~");
}
}
}else{
System.out.println("密码输入有误,请确认~~");
}
}
}
/** 7、注销当前账户*/
private boolean deleteAccount(){
System.out.println("您正在进行销户:");
System.out.println("您确认销户吗? ’yes‘/'no'");
String command = sc.next();
switch (command){
case "yes":
//判断账户中余额是否为0
if(loginAcc.getMoney() == 0){
accountlist.remove(loginAcc);
System.out.println("您已销户成功~~");
return true;
}else{
System.out.println("您的账户余额是:" + loginAcc.getMoney() + ",您还不可以销户~~");
return false;
}
default:
System.out.println("好的,给您保留账户~~");
return false;
}
}
/**用户开户*/
private void creataccount(){
System.out.println("您正在进行开户操作~~");
//创建一个用户对象acc
Account acc = new Account();
//提示用户
System.out.println("请输入您的用户名称:");
String name = sc.next();
acc.setUserName(name);
while (true) {
System.out.println("请输入您的性别:");
char sex = sc.next().charAt(0);//'男'
if(sex == '男'||sex == '女'){
acc.setSex(sex);
break;
}
else{
System.out.println("您的输入有误,性别只能是男或是女");
}
}
//输入密码
while (true) {
System.out.println("请输入您的密码:");
String password = sc.next();
System.out.println("请您再次输入您的密码:");
String okpassword = sc.next();
if(password.equals(okpassword)){
acc.setPassword(okpassword);
break;
}
else System.out.println("您输入的两次密码不一致!");
}
//取现额度
System.out.println("请输入您的取现额度:");
double limit = sc.nextDouble();
acc.setLimit(limit);
//系统生成一个8位数的卡号,还要保证不重复
acc.setCardId(creatcardId());
accountlist.add(acc);
System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardId());
}
/**生成卡号*/
private String creatcardId(){
while (true) {
String cardId = "";//存放卡号
Random r = new Random();
//使用8次循环,生成8位数字的卡号
for (int i = 0; i < 8; i++) {
int num = r.nextInt(10);//生成0~9的数
cardId += num;
}
//此时不可以直接返回卡号,还要判断卡号是否重复。
Account acc = Isused(cardId);
//说明卡号不重复
if(acc == null){
return cardId;
}
}
}
/**判断卡号是否重复的方法,传递我们要判断的卡号*/
private Account Isused(String cardId){
//遍历ArrayList集合
for (int i = 0; i < accountlist.size(); i++) {
Account acc = accountlist.get(i);
if(acc.getCardId().equals(cardId)){
return acc;//返回相同的卡号的用户
}
}
return null;//说明没有相同的卡号
}
}
3、Test测试类
public class Test {
public static void main(String[] args) {
//创建一个ATM的对象
ATM atm = new ATM();
//用对象调用start()方法,启动程序
atm.start();
}
}
以上就是全部的内容,本文简单地分析介绍了ATM系统的实现,实现了开户,登录账户,查询账户,存款,取款,转账,修改密码,退出,销户的功能。以上功能均定义成独立的方法。