blog第三次作业
一.前言
1.三次题目集中所考察的知识点:
(1)掌握类的继承、多态性使用方法以及接口的应用
2.三次题目集中题量、难度等情况
题目集七、八、九 的题量都不多,但是题目的难度均大大提高了,不能够轻易解决。
二.设计与分析
①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
7-1
输入格式:
1.首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
2.然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:1.排序前的各图形类型及面积,格式为图形名称
1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
2.排序后的各图形类型及面积,格式同排序前的输出;
3.所有图形的面积总和,格式为Sum of area:总面积值。

(1)题目中Circle类、Rectangle类、Trapezoid类、Triangle类继承父类Shape类,Card类聚合Shape类,DealCard List类聚合Card类,Card类实现接口Comparable。
(2)在图形类的设计中,体会面向对象设计原则中的“开-闭”原则的实现方法及其作用,思 考假如游戏中再增加一种图形,本次设计是否能实现“开-闭”原则。
(3)考虑类结构如何完善才能使得系统具有较好的可复用性。
以下为题目代码:
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { //在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接 //使用Main.input.next…即可(避免采坑) public static Scanner input = new Scanner(System.in); public static void main(String[] args){ ArrayList<Integer> list = new ArrayList<Integer>(); int num = input.nextInt(); 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> List = new ArrayList<Card>(); DealCardList(){ } DealCardList(ArrayList<Integer> list){ Scanner in=new Scanner(System.in); for(int i=0;i<list.size();i++){ if(list.get(i)==0){ break; } int x=list.get(i); switch (x){ case 1: double r=Main.input.nextDouble(); Circle circle =new Circle(r); circle.setShapeName("Circle:"); Card card1=new Card(circle); List.add(card1); break; case 2: double width=Main.input.nextDouble(); double length=Main.input.nextDouble(); Rectangle rectangle =new Rectangle(width,length); rectangle.setShapeName("Rectangle:"); Card card2=new Card(rectangle); List.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); triangle.setShapeName("Triangle:"); Card card3=new Card(triangle); List.add(card3); break; case 4: double l=Main.input.nextDouble(); double d=Main.input.nextDouble(); double h=Main.input.nextDouble(); Trapezoid trapezoid =new Trapezoid(l,d,h); trapezoid.setShapeName("Trapezoid:"); Card card4=new Card(trapezoid); List.add(card4); break; } } } public void showResult(){ System.out.println("The original list:"); for (int i=0;i<List.size();i++) { System.out.print(List.get(i).getShape().getShapeName()); System.out.printf("%.2f ",List.get(i).getShape().getArea()); } System.out.println(); Collections.sort(List); System.out.println("The sorted list:"); for (int i=List.size()-1;i>=0;i--) { System.out.print(List.get(i).getShape().getShapeName()); System.out.printf("%.2f ",List.get(i).getShape().getArea()); } System.out.println(); System.out.printf("Sum of area:%.2f\n",getAllArea(List)); } public double getAllArea(ArrayList<Card> list) { double sum=0; for(int i=0;i<list.size();i++){ sum+=list.get(i).getShape().getArea(); } return sum; } public boolean validate() { for(int i=0;i<List.size();i++) { if(List.get(i).getShape().validate()==false) return false; } return true; } } class Card implements Comparable<Card>{ Shape shape; Card(){ } void setShape(Shape shape) { this.shape=shape; } Card(Shape shape){ this.shape=shape; } Shape getShape(){ return shape; } public int compareTo(Card card) { return (int)(shape.getArea()-card.getShape().getArea()); } } class Shape { String shapeName; Shape() { } Shape(String shapeName) { this.shapeName = shapeName; } String getShapeName() { return shapeName; } void setShapeName(String shapeName) { this.shapeName = shapeName; } double getArea() { return 0; } boolean validate() { return false; } } class Circle extends Shape{ double radius; Circle(){} Circle(double radius){ this.radius = radius; } public double getArea(){ double s=Math.PI*radius*radius; return s; } public boolean validate() { if(radius<0) return false; else return true; } } class Rectangle extends Shape{ double length; double width; Rectangle(){} Rectangle(double length,double width){ this.length = length; this.width = width; } public double getArea(){ double s=length*width; return s; } public boolean validate() { if(length<0||width<0) return false; else return true; } } class Triangle extends Shape{ double a; double b; double c; Triangle(){} Triangle(double a,double b,double c){ this.a=a; this.b=b; this.c=c; } public double getArea(){ double p=(a+b+c)/2; double s=Math.sqrt(p*(p-a)*(p-b)*(p-c)); return s; } public boolean validate() { if(a>=0&&b>=0&&c>=0&&a+b>c&&b+c>a&&a+c>b) return true; else return false; } } class Trapezoid extends Shape{ double d; double l; double h; Trapezoid(){} Trapezoid(double d,double l,double h){ this.d=d; this.l=l; this.h=h; } public double getArea(){ double s=(d+l)*h/2; return s; } public boolean validate() { if(d<0||l<0||h<0) return false; else return true; } }
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:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
2.输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、 Trapezoid”的顺序依次输出;
3.各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
4.各组中面积之和的最大值输出,格式为The max area:面积值。
以下为实验代码:
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { //在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接 //使用Main.input.next…即可(避免采坑) public static Scanner input = new Scanner(System.in); public static void main(String[] args){ ArrayList<Integer> list = new ArrayList<Integer>(); int num = input.nextInt(); 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> List = new ArrayList<Card>(); ArrayList<Card> circleList = new ArrayList<Card>(); ArrayList<Card> rectangleList = new ArrayList<Card>(); ArrayList<Card> triangleList = new ArrayList<Card>(); ArrayList<Card> trapezoidList = new ArrayList<Card>(); DealCardList(){ } DealCardList(ArrayList<Integer> list){ Scanner in=new Scanner(System.in); for(int i=0;i<list.size();i++){ if(list.get(i)==0){ break; } int x=list.get(i); switch (x){ case 1: double r=Main.input.nextDouble(); Circle circle =new Circle(r); circle.setShapeName("Circle:"); Card card1=new Card(circle); List.add(card1); circleList.add(card1); break; case 2: double width=Main.input.nextDouble(); double length=Main.input.nextDouble(); Rectangle rectangle =new Rectangle(width,length); rectangle.setShapeName("Rectangle:"); Card card2=new Card(rectangle); List.add(card2); rectangleList.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); triangle.setShapeName("Triangle:"); Card card3=new Card(triangle); List.add(card3); triangleList.add(card3); break; case 4: double l=Main.input.nextDouble(); double d=Main.input.nextDouble(); double h=Main.input.nextDouble(); Trapezoid trapezoid =new Trapezoid(l,d,h); trapezoid.setShapeName("Trapezoid:"); Card card4=new Card(trapezoid); List.add(card4); trapezoidList.add(card4); break; } } } public void showResult(){ System.out.println("The original list:"); System.out.print("["); for (int i=0;i<List.size();i++) { System.out.print(List.get(i).getShape().getShapeName()); System.out.printf("%.2f ",List.get(i).getShape().getArea()); } System.out.print("]"); System.out.println(); System.out.println("The Separated List:"); System.out.print("["); for (int i=0;i<circleList.size();i++) { System.out.print(circleList.get(i).getShape().getShapeName()); System.out.printf("%.2f ",circleList.get(i).getShape().getArea()); } System.out.print("]["); for (int i=0;i<rectangleList.size();i++) { System.out.print(rectangleList.get(i).getShape().getShapeName()); System.out.printf("%.2f ",rectangleList.get(i).getShape().getArea()); } System.out.print("]["); for (int i=0;i<triangleList.size();i++) { System.out.print(triangleList.get(i).getShape().getShapeName()); System.out.printf("%.2f ",triangleList.get(i).getShape().getArea()); } System.out.print("]["); for (int i=0;i<trapezoidList.size();i++) { System.out.print(trapezoidList.get(i).getShape().getShapeName()); System.out.printf("%.2f ",trapezoidList.get(i).getShape().getArea()); } System.out.print("]"); Collections.sort(circleList); Collections.sort(rectangleList); Collections.sort(triangleList); Collections.sort(trapezoidList); System.out.println(); System.out.println("The Separated sorted List:"); System.out.print("["); double[] num=new double[4]; num[0]=getAllArea(circleList); num[1]=getAllArea(rectangleList); num[2]=getAllArea(triangleList); num[3]=getAllArea(trapezoidList); for (int i=circleList.size()-1;i>=0;i--) { System.out.print(circleList.get(i).getShape().getShapeName()); System.out.printf("%.2f ",circleList.get(i).getShape().getArea()); } System.out.print("]["); for (int i=rectangleList.size()-1;i>=0;i--) { System.out.print(rectangleList.get(i).getShape().getShapeName()); System.out.printf("%.2f ",rectangleList.get(i).getShape().getArea()); } System.out.print("]["); for (int i=triangleList.size()-1;i>=0;i--) { System.out.print(triangleList.get(i).getShape().getShapeName()); System.out.printf("%.2f ",triangleList.get(i).getShape().getArea()); } System.out.print("]["); for (int i=trapezoidList.size()-1;i>=0;i--) { System.out.print(trapezoidList.get(i).getShape().getShapeName()); System.out.printf("%.2f ",trapezoidList.get(i).getShape().getArea()); } System.out.print("]"); System.out.println(); System.out.printf("The max area:%.2f\n",getMaxArea(num)); } public double getAllArea(ArrayList<Card> list) { double sum=0; for(int i=0;i<list.size();i++){ sum+=list.get(i).getShape().getArea(); } return sum; } public double getMaxArea(double a[]) { double max=0; for(int i=0;i<a.length;i++){ if(max<a[i]) max=a[i]; } return max; } public boolean validate() { for(int i=0;i<List.size();i++) { if(List.get(i).getShape().validate()==false) return false; } return true; } } class Card implements Comparable<Card>{ Shape shape; Card(){ } void setShape(Shape shape) { this.shape=shape; } Card(Shape shape){ this.shape=shape; } Shape getShape(){ return shape; } public int compareTo(Card card) { return (int)(shape.getArea()-card.getShape().getArea()); } } class Shape { String shapeName; Shape() { } Shape(String shapeName) { this.shapeName = shapeName; } String getShapeName() { return shapeName; } void setShapeName(String shapeName) { this.shapeName = shapeName; } double getArea() { return 0; } boolean validate() { return false; } } class Circle extends Shape{ double radius; Circle(){} Circle(double radius){ this.radius = radius; } public double getArea(){ double s=Math.PI*radius*radius; return s; } public boolean validate() { if(radius<0) return false; else return true; } } class Rectangle extends Shape{ double length; double width; Rectangle(){} Rectangle(double length,double width){ this.length = length; this.width = width; } public double getArea(){ double s=length*width; return s; } public boolean validate() { if(length<0||width<0) return false; else return true; } } class Triangle extends Shape{ double a; double b; double c; Triangle(){} Triangle(double a,double b,double c){ this.a=a; this.b=b; this.c=c; } public double getArea(){ double p=(a+b+c)/2; double s=Math.sqrt(p*(p-a)*(p-b)*(p-c)); return s; } public boolean validate() { if(a>=0&&b>=0&&c>=0&&a+b>c&&b+c>a&&a+c>b) return true; else return false; } } class Trapezoid extends Shape{ double d; double l; double h; Trapezoid(){} Trapezoid(double d,double l,double h){ this.d=d; this.l=l; this.h=h; } public double getArea(){ double s=(d+l)*h/2; return s; } public boolean validate() { if(d<0||l<0||h<0) return false; else return true; } }
题目集7-2和题目集7-1中的类的设计大致类似,功能也大致相同,只不过7-1中功能较为简单,而7-2的功能在7-1上深化了而已。7-1中只要求计算输入数据组成的图形的面积并进行从小到大的排序,而7-2则要求对输入数据组成的数据进行组合,相同的图形为一组,然后对每个组中的数据进行排序,区别并不是很大,7-1中使用了一个ArrayList储存数据,而7-2中则是将每个图形都创建一个ArrayList进行储存,再分别进行操作。
从7-1到7-2,代码要求实现的功能由简单到复杂,但总体来说,都是在原有代码上进行修改,使代码的功能更加多样,只要实现了代码的基本功能,再做修改就并不困难。
②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
8-1
输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
-
存款、取款功能输入数据格式:
卡号 密码 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","涓浗宸ュ晢閾惰"); unionPay.addBank(ccb); unionPay.addBank(icbc); 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); ccb.addATM(aTM1); ccb.addATM(aTM2); ccb.addATM(aTM3); ccb.addATM(aTM4); icbc.addATM(aTM5); icbc.addATM(aTM6); User Yangguo = new User("360101200102122324","鏉ㄨ繃","13856223254"); User Guojing = new User("360101200012302552","閮潠","13800021124"); User Zhangwuji = new User("360502199805163221","寮犳棤蹇�","13952110011"); User Weixiaobao = new User("360201200513243326","闊﹀皬瀹�","13025996587"); 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); ccb.addAccount(ccbAcc1); ccb.addAccount(ccbAcc2); ccb.addAccount(ccbAcc3); icbc.addAccount(icbcAcc1); icbc.addAccount(icbcAcc2); icbc.addAccount(icbcAcc3); icbc.addAccount(icbcAcc4); icbc.addAccount(icbcAcc5); Yangguo.addAccount(ccbAcc1); Yangguo.addAccount(ccbAcc2); Guojing.addAccount(ccbAcc3); Zhangwuji.addAccount(icbcAcc1); Zhangwuji.addAccount(icbcAcc2); Zhangwuji.addAccount(icbcAcc3); Weixiaobao.addAccount(icbcAcc4); Weixiaobao.addAccount(icbcAcc5); 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); 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); 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 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); } } 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 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; 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 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().getList(); 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 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(); } }
题目集八我的功能未按照老师的要求完全实现,此为老师的代码。
9-1
输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
-
取款功能输入数据格式:
卡号 密码 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 bank1 = new Bank("1001","中国建设银行",0.02); Bank bank2 = new Bank("1002","中国工商银行",0.03); Bank bank3 = new Bank("1003","中国农业银行",0.04); unionPay.addBank(bank1); unionPay.addBank(bank2); unionPay.addBank(bank3); ATM aTM1 = new ATM("01",bank1); ATM aTM2 = new ATM("02",bank1); ATM aTM3 = new ATM("03",bank1); ATM aTM4 = new ATM("04",bank1); ATM aTM5 = new ATM("05",bank2); ATM aTM6 = new ATM("06",bank2); ATM aTM7 = new ATM("07",bank3); ATM aTM8 = new ATM("08",bank3); ATM aTM9 = new ATM("09",bank3); ATM aTM10 = new ATM("10",bank3); ATM aTM11 = new ATM("11",bank3); bank1.addATM(aTM1); bank1.addATM(aTM2); bank1.addATM(aTM3); bank1.addATM(aTM4); bank2.addATM(aTM5); bank2.addATM(aTM6); bank3.addATM(aTM7); bank3.addATM(aTM8); bank3.addATM(aTM9); bank3.addATM(aTM10); bank3.addATM(aTM11); User Yangguo = new User("杨过"); User Guojing = new User("郭靖"); User Zhangwuji = new User("张无忌"); User Weixiaobao = new User("韦小宝"); User Zhangsanfeng = new User("张三丰"); User Linghuchong = new User("令狐冲"); User Qiaofeng = new User("乔峰"); User Hongqigong = new User("洪七公"); Account bank1Acc1 = new Account("3217000010041315709",10000.00,Yangguo,bank1,"1"); Account bank1Acc2 = new Account("3217000010041315715",10000.00,Yangguo,bank1,"1"); Account bank1Acc3 = new Account("3217000010051320007",10000.00,Guojing,bank1,"1"); Account bank2Acc1 = new Account("3222081502001312389",10000.00,Zhangwuji,bank2,"1"); Account bank2Acc2 = new Account("3222081502001312390",10000.00,Zhangwuji,bank2,"1"); Account bank2Acc3 = new Account("3222081502001312399",10000.00,Zhangwuji,bank2,"1"); Account bank2Acc4 = new Account("3222081502051320785",10000.00,Weixiaobao,bank2,"1"); Account bank2Acc5 = new Account("3222081502051320786",10000.00,Weixiaobao,bank2,"1"); Account bank1Acc4 = new Account("3640000010045442002",10000.00,Zhangsanfeng,bank1,"0"); Account bank2Acc6 = new Account("3640000010045441009",10000.00,Linghuchong,bank2,"0"); Account bank3Acc1 = new Account("3630000010033431001",10000.00,Qiaofeng,bank3,"0"); Account bank3Acc2 = new Account("3630000010033431008",10000.00,Hongqigong,bank3,"0"); bank1.addAccount(bank1Acc1); bank1.addAccount(bank1Acc2); bank1.addAccount(bank1Acc3); bank2.addAccount(bank2Acc1); bank2.addAccount(bank2Acc2); bank2.addAccount(bank2Acc3); bank2.addAccount(bank2Acc4); bank2.addAccount(bank2Acc5); bank1.addAccount(bank1Acc4); bank2.addAccount(bank2Acc6); bank3.addAccount(bank3Acc1); bank3.addAccount(bank3Acc2); Yangguo.addAccount(bank1Acc1); Yangguo.addAccount(bank1Acc2); Guojing.addAccount(bank1Acc3); Zhangwuji.addAccount(bank2Acc1); Zhangwuji.addAccount(bank2Acc2); Zhangwuji.addAccount(bank2Acc3); Weixiaobao.addAccount(bank2Acc4); Weixiaobao.addAccount(bank2Acc5); Zhangsanfeng.addAccount(bank1Acc4); Linghuchong.addAccount(bank2Acc6); Qiaofeng.addAccount(bank3Acc1); Hongqigong.addAccount(bank3Acc2); Card bank1Card1 = new Card("6217000010041315709","88888888",bank1Acc1); Card bank1Card2 = new Card("6217000010041315715","88888888",bank1Acc1); Card bank1Card3 = new Card("6217000010041315718","88888888",bank1Acc2); Card bank1Card4 = new Card("6217000010051320007","88888888",bank1Acc3); Card bank2Card5 = new Card("6222081502001312389","88888888",bank2Acc1); Card bank2Card6 = new Card("6222081502001312390","88888888",bank2Acc2); Card bank2Card7 = new Card("6222081502001312399","88888888",bank2Acc3); Card bank2Card8 = new Card("6222081502001312400","88888888",bank2Acc3); Card bank2Card9 = new Card("6222081502051320785","88888888",bank2Acc4); Card bank2Card10 = new Card("6222081502051320786","88888888",bank2Acc5); Card bank1Card11 = new Card("6640000010045442002","88888888",bank1Acc4); Card bank1Card12 = new Card("6640000010045442003","88888888",bank1Acc4); Card bank2Card13 = new Card("6640000010045441009","88888888",bank2Acc6); Card bank3Card14 = new Card("6630000010033431001","88888888",bank3Acc1); Card bank3Card15 = new Card("6630000010033431008","88888888",bank3Acc2); bank1Acc1.addCard(bank1Card1); bank1Acc1.addCard(bank1Card2); bank1Acc2.addCard(bank1Card3); bank1Acc3.addCard(bank1Card4); bank2Acc1.addCard(bank2Card5); bank2Acc2.addCard(bank2Card6); bank2Acc3.addCard(bank2Card7); bank2Acc3.addCard(bank2Card8); bank2Acc4.addCard(bank2Card9); bank2Acc5.addCard(bank2Card10); bank1Acc4.addCard(bank1Card11); bank1Acc4.addCard(bank1Card12); bank2Acc6.addCard(bank2Card13); bank3Acc1.addCard(bank3Card14); bank3Acc2.addCard(bank3Card15); 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 Bank { String bankNO; String bankName; double interest; ArrayList<Account> accountList = new ArrayList<Account>(); ArrayList<ATM> ATMList = new ArrayList<ATM>(); public Bank() { super(); // TODO Auto-generated constructor stub } public Bank(String bankNO, String bankName,double interest) { super(); this.bankNO = bankNO; this.bankName = bankName; this.interest = interest; } 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 { String name; ArrayList<Account> list = new ArrayList<Account>(); public User() { super(); // TODO Auto-generated constructor stub } public User(String name) { super(); this.name = name; } 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 Account { String accountNO; String Accounttype; double balance = 0; User user = null; Bank bank = null; 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,String Accounttype) { super(); this.accountNO = accountNO; this.balance = balance; this.user = user; this.bank = bank; this.Accounttype = Accounttype; } public void addCard(Card card) { list.add(card); } public void removeCard(Card card) { list.remove(card); } 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.cardNO.equals(cardNO)) { return card.getAccount(); } } return null; } public void setBalance(double d) { this.balance = d; } } class Card { String cardNO; String cardPassword; 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 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 { String ATMID; 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; 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 = 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.balance; if(!card.getCardPassword().equals(cardPassword)) { System.out.println("Sorry,your password is wrong."); System.exit(0); } if (amount > balance) { if(account.Accounttype=="1") { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } if(account.Accounttype=="0"&&amount>balance+50000) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } } if(account.getBank().getBankName()!=aTM.getBank().getBankName()) { if(account.Accounttype=="1"&&(balance-amount - amount*aTM.getBank().interest )<=0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } else if(account.Accounttype=="0"&&(balance-amount)<=0) { if(balance<=0) account.setBalance(balance - amount - amount*aTM.getBank().interest -amount*0.05); else account.setBalance(balance - amount - amount*aTM.getBank().interest + (balance-amount)*0.05); } else account.setBalance(balance - amount - amount*aTM.getBank().interest); } if(account.getBank().getBankName()==aTM.getBank().getBankName()) { if(account.Accounttype=="0"&&(balance-amount)<=0) { if(balance<=0) account.setBalance(balance - amount - amount*0.05); else account.setBalance(balance - amount + (balance-amount)*0.05); } else account.setBalance(balance - amount); } if(amount >= 0) { showResult(account,aTM,1); }else { showResult(account,aTM,0); } } public void showResult(Account account,ATM aTM,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.balance)); } } 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().getList(); Iterator<Card> cardItr = cardList.iterator(); while(cardItr.hasNext()) { card = cardItr.next(); if(card.cardNO.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 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().balance; } }
实验9-1与实验8-1类的设计相似,只不过功能实现的更多。
(1)注意本题目中的各实体类之间的关系,尤其是一对多的组合关系。
(2)对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。
(3)在“合成复用原则”及“单一职责原则”基础上,尽量对上次作业的程 序进行重构,使之符合 “开-闭”原则。
(3)采坑心得
1.没有注意编程时符号的错误,导致很多次的编译错误,不够细心,总是忘记输入“,”或者将其输成中文符号,导致编译错误;
2.static是创建静态方法,没有注意到静态方法中不能够调用非静态方法,导致编译出错;
3.不能够在一个类中对另一个类中的属性进行直接调用,特别是在封装的情况下。
(4)改进建议


浙公网安备 33010602011771号