OO第三次博客作业

目录

1. 前言

2.代码分析

3.三次作业遇到的bug及采坑心得

4.改进建议

5.总结

一、前言

第三次写blog,对于题目的分析已经渐渐孰能生巧了,可以通过SourceMonitor的生成报表内容来分析出自己写过的题目的代码的问题了。

下面是我对三次题目集的大体分析:

题目集7

题量:2道

知识点:继承、多态的应用,ArrayList泛型的应用方法,Comparable接口及泛型的应用,单一职责原则的应用,“开-闭”原则的应用

难度:第二道题是在第一道题基础上进行改变,难度都适中

题目集8

题量:1道

知识点:单一职责原则的应用,“开-闭”原则的应用,面向对象的封装性,java各实体类之间的关系

难度:该题难度较大

题目集9

题量:1道

知识点:继承、多态及抽象类的应用,单一职责原则的应用,“开-闭”原则的应用,面向对象的封装性

难度: 在上一道题目集的基础上进行改变,难度适中

二、代码分析

因学校要求,此次代码分析就分析题目集7的7-1和7-2,题目集8的8-1,题目集9的9-1。

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

题目集7

7-1

该题代码如下:

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Scanner;

abstract interface Card{
    public double getarea();
    public void showStatus();
    public boolean validate();
}
class Circle implements Card{
    double radius;
    Circle(double radius){
        this.radius=radius;
    }
    public double getarea() {
        return Math.PI*radius*radius;
    }
    public boolean validate() {
        if(radius<0)
            return false;
        return true;
    }
    public void showStatus() {
        System.out.printf("Circle:%.2f ",getarea());
    }
}
class Rectangle implements Card{
    double width,length;
    Rectangle(double width,double length){
        this.width=width;
        this.length=length;
    }
    public double getarea() {
        return width*length;
    }
    public boolean validate() {
        if(width<0||length<0)
            return false;
        return true;
    }
    public void showStatus() {
        System.out.printf("Rectangle:%.2f ",getarea());
    }
}
class Triangle implements Card{
    double side1,side2,side3;
    Triangle(double side1,double side2,double side3){
        this.side1=side1;
        this.side2=side2;
        this.side3=side3;
    }
    public double getarea() {
        double p=(side1+side2+side3)/2;
        double area=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
        return area;
    }
    public boolean validate() {
        if(side1<0||side2<0||side3<0)
            return false;
        if(side1+side2<=side3||side2+side3<=side1||side1+side3<=side2)
            return false;
        return true;
    }
    public void showStatus() {
        System.out.printf("Triangle:%.2f ",getarea());
    }
}
class Trapezoid implements Card{
    double upside,downside,high;
    Trapezoid(double upside,double downside,double high){
        this.upside=upside;
        this.downside=downside;
        this.high=high;
    }
    public double getarea() {
        return (upside+downside)*high/2;
    }
    public boolean validate() {
        if(upside<0||downside<0||high<0)
            return false;
        return true;
    }
    public void showStatus() {
        System.out.printf("Trapezoid:%.2f ",getarea());
    }
}
public class Main{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        ArrayList<Card> sb = new ArrayList<Card>();
        int arr[]=new int[1000];
        int count=0;
        double sum=0;
        while(true)
        {
            int x=in.nextInt();
            if(x==0)
            {
                break;
            }
            if(x<1||x>4)
            {
                System.out.println("Wrong Format");
                return ;
            }
            arr[count]=x;
            count++;
            
        }
        for(int i=0;i<count;i++)
        {
            if(arr[i]==1)
                {         
                double y=in.nextDouble();
                Circle somebody=new Circle(y);
                if(y<0)
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
                sb.add(somebody);
                }
            else if(arr[i]==2)
              {
                double y1=in.nextDouble();
                double m=in.nextDouble();
                if(y1<0||m<0)
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
                Rectangle somebody1=new Rectangle(y1,m);
                sb.add(somebody1);
              }
            else if(arr[i]==3)
            {
                double y2=in.nextDouble();
                double m2=in.nextDouble();
                double n2=in.nextDouble();
                Triangle somebody2=new Triangle(y2,m2,n2);
                if(y2<0||m2<0||n2<0||somebody2.validate()==false)
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
                
                sb.add(somebody2);
            }        
            else if(arr[i]==4)
            {
                double y3=in.nextDouble();
                double m3=in.nextDouble();
                double n3=in.nextDouble();
                if(y3<0||m3<0||n3<0)
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
                Trapezoid somebody3=new Trapezoid(y3,m3,n3);
                sb.add(somebody3);
            
            }
        }
        Iterator it=sb.iterator();
        System.out.println("The original list:");
        for(int i=0;i<sb.size();i++)
        {
            sb.get(i).showStatus();;
            sum+=sb.get(i).getarea();
        }
         Collections.sort(sb, new Comparator<Card>() {
                @Override
                public int compare(Card o1, Card o2) {
                    double num1 =o1.getarea();
                    double num2 =o2.getarea();
                    if (num1 < num2) {
                        return 1;
                    } else if (num1 > num2) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
        System.out.println("");
        System.out.println("The sorted list:");
        for(int i=0;i<sb.size();i++)
        {
            sb.get(i).showStatus();;
        }
        System.out.println("");
        System.out.print("Sum of area:");
        System.out.printf("%.2f",sum);
    }
        
        
        
        
        
    }

度量:

 

 分析:此次作业并没有太复杂,我并没有按照学校所给类图完全一样的进行编写,而是将所有的类(除了Main类)都继承了Card类然后直接在Main类中输出。

题目集7

7-2

该题代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Scanner;

abstract interface Card{
    public double getarea();
    public void showStatus();
    public boolean validate();
}
class Circle implements Card{
    double radius;
    Circle(double radius){
        this.radius=radius;
    }
    public double getarea() {
        return Math.PI*radius*radius;
    }
    public boolean validate() {
        if(radius<0)
            return false;
        return true;
    }
    public void showStatus() {
        System.out.printf("Circle:%.2f ",getarea());
    }
}
class Rectangle implements Card{
    double width,length;
    Rectangle(double width,double length){
        this.width=width;
        this.length=length;
    }
    public double getarea() {
        return width*length;
    }
    public boolean validate() {
        if(width<0||length<0)
            return false;
        return true;
    }
    public void showStatus() {
        System.out.printf("Rectangle:%.2f ",getarea());
    }
}
class Triangle implements Card{
    double side1,side2,side3;
    Triangle(double side1,double side2,double side3){
        this.side1=side1;
        this.side2=side2;
        this.side3=side3;
    }
    public double getarea() {
        double p=(side1+side2+side3)/2;
        double area=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
        return area;
    }
    public boolean validate() {
        if(side1<0||side2<0||side3<0)
            return false;
        if(side1+side2<=side3||side2+side3<=side1||side1+side3<=side2)
            return false;
        return true;
    }
    public void showStatus() {
        System.out.printf("Triangle:%.2f ",getarea());
    }
}
class Trapezoid implements Card{
    double upside,downside,high;
    Trapezoid(double upside,double downside,double high){
        this.upside=upside;
        this.downside=downside;
        this.high=high;
    }
    public double getarea() {
        return (upside+downside)*high/2;
    }
    public boolean validate() {
        if(upside<0||downside<0||high<0)
            return false;
        return true;
    }
    public void showStatus() {
        System.out.printf("Trapezoid:%.2f ",getarea());
    }
}

public class Main{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        ArrayList<Card> sb = new ArrayList<Card>();
        ArrayList<Card> sb1 = new ArrayList<Card>();
        ArrayList<Card> sb2 = new ArrayList<Card>();
        ArrayList<Card> sb3 = new ArrayList<Card>();
        ArrayList<Card> sb4 = new ArrayList<Card>();
        int arr[]=new int[1000];
        int count=0;
        double sum=0;
        double max=0;
        while(true)
        {
            int x=in.nextInt();
            if(x==0)
            {
                break;
            }
            if(x<1||x>4)
            {
                System.out.println("Wrong Format");
                return ;
            }
            arr[count]=x;
            count++;
            
        }
        if(count==0)
        {
            System.out.println("Wrong Format");
            System.exit(0);
        }
        for(int i=0;i<count;i++)
        {
            if(arr[i]==1)
                {         
                double y=in.nextDouble();
                Circle somebody=new Circle(y);
                if(y<0)
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
                sb.add(somebody);
                sb1.add(somebody);
                }
            else if(arr[i]==2)
              {
                double y1=in.nextDouble();
                double m=in.nextDouble();
                if(y1<0||m<0)
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
                Rectangle somebody1=new Rectangle(y1,m);
                sb.add(somebody1);
                sb2.add(somebody1);
              }
            else if(arr[i]==3)
            {
                double y2=in.nextDouble();
                double m2=in.nextDouble();
                double n2=in.nextDouble();
                Triangle somebody2=new Triangle(y2,m2,n2);
                if(y2<0||m2<0||n2<0||somebody2.validate()==false)
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
                
                sb.add(somebody2);
                sb3.add(somebody2);
            }        
            else if(arr[i]==4)
            {
                double y3=in.nextDouble();
                double m3=in.nextDouble();
                double n3=in.nextDouble();
                if(y3<0||m3<0||n3<0)
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
                Trapezoid somebody3=new Trapezoid(y3,m3,n3);
                sb.add(somebody3);
                sb4.add(somebody3);
            }
        }
        Iterator it=sb.iterator();
        System.out.println("The original list:");
        System.out.print("[");
        for(int i=0;i<sb.size();i++)
        {
            sb.get(i).showStatus();;
            max=Math.max(max,sb.get(i).getarea());
        }
        System.out.print("]");
        System.out.println("");
        System.out.println("The Separated List:");
        System.out.print("[");
        sum=0;
        for(int i=0;i<sb1.size();i++)
        {
            sb1.get(i).showStatus();;
            sum+=sb1.get(i).getarea();
        }
        max=Math.max(max, sum);
        System.out.print("]");
        System.out.print("[");
        sum=0;
        for(int i=0;i<sb2.size();i++)
        {
            sb2.get(i).showStatus();;
            sum+=sb2.get(i).getarea();
        }
        max=Math.max(max, sum);
        System.out.print("]");
        System.out.print("[");
        sum=0;
        for(int i=0;i<sb3.size();i++)
        {
            sb3.get(i).showStatus();;
            sum+=sb3.get(i).getarea();
        }
        max=Math.max(max, sum);
        System.out.print("]"); 
        System.out.print("[");
        sum=0;
        for(int i=0;i<sb4.size();i++)
        {
            sb4.get(i).showStatus();;
            sum+=sb4.get(i).getarea();
        }
        max=Math.max(max, sum);
        System.out.print("]");
        System.out.println("");
        
         Collections.sort(sb1, new Comparator<Card>() {
                @Override
                public int compare(Card o1, Card o2) {
                    double num1 =o1.getarea();
                    double num2 =o2.getarea();
                    if (num1 < num2) {
                        return 1;
                    } else if (num1 > num2) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
         Collections.sort(sb2, new Comparator<Card>() {
                @Override
                public int compare(Card o1, Card o2) {
                    double num1 =o1.getarea();
                    double num2 =o2.getarea();
                    if (num1 < num2) {
                        return 1;
                    } else if (num1 > num2) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
         Collections.sort(sb3, new Comparator<Card>() {
                @Override
                public int compare(Card o1, Card o2) {
                    double num1 =o1.getarea();
                    double num2 =o2.getarea();
                    if (num1 < num2) {
                        return 1;
                    } else if (num1 > num2) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
         Collections.sort(sb4, new Comparator<Card>() {
                @Override
                public int compare(Card o1, Card o2) {
                    double num1 =o1.getarea();
                    double num2 =o2.getarea();
                    if (num1 < num2) {
                        return 1;
                    } else if (num1 > num2) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
         System.out.println("The Separated sorted List:");
            System.out.print("[");
            for(int i=0;i<sb1.size();i++)
            {
                sb1.get(i).showStatus();;
            }
            System.out.print("]");
            System.out.print("[");
            for(int i=0;i<sb2.size();i++)
            {
                sb2.get(i).showStatus();;
            }
            System.out.print("]");
            System.out.print("[");
            for(int i=0;i<sb3.size();i++)
            {
                sb3.get(i).showStatus();;
            }
            System.out.print("]"); 
            System.out.print("[");
            for(int i=0;i<sb4.size();i++)
            {
                sb4.get(i).showStatus();;
            }
            System.out.print("]");
            System.out.println("");
        System.out.print("The max area:");
        System.out.printf("%.2f",max);
    }
        
        
        
        
        
    }

度量:

 

 分析:该题是建立在上一题的基础上进行改变,所设的类大体上与上一题并没有什么区别,但在Main类中运用了Collection接口,将其用方法重载的方式进行修改。

对于这两道题递进式的设计分析:先建立一个Card抽象类接口,然后建立Circle,Rectangle,Triangle,Trapezoid类继承并完善其继承的方法,然后在Main类中进行输入的判定和输出,第二题要比第一题多Collection方法的改变即可。

(二)题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

题目集8

该题代码如下:

import java.text.DecimalFormat;
import java.util.Scanner;
class Bank{
    String name="";
    String [][]account=new String[1000][1000];
    double []money=new double[100];
    int count;
}
public class Main {
  public static void main(String[] args) {
      Scanner in=new Scanner(System.in);
      DecimalFormat df=new DecimalFormat("0.00");
      int []atm=new int[10];
      for(int i=1;i<7;i++) {
         if(i<=4)
        atm[i]=1;
        else
        atm[i]=2;
      }
      Bank []arr=new Bank[10];
     for(int i=0;i<10;i++)
     {
         arr[i]=new Bank();
     if(i==0)
      arr[i].name="杨过";
      arr[i].count=1;
      arr[i].account[0][0]="6217000010041315709";
      arr[i].account[0][1]="6217000010041315715";
      arr[i].account[1][0]="6217000010041315718";
      arr[i].money[0]=10000.00;
      arr[i].money[1]=10000.00;
     if(i==1) 
     {
      arr[i].name="郭靖";
      arr[i].count=1;
      arr[i].account[0][0]="6217000010051320007";
      arr[i].money[0]=10000.00;
     }
      if(i==2)
      {
      arr[i].name="张无忌";
      arr[2].count=2;
      arr[i].account[0][0]="6222081502001312389";
      arr[i].account[1][0]="6222081502001312390";
      arr[i].account[2][0]="6222081502001312399";
      arr[i].account[2][1]="6222081502001312400";
      arr[i].money[0]=10000.00;
      arr[i].money[1]=10000.00;
      arr[i].money[2]=10000.00;
     }
      if(i==3)
      {
      arr[i].name="韦小宝";
      arr[i].count=2;
      arr[i].account[0][0]="6222081502051320785";
      arr[i].account[1][0]="6222081502051320786";
      arr[i].money[0]=10000.00;
      arr[i].money[1]=10000.00;
      }
     }
      while(true)
      {
          int cnt=0;
          String sb=in.nextLine();
          String[] array=sb.split("\\s+");
          if(array[0].equals("#"))
            {
                break;
            }
          if(array.length==1)
            {
                for(int i=0;i<4;i++)
                {
                    for(int j=0;j<arr[i].account.length;j++)
                    {
                        for(int k=0;k<arr[i].account.length;k++)
                        {
                            if(array[0].equals(arr[i].account[j][k]))
                            {
                            System.out.println("¥"+df.format(arr[i].money[j]));
                            }
                        }
                    }
                }
            }
          else
          {
              int m=0,n=0;
              for(int i=0;i<4;i++)
                {
                    for(int j=0;j<arr[i].account.length;j++)
                    {
                        for(int k=0;k<arr[i].account[j].length;k++)
                        {
                            if(array[0].equals(arr[i].account[j][k]))
                            {
                                cnt=1;
                                m=i;
                                n=j;
                                break;
                            }
                        }
                    }
                }
                if(cnt==0)
                {
                    System.out.println("Sorry,this card does not exist.");
                    continue;
                }
              if(!array[1].equals("88888888"))
              {
                  System.out.println("Sorry,your password is wrong.");
                  continue;
              }
              if(!array[2].equals("01")&&!array[2].equals("02")&&!array[2].equals("03")&&!array[2].equals("04")&&!array[2].equals("05")&&!array[2].equals("06"))
              {
                  System.out.println("Sorry,the ATM's id is wrong.");
                  continue;
              }
              double money = Float.valueOf(array[3]).floatValue();
              if((double)money>(double)arr[m].money[n])
                {
                    System.out.println("Sorry,your account balance is insufficient.");
                    continue;
                }
                int Str = Integer.valueOf(array[2]);
                if(atm[Str]!=arr[m].count)
                {
                    System.out.println("Sorry,cross-bank withdrawal is not supported.");
                    continue;
                }
                if(money<=0)
                {
                    if(arr[m].count==1)
                    {
                        System.out.print(arr[m].name+"在中国建设银行的"+array[2]+"号ATM机上存款¥");
                        System.out.println(df.format(-money));
                    }
                    else {
                        System.out.print(arr[m].name+"在中国工商银行的"+array[2]+"号ATM机上存款¥");
                        System.out.println(df.format(-money));
                    }
                }
                else {
                    if(arr[m].count==2)
                    {
                        System.out.print(arr[m].name+"在中国建设银行的"+array[2]+"号ATM机上取款¥");
                        System.out.println(df.format(money));
                    }
                    else {
                        System.out.print(arr[m].name+"在中国工商银行的"+array[2]+"号ATM机上取款¥");
                        System.out.println(df.format(money));
                    }
                }
                arr[m].money[n]+=(-money);
                System.out.println("当前余额为¥"+df.format(arr[m].money[n]));
            }
        }
      in.close();
        }
    }

度量:

 

 分析设计思路:该题我并没有按照学校所给类图进行编写,而是先用Bank类充当结构体,并将所给信息输入到结构体中,再在Main类中直接暴力输出即可。

题目集9

该题代码如下:

import java.util.*;
import java.util.regex.*;
class Account {
    private String accountNO;
    private float balance = 0;
    private User user = null;
    private Bank bank = null;
    int ke=0;
    private static ArrayList<Card> list = new ArrayList<Card>();

    public Account() {
        super();
    }
    public Account(String accountNO, float balance, User user, Bank bank,int a) 
    {
        super();
        this.accountNO = accountNO;
        this.balance = balance;
        this.user = user;
        this.bank = bank;
        ke=a;
    }

    public void addCard(Card card) {
        list.add(card);
    }

    public void removeCard(Card card) {
        list.remove(card);
    }

    public float getBalance() {
        return balance;
    }

    public void setBalance(float balance) {
        this.balance = balance;
    }

    public String getAccountNO() {
        return accountNO;
    }

    public void setAccountNO(String accountNO) {
        this.accountNO = accountNO;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Bank getBank() {
        return bank;
    }

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

    public ArrayList<Card> getList() {
        return list;
    }

    public void setList(ArrayList<Card> list) {
        Account.list = list;
    }

    public static Account getAmountbyCardNO(String cardNO) {
        Iterator<Card> cardItr = Account.list.iterator();
        Card card = null;

        while (cardItr.hasNext()) {
            card = cardItr.next();
            if (card.getCardNO().equals(cardNO)) {
                return card.getAccount();
            }
        }

        return null;
    }
     public void swap(int[] A, int a, int b) {
            int temp = A[a];
            A[a] = A[b];
            A[b] = temp;
        }
        public void reverseArray(int[] A, int start, int end) {
            while(start < end) {
                int temp = A[start];
                A[start++] = A[end]; 
                A[end--] = temp; 
            }
        }
        public boolean judgeArray(int[] A) {
            for(int i = 1;i < A.length;i++) {
                if(A[i - 1] < A[i])
                    return true;
            }
            return false;
        }
        public int getFirstI(int[] A) {
            int first = A.length - 1;
            for(int i = first;i >= 1;i--) {
                if(A[i - 1] < A[i]) {
                    first = i - 1;
                    break;
                }
            }
            return first;
        }
        public int getFirstJ(int[] A) {
            int j = getFirstI(A);
            int valueI = A[j];
            j++;
            for(;j < A.length;j++) {
                if(A[j] <= valueI) {
                    j = j - 1;
                    break;
                }
            }
            if(j == A.length)
                j = j - 1;
            return j;
        }
        
        public void printResult(int[] A, int x) {
            if(x == 1) {
                for(int m = 0;m < A.length;m++)
                    System.out.print(A[m]);
                return;
            }
            int i, j;
            while(judgeArray(A)) {
                i = getFirstI(A);
                j = getFirstJ(A);
                swap(A, i, j);
                reverseArray(A, i + 1, A.length - 1);
                int count=0;
                count++;
                if(count == x)
                    break;
            }
            for(int m = 0;m < A.length;m++)
                System.out.print(A[m]);
            return;
        }
}
class ATM {
    private String ATMID;
    private Bank bank = null;

    public ATM() {
        super();
    }

    public ATM(String aTMID, Bank bank) {
        super();
        ATMID = aTMID;
        this.bank = bank;
    }

    public String getATMID() {
        return ATMID;
    }

    public void setATMID(String aTMID) {
        ATMID = aTMID;
    }

    public Bank getBank() {
        return bank;
    }

    public void setBank(Bank bank) {
        this.bank = bank;
    }
}
class Bank {
    private String bankNO;
    private String bankName;
    private ArrayList<Account> accountList = new ArrayList<Account>();
    private ArrayList<ATM> ATMList = new ArrayList<ATM>();
    float chong;
    public Bank() {
        super();
    }

    public Bank(String bankNO, String bankName,float a) 
    {
        super();
        this.bankNO = bankNO;
        this.bankName = bankName;
        chong=a;
    }
    
    public String getBankNO() {
        return bankNO;
    }

    public void setBankNO(String bankNO) {
        this.bankNO = bankNO;
    }

    public String getBankName() {
        return bankName;
    }

    public void setBankName(String bankName) {
        this.bankName = bankName;
    }

    public void addAccount(Account account) {
        this.accountList.add(account);
    }

    public void removeAccount(Account account) {
        this.accountList.remove(account);
    }

    public void addATM(ATM aTM) {
        this.ATMList.add(aTM);
    }

    public void removeATM(ATM aTM) {
        this.ATMList.remove(aTM);
    }

    public ArrayList<Account> getAccountList() {
        return accountList;
    }

    public void setAccountList(ArrayList<Account> accountList) {
        this.accountList = accountList;
    }

    public ArrayList<ATM> getATMList() {
        return ATMList;
    }

    public void setATMList(ArrayList<ATM> aTMList) {
        ATMList = aTMList;
    }
}
class Card {
    private String cardNO;
    private String cardPassword;
    private Account account = null;

    public Card() {
        super();
    }

    public Card(String cardNO, String cardPassword, Account account) {
        super();
        this.cardNO = cardNO;
        this.cardPassword = cardPassword;
        this.account = account;
    }

    public String getCardNO() {
        return cardNO;
    }

    public void setCardNO(String cardNO) {
        this.cardNO = cardNO;
    }

    public String getCardPassword() {
        return cardPassword;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public void setCardPassword(String cardPassword) {
        this.cardPassword = cardPassword;
    }

    public boolean checkCard() {
        Pattern p = Pattern.compile("\\d{16}+");
        Matcher m = p.matcher(this.cardNO);
        return m.matches();
    }

    public boolean checkPassword(String password) {
        return this.cardPassword.equals(password);
    }
    
}
class UnionPay {
    private ArrayList<Bank> bankList = new ArrayList<Bank>();
    public UnionPay() {
        super();
    }

    public UnionPay(ArrayList<Bank> bankList) {
        super();
        this.bankList = bankList;
    }

    public ArrayList<Bank> getBankList() {
        return bankList;
    }

    public void setBankList(ArrayList<Bank> bankList) {
        this.bankList = bankList;
    }

    public void addBank(Bank bank) {
        this.bankList.add(bank);
    }

    public void removeBank(Bank bank) {
        this.bankList.remove(bank);
    }
}
class User {
    private String ID;
    private String name;
    private String Phone;
    ArrayList<Account> list = new ArrayList<Account>();
    public User() 
    {
        super();
    }

    public User(String iD, String name, String phone) {
        super();
        ID = iD;
        this.name = name;
        Phone = phone;
    }

    public String getID() {
        return ID;
    }

    public void setID(String iD) {
        ID = iD;
    }

    public String getPhone() {
        return Phone;
    }

    public void setPhone(String phone) {
        Phone = phone;
    }

    public String getName() {
        return name;
    }

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

    public void addAccount(Account account) {
        this.list.add(account);
    }

    public void removeAccount(Account account) {
        this.list.remove(account);
    }
    
}
public class Main {
    public static void main(String[] argc)
    {
        Scanner in =new Scanner(System.in);
        User user1=new User("asd","杨过","asd");
        User user2=new User("asd","郭靖","asd");
        User user3=new User("asd","张无忌","asd");
        User user4=new User("asd","韦小宝","asd");
        User user5=new User("asd","张三丰","asd");
        User user6=new User("asd","令狐冲","asd");
        User user7=new User("asd","乔峰","asd");
        User user8=new User("asd","洪七公","asd");
        UnionPay union =new UnionPay();
        Bank bank1=new Bank("qwer","中国建设银行",(float)0.02);
        ATM at1=new ATM("01",bank1);
        bank1.addATM(at1);
        ATM at2=new ATM("02",bank1);
        bank1.addATM(at2);
        ATM at3=new ATM("03",bank1);
        bank1.addATM(at3);
        ATM at4=new ATM("04",bank1);
        bank1.addATM(at4);
        Bank bank2=new Bank("qwert","中国工商银行",(float)0.03);
        ATM at5=new ATM("05",bank2);
        bank2.addATM(at5);
        ATM at6=new ATM("06",bank2);
        bank2.addATM(at6);

        Bank bank3=new Bank("qwertyu","中国农业银行",(float)0.04);
        ATM at7=new ATM("07",bank3);
        bank3.addATM(at7);
        ATM at8=new ATM("08",bank3);
        bank3.addATM(at8);
        ATM at9=new ATM("09",bank3);
        bank3.addATM(at9);
        ATM at10=new ATM("10",bank3);
        bank3.addATM(at10);
        ATM at11=new ATM("11",bank3);
        bank3.addATM(at11);
        Account acconut1=new Account("3217000010041315709",10000,user1,bank1,0);
        Account acconut2=new Account("3217000010041315715",10000,user1,bank1,0);
        Account acconut3=new Account("3217000010051320007",10000,user2,bank1,0);
        Account acconut4=new Account("3222081502001312389",10000,user3,bank2,0);
        Account acconut5=new Account("3222081502001312390",10000,user3,bank2,0);
        Account acconut6=new Account("3222081502001312399",10000,user3,bank2,0);
        Account acconut7=new Account("3222081502051320785",10000,user4,bank2,0);
        Account acconut8=new Account("3222081502051320786",10000,user4,bank2,0);
        Account acconut9=new Account("3640000010045442002",10000,user5,bank1,1);
        Account acconut10=new Account("3640000010045441009",10000,user6,bank2,1);
        Account acconut11=new Account("3630000010033431001",10000,user7,bank3,1);
        Account acconut12=new Account("3630000010033431008",10000,user8,bank3,1);
        
        Card card1=new Card("6217000010041315709","88888888",acconut1);
        Card card2=new Card("6217000010041315715","88888888",acconut1);
        Card card3=new Card("6217000010041315718","88888888",acconut2);
        Card card4=new Card("6217000010051320007","88888888",acconut3);
        Card card5=new Card("6222081502001312389","88888888",acconut4);
        Card card6=new Card("6222081502001312390","88888888",acconut5);
        Card card7=new Card("6222081502001312399","88888888",acconut6);
        Card card8=new Card("6222081502001312400","88888888",acconut6);
        Card card9=new Card("6222081502051320785","88888888",acconut7);
        Card card10=new Card("6222081502051320786","88888888",acconut8);
        Card card11=new Card("6640000010045442002","88888888",acconut9);
        Card card12=new Card("6640000010045442003","88888888",acconut9);
        Card card13=new Card("6640000010045441009","88888888",acconut10);
        Card card14=new Card("6630000010033431001","88888888",acconut11);
        Card card15=new Card("6630000010033431008","88888888",acconut12);
        acconut1.addCard(card1);
        acconut1.addCard(card2);
        acconut2.addCard(card3);
        acconut3.addCard(card4);
        acconut4.addCard(card5);
        acconut5.addCard(card6);
        acconut6.addCard(card7);
        acconut6.addCard(card8);
        acconut7.addCard(card9);
        acconut8.addCard(card10);
        acconut9.addCard(card11);
        acconut9.addCard(card12);
        acconut10.addCard(card13);
        acconut11.addCard(card14);
        acconut12.addCard(card15);
        bank1.addAccount(acconut1);
        bank1.addAccount(acconut2);
        bank1.addAccount(acconut3);
        bank1.addAccount(acconut9);
        
        bank2.addAccount(acconut4);
        bank2.addAccount(acconut5);
        bank2.addAccount(acconut6);
        bank2.addAccount(acconut7);
        bank2.addAccount(acconut8);
        bank2.addAccount(acconut10);
        
        bank3.addAccount(acconut11);
        bank3.addAccount(acconut12);
        
        union.addBank(bank1);
        union.addBank(bank2);
        union.addBank(bank3);
        while(true)
        {
            String adc;
            adc=in.nextLine();
        String[] temp=adc.split("\\s+");
        if(temp[0].equals("#"))
        {
            break;
        }
        else {
            if(temp.length==1)
            {
            Card card=getCardbyCardNO(union,temp[0]);
                if(card==null)
                {
                    System.out.println("Sorry,this card does not exist.");
                }
                else {
                    System.out.printf("业务:查询余额 ¥%.2f",card.getAccount().getBalance());
                }
            }
            else {
                withdraw(union,temp);
            }
        }
        }
    }
    public static ATM getATMbyATMID(UnionPay unionPay, String ATMID) {
        Iterator<Bank> bankItr = unionPay.getBankList().iterator();
        Bank bank = null;
        ATM aTM = null;

        while (bankItr.hasNext()) {
            bank = bankItr.next();
            Iterator<ATM> aTMItr = bank.getATMList().iterator();

            while (aTMItr.hasNext()) {
                aTM = aTMItr.next();
                if (aTM.getATMID().equals(ATMID)) {
                    return aTM;
                }
            }
        }
        return null;
    }
    public static Card getCardbyCardNO(UnionPay unionPay, String cardNO) {
        Card card = null;
        Iterator<Bank> bankItr = unionPay.getBankList().iterator();

        while (bankItr.hasNext()) {
            ArrayList<Account> accountList = bankItr.next().getAccountList();
            Iterator<Account> accountItr = accountList.iterator();
            while (accountItr.hasNext()) {
                ArrayList<Card> cardList = accountItr.next().getList();
                Iterator<Card> cardItr = cardList.iterator();
                while (cardItr.hasNext()) {
                    card = cardItr.next();
                    if (card.getCardNO().equals(cardNO)) {
                        return card;
                    }
                }
            }
        }
        return null;
    }
    public static void showResult(UnionPay unionPay,Account account, int flag,String ATMID,float amount) 
    {
        String type = "";
        if (flag == 1) {
            type = "取款";
            System.out.print("业务:取款 ");
        } else {
            type = "存款";
            System.out.print("业务:存款 ");
            amount *= -1;
        }
        ATM aTM = getATMbyATMID(unionPay, ATMID);
        String userName = account.getUser().getName();
        String bankName = aTM.getBank().getBankName();//account.getBank().getBankName();
        System.out.println(userName + "在" + bankName + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount));
        System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance()));
    }

    public static void withdraw(UnionPay unionPay, String adc[]) 
    {
        String cardNO=adc[0];
        String cardPassword=adc[1];
        String ATMID=adc[2];
        Float amount=Float.valueOf(adc[3]).floatValue();;
        Card card =  getCardbyCardNO(unionPay, cardNO);
        if (card == null) {
            System.out.println("Sorry,this card does not exist.");
            System.exit(0);
        }
        ATM aTM = getATMbyATMID(unionPay, ATMID);
        if (aTM == null) {
            System.out.println("Sorry,the ATM's id is wrong.");
            System.exit(0);
        }
        Account account = Account.getAmountbyCardNO(cardNO);
        float balance = account.getBalance();
        if (!card.getCardPassword().equals(cardPassword)) {
            System.out.println("Sorry,your password is wrong.");
            System.exit(0);
        }
        float temp=0;
        if (account.getBank().getBankName() != aTM.getBank().getBankName()) {
            temp=amount*aTM.getBank().chong;
        }
        if (amount >= balance-temp) {
            
            if(card.getAccount().ke!=1||balance-amount-temp<-50000)
            {
                System.out.println("Sorry,your account balance is insufficient.");    
                System.exit(0);
            }
            else 
            {
                if(balance-temp<=0)
                    balance=(float)(balance-amount*0.05);
                else
                balance=(float)(balance-(amount-balance)*0.05);
            
            }
        }
        balance-=temp;

        account.setBalance(balance - amount);
        if (amount >= 0) { 
            showResult(unionPay,account, 1,ATMID,amount);
        } else {
            showResult(unionPay,account, 0,ATMID,amount);
        }

    }
}

度量:

 

 分析设计思路:该题是在上一道题目集的基础上进行改变,不仅可以跨行进行业务,银行还要增加手续费,编在上一道题基础上进行类的增加即可。

三、三次作业遇到的bug及采坑心得

题目集7

这次作业第一题并不难只要充分理解任务书中的类图即可写出,第二道题在第一道题基础上进行改变但有的同学问我Collcetion接口怎么使用,下面是我对Collection的理解:

Collection 接口有 3 种子类型集合: List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、ArrayBlockingQueue等,下面是Collection的所有方法。

这些方法即可以操作Set集合,也可以操作Queue和List集合,下面分别使用Collection集合接口的方法说明

 

 

  • 下面是主要方法的演示:

 

 @Test
    @SuppressWarnings("all")
    public void testCollection() {
        // 创建Collection接口的实现
        Collection collection = new ArrayList<>();
        // 添加元素
        collection.add("嘻嘻");
        String src = "????";
        collection.add(src);
        System.out.println(collection);

        // 创建Collection的实现
        Collection<String> coll = new HashSet<>();
        coll.add("?");
        coll.add("?");
        coll.add("?");
        System.out.println(coll);
        // 添加一个集合数据
        collection.addAll(coll);
        // 输出集合的长度
        System.out.println(collection);
        // 判断是否包含
        System.out.println(collection.contains("?"));
        // 移除元素
        collection.remove("?");
        // 添加对象
        collection.add(new Person("张三", 23, 5000d));
        // 当认为两个对象属性一致,相等时候,需重写hashCode 和 equals方法
        System.out.println(collection.contains(new Person("张三", 23, 5000d)));

        System.out.println("-------");
        collection.add(null);
    
        Collection<String> collection1 = new ArrayList<>();
        collection1.add("嘻嘻");
        collection1.add("?");
        // 求两个集合的交集(只保留collection1存在的元素)
        collection.retainAll(collection1);
        System.out.println(collection);
        // 清空元素
        collection.clear();
        System.out.println(collection);
    }

 

题目集8

这次作业就一道题但当时就把我给难住了因为任务书所给的类过于复杂,有些类的用处一直弄不明白,当时便灵机一动,建立一个结构体将信息输入结构体中直接在主函数中暴力输出即可。

题目集9

这次作业是建立在上一次作业的基础上进行改变,并没有遇到什么困难。

四、改进建议

题目集7

7-1题可以将Main函数进行再一次的简化使代码的复用性变高,7-2题可以运用除Collection接口的别的应用框架接口,并不一定要按照学校发的类图来完成。

题目集8

该题不一定一定要按照任务书所给的类图来进行编写,可以有自己的思路。

题目集9

该题可以用抽象类的接口然后让别的类继承其接口完成所给方法。

五、总结

这三次作业我收获颇多,对于java面向对象的概率有了更深的理解,以及加深了对于java集合框架应用的掌握,会使用抽象类和接口以及对于类的关系、类图等的运用,同时在OO的学习中也改变了我写代码不喜欢换行加空格的风格。对于日后的学习我会继续加深对于集合框架的理解,还有Set、Map、List接口的应用使其真正的成为自己的“武器”。最后也希望在学习OO的过程中能在以后的学习中学到更多书上本没有的但对我编代码十分有用的知识,写到更加具有代表性的题型,扩展自己的视野。

posted @ 2021-06-15 17:01  羁绊少年  阅读(60)  评论(0)    收藏  举报