题目集7-9总结
- 前言
题目集7开始引入复杂的类构建与类关系的正确建立与调用,考察学者掌握类的继承关系,多态性方法的使用以及接口的应用,题量为两道大题,需要严密的分析思路和方法步骤以及整体观的结合,考察学生知识应用于设计分析,难度较大。考察的主要知识点包括类的对象属性与访问修饰,类的构造方法,类中方法的调用,类与类之间聚合关系的明确建立,类与类之间继承关系关键字extends的写法,继承父类对象以及方法super的使用规范写法和注意事项,主方法中创建类名以及如何传参和调用类中方法的使用。
题目集8开始引导学者对现实中某个常见事项的设计分析能力,模拟银行ATM机取款功能问题对于学者能否理解银行,账户,银行卡,用户等等之间的一些关系以及能否运用以往扎实的类结构设计相关知识来有效处理,类中的属性与方法都需要学者严密的分析与测试。题量为一道大题,难度较大,基本上是以往知识体系的综合体现,考察学者扎实的类结构设计分析能力,账户列表与用户列表数组Arraylist的存储与运用功能,以及其中的一些hashnext的遍历功能和考察分析实践能力,类的建立,方法的正确使用与返回值,一系列数据的处理,正则表达式的合理规范使用。
题目集9在题目集8的基础之上增加了一些细节,有了借记账户与贷记账户的区分,之前借记账户不支持透支取款与ATM机上的跨行操作,但是贷记账户支持这些情况,不过有透支取款额度的限制,并且这次借记账户开始支持跨行操作,这里开始出现取款数据的改变,可能会有额外的费用,一系列情况都需要学者较强的分析能力。考察java知识的综合能力和分析实际问题能力,复杂正则表达式的书写,类与类中继承关系的构建extends,实现功能的方法的正确分析,接口中抽象方法的构建,impiements实现接口的使用,类中实现抽象方法的正确步骤以及方法的重写与重载。
- 设计与分析
(1)题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
(2)题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
(1)题目集7(7-1)
掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书 2020-OO第07次作业-1指导书V1.0.pdf
首先接口的设计,定义求图形面积和数据检验的抽象方法,后面加入属性-图形名字和输出模式的to-string方法,圆形,矩形,三角形,梯形类的设计和其中求面积的方法以及是否形成这个图形的检验条件,具体求面积的方法需要math中一些已知数值,再加部分数学方法。
对于图形卡片的整体输出效果,特意增加一个cardlist类,将获得的数据中的特定数字对应特定的图形并创建该图形类,再获得输入的图形属性,构建该图形,然后再添加到cardlist数组当中。然后在main方法中创建一个list数组,将输入数据进行判断,如果小于0,大于4,输出错误,否则,添加到list中,然后用它来构建cardlist,通过调用类中的方法来达到输出效果。
当然还有一些辅助方法的运用,比如
判断数据是否合法
public boolean validate()//判断数据是否合法 { boolean t=true; for(Card card : cardList) { if(!card.getShape().validate()) { t=false; break; } } return t; }
得到面积的总和
public double getSum()//得到面积的总和 { double sum=0; for(Card card : cardList) { sum+=card.getShape().getArea(); } return sum; }
输出图形名字
public void cardSort()//输出图形名字 { TreeSet<Card> cardSort =new TreeSet<>(cardList); for(Card card : cardSort) { System.out.print(card.getShape()); } }
整体输出效果
public void show()//整体输出效果 { System.out.println("The original list:"); for(Card card : cardList) { System.out.print(card.getShape()); } System.out.println(); System.out.println("The sorted list:"); cardSort(); System.out.println(); System.out.printf("Sum of area:%.2f\n",getSum()); } }
具体源码如下所示:
import java.util.Arrays; import java.util.ArrayList; import java.util.Scanner; import java.util.TreeSet; abstract class Shape{ private String ShapeName; public Shape(){ } public Shape(String ShapeName) { this.ShapeName=ShapeName; } public String getShapeName() { return ShapeName; } public void setShapeName(String ShapeName) { this.ShapeName=ShapeName; } /*public double getArea() { return 0.0; } public boolean validate() { return true; }*/ public abstract double getArea(); public abstract boolean validate(); public String toString() { return getShapeName()+":"+String.format("%.2f ",getArea()); } } class Card implements Comparable<Card> { private Shape shape; public Card() { } public Card(Shape shape) { this.shape=shape; } public Shape getShape() { return shape; } public void setShape(Shape shape) { this.shape=shape; } @Override public int compareTo(Card card) { return -(int)(shape.getArea()-card.getShape().getArea()); } } class Circle extends Shape { private double Radius; public Circle() { } 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 Radius>0; } } class Rectangle extends Shape { private double Width; private double Length; public Rectangle() { } public Rectangle(double Width,double Length) { this.Length=Length; this.Width=Width; } 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; } @Override public double getArea() { return Width*Length; } @Override public boolean validate() { return Width>0&&Length>0; } } class Triangle extends Shape { private double a; private double b; private double c; public Triangle() { } public Triangle(double a,double b,double c) { this.a=a; this.b=b; this.c=c; } public double getA() { return a; } public void setA(double a) { this.a=a; } public double getB() { return b; } public void setB(double b) { this.b=b; } public double getC() { return c; } public void setC(double c) { this.c=c; } @Override public double getArea() { double d=(a+b+c)/2; return Math.sqrt(d*(d-a)*(d-b)*(d-c)); } @Override public boolean validate() { boolean t=true; if(!(a>0&&b>0&&c>0)) { t= false; } else { if(!(a+b>c&&a+c>b&&b+c>a)) { t=false; } } return t; //double[] arr=new double[3]; //arr[0]=a; //arr[1]=b; //arr[2]=c; //Arrays.sort(arr); //return arr[0]+arr[1]>arr[2]; } } class Traperzoid extends Shape{ private double topSide; private double bottomSide; private double height; Traperzoid(){ } Traperzoid(double topSide,double bottomSide,double height){ this.bottomSide=bottomSide; this.height=height; this.topSide=topSide; } public double getTopside() { return topSide; } public void setTopSide(double topSide) { this.topSide=topSide; } public double getBottomSide() { return bottomSide; } public void setBottomSide() { this.bottomSide=bottomSide; } public double getHeight() { return height; } public void setHeight() { this.height=height; } @Override public double getArea() { return (topSide+bottomSide)*height/2; } @Override public boolean validate() { return topSide>0&&bottomSide>0&&height>0; } } public class Main{ public static Scanner input=new Scanner(System.in); public static void main(String[] args){ ArrayList<Integer> list=new ArrayList<Integer>(); int n=input.nextInt(); while(n!=0) { if(n<0||n>4) { System.out.println("Wrong Format"); System.exit(0); } list.add(n); n=input.nextInt(); } CardList cardList=new CardList(list); if(!cardList.validate()) { System.out.println("Wrong Format"); System.exit(0); } cardList.show(); } } class CardList{ ArrayList<Card> cardList=new ArrayList<>(); public CardList() { } public CardList(ArrayList<Integer> card) { for(Integer integer: card) { switch (integer) { case 1: double radius=Main.input.nextDouble(); Circle circle=new Circle(radius); Card card1=new Card(circle); card1.getShape().setShapeName("Circle"); cardList.add(card1); break; case 2: double w=Main.input.nextDouble(); double l=Main.input.nextDouble(); Rectangle rectangle=new Rectangle(w,l); Card card2=new Card(rectangle); card2.getShape().setShapeName("Rectangle"); cardList.add(card2); break; case 3: double a=Main.input.nextDouble(); double b=Main.input.nextDouble(); double c=Main.input.nextDouble(); Triangle triangle=new Triangle(a,b,c); Card card3=new Card(triangle); card3.getShape().setShapeName("Triangle"); cardList.add(card3); break; case 4: double k=Main.input.nextDouble(); double y=Main.input.nextDouble(); double z=Main.input.nextDouble(); Traperzoid traperzoid=new Traperzoid(k,y,z); Card card4=new Card(traperzoid); card4.getShape().setShapeName("Trapezoid"); cardList.add(card4); break; } } } public boolean validate()//判断数据是否合法 { boolean t=true; for(Card card : cardList) { if(!card.getShape().validate()) { t=false; break; } } return t; } public double getSum()//得到面积的总和 { double sum=0; for(Card card : cardList) { sum+=card.getShape().getArea(); } return sum; } public void cardSort()//输出图形名字 { TreeSet<Card> cardSort =new TreeSet<>(cardList); for(Card card : cardSort) { System.out.print(card.getShape()); } } public void show()//整体输出效果 { System.out.println("The original list:"); for(Card card : cardList) { System.out.print(card.getShape()); } System.out.println(); System.out.println("The sorted list:"); cardSort(); System.out.println(); System.out.printf("Sum of area:%.2f\n",getSum()); } }
7-2
掌握类的继承、多态性使用方法以及接口的应用。 具体需求参考作业指导书。
输入格式:
- 在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:1 3 4 2 1 3 4 2 1 3 0
- 根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
- 如果图形数量非法(<=0)或图形属性值非法(数值<0以及三角形三边不能组成三角形),则输出Wrong Format。
- 如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
输出格式:
- 排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
- 输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
- 各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
- 各组中面积之和的最大值输出,格式为The max area:面积值。
第二次作业是建立在第一题的基础之上,各种图形类完全一致,不同的是输出结果发生了一些改变,第一个输出相比之前每个图形和面积加了一个中括号形成一个组,这也是比较容易改变的,第二个输出需要进行分组排序,按照圆形,矩形,三角形,梯形的顺序输出,这个改变我是在cardlist类再建立四个cardlist来分别对应圆形,矩形,三角形,梯形,当它们被构建时也存到相应的数组中,然后在输出中
TreeSet<Card> cardSort2 =new TreeSet<>(cardList2); for(Card card : cardSort2) { System.out.print(card.getShape()); }
一个个类似的写法对应输出即可,第三个输出需要在每个图形分组内根据面积大小再次进行排序,这个也只需要一个Array.sort方法即可,对于第四个输出不再是面积总和,而是各个图形分组中所有面积的总和再互相比较,得出最大面积之和再输出,这里需要在方法中建立一个数组,把图形分组中的面积之和依次添加到数组,然后在数组中找最大值进行输出即可。
当然还有一些辅助方法的运用,比如
判断数据是否合法
public boolean validate()//判断数据是否合法 { boolean t=true; for(Card card : cardList) { if(!card.getShape().validate()) { t=false; break; } } return t; }
得到面积之和最大值
public double getMaxArea()//得到面积之和最大值 { double max1=0; double max2=0; double max3=0; double max4=0; double max=0; double[] d=new double[4]; for(Card card : cardList1) { max1+=card.getShape().getArea(); } d[0]=max1; for(Card card : cardList2) { max2+=card.getShape().getArea(); } d[1]=max2; for(Card card : cardList3) { max3+=card.getShape().getArea(); } d[2]=max3; for(Card card : cardList4) { max4+=card.getShape().getArea(); } d[3]=max4; max=d[0]; for(int i=1;i<=3;i++) { if(max<d[i]) { max=d[i]; } } return max; }
输出图形分组名字
public void cardSort()//输出图形分组名字 { TreeSet<Card> cardSort1 =new TreeSet<>(cardList1); System.out.print("["); for(Card card : cardSort1) { System.out.print(card.getShape()); } System.out.print("]"); TreeSet<Card> cardSort2 =new TreeSet<>(cardList2); System.out.print("["); for(Card card : cardSort2) { System.out.print(card.getShape()); } System.out.print("]"); TreeSet<Card> cardSort3 =new TreeSet<>(cardList3); System.out.print("["); for(Card card : cardSort3) { System.out.print(card.getShape()); } System.out.print("]"); TreeSet<Card> cardSort4 =new TreeSet<>(cardList4); System.out.print("["); for(Card card : cardSort4) { System.out.print(card.getShape()); } System.out.print("]"); }
整体输出效果
public void show()//整体输出效果 { System.out.println("The original list:"); System.out.print("["); for(Card card : cardList) { System.out.print(card.getShape()); } System.out.println("]"); System.out.println("The Separated List:"); System.out.print("["); for(Card card : cardList1) { System.out.print(card.getShape()); } System.out.print("]"); System.out.print("["); for(Card card : cardList2) { System.out.print(card.getShape()); } System.out.print("]"); System.out.print("["); for(Card card : cardList3) { System.out.print(card.getShape()); } System.out.print("]"); System.out.print("["); for(Card card : cardList4) { System.out.print(card.getShape()); } System.out.print("]"); System.out.println(); System.out.println("The Separated sorted List:"); cardSort(); System.out.println(); System.out.printf("The max area:%.2f\n",getMaxArea()); } }
具体源码如下:
import java.util.Arrays; import java.util.ArrayList; import java.util.Scanner; import java.util.TreeSet; abstract class Shape{ private String ShapeName; public Shape(){ } public Shape(String ShapeName) { this.ShapeName=ShapeName; } public String getShapeName() { return ShapeName; } public void setShapeName(String ShapeName) { this.ShapeName=ShapeName; } /*public double getArea() { return 0.0; } public boolean validate() { return true; }*/ public abstract double getArea(); public abstract boolean validate(); public String toString() { return getShapeName()+":"+String.format("%.2f ",getArea()); } } class Card implements Comparable<Card> { private Shape shape; /*public Card() { }*/ public Card(Shape shape) { this.shape=shape; } public Shape getShape() { return shape; } public void setShape(Shape shape) { this.shape=shape; } @Override public int compareTo(Card card) { return -(int)(shape.getArea()-card.getShape().getArea()); } } class Circle extends Shape { private double Radius; public Circle() { } 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 Radius>0; } } class Rectangle extends Shape { private double Width; private double Length; public Rectangle() { } public Rectangle(double Width,double Length) { this.Length=Length; this.Width=Width; } 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; } @Override public double getArea() { return Width*Length; } @Override public boolean validate() { return Width>0&&Length>0; } } class Triangle extends Shape { private double a; private double b; private double c; public Triangle() { } public Triangle(double a,double b,double c) { this.a=a; this.b=b; this.c=c; } public double getA() { return a; } public void setA(double a) { this.a=a; } public double getB() { return b; } public void setB(double b) { this.b=b; } public double getC() { return c; } public void setC(double c) { this.c=c; } @Override public double getArea() { double d=(a+b+c)/2; return Math.sqrt(d*(d-a)*(d-b)*(d-c)); } @Override public boolean validate() { boolean t=true; if(!(a>0&&b>0&&c>0)) { t= false; } else { if(!(a+b>c&&a+c>b&&b+c>a)) { t=false; } } return t; } } class Traperzoid extends Shape{ private double topSide; private double bottomSide; private double height; Traperzoid(){ } Traperzoid(double topSide,double bottomSide,double height){ this.bottomSide=bottomSide; this.height=height; this.topSide=topSide; } @Override public double getArea() { return (topSide+bottomSide)*height/2; } @Override public boolean validate() { return topSide>0&&bottomSide>0&&height>0; } } public class Main{ public static Scanner input=new Scanner(System.in); public static void main(String[] args){ ArrayList<Integer> list=new ArrayList<Integer>(); int n=input.nextInt(); if(n==0) { System.out.print("Wrong Format"); System.exit(0); } while(n!=0) { if(n<0||n>4) { System.out.print("Wrong Format"); System.exit(0); } list.add(n); n=input.nextInt(); } CardList cardList=new CardList(list); if(!cardList.validate()) { System.out.println("Wrong Format"); System.exit(0); } cardList.show(); } } class CardList{ ArrayList<Card> cardList1=new ArrayList<>(); ArrayList<Card> cardList2=new ArrayList<>(); ArrayList<Card> cardList3=new ArrayList<>(); ArrayList<Card> cardList4=new ArrayList<>(); ArrayList<Card> cardList=new ArrayList<>(); public CardList() { } public CardList(ArrayList<Integer> card) { for(Integer integer: card) { switch (integer) { case 1: double radius=Main.input.nextDouble(); Circle circle=new Circle(radius); Card card1=new Card(circle); card1.getShape().setShapeName("Circle"); cardList1.add(card1); cardList.add(card1); break; case 2: double w=Main.input.nextDouble(); double l=Main.input.nextDouble(); Rectangle rectangle=new Rectangle(w,l); Card card2=new Card(rectangle); card2.getShape().setShapeName("Rectangle"); cardList2.add(card2); cardList.add(card2); break; case 3: double a=Main.input.nextDouble(); double b=Main.input.nextDouble(); double c=Main.input.nextDouble(); Triangle triangle=new Triangle(a,b,c); Card card3=new Card(triangle); card3.getShape().setShapeName("Triangle"); cardList3.add(card3); cardList.add(card3); break; case 4: double k=Main.input.nextDouble(); double y=Main.input.nextDouble(); double z=Main.input.nextDouble(); Traperzoid traperzoid=new Traperzoid(k,y,z); Card card4=new Card(traperzoid); card4.getShape().setShapeName("Trapezoid"); cardList4.add(card4); cardList.add(card4); break; } } } public boolean validate()//判断数据是否合法 { boolean t=true; for(Card card : cardList) { if(!card.getShape().validate()) { t=false; break; } } return t; } public double getMaxArea() { double max1=0; double max2=0; double max3=0; double max4=0; double max=0; double[] d=new double[4]; for(Card card : cardList1) { max1+=card.getShape().getArea(); } d[0]=max1; for(Card card : cardList2) { max2+=card.getShape().getArea(); } d[1]=max2; for(Card card : cardList3) { max3+=card.getShape().getArea(); } d[2]=max3; for(Card card : cardList4) { max4+=card.getShape().getArea(); } d[3]=max4; max=d[0]; for(int i=1;i<=3;i++) { if(max<d[i]) { max=d[i]; } } return max; } public void cardSort() { TreeSet<Card> cardSort1 =new TreeSet<>(cardList1); System.out.print("["); for(Card card : cardSort1) { System.out.print(card.getShape()); } System.out.print("]"); TreeSet<Card> cardSort2 =new TreeSet<>(cardList2); System.out.print("["); for(Card card : cardSort2) { System.out.print(card.getShape()); } System.out.print("]"); TreeSet<Card> cardSort3 =new TreeSet<>(cardList3); System.out.print("["); for(Card card : cardSort3) { System.out.print(card.getShape()); } System.out.print("]"); TreeSet<Card> cardSort4 =new TreeSet<>(cardList4); System.out.print("["); for(Card card : cardSort4) { System.out.print(card.getShape()); } System.out.print("]"); } public void show() { System.out.println("The original list:"); System.out.print("["); for(Card card : cardList) { System.out.print(card.getShape()); } System.out.println("]"); System.out.println("The Separated List:"); System.out.print("["); for(Card card : cardList1) { System.out.print(card.getShape()); } System.out.print("]"); System.out.print("["); for(Card card : cardList2) { System.out.print(card.getShape()); } System.out.print("]"); System.out.print("["); for(Card card : cardList3) { System.out.print(card.getShape()); } System.out.print("]"); System.out.print("["); for(Card card : cardList4) { System.out.print(card.getShape()); } System.out.print("]"); System.out.println(); System.out.println("The Separated sorted List:"); cardSort(); System.out.println(); System.out.printf("The max area:%.2f\n",getMaxArea()); } }
(1)题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题目集8 设计ATM仿真系统,具体要求参见作业说明。
这一道大题综合性很强,首先需要明确整个系统中各个类的组成与内在的的联系,银行,银行卡,账户,用户,ATM机这一些主类的正确建立,其次对于类中该有的属性做到具体的访问器与修改器,属性数据的类型(包括ArrayList数组类型或者其他类名的构建使用)需要注意分析。检验数据的输入是否合法,统一放入一个类withdraw中进行相应的输出,届时只要main中调用其中的方法即可,比如
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); }
由于每次取款或者存款之后需要进行账户中的余款更新余额,因为这里不支持透支取款操作,所以进行相减之后需要判断,直接定义一个getbalance类进行相应方法的实现。还有每个账户每次的操作都需要对应的用户姓名与所属银行和ATM机编号一起输出呈现,这里需要加入对应得到的类属性。
具体源码如下:
class ATM { private String ATMID; private Bank bank=null; public ATM() { super(); } public ATM(String aTMID,Bank bank) { super(); ATMID=aTMID; this.bank=bank; } public String getATMID() { return ATMID; } public void setATMID(String aTMID) { ATMID=aTMID; } public Bank getBank() { return bank; } public void setBank(Bank bank) { this.bank=bank; } } public class Bank { private String bankName; private String bankNo; private ArrayList<Account> accountList =new ArrayList<Account>();//账户列表 private ArrayList<ATM> ATMList =new ArrayList<ATM>();//atm机列表 public Bank() { super(); } public Bank(String bankName,String bankNo) { super(); this.bankName=bankName; this.bankNo=bankNo; } public String getBankName() { return bankName; } public void setBankName(String bankName) { this.bankName=bankName; } public String getBankNO() { return bankNo; } public void setBankNO(String bankNo) { this.bankNo=bankNo; } public void addAccount(Account account)//添加账户列表 { this.accountList.add(account); } public void removeAccount(Account account)//移除账户列表 { this.accountList.remove(account); } public void addATM(ATM aTM)//添加ATM机列表 { this.ATMList.add(aTM); } public void removeATM(ATM 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) { this.ATMList=aTMList; } } class Card { private String cardNO;//卡号 private String cardPassword;//密码 private Account account=null; public Card() { super(); } public Card(String cardNO,String cardPassword,Account account) { this.cardNO=cardNO; this.account=account; this.cardPassword=cardPassword; } 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 Account getAccount() { return account; } public void setAccount(Account account) { this.account=account; } 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 GetBalance { private UnionPay unionPay; public GetBalance() { super(); } public GetBalance(UnionPay unionPay) { super(); this.unionPay=unionPay; } public double getBalance(String cardNO) { return ValidateData.getCardByCardNO(unionPay,cardNO).getAccount().getBalance(); } } 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("张三丰","360101200102122325","13979352153"); User linghuchong = new User("令狐冲","360101200102122326","13361717281"); User qiaofeng = new User("乔峰","360101200102122327","18279396194"); User hongqigong = new User("洪七公","360101200102122328","13531216090"); 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 ccbAcc4 = new Account("3640000010045442002",10000.00,zhangsanfeng,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 icbcAcc6 = new Account("3640000010045441009",10000.00,linghuchong,icbc,"贷记账户"); Account abcAcc1 = new Account("3630000010033431001",10000.00,qiaofeng,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); qiaofeng.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.addCard1(ccbCard1); ccbAcc1.addCard1(ccbCard2); ccbAcc2.addCard1(ccbCard3); ccbAcc3.addCard1(ccbCard4); icbcAcc1.addCard1(icbcCard5); icbcAcc2.addCard1(icbcCard6); icbcAcc3.addCard1(icbcCard7); icbcAcc3.addCard1(icbcCard8); icbcAcc4.addCard1(icbcCard9); icbcAcc5.addCard1(icbcCard10); ccbAcc4.addCard1(ccbCard11); ccbAcc4.addCard1(ccbCard12); icbcAcc6.addCard1(icbcCard13); abcAcc1.addCard1(abcCard14); abcAcc2.addCard1(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 { Withdraw wd = new Withdraw(unionPay,dataLine[0],dataLine[1],dataLine[2],Double.parseDouble(dataLine[3])); wd.withdraw(); } } } } class UnionPay { private ArrayList<Bank> bankList=new ArrayList<Bank>(); public UnionPay() { super(); } public UnionPay(ArrayList<Bank> bankList) { super(); this.bankList=bankList; } public ArrayList<Bank> getBankList() { return bankList; } public void setBank(ArrayList<Bank> bankList) { this.bankList=bankList; } public void addBank(Bank bank) { this.bankList.add(bank); } public void removeBank(Bank bank) { this.bankList.remove(bank); } } class User{ private String name; private String ID; private String Phone; private ArrayList<Account> list =new ArrayList<Account>(); public User() { super(); } public User(String name,String iD,String phone) { this.ID=iD; this.name=name; this.Phone=phone; } public String getName() { return name; } public void setName(String name) { this.name=name; } public String getID() { return ID; } public void setID(String iD) { this.ID=iD; } public String getPhone() { return Phone; } public void setPhone(String phone) { this.Phone=phone; } public ArrayList<Account> getList() { return list; } public void setList(ArrayList<Account> list) { this.list=list; } public void addAccount(Account account) { this.list.add(account); } public void removeAccount(Account account) { this.list.remove(account); } } class ValidateData { 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().getList1(); Iterator<Card> cardItr =cardList.iterator(); while(cardItr.hasNext()) { card=cardItr.next(); if(card.getCardNO().equals(cardNO)) { return card; } } } } return null; } 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 Withdraw { private UnionPay unionPay; private String cardNO; private String cardPassword; private String ATMID; private double amount; public Withdraw() { super(); } 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 double getAmount() { return amount; } public void setAmount(double amount) { 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 = 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); } 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())); }} }
7-1(2)
设计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机仿真模拟系统的强大基础之上,可以说是上次的升级版,因为上次限制了借记账户,这次新增了贷记账户,此种账户可以支持透支取款功能,但也有手续费和最大限度额,此外还开放了跨行取款操作,也增加了手续费,每个银行对应不同的手续费,这些都是需要在取款计算时需要加入进去的。还有新增的几个用户信息,只需要在main中创建即可,主要是在withdraw类中加入一些新的情况与费用计算就可以了。
具体源码如下:
class ATM { private String ATMID; private Bank bank=null; public ATM() { super(); } public ATM(String aTMID,Bank bank) { super(); ATMID=aTMID; this.bank=bank; } public String getATMID() { return ATMID; } public void setATMID(String aTMID) { ATMID=aTMID; } public Bank getBank() { return bank; } public void setBank(Bank bank) { this.bank=bank; } } public class Bank { private String bankName; private String bankNo; private ArrayList<Account> accountList =new ArrayList<Account>();//账户列表 private ArrayList<ATM> ATMList =new ArrayList<ATM>();//atm机列表 public Bank() { super(); } public Bank(String bankName,String bankNo) { super(); this.bankName=bankName; this.bankNo=bankNo; } public String getBankName() { return bankName; } public void setBankName(String bankName) { this.bankName=bankName; } public String getBankNO() { return bankNo; } public void setBankNO(String bankNo) { this.bankNo=bankNo; } public void addAccount(Account account)//添加账户列表 { this.accountList.add(account); } public void removeAccount(Account account)//移除账户列表 { this.accountList.remove(account); } public void addATM(ATM aTM)//添加ATM机列表 { this.ATMList.add(aTM); } public void removeATM(ATM 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) { this.ATMList=aTMList; } } class Card { private String cardNO;//卡号 private String cardPassword;//密码 private Account account=null; public Card() { super(); } public Card(String cardNO,String cardPassword,Account account) { this.cardNO=cardNO; this.account=account; this.cardPassword=cardPassword; } 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 Account getAccount() { return account; } public void setAccount(Account account) { this.account=account; } 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 GetBalance { private UnionPay unionPay; public GetBalance() { super(); } public GetBalance(UnionPay unionPay) { super(); this.unionPay=unionPay; } public double getBalance(String cardNO) { return ValidateData.getCardByCardNO(unionPay,cardNO).getAccount().getBalance(); } } 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("张三丰","360101200102122325","13979352153"); User linghuchong = new User("令狐冲","360101200102122326","13361717281"); User qiaofeng = new User("乔峰","360101200102122327","18279396194"); User hongqigong = new User("洪七公","360101200102122328","13531216090"); 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 ccbAcc4 = new Account("3640000010045442002",10000.00,zhangsanfeng,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 icbcAcc6 = new Account("3640000010045441009",10000.00,linghuchong,icbc,"贷记账户"); Account abcAcc1 = new Account("3630000010033431001",10000.00,qiaofeng,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); qiaofeng.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.addCard1(ccbCard1); ccbAcc1.addCard1(ccbCard2); ccbAcc2.addCard1(ccbCard3); ccbAcc3.addCard1(ccbCard4); icbcAcc1.addCard1(icbcCard5); icbcAcc2.addCard1(icbcCard6); icbcAcc3.addCard1(icbcCard7); icbcAcc3.addCard1(icbcCard8); icbcAcc4.addCard1(icbcCard9); icbcAcc5.addCard1(icbcCard10); ccbAcc4.addCard1(ccbCard11); ccbAcc4.addCard1(ccbCard12); icbcAcc6.addCard1(icbcCard13); abcAcc1.addCard1(abcCard14); abcAcc2.addCard1(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 { Withdraw wd = new Withdraw(unionPay,dataLine[0],dataLine[1],dataLine[2],Double.parseDouble(dataLine[3])); wd.withdraw(); } } } } class UnionPay { private ArrayList<Bank> bankList=new ArrayList<Bank>(); public UnionPay() { super(); } public UnionPay(ArrayList<Bank> bankList) { super(); this.bankList=bankList; } public ArrayList<Bank> getBankList() { return bankList; } public void setBank(ArrayList<Bank> bankList) { this.bankList=bankList; } public void addBank(Bank bank) { this.bankList.add(bank); } public void removeBank(Bank bank) { this.bankList.remove(bank); } } class User{ private String name; private String ID; private String Phone; private ArrayList<Account> list =new ArrayList<Account>(); public User() { super(); } public User(String name,String iD,String phone) { this.ID=iD; this.name=name; this.Phone=phone; } public String getName() { return name; } public void setName(String name) { this.name=name; } public String getID() { return ID; } public void setID(String iD) { this.ID=iD; } public String getPhone() { return Phone; } public void setPhone(String phone) { this.Phone=phone; } public ArrayList<Account> getList() { return list; } public void setList(ArrayList<Account> list) { this.list=list; } public void addAccount(Account account) { this.list.add(account); } public void removeAccount(Account account) { this.list.remove(account); } } class ValidateData { 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().getList1(); Iterator<Card> cardItr =cardList.iterator(); while(cardItr.hasNext()) { card=cardItr.next(); if(card.getCardNO().equals(cardNO)) { return card; } } } } return null; } 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 Withdraw { private UnionPay unionPay; private String cardNO; private String cardPassword; private String ATMID; private double amount; public Withdraw() { super(); } 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 double getAmount() { return amount; } public void setAmount(double amount) { 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 = 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); } double t=0.00; if(cardNO.matches("^(66)\\d+")) { if(balance>0&&(amount>balance)) { double s=amount-balance; t=s*0.05; } else if(balance<=0&&(amount>balance)) { t=amount*0.05; } } //if ((amount>balance)&&(account.getAccountName().equals("借记账户"))) { //System.out.println("Sorry,your account balance is insufficient."); //System.exit(0); //} if (!account.getBank().getBankNO().equals(aTM.getBank().getBankNO())) { //System.out.println("Sorry,cross-bank withdrawal is not supported."); //System.exit(0); //Withdraw2 wd=new Withdraw2(); //wd.Withdraw(account,aTM,amount); if(aTM.getBank().getBankNO().equals("中国建设银行")) { t=t+amount*0.02; } if(aTM.getBank().getBankNO().equals("中国工商银行")) { t=t+amount*0.03; } if(aTM.getBank().getBankNO().equals("中国农业银行")) { t=t+amount*0.04; } } if(cardNO.matches("^(66)\\d+")) { if(balance-amount<-50000) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } } else { if(balance-amount<0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } if(balance-amount-t<0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } } account.setBalance(balance - amount-t);//取款更新余额操作 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(); ATM aTM=ValidateData.getATMByATMID(unionPay,ATMID); System.out.println("业务:"+" "+type+" "+userName + "在" +aTM.getBank().getBankNO() + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount)); System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance())); } }
- 踩坑心得
题目集7(7-1)
abstract class Shape{ private String ShapeName; public Shape(){ } public Shape(String ShapeName) { this.ShapeName=ShapeName; } public String getShapeName() { return ShapeName; } public void setShapeName(String ShapeName) { this.ShapeName=ShapeName; } /*public double getArea() { return 0.0; } public boolean validate() { return true; }*/ public abstract double getArea(); public abstract boolean validate(); public String toString() { return getShapeName()+":"+String.format("%.2f ",getArea()); } }
这里之前没有加入shapename属性,导致后面输出时一直没有图形名字的输出效果,尝试了在卡片类中添加,可是并不能输出,属性的确不适合,后来才在接口这里添加,测试后发现比较简便,会直接调用输出,to-string方法本来之前也没有,后面写的时候输出需要写好多遍,所以也放在接口这里简便一些。

(1)题目集7(7-2)
public double getMaxArea() { double max1=0; double max2=0; double max3=0; double max4=0; double max=0; double[] d=new double[4]; for(Card card : cardList1) { max1+=card.getShape().getArea(); } d[0]=max1; for(Card card : cardList2) { max2+=card.getShape().getArea(); } d[1]=max2; for(Card card : cardList3) { max3+=card.getShape().getArea(); } d[2]=max3; for(Card card : cardList4) { max4+=card.getShape().getArea(); } d[3]=max4; max=d[0]; for(int i=1;i<=3;i++) { if(max<d[i]) { max=d[i]; } } return max; }
这里在求圆形,矩形,三角形,梯形分组中求面积之和再比较得出最大值,一直没法把数据拿来运算,后来才想到在之前的switch中,每次图形的构建再存入一个数组中,然后再把这个数组拿来算其中的面积之和,赋予四个元素在新的数组中来比较大小,再返回就可以了。
(3)题目集8 设计ATM仿真系统,具体要求参见作业说明。
ATM aTM = ValidateData.getATMByATMID(unionPay, ATMID); if (aTM == null) { System.out.println("Sorry,the ATM's id is wrong."); System.exit(0); }
这里之前没有写ValidateData,导致报错,这个类就是专门检验ATM等等是否存在。

题目集9 设计ATM仿真系统,具体要求参见作业说明。
if(balance-amount<0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } if(balance-amount-t<0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } }
之前没有写这个
if(balance-amount-t<0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); }

导致借记卡跨行去全部余额报错,t+amount是跨行手续费和取款的总和,如果借记卡余额减去它们小于0也要错误输出。

- 改进建议
银行ATM机类结构设计难度相对基础不好的学者太大,希望可以简化步骤,或者为了体现实际功能应该再加入一些功能,比如转账。
- 总结
通过这三次题目集的认识训练,我终于接触和摸清了java中神奇的三大特点——继承,多态,类。了解了类的一般无参构建方法以及特殊的有参构建方法,和具体在什么情况下使用,继承关系的正确使用,继承对象及方法的操作,接口抽象方法的调用,多态使用的方便与多性能特点,一系列算法的认识,面对复杂问题时设计的算天数等等的简便巧妙方法,虽然知道自己还有很多不足,但我仍然会继续学习,向其他优秀者学习,争取弥补自己的一些缺点,认清问题所在,不断的完善自己。 面向对象的编程思想不是一朝一夕能实现的,需要不断的动手尝试,阅读高质量的优秀代码,才能不断的提升。希望与我有同样问题的同学能再接再励,利用这次写博客的时间好好反思,好好整理心情。

浙公网安备 33010602011771号