BLOG-3

 

(1)前言:

1、题目集7

题量、难度分析:

  • 还是和往常一样的量少而难度较大,但是这次作业,做起来并没有像以往作业一样,拿到题目就有头绪,可以分析出程序大概流程图

知识点分析:

  • 两题主要考察我们对多态及接口的使用掌握程度。

自己对题目的分析:

  • 两题对个人来讲题目比较简单,主要考察接口的运用和多态的运用(个人比较熟练)。

 

2、题目集8

题量、难度分析:

  • 这次仅仅只有一题但是有一点考察数据处理能力(偏正则表达式方面,属于自己的弱项),所以难度偏中上。

自己对题目的分析:

  • ATM机系统,运用java面向对象思维,建立多个类,每个类处理一件事,特别之处就是取款和存款之处需要加以区别,题目并无太多新颖特殊之处。

3、题目集9

题量、难度分析:

  • 与题目集8一样,只有一题,且题目只是题目8的衍生题,加了一个信用卡功能,且可以跨行转账,在做完题目集8后觉得简单。

自己对题目的分析:

  • 在题目集8的基础之上,遵循开闭原则,再创建一个信用卡账户类,从而实现借贷功能,除此之外,再到withdraw()方法处理跨行转账是增加流程。

(2)设计与分析:

(1) 题目集7(7-1)、(7-2)两道题目的递进式设计分析总结

     题目7(7-1)详情:

                                                        7-1 图形卡片排序游戏 (40 分)     

      掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书 2020-OO第07次作业-1指导书V1.0.pdf

      输入格式:

        首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1                          3 4 2 1 3 0  

        然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形                        需要\ 输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。 

      输出格式:

        如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。

        如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:

        排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;

        排序后的各图形类型及面积,格式同排序前的输出;

        所有图形的面积总和,格式为Sum of area:总面积值。

      类图:

        

 

 

 

 

                复杂度:

               

                源代码:

复制代码
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.text.DecimalFormat;
import java.util.TreeMap;
public class Main {
    public static void main(String[] args) {    
        Scanner input=new Scanner(System.in);
        DecimalFormat df2 = new DecimalFormat("####0.00");
        ArrayList<Integer> cz = new ArrayList<Integer>();
        Circle circle=new Circle();
        Rectangle rectangle=new Rectangle();
        Triangle triangle=new Triangle();
        Trapezoid trapezoid=new Trapezoid();
        for(int i=0;;i++) {
            int x=input.nextInt();
            if(x==0&&i==0) {
                System.out.println("The original list:"+"\n");
                System.out.println("The sorted list:"+"\n");
                System.out.println("Sum of area:0.00");
                System.exit(0);
                break;
            }
            if(x==0&&i!=0)
                break;
            else if(x>0&&x<=4)
                cz.add(x);
            else {
                System.out.println("Wrong Format");
                System.exit(0);
            }                
        }
        ArrayList<Double> area1 = new ArrayList<Double>();
        ArrayList<Double> area2 = new ArrayList<Double>();
        ArrayList<Double> area3 = new ArrayList<Double>();
        ArrayList<Double> area4 = new ArrayList<Double>();
        for(int i=0;i<cz.size();i++) {
            switch(cz.get(i)) {
            case 1:circle.r=input.nextDouble();
                    if(circle.r<0) {
                        System.out.println("Wrong Format");
                        System.exit(0);
                    }
                    area1.add(circle.getArea());
                    break;
            case 2:rectangle.length=input.nextDouble();
                    rectangle.width=input.nextDouble();
                    if(rectangle.length<0||rectangle.width<0) {
                        System.out.println("Wrong Format");
                        System.exit(0);
                    }
                    area2.add(rectangle.getArea());
                    break;
            case 3:triangle.side1=input.nextDouble();
                    triangle.side2=input.nextDouble();
                    triangle.side3=input.nextDouble();
                    if(triangle.side1+triangle.side2<=triangle.side3||triangle.side1+triangle.side3<=triangle.side2||triangle.side2+triangle.side3<=triangle.side1) {
                        System.out.println("Wrong Format");
                        System.exit(0);
                    }
                    area3.add(triangle.getArea());
                    break;
            case 4:trapezoid.sd=input.nextDouble();
                    trapezoid.xd=input.nextDouble();
                    trapezoid.h=input.nextDouble();
                    if(trapezoid.sd<0||trapezoid.xd<0||trapezoid.h<0) {
                        System.out.println("Wrong Format");
                        System.exit(0);
                    }
                    area4.add(trapezoid.getArea());
                    break;
            }
        }
        System.out.println("The original list:");
        for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) {
            switch(cz.get(i+j+k+l)) {
            case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break;
            case 2:System.out.print("Rectangle:"+df2.format(area2.get(j))+" ");j++;break;
            case 3:System.out.print("Triangle:"+df2.format(area3.get(k))+" ");k++;break;
            case 4:System.out.print("Trapezoid:"+df2.format(area4.get(l))+" ");l++;break;
            }
        }
        System.out.println("\n"+"The sorted list:");
        Map map = new TreeMap();
        for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) {
            switch(cz.get(i+j+k+l)) {
            case 1:map.put(area1.get(i),"Circle:");i++;break;
            case 2:map.put(area2.get(j),"Rectangle:");j++;break;
            case 3:map.put(area3.get(k),"Triangle:");k++;break;
            case 4:map.put(area4.get(l),"Trapezoid:");l++;break;
            }
        }
        ArrayList<Double> mj = new ArrayList<Double>();
        for(int i = 0,j = 0,k = 0,l=0;i+j+k+l<cz.size();) {
            switch(cz.get(i+j+k+l)) {
            case 1:mj.add(area1.get(i));i++;break;
            case 2:mj.add(area2.get(j));j++;break;
            case 3:mj.add(area3.get(k));k++;break;
            case 4:mj.add(area4.get(l));l++;break;
            }
        }
        Collections.sort(mj);
        for(int i=cz.size()-1;i>=0;i--) {
            System.out.print(map.get(mj.get(i)));
            System.out.print(df2.format(mj.get(i))+" ");
        }
        double sum=0;
        for(int i=0;i<cz.size();i++) {
            sum=sum+mj.get(i);        
        }
        System.out.println("\n"+"Sum of area:"+df2.format(sum));
    }
}
class Circle{
    DecimalFormat df2 = new DecimalFormat("####0.00");
    double r;
    public double getArea() {
        return Math.PI*r*r;
    }
    public void show() {
        System.out.print("Circle:"+df2.format(this.getArea())+" ");
    }
}
class Rectangle{
    DecimalFormat df2 = new DecimalFormat("####0.00");
    double length;
    double width;
    public double getArea() {
        return length*width;
    }
    public void show() {
        System.out.print("Rectangle:"+df2.format(this.getArea())+" ");
    }
}
class Triangle{
    DecimalFormat df2 = new DecimalFormat("####0.00");
    double side1;
    double side2;
    double side3;
    public double getArea() {
        return Math.sqrt(((side1+side2+side3)/2)*(((side1+side2+side3)/2)-side1)*(((side1+side2+side3)/2)-side2)*(((side1+side2+side3)/2)-side3));
    }
    public void show() {
        System.out.print("Triangle:"+df2.format(this.getArea())+" ");
    }
}
class Trapezoid{
    DecimalFormat df2 = new DecimalFormat("####0.00");
    double sd;
    double xd;
    double h;
    public double getArea() {
        return (sd+xd)*h*0.5;
    }
    public void show() {
        System.out.print("Trapezoid:"+df2.format(this.getArea())+" ");
    }
}
复制代码

 

 题目7(7-2)详情:

                                                 7-2 图形卡片分组游戏 (60 分)

掌握类的继承、多态性使用方法以及接口的应用。 具体需求参考作业指导书。

2021-OO第07次作业-2指导书V1.0.pdf

输入格式:

在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:1 3 4 2 1 3 4 2 1 3 0

根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。

输出格式:

如果图形数量非法(<=0)或图形属性值非法(数值<0以及三角形三边不能组成三角形),则输出Wrong Format。

如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:

1、排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;

2、输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;

3、各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;

4、各组中面积之和的最大值输出,格式为The max area:面积值。

                     类图:

                        

                     复杂度:

                   

      第一题是输入几个不同的图形,然后算出其面积,先输出按输入顺序的面积,再输出按面积从大到小的顺序,最后输出面积最大的;而第二题是在第一题的基础上,可以输入多个相同的图形,但是                 可以有不同的面积,而且要把不同的图形分为不同的组,组的顺序是固定的,但是组内图形面积需要排序,最后输出最大的一组面积之和。

      由于第二题是在第一题的基础上进行的,所以第一题的四个图形类和存面积的方法可以完全用在第二题中,第二题比第一题多的用来分组代码:

      

复制代码
System.out.print("[");

              for(int i=area1.size()-1;i>=0;i--) {

                            System.out.print("Circle:"+df2.format(area1.get(i))+" ");

              }

              System.out.print("]");

              System.out.print("[");

              for(int i=area2.size()-1;i>=0;i--) {

                            System.out.print("Rectangle:"+df2.format(area2.get(i))+" ");

              }

              System.out.print("]");

              System.out.print("[");

              for(int i=area3.size()-1;i>=0;i--) {

                            System.out.print("Triangle:"+df2.format(area3.get(i))+" ");

              }

              System.out.print("]");

              System.out.print("[");

              for(int i=area4.size()-1;i>=0;i--) {

                            System.out.print("Trapezoid:"+df2.format(area4.get(i))+" ");

              }

              System.out.print("]");
复制代码

 

7-3 ATM机类结构设计(一) (100 分)

 设计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
分析:
  类设计:账户类用于记录一个人的金额,卡号信息(多张卡,包括账号密码),银行类记录本行ATM信息,记录用户信息,进行账号存储使用。受农夫过河实验影响,本次作业设计了数据类,用于存储各个银行的数据,包括初始化输入,合法判定等等。而银行所处于的机构名称在本题目中并没有太大的形象,因此把其设置为银行类的一个属性。
 
类图:

 

 ATM机类结构设计(二) (100 分)

设计ATM仿真系统,具体要求参见作业说明。

输入格式:

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

  • 取款功能输入数据格式: 卡号 密码 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
 源代码:
复制代码
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int i;
        Scanner input = new Scanner(System.in);
        StringBuilder in=new StringBuilder();
        Data data=new Data();
        data.Inint_bank();
        data.Inint_ATM();
        data.Inint_Info();
        while(true)
        {
            String scanf=input.nextLine();
            scanf=scanf.trim();
            if(scanf.equals("#")==true)
                break;
            in.append(scanf+"|");
        }
        input.close();
        String in_scanf=in.toString();
        String []splite=in_scanf.split("[\\|]");
        for(i=0;i<splite.length;i++)
        {
            if(i!=0)
                System.out.println("");
            if(splite[i].length()>19)
            {
                if(data.validate2(splite[i])==false) {
                    System.exit(0);
                }
            }
            else if(splite[i].length()==19)
            {
                if(data.validate1(splite[i])==false) {
                    System.exit(0);
                }
            }
            else
            {
                System.exit(0);
            }
        }
    }
}

class Data{
    BankList list;
    Bank JianShe;
    Bank GongShang;
    Bank Nongye;
    public void Inint_bank()
    {
        list=new BankList("中国银联",0.05,50000);
        JianShe=new Bank("中国建设银行",0.02);
        GongShang=new Bank("中国工商银行",0.03);
        Nongye=new Bank("中国农业银行",0.04);
        list.bank.add(JianShe);
        list.bank.add(GongShang);
        list.bank.add(Nongye);
    }
    public void Inint_ATM()
    {
        JianShe.Atm.add("01");
        JianShe.Atm.add("02");
        JianShe.Atm.add("03");
        JianShe.Atm.add("04");
        GongShang.Atm.add("05");
        GongShang.Atm.add("06");
        Nongye.Atm.add("07");
        Nongye.Atm.add("08");
        Nongye.Atm.add("09");
        Nongye.Atm.add("10");
        Nongye.Atm.add("11");
    }
    public void Inint_Info() {
        Info info1=new Info("杨过",10000.00,"借记账号");
        info1.add_id("6217000010041315709","88888888");
        info1.add_id("6217000010041315715","88888888");
        Info info2=new Info("杨过",10000.00,"借记账号");
        info2.add_id("6217000010041315718","88888888");
        Info info3=new Info("郭靖",10000.00,"借记账号");
        info3.add_id("6217000010051320007","88888888");
        Info info_0=new Info("张三丰",10000.00,"贷记账号");
        info_0.add_id("6640000010045442002","88888888" );
        info_0.add_id("6640000010045442003","88888888" );
        JianShe.info.add(info1);
        JianShe.info.add(info2);
        JianShe.info.add(info3);
        JianShe.info.add(info_0);
        Info info4=new Info("张无忌",10000.00,"借记账号");
        info4.add_id("6222081502001312389","88888888");
        Info info5=new Info("张无忌",10000.00,"借记账号");
        info5.add_id("6222081502001312390","88888888");
        Info info6=new Info("张无忌",10000.00,"借记账号");
        info6.add_id("6222081502001312399","88888888");
        info6.add_id("6222081502001312400","88888888");
        Info info7=new Info("韦小宝",10000.00,"借记账号");
        info7.add_id("6222081502051320785","88888888");
        Info info8=new Info("韦小宝",10000.00,"借记账号");
        info8.add_id("6222081502051320786","88888888");
        Info info_1=new Info("令狐冲",10000.00,"贷记账号");
        info_1.add_id("6640000010045441009", "88888888");
        GongShang.info.add(info4);
        GongShang.info.add(info5);
        GongShang.info.add(info6);
        GongShang.info.add(info7);
        GongShang.info.add(info8);
        GongShang.info.add(info_1);
        Info info_2_1 = new Info("乔峰",10000.00,"贷记账号");
        info_2_1.add_id("6630000010033431001", "88888888");
        Info info_2_2 = new Info("洪七公",10000.00,"贷记账号");
        info_2_2.add_id("6630000010033431008", "88888888");
        Nongye.info.add(info_2_1);
        Nongye.info.add(info_2_2);
    }
    public boolean validate1(String x)
    {
        int i,j;
        if(this.validate_id(x)!=null) 
        {
            for(i=0;i<list.bank.size();i++) {
                for(j=0;j<list.bank.get(i).info.size();j++) {
                    if((list.bank.get(i).info.get(j).validate(x))==true) 
                    {
                    System.out.printf("业务:查询余额 "+"¥%.2f",list.bank.get(i).info.get(j).money);
                    return true;
                    }
                }
            }
        }
        return false;
    }
    public boolean validate2(String x)
    {
        int i;
        Bank judge1;        //账户所在银行
        Bank judge2;        //ATM所归属的银行
        String name;
        String personName=null;
        double money=0;
        x=x.replaceAll("[\\s][\\s]"," ");
        String []spilte=x.split("[\\s]");
        if(spilte.length==4) {
            judge1=validate_id(spilte[0]);
            if(judge1==null)
                return false;
            judge2=validate_atm(spilte[2]);
            if(judge2==null)
                return false;
            if(validate_acount(spilte[0], spilte[1])==false)
                return false;
            if(validate_judge(judge1,judge2)==1)
            {
                money=validate_money(judge1,spilte[0],Double.parseDouble(spilte[3]),0);
                if(money==-50001)
                    return false;
            }
            else
            {
                money=validate_money(judge1,spilte[0],Double.parseDouble(spilte[3]),judge2.profit);
                if(money==-50001)
                    return false;
            }
            name=judge2.name;
            for(i=0;i<judge1.info.size();i++)
            {
                if(judge1.info.get(i).validate(spilte[0])==true)
                    personName=judge1.info.get(i).host;
            }
            System.out.printf("业务:取款 %s在%s的%s号ATM机上取款¥%.2f\n",personName,name,spilte[2],Double.parseDouble(spilte[3]));
            System.out.printf("当前余额为¥%.2f",money);
            return true;
            }
        else
            return false;
    }
    public double validate_money(Bank x,String id,double y,double rate)
    {
        int i;
        double money=0;
            for(i=0;i<x.info.size();i++)
            {
                if(x.info.get(i).validate(id)==true) 
                {
                    if(x.Store_Money(x.info.get(i),y,rate)==false)
                    return -50001;
                money=x.info.get(i).money;
                }
            }
        return money;
    }
    public int validate_judge(Bank x,Bank y)
    {
        if(x.name.equals(y.name))
            return 1;
        else
            return 0;
    }
    public Bank validate_atm(String x)
    {
        int i;
        for(i=0;i<list.bank.size();i++)
        {
            if(list.bank.get(i).validate(x)==true)
                return list.bank.get(i);
        }
        System.out.println("Sorry,the ATM's id is wrong.");
        return null;
    }
    public boolean validate_acount(String x,String y)
    {
        int i,j;
        for(i=0;i<list.bank.size();i++)
        {
            for(j=0;j<list.bank.get(i).info.size();j++)
            {
                if(list.bank.get(i).info.get(j).validate(x, y)==true)
                    return true;
            }
        }
        System.out.println("Sorry,your password is wrong.");
        return false;
    }
    public Bank validate_id(String x)

    {
        int i,j;
        for(i=0;i<list.bank.size();i++)
        {
            for(j=0;j<list.bank.get(i).info.size();j++)
            {
                if(list.bank.get(i).info.get(j).validate(x)==true)
                    return list.bank.get(i);
            }
        }
        System.out.println("Sorry,this card does not exist.");
        return null;
    }

}
class BankList{
    String institution_name;
    ArrayList<Bank>bank=new ArrayList<Bank>();
    double profit;
    int maxprofit;
    BankList(String name,double profit,int max)
    {
        this.institution_name=name;
        this.profit=profit;
        this.maxprofit=max;
    }
}
class Bank{
    String name;
    double profit;
    ArrayList<Info> info;
    ArrayList<String> Atm;
    Bank(String name,double profit)
    {
        this.name=name;
        this.profit=profit;
        info=new ArrayList<Info>();
        Atm=new ArrayList<String>();
    }
    public boolean Store_Money(Info info,double Money,double rate)
    {
        double sum=0;
        if(Money>=0)
        {
            if(Money*(1+rate)<=info.money)
                {
                info.money=info.money-Money*(1+rate);
                return true;
                }
            else
            {
                if(info.type.equals("借记账号"))
                {
                    System.out.println("Sorry,your account balance is insufficient.");
                    return false;
                }
                else if(info.type.equals("贷记账号"))
                {
                    if(info.money>0)    //账户内有钱
                    {
                        sum=info.money-Money*(1+rate)-(Money-info.money)*0.05;
                        if(0-sum<50000) {
                            info.money=sum;
                            return true;
                            }
                        else
                        {
                            System.out.println("Sorry,your account balance is insufficient.");
                            return false;
                        }
                    }
                    else            //账户内无钱
                    {
                        sum=info.money-Money*(1+rate)-Money*0.05;
                        if(0-sum<50000) {
                            info.money=sum;
                            return true;
                        }
                        else
                        {
                            System.out.println("Sorry,your account balance is insufficient.");
                            return false;
                        }
                    }
                }
            }
            return false;
        }
        else
        {
            return false;
        }
    }
    public boolean validate(String Atmid)
    {
        int i;
        for(i=0;i<Atm.size();i++)
        {
            if(Atm.get(i).equals(Atmid)==true)
                return true;
        }
        return false;
    }
}
class Info{
    ArrayList<String> id;
    String host;
    String type;
    ArrayList<String>password;
    double money;
    Info(String host,double Money,String CardType)
    {
        this.host=host;
        this.money=Money;
        this.type=CardType;
        id=new ArrayList<String>();
        password=new ArrayList<String>();
    }
    public void add_id(String uid,String upassword)
    {
        id.add(uid);
        password.add(upassword);
    }
    public boolean validate(String uid)
    {
        int i;
        for(i=0;i<id.size();i++) {
        if(this.id.get(i).equals(uid)==true)
            return true;
        }
        return false;
    }
    public boolean validate(String uid,String upassword)
    {
        int i;
        for(i=0;i<id.size();i++) {
        if(id.get(i).equals(uid)==true&&password.get(i).equals(upassword)==true)
            return true;
        }
            return false;
    }
}
复制代码

类图:

 

 比较:

第二次与第一次不同在于属性上不同,结构上也略有不同,主要在于题目所对应的需求不一样,第一题并未对卡进行划分,也不实现跨行转账,因此功能模式比较单一,使用简单的两层结构就能对其进行实现而第二次设计增加了透支消费,卡类别划分,对不同卡实现同一件事情的结果不同,最主要时需要采用开闭原则,对扩展开放,对修改关闭。因此类别设计的时候就需要增加一个类来对银行功能的扩展,而对修改数据进行关闭,对后续如果要对银行机构产生相关行为,依然能够使用该模式进行扩展。

专业软件对于圈复杂度的评估:

题目集8:

 

题目集9:

(3)采坑心得:

 1、题目集7:for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) {

                       switch(cz.get(i+j+k+l)) {

                       case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break;

                       case 2:System.out.print("Rectangle:"+df2.format(area2.get(j))+" ");j++;break;

                       case 3:System.out.print("Triangle:"+df2.format(area3.get(k))+" ");k++;break;

                       case 4:System.out.print("Trapezoid:"+df2.format(area4.get(l))+" ");l++;break;

                       }

                }

              这样输出才是对的,但是我之前是这样写的:

                for(int i = 0,;i <cz.size();) {

                       switch(cz.get(i+j+k+l)) {

                       case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break;

                       case 2:System.out.print("Rectangle:"+df2.format(area2.get(i))+" ");i++;break;

                       case 3:System.out.print("Triangle:"+df2.format(area3.get(i))+" ");i++;break;

                       case 4:System.out.print("Trapezoid:"+df2.format(area4.get(i))+" ");i++;break;

                       }

                }

              这就是犯了把四个数组看成一个数组的错误,这样就得不到正确答案。

 2、题目集8、9:余额没有用多个10000元,导致取钱全是取一张卡里面的钱

(4)改进建议:

    (1):需要减少上帝类的设计,把功能进行划分,做到一个实体做一件事,做到合理分配,做到面向对象的设计思想。

  (2):需要对代码进行优化,圈复杂度分析中,还是能够看出有一些圈复杂度还是较大。

  (3):对于多个类的调用的类,经量增加一个数据类,来进行数据封装,调用时对数据进行改动,不需要在调用类中对多个子类进行组合。

  (4):设计前需要针对可能存在的扩展进行开闭原则设计。

  (5):代码编写时间较长,需要提高。

(5)总结:

  在这三次题目集中主要的收获就是该如何进行类与类的设计,一定要符合逻辑性,并且在设计前,要考虑代码的复用性,从而对类进行设计所谓的底层设计。

 

posted @ 2021-12-14 23:29  Ghkc  阅读(74)  评论(0)    收藏  举报