#面向对象程序设计PTA作业# 第4、5、6次作业总结(三)

一、前言

本篇分析题目集6:7-4、7-5

1. 三次题目集涉及的的知识点:

  • 面向对象技术特性之封装性、字符串处理(4:7-1)
  • 面向对象程序设计方法之聚合(5:7-5,7-6)
  • 面向对象程序设计之继承(6:7-4,7-5)

2. 题量、难度情况

这三次题目集的题量和难度对于我来说比较大,是我第一次真真切切感受到,软件工程专业的作业不熬几个大夜根本写不完。难度有高有低,跨度还是很明显的,简单题一拿到手里就有思路可以着手来写,但是复杂题往往拿到手里没有什么思路,一方面复杂题(比如6:7-4)的需求就很复杂,阅读量也比较大,需要多读几遍题才能理解需求,另一方面复杂题代码量比较大,编码过程本身就比较耗时,在长达五六个小时的编码过程中还需要时刻注意遵循需求,因此复杂题对我而言还是比较困难。


二、设计与分析

(一)题目及代码

题目集6:7-4

作业说明:OO作业7-4题目说明.pdf

题目7-5 7-4 ATM机类结构设计(一) 分数 20 作者 段喜龙 单位 南昌航空大学 设计ATM仿真系统,具体要求参见作业说明。

输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:

存款、取款功能输入数据格式:
卡号 密码 ATM机编号 金额(由一个或多个空格分隔),
其中,当金额大于0时,代表取款,否则代表存款。
查询余额功能输入数据格式:
卡号
输出格式:
①输入错误处理

如果输入卡号不存在,则输出Sorry,this card does not exist.。
如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.。
如果输入银行卡密码错误,则输出Sorry,your password is wrong.。
如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.。
如果检测为跨行存取款,则输出Sorry,cross-bank withdrawal is not supported.。
②取款业务输出

输出共两行,格式分别为:

[用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]

当前余额为¥[金额]

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

③存款业务输出

输出共两行,格式分别为:

[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]

当前余额为¥[金额]

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

④查询余额业务输出

¥[金额]

金额保留两位小数。

输入样例1:
在这里给出一组输入。例如:

6222081502001312390 88888888 06 -500.00

输出样例1:
在这里给出相应的输出。例如:

张无忌在中国工商银行的06号ATM机上存款¥500.00
当前余额为¥10500.00
输入样例2:
在这里给出一组输入。例如:

6217000010041315709 88888888 02 3500.00

输出样例2:
在这里给出相应的输出。例如:

杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥6500.00
输入样例3:
在这里给出一组输入。例如:

6217000010041315715

输出样例3:
在这里给出相应的输出。例如:

¥10000.00
输入样例4:
在这里给出一组输入。例如:

6222081502001312390 88888888 06 -500.00
6222081502051320786 88888888 06 1200.00
6217000010041315715 88888888 02 1500.00
6217000010041315709 88888888 02 3500.00
6217000010041315715

输出样例4:
在这里给出相应的输出。例如:

张无忌在中国工商银行的06号ATM机上存款¥500.00
当前余额为¥10500.00
韦小宝在中国工商银行的06号ATM机上取款¥1200.00
当前余额为¥8800.00
杨过在中国建设银行的02号ATM机上取款¥1500.00
当前余额为¥8500.00
杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥5000.00
¥5000.00
代码长度限制
20 KB
时间限制
400 ms
内存限制
64 MB

提交代码
 
   import com.sun.jdi.connect.spi.TransportService;

import java.util.Objects;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BankAccount[] countList = new BankAccount[200];
Agent opertor = new Agent();
StringBuffer allMassage = new StringBuffer();
UnionPay ChinaPay = opertor.initialize(countList);
opertor.InputRequess(allMassage);
String[] massage = allMassage.toString().split("\$");
for(int i = 0; i < massage.length; i++){
if(!opertor.dealMassage(massage[i],ChinaPay)){
break;
}
}
}
}
class UnionPay{
Bank[] bank;

public Bank[] getBank() {
    return bank;
}

public void setBank(Bank[] bank) {
    this.bank = bank;
}

}
class Bank{
BankATM ATM;
BankAccount[] bankAccounts;
String name;
User[] bankUsers;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public BankATM getATM() {
    return ATM;
}

public void setATM(BankATM ATM) {
    this.ATM = ATM;
}

public BankAccount[] getBankAccounts() {
    return bankAccounts;
}

public void setBankAccounts(BankAccount[] bankAccounts) {
    this.bankAccounts = bankAccounts;
}

}
class User{
String userName;
}
class BankATM{
String[] ATMcode;

public String[] getATMcode() {
    return ATMcode;
}

public void setATMcode(String[] ATMcode) {
    this.ATMcode = ATMcode;
}

}
class BankAccount{
String UserName;
int belongBank;
int countType;
double[] balance;
String AccountId;
String Password = "88888888";
String belongCard;
BankAccount(){

}
public BankAccount(double[] balance, String userName, int belongBank,String accountId, int countType, String belongCard) {
    this.UserName = userName;
    this.belongBank = belongBank;
    this.countType = countType;
    this.AccountId = accountId;
    this.belongCard = belongCard;
    this.balance = balance;
}

public int getCountType() {
    return countType;
}

public void setCountType(int countType) {
    this.countType = countType;
}

public String getUserName() {
    return UserName;
}

public void setUserName(String userName) {
    UserName = userName;
}

public int getBelongBank() {
    return belongBank;
}

public void setBelongBank(int belongBank) {
    this.belongBank = belongBank;
}

public double[] getBalance() {
    return balance;
}

public void setBalance(double balance) {
    this.balance[0] = balance;
}

public String getAccountId() {
    return AccountId;
}

public void setAccountId(String accountId) {
    AccountId = accountId;
}

public String getPassword() {
    return Password;
}

public void setPassword(String password) {
    Password = password;
}

public String getBelongCard() {
    return belongCard;
}

public void setBelongCard(String belongCard) {
    this.belongCard = belongCard;
}

}
class Agent{
UnionPay initialize(BankAccount[] list){
UnionPay ChinaUnionPay = new UnionPay();
Bank JSbank = new Bank();
JSbank.setName("中国建设银行");
Bank GSbank = new Bank();
GSbank.setName("中国工商银行");
Bank[] banks = {JSbank,GSbank};
ChinaUnionPay.setBank(banks);
BankATM JSATM = new BankATM();
BankATM GSATM = new BankATM();
String[] jsATMList = {"01","02","03","04"};
String[] gsATMList = {"05","06"};
JSbank.setATM(JSATM);
GSbank.setATM(GSATM);
JSATM.setATMcode(jsATMList);
GSATM.setATMcode(gsATMList);
double[] balanceYG = new double[1];
double[] balanceGJ = new double[1];
double[] balanceZWJ = new double[1];
double[] balanceWXB = new double[1];
balanceYG[0] = 10000;
balanceGJ[0] = 10000;
balanceZWJ[0] = 10000;
balanceWXB[0] = 10000;
list[0] = new BankAccount(balanceYG,"杨过",1,"3217000010041315709",1,"6217000010041315709");
list[1] = new BankAccount(balanceYG,"杨过",1,"3217000010041315709",1,"6217000010041315715");
list[2] = new BankAccount(balanceYG,"杨过",1,"3217000010041315715",1,"6217000010041315718");
//
list[3] = new BankAccount(balanceGJ,"郭靖",1,"3217000010051320007",1,"6217000010051320007");
//
list[4] = new BankAccount(balanceZWJ,"张无忌",2,"3222081502001312389",1,"6222081502001312389");
list[5] = new BankAccount(balanceZWJ,"张无忌",2,"3222081502001312390",1,"6222081502001312390");
list[6] = new BankAccount(balanceZWJ,"张无忌",2,"3222081502001312399",1,"6222081502001312399");
//
list[7] = new BankAccount(balanceWXB,"韦小宝",2,"3222081502051320785",1,"6222081502051320785");
list[8] = new BankAccount(balanceWXB,"韦小宝",2,"3222081502051320786",1,"6222081502051320786");
BankAccount[] JSbankAccount = {list[0],list[1],list[2],list[3]};
BankAccount[] GSbankAccount = {list[4],list[5],list[6],list[7],list[8]};
JSbank.setBankAccounts(JSbankAccount);
GSbank.setBankAccounts(GSbankAccount);
return ChinaUnionPay;
}
String[] InputRequess(StringBuffer requess){
Scanner in = new Scanner(System.in);
String buf;
for(int i = 0; ;i++){
buf = in.nextLine();
buf = buf.replaceAll("[ ]{2,}"," ");
if(!buf.matches("[#]")){
requess.append(buf+"$");
}else{
break;
}
}
String[] massageList = buf.split("\$");
return massageList;
}

public boolean dealMassage(String massageList, UnionPay ChinaUnionPay){
    String[] massageParts = massageList.replaceAll("[ ]+"," ").split("[^\\d\\.-]");
    boolean inputValid = true;
    boolean iscardIDValid = false;
    boolean isPassWordValid = true;
    boolean isATMidValid = false;
    boolean iskuahangQK = false;
    boolean isCQvalid = false;// 存取款是否成功判断
    int belongBank = 0;
    double Money = 0;
    //先确定是四个部分
    if(massageParts.length != 4){
        inputValid = false;
    } else if(!Objects.equals(massageParts[1], "88888888")){
        isPassWordValid = false;
    }else{
        Money = Double.parseDouble(massageParts[3]);
    }
    if(inputValid) {
        int i = 0, j = 0;
        for (i = 0; i < ChinaUnionPay.getBank()[0].bankAccounts.length; i++) {
            if (Objects.equals(ChinaUnionPay.getBank()[0].bankAccounts[i].getBelongCard(), massageParts[0])) {
                iscardIDValid = true;
                belongBank = 1;
                break;
            }
        }
        if (!iscardIDValid) {
            i = -1;
        }
        if (i == -1) {
            for (j = 0; j < ChinaUnionPay.getBank()[1].bankAccounts.length; j++) {
                if (Objects.equals(ChinaUnionPay.getBank()[1].bankAccounts[j].getBelongCard(), massageParts[0])) {
                    iscardIDValid = true;
                    belongBank = 2;
                    break;
                }
            }
        }
        if (!iscardIDValid) {
            j = -1;
        }
        int k = 0, g = 0;
        for (k = 0; k < ChinaUnionPay.getBank()[0].getATM().ATMcode.length; k++) {
            if (Objects.equals(ChinaUnionPay.getBank()[0].getATM().ATMcode[k], massageParts[2]) && belongBank == 1) {
                // 没跨行,进行存取款
                isATMidValid = true;
                if (Money >= 0 && Money < ChinaUnionPay.getBank()[0].bankAccounts[i].getBalance()[0] || Money < 0) {
                    ChinaUnionPay.getBank()[0].bankAccounts[i].getBalance()[0] = (ChinaUnionPay.getBank()[0].bankAccounts[i].getBalance()[0] - Money);
                    isCQvalid = true;

                    break;
                }
            } else if (Objects.equals(ChinaUnionPay.getBank()[0].getATM().ATMcode[k], massageParts[2]) && belongBank == 2) {
                //跨行
                iskuahangQK = true;
                isATMidValid = true;
                break;
            }
        }
        if (!isCQvalid || iskuahangQK) {
            k = -1;
        }
        for (g = 0; g < ChinaUnionPay.getBank()[1].getATM().ATMcode.length; g++) {
            if (Objects.equals(ChinaUnionPay.getBank()[1].getATM().ATMcode[g], massageParts[2]) && belongBank == 2) {
                // 没跨行,进行存取款
                isATMidValid = true;
                if (Money >= 0 && Money < ChinaUnionPay.getBank()[1].bankAccounts[j].getBalance()[0] || Money < 0) {
                    ChinaUnionPay.getBank()[1].bankAccounts[j].getBalance()[0] = (ChinaUnionPay.getBank()[1].bankAccounts[j].getBalance()[0] - Money);
                    isCQvalid = true;
                    break;
                }
            } else if (Objects.equals(ChinaUnionPay.getBank()[1].getATM().ATMcode[g], massageParts[2]) && belongBank == 1) {
                //跨行
                iskuahangQK = true;
                isATMidValid = true;
                break;
            }
        }
        if (!isCQvalid || iskuahangQK) {
            g = -1;
        }
        int objeectAccount = -1;
        int objectBank = -1;
        int objectATM = -1;
        int objectResult = -1;
        if (i != -1) {
            objeectAccount = i;
            objectBank = 1;
        } else if (j != -1) {
            objeectAccount = j;
            objectBank = 2;
        }
        if (k != -1) {
            objectATM = k;
        } else if (g != -1) {
            objectATM = g;
        }
        if (Money > 0) {
            objectResult = 1;
        } else {
            objectResult = 0;
        }
        String[] result = {"存款", "取款"};
        if (inputValid && iscardIDValid && isPassWordValid && !iskuahangQK && isCQvalid && isATMidValid) {
            System.out.printf("%s在%s的%s号ATM机上%s¥%.2f\n", ChinaUnionPay.getBank()[objectBank - 1].getBankAccounts()[objeectAccount].getUserName()
                    , ChinaUnionPay.getBank()[objectBank - 1].getName(), ChinaUnionPay.getBank()[objectBank - 1].getATM().getATMcode()[objectATM], result[objectResult], Math.abs(Money));
            System.out.printf("当前余额为¥%.2f\n", ChinaUnionPay.getBank()[objectBank - 1].getBankAccounts()[objeectAccount].getBalance()[0]);
        }
    } else if(inputValid == false && massageList.matches("\\d+")){
        inputValid = true;
        boolean find = false;
        int i = 0;int j = 0;
        for(i = 0; i < ChinaUnionPay.getBank()[0].bankAccounts.length; i++){
            if(Objects.equals(ChinaUnionPay.getBank()[0].bankAccounts[i].getBelongCard(), massageParts[0])) {
                iscardIDValid = true;
                System.out.printf("¥%.2f\n",ChinaUnionPay.getBank()[0].bankAccounts[i].getBalance()[0]);
                return true;
            }
        }
        if(!iscardIDValid){
            i = -1;
        }
        if(i == -1){
            for(j = 0; j < ChinaUnionPay.getBank()[1].bankAccounts.length; j++){
                if(Objects.equals(ChinaUnionPay.getBank()[1].bankAccounts[j].getBelongCard(), massageParts[0])){
                    iscardIDValid = true;
                    System.out.printf("¥%.2f\n",ChinaUnionPay.getBank()[1].bankAccounts[j].getBalance()[0]);
                    return true;
                }
            }
        }
        if(!iscardIDValid){
            j = -1;
        }
    }
    if(inputValid == true){
        boolean flag = true;
        if(iskuahangQK && isATMidValid && isPassWordValid && iscardIDValid && isATMidValid&& flag){
            System.out.println("Sorry,cross-bank withdrawal is not supported.");
            flag = false;
        }
        if(!isCQvalid && isPassWordValid && isATMidValid && iscardIDValid&& flag){
            System.out.println("Sorry,your account balance is insufficient.");
            flag = false;
        }
        if(!isPassWordValid && isATMidValid && iscardIDValid&& flag){
            System.out.println("Sorry,your password is wrong.");
            flag = false;
        }
        if(!isATMidValid && iscardIDValid && flag) {
            System.out.println("Sorry,the ATM's id is wrong.");
            flag = false;
        }
        if(!iscardIDValid && flag){
            System.out.println("Sorry,this card does not exist.");
            flag = false;
        }
    }
    if(!inputValid || !iscardIDValid || !isPassWordValid || iskuahangQK || !isCQvalid || !isATMidValid){
        return false;
    }else{
        return true;
    }
}

}


题目集4:7-6
作业说明:OO作业7-6题目说明.pdf

题目7-5 7-5 ATM机类结构设计(二) 分数 34 作者 段喜龙 单位 南昌航空大学 设计ATM仿真系统,具体要求参见作业说明。 OO作业9-1题目说明.pdf

输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:

取款功能输入数据格式:
卡号 密码 ATM机编号 金额(由一个或多个空格分隔)
查询余额功能输入数据格式:
卡号
输出格式:
①输入错误处理

如果输入卡号不存在,则输出Sorry,this card does not exist.。
如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.。
如果输入银行卡密码错误,则输出Sorry,your password is wrong.。
如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.。
②取款业务输出

输出共两行,格式分别为:

业务:取款 [用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]

当前余额为¥[金额]

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

③查询余额业务输出

业务:查询余额 ¥[金额]

金额保留两位小数。

输入样例1:
在这里给出一组输入。例如:

6222081502001312390 88888888 06 500.00

输出样例1:
在这里给出相应的输出。例如:

业务:取款 张无忌在中国工商银行的06号ATM机上取款¥500.00
当前余额为¥9500.00
输入样例2:
在这里给出一组输入。例如:

6217000010041315709 88888888 06 3500.00

输出样例2:
在这里给出相应的输出。例如:

业务:取款 杨过在中国工商银行的06号ATM机上取款¥3500.00
当前余额为¥6395.00
输入样例3:
在这里给出一组输入。例如:

6217000010041315715

输出样例3:
在这里给出相应的输出。例如:

业务:查询余额 ¥10000.00
输入样例4:
在这里给出一组输入。例如:

6222081502001312390 88888888 01 500.00
6222081502051320786 88888888 06 1200.00
6217000010041315715 88888888 02 1500.00
6217000010041315709 88888888 02 3500.00
6217000010041315715

输出样例4:
在这里给出相应的输出。例如:

业务:取款 张无忌在中国建设银行的01号ATM机上取款¥500.00
当前余额为¥9490.00
业务:取款 韦小宝在中国工商银行的06号ATM机上取款¥1200.00
当前余额为¥8800.00
业务:取款 杨过在中国建设银行的02号ATM机上取款¥1500.00
当前余额为¥8500.00
业务:取款 杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥5000.00
业务:查询余额 ¥5000.00
输入样例5:
在这里给出一组输入。例如:

6640000010045442002 88888888 09 3000
6640000010045442002 88888888 06 8000
6640000010045442003 88888888 01 10000
6640000010045442002

输出样例5:
在这里给出相应的输出。例如:

业务:取款 张三丰在中国农业银行的09号ATM机上取款¥3000.00
当前余额为¥6880.00
业务:取款 张三丰在中国工商银行的06号ATM机上取款¥8000.00
当前余额为¥-1416.00
业务:取款 张三丰在中国建设银行的01号ATM机上取款¥10000.00
当前余额为¥-11916.00
业务:查询余额 ¥-11916.00
代码长度限制
22 KB
时间限制
400 ms
内存限制
64 MB

提交代码
 
    import java.util.*;
public class Main {
    public static void main(String []args){
        Scanner input = new Scanner(System.in);
        ATM ATM = new ATM();
        //初始化数据
        ChinaUnionPay chinaUnionPay = null;
        Bank bank1=new Bank();bank1.JSbank();
        Bank bank2=new Bank();bank2.GSbank();
        Bank bank3=new Bank();bank3.NYbank();
        Bank[] banks = new Bank[]{bank1, bank2, bank3};
       chinaUnionPay = new ChinaUnionPay(banks);
        //创建用户对象
        User user1 = new User();
        user1.user1(bank1);
    User user2 = new User();
    user2.user2(bank1);

    User user3 =new User();
    user3.user3(bank2);

    User user4= new User();
    user4.user4(bank2);

    User user5= new User();
    user5.user5(bank1);

    User user6= new User();
    user6.user6(bank2);

    User user7= new User();
    user7.user7(bank3);

    User user8= new User();
    user8.user8(bank3);

    //创建账户对象
    Account user1Account1 =new Account();
    user1Account1.idBelongY1(user1);

    Account user1Account2 =new Account();
    user1Account2.idBelongYG2(user1);

    Account user2Account1 =new Account();
    user2Account1.idBelongGJ1(user2);

    Account user3Account1 =new Account();
    user3Account1.idBelongZWJ1(user3);

    Account user3Account2 =new Account();
    user3Account2.idBelongZWJ2(user3);

    Account user3Account3 =new Account();
    user3Account3.idBelongZWJ3(user3);

    Account user4Account1 =new Account();
    user4Account1.idBelongWXB1(user4);

    Account user4Account2 =new Account();
    user4Account2.idBelongWXB2(user4);

    Account user5Account1 =new Account();
    user5Account1.idBelongZSF1(user5);

    Account user6Account1 =new Account();
    user6Account1.idBelongZSF2(user6);

    Account user7Account1 =new Account();
    user7Account1.idBelongQF1(user7);

    Account user8Account1 =new Account();
    user8Account1.isBelongHQG1(user8);

    //银行卡
    BankCard C1 =new BankCard(user1Account1,"6217000010041315709");
    ATM.getAllCard().add(C1);

    BankCard C2 =new BankCard(user1Account1,"6217000010041315715");
    ATM.getAllCard().add(C2);

    BankCard C3 =new BankCard(user1Account2,"6217000010041315718");
    ATM.getAllCard().add(C3);

    BankCard C4 =new BankCard(user2Account1,"6217000010051320007");
    ATM.getAllCard().add(C4);

    BankCard C5 =new BankCard(user3Account1,"6222081502001312389");
    ATM.getAllCard().add(C5);

    BankCard C6 =new BankCard(user3Account2,"6222081502001312390");
    ATM.getAllCard().add(C6);

    BankCard C7 =new BankCard(user3Account3,"6222081502001312399");
    ATM.getAllCard().add(C7);

    BankCard C8 =new BankCard(user3Account3,"6222081502001312400");
    ATM.getAllCard().add(C8);

    BankCard C9 =new BankCard(user4Account1,"6222081502051320785");
    ATM.getAllCard().add(C9);

    BankCard C10 =new BankCard(user4Account2,"6222081502051320786");
    ATM.getAllCard().add(C10);

    BankCard C11 =new BankCard(1,user5Account1,"6640000010045442002");
    ATM.getAllCard().add(C11);

    BankCard C12 =new BankCard(1,user5Account1,"6640000010045442003");
    ATM.getAllCard().add(C12);

    BankCard C13 =new BankCard(1,user6Account1,"6640000010045441009");
    ATM.getAllCard().add(C13);

    BankCard C14 =new BankCard(1,user7Account1,"6630000010033431001");
    ATM.getAllCard().add(C14);

    BankCard C15 =new BankCard(1,user8Account1,"6630000010033431008");
    ATM.getAllCard().add(C15);
    //输入
    StringBuilder stringBuilder = new StringBuilder();
    String massage = input.nextLine();
    if(massage.equals("#")){
        return;
    }
    while(true){
        stringBuilder.append(massage+"DEPAERT");
        massage = input.nextLine();
        if(massage.equals("#")) {
            break;
        }
    }
    String []strings=stringBuilder.toString().split("DEPAERT");
    for(int i = 0; i < strings.length; i++) {
        int massageParts = 0;// 记录消息数
        String[] strings1 = strings[i].split(" ");
        while(strings1[massageParts].equals(""))
            massageParts++;
        String cardId=strings1[massageParts++];
        if(!ATM.isCardValid(cardId)){
            System.out.println("Sorry,this card does not exist.");
            return;
        }
        if(strings1.length <= 1){
            ATM.SearchBalance();
        }
        else {
            while(strings1[massageParts].equals("")) {
                massageParts++;
            }
            String key = strings1[massageParts];
            massageParts++;
            while(strings1[massageParts].equals("")) {
                massageParts++;
            }
            String ATMid = strings1[massageParts];
            massageParts++;
            while(strings1[massageParts].equals("")) {
                massageParts++;
            }
            double changeMoney = Double.parseDouble(strings1[massageParts]);
            if(!ATMid.matches("([0][1-9])|([1][0-1])")){
                System.out.println("Sorry,the ATM's id is wrong.");
                return;
            }
            else {
                if (!key.equals("88888888")) {
                    System.out.println("Sorry,your password is wrong.");
                    return;
                }
                else{
                    ATM.setOperateBalance(changeMoney);
                    ATM.setId(ATMid);
                    if(ATM.getCard().getCardType() == 0 && ATM.isBalanceRight()){// 借记卡不可以透支
                        System.out.println("Sorry,your account balance is insufficient.");
                        return;
                    }
                    else {
                        if (ATM.getCard().getCardType() == 1 && ATM.isBalanceRight()) {// 贷记卡
                            double raxFee = 0;
                            if (ATM.getCard().getAccount().getBalance() > 0)
                                raxFee = (ATM.getOperateBalance() - ATM.getCard().getAccount().getBalance()) * 0.05;// 判断手续费
                            else{
                                raxFee = ATM.getOperateBalance() * 0.05;
                            }
                            if (ATM.getCard().getAccount().getBalance() - ATM.getOperateBalance() < -50000){// 可透支但不得小于负五万
                                System.out.println("Sorry,your account balance is insufficient.");
                                return;
                            }
                            ATM.getCard().getAccount().setBalance(ATM.getCard().getAccount().getBalance() - raxFee);
                        }
                        ATM.isMoneyValid();// 判断存取款数额是否合理
                        Bank thisBank = ATM.getCard().getAccount().getUser().getBank();// 记录所属银行
                        if(ATM.getOperateBalance() < 0)
                            System.out.printf("业务:存款 %s在%s的%s号ATM机上存款¥%.2f\n",ATM.getCard().getAccount().getUser().getName() ,thisBank.getBankName() , ATMid ,Math.abs(ATM.getOperateBalance()));
                        else{
                            if(!ATM.getCard().getAccount().getUser().getBank().getATMlist().contains(ATM.getId())){
                                double fee = 1;
                                for(BankCard tempBankCard : ATM.getAllCard()){
                                    /*
                                 遍历集合查找
                                     */
                                    if(tempBankCard.getAccount().getUser().getBank().getATMlist().contains(ATM.getId())){
                                        fee = tempBankCard.getAccount().getUser().getBank().getFee();// 记录手续费
                                        thisBank = tempBankCard.getAccount().getUser().getBank();// 记录银行
                                        break;
                                    }
                                }
                                if(ATM.getCard().getAccount().getBalance()-fee* ATM.getOperateBalance() < 0 && ATM.getCard().getCardType() == 0){
                                    System.out.println("Sorry,your account balance is insufficient.");
                                    return;
                                }
                                ATM.getCard().getAccount().setBalance(ATM.getCard().getAccount().getBalance()-fee* ATM.getOperateBalance());
                            }
                            System.out.printf("业务:取款 %s在%s的%s号ATM机上取款¥%.2f\n",ATM.getCard().getAccount().getUser().getName(), thisBank.getBankName(), ATMid, ATM.getOperateBalance());
                        }
                        System.out.printf("当前余额为¥%.2f\n", ATM.getCard().getAccount().getBalance());
                    }
                }
            }
        }
    }
}

}
class ChinaUnionPay {
private Bank[] banks;
ChinaUnionPay(Bank[] banks){
this.banks = banks;
}

}
class Bank {
private ChinaUnionPay chinaUnionPay;
private ArrayList ATMlist;
private String BankName;
private double fee;
public ArrayList getATMlist() {
return ATMlist;
}

public String getBankName() {
    return BankName;
}

public double getFee() {
    return fee;
}

public Bank() {

    this.ATMlist =new ArrayList<>();
}


// 初始化银行ATM机集合
public void JSbank(){
    this.BankName ="中国建设银行";
    this.fee = 0.02;
    ArrayList<String>ATMList=new ArrayList<>();
    ATMList.add("01");
    ATMList.add("02");
    ATMList.add("03");
    ATMList.add("04");
    this.ATMlist = ATMList;
}
// 初始化银行ATM机集合
public void GSbank(){
    this.BankName = "中国工商银行";
    this.fee = 0.03;
    ArrayList<String>ATMList=new ArrayList<>();
    ATMList.add("05");
    ATMList.add("06");
    this.ATMlist = ATMList;
}
// 初始化银行ATM机集合
public void NYbank(){
    this.BankName = "中国农业银行";
    this.fee = 0.04;
    ArrayList<String>ATMList=new ArrayList<>();
        ATMList.add("07");
        ATMList.add("01");
        ATMList.add("08");
        ATMList.add("08");
    this.ATMlist = ATMList;
}

}
class User {
private Bank bank;
private String name;

public Bank getBank() {
    return bank;
}


public String getName() {
    return name;
}

public void user1(Bank bank){
    this.name = "杨过";
    this.bank= bank;
}
public void user2(Bank bank){
    this.name="郭靖";
    this.bank=bank;
}
public void user3(Bank bank){
    this.name="张无忌";
    this.bank=bank;
}
public void user4(Bank bank){
    this.name="韦小宝";
    this.bank=bank;
}
public void user5(Bank bank){
    this.name="张三丰";
    this.bank=bank;
}
public void user6(Bank bank){
    this.name="令狐冲";
    this.bank=bank;
}
public void user7(Bank bank){
    this.name="乔峰";
    this.bank=bank;
}
public void user8(Bank bank){
    this.name="洪七公";
    this.bank=bank;
}

}
class Account {
private User user;
private String cardID;
private int cardType;
private double balance = 10000;
Account(){
}
private final String Password = "88888888";

public User getUser() {
    return user;
}

public double getBalance() {
    return balance;
}

public void setBalance(double balance) {
    this.balance = balance;
}
public void idBelongY1(User user){
    this.user = user;
    this.cardID ="3217000010041315709";
}
public void idBelongYG2(User user){
    this.user = user;
    this.cardID ="3217000010041315715";
}
public void idBelongGJ1(User user){
    this.user = user;
    this.cardID ="3217000010051320007";
}
public void idBelongZWJ1(User user){
    this.user = user;
    this.cardID ="3222081502001312389";
}
public void idBelongZWJ2(User user){
    this.user = user;
    this.cardID ="3222081502001312390";
}
public void idBelongZWJ3(User user){
    this.user = user;
    this.cardID ="3222081502001312399";
}
public void idBelongWXB1(User user){
    this.user = user;
    this.cardID ="3222081502051320785";
}
public void idBelongWXB2(User user){
    this.user = user;
    this.cardID ="3222081502051320786";
}
public void idBelongZSF1(User user){
    this.user = user;
    this.cardID = "3640000010045442002";
    this.cardType = 1;
}
public void idBelongZSF2(User user){
    this.user = user;
    this.cardID = "3640000010045441009";
    this.cardType =1;
}
public void idBelongQF1(User user){
    this.user = user;
    this.cardID ="3630000010033431001";
    this.cardType =1;
}
public void isBelongHQG1(User user){
    this.user = user;
    this.cardID = "3630000010033431008";
    this.cardType = 1;
}

}
class BankCard {
private final String id;

private final Account account;
private final int type;
public Account getAccount() {
    return account;
}
public BankCard(Account account, String id) {
    this.account = account;
    this.id = id;
    this.type=0;
}
public BankCard(int type, Account account, String id) {
    this.account = account;
    this.id = id;
    this.type=type;
}
public int getCardType() {
    return type;
}

public String getId() {
    return id;
}

}
class ATM {

private String id;
private final String Password = "8888888";

private BankCard bankCard;;
ATM(){
    allBankCard = new ArrayList<>();
}
private final ArrayList<BankCard> allBankCard;// 存放所有卡

private double OperateBalance;
public boolean isCardValid(String cardId){
    for(BankCard ObjectId : allBankCard){
        if(ObjectId.getId().equals(cardId)) {// 检查是否存在该卡号
            this.bankCard = ObjectId;
            return true;
        }
    }
    return false;
}
public void SearchBalance(){
    System.out.printf("业务:查询余额 ¥%.2f\n", bankCard.getAccount().getBalance());
}
public ArrayList<BankCard> getAllCard() {
    return allBankCard;
}
public BankCard getCard() {
    return bankCard;
}
public String getId() {
    return id;
}
public double getOperateBalance() {
    return OperateBalance;
}
public boolean isBalanceRight(){
    if(bankCard.getAccount().getBalance() - OperateBalance <= 0){
        return true;
    }else{
        return false;
    }
}
public void isMoneyValid(){
    bankCard.getAccount().setBalance(bankCard.getAccount().getBalance() - OperateBalance);
}
public void setOperateBalance(double operateBalance) {
    this.OperateBalance = operateBalance;
}
public void setId(String id) {
    this.id = id;
}

}

(二)设计思路

  • 功能需求:请读者查看文档,需要注意的是程序对各种输入错误进行提示的优先级以及错误提示的唯一性
  • 性能方面:本题基本不会涉及到代码性能问题,不作考虑
  • 可扩展性:7-5继承了7-4的大部分功能,因此做7-4时应该考虑给7-5的功能扩展留出空间,本质还是解耦
  • 可测试性:测试数据将由平台给出,需要通过全部测试点,我们只考虑输入格式即可
  • 安全性:需要特别注意各种输入异常导致的空指针问题

程序类图如下:

7-4类图:
p91bxSA.png

7-5类图:
p91qt61.png


三、踩坑心得

提交结果:

7-4通过所有测试点
p91qMwT.png

对我来说本题难度很大,因为本身代码量大,而且不像之前的题目有(完整)类图提示,需要自己设计,这就导致出现很多设计不合理的地方,题目7-4我进行了两次重写,第一次由于设计不合理,语句嵌套过多,结构十分复杂,圈复杂度极高(最大复杂度34)导致代码可读性极差,出现了很多问题且难以修改,实在无能为力,重写了一版,后又因为代码耦合度过高,无法适应7-5的迭代,再次重写,才有了这一版,由于时间比较紧,设计的耦合度和复杂度还是很高,有很大改进空间。

7-5部分测试点未通过
p91qRnP.png

由于7-4的代码可扩展性不佳,因此只沿用了一部分7-4的代码,大部分代码是重新写的,只能说我尽力了,在经历几十次尝试之后我已经无心顾及设计的合理性,这道题让我真正开始见识到软件工程这门专业有难度的地方,软件工程真不是会写几行代码懂一些语法就能学会的。起初我是写了700多行(约41KB)的,直接被平台拒之门外,超出长度限制(约22KB)了,后来和其他人交流沟通,学习他们细节的处理方式(如何记录输入、处理异常等等),大幅删减到480行(约19KB)左右,能精简就精简,精简的注释都想删了,这也侧面反映出来我写代码的质量实在是低,这需要实实在在的开发经验积累,去优化每一个细节,才能写出高质量的代码。

7-5代码复杂度分析图

p91Xeld.png


四、改进建议

  1. 命名规范:变量名、函数名、类名等要使用有意义的名称,遵循命名规范,使代码易于理解和维护

  2. 代码可复用性:可以通过定义接口的方式实进行顶层设计,规划好职责后再一一实现,要注意接口隔离

  3. 耦合度:本题大量使用依赖,类间耦合度高,可以拆分职责降低耦合度

  4. 复杂度:细化职责,降低方法复杂度


五、总结

本次作业的两道题目侧重考察类间关系的设计,类与类之间有多层嵌套耦合,处理好这些嵌套是顺利完成本次题目集的一大难点;通过做本次练习,我初步了解并开始使用collection集合框架下的List集合以及一些方法,也更加深刻的认识到解耦和代码复用在程序设计中的重要性。

posted @ 2023-04-29 20:22  一杯大丞汁  阅读(165)  评论(0)    收藏  举报