更进ATM

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.InputMismatchException;
import java.util.Scanner;

//ATM机
public class ATMMachine {
//所有用户信息
private UserInfo[] allUsers;
//当前操作用户信息
private UserInfo user;
// 现金
private int cash;
// 现金容量上限
public static final int MAX_CASH = 200000;
// 存取上限
public static final int GET_SET_MAX = 2000;

public ATMMachine() {
// 预载入用户信息---文件读操作
this.allUsers = FileOperation.readFile();
// this.allUsers = new UserInfo[5];
// for (int i = 0; i < allUsers.length; i++) {
// this.allUsers[i] = new UserInfo("zhang" + i, "123456" + i,
// 10000 + i * 1000);
// }
this.cash = 100000;
}

// 运行
public void run() {
this.welcome();
boolean flag = this.login();
if (flag) {
System.out.println("用户" + this.user.getUsername() + "于" +
this.getDate()+ "登录成功,欢迎您!");
while (true) {
int choice = this.choiceMenu();
switch (choice) {
case 1:
this.query();
break;
case 2:
this.storeMoney();
break;
case 3:
this.getMoney();
break;
case 4:
this.changePwd();
break;
case 5:
this.exit();
break;
default:
System.out.println("对不起,没有该选项!");
break;
}
}
} else {
System.out.println("您的账户被冻结!请到柜台处理!");
}
}

// 显示欢迎
private void welcome() {
System.out.println("******************************");
System.out.println("*********欢**迎**登**录*********");
System.out.println("******************************");
System.out.println("*********爱存不存银行ATM*********");
System.out.println("******************************");
System.out.println("*****************version1.0***");
}

// 登录
private boolean login() {
Scanner scan = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请输入用户名:");
String inputName = scan.next();
System.out.println("请输入密码:");
String inputPwd = scan.next();
for (UserInfo tmp : allUsers) {
if (tmp.getUsername().equals(inputName)
&& tmp.getPassword().equals(inputPwd)) {
this.user = tmp;
return true;
}
}
System.out.println("输入有误!您还有" + (2 - i) + "次机会");
}
return false;
}

// 选择菜单
private int choiceMenu() {
int choice = 0;
Scanner scan = new Scanner(System.in);
System.out.println("请选择您要执行的操作:");
System.out.println("1、查询;2、存款;3、取款;4、修改密码;5、退出");

String choiceStr = scan.next();
if(choiceStr.matches("[1-5]")){
choice = Integer.parseInt(choiceStr);
}

return choice;
}

// 查询余额
private void query() {
//直接显示user对象中的account属性值
System.out.println("您当前的余额是:" + user.getAccount() + "元!");
}

// 存钱
private void storeMoney() {
//1、接收用户输入
//2、判断--不能为0,不能为负,不能不是100的倍数,不能超过存取上限,不能超过现金容量--给出提示
//3、判断通过--加现金,加余额
System.out.println("请输入您要存储的金额:");
String inputMoney = new Scanner(System.in).next();

if(inputMoney.matches("(20|1[0-9]|[1-9])00")){
int money = Integer.parseInt(inputMoney);
if(money + this.cash > this.MAX_CASH){
System.out.println("对不起,本机容量不足!");
}else{
this.cash += money;
this.user.setAccount(this.user.getAccount() + money);
//文件写操作
FileOperation.writeFile(this.allUsers);
System.out.println("您于" + this.getDate() + "成功存款" + money + "元!");
}
}else{
System.out.println("请输入有效金额!本机只提供2000以内的百元服务!");
}
}

// 取款
private void getMoney() {
System.out.println("请输入您要取出的金额:");
String inputMoney = new Scanner(System.in).next();
if(inputMoney.matches("(20|1[0-9]|[1-9])00")){
int money = Integer.parseInt(inputMoney);
if(money >= this.cash){
System.out.println("对不起,本机现金不足!");
}else if(money > this.user.getAccount() ){
System.out.println("对不起,您的账户上余额不足!");
}else{
this.user.setAccount(this.user.getAccount() - money);
this.cash -= money;
//文件写操作
FileOperation.writeFile(this.allUsers);
System.out.println("您于" + this.getDate() + "成功取款" + money + "元!");
}
}else{
System.out.println("请输入有效金额!本机只提供2000以内的百元服务!");
}
}

// 修改密码
private void changePwd() {
Scanner scan = new Scanner(System.in);
System.out.println("请输入老密码:");
String oldPwd = scan.next();
System.out.println("请输入新密码:");
String newPwd = scan.next();
System.out.println("再次输入新密码:");
String rePwd = scan.next();

if(!oldPwd.equals(this.user.getPassword())){
System.out.println("老密码输入错误!");
}else if(!newPwd.equals(rePwd)){
System.out.println("两次密码不一致!");
}else{
this.user.setPassword(newPwd);
//文件写操作
FileOperation.writeFile(this.allUsers);
System.out.println("您于" + this.getDate() + "成功修改密码!");
}

}

// 退出
private void exit() {
System.out.println("谢谢您的使用!请收好您的卡!");
System.exit(0);
}

//格式化日期
private String getDate(){
String date = "";
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");
date = sdf.format(now);
return date;
}

}

//用户信息
public class UserInfo {
//账号
private String username;
//密码
private String password;
//余额
private float account;

public UserInfo(){

}

public UserInfo(String username, String password, float account) {
this.username = username;
this.password = password;
this.account = account;
}

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public float getAccount() {
return account;
}
public void setAccount(float account) {
this.account = account;
}
}

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;

public class FileOperation {

//读文件
public static UserInfo[] readFile(){
//把文件中的数据先读到Properties容器中
Properties S=new Properties();
try {
S.load(new FileInputStream("User.properties"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//把Properties中的字符串数据转换为UserInfo对象,放到UserInfo[]中
UserInfo[] B=new UserInfo[S.size()];
for(int i=0;i<S.size();i++){
String A=S.getProperty(Integer.toString(i));
String[] values = A.split("&");
UserInfo user=new UserInfo(values[0],values[1],Float.parseFloat(values[2]) );
B[i]=user;
}
return B;
}

//写文件
public static void writeFile(UserInfo[] allUsers){
//把UserInfo[]中的数据,放入到Properties中
Properties S=new Properties();
UserInfo[] A = allUsers;
for(int i=0;i<A.length;i++){
S.setProperty(Integer.toString(i), A[i].getUsername()+"&"+A[i].getPassword()+"&"+A[i].getAccount());
}
//把Properties中的数据写入文件中

try {
S.store(new FileOutputStream("User.properties"), null);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public class TestMain {

public static void main(String[] args) {
// TODO Auto-generated method stub

ATMMachine machine = new ATMMachine();
machine.run();

// System.out.println((int)(Math.random() * 10));

}

}

时间: 2024-08-27 04:11:40

更进ATM的相关文章

如何让CMDB配置维护更贴近人性

近来很多行业内的大佬关于CMDB连连发声,CMDB的关注度持续高涨,CMDB的前生就是长满雀斑的丑媳妇,扭扭捏捏不受待见这么多年,终于熬出头要见公婆了.哎,她的贤惠谁能懂? 言归正传,在拜读了多篇大牛的文章发现,提及配置维护的内容很少,有也是一带而过.但在过去和用户的接触过程中,发现配置维护一直是一个无法回避的大难题,一块难啃的骨头.业界产品的普遍做法主要是依靠自动发现+人工维护+流程控制.对于自动发现.流程控制,我想只能解决配置维护的60%的工作,真正出现问题的是占用40%工作量的人工维护.由

【转】使用 WebGL 进行 3D 开发,第 2 部分: 使用 WebGL 库以更少的编码做更多的事情

转自HTML5开发社区 使用 WebGL 进行 3D 开发,第 1 部分: WebGL 简介使用 WebGL 进行 3D 开发,第 2 部分: 使用 WebGL 库以更少的编码做更多的事情使用 WebGL 进行 3D 开发,第 3 部分: 添加用户交互 WebGL API 让 JavaScript 开发人员能够直接利用如今的 PC 及移动设备硬件中强大的内置 3D 图形加速功能.现代浏览器透明地支持 WebGL,它使人们可以为主流 Web 用户创建高性能的 3D 游戏.应用程序以及 3D 增强的

一个简单ATM系统的UML建模——Use Case图

用况名:login简述:客户需要插入银行卡进ATM并输入密码进行登录操作参与者:Guest即持卡人细节:(1)客户将银行卡插入ATM插卡处等待读取信息(2)ATM提示输入银行卡密码(密码6位数)(3) i)若客户输入正确密码,ATM进入业务选择界面 ii)若客户输入错误密码,ATM提示密码错误,返回(2)后置条件: ATM进入业务选择界面例外:(1)客户插入的银行卡方向错误,ATM不能正常进行磁条读写,此时ATM将银行卡从插槽退回.(2)若客户输入错误密码,ATM需要提示密码错误,并返回输入密码

双态运维:如何让CMDB配置维护更贴近人性

近来很多行业内的大佬关于CMDB连连发声,CMDB的关注度持续高涨,CMDB的前生就是长满雀斑的丑媳妇,扭扭捏捏不受待见这么多年,终于熬出头要见公婆了.哎,她的贤惠谁能懂? 言归正传,在拜读了多篇大牛的文章发现,提及配置维护的内容很少,有也是一带而过.但在过去和用户的接触过程中,发现配置维护一直是一个无法回避的大难题,一块难啃的骨头.业界产品的普遍做法主要是依靠自动发现+人工维护+流程控制.对于自动发现.流程控制,我想只能解决配置维护的60%的工作,真正出现问题的是占用40%工作量的人工维护.由

基于AOP的MVC拦截异常让代码更优美

与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂亮’终归有个好的思想,其中类似于AOP的思想,就在其中体现的淋漓尽致,今天本文主要讨论的是基于AOP思想构成的‘异常过滤器’.我们的目的只有一个,让try...catch...无处盾形,让代码更健壮优美. 一.理解mvc里filter是怎么运行的 老外的一篇文章是这样的草图 通过翻译中文是这样的 其

如何更高效的使用谷歌解决问题

面对问题的态度 在自学编程的过程中,不可避免的会遇到各种大大小小的问题.遇到了问题,不要害怕也不要焦虑,而是要保持一种兴奋的状态. 如果把编程比作一场游戏,那编程遇到的问题就好比是游戏中的怪兽.杀死了怪兽,就获得了经验和金币.同样,解决了编程中的问题,就获得了相应的经验和技能,在技术的道路上更进了一步. 什么时候去麻烦别人 遇到了问题,可以选择向别人发问. 但是在麻烦别人之前,最好自己先用谷歌检索一下答案.正所谓“太阳底下无新鲜事”,检索之后,你会发现你遇到的大部分问题,别人也曾遇到过,而且已经

[数据库设计]数据库设计三大范式

为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个: 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式. 第一范式的合理遵循需要根据系统的实际需求来定.比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个

数据库设计的三大范式

数据库设计的三大范式 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个: 1.第一范式 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式. 第一范式的合理遵循需要根据系统的实际需求来定.比如某些数据库系统中需要用到"地址"这个属性,本来直接将"

mysql的三大范式

关系数据库的几种设计范式介绍: 第一范式:确保每列的原子性(强调的是列的原子性,即列不能够再分成其他几列). 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名.编号.地址.--)其中"地址"列还可以细分为国家.省.市.区等. 第二范式:在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关(一是表必须有一个主键:二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的部分) 如果一个关系满足第一范式,并且除了