准备用来写每天完成什么了
今天把ATM分包了一下,最开始那个集合不知道为什么每次注册好以后测试发现无论注册多少次登录的时候就是没有集合里面没有东西,找了好久原因终于发现了因为我在主菜单页面这样写着了:
public void start() {
while (true) {
System.out.println("--------------------------------欢迎来到南瓜ATM系统--------------------------------");
System.out.println("请选择你要进行的操作:\n1.注册一个新的账户:\n2.登录账号:\n3.退出系统结束操作");
String n = sc.next();
switch (n) {
case "1":
Method method=new Method();//注意!!!!
method.createAccount();
break;
case "2":
Method me=new Method();//注意!!!!
me.login();
break;
case "3":
System.exit(0);
default:
System.out.println("没有此功能请重新选择你需要进行的操作");
break;
}
}
}
}
就是在(//注意!!!!)这个地方,因为外面有一个while循环,每一次都是重新new了一个对象出来!应该要是同一个method才对,因为我在method里面new了账户对象,method不一样账户也就不一样!!!!我找了好久终于是发现了。应该要这样写
public void start() {
Method me=new Method();
while (true) {
System.out.println("--------------------------------欢迎来到南瓜ATM系统--------------------------------");
System.out.println("请选择你要进行的操作:\n1.注册一个新的账户:\n2.登录账号:\n3.退出系统结束操作");
String n = sc.next();
switch (n) {
case "1":
me.createAccount();
break;
case "2":
me.login();
break;
case "3":
System.exit(0);
default:
System.out.println("没有此功能请重新选择你需要进行的操作");
break;
}
}
}
好了,今天算是把包分了一下,测试的时候又补了几个方法进去:
我暂时一共是分了三个包,货币类还没有弄,都不知道怎么把他补进去了,开始时的时候还说把账户包呈现一个继承思想,弄个account父类,弄两个子类一个普通用户,一个管理员,看之后怎么把他搞进去吧,有点乱了,没有很好的体现面向对象那种感觉,还在不断改:
先看我的Account包:
package Account;
public class Account {
private String cardId;
private String userName;
private String sex;
private String password;//密码
private double money;//剩余钱
private double limit;//每次取钱的限额
public Account(String cardId, String userName, String sex, String password, double money, double limit) {
this.cardId = cardId;
this.userName = userName;
this.sex = sex;
this.password = password;
this.money = money;
this.limit = limit;
}
public Account() {
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName+(sex.equals("男") ? "先生" : "女士");
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String 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类:
package Main;
import java.util.Scanner;
public class ATM {
private Scanner sc = new Scanner(System.in);
//展示欢迎页面
public void start() {
Method me=new Method();
while (true) {
System.out.println("--------------------------------欢迎来到南瓜ATM系统--------------------------------");
System.out.println("请选择你要进行的操作:\n1.注册一个新的账户:\n2.登录账号:\n3.退出系统结束操作");
String n = sc.next();
switch (n) {
case "1":
me.createAccount();
break;
case "2":
me.login();
break;
case "3":
System.exit(0);
default:
System.out.println("没有此功能请重新选择你需要进行的操作");
break;
}
}
}
}
再就是一个很重要的方法包,其实我感觉我的方法包整理的还行都写在一块了,但是我真的感觉if方法太多了,还有那个while循环,看我到后面学着学着能不能用什么东西替代
package Main;
import Account.Account;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
import Account.Account;
public class Method {
private ArrayList<Account> accounts=new ArrayList<>();
private Scanner sc=new Scanner(System.in);
//注册
//创建一个新的账户并把这个账户加在已有账户集合里面
public void createAccount(){
System.out.println("--------------------------------欢迎进入到南瓜ATM账户开户页面--------------------------------");
Account account=new Account();
System.out.println("请输入你的姓名:");
account.setUserName(sc.next());
while (true) {
System.out.println("请输入你的性别:");
String sex=sc.next();
if(sex.equals("男")||sex.equals("女")){
account.setSex(sex);
break;
}else{
System.out.println("你输入的性别有误哦,只能是男或者女,请输入正确的性别:");
}
}
while (true) {
System.out.println("请输入你的账户密码:");
String password=sc.next();
if(password.length()!=6){
System.out.println("密码需要为六位数哦~~~");
}else {
System.out.println("请确认你的账户密码:");
String word = sc.next();
if (word.length() != 6) {
System.out.println("第二次输入的密码也需要为六位数哦~~~\n以为你跳转到第一次输入密码的地方");
}else {
if (password.equals(word)) {
account.setPassword(password);
break;
} else {
System.out.println("你两次输入的密码不一致哦~~请重新再试一次看看:");
}
}
}
}
while (true) {
System.out.println("请您输入你的取现额度:");
double limit=sc.nextDouble();
if(limit>0){
account.setLimit(limit);
break;
}else{
System.out.println("取现额度不能小于0哦~~请重新输入");
}
}
//需要为这个开户的人生成一个卡号,应该是由系统自己生成的一个随机卡号且这个卡号不能与已经有的卡号重复!!!!
String newcardid=createCardId();
account.setCardId(newcardid);
//把账户加入到已有账户里面去
accounts.add(account);
//需要给一个提示告诉用户是否开户成功!!!
System.out.println("恭喜"+account.getUserName()+"开户成功,您的卡号是:"+account.getCardId());
}
//定义一个新的方法:
// 返回一个八位数字的银行卡号且这个卡号不和已经创建好的卡号重复(做一个判断)
private String createCardId(){
while (true) {
String cardid="";
Random r=new Random();
//循环8次,每次随机产生一个各位数字然后连接起来组成一个卡号
for (int i = 0; i < 8; i++) {
int data=r.nextInt(10);
cardid += data;//返回0~9的数字
}
//判断卡号是否重复;
Account ac=getAccountByCardId(cardid);
if(ac==null){
return cardid;
}
}
}
//根据卡号查找对象(为什么要重新创造一个方法?)
// 因为这个卡号查找对象不仅判断卡号是否重复的时候要用,并且登陆的时候也要用;
private Account getAccountByCardId(String cardId){
//在accounts里面寻找
for (int i = 0; i < accounts.size(); i++) {
Account ac=accounts.get(i);
if(ac.getCardId().equals(cardId)){
return ac;
}
}
return null;
}
//登录
public void login(){
System.out.println("--------------------------------欢迎进入到南瓜ATM登录页面--------------------------------");
//判断系统里面是否有账户
if(accounts.size()==0){
System.out.println("当前系统里没有账户无法登录,请先开户再登陆");
return;
}
while (true) {
System.out.println("请先输入你的卡号:");
String cardid=sc.next();
if(getAccountByCardId(cardid)==null){
//想不想回到注册,还是输错了卡号
while (true) {
System.out.println("你是否还没有注册,如果想要注册请回答:yes 如果只是输错卡号请回答:no");
String s=sc.next();
if(s.equals("yes")){
System.out.println("已经为你跳转到注册页面");
createAccount();
System.out.println("已为你跳到登录页面,请继续你的操作");
break;
}else if(s.equals("no")){
break;
}else{
System.out.println("请重新输入yes或者no");
}
}
}else{
//登陆进去后
int count=0;
System.out.println("请输入你的密码");
while (true) {
String password=sc.next();
if(getAccountByCardId(cardid).getPassword().equals(password)){
System.out.println("恭喜"+getAccountByCardId(cardid).getUserName()+"登录成功");
//登录以后需要进行的操作(单独的弄了一个方法)
showLogin(getAccountByCardId(cardid));
return;
}else{
count++;
if(count==3){
System.out.println("你已经连续三次输错密码了哦~~请稍后再试");
return;
}
System.out.println("密码错误请重新输入你的密码");
}
}
//登录进去处理完后
}
}
}
//展示操作页面
private void showLogin(Account ac){
while (true) {
System.out.println(ac.getUserName()+"请选择你要进行的操作:\n1.取款:\n2.存款:\n3.转账:\n4.查询账户:\n" +
"5.修改密码:\n6.注销账号:\n7.返回首页面: \n8.退出系统结束操作");
Scanner sc=new Scanner(System.in);
switch (sc.next()) {
case "1":
drawMoney(ac);
break;
case "2":
depositMoney(ac);
break;
case "3":
transferMoney(ac);
break;
case "4":
showAccount(ac);
break;
case "5":
updataPassWord(ac);
break;
case "6":
if(deleteAccount(ac)){
return;
}else{
break;
}
case "7":
System.out.println("你已经返回到了首页面");
return;
case "8":
System.out.println("你已经结束了操作并退出了系统");
System.exit(0);
default:
System.out.println("没有此功能请重新选择你需要进行的操作");
}
}
}
//1.取钱
private void drawMoney(Account ac) {
System.out.println("================================您现在在进行取款操作================================");
if(ac.getMoney()<100){
System.out.println("你的账户余额不足一百元不允许取钱");
return;
}
while (true){
System.out.println("请输入你需要取钱的金额:");
double money=sc.nextDouble();
if(money>ac.getMoney()){
System.out.println("您当前的余额为"+ac.getMoney()+"并不能取出"+money+"请输入比当前账号小的金额再进行操作");
}else if(money>ac.getLimit()){
System.out.println("你当前取钱金额大于了最大取现额度,你的取现额度为:"+ac.getLimit()+"请输入比额度小的数额再取钱");
}else{
ac.setMoney(ac.getMoney()-money);
System.out.println("恭喜你已经取出"+money+"钱成功,取钱后总余额为"+ac.getMoney());
break;
}
}
}
//2.存款
private void depositMoney(Account ac){
while (true) {
System.out.println("================================您现在在进行存款操作================================");
System.out.println("请输入你存款的金额:");
double money=sc.nextDouble();
if(money<0){
System.out.println("你输入的金额不正确必须要输入一个大于0的金额数");
}else{
ac.setMoney(money+ac.getMoney());
System.out.println("恭喜你存入"+money+"钱成功,存钱后总余额为"+ac.getMoney());
return;
}
}
}
//3.转账
private void transferMoney(Account ac) {
System.out.println("================================您现在在进行转账操作================================");
if(ac.getMoney()==0){
System.out.println("你自己的卡里面没有钱没有办法给别人转账");
return;
}
if(accounts.size()<2){
System.out.println("账户里面除你之外没有别的用户了,无法向别人转账");
return;
}
while (true) {
System.out.println("请输入你想选择转账的人的卡号");
String cardid=sc.next();
if(getAccountByCardId(cardid)!=null){
Account a=getAccountByCardId(cardid);
if(ac.getCardId().equals(cardid)){
System.out.println("你是想自己给自己转账吗这是不被允许的哦,请不要自己给自己转账");
break;
}
System.out.println("请输入*"+a.getUserName().substring(1)+"的姓氏确认向*"
+a.getUserName().substring(1)+"转账");//一个*号加上从第一个截取的名字差不多就是用*号替换了姓氏
String s=sc.next();
String st=""+a.getUserName().charAt(0);
if(s.equals(st)){
System.out.println("输入姓氏正确,请输入你想要转账的金额:");
while (true) {
double money=sc.nextDouble();
//假设转账不受金额限制,所以不进行金额限制的判断
if(money>ac.getMoney()){
System.out.println("你所输入的转账金额比你的余额还大这个是不被允许的," +
"你当前的余额为"+ac.getMoney()+"钱\n请输入比他小的金额");
}else if(money<0){
System.out.println("转账金额不能为负数哦~~请重新操作\n请输入你想转入的金额:");
}else{
ac.setMoney(ac.getMoney()-money);
a.setMoney(a.getMoney()+money);
System.out.println("你已经成功向"+a.getUserName()+"转账"+money+"钱," +
"当前你的账户余额还剩"+ac.getMoney()+"钱");
return;
}
}
}else{
System.out.println("你输入的姓氏有问题以为你跳转到输入卡号的地方");
}
}else {
if (cardid.length() != 8) {
System.out.println("你输入的卡号有误,卡号应有八位数字,请重新输入卡号");
}else{
System.out.println("你所输入的卡号不存在,请确认你所输入的卡号正确。" +
"请选择你要继续的操作:1.重新输入卡号\n2.退出转账操作");
String s = sc.next();
switch (s) {
case "1":
break;
case "2":
return;
}
}
}
}
}
//4.查询账户(展示当前账户信息)
private void showAccount(Account ac){
System.out.println("================================您当前的账户信息如下================================");
System.out.println("你的卡号是:"+ac.getCardId());
System.out.println("户 主是:"+ac.getUserName());
System.out.println("户主性别是:"+ac.getSex());
System.out.println("卡里余额是:"+ac.getMoney());
System.out.println("取现额度是:"+ac.getLimit());
}
//5.修改密码
private void updataPassWord(Account ac) {
System.out.println("================================您现在在进行账户密码修改操作================================");
System.out.println("请输入你当前账户的密码");
int count=0;
while (true) {
String s=sc.next();
if(s.equals(ac.getPassword())){
while (true) {
System.out.println("请输入你的新密码");
String s1=sc.next();
System.out.println("请再次输入你的新密码");
String s2=sc.next();
if(s1.equals(s2)){
ac.setPassword(s1);
System.out.println("恭喜你修改密码成功!!!你当前的密码为:"+ac.getPassword());
return;
}else{
System.out.println("你两次输入的密码不一致请重新尝试");
System.out.println("如果你突然不想更改密码请输入“1”");
String s3=sc.next();
if(s3.equals("1")){
return;
}
}
}
}else{
count++;
if(count==3){
System.out.println("你已经连续输错了3次密码,请稍后再试");
break;
}
System.out.println("你当前输入的密码不正确,请重新输入密码");
}
}
}
//6.注销账号
private boolean deleteAccount(Account ac) {
System.out.println("================================您现在在进行销户操作================================");
System.out.println("请问您确认要销户吗?\n输入“确认”即可进行销户操作\n输入“不确认”取消销户操作 ");
String s=sc.next();
switch(s){
case "确认":
if(ac.getMoney()>0){
System.out.println("您的账户里面还有余额"+ac.getMoney()+"钱,请取出后再注销账户");
return false;
}else{
accounts.remove(ac);
System.out.println("你的账户已成功销户");
return true;
}
default:
System.out.println("已经为你取消销户操作");
return false;
}
}
}
//修改密码时对密码进行八位数的限制,登录时对密码进行八位数的限制
//销户时用户可以选择不取钱不要了,(再做一次确认是否不要了,系统自动注销账号)???这个功能是否需要
//当要求输入数字时用户输入字符串(或者反过来时)需要进行异常处理提示用户;
//货币类型插入
//I/O流操作没有实现
//继承,多态思想没有体现(看看用户类型那里应该如何操作)
//暂时大概框架只有这么多
今天刚学自定义异常感觉可以在那个输入数字,但是我输入的是字符串那里弄一个自定义异常。今天先到这里