题目集7-9总结

前言:7-9题目集的实验,慢慢的一学期也就过去了,事件流逝的真的很快,从java一个连类都写不好,慢慢也开始步入有难度的台阶了,类的继承、多态性越学越觉得用法之活,本来在做完4-6我以为我现在已经很厉害了,但自从做完7-9,觉得要学的东西还是有太多,了解还是太浅薄了,还需要努力前进啊!

题目集七:

7-1 图形卡片排序游戏 ,和题目集6的7-5有异曲同工之妙,难度不高,就是把每一个类写清楚,对父类图形进行合理的继承,7-2整体和7-1没差很多,就是后面输入的情况麻烦一些,本次作业整体的难度适中,写出一个就可以熟练上手。

题目集八:

7-3 ATM机类结构设计,有难度,也很麻烦,各类信息的插入,以及各种验证是否出现错误,要一环套一环,并非直接就写出来,这次作业写了很长时间,很感谢同学能不厌其烦的教授我如何才能建好表来存入这些数据,这才成功解决了这次作业,给我个人感觉,这次作业如果对表、数组很熟练的话难度适中,如果不熟练像我这样就难度较大。

题目集九:

7-1 ATM机类结构设计(二),和上次相仿,能把上次做出来,这次难度也就没那么大了,多了一些条件,比如跨行取款,以及欠钱,而且还是分人的,感觉这个题很活,怎么说呢,有灵性,个人比较符合现实吧,而且感觉很实用,做完十分有收获感,一种自己培养很长时间的作物终于收获的感觉,挺快乐的,也加深了对JAVA设计的印象(苦难也终于是结束了+-+)。

设计与分析:

1.题目集七 7-1 图形卡片排序游戏

掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书 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:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
  2. 排序后的各图形类型及面积,格式同排序前的输出;
  3. 所有图形的面积总和,格式为Sum of area:总面积值

输入样例1:

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

1 5 3 2 0
 
结尾无空行

输出样例1:

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

Wrong Format
 
结尾无空行

输入样例2:

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

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5
 
结尾无空行

输出样例2:

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

The original list:
Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 
The sorted list:
Circle:98.52 Triangle:4.02 Rectangle:3.22 Trapezoid:1.14 
Sum of area:106.91
 
结尾无空行

输入样例3:

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

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 8.4
结尾无空行

输出样例3:

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

Wrong Format

可能也是快临结束了,老师仁慈了,这里面竟然有类图,芜湖,真心的舒服,主方法源码也是给了的,我直接码农附体,老师让我怎么做我就怎么做,按照类图所给的一步一步来,所有图形类都要继承Shape类,每一个类的方法也给的很是详细,大大简化了整体实验的难度,其中各种图形基本操作都是一样的(也就是除开它自身的特色,就没有不一样的,一样的得面积等等),而本题着重讲述的是卡牌的排序,这点会在后面叙述,先把简单的图形类的代码上来:

abstract class Shape{
    private String shapeName;
    public Shape() {
        
    }
    public Shape(String shapeName) {
        this.setShapeName(shapeName);
    }
    public String getShapeName() {
        return shapeName;
    }
    public void setShapeName(String shapeName) {
        this.shapeName = shapeName;
    }
    public abstract double getArea();
    public abstract boolean validate();
    public String toString() {
        return getShapeName()+":"+String.format("%.2f ", getArea());
    }
}
class Circle extends Shape{
    private double radius;
    public Circle() {
        
    }
    public Circle(double radius) {
        this.setRadius(radius);
    }
    public double getRadius() {
        return radius;
    }
    public void setRadius(double radius) {
        this.radius = radius;
    }
    public double getArea() {
        return Math.PI*radius*radius;
    }
    public boolean validate() {
        if(radius>0) {
            return true;
        }
        else return false;
    }
}
class Rectangle extends Shape{
    private double width,length;
    public Rectangle() {
        
    }
    public Rectangle(double width,double length) {
        this.width = width;
        this.length = length;
    }
    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }
    public double getArea() {
        return width*length;
    }
    public boolean validate() {
        if(width>0&&length>0) {
            return true;
        }
        else return false;
    }
}
class Triangle extends Shape{
    private double side1,side2,side3;
    public Triangle() {
        
    }
    public Triangle(double side1,double side2,double side3) {
        this.setSide1(side1);
        this.setSide2(side2);
        this.setSide3(side3);
    }
    public double getSide3() {
        return side3;
    }
    public void setSide3(double side3) {
        this.side3 = side3;
    }
    public double getSide1() {
        return side1;
    }
    public void setSide1(double side1) {
        this.side1 = side1;
    }
    public double getSide2() {
        return side2;
    }
    public void setSide2(double side2) {
        this.side2 = side2;
    }
    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 boolean validate() {
        double a = side1;
        double b = side2;
        double c = side3;
        if(a>0&&b>0&&c>0) {
            if(a+b>c&&a+c>b&&b+c>a) {
                return true;
            }
            else return false;
        }
        else return false;
    }
}
class Trapezoid extends Shape{
    private double topSide;
    private double bottomSide;
    private double height;
    public Trapezoid() {
        
    }
    public Trapezoid(double topSide,double bottomSide,double height) {
        this.topSide = topSide;
        this.bottomSide = bottomSide;
        this.height = height;
    }
    public double getTopSide() {
        return topSide;
    }
    public void setTopSide(double topSide) {
        this.topSide = topSide;
    }
    public double getBottomSide() {
        return bottomSide;
    }
    public void setBottomSide(double bottomSide) {
        this.bottomSide = bottomSide;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getArea() {
        return (topSide+bottomSide)*height/2;
    }
    public boolean validate() {
        if(topSide>0&&bottomSide>0&&height>0) {
            return true;
        }
        else return false;
    }
}
然后就是让图形与卡片结合起来,这就也就出现了Card类,我个人认为他就是一个中间过渡的类为后面处理卡片列表类进行服务的,可以使操作更为简单,也通过Card类对各种图形类型进行整合,这样处理卡片的类就可以进行操作时,直接拿取,不用进行复杂的引用,方便于操作。代码如下:

class Card implements Comparable<Card>{
    private Shape shape;
    public Card() {
        
    }
    public Card(Shape shape) {
        this.setShape(shape);
    }
    
    public Shape getShape() {
        return shape;
    }
    public void setShape(Shape shape) {
        this.shape = shape;
    }
    public int compareTo(Card card) {
        if(this.getShape().getArea()>=card.getShape().getArea()) {
            return 1;
        }
        else return -1;
    }
}
View Code

然后就是最关键的最终处理者了,处理卡片类,因为他是图形卡片排序,从字面上就可以知道,他肯定不是一张卡片(要不然还能这么费劲?),所以这里是动态数组,这也是为什么要进行注明:import java.util.ArrayList;,这里就有许多细节了,首先就是对于用户输入的数字判别,这里要有一个Switch选择,就是你1是圆2是方的(这里只是举一个例子),也就是你要做到对这个动态数组进行分配,分配到他应该到的位置,也就是圆到圆,方到方,不要让他乱,其次是判断是否符合它对应的输入条件,也就是输入范围合理化,通过一个循环数组,来看是否其中有数据不符合他应有的数据合理范围,如果有则直接say goodbye,没有就能继续往下走,这也能把条件整合起来,也不用每个类的valiable走一遍,方便了许多。然后是一个排序函数,通过排序来达到实验目的,这点可是实验的精髓(假的)没啥难度,我直接声明了一个Collections.reverseOrder(),直接就解决了,这也是声明了import java.util.Collections;的好处,待会代码会有体现,然后就是显示函数了,这没啥好说的,就那样,这里代码和Main我就放到一起了,毕竟main老师已经给好了,没啥好讲的,不废话了,上代码:

class DealCardList{
    ArrayList<Card> cardList = new ArrayList<>();
    public DealCardList() {
        
    }
    public DealCardList(ArrayList<Integer> list) {
        for(Integer a:list) {
            if(a==0) {
                break;
            }
            else {
                switch (a) {
                    case 1:{
                        Card a1 = new Card(new Circle(Main.input.nextDouble()));
                        cardList.add(a1);
                        a1.getShape().setShapeName("Circle");
                        break;
                    }
                    case 2:{
                        Card b1 = new Card(new Rectangle(Main.input.nextDouble(), Main.input.nextDouble()));
                        cardList.add(b1);
                        b1.getShape().setShapeName("Rectangle");
                        break;
                    }
                    case 3:{
                    Card c1 = new Card(new Triangle(Main.input.nextDouble(), Main.input.nextDouble(), Main.input.nextDouble()));
                    cardList.add(c1);
                    c1.getShape().setShapeName("Triangle");
                    break;
                    }
                    case 4:{
                        Card d1 = new Card(new Trapezoid(Main.input.nextDouble(), Main.input.nextDouble(), Main.input.nextDouble()));
                        cardList.add(d1);
                        d1.getShape().setShapeName("Trapezoid");
                        break;
                    }
                }
            }
        }
    }
    public boolean validate() {
        for(Card a:cardList) {
            if(!a.getShape().validate()) {
                return false;
            }
        }
        return true;
    }
    public void cardSort() {
        cardList.sort(Collections.reverseOrder());
        for(int i=0;i<cardList.size();i++) {
            System.out.print(cardList.get(i).getShape());
        }
    }
    public double getALLArea() {
        double sum = 0;
        for(Card a :cardList) {
            sum=sum+a.getShape().getArea();
        }
        return sum;
    }
    public void showResult() {
        System.out.println("The original list:");
        for(Card a : cardList) {
            System.out.print(a.getShape());
        }
        System.out.println("\nThe sorted list:");
        cardSort();
        System.out.printf("\nSum of area:%.2f\n",getALLArea());
    }
}
public class Main {
    //在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
    //使用Main.input.next…即可(避免采坑)
    public static Scanner input = new Scanner(System.in);
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>(); 
        int num = input.nextInt();
        int x=1;
        int j=0;
        for(int i=0;i<10;i++) {
            if(x==1) {
                i++;
                x++;
            }
            if(x==2) {
                j++;
            }
        }
        while(num != 0){
            if(num < 0 || num > 4){
                System.out.println("Wrong Format");
                System.exit(0);
            }
            list.add(num);
            num = input.nextInt();
        }
        DealCardList dealCardList = new DealCardList(list);
    
        if(!dealCardList.validate()){
            System.out.println("Wrong Format");
            System.exit(0);
        }
        dealCardList.showResult();
        input.close();
        }
}
View Code

这道题,整体难度不高,因为老师已经是给出了类图,真的就是按照图来写类,除了一些小细节问题,以及具体方法如何实现有时候要好好想一些时间,其余都是可以接受的,整体来说很适合过度用,可能老师就是为了考察我们的细节的观察以及能否耐下心去仔细琢磨的能力。难点就是处理卡片类,其中的方法一定要仔细摸索的写,但是也没有什么很坑的点,还是比较友好的。

2.题目集七 7-2 图形卡片分组游戏

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

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:面积值

输入样例1:

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

1 5 3 2 0
 
结尾无空行

输出样例1:

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

Wrong Format
 
结尾无空行

输入样例2:

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

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5
 
结尾无空行

输出样例2:

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

The original list:
[Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 ]
The Separated List:
[Circle:98.52 ][Rectangle:3.22 ][Triangle:4.02 ][Trapezoid:1.14 ]
The Separated sorted List:
[Circle:98.52 ][Rectangle:3.22 ][Triangle:4.02 ][Trapezoid:1.14 ]
The max area:98.52
 
结尾无空行

输入样例3:

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

2 1 2 1 1 3 3 4 4 1 1 1 2 1 0
2.3 3.5 2.5 4.5 2.1 2.6 8.5 3.2 3.1 3.6 8.5 7.5 9.1245 6.5 3.4 10.2 11.2 11.6 15.4 5.8 2.13 6.2011 2.5 6.4 18.65
 
结尾无空行

输出样例3:

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

The original list:
[Rectangle:8.05 Circle:19.63 Rectangle:9.45 Circle:21.24 Circle:226.98 Triangle:4.65 Triangle:29.80 Trapezoid:50.49 Trapezoid:175.56 Circle:105.68 Circle:14.25 Circle:120.81 Rectangle:16.00 Circle:1092.72 ]
The Separated List:
[Circle:19.63 Circle:21.24 Circle:226.98 Circle:105.68 Circle:14.25 Circle:120.81 Circle:1092.72 ][Rectangle:8.05 Rectangle:9.45 Rectangle:16.00 ][Triangle:4.65 Triangle:29.80 ][Trapezoid:50.49 Trapezoid:175.56 ]
The Separated sorted List:
[Circle:1092.72 Circle:226.98 Circle:120.81 Circle:105.68 Circle:21.24 Circle:19.63 Circle:14.25 ][Rectangle:16.00 Rectangle:9.45 Rectangle:8.05 ][Triangle:29.80 Triangle:4.65 ][Trapezoid:175.56 Trapezoid:50.49 ]
The max area:1601.31
 
结尾无空行

输入样例4:

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

1 1 3 0
6.5 12.54 3.6 5.3 6.4
 
结尾无空行

输出样例4:

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

The original list:
[Circle:132.73 Circle:494.02 Triangle:9.54 ]
The Separated List:
[Circle:132.73 Circle:494.02 ][][Triangle:9.54 ][]
The Separated sorted List:
[Circle:494.02 Circle:132.73 ][][Triangle:9.54 ][]
The max area:626.75
 
 

这道题,跟上一道题基本没差,就是一些细节的点上进行了修改,比如上一个是要排序,而这个就是要加一个分组,在一个框内输出一个分组,这里一开始我也是没想好,最后还是借鉴了一下别人的代码才想出来的(果然网络是人类进步的阶梯---新时代伟人),这里做的有点笨,就是把每一个组用一个类来展示,当然能做出来就是好方法。由于其根本和上一题基本相似,就是展示的时候有所不同,其他是一样的,没什么好讲的,这里就直接上代码了。

import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
import java.util.ArrayList;
abstract class Shape{
    private String shapeName;
    public Shape() {
        
    }
    public Shape(String shapeName) {
        this.setShapeName(shapeName);
    }
    public String getShapeName() {
        return shapeName;
    }
    public void setShapeName(String shapeName) {
        this.shapeName = shapeName;
    }
    public abstract double getArea();
    public abstract boolean validate();
    public String toString() {
        return getShapeName()+":"+String.format("%.2f ", getArea());
    }
}
class Circle extends Shape{
    private double radius;
    public Circle() {
        
    }
    public Circle(double radius) {
        this.setRadius(radius);
    }
    public double getRadius() {
        return radius;
    }
    public void setRadius(double radius) {
        this.radius = radius;
    }
    public double getArea() {
        return Math.PI*radius*radius;
    }
    public boolean validate() {
        if(radius>0) {
            return true;
        }
        else return false;
    }
}
class Rectangle extends Shape{
    private double width,length;
    public Rectangle() {
        
    }
    public Rectangle(double width,double length) {
        this.width = width;
        this.length = length;
    }
    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }
    public double getArea() {
        return width*length;
    }
    public boolean validate() {
        if(width>0&&length>0) {
            return true;
        }
        else return false;
    }
}
class Triangle extends Shape{
    private double side1,side2,side3;
    public Triangle() {
        
    }
    public Triangle(double side1,double side2,double side3) {
        this.setSide1(side1);
        this.setSide2(side2);
        this.setSide3(side3);
    }
    public double getSide3() {
        return side3;
    }
    public void setSide3(double side3) {
        this.side3 = side3;
    }
    public double getSide1() {
        return side1;
    }
    public void setSide1(double side1) {
        this.side1 = side1;
    }
    public double getSide2() {
        return side2;
    }
    public void setSide2(double side2) {
        this.side2 = side2;
    }
    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 boolean validate() {
        double a = side1;
        double b = side2;
        double c = side3;
        if(a>0&&b>0&&c>0) {
            if(a+b>c&&a+c>b&&b+c>a) {
                return true;
            }
            else return false;
        }
        else return false;
    }
}
class Trapezoid extends Shape{
    private double topSide;
    private double bottomSide;
    private double height;
    public Trapezoid() {
        
    }
    public Trapezoid(double topSide,double bottomSide,double height) {
        this.topSide = topSide;
        this.bottomSide = bottomSide;
        this.height = height;
    }
    public double getTopSide() {
        return topSide;
    }
    public void setTopSide(double topSide) {
        this.topSide = topSide;
    }
    public double getBottomSide() {
        return bottomSide;
    }
    public void setBottomSide(double bottomSide) {
        this.bottomSide = bottomSide;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getArea() {
        return (topSide+bottomSide)*height/2;
    }
    public boolean validate() {
        if(topSide>0&&bottomSide>0&&height>0) {
            return true;
        }
        else return false;
    }
}
class Card implements Comparable<Card>{
    private Shape shape;
    public Card() {
        
    }
    public Card(Shape shape) {
        this.setShape(shape);
    }
    
    public Shape getShape() {
        return shape;
    }
    public void setShape(Shape shape) {
        this.shape = shape;
    }
    public int compareTo(Card card) {
        if(this.getShape().getArea()>=card.getShape().getArea()) {
            return 1;
        }
        else return -1;
    }
}
class DealCardList{
    ArrayList<Card> cardList = new ArrayList<>();
    double[] bi=new double[4];
    public DealCardList() {
        
    }
    public DealCardList(ArrayList<Integer> list) {
        for(Integer a:list) {
            if(a==0) {
                break;
            }
            else {
                switch (a) {
                    case 1:{
                        Card a1 = new Card(new Circle(Main.input.nextDouble()));
                        cardList.add(a1);
                        a1.getShape().setShapeName("Circle");
                        break;
                    }
                    case 2:{
                        Card b1 = new Card(new Rectangle(Main.input.nextDouble(), Main.input.nextDouble()));
                        cardList.add(b1);
                        b1.getShape().setShapeName("Rectangle");
                        break;
                    }
                    case 3:{
                    Card c1 = new Card(new Triangle(Main.input.nextDouble(), Main.input.nextDouble(), Main.input.nextDouble()));
                    cardList.add(c1);
                    c1.getShape().setShapeName("Triangle");
                    break;
                    }
                    case 4:{
                        Card d1 = new Card(new Trapezoid(Main.input.nextDouble(), Main.input.nextDouble(), Main.input.nextDouble()));
                        cardList.add(d1);
                        d1.getShape().setShapeName("Trapezoid");
                        break;
                    }
                }
            }
        }
    }
    public boolean validate() {
        for(Card a:cardList) {
            if(!a.getShape().validate()) {
                return false;
            }
        }
        return true;
    }
    public void yS() {
        cardList.sort(Collections.reverseOrder());
        int you=0;
        System.out.print("[");
        for(int i=0;i<cardList.size();i++) {
            if(cardList.get(i).getShape().getShapeName().equals("Circle")) {
                    System.out.print(cardList.get(i).getShape());
            }
        }
        System.out.print("]");
    }
    public void fS() {
        cardList.sort(Collections.reverseOrder());
        int you=0;
        System.out.print("[");
        for(int i=0;i<cardList.size();i++) {
            if(cardList.get(i).getShape().getShapeName().equals("Rectangle")) {
                    System.out.print(cardList.get(i).getShape());
            }
        }
        System.out.print("]");
    }
    public void sS() {
        cardList.sort(Collections.reverseOrder());
        int you=0;
        System.out.print("[");
        for(int i=0;i<cardList.size();i++) {
            if(cardList.get(i).getShape().getShapeName().equals("Triangle")) {
                    System.out.print(cardList.get(i).getShape());
            }
        }
        System.out.print("]");
    }
    public void tS() {
        cardList.sort(Collections.reverseOrder());
        int you=0;
        System.out.print("[");
        for(int i=0;i<cardList.size();i++) {
            if(cardList.get(i).getShape().getShapeName().equals("Trapezoid")) {
                    System.out.print(cardList.get(i).getShape());
            }
        }
        System.out.print("]");
        
    }
    public double getALLArea() {
        double sum = 0;
        for(int i=0;i<4;i++) {
            if(sum<bi[i]) {
                sum=bi[i];
            }
        }
        return sum;
    }
    public void yuan() {
        bi[0]=0;
        int you=0;
        System.out.print("[");
        for(int i=0;i<cardList.size();i++) {
            if(cardList.get(i).getShape().getShapeName().equals("Circle")) {
                    System.out.print(cardList.get(i).getShape());
                    bi[0]+=cardList.get(i).getShape().getArea();
            }
        }
        System.out.print("]");
    }
    public void fang() {
        bi[1]=0;
        int you=0;
        System.out.print("[");
        for(int i=0;i<cardList.size();i++) {
            if(cardList.get(i).getShape().getShapeName().equals("Rectangle")) {
                    System.out.print(cardList.get(i).getShape());
                    bi[1]+=cardList.get(i).getShape().getArea();
            }
        }
        System.out.print("]");
    }
    public void san() {
        bi[2]=0;
        int you=0;
        System.out.print("[");
        for(int i=0;i<cardList.size();i++) {
            if(cardList.get(i).getShape().getShapeName().equals("Triangle")) {
                    System.out.print(cardList.get(i).getShape());
                    bi[2]+=cardList.get(i).getShape().getArea();
            }
        }
        System.out.print("]");
    }
    public void ti() {
        bi[3]=0;
        int you=0;
        System.out.print("[");
        for(int i=0;i<cardList.size();i++) {
            if(cardList.get(i).getShape().getShapeName().equals("Trapezoid")) {
                    System.out.print(cardList.get(i).getShape());
                    bi[3]+=cardList.get(i).getShape().getArea();
            }
        }
        System.out.print("]");
    }
    public void showResult() {
        System.out.println("The original list:");
        System.out.print("[");
        for (Card a : cardList) {
            System.out.print(a.getShape());
        }
        System.out.print("]");
        System.out.println("\nThe Separated List:");
        yuan();fang();san();ti();
        System.out.println("\nThe Separated sorted List:");
        yS();fS();sS();tS();
        System.out.printf("\nThe max area:%.2f",getALLArea());
    }
}
public class Main {
    //在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
    //使用Main.input.next…即可(避免采坑)
    public static Scanner input = new Scanner(System.in);
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>(); 
        int num = input.nextInt();
        int x=1;
        int j=0;
        for(int i=0;i<10;i++) {
            if(x==1) {
                i++;
                x++;
            }
            if(x==2) {
                j++;
            }
        }
        if(num==0) {
            System.out.println("Wrong Format");
            System.exit(0);
        }
        while(num != 0){
            if(num < 0 || num > 4){
                System.out.println("Wrong Format");
                System.exit(0);
            }
            list.add(num);
            num = input.nextInt();
        }
        DealCardList dealCardList = new DealCardList(list);
    
        if(!dealCardList.validate()){
            System.out.println("Wrong Format");
            System.exit(0);
        }
        dealCardList.showResult();
        input.close();
        }
}
View Code

总的说,这次实验还是比较顺利的,除了一开始小细节处容易出错,还有后面的分组输出有点麻烦有点懵逼容易报错,其他还是比较好的,7-2我报错了超多次,他这里坑点就在于分组输出的格式,也就是没有这个你也要输出这个框框,感觉有点死板,剩下的都挺好(因为能直接用现成的,嘿嘿)。

3.题目集八 7-3 ATM机类结构设计(一)

 

设计ATM仿真系统,具体要求参见作业说明。 OO作业8-1题目说明.pdf

输入格式:

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

  • 存款、取款功能输入数据格式: 卡号 密码 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

这道题真心是考验自己一次啊,真心不擅长动态数组,表这类的东西,以后要好好学啊,这次实验就是模仿银行,做一个ATM类似的管理系统,可以达到取钱、存钱、查询等结果,这里我们就创建银行类来存储银行的名字以及ATM,创建用户类来详细定义银行绑定用户所需要的详细信息,然后就是这次重点了,检查类,本次实验中看似好像是ATM机,其实不然,重点就是Check(感觉这系统纯粹就是为了查错),如果密码输入错了该怎么样,如果用户名输入错了该怎么样,等等,还有几种判错,而且这种判错还是累计的连锁的,怎么说呢,就像一种连环锁一样,当你符合这个条件,你才可以走到下一项那种感觉,而且查询的Check和你存取钱的Check还不是一种,毕竟输入的东西也不一样是吧,同时,两者的输出内容也不一样,所以还要有两个输出类,这里说明以下存取钱是如果判断输出的,我觉得我这个方法很巧妙的在于,通过直接if else 是否大于0来进行输出,也就是如果钱数大于0,那我就直接跳到取款输出的那条语句,如果小于0,那就跳到存款输出的那条语句。代码如下:

class Bank{
    String bankname;
    String [] ATM;
    public Bank(String bankname,String[]ATM) {
        super();
        this.ATM = ATM;
        this.bankname = bankname;
    }
}
class Account{
    private String name;
    private String account;
    private String password;
    private double balance=10000;
    ArrayList<Bank> banklist;
    Bank bank;
    private  ArrayList<String> cardList;
    public Account(){
    }
    public void getMoney(int a) {
        this.balance-=a;
    }
    public void saveMoney(int a) {
        this.balance+=a;
    }
    public Account(String name,String account,String password,ArrayList<Bank> banklist,Bank bank,ArrayList<String> cardList){
        this.name=name;
        this.account=account;
        this.password=password;
        this.bank=bank;
        this.banklist=banklist;
        this.cardList=cardList;
    }
    //getter
    public String getName() {
        return name;
    }
    public String getAccount() {
        return account;
    }
    public String getPassword() {
        return password;
    }
    public double getBalance() {
        return balance;
    }
    public ArrayList<String> getCardList() {
        return cardList;
    }
    //setter
    public void setName(String name) {
        this.name = name;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    public void setCardList(ArrayList<String> cardList) {
        this.cardList = cardList;
    }
}
class Check {
    ArrayList<Account> accountList;
    String card;
    String password;
    String number;
    double money;
    int n,o = 0,q = 0;
    public Check(ArrayList<Account> accountList,String card,String password,String number,double money){
        this.accountList=accountList;
        this.card=card;
        this.password=password;
        this.number=number;
        this.money=money;
    }
    public void access(){
        int i,j;
        int t=0;
        
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    t=i;
                    break;
                }
            }
        }
        for(n=0;n<t;n++) {
            q++;
            o=q+o;
            if(q==1) {
                o++;
            }
        }
        if(o==5) {
            q++;
        }
        if(o==4) {
            q--;
        }
        accountList.get(t).setBalance(accountList.get(t).getBalance()-money);
    }
    public void show(){
        int i,j;
        int t=0;
        
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    t=i;
                    break;
                }
            }
        }
        for(n=0;n<t;n++) {
            q++;
            o=q+o;
            if(q==1) {
                o++;
            }
        }
        if(o==5) {
            q++;
        }
        if(o==4) {
            q--;
        }
        if(money>=0){
            System.out.printf(accountList.get(t).getName()+"在"+accountList.get(t).bank.bankname+"的"+number+"号ATM机上取款¥%.2f\n",money);
        }
        else{
            money=-money;
            System.out.printf(accountList.get(t).getName()+"在"+accountList.get(t).bank.bankname+"的"+number+"号ATM机上存款¥%.2f\n",money);
        }
        System.out.printf("当前余额为¥%.2f\n",accountList.get(t).getBalance());
    }
    public boolean check(){
        int flag=0;
        int i,j;
        int k=0;
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if (card.equals(accountList.get(i).getCardList().get(j))){
                    flag=1;
                    k=i;
                    break;
                }
            }
            if(flag==1){
                break;
            }
        }
       
        if(flag==1){
            if(password.equals(accountList.get(k).getPassword())){
                flag=2;
            }
            else{
                System.out.println("Sorry,your password is wrong.");
                return false;
            }
        }
        else{
            System.out.println("Sorry,this card does not exist.");
            return false;
        }
        
        if(flag==2){
            for(i=0;i<accountList.get(k).banklist.size();i++){
                for(j=0;j<accountList.get(k).banklist.get(i).ATM.length;j++){
                    if(number.equals(accountList.get(k).banklist.get(i).ATM[j])){
                        flag=3;
                        break;
                    }
                }
            }
        }
        
        if(flag==3){
            if(accountList.get(k).getBalance()-money>=0){
                flag=4;
            }
            else{
                System.out.println("Sorry,your account balance is insufficient.");
                return false;
            }
        }
        else{
            System.out.println("Sorry,the ATM's id is wrong.");
            return false;

        }
        
        if(flag==4){
            for(i=0;i<accountList.get(k).bank.ATM.length;i++){
                if(number.equals(accountList.get(k).bank.ATM[i])){
                    flag=5;
                    break;
                }
            }
        }
        if(flag!=5){
            System.out.println("Sorry,cross-bank withdrawal is not supported.");
            return false;
        }
        else
            return true;
    }

}

class Check1 {
    ArrayList<Account> accountList;
    String card;
    int n,o = 0,q = 0;
    public Check1(ArrayList<Account> accountList, String card){
        this.accountList = accountList;
        this.card = card;
    }
    public boolean check(){
        int i,j;
        int flag=0;
        
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if (card.equals(accountList.get(i).getCardList().get(j))){
                    flag=1;
                    break;
                }
            }
            if(flag==1){
                break;
            }
        }
        if(flag==1)
            return true;
        else{
            System.out.println("Sorry,this card does not exist.");
            return false;
        }
    }
    public void show1(){
        int i,j;
        int t=0;
        
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    t=i;
                    break;
                }
            }
        }
        for(n=0;n<t;n++) {
            q++;
            o=q+o;
            if(q==1) {
                o++;
            }
        }
        if(o==5) {
            q++;
        }
        if(o==4) {
            q--;
        }
        System.out.printf("¥%.2f\n",accountList.get(t).getBalance());
    }
}
View Code

然后就是最后的Main函数,不过这次Main函数十分不可爱了,因为除了Check就他最麻烦了,一大堆信息插入,然后把每一条信息插入动态数组,然后就是套用Check里的函数,进行判别然后输出,来达到实验的预期效果,怎么说呢,难点可能就是开头难,你没想好如何来插入这些信息,如果来构建整个的动态数组结构,但是一旦开了头想明白了,难度就没有那么大了,很多都是重复的操作,Check类中要细心一些,防止漏信息,比如少一种情况,没判断一些情况是否发生会对后续产生影响等等,本次实验还是很有心意的,毕竟韦小宝,杨过啥的都出来了,还有银行账户呢(u-u)。不多说了这里放代码:

public class Main{
    public static void main(String[] args) {
        String []atm1= {"01","02","03","04"};
        String []atm2= {"05","06"};
        Bank jsyh = new Bank("中国建设银行", atm1);
        Bank gsyh = new Bank("中国工商银行", atm2);
        ArrayList<Bank> bankList = new ArrayList<>();
        bankList.add(jsyh);
        bankList.add(gsyh);
        int n,o = 0,q = 0;
        ArrayList<String> cardList1 = new ArrayList<>();
        cardList1.add("6217000010041315709");
        cardList1.add("6217000010041315715");
        Account account1 = new Account("杨过", "3217000010041315709", "88888888", bankList, jsyh,cardList1);
        ArrayList<String> cardList2 = new ArrayList<>();
        cardList2.add("6217000010041315718");
        Account account2 = new Account("杨过", "3217000010041315715", "88888888", bankList,jsyh,cardList2);
        ArrayList<String> cardList3 = new ArrayList<>();
        cardList3.add("6217000010051320007");
        Account account3 = new Account("郭靖", "3217000010051320007", "88888888", bankList,jsyh,cardList3);
        ArrayList<String> cardList4 = new ArrayList<>();
        cardList4.add("6222081502001312389");
        Account account4 = new Account("张无忌", "3222081502001312389", "88888888", bankList,gsyh,cardList4);
        ArrayList<String> cardList5 = new ArrayList<>();
        cardList5.add("6222081502001312390");
        Account account5 = new Account("张无忌", "3222081502001312390", "88888888", bankList,gsyh,cardList5);
        ArrayList<String> cardList6 = new ArrayList<>();
        cardList6.add("6222081502001312399");
        cardList6.add("6222081502001312400");
        Account account6 = new Account("张无忌", "3222081502001312399", "88888888", bankList,gsyh,cardList6);
        ArrayList<String> cardList7 = new ArrayList<>();
        cardList7.add("6222081502051320785");
        Account account7 = new Account("韦小宝", "3222081502051320785", "88888888", bankList,gsyh,cardList7);
        ArrayList<String> cardList8 = new ArrayList<>();
        cardList8.add("6222081502051320786");
        Account account8 = new Account("韦小宝", "3222081502051320786", "88888888", bankList,gsyh,cardList8);
        ArrayList<Account> accountList = new ArrayList<>();
        accountList.add(account1);
        accountList.add(account2);
        accountList.add(account3);
        accountList.add(account4);
        accountList.add(account5);
        accountList.add(account6);
        accountList.add(account7);
        accountList.add(account8);
        Scanner x=new Scanner(System.in);
        String duru;
        Check check;
        Check1 check1;
        for(n=0;n<6;n++) {
            q++;
            o=q+o;
            if(q==1) {
                o++;
            }
        }
        if(o==5) {
            q++;
        }
        if(o==4) {
            q--;
        }
        duru=x.nextLine();
        while(!duru.equals("#")){
            int i,j;
            String[] shuju=duru.split("\\s+");
            if(shuju.length!=1){
                check = new Check(accountList,shuju[0],shuju[1],shuju[2],Double.parseDouble(shuju[3]));
                if (check.check()){
                    check.access();
                    check.show();
                }
            }
            else {
                check1=new Check1(accountList,shuju[0]);
                if(check1.check()){
                    check1.show1();
                }
            }
            duru=x.nextLine();
        }
    }
}
View Code

这次实验我个人感觉就是比较考验耐心,尤其是前期千万要绷住,耐心来思考到底如果构建,以及每一步连锁的方法等等,就是一个字“稳”,而且重复动作会有很多,所以千万不要嫌麻烦,这也是一种锻炼,其实感觉这最后几次实验,都是比较麻烦的,如果真的参透或者说理解了其中该怎么一步一步进行的道理,难度是不高的,考验的最终还是耐心,不静下心来写,哪怕有思路,也会在半路上嗝屁。

4.题目集9 7-1 ATM机类结构设计(二)

设计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编号]上取款¥[金额]

当前余额为¥[金额]

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

③查询余额业务输出

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

金额保留两位小数。

这道题在上一道的基础之上,进行了添加,这次可以借贷,可以跨行,随之而来的就是更加麻烦了(救命),因为跨行以及借贷,在我们常理当中,这种麻烦事别人帮你干,那就一定要有报酬,所以这种行为是有利息的,这也就是麻烦所在,由于是在上一道的基础之上进行改进,所以就详细说明改进的部分,首先就是分情况讨论,他又分为借贷、非借贷,跨行不跨行之说,不同银行之间跨行所需的手续费是不一样的,所以这里就要判断是哪个银行的ATM机,然后对钱数进行确定,之后在原本的账户钱数中进行减法,减去利息,借贷的可以在一定的范围之内欠钱,而非借贷如果欠钱就要报错,这也要区分开来,这也就证明不是所有人都可以欠钱,所以给特定的账户创建账户也不一样,这一点要注意,一个坑点,其余的还是和之前是相似的,重点就是情况讨论,其余的就是小细节问题了,慢慢写,都到这里了,也不多追叙了上代码:

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Bank{
    String bankname;
    String [] ATM;
    public Bank(String bankname,String[]ATM) {
        super();
        this.ATM = ATM;
        this.bankname = bankname;
    }
}
class Account{
    private String name;
    private String account;
    private String password;
    private ArrayList<String> ATMList;
    private double balance=10000;
    private ArrayList<String> BanknameList;
    ArrayList<Bank> banklist;
    Bank bank;
    private  ArrayList<String> cardList;
    public Account(String name,String account,String password,ArrayList<Bank> banklist,Bank bank,ArrayList<String> cardList,ArrayList<String> ATMList,ArrayList<String> BanknameList) {
        this.name=name;
        this.account=account;
        this.password=password;
        this.bank=bank;
        this.banklist=banklist;
        this.cardList=cardList;
        this.ATMList=ATMList;
        this.BanknameList=BanknameList;
    }
    public String getName() {
        return name;
    }
    public String getAccount() {
        return account;
    }
    public String getPassword() {
        return password;
    }
    public double getBalance() {
        return balance;
    }
    public ArrayList<String> getCardList() {
        return cardList;
    }
    public ArrayList<String> getATMList() {
        return ATMList;
    }
    public ArrayList<String> getBanknameList() {
        return BanknameList;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    public void setCardList(ArrayList<String> cardList) {
        this.cardList = cardList;
    }
    public void setATMList(ArrayList<String> ATMList) {
        this.ATMList = ATMList;
    }
    public void setBanknameList(ArrayList<String> BanknameList) {
        this.BanknameList = BanknameList;
    }
}
class Check {
    ArrayList<Account> accountList;
    String card;
    String password;
    String number;
    double money;
    int n,o = 0,q = 0;
    public Check(ArrayList<Account> accountList,String card,String password,String number,double money){
        this.accountList=accountList;
        this.card=card;
        this.password=password;
        this.number=number;
        this.money=money;
    }
    public void access3() {
        int i, j, k = 0;
        double l,q=0;
        //卡号校验
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j))) {
                    k = i;
                    //System.out.println(accountList.get(k));
                    break;
                }
            }
        }
        for (i = 0; i < accountList.get(k).getATMList().size(); i++) {
            if (number.equals(accountList.get(k).getATMList().get(0)) || number.equals(accountList.get(k).getATMList().get(1)) || number.equals(accountList.get(k).getATMList().get(2)) || number.equals(accountList.get(k).getATMList().get(3))) {
                q = money * 0.02;
                break;
            } else if (number.equals(accountList.get(k).getATMList().get(4)) || number.equals(accountList.get(k).getATMList().get(5))) {
                q = money * 0.03;
                break;
            } else if (number.equals(accountList.get(k).getATMList().get(6)) || number.equals(accountList.get(k).getATMList().get(7)) || number.equals(accountList.get(k).getATMList().get(8)) || number.equals(accountList.get(k).getATMList().get(9)) || number.equals(accountList.get(k).getATMList().get(10))) {
                q = money * 0.04;
                break;
            }
        }
        if (accountList.get(k).getBalance() >=money&&accountList.get(k).getBalance()>0) {
            accountList.get(k).setBalance(accountList.get(k).getBalance() - money - q);
        }
        else if(accountList.get(k).getBalance() <money&&accountList.get(k).getBalance()>0){
            l = (money - accountList.get(k).getBalance()) * 0.05;
            accountList.get(k).setBalance(accountList.get(k).getBalance() - money - l - q);
        }
        else if(accountList.get(k).getBalance() <money&&accountList.get(k).getBalance()<=0){
            l=money*0.05;
            accountList.get(k).setBalance(accountList.get(k).getBalance() - money - l - q);
        }
    }
    public boolean check4() {
        int i, j, k = 0;
        int flag = 0;
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j))) {
                    k = i;
                    break;
                }
            }
        }
        if(money<=accountList.get(k).getBalance()){
            return true;
        }
        else {
            System.out.println("Sorry,your account balance is insufficient.");//取款金额大于账户余额
            return false;
        }
    }
    public void access2(){
        int i,j,k=0;
        double l;
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    k=i;
                    break;
                }
            }
        }
        if(accountList.get(k).getBalance()>money&&accountList.get(k).getBalance()>0){
            accountList.get(k).setBalance(accountList.get(k).getBalance()-money);
        }
        else if(accountList.get(k).getBalance()<money&&accountList.get(k).getBalance()>0){
            l=(money-accountList.get(k).getBalance())*0.05;
            accountList.get(k).setBalance(accountList.get(k).getBalance()-money-l);
        }
        else if(accountList.get(k).getBalance()<money&&accountList.get(k).getBalance()<=0){
            l=money*0.05;
            accountList.get(k).setBalance(accountList.get(k).getBalance()-money-l);
        }
    }
    public void access(){
        int i,j;
        int t=0;
        
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    t=i;
                    break;
                }
            }
        }
        accountList.get(t).setBalance(accountList.get(t).getBalance()-money);
    }
    public void access1() {
        int i,j,k=0;
        double q=0;
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    k=i;
                    break;
                }
            }
        }
        for(i=0;i<accountList.get(k).getATMList().size();i++){
            if(number.equals(accountList.get(k).getATMList().get(0))||number.equals(accountList.get(k).getATMList().get(1))||number.equals(accountList.get(k).getATMList().get(2))||number.equals(accountList.get(k).getATMList().get(3))){
                q=money*0.02;
                break;
            }
            else if (number.equals(accountList.get(k).getATMList().get(4))||number.equals(accountList.get(k).getATMList().get(5))){
                q=money*0.03;
                break;
            }
            else if(number.equals(accountList.get(k).getATMList().get(6))||number.equals(accountList.get(k).getATMList().get(7))||number.equals(accountList.get(k).getATMList().get(8))||number.equals(accountList.get(k).getATMList().get(9))||number.equals(accountList.get(k).getATMList().get(10))){
                q=money*0.04;
                break;
            }
        }
        accountList.get(k).setBalance(accountList.get(k).getBalance()-money-q);
    }
    public void show(){
        int i,j,k=0;
        int t=0;
        String bankname="";
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    t=i;
                    break;
                }
            }
        }
        for(i=0;i<accountList.get(t).getATMList().size();i++){
            if(number.equals(accountList.get(t).getATMList().get(0))||number.equals(accountList.get(t).getATMList().get(1))||number.equals(accountList.get(t).getATMList().get(2))||number.equals(accountList.get(t).getATMList().get(3))){
                bankname=accountList.get(t).getBanknameList().get(0);
                break;
            }
            else if (number.equals(accountList.get(t).getATMList().get(4))||number.equals(accountList.get(t).getATMList().get(5))){
                bankname=accountList.get(k).getBanknameList().get(1);
                break;
            }
            else if(number.equals(accountList.get(t).getATMList().get(6))||number.equals(accountList.get(t).getATMList().get(7))||number.equals(accountList.get(t).getATMList().get(8))||number.equals(accountList.get(t).getATMList().get(9))||number.equals(accountList.get(t).getATMList().get(10))){
                bankname=accountList.get(t).getBanknameList().get(2);
                break;
            }
        }
        if(money>=0){
            if(accountList.get(t).getBalance()>=0) {
                System.out.printf("业务:取款 "+accountList.get(t).getName()+"在"+bankname+"的"+number+"号ATM机上取款¥%.2f\n",money);
                System.out.printf("当前余额为¥%.2f\n",accountList.get(t).getBalance());

            }
            else {
                System.out.println("Sorry,your account balance is insufficient.");
            }
        }
    }
    public boolean check2() {
        int i,j,k=0;
        int flag=0;
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    k=i;
                    break;
                 }
             }
        }
        for(i=0;i<accountList.get(k).bank.ATM.length;i++){
            if(number.equals(accountList.get(k).bank.ATM[i])){
                flag=1;
                break;
            }
        }
        if(flag==1){//未跨行
            return false;
        }
        else {//跨行
            return true;
        }
    } 
    public boolean check(){
        int flag=0;
        int i,j,k=0;

        //检查账号是否正确
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if (card.equals(accountList.get(i).getCardList().get(j))){
                    flag=1;
                    k=i;
                    break;
                }
            }
            if(flag==1){
                break;
            }
        }

        if(flag==1){
            if(password.equals(accountList.get(k).getPassword())){
                flag=2;
            }
            else{
                System.out.println("Sorry,your password is wrong.");//银行卡密码错误
                return false;
            }
        }
        else{
            System.out.println("Sorry,this card does not exist.");//卡号不存在
            return false;
        }

        if(flag==2){
            for(i=0;i<accountList.get(k).banklist.size();i++){
                for(j=0;j<accountList.get(k).banklist.get(i).ATM.length;j++){
                    if(number.equals(accountList.get(k).banklist.get(i).ATM[j])){
                        flag=3;
                        break;
                    }
                }
            }
        }
        if(flag==3){
            return true;
        }
        else{
            System.out.println("Sorry,the ATM's id is wrong.");//ATM机编号不存在
            return false;

        }
    }

}
class Check1 {
    ArrayList<Account> accountList;
    String card;
    int n,o = 0,q = 0;
    public Check1(ArrayList<Account> accountList, String card){
        this.accountList = accountList;
        this.card = card;
    }
    public boolean check(){
        int i,j;
        int flag=0;
        
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if (card.equals(accountList.get(i).getCardList().get(j))){
                    flag=1;
                    break;
                }
            }
            if(flag==1){
                break;
            }
        }
        if(flag==1)
            return true;
        else{
            System.out.println("Sorry,this card does not exist.");
            return false;
        }
    }
    public void show1(){
        int i,j;
        int t=0;
        
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    t=i;
                    break;
                }
            }
        }
        
        System.out.printf("业务:查询余额 ¥%.2f",accountList.get(t).getBalance());
    }
}
class Check3{
    ArrayList<Account> accountList;
    ArrayList<Account> accountList1;
    String card;
    String password;
    String number;
    double money;
    public Check3(ArrayList<Account> accountList,ArrayList<Account> accountList1,String card,String password,String number,double money){
        this.accountList=accountList;
        this.accountList1=accountList1;
        this.card=card;
        this.password=password;
        this.number=number;
        this.money=money;
    }
    public void show2() {
        int i, j, k = 0;
        String bankname = "";
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j))) {
                    k = i;
                    break;
                }
            }
        }
        for (i = 0; i < accountList.get(k).getATMList().size(); i++) {
            if (number.equals(accountList.get(k).getATMList().get(0)) || number.equals(accountList.get(k).getATMList().get(1)) || number.equals(accountList.get(k).getATMList().get(2)) || number.equals(accountList.get(k).getATMList().get(3))) {
                bankname = accountList.get(k).getBanknameList().get(0);
                break;
            } else if (number.equals(accountList.get(k).getATMList().get(4)) || number.equals(accountList.get(k).getATMList().get(5))) {
                bankname = accountList.get(k).getBanknameList().get(1);
                break;
            } else if (number.equals(accountList.get(k).getATMList().get(6)) || number.equals(accountList.get(k).getATMList().get(7)) || number.equals(accountList.get(k).getATMList().get(8)) || number.equals(accountList.get(k).getATMList().get(9)) || number.equals(accountList.get(k).getATMList().get(10))) {
                bankname = accountList.get(k).getBanknameList().get(2);
                break;
            }
        }
        if(money>0){//取款
            if(accountList.get(k).getBalance()>=(-50000)){
                System.out.printf("业务:取款 "+accountList.get(k).getName()+"在"+bankname+"的"+number+"号ATM机上取款¥%.2f\n",money);
                System.out.printf("当前余额为¥%.2f\n",accountList.get(k).getBalance());
            }
            else {
                System.out.println("Sorry,your account balance is insufficient.");//透支金额超过规定最大透支金额
            }
        }
    }
    public boolean check3(){
        int i,j,k=0;
        int flag=0;
        for(i=0;i<accountList1.size();i++){
            for(j=0;j<accountList1.get(i).getCardList().size();j++){
                if (card.equals(accountList1.get(i).getCardList().get(j))){
                    flag=1;
                    break;
                }
            }
        }
        if(flag==1){//贷记账号
            return true;
        }
        else {//借记账号
            return false;
        }
    }
}
public class Main{
    public static void main(String[] args) {
        String []atm1= {"01","02","03","04"};
        String []atm2= {"05","06"};
        String []atm3= {"07","08","09","10","11"};
        Bank jsyh = new Bank("中国建设银行", atm1);
        Bank gsyh = new Bank("中国工商银行", atm2);
        Bank nyyh = new Bank("中国农业银行", atm3);
        ArrayList<String> ATMList = new ArrayList<>();
        ATMList.add("01");
        ATMList.add("02");
        ATMList.add("03");
        ATMList.add("04");
        ATMList.add("05");
        ATMList.add("06");
        ATMList.add("07");
        ATMList.add("08");
        ATMList.add("09");
        ATMList.add("10");
        ATMList.add("11");
        ArrayList<Bank> bankList = new ArrayList<>();
        bankList.add(jsyh);
        bankList.add(gsyh);
        bankList.add(nyyh);
        int n,o = 0,q = 0;
        ArrayList<String> banknameList = new ArrayList<>();
        banknameList.add("中国建设银行");
        banknameList.add("中国工商银行");
        banknameList.add("中国农业银行");
        ArrayList<String> cardList1 = new ArrayList<>();
        cardList1.add("6217000010041315709");
        cardList1.add("6217000010041315715");
        Account account1 = new Account("杨过", "3217000010041315709", "88888888", bankList, jsyh,cardList1,ATMList,banknameList);
        ArrayList<String> cardList2 = new ArrayList<>();
        cardList2.add("6217000010041315718");
        Account account2 = new Account("杨过", "3217000010041315715", "88888888", bankList,jsyh,cardList2,ATMList,banknameList);
        ArrayList<String> cardList3 = new ArrayList<>();
        cardList3.add("6217000010051320007");
        Account account3 = new Account("郭靖", "3217000010051320007", "88888888", bankList,jsyh,cardList3,ATMList,banknameList);
        ArrayList<String> cardList4 = new ArrayList<>();
        cardList4.add("6222081502001312389");
        Account account4 = new Account("张无忌", "3222081502001312389", "88888888", bankList,gsyh,cardList4,ATMList,banknameList);
        ArrayList<String> cardList5 = new ArrayList<>();
        cardList5.add("6222081502001312390");
        Account account5 = new Account("张无忌", "3222081502001312390", "88888888", bankList,gsyh,cardList5,ATMList,banknameList);
        ArrayList<String> cardList6 = new ArrayList<>();
        cardList6.add("6222081502001312399");
        cardList6.add("6222081502001312400");
        Account account6 = new Account("张无忌", "3222081502001312399", "88888888", bankList,gsyh,cardList6,ATMList,banknameList);
        ArrayList<String> cardList7 = new ArrayList<>();
        cardList7.add("6222081502051320785");
        Account account7 = new Account("韦小宝", "3222081502051320785", "88888888", bankList,gsyh,cardList7,ATMList,banknameList);
        ArrayList<String> cardList8 = new ArrayList<>();
        cardList8.add("6222081502051320786");
        Account account8 = new Account("韦小宝", "3222081502051320786", "88888888", bankList,gsyh,cardList8,ATMList,banknameList);
        ArrayList<String> cardList9 = new ArrayList<>();
        cardList9.add("6640000010045442002");
        cardList9.add("6640000010045442003");
        Account account9 = new Account("张三丰", "3640000010045442002", "88888888", bankList,jsyh,cardList9,ATMList,banknameList);
        ArrayList<String> cardList10 = new ArrayList<>();
        cardList10.add("6640000010045441009");
        Account account10 = new Account("令狐冲", "3630000010033431001", "88888888", bankList,gsyh,cardList10,ATMList,banknameList);
        ArrayList<String> cardList11 = new ArrayList<>();
        cardList11.add("6630000010033431001");
        Account account11 = new Account("乔峰", "3630000010033431001", "88888888",bankList,nyyh,cardList11,ATMList,banknameList);
        ArrayList<String> cardList12 = new ArrayList<>();
        cardList12.add("6630000010033431008");
        Account account12 = new Account("洪七公", "3630000010033431008", "88888888",bankList,nyyh,cardList12,ATMList,banknameList);
        ArrayList<Account> accountList = new ArrayList<>();
        accountList.add(account1);
        accountList.add(account2);
        accountList.add(account3);
        accountList.add(account4);
        accountList.add(account5);
        accountList.add(account6);
        accountList.add(account7);
        accountList.add(account8);
        accountList.add(account9);
        accountList.add(account10);
        accountList.add(account11);
        accountList.add(account12);
        ArrayList<Account> accountList1 = new ArrayList<>();
        accountList1.add(account9);
        accountList1.add(account10);
        accountList1.add(account11);
        accountList1.add(account12);
        Scanner x=new Scanner(System.in);
        String duru;
        Check check;
        Check1 check1;
        Check3 check3;
        for(n=0;n<6;n++) {
            q++;
            o=q+o;
            if(q==1) {
                o++;
            }
        }
        if(o==5) {
            q++;
        }
        if(o==4) {
            q--;
        }
        duru=x.nextLine();
        while(!duru.equals("#")){
            int i,j;
            String[] shuju=duru.split("\\s+");
            if(shuju.length!=1){
                check = new Check(accountList,shuju[0],shuju[1],shuju[2],Double.parseDouble(shuju[3]));
                check3 = new Check3(accountList,accountList1,shuju[0],shuju[1],shuju[2],Double.parseDouble(shuju[3]));
                if (check.check()){
                    if(check3.check3()) {
                        if(check.check2()) {
                             check.access3();                   
                             check3.show2();
                        }
                        else {
                            check.access2();
                            check3.show2();
                        }
                    }
                    else {
                        if(check.check4()) {
                            if(check.check2()) {
                                check.access1();
                                check.show();
                            }
                            else {
                                check.access();
                                check.show();
                            }
                        }
                    }
                }
            }
            else {
                check1=new Check1(accountList,shuju[0]);
                if(check1.check()){
                    check1.show1();
                }
            }
            duru=x.nextLine();
        }
    }
}
View Code

这次实验坑点还是许多的,主要是特别多的条件限制,非借贷不能欠款,借贷可以欠款,跨行每行利息不一样,等等小麻烦,这都是需要特别注意的,但越是这样越是要慢工出细活,不怕困难,才能走到最后,也是很不容易,暂时这一段路是到此完结了,也是很感谢陪伴啊,希望之后JAVA能越打越好。

踩坑心得:

在上面每一题的心得中,已经表明了,其实踩坑最多的就是各种情况露了,以及各种连锁起来的条件限制,这都是告诉我们一定要细心来写代码啊。

改进建议:

确实有一些部分可以进行改进,可以少写,但是由于懒惰啊,确实是懒得再重写了,而且课时好紧,忙着写作业,忙着嬉戏,这里可以提一点,就是重复太多,如果有能力,许多重复的可以直接引用一个函数,可以少很多不必要的重复活动,大大加快写代码的速度(虽然优化会加快速度,但是想出来优化的时候比不优化更加复杂,(lll¬ω¬))。

总结:

第三次博客了,也是这次JAVA之旅的最后一次了,真心的很感谢陪伴,让我愉快的游戏时光减少了大半,忙于苦逼,忙于写代码,当然这是玩笑话,这一路很有收获,也有难受的时候,但走到最后还是很感动,觉得学到了许多,其实也同时看清了自己还是有许多的欠缺,许多的不会,比如JAVAFX用的就不好,差很多练习,基础的类的引用,引申,以及一些继承,多态的都可以用好了一些,比之前强了许多,果然还是要学习啊,每次做题也是一场新的学习之旅,不断加深对JAVA根本上的印象,以及不断对此进行扩展,最重要的事情来了,老师讲的真的很好,老师讲的真的很好,老师讲的真的很好,重要的事情说三遍,这次作业体验也是极致,折磨到极致,收获到极致,果然时间的力量是最大的,一步一步开始,回头还看了一下我自己之前的博客,时间流逝的真快啊,却从来不语,从一开始的连这种思维都没有,到现在都可以做一些难一点的题了,真的是在改变,学习JAVA很好的锻炼了我的韧性,磨砺了我的意志,让我记忆尤新,希望在以后的道路上,我也能凭借这种意志一直向前,最后送一句话给屏幕前的你以及未来的我:“时间从来不语,但却回答了一切”,很荣幸能走到现在,感谢陪伴。

posted @ 2021-12-17 23:31  咕噜噜bit  阅读(75)  评论(2)    收藏  举报