第三次博客作业

第三次博客作业

挺快的吧,在不知不觉当中就已经快要接近到学期的末尾了,而我的这门课程也快要结束了,当然呢,在这个月当中,我也学习和收获到了不少知识,接下来就让我来总结一下我这个月的学习当中所遇到的问题以及得到的学习心得。

1.前言:说实话吧,其实这个月刚刚开始第一次的题目集(也就是题目集07)的时候我觉得我还是挺有信心和把握可以完成好的。因为我看完题目之后并没有感觉到它有多难,也就是自己可以应对的过来吧,但是我万万没有想到的是在这次作业的第二道题目上给我心态整懵逼了,因为我的代码是没有任何问题的,在我的编译器上面运行测试,所有的测试点都可以通过,但是当我把我的代码转移的PTA上面去提交的时候戏剧性的一幕发生了,我擦,它提示我说你的代码长度超过限制,我人都当场去世,直接裂开,然后经过了一系列删减之后它依旧还是提示我说代码过长。当时也挺绝望的,我一开始的信心也受到了打击,也就导致了后两次的题目集做的不是很好。所以说我想要吐槽这一点,也希望在以后的题目集当中不要再有这种情况发生了。

下面就来说一说这几次的题目集所涉及到的知识点:

题目集07:掌握类的继承、多态性使用方法以及接口的应用。

题目集08:重点考核类的封装性及类间关系设计(关联、组合及依赖)。

题目集09:重点训练内容为抽象类、继承与多态。

 

 

2.具体分析:

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

输入格式:

  • 首先,在一行上输入一串数字(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:总面积值

代码如下:

import java.util.ArrayList; import java.util.Scanner; import java.util.TreeSet; import java.util.Collections; public class Main {

public static Scanner input = new Scanner(System.in);
public static void main(String args[]) {
ArrayList<Integer> list = new ArrayList<Integer>();
  int num = input.nextInt();
  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();
}

}

class DealCardList {

ArrayList<Card> cardList = new ArrayList<Card>();
public DealCardList() {
super();
// TODO 自动生成的构造函数存根
}
DealCardList(ArrayList<Integer> list){
for(int i = 0; i < list.size(); i++) {
if(list.get(i) == 1) {
double radius = Main.input.nextDouble();
Circle circle = new Circle();
circle.setRadius(radius);
Card card = new Card(circle);
card.getShape().setShapeName("Circle");
cardList.add(card);
}
if(list.get(i) == 2) {
double weidth = Main.input.nextDouble();
double length = Main.input.nextDouble();
Rectangle rectangle = new Rectangle();
rectangle.setWidth(weidth);
rectangle.setHeight(length);
Card card = new Card(rectangle);
card.getShape().setShapeName("Rectangle");
cardList.add(card);
}
if(list.get(i) == 3) {
double side1 = Main.input.nextDouble();
double side2 = Main.input.nextDouble();
double side3 = Main.input.nextDouble();
Triangle triangle = new Triangle();
triangle.setSide1(side1);
triangle.setSide2(side2);
triangle.setSide3(side3);
Card card = new Card(triangle);
card.getShape().setShapeName("Triangle");
cardList.add(card);
}
if(list.get(i) == 4) {
double topSide = Main.input.nextDouble();
double bottomSide = Main.input.nextDouble();
double height = Main.input.nextDouble();
Trapezoid trapezoid = new Trapezoid();
trapezoid.setTopSide(topSide);
trapezoid.setBottomSide(bottomSide);
trapezoid.setHeight(height);
Card card = new Card(trapezoid);
card.getShape().setShapeName("Trapezoid");
cardList.add(card);
}
}
}
public boolean validate(){
      boolean a = true;
      for (Card card : cardList) {
          if (card.getShape().validate()){
              a = true;
              break;
          }
      }
      return a;
}
  public void cardSort() {
for(int i = 0;i < cardList.size(); i++)
for(int j = i + 1; j < cardList.size(); j++)
{
if(cardList.get(i).getShape().getArea() < cardList.get(j).getShape().getArea())
Collections.swap(cardList, i, j);
}
}
  public double getAllArea(){
      double sumArea =0;
      for (Card card : cardList){
          sumArea = sumArea + card.getShape().getArea();
      }
      return sumArea;
}
  public void showResult() {
System.out.println("The original list:");
for(int i=0;i<cardList.size();i++) {
System.out.print( cardList.get(i).getShape().getShapeName()+":");
System.out.printf("%.2f", cardList.get(i).getShape().getArea());
System.out.printf(" ");
}
System.out.printf("\n");
System.out.println("The sorted list:");
cardSort();

for(int i=0;i<cardList.size();i++) {
System.out.print(cardList.get(i).getShape().getShapeName()+":");
System.out.printf("%.2f", cardList.get(i).getShape().getArea());
System.out.printf(" ");
}
System.out.printf("\n");
System.out.printf("Sum of area:");
System.out.printf("%.2f", getAllArea());
System.out.printf("\n");
}

}

class Card implements Comparable<Card> {

private Shape shape;
public Card() {
// TODO 自动生成的构造函数存根
}
public Card(Shape shape) {
super();
this.shape = shape;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public int compareTo(Card card) {
  return -(int)(shape.getArea()-card.getShape().getArea());
}

}

abstract class Shape {

private String shapeName; 
public Shape() {
// TODO 自动生成的构造函数存根
}
public Shape(String shapeName) {
super();
this.shapeName = shapeName;
}
public String getShapeName() {
return shapeName;
}
public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
public abstract double getArea() ;
public abstract boolean validate();

}

 

class Circle extends Shape{

private double radius;

public Circle() {
super();
// TODO Auto-generated constructor stub
}

public Circle(double radius) {
this.radius = radius;
}

public double getRadius() {
return radius;
}

public void setRadius(double radius) {
this.radius = radius;
}

@Override
public double getArea() {
return Math.PI*radius*radius;
}

@Override
public boolean validate() {
return this.radius > 0;
}

}

class Rectangle extends Shape{

private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Rectangle() {
super();
// TODO Auto-generated constructor stub
}

@Override
public double getArea() {
return height * width;
}

@Override
public boolean validate() {
return width > 0 && height > 0;
}

}

 

class Trapezoid extends Shape{

private double topSide;
private double bottomSide;
private double height;
public Trapezoid() {
super();
// TODO Auto-generated constructor stub
}

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;
}

@Override
public double getArea() {

return height*(topSide + bottomSide)/2;

}

@Override
public boolean validate() {

return topSide > 0 && height > 0 && bottomSide > 0;

}

}

class Triangle extends Shape{

private double side1;
private double side2;
private double side3;
public Triangle() {
super();
// TODO Auto-generated constructor stub
}

public Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
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 getSide3() {
return side3;
}

public void setSide3(double side3) {
this.side3 = side3;
}

@Override
public double getArea() {
double p = (side1 + side2 + side3)/2;
double Area = Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
return Area;
}

@Override
public boolean validate() {
boolean p = true;
if(!(side1 > 0 && side2 > 0 && side3 > 0))
p = false;
else {
if(!(side1 + side2 > side3 && side1 + side3 > side2 && side2 + side3 > side1))
p = false;
}
return p;
}

}

 

类图如下:

 

 

圈复杂度分析截图如下

 

 

 

总结:总的来说,这道题应该算是比较简单的题目了,出的也比较好,不仅可以让我们通过这道题练习到相关的知识点从而达到教学要求,同时呢也在一定的程度上给我们增大了对Java这门科目的学习的信心,是一道特别棒的题目。

 

 

 

② 题目集7-2 图形卡片分组游戏 (60 分)

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

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

输入格式:

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

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

输出格式:

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

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

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

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

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

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

代码如下:

import java.util.ArrayList; import java.util.Scanner; import java.util.TreeSet;

public class Main {

public static Scanner input = new Scanner(System.in);
public static void main(String args[]) {
ArrayList<Integer> list = new ArrayList<Integer>();
int num = input.nextInt();
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();
}

}

class DealCardList { ArrayList<Circle> circleList = new ArrayList<Circle>(); ArrayList<Rectangle> rectangleList = new ArrayList<Rectangle>(); ArrayList<Triangle> triangleList = new ArrayList<Triangle>(); ArrayList<Trapezoid> trapezoidList = new ArrayList<Trapezoid>(); ArrayList<Card> cardList = new ArrayList<Card>(); public DealCardList() { super(); // TODO 自动生成的构造函数存根 } DealCardList(ArrayList<Integer> list){ for(int i = 0; i < list.size(); i++) { if(list.get(i) == 1) { double radius = Main.input.nextDouble(); Circle circle = new Circle(); circle.setRadius(radius); circle.setShapeName("Circle"); circleList.add(circle); Card card = new Card(circle); card.getShape().setShapeName("Circle"); cardList.add(card); } if(list.get(i) == 2) { double weidth = Main.input.nextDouble(); double length = Main.input.nextDouble(); Rectangle rectangle = new Rectangle(); rectangle.setWidth(weidth); rectangle.setHeight(length); Card card = new Card(rectangle); rectangleList.add(rectangle); card.getShape().setShapeName("Rectangle"); cardList.add(card); } if(list.get(i) == 3) { double side1 = Main.input.nextDouble(); double side2 = Main.input.nextDouble(); double side3 = Main.input.nextDouble(); Triangle triangle = new Triangle(); triangle.setSide1(side1); triangle.setSide2(side2); triangle.setSide3(side3); Card card = new Card(triangle); triangleList.add(triangle); card.getShape().setShapeName("Triangle"); cardList.add(card); } if(list.get(i) == 4) { double topSide = Main.input.nextDouble(); double bottomSide = Main.input.nextDouble(); double height = Main.input.nextDouble(); Trapezoid trapezoid = new Trapezoid(); trapezoid.setTopSide(topSide); trapezoid.setBottomSide(bottomSide); trapezoid.setHeight(height); Card card = new Card(trapezoid); trapezoidList.add(trapezoid); card.getShape().setShapeName("Trapezoid"); cardList.add(card); } } } public boolean validate(){ boolean a = true; for (Card card : cardList) { if (card.getShape().validate()){ a = true; break; } } return a; } public void cardSort() { for(int i = 0;i < cardList.size(); i++) for(int j = i + 1; j < cardList.size(); j++) { if(cardList.get(i).getShape().getArea() < cardList.get(j).getShape().getArea()) Collections.swap(cardList, i, j); } } public double getAllArea(){ double sumArea = 0; for (Card card : cardList){ sumArea = sumArea + card.getShape().getArea(); }

        double sumArea1 = 0;
for(Rectangle rectangle : rectangleList) {
sumArea1 = sumArea1 + rectangle.getArea();
}

double sumArea2 = 0;
for(Circle circle : circleList) {
sumArea2 = sumArea2 + circle.getArea();
}

double sumArea3 = 0;
for(Triangle triangle : triangleList) {
sumArea3 = sumArea3 + triangle.getArea();
}

double sumArea4 = 0;
for(Trapezoid trapezoid : trapezoidList) {
sumArea4 = sumArea4 + trapezoid.getArea();
}

double []a = new double[4];
a[0] = sumArea1;
a[1] = sumArea2;
a[2] = sumArea3;
a[3] = sumArea4;
Arrays.sort(a);
return a[3];
}
public void showResult() {
System.out.println("The original list:");
System.out.print("[");
for(int i=0;i<cardList.size();i++) {
System.out.print(cardList.get(i).getShape().getShapeName()+":");
System.out.printf("%.2f", cardList.get(i).getShape().getArea());
System.out.printf(" ");
}
System.out.print("]");
System.out.printf("\n");
System.out.println("The sorted list:");
cardSort();

for(int i=0;i<cardList.size();i++) {
System.out.print(cardList.get(i).getShape().getShapeName()+":");
System.out.printf("%.2f", cardList.get(i).getShape().getArea());
System.out.printf(" ");
}
System.out.printf("\n");
System.out.printf("Sum of area:");
System.out.printf("%.2f", getAllArea());
System.out.printf("\n");
}

}

class Card implements Comparable<Card> {

private Shape shape;

public Shape getShape() {
// TODO Auto-generated method stub
return null;
}

public void setShape(Shape shape) {
this.shape = shape;
}

public Card(Circle circle) {
super();
// TODO Auto-generated constructor stub

}

public Card(Rectangle rectangle) {
// TODO Auto-generated constructor stub
}

public Card(Triangle triangle) {
// TODO Auto-generated constructor stub
}

public Card(Trapezoid trapezoid) {
// TODO Auto-generated constructor stub
}

@Override
public int compareTo(Card card) {
// TODO Auto-generated method stub
return 0;
}

 

}

class Triangle extends Shape{

private double side1;
private double side2;
private double side3;
public Triangle() {
super();
// TODO Auto-generated constructor stub
}

public Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
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 getSide3() {
return side3;
}

public void setSide3(double side3) {
this.side3 = side3;
}

@Override
public double getArea() {
double p = (side1 + side2 + side3);
return Math.sqrt(p*(p-side1)*(p-side3));
}

@Override
public boolean validate() {
boolean p = true;
if(!(side1 > 0 && side2 > 0 && side3 > 0))
p = false;
else {
if(!(side1 + side2 > side3 && side1 + side3 > side2 && side2 + side3 > side1))
p = false;
}
return p;
}

}

class Trapezoid extends Shape{

private double topSide;
private double bottomSide;
private double height;
public Trapezoid() {
super();
// TODO Auto-generated constructor stub
}

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;
}

@Override
public double getArea() {

return (topSide + bottomSide)/2;

}

@Override
public boolean validate() {

return topSide > 0 && height > 0 && bottomSide > 0;

}

}

abstract class Shape {

private String shapeName;

public String getShapeName() {
return shapeName;
}

public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}

public Shape(String shapeName) {
super();
this.shapeName = shapeName;
}

public Shape() {
super();
// TODO Auto-generated constructor stub
}

public double getArea() {
// TODO Auto-generated method stub
return 0;
}

public boolean validate() {
// TODO Auto-generated method stub
return false;
}

}

class Circle extends Shape{

private double radius;

public Circle() {
super();
// TODO Auto-generated constructor stub
}

public Circle(double radius) {
this.radius = radius;
}

public double getRadius() {
return radius;
}

public void setRadius(double radius) {
this.radius = radius;
}

@Override
public double getArea() {
return Math.PI*radius*radius;
}

@Override
public boolean validate() {
return this.radius > 0;
}

}

class Rectangle extends Shape{

private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Rectangle() {
super();
// TODO Auto-generated constructor stub
}

@Override
public double getArea() {
return height * width;
}

@Override
public boolean validate() {
return width > 0 && height > 0;
}

}

 

类图如下:

 

 

 

 

圈复杂度分析截图如下:

 

 

 

总结:这道题就是我特别想要吐槽的啦,准确的来说我这个题目应该是那到了满分的,在编译器上面所有的测试点都可以通过,结果和指导书上面的没有区别,但是我万万没想到在PTA上面居然会是长度超过限制,直接把我给整懵逼了,所以说希望老师在这个方面可以注意一下,不然我们辛辛苦苦写的代码最后却得到一个这样的结果会很伤心的,也十分打击学生的学习信心和消磨学习兴趣。

 

题目集8-1 ATM机类结构设计(一) (100 分)

设计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编号]上存款¥[金额]
当前余额为¥[金额]

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

④查询余额业务输出

¥[金额]

金额保留两位小数。

 

代码如下:

import java.util.ArrayList; import java.util.Scanner; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern;

public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in);

	UnionPay unionPay = new UnionPay();   	

Bank ccb = new Bank("1001","中国建设银行");
Bank icbc = new Bank("1002","中国工商银行");
Bank abc = new Bank("1003","中国农业银行");
unionPay.addBank(ccb);
unionPay.addBank(icbc);
unionPay.addBank(abc);

ATM aTM1 = new ATM("01",ccb); ATM aTM2 = new ATM("02",ccb); ATM aTM3 = new ATM("03",ccb); ATM aTM4 = new ATM("04",ccb); ATM aTM5 = new ATM("05",icbc); ATM aTM6 = new ATM("06",icbc); ATM aTM7 = new ATM("07",abc); ATM aTM8 = new ATM("08",abc); ATM aTM9 = new ATM("09",abc); ATM aTM10 = new ATM("10",abc); ATM aTM11 = new ATM("11",abc); ccb.addATM(aTM1); ccb.addATM(aTM2); ccb.addATM(aTM3); ccb.addATM(aTM4); icbc.addATM(aTM5); icbc.addATM(aTM6); abc.addATM(aTM7); abc.addATM(aTM8); abc.addATM(aTM9); abc.addATM(aTM10); abc.addATM(aTM11); User Yangguo = new User("360101200102122324","杨过","13856223254"); User Guojing = new User("360101200012302552","郭靖","13800021124"); User Zhangwuji = new User("360502199805163221","张无忌","13952110011"); User Weixiaobao = new User("360201200513243326","韦小宝","13025996587"); User Zhangsanfeng = new User("360201200513243327","张三丰","13025996588"); User Linghuchong = new User("360201200513243328","令狐冲","13025996589"); User Qioafeng = new User("360201200513243329","乔峰","13025996590"); User Hongqigong = new User("3630000010033431008","洪七公","15679136193"); Account ccbAcc1 = new Account("3217000010041315709",10000.00,Yangguo,ccb); Account ccbAcc2 = new Account("3217000010041315715",10000.00,Yangguo,ccb); Account ccbAcc3 = new Account("3217000010051320007",10000.00,Guojing,ccb); Account icbcAcc1 = new Account("3222081502001312389",10000.00,Zhangwuji,icbc); Account icbcAcc2 = new Account("3222081502001312390",10000.00,Zhangwuji,icbc); Account icbcAcc3 = new Account("3222081502001312399",10000.00,Zhangwuji,icbc); Account icbcAcc4 = new Account("3222081502051320785",10000.00,Weixiaobao,icbc); Account icbcAcc5 = new Account("3222081502051320786",10000.00,Weixiaobao,icbc); Account ccbAcc4 = new Account("360201200513243327",10000.00,Zhangsanfeng,ccb); Account icbcAcc6 = new Account("3640000010045441009",10000.00,Linghuchong,icbc); Account abcAcc1 = new Account("3630000010033431001",10000.00, Qioafeng, abc); Account abcAcc2 = new Account("3630000010033431008",10000.00, Hongqigong, abc);

ccb.addAccount(ccbAcc1); ccb.addAccount(ccbAcc2); ccb.addAccount(ccbAcc3); ccb.addAccount(ccbAcc4); icbc.addAccount(icbcAcc1); icbc.addAccount(icbcAcc2); icbc.addAccount(icbcAcc3); icbc.addAccount(icbcAcc4); icbc.addAccount(icbcAcc5); icbc.addAccount(icbcAcc6); abc.addAccount(abcAcc1); abc.addAccount(abcAcc2);

Yangguo.addAccount(ccbAcc1); Yangguo.addAccount(ccbAcc2); Guojing.addAccount(ccbAcc3); Zhangwuji.addAccount(icbcAcc1); Zhangwuji.addAccount(icbcAcc2); Zhangwuji.addAccount(icbcAcc3); Weixiaobao.addAccount(icbcAcc4); Weixiaobao.addAccount(icbcAcc5); Zhangsanfeng.addAccount(ccbAcc4); Linghuchong.addAccount(icbcAcc6); Qioafeng.addAccount(abcAcc1); Hongqigong.addAccount(abcAcc2); Card ccbCard1 = new Card("6217000010041315709","88888888",ccbAcc1); Card ccbCard2 = new Card("6217000010041315715","88888888",ccbAcc1); Card ccbCard3 = new Card("6217000010041315718","88888888",ccbAcc2); Card ccbCard4 = new Card("6217000010051320007","88888888",ccbAcc3); Card icbcCard5 = new Card("6222081502001312389","88888888",icbcAcc1); Card icbcCard6 = new Card("6222081502001312390","88888888",icbcAcc2); Card icbcCard7 = new Card("6222081502001312399","88888888",icbcAcc3); Card icbcCard8 = new Card("6222081502001312400","88888888",icbcAcc3); Card icbcCard9 = new Card("6222081502051320785","88888888",icbcAcc4); Card icbcCard10 = new Card("6222081502051320786","88888888",icbcAcc5); Card ccbCard11 = new Card("6640000010045442002","88888888",ccbAcc4); Card ccbCard12 = new Card("6640000010045442003","88888888",ccbAcc4); Card icbcCard13 = new Card("6640000010045441009","88888888",icbcAcc6); Card abcCard14 = new Card("6630000010033431001","88888888",abcAcc1); Card abcCard15 = new Card("6630000010033431008","88888888",abcAcc2); ccbAcc1.addCard(ccbCard1); ccbAcc1.addCard(ccbCard2); ccbAcc2.addCard(ccbCard3); ccbAcc3.addCard(ccbCard4); ccbAcc4.addCard(ccbCard11); ccbAcc4.addCard(ccbCard12); icbcAcc1.addCard(icbcCard5); icbcAcc2.addCard(icbcCard6); icbcAcc3.addCard(icbcCard7); icbcAcc3.addCard(icbcCard8); icbcAcc4.addCard(icbcCard9); icbcAcc5.addCard(icbcCard10); icbcAcc6.addCard(icbcCard13); abcAcc1.addCard(abcCard14); abcAcc2.addCard(abcCard15); StringBuilder sb = new StringBuilder(); String data;

	while(!((data = input.nextLine()).equals("#"))) {
sb.append(data + "\n");
}

String[] dt = sb.toString().split("\n");
for(int i = 0; i < dt.length; i++) {
String[] dataLine = dt[i].toString().split("\\s+");

if(dataLine.length == 1) {
GetBalance gb = new GetBalance(unionPay);
System.out.println("业务:查询余额 "+String.format("¥%.2f", gb.getBalance(dataLine[0])));
}else {
WithDraw2 wd= new WithDraw2(unionPay,dataLine[0],dataLine[1],dataLine[2],Double.parseDouble(dataLine[3]));
wd.Withdraw2();
}
}
}

}

class ValidateData { /** * 校验卡号是否存在 * @param unionPay * @param cardNO * @return */ 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;
}

/**
* 校验ATM ID是否存在
* @param unionPay
* @param ATMID
* @return
*/
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;
}
/**
* 校验Account贷记是否存在
* @param unionPay
* @param accountNO
* @return
*/
public static boolean VaildateCountOfCredit(UnionPay unionPay, String cardNO) {
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 card = cardItr.next();
if(card.getCardNO().equals(cardNO)&&java.util.regex.Pattern.matches("36.*", card.getAccount().getAccountNO())) {

return true;
}
}
}
}
return false;
}

} class GetBalance { private UnionPay unionPay;

public GetBalance() {
super();
// TODO Auto-generated constructor stub
}

public GetBalance(UnionPay unionPay) {
super();
this.unionPay = unionPay;
}

public double getBalance(String cardNO) {
return ValidateData.getCardbyCardNO(unionPay, cardNO).getAccount().getBalance();
}

}

class Card { private String cardNO; private String cardPassword; private Account account = null;

public Card() {
super();
// TODO Auto-generated constructor stub
}

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 User { private String ID; private String name; private String Phone; ArrayList<Account> list = new ArrayList<Account>();

public User() {
  super();
  // TODO Auto-generated constructor stub
}    

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);
}

} class Withdraw { private UnionPay unionPay; private String cardNO; private String cardPassword; private String ATMID; private double amount;

public UnionPay getUnionPay() {
return unionPay;
}
public void setUnionPay(UnionPay unionPay) {
this.unionPay = unionPay;
}
public String getCardNO() {
return cardNO;
}
public void setCardNO(String cardNO) {
this.cardNO = cardNO;
}
public String getCardPassword() {
return cardPassword;
}
public void setCardPassword(String cardPassword) {
this.cardPassword = cardPassword;
}
public String getATMID() {
return ATMID;
}
public void setATMID(String aTMID) {
ATMID = aTMID;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public Withdraw() {
super();
// TODO Auto-generated constructor stub
}
public Withdraw(UnionPay unionPay, String cardNO, String cardPassword, String aTMID, double amount) {
super();
this.unionPay = unionPay;
this.cardNO = cardNO;
this.cardPassword = cardPassword;
ATMID = aTMID;
this.amount = amount;
}

public Withdraw(String cardNO, String cardPassword, String aTMID, double amount) {
super();
this.cardNO = cardNO;
this.cardPassword = cardPassword;
ATMID = aTMID;
this.amount = amount;
}
public void withdraw() {
/**
* 校验该卡是否存在
*/
Card card = ValidateData.getCardbyCardNO(unionPay, cardNO);
if(card == null) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}

/**
* 校验ATM是否存在
*/
ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID);
if(aTM == null) {
System.out.println("Sorry,the ATM's id is wrong.");
System.exit(0);
}

Account account = Account.getAmountbyCardNO(cardNO);
double balance = account.getBalance();

/**
* 校验卡密码是否正确
*/
if(!card.getCardPassword().equals(cardPassword)) {
System.out.println("Sorry,your password is wrong.");
System.exit(0);
}

/**
* 校验取款金额是否大于余额
*/
if (amount > balance) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}

/**
* 校验是否为跨行取款
*/
if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
System.out.println("Sorry,cross-bank withdrawal is not supported.");
System.exit(0);
}

account.setBalance(balance - amount);//取款更新余额操作

if(amount >= 0) {
showResult(account,1);
}else {
showResult(account,0);
}

}

public void showResult(Account account,int flag) {
String type = "";
if(flag == 1) {
type = "取款";
}else {
type = "存款";
amount *= -1;
}
String userName = account.getUser().getName();
String bankName = account.getBank().getBankName();
System.out.println(userName + "在" +
bankName + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount));
System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance()));
}

} class WithDraw2 extends Withdraw implements WithDrawByCrossingBank{

public WithDraw2(UnionPay unionPay, String cardNO, String cardPassword, String aTMID, double amount) {
super(unionPay, cardNO, cardPassword, aTMID, amount);
}
public void Withdraw2() {
/**
* 校验该卡是否存在
*/
Card card = ValidateData.getCardbyCardNO(super.getUnionPay(), super.getCardNO());
if(card == null) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}

/**
* 校验ATM是否存在
*/
ATM aTM = ValidateData.getATMbyATMID(super.getUnionPay(), super.getATMID());
if(aTM == null) {
System.out.println("Sorry,the ATM's id is wrong.");
System.exit(0);
}

Account account = Account.getAmountbyCardNO(super.getCardNO());
double balance = account.getBalance();

/**
* 校验卡密码是否正确
*/
if(!card.getCardPassword().equals(super.getCardPassword())) {
System.out.println("Sorry,your password is wrong.");
System.exit(0);
}
/**
* 校验取款金额是否大于余额
* 非贷记卡
* 校验是否为跨行取款
*/ double VaildateData = 0;
VaildateData= account.getBalance()-super.getAmount();
if(!ValidateData.VaildateCountOfCredit(getUnionPay(), getCardNO())) {
if(super.getAmount() > balance) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
}else if(Math.abs(VaildateData) > 50000 | Math.abs(VaildateData) + super.getAmount()*rate(aTM) > 50000 ) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}

// account.setBalance(balance - super.getAmount());//取款更新余额操作 /** * 校验是否为跨行取款 / if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) { if(VaildateData < 0 & Math.abs(VaildateData) <= super.getAmount() ) { account.setBalance(balance - super.getAmount()-super.getAmount()rate(aTM)+VaildateData * 0.05);//取款更新余额操作 }else if(VaildateData < 0) { account.setBalance(balance - super.getAmount()-super.getAmount()*rate(aTM) -getAmount() * 0.05);//取款更新余额操作 }else if(VaildateData == 0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); }else { account.setBalance(balance - super.getAmount()-super.getAmount()*rate(aTM));//取款更新余额操作 } if(super.getAmount() >= 0) { showResult(account,1,aTM); }else { showResult(account,0,aTM); } }else{ if(VaildateData < 0 & Math.abs(VaildateData) <= super.getAmount() ) { account.setBalance(balance +VaildateData * 0.05 - super.getAmount());//取款更新余额操作 }else if(VaildateData < 0) { account.setBalance(balance -getAmount() * 0.05 - super.getAmount());//取款更新余额操作 }else { account.setBalance(balance - super.getAmount());//取款更新余额操作 } if(super.getAmount() >= 0) { showResult(account,1,aTM); }else { showResult(account,0,aTM); } } } public void showResult(Account account,int flag,ATM atm) { String type = ""; if(flag == 1) { type = "取款"; }else { type = "存款"; double amount = super.getAmount(); amount *= -1; super.setAmount(amount); } String userName = account.getUser().getName(); String bankName = atm.getBank().getBankName();

	System.out.println("业务:"+type+" " +userName + "在" +
bankName + "的" + super.getATMID() + "号ATM机上" + type + String.format("¥%.2f", super.getAmount()));
System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance()));
}
public double rate(ATM atm) {
if(atm.getBank().getBankNO().equals("1001")) {
return 0.02;
}else if(atm.getBank().getBankNO().equals("1002")) {
return 0.03;
}else if(atm.getBank().getBankNO().equals("1003")) {
return 0.04;
}
return 0;

}

} interface WithDrawByCrossingBank{ public abstract void showResult(Account account,int flag); } class Bank { private String bankNO; private String bankName; private ArrayList<Account> accountList = new ArrayList<Account>(); private ArrayList<ATM> ATMList = new ArrayList<ATM>();

public Bank() {
super();
// TODO Auto-generated constructor stub
}

public Bank(String bankNO, String bankName) {
super();
this.bankNO = bankNO;
this.bankName = bankName;
}

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 ATM { private String ATMID; private Bank bank = null;

public ATM() {
super();
// TODO Auto-generated constructor stub
}

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 Account { private String accountNO; private double balance = 0; private User user = null; private Bank bank = null; private static ArrayList<Card> list = new ArrayList<Card>();

public Account() {
super();
// TODO Auto-generated constructor stub
}

public Account(String accountNO, double balance, User user, Bank bank) {
super();
this.accountNO = accountNO;
this.balance = balance;
this.user = user;
this.bank = bank;
}

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

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

public double getBalance() {
return balance;
}

public void setBalance(double 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;
}

} class UnionPay { private ArrayList<Bank> bankList = new ArrayList<Bank>();

public UnionPay() {
super();
// TODO Auto-generated constructor stub
}

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);
}

}

 

类图如下:

 

 

 

圈复杂度分析截图如下:

 

 

 

总结:这次的题目集也是非常的具有挑战性,难度也是比较大,刚开始做的时候我并没有什么思路,尝试了许久也没有得到太大的进展,但是通过这次的习题,也是让我认识到了自己还存在的很多的不足之处,在以后的学习当中也会更加明确自己的不足和需要改进和提高的地方。

 

 

题目集9-1ATM机类结构设计(二) (100 分)

 

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

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

③查询余额业务输出

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

金额保留两位小数。

 

代码如下:

import java.util.ArrayList; import java.util.Scanner; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern;

public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in);

	UnionPay unionPay = new UnionPay();   	

Bank ccb = new Bank("1001","中国建设银行");
Bank icbc = new Bank("1002","中国工商银行");
Bank nyyh = new Bank("1003","中国农业银行");
unionPay.addBank(ccb);
unionPay.addBank(icbc);
unionPay.addBank(nyyh);

ATM aTM1 = new ATM("01",ccb);
ATM aTM2 = new ATM("02",ccb);
ATM aTM3 = new ATM("03",ccb);
ATM aTM4 = new ATM("04",ccb);
ATM aTM5 = new ATM("05",icbc);
ATM aTM6 = new ATM("06",icbc);
ATM aTM7 = new ATM("07",nyyh);
ATM aTM8 = new ATM("08",nyyh);
ATM aTM9 = new ATM("09",nyyh);
ATM aTM10 = new ATM("10",nyyh);
ATM aTM11 = new ATM("11",nyyh);

ccb.addATM(aTM1);
ccb.addATM(aTM2);
ccb.addATM(aTM3);
ccb.addATM(aTM4);
icbc.addATM(aTM5);
icbc.addATM(aTM6);
nyyh.addATM(aTM7);
nyyh.addATM(aTM8);
nyyh.addATM(aTM9);
nyyh.addATM(aTM10);
nyyh.addATM(aTM11);

User Yangguo = new User("360101200102122324","杨过","13856223254");
User Guojing = new User("360101200012302552","郭靖","13800021124");
User Zhangwuji = new User("360502199805163221","张无忌","13952110011");
User Weixiaobao = new User("360201200513243326","韦小宝","13025996587");
User zhangsanfeng = new User("3640000010045442002","张三丰","");
User linghuchong = new User("3640000010045441009","令狐冲","");
User qiaofeng = new User("3630000010033431001","乔峰 ","");
User hongqigong = new User("3630000010033431008","洪七公","");

Account ccbAcc1 = new jjAccount("3217000010041315709",10000.00,Yangguo,ccb);
Account ccbAcc2 = new jjAccount("3217000010041315715",10000.00,Yangguo,ccb);
Account ccbAcc3 = new jjAccount("3217000010051320007",10000.00,Guojing,ccb);
Account icbcAcc1 = new jjAccount("3222081502001312389",10000.00,Zhangwuji,icbc);
Account icbcAcc2 = new jjAccount("3222081502001312390",10000.00,Zhangwuji,icbc);
Account icbcAcc3 = new jjAccount("3222081502001312399",10000.00,Zhangwuji,icbc);
Account icbcAcc4 = new jjAccount("3222081502051320785",10000.00,Weixiaobao,icbc);
Account icbcAcc5 = new jjAccount("3222081502051320786",10000.00,Weixiaobao,icbc);
Account ccbAcc4 = new djAccount("3640000010045442002",10000.00,zhangsanfeng,ccb);
Account icbcAcc6 = new djAccount("3640000010045441009",10000.00,linghuchong,icbc);
Account nyyhAcc1 = new djAccount("3630000010033431001",10000.00,qiaofeng,nyyh);
Account nyyhAcc2 = new djAccount("3630000010033431008",10000.00,hongqigong,nyyh);

ccb.addAccount(ccbAcc1); ccb.addAccount(ccbAcc2); ccb.addAccount(ccbAcc3); ccb.addAccount(ccbAcc4); icbc.addAccount(icbcAcc1); icbc.addAccount(icbcAcc2); icbc.addAccount(icbcAcc3); icbc.addAccount(icbcAcc4); icbc.addAccount(icbcAcc5); icbc.addAccount(icbcAcc6); nyyh.addAccount(nyyhAcc1); nyyh.addAccount(nyyhAcc2);

Yangguo.addAccount(ccbAcc1); Yangguo.addAccount(ccbAcc2); Guojing.addAccount(ccbAcc3); Zhangwuji.addAccount(icbcAcc1); Zhangwuji.addAccount(icbcAcc2); Zhangwuji.addAccount(icbcAcc3); Weixiaobao.addAccount(icbcAcc4); Weixiaobao.addAccount(icbcAcc5); zhangsanfeng.addAccount(ccbAcc4); linghuchong.addAccount(icbcAcc6); qiaofeng.addAccount(nyyhAcc1); hongqigong.addAccount(nyyhAcc2);

Card ccbCard1 = new Card("6217000010041315709","88888888",ccbAcc1); Card ccbCard2 = new Card("6217000010041315715","88888888",ccbAcc1); Card ccbCard3 = new Card("6217000010041315718","88888888",ccbAcc2); Card ccbCard4 = new Card("6217000010051320007","88888888",ccbAcc3); Card icbcCard5 = new Card("6222081502001312389","88888888",icbcAcc1); Card icbcCard6 = new Card("6222081502001312390","88888888",icbcAcc2); Card icbcCard7 = new Card("6222081502001312399","88888888",icbcAcc3); Card icbcCard8 = new Card("6222081502001312400","88888888",icbcAcc3); Card icbcCard9 = new Card("6222081502051320785","88888888",icbcAcc4); Card icbcCard10 = new Card("6222081502051320786","88888888",icbcAcc5); Card ccbCard11 = new Card("6640000010045442002","88888888",ccbAcc4); Card ccbCard12 = new Card("6640000010045442003","88888888",ccbAcc4); Card icbcCard13 = new Card("6640000010045441009","88888888",icbcAcc6); Card nyyhCard14 = new Card("6630000010033431001","88888888",nyyhAcc1); Card nyyhCard15 = new Card("6630000010033431008","88888888",nyyhAcc2); ccbAcc1.addCard(ccbCard1); ccbAcc1.addCard(ccbCard2); ccbAcc2.addCard(ccbCard3); ccbAcc3.addCard(ccbCard4); icbcAcc1.addCard(icbcCard5); icbcAcc2.addCard(icbcCard6); icbcAcc3.addCard(icbcCard7); icbcAcc3.addCard(icbcCard8); icbcAcc4.addCard(icbcCard9); icbcAcc5.addCard(icbcCard10); ccbAcc4.addCard(ccbCard11); ccbAcc4.addCard(ccbCard12); icbcAcc6.addCard(icbcCard13); nyyhAcc1.addCard(nyyhCard14); nyyhAcc2.addCard(nyyhCard15); StringBuilder sb = new StringBuilder(); String data;

	while(!((data = input.nextLine()).equals("#"))) {
sb.append(data + "\n");
}

String[] dt = sb.toString().split("\n");
for(int i = 0; i < dt.length; i++) {
String[] dataLine = dt[i].toString().split("\\s+");

if(dataLine.length == 1) {
GetBalance gb = new GetBalance(unionPay);
System.out.print("业务:查询余额 ");
System.out.print(String.format("¥%.2f", gb.getBalance(dataLine[0])));
}else {
Withdraw wd = new Withdraw(unionPay,dataLine[0],dataLine[1],dataLine[2],Double.parseDouble(dataLine[3]));
wd.withdraw();
}
}
}

}

class Bank { private String bankNO; private String bankName; private ArrayList<Account> accountList = new ArrayList<Account>(); private ArrayList<ATM> ATMList = new ArrayList<ATM>();

public Bank() {
super();
// TODO Auto-generated constructor stub
}

public Bank(String bankNO, String bankName) {
super();
this.bankNO = bankNO;
this.bankName = bankName;
}

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 User { private String ID; private String name; private String Phone; ArrayList<Account> list = new ArrayList<Account>();

public User() {
  super();
  // TODO Auto-generated constructor stub
}    

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);
}

}

abstract class Account { private String accountNO; private double balance = 0; private User user = null; private Bank bank = null; private static ArrayList<Card> list = new ArrayList<Card>();

public Account() {
super();
// TODO Auto-generated constructor stub
}

public Account(String accountNO, double balance, User user, Bank bank) {
super();
this.accountNO = accountNO;
this.balance = balance;
this.user = user;
this.bank = bank;
}

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

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

public double getBalance() {
return balance;
}

public void setBalance(double 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;
}

abstract String getType();

}

class jjAccount extends Account{

private String accountNO;
private double balance = 0;
private User user = null;
private Bank bank = null;
public jjAccount(String accountNO, double balance, User user, Bank bank) {
// TODO Auto-generated constructor stub
super();
this.accountNO = accountNO;
this.balance = balance;
this.user = user;
this.bank = bank;
}

public double getBalance() {
return balance;
}

public void setBalance(double 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;
}

@Override
String getType() {
return "jj";
}

}

class djAccount extends Account{

private String accountNO;
private double balance = 0;
private User user = null;
private Bank bank = null;
public djAccount(String accountNO, double balance, User user, Bank bank) {
// TODO Auto-generated constructor stub
super();
this.accountNO = accountNO;
this.balance = balance;
this.user = user;
this.bank = bank;
}

public double getBalance() {
return balance;
}

public void setBalance(double 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;
}

@Override
String getType() {
return "dj";
// TODO Auto-generated method stub

}

}

class Card { private String cardNO; private String cardPassword; private Account account = null;

public Card() {
super();
// TODO Auto-generated constructor stub
}

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 ATM { private String ATMID; private Bank bank = null;

public ATM() {
super();
// TODO Auto-generated constructor stub
}

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 Withdraw { private UnionPay unionPay; private String cardNO; private String cardPassword; private String ATMID; private double amount; private String Type; private double rate; private String Bankname;

public Withdraw() {
super();
// TODO Auto-generated constructor stub
}
public Withdraw(UnionPay unionPay, String cardNO, String cardPassword, String aTMID, double amount) {
super();
this.unionPay = unionPay;
this.cardNO = cardNO;
this.cardPassword = cardPassword;
ATMID = aTMID;
this.amount = amount;
}

public Withdraw(String cardNO, String cardPassword, String aTMID, double amount) {
super();
this.cardNO = cardNO;
this.cardPassword = cardPassword;
ATMID = aTMID;
this.amount = amount;
}
public void withdraw() {
/**
* 校验该卡是否存在
*/
Card card = ValidateData.getCardbyCardNO(unionPay, cardNO);
if(card == null) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}

/**
* 校验ATM是否存在
*/
ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID);
if(aTM == null) {
System.out.println("Sorry,the ATM's id is wrong.");
System.exit(0);
}
Bankname = aTM.getBank().getBankName();
Account account = Account.getAmountbyCardNO(cardNO);
double balance = account.getBalance();
Type = account.getType();
/**
* 校验卡密码是否正确
*/
if(!card.getCardPassword().equals(cardPassword)) {
System.out.println("Sorry,your password is wrong.");
System.exit(0);
}

if(amount > 0) {
if(account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
if(aTM.getBank().getBankName().equals("中国建设银行")) {
rate = 0.02;
}
else if(aTM.getBank().getBankName().equals("中国工商银行")) {
rate = 0.03;
}
else if(aTM.getBank().getBankName().equals("中国农业银行")) {
rate = 0.04;
}
//跨行透支取款
if(amount + amount*rate > balance){
if(Type.equals("dj")){
if((amount + amount*0.05) < (50000 + balance)) {
if(balance > 0){
account.setBalance(balance - amount - (amount - balance)*0.05 - amount*rate);
}
else{
account.setBalance(balance - amount - amount*0.05 - amount*rate);
}
}
else{
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
}
else{
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
}
//跨行取款
else{
account.setBalance(balance - amount - amount*rate);
}
}
//行内取款
else{
if(amount > balance && Type.equals("dj")) {
if( amount < (balance + 50000)){
if(balance < 0){
account.setBalance(balance - amount*0.05 - amount);
}
else{
account.setBalance(balance - (amount - balance)*0.05 - amount);
}
}
else{
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
}
else {
account.setBalance(balance - amount);
}
}
}

 

 

else {
account.setBalance(balance - amount);
}

if(amount >= 0) {
showResult(account,1);
}else {
showResult(account,0);
}

}

public void showResult(Account account,int flag) {
String type = "";
if(flag == 1) {
type = "取款";
}else {
type = "存款";
amount *= -1;
}
String userName = account.getUser().getName();

// String bankName = ATM.getBank().getBankName(); System.out.println("业务:"+ type + " " +userName + "在" + Bankname + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount)); System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance())); } }

class ValidateData { /** * 校验卡号是否存在 * @param unionPay * @param cardNO * @return */ 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;
}

/**
* 校验ATM ID是否存在
* @param unionPay
* @param ATMID
* @return
*/
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;
}

}

class UnionPay { private ArrayList<Bank> bankList = new ArrayList<Bank>();

public UnionPay() {
super();
// TODO Auto-generated constructor stub
}

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 GetBalance { private UnionPay unionPay;

public GetBalance() {
super();
// TODO Auto-generated constructor stub
}

public GetBalance(UnionPay unionPay) {
super();
this.unionPay = unionPay;
}

public double getBalance(String cardNO) {
return ValidateData.getCardbyCardNO(unionPay, cardNO).getAccount().getBalance();
}

}

 

类图如下:

 

 

 

圈复杂度分析截图如下:

 

 

 

总结:在吸取上次题目集的教训之后在这次的题目集迭代当中有所领悟,也做出了许多改变,所以说结果也还差强人意,没有太失望,也还可以接受。同时呢也通过这次的题目集让我对面向对象的思想与设计理念有了更加深刻的理解。

 

3.踩坑心得:

经过这几次的题目集,在不断修改与提交代码当中也学习到了许多的,踩了许多坑,也懂得了不少。学到最重要的一点就是无论是什么事情,千万一定一定不要拖拉,就像我每次的题目集一样,老师发放下来之后就一定要尽早抓紧时间去完成,一定不能拖拉,不然到最后肯定完成不了的。这一点非常非常的重要。我之前就是有这个毛病,所以每次的作业结果也是不够让人满意,但是现在我已经在慢慢的改进了,也希望这次的博客可以起到一个督促作用吧,可以让自己心里面时时刻刻的记得这件事情。这个也可以算得上我迄今为止踩过的最大的坑了吧,哈哈哈哈。现在明白应该也不算太晚,哈哈哈。以后一定要好好加油啊!!!!

 

4.改进建议:

到现在为止,可以这么说,现在每次的题目集可以算的上比较完美了。

 

5.总结:

那就好好告个别吧,这应该也是这个学期最后一次写Java的博客作业了吧,还过的挺快的,不知不觉当中,Java的学习就已经告于段落了,现如今回想之前学习的点点滴滴,还是挺怀念的。以前的我现在看来挺天真的,之前的我对于千行代码感觉就觉得不可思议,觉得这是个天文数字,但是现在却已经慢慢的习惯了,也许这也意味着些什么吧.

下面就写写我的学习体会吧:

1.学习中,要养成良好的习惯(写括号时要成对,字母大小写要区分,单词拼写要准确)。

2.在学习的过程中,最好不是仅仅停留在java表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。

3.在学习的过程中一定要动手做、试着写代码,而不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己。

4.在 Java 的学习过程中,可能会遇到形形色色的问题不容易解决,应多去专业论坛了解相关的知识,书本上的知识有限。要会从网上搜索有用的信息 加以整理,促进学习的深入和知识水平的提高。看了好多网上课程,说学到一定程度要尝试着自己做东西,但觉得自己仅仅经过一学期的学习,还远远不够,希望自己在以后学习中继续努力,能够真真正正拥有一门编程语言,对自己今后的发展起到作用。在学习java语言的同时,也让我学会了如何来发现问题,如何解决问题,怎样有效的学习等等,相信会对我一生都有帮助。学习java和学习其他知识一样,都会遇到困难与瓶颈期,关键在于不放弃。学习的动力在于,你为什么学,是跟风?还是自己心里真的喜欢?如果轻言放弃,那么就根本不是喜欢。真正从心里认可的事情,是无论如何都会想办法去做的。

 

posted @ 2021-06-20 20:15  泱泱莫璃  阅读(97)  评论(0)    收藏  举报