ATM系统
2023-12-13 07:07:18
模拟ATM系统
1、面向对象编程
? ? ? ? 每个账户都是一个账户对象:所以需要设计账户类Account,用于创建账户对象封装账户信息。ATM同样是一个对象,需要设计ATM类,代表ATM管理系统,负责对账户的处理。
2、使用集合容器
? ? ? ? ATM管理类中需要提供一个容器用于存储系统全部账户对象的信息,我们选ArrayList集合。
3、程序控制流程
? ? ? ? 需要结合分支、循环、跳转等程序流程控制的知识,用来控制系统的业务流程。
4、使用常见API
登录信息的内容比较,数据的分析,处理等都需要常用API来解决,如使用String。
系统架构搭建
用户开户功能
- 就是新增一个账户,也就是往系统的账户集合种添加一个账户对象
账户的要求
- 用户信息包含:姓名、性别、密码、每次取现额度、卡号
- 注意:卡号有系统生成,要求是8位的数组组成的(且卡号不能重复)
用户登录功能
?用户操作页设计、查询设计、退出账户分析
用户存款功能
- 就是用户为自己的账户存钱,存钱后更新账户的信息即可
用户取款功能
- 就是从自己的账户取钱,要求:
?用户转账功能
- 把钱转给别人,转钱之前需要判断:
?销户操作的基本需求
- 销户就是从系统中删除当前账户,销户要求:
?密码修改
- 就是更改密码,更改密码要求:
Account类
public class Account {
private String cardId; //卡号
private String name; //姓名
private char sex; //性别
private String passWord;//密码
private double money; //余额
private double limit; //每次取现额度
public Account() {
}
public Account(String cardId, String name, char sex, String passWord, double money, double limit) {
this.cardId = cardId;
this.name = name;
this.sex = sex;
this.passWord = passWord;
this.money = money;
this.limit = limit;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getName() {
return name + (sex == '男' ? "先生" : "女士");
}
public void setName(String name) {
this.name = name;
}
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;
}
}
ATM类
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();
Scanner s = new Scanner(System.in);
private Account loginAcc;
/* 启动ATM系统 展示欢迎界面 */
public void start(){
while (true) {
System.out.println("==========欢迎进入闪电银行ATM系统=============");
System.out.println("1.用户登录");
System.out.println("2.用户开户");
System.out.println("3.退出");
System.out.println("请选择:");
String n = s.next();
switch (n){
case "1":
// 用户登录
login();
break;
case "2":
// 用户开户
createAccount();
break;
case "3":
return;
default:
System.out.println("您输入的命令不存在");
}
}
}
/* 完成用户的登录操作 */
private void login(){
System.out.println("=====系统登录操作=====");
//1.判断系统中是否存在账户对象
if (accounts.size() == 0){
System.out.println("本银行中还未有您的账户,请您先去开户");
return;
}
//2.系统中存在账户对象,可以开始进入登录操作了
while (true) {
System.out.println("请您输入登录卡号:");
String cardid = s.next();
//3.判断这个卡号是否存在
Account acc = getAccountByCardId(cardid);
if (acc == null){
System.out.println("您输入的卡号不存在,请您重试");
}else {
while (true) {
System.out.println("请您输入密码:");
String password = s.next();
if (acc.getPassWord().equals(password)){
loginAcc = acc;
System.out.println("恭喜您," + acc.getName() + "登录成功,您的卡号是:" + cardid);
showUserCommand();
return;
}else {
System.out.println("您输入的密码错误,请您重试");
}
}
}
}
}
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getName() + ",您可以办理以下业务:");
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("请选择:");
String a = s.next();
switch (a){
case "1":
showloginAccount();
break;
case "2":
depositMoney();
break;
case "3":
drawMoney();
break;
case "4":
transferMoney();
break;
case "5":
modifyPassword();
return;
case "6":
System.out.println(loginAcc.getName() + ",您退出成功");
return;
case "7":
if(deleteAccount()){
return;
}
break;
default:
System.out.println("您输入的命令不存在");
break;
}
}
}
/* 展示当前登陆的用户信息 */
private void showloginAccount(){
System.out.println("=====当前您的账户信息如下=====");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("姓名:" + loginAcc.getName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("取现额度:" + loginAcc.getLimit());
System.out.println("===============");
}
/* 存款 */
private void depositMoney(){
System.out.println("=====存款操作=====");
System.out.println("请输入您要存入的金额:");
double money = s.nextDouble();
//更新当前登录账户的余额
loginAcc.setMoney(loginAcc.getMoney()+money);
System.out.println("恭喜您,存钱:" + money + "成功,存钱后的余额为:" + loginAcc.getMoney());
}
/* 取款 */
private void drawMoney(){
System.out.println("=====取款操作=====");
//1.判断账户余额是否达到了100元,如果不够就不让用户取钱
if (loginAcc.getMoney() < 100){
System.out.println("您的账户余额小于100元");
return;
}
//2.让用户输入取款金额
while (true) {
System.out.println("请输入您要取出的金额:");
double money = s.nextDouble();
if (money <= loginAcc.getLimit()){
if (money <= loginAcc.getMoney()){
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("恭喜您,取钱:" + money + "成功,取钱后的余额为:" + loginAcc.getMoney());
break;
}else {
System.out.println("余额不足,您的余额为:"+ loginAcc.getMoney());
}
}else {
System.out.println("您的取款金额大于您设置的每次取现额度");
}
}
}
/* 转账操作 */
private void transferMoney(){
System.out.println("=====欢迎您进入闪电银行用户转帐界面=====");
//判断系统中是否存在两个以上的账户
if (accounts.size() < 2){
System.out.println("当前系统中账户不足两个,不能转账");
return;
}
//判断当前账户余额是否为0
if (loginAcc.getMoney() == 0){
System.out.println("当前系统账户余额为 0,不能转账");
return;
}
while (true) {
System.out.println("请您输入转账的账户卡号:");
String cardid = s.next();
Account acc = getAccountByCardId(cardid);
//判断卡号是否正确
if (acc != null){
String name = acc.getName().substring(1);
System.out.println("请您输入 【* " + name + "】的姓氏");
String x = s.next();
//判断这个姓氏有没有问题
if (acc.getName().startsWith(x)){
while (true) {
System.out.println("请您输入给对方转账的金额:");
double money = s.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());
}
}
}else {
System.out.println("对不起。您认证的姓氏有问题");
}
}else {
System.out.println("不存在该账户,请重新确认");
}
}
}
/* 修改密码操作 */
private void modifyPassword(){
System.out.println("=====修改密码操作=====");
while (true) {
System.out.println("请输入您当前账户密码:");
String password = s.next();
if (loginAcc.getPassWord().equals(password)){
while (true) {
System.out.println("请您输入新密码:");
String newpassword1 = s.next();
System.out.println("请您确认新密码:");
String newpassword2 = s.next();
if (newpassword1.equals(newpassword2)){
loginAcc.setPassWord(newpassword1);
System.out.println("密码修改成功,请您重新登录");
return;
}else {
System.out.println("您两次输入的新密码不一致,请确认");
}
}
}else {
System.out.println("当前账户密码不正确");
}
}
}
/* 注销操作 */
private boolean deleteAccount(){
System.out.println("=====注销账户操作=====");
//1.询问用户是否要注销
System.out.println("您确定要注销您的账户吗?(y/n)");
String a = s.next();
switch (a) {
case "y":
//2.判断账户中是否有钱
if (loginAcc.getMoney() > 0) {
System.out.println("您的账户中尚有余额,不允许注销");
return false;
} else {
accounts.remove(loginAcc);
System.out.println("您好,您的账户已经注销成功");
return true;
}
default:
System.out.println("好的,您的账户保留");
return false;
}
}
private void createAccount(){
System.out.println("=====系统开户操作=====");
//1.创建一个账户对象,用于封装用户的开户信息
Account acc = new Account();
//2.需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请输入您的账户名称:");
String name = s.next();
acc.setName(name);
while (true) {
System.out.println("请输入您的性别:");
char sex = s.next().charAt(0);
if (sex == '男' || sex == '女'){
acc.setSex(sex);
break;
}else {
System.out.println("您输入的性别有误 只能是男或女");
}
}
while (true) {
System.out.println("请输入您的密码:");
String password = s.next();
System.out.println("请确认您的密码:");
String passwords = s.next();
//判断两次密码是否一致
if (password.equals(passwords)){
acc.setPassWord(password);
break;
}else {
System.out.println("您输入的两次密码不一致");
}
}
while (true) {
System.out.println("请输入您的每次取现额度:");
double limit = s.nextDouble();
if (limit >0){
acc.setLimit(limit);
break;
}else {
System.out.println("您输入的取现额度小于0元,请重新输入");
}
}
//重点:我们需要为这个账户生成一个新的卡号(由系统自动生成,8位数,且不能重复)
String newcardid = careteCardId();
acc.setCardId(newcardid);
//3.把这个账户对象存入到账户集合中去
accounts.add(acc);
System.out.println("恭喜您" + acc.getName() + "开户成功,您的卡号是:" + acc.getCardId());
}
/* 返回一个8位数的卡号 */
private String careteCardId(){
while (true) {
String cardid = "";
Random n = new Random();
for (int i = 0; i < 8; i++) {
int data = n.nextInt(10);
cardid += data;
}
// 判断cardid中记住的卡号是否与其他账号的卡号重复
Account acc = getAccountByCardId(cardid);
if (acc == null){
return cardid;
}
}
}
/* 根据卡号查询账号对象返回 */
private Account getAccountByCardId(String card){
//遍历全部对象
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
//判断这个账户对象acc中等卡号是否是我们要找的卡号
if (acc.getCardId().equals(card)){
return acc;
}
}
return null; //查无次账号
}
}
Test类
public class Test {
public static void main(String[] args) {
ATM atm = new ATM();
atm.start();
}
}
文章来源:https://blog.csdn.net/SU_mu147/article/details/134946318
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!