题目集7~9的总结性Blog
一、前言
这三次的PTA题目集总的来说难度属于中等偏难水平,因为要构造的整体比较大,构思有点困难。因为后面两道题目的细节比较多,题目阅读并且把握所有的要点还是有点困难的。理解抽象类与子类的关系,实现继承操作,构造类族;正确使用抽象类和子类实现多态操作;理解接口的意义,并实现行为的多态;理解了解抽象类、类以及接口三者的异同以及使用场合。这些优点也在最后一次题目集上体现了,减少代码冗余,将具有共同行为的代码提取出来,封装为父类,由子类继承父类,减少代码的臃肿,方便后期修改。帮助Java语言实现一个类似于多继承的功能.但是实现的多继承功能不会使代码中的类之间出现网状关系,而是比较清楚的树状关系,ATM的题目较为倾向于设计,考察对于面向对象编程设计的理解。
二、设计与分析
1、 题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
7-1 图形卡片排序游戏 (40 分)
掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书 2020-OO第07次作业-1指导书V1.0.pdf
输入格式:
首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
排序后的各图形类型及面积,格式同排序前的输出;
所有图形的面积总和,格式为Sum of area:总面积值。
类图和SourceMonitor的生成报表


题目思路
这道题目的思路不会很难,对于生成的类图里面也很清晰的涵盖了每个图形的自己的方法和属性,对于继承来说,解决这道题目是很好的方法。子类具有父类所有非private的属性,方法;子类可以拥有自己的属性和方法,即子类对父类的拓展子类可以用自己的方式实现父类的方法(即子类重写父类方法);提高的类的耦合性(继承缺点:耦合性越高,代码的独立性越差。)
代码
import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;
abstract class Shape {
public Shape() {
}
abstract public double getArea();
abstract public boolean validate();
abstract public String getShapeName();
@Override
public String toString() {
return getShapeName() + ":" + String.format("%.2f ", getArea());
}
}
class Circle extends Shape {
private double radius;
Circle(double radius) {
this.radius = radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public boolean validate() {
return radius > 0;
}
@Override
public String getShapeName() {
return "Circle";
}
}
class Rectangle extends Shape {
private double width;
private double length;
Rectangle(double width, double length) {
this.width = width;
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getArea() {
return width * length;
}
public boolean validate() {
return length > 0 && width > 0;
}
@Override
public String getShapeName() {
return "Rectangle";
}
}
class Triangle extends Shape {
private double side1;
private double side2;
private double side3;
public boolean validate() {
return side3 + side2 > side1 && side2 + side1 > side3 & side1 + side3 > side2;
}
public double getArea() {
double p = (side1 + side2 + side3) / 2;
return Math.sqrt(p * (p - side1) * (p - side2) * (p - side3));
}
Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public double getSide1() {
return side1;
}
public double getSide2() {
return side2;
}
public double getSide3() {
return side3;
}
public void setSide1(double side1) {
this.side1 = side1;
}
public void setSide2(double side2) {
this.side2 = side2;
}
public void setSide3(double side3) {
this.side3 = side3;
}
@Override
public String getShapeName() {
return "Triangle";
}
}
class Trapezoid extends Shape {
private double high;
private double width1;
private double width2;
Trapezoid(double width1, double width2, double high) {
this.width1 = width1;
this.width2 = width2;
this.high = high;
}
public double getWidth1() {
return width1;
}
public double getHigh() {
return high;
}
public double getWidth2() {
return width2;
}
public void setHigh(double high) {
this.high = high;
}
public void setWidth1(double width1) {
this.width1 = width1;
}
public void setWidth2(double width2) {
this.width2 = width2;
}
@Override
public String getShapeName() {
return "Trapezoid";
}
@Override
public double getArea() {
return (width1 + width2) * high / 2;
}
@Override
public boolean validate() {
return width2 > 0 && width1 > 0 && high > 0;
}
}
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());
}
}
public class homework_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> shapeId = new ArrayList<>();
int i = scanner.nextInt();
while (i != 0) {
if (i < 0 || i > 4) {
System.out.println("Wrong Format");
System.exit(0);
}
shapeId.add(i);
i = scanner.nextInt();
}
ArrayList<Card> cardArrayList=new ArrayList<>();
for (int k : shapeId) {
switch (k) {
case 1:
Circle circle = new Circle(scanner.nextDouble());
if (!circle.validate()) {
System.out.println("Wrong Format");
System.exit(0);
}
else {
cardArrayList.add(new Card(circle));
}
break;
case 2:
Rectangle rectangle = new Rectangle(scanner.nextDouble(), scanner.nextDouble());
if (!rectangle.validate()) {
System.out.println("Wrong Format");
System.exit(0);
}
else {
cardArrayList.add(new Card(rectangle));
}
break;
case 3:
Triangle triangle = new Triangle(scanner.nextDouble(), scanner.nextDouble(), scanner.nextDouble());
if (!triangle.validate()) {
System.out.println("Wrong Format");
System.exit(0);
}
else {
cardArrayList.add(new Card(triangle));
}
break;
case 4:
Trapezoid trapezoid = new Trapezoid(scanner.nextDouble(), scanner.nextDouble(), scanner.nextDouble());
if(!trapezoid.validate())
{
System.out.println("Wrong Format");
System.exit(0);
}
else {
cardArrayList.add(new Card(trapezoid));
}
break;
}
}
double sum=0;
for (Card card:cardArrayList)
sum+=card.getShape().getArea();
System.out.println("The original list:");
for (Card card : cardArrayList) {
System.out.print(card.getShape());
}
System.out.println();
System.out.println("The sorted list:");
TreeSet<Card> cardTreeSet=new TreeSet<>(cardArrayList);
for (Card card : cardTreeSet) {
System.out.print(card.getShape());
}
System.out.println();
System.out.printf("Sum of area:%.2f\n",sum);
}
}
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图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
各组中面积之和的最大值输出,格式为The max area:面积值。
类图和SourceMonitor的生成报表


题目思路
通过类图可以看到和上题差不多,不过为了输出方便我多加上了一个print类,为每个图形都开一个ArrayList去存储,方便输出时的排序和分组处理。
代码
package pta_7_2;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;
abstract class Shape {
public Shape() {
}
abstract public double getArea();
abstract public boolean validate();
abstract public String getShapeName();
@Override
public String toString() {
return getShapeName() + ":" + String.format("%.2f ", getArea());
}
}
class Circle extends Shape {
private double radius;
Circle(double radius) {
this.radius = radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public boolean validate() {
return radius > 0;
}
@Override
public String getShapeName() {
return "Circle";
}
}
class Rectangle extends Shape {
private double width;
private double length;
Rectangle(double width, double length) {
this.width = width;
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getArea() {
return width * length;
}
public boolean validate() {
return length > 0 && width > 0;
}
@Override
public String getShapeName() {
return "Rectangle";
}
}
class Triangle extends Shape {
private double side1;
private double side2;
private double side3;
public boolean validate() {
return side3 + side2 > side1 && side2 + side1 > side3 & side1 + side3 > side2;
}
public double getArea() {
double p = (side1 + side2 + side3) / 2;
return Math.sqrt(p * (p - side1) * (p - side2) * (p - side3));
}
Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public double getSide1() {
return side1;
}
public double getSide2() {
return side2;
}
public double getSide3() {
return side3;
}
public void setSide1(double side1) {
this.side1 = side1;
}
public void setSide2(double side2) {
this.side2 = side2;
}
public void setSide3(double side3) {
this.side3 = side3;
}
@Override
public String getShapeName() {
return "Triangle";
}
}
class Trapezoid extends Shape {
private double high;
private double width1;
private double width2;
Trapezoid(double width1, double width2, double high) {
this.width1 = width1;
this.width2 = width2;
this.high = high;
}
public double getWidth1() {
return width1;
}
public double getHigh() {
return high;
}
public double getWidth2() {
return width2;
}
public void setHigh(double high) {
this.high = high;
}
public void setWidth1(double width1) {
this.width1 = width1;
}
public void setWidth2(double width2) {
this.width2 = width2;
}
@Override
public String getShapeName() {
return "Trapezoid";
}
@Override
public double getArea() {
return (width1 + width2) * high / 2;
}
@Override
public boolean validate() {
return width2 > 0 && width1 > 0 && high > 0;
}
}
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 print {
public static void sort(ArrayList<Card> arrayList) {
TreeSet<Card> cards = new TreeSet<>(arrayList);
System.out.print("[");
for (Card card : cards) {
System.out.print(card.getShape());
}
System.out.print("]");
}
public static double show(ArrayList<Card> arrayList, double max) {
double sum = 0;
System.out.print("[");
for (Card card : arrayList) {
sum += card.getShape().getArea();
System.out.print(card.getShape());
}
System.out.print("]");
if (sum > max)
max = sum;
return max;
}
}
public class homework_2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> shapeId = new ArrayList<>();
int i = scanner.nextInt();
if(i==0)
{
System.out.println("Wrong Format");
System.exit(0);
}
while (i != 0) {
if (i < 0 || i > 4) {
System.out.println("Wrong Format");
System.exit(0);
}
shapeId.add(i);
i = scanner.nextInt();
}
ArrayList<Card> cardArrayList = new ArrayList<>();
ArrayList<Card> circleArrayList = new ArrayList<>();
ArrayList<Card> rectangleArrayList = new ArrayList<>();
ArrayList<Card> triangleArrayList = new ArrayList<>();
ArrayList<Card> trapezoidArrayList = new ArrayList<>();
for (int k : shapeId) {
switch (k) {
case 1:
Circle circle = new Circle(scanner.nextDouble());
if (!circle.validate()) {
System.out.println("Wrong Format");
System.exit(0);
} else {
cardArrayList.add(new Card(circle));
circleArrayList.add(new Card(circle));
}
break;
case 2:
Rectangle rectangle = new Rectangle(scanner.nextDouble(), scanner.nextDouble());
if (!rectangle.validate()) {
System.out.println("Wrong Format");
System.exit(0);
} else {
cardArrayList.add(new Card(rectangle));
rectangleArrayList.add(new Card(rectangle));
}
break;
case 3:
Triangle triangle = new Triangle(scanner.nextDouble(), scanner.nextDouble(), scanner.nextDouble());
if (!triangle.validate()) {
System.out.println("Wrong Format");
System.exit(0);
} else {
cardArrayList.add(new Card(triangle));
triangleArrayList.add(new Card(triangle));
}
break;
case 4:
Trapezoid trapezoid = new Trapezoid(scanner.nextDouble(), scanner.nextDouble(), scanner.nextDouble());
if (!trapezoid.validate()) {
System.out.println("Wrong Format");
System.exit(0);
} else {
cardArrayList.add(new Card(trapezoid));
trapezoidArrayList.add(new Card(trapezoid));
}
break;
}
}
double max = 0;
System.out.println("The original list:");
System.out.print("[");
for (Card card : cardArrayList) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.println();
System.out.println("The Separated List:");
max = print.show(circleArrayList, max);
max = print.show(rectangleArrayList, max);
max = print.show(triangleArrayList, max);
max = print.show(trapezoidArrayList, max);
System.out.println();
System.out.println("The Separated sorted List:");
print.sort(circleArrayList);
print.sort(rectangleArrayList);
print.sort(triangleArrayList);
print.sort(trapezoidArrayList);
System.out.println();
System.out.printf("The max area:%.2f\n", max);
}
}
2.题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
写这两题时要注意先设计好类再动手
7-3 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编号]上存款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
④查询余额业务输出
¥[金额]
金额保留两位小数
题目思路
本题涉及的类有Bank类、User类、Account类、Card类以及ATM类。每个用户对应一张或多张卡号,且每张卡号的密码都是88888888,如果查询银行时输入的卡号不存在,则输出“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”
输入完成后,在使用split函数对输入字符串进行切割存放,然后在一一比对。首先我们先判断卡号,根据卡号来锁定银行用户,其次我们判断密码是否正确,如果正确,我们在进行下一步判断,否则直接跳出运行的程序。接下来我们在判断银行用户是否在相应的ATM机上进行相关操作,如果不在卡号所对应的ATM机上进行相关操作,则也输出报错语句然后跳出程序。最后,在判断银行用户到底时该存款还是该取款,如果输入金额为大于0则表示银行用户将进行取款,否则如果输入金额小于0则表示银行用户将进行存款。本题难点在于将输入的字符串切割后存入数组中,然后用数组中的元素表示每个需要比较的数据,这就需要灵活巧妙的运用for循环语句和if/else语句来进行相关判断。
package pta_8;
import java.util.Scanner;
import java.util.ArrayList;
class Bank {
String bankName;
ArrayList<String> ATMList;
public Bank(String bankName, ArrayList<String> ATMList) {
this.bankName = bankName;
this.ATMList = ATMList;
}
}
class Account {
private String name;
private String account;
private String password;
private double balance;
ArrayList<Bank> bankArrayList;
Bank bank;
private ArrayList<String> cardList;
public Account(String name, String account, String password, double balance, ArrayList<Bank> bankArrayList, Bank bank, ArrayList<String> cardList) {
this.name = name;
this.account = account;
this.password = password;
this.balance = balance;
this.bank = bank;
this.bankArrayList = bankArrayList;
this.cardList = cardList;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public double getBalance() {
return balance;
}
public ArrayList<String> getCardList() {
return cardList;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
class Check {
ArrayList<Account> accountList;
String card;
String password;
String number;
double money;
public Check(ArrayList<Account> accountList, String card, String password, String number, double money) {
this.accountList = accountList;
this.card = card;
this.password = password;
this.number = number;
this.money = money;
}
public boolean check(int k) {
int i,j;
if (password.equals(accountList.get(k).getPassword())) {
boolean flagATM = false;
for (i = 0; i < accountList.get(k).bankArrayList.size(); i++) {
for (j = 0; j < accountList.get(k).bankArrayList.get(i).ATMList.size(); j++) {
if (number.equals(accountList.get(k).bankArrayList.get(i).ATMList.get(j))) {
flagATM = true;
break;
}
}
}
if (flagATM) {
if (money <= accountList.get(k).getBalance()) {
boolean flagBank = false;
for (i = 0; i < accountList.get(k).bank.ATMList.size(); i++) {
if (number.equals(accountList.get(k).bank.ATMList.get(i))) {
flagBank = true;
break;
}
}
if (!flagBank) {
System.out.println("Sorry,cross-bank withdrawal is not supported.");
return false;
} else
return true;
} else {
System.out.println("Sorry,your account balance is insufficient.");
return false;
}
} else {
System.out.println("Sorry,the ATM's id is wrong.");
return false;
}
} else {
System.out.println("Sorry,your password is wrong.");
return false;
}
}
}
class Access {
ArrayList<Account> accountList;
String card;
String password;
String number;
double money;
public Access(ArrayList<Account> accountList, String card, String password, String number, double money) {
this.password = password;
this.number = number;
this.card = card;
this.accountList = accountList;
this.money = money;
}
public void access(int t) {
accountList.get(t).setBalance(accountList.get(t).getBalance() - money);
}
}
class Show {
ArrayList<Account> accountList;
String card;
String number;
double money;
public Show(ArrayList<Account> accountList, String card, String number, double money) {
this.number = number;
this.card = card;
this.accountList = accountList;
this.money = money;
}
public void show(boolean flag,int t) {
if (flag) {
if (money >= 0) {//取款
System.out.printf(accountList.get(t).getName() + "在" + accountList.get(t).bank.bankName + "的" + number + "号ATM机上取款¥%.2f\n", money);
} else {
money = -money;
System.out.printf(accountList.get(t).getName() + "在" + accountList.get(t).bank.bankName + "的" + number + "号ATM机上存款¥%.2f\n", money);
}
System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getBalance());
} else System.out.printf("¥%.2f\n", accountList.get(t).getBalance());
}
}
//主类
public class homework_1 {
public static void main(String[] args) {
//ATM机编号数组
ArrayList<String> ATMList1 = new ArrayList<>();
ATMList1.add("01");
ATMList1.add("02");
ATMList1.add("03");
ATMList1.add("04");
Bank jsyh = new Bank("中国建设银行", ATMList1);
ArrayList<String> ATMList2 = new ArrayList<>();
ATMList2.add("05");
ATMList2.add("06");
Bank gsyh = new Bank("中国工商银行", ATMList2);
//银行数组
ArrayList<Bank> bankList = new ArrayList<>();
bankList.add(jsyh);
bankList.add(gsyh);
//用户数组
ArrayList<String> cardList1 = new ArrayList<>();
cardList1.add("6217000010041315709");
cardList1.add("6217000010041315715");
Account account1 = new Account("杨过", "3217000010041315709", "88888888", 10000.00, bankList, jsyh, cardList1);
ArrayList<String> cardList2 = new ArrayList<>();
cardList2.add("6217000010041315718");
Account account2 = new Account("杨过", "3217000010041315715", "88888888", 10000.00, bankList, jsyh, cardList2);
ArrayList<String> cardList3 = new ArrayList<>();
cardList3.add("6217000010051320007");
Account account3 = new Account("郭靖", "3217000010051320007", "88888888", 10000.00, bankList, jsyh, cardList3);
ArrayList<String> cardList4 = new ArrayList<>();
cardList4.add("6222081502001312389");
Account account4 = new Account("张无忌", "3222081502001312389", "88888888", 10000.00, bankList, gsyh, cardList4);
ArrayList<String> cardList5 = new ArrayList<>();
cardList5.add("6222081502001312390");
Account account5 = new Account("张无忌", "3222081502001312390", "88888888", 10000.00, bankList, gsyh, cardList5);
ArrayList<String> cardList6 = new ArrayList<>();
cardList6.add("6222081502001312399");
cardList6.add("6222081502001312400");
Account account6 = new Account("张无忌", "3222081502001312399", "88888888", 10000.00, bankList, gsyh, cardList6);
ArrayList<String> cardList7 = new ArrayList<>();
cardList7.add("6222081502051320785");
Account account7 = new Account("韦小宝", "3222081502051320785", "88888888", 10000.00, bankList, gsyh, cardList7);
ArrayList<String> cardList8 = new ArrayList<>();
cardList8.add("6222081502051320786");
Account account8 = new Account("韦小宝", "3222081502051320786", "88888888", 10000.00, bankList, gsyh, cardList8);
//用户总数组
ArrayList<Account> accountList = new ArrayList<>();
accountList.add(account1);
accountList.add(account2);
accountList.add(account3);
accountList.add(account4);
accountList.add(account5);
accountList.add(account6);
accountList.add(account7);
accountList.add(account8);
Scanner scanner = new Scanner(System.in);
String kp;
kp = scanner.nextLine();
while (!kp.equals("#")) {
String[] split = kp.split("\\s+");
int t = 0;
boolean flag = false;
for (int i = 0; i < accountList.size(); i++) {
for (int j = 0; j < accountList.get(i).getCardList().size(); j++) {
if (split[0].equals(accountList.get(i).getCardList().get(j))) {
t = i;
flag=true;
break;
}
if(flag)
break;
}
}
if(flag)
{
if (split.length != 1) {
Check check = new Check(accountList, split[0], split[1], split[2], Double.parseDouble(split[3]));
if (check.check(t)) {
Access access = new Access(accountList, split[0], split[1], split[2], Double.parseDouble(split[3]));
access.access(t);
Show show = new Show(accountList, split[0], split[2], Double.parseDouble(split[3]));
show.show(true,t);
}
} else {
Check check = new Check(accountList, split[0], null, null, 0);
Show show = new Show(accountList, split[0], null, 0);
show.show(false,t);
}
}
else System.out.println("Sorry,this card does not exist.");
kp = scanner.nextLine();
}
}
}
7-1 ATM机类结构设计(二) (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编号]上取款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
③查询余额业务输出
业务:查询余额 ¥[金额]
金额保留两位小数。
题目思路
这个题目是对上一题的扩展,增加了新的业务功能。
增加了借记卡。银行账户分为借记账户和贷记账户两种,其中,借记账户不能够透支 取款,而贷记账户可以透支取款,这里需要支付手续费。
需要单独创建一个中国农业银行,因为在这题中,借记卡都是这个银行里才有的,贷记卡透支取钱需要付5%的手续费,
此外,如果还要跨行取钱的话,就还需要额外付手续费,这个手续费每个银行标准都不一样,
创建中国农业银行的时候,也要连带着把中国农业银行的基本数据初始化,比如ATM机,这个银行里面也有ATM机,
新加入了三个用户,:张三丰、令狐冲、乔峰,这些人都是持有中国农业银行的贷记卡的,业务假定 :系统的测试用例均采用如上数据,
手续费默认均从银行卡所对应的账户中自动扣除。跨行业务手续费收取比例由 ATM 机隶属银行决定,
例如,用户手持中国 工商银行的银行卡在中国建设银行的 ATM 上进行取款操作,则手续费收取比例为 中国建设银行的相应比例,
按初始化数据中的规定为取款金额的 2%。跨行查询余额不收取手续费。透支取款手续费由中国银联统一规定为 5%,最大透支金额均为 50000 元。
其他的就只需要在上次题目的基础上改进,结果输出不一样,大致就是这样的了。
import java.util.Scanner;
import java.util.ArrayList;
class Bank {
String bankName;
ArrayList<String> ATMList;
double rate;
public Bank(String bankName, ArrayList<String> ATMList, double rate) {
this.bankName = bankName;
this.ATMList = ATMList;
this.rate = rate;
}
}
class Account {
private String name;
private String account;
private String password;
private double balance;
ArrayList<Bank> bankArrayList;
Bank bank;
private ArrayList<String> cardList;
private String kind;
public Account(String name, String account, String password, double balance, ArrayList<Bank> bankArrayList, Bank bank, ArrayList<String> cardList, String kind) {
this.name = name;
this.account = account;
this.password = password;
this.balance = balance;
this.bank = bank;
this.bankArrayList = bankArrayList;
this.cardList = cardList;
this.kind = kind;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public double getBalance() {
return balance;
}
public ArrayList<String> getCardList() {
return cardList;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getKind() {
return kind;
}
}
class Check {
ArrayList<Account> accountList;
String card;
String password;
String number;
double money;
public Check(ArrayList<Account> accountList, String card, String password, String number, double money) {
this.accountList = accountList;
this.card = card;
this.password = password;
this.number = number;
this.money = money;
}
public boolean check(int k) {
int i, j, n = 0;
double allMoney = money;
if (password.equals(accountList.get(k).getPassword())) {
boolean flagATM = false;
for (i = 0; i < accountList.get(k).bankArrayList.size(); i++) {
for (j = 0; j < accountList.get(k).bankArrayList.get(i).ATMList.size(); j++) {
if (number.equals(accountList.get(k).bankArrayList.get(i).ATMList.get(j))) {
flagATM = true;
n = i;
break;
}
}
}
if (flagATM) {
if (money <= 0) {
return true;
}
if (accountList.get(k).getKind().equals("贷记账户")) {
if(accountList.get(k).getBalance()<=-50000.0)
{
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
return false;
}
if (!accountList.get(k).bank.bankName.equals(accountList.get(k).bankArrayList.get(n).bankName)) {
allMoney += money * accountList.get(k).bankArrayList.get(n).rate;
}
if (allMoney > accountList.get(k).getBalance()) {
if(accountList.get(k).getBalance()<=0)
{
allMoney += allMoney* 0.05;
}
else {
allMoney += (allMoney-accountList.get(k).getBalance()) * 0.05;
}
allMoney=accountList.get(k).getBalance()-allMoney;
if (allMoney <-50000) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
return false;
} else {
return true;
}
} else return true;
} else {
if (!accountList.get(k).bank.bankName.equals(accountList.get(k).bankArrayList.get(n).bankName)) {
allMoney += money * accountList.get(k).bankArrayList.get(n).rate;
}
if (allMoney > accountList.get(k).getBalance()) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
return false;
} else {
return true;
}
}
} else {
System.out.println("Sorry,the ATM's id is wrong.");
System.exit(0);
return false;
}
} else {
System.out.println("Sorry,your password is wrong.");
System.exit(0);
return false;
}
}
}
class Access {
ArrayList<Account> accountList;
String number;
double money;
public Access(ArrayList<Account> accountList, String number, double money) {
this.number = number;
this.accountList = accountList;
this.money = money;
}
public int access(int t) {
int i, j, n = 0;
for (i = 0; i < accountList.get(t).bankArrayList.size(); i++) {
for (j = 0; j < accountList.get(t).bankArrayList.get(i).ATMList.size(); j++) {
if (number.equals(accountList.get(t).bankArrayList.get(i).ATMList.get(j))) {
n = i;
break;
}
}
}
if (money <= 0)
accountList.get(t).setBalance(accountList.get(t).getBalance() - money);
else {
if (accountList.get(t).bank.bankName.equals(accountList.get(t).bankArrayList.get(n).bankName)) {
if (money > accountList.get(t).getBalance()) {
if (accountList.get(t).getBalance()<=0)
{
accountList.get(t).setBalance(accountList.get(t).getBalance() - money * 0.05-money);
}
else
accountList.get(t).setBalance(accountList.get(t).getBalance() - (money-accountList.get(t).getBalance()) * 0.05-money);
} else {
accountList.get(t).setBalance(accountList.get(t).getBalance() - money);
}
} else {
if (money > accountList.get(t).getBalance()) {
if (accountList.get(t).getBalance()<=0)
{
accountList.get(t).setBalance(accountList.get(t).getBalance() - money * 0.05- money * accountList.get(t).bankArrayList.get(n).rate-money);
}
else
accountList.get(t).setBalance(accountList.get(t).getBalance() - (money-accountList.get(t).getBalance()) * 0.05 - money * accountList.get(t).bankArrayList.get(n).rate-money);
} else {
accountList.get(t).setBalance(accountList.get(t).getBalance() - money - money * accountList.get(t).bankArrayList.get(n).rate);
}
}
}
return n;
}
}
class Show {
ArrayList<Account> accountList;
String card;
String number;
double money;
public Show(ArrayList<Account> accountList, String card, String number, double money) {
this.number = number;
this.card = card;
this.accountList = accountList;
this.money = money;
}
public void show(boolean flag, int t,int n) {
if (flag) {
if (money >= 0) {//取款
System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" + accountList.get(t).bankArrayList.get(n).bankName + "的" + number + "号ATM机上取款¥%.2f\n", money);
} else {
money = -money;
System.out.printf("业务:存款 "+accountList.get(t).getName() + "在" + accountList.get(t).bankArrayList.get(n).bankName + "的" + number + "号ATM机上存款¥%.2f\n", money);
}
System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getBalance());
} else System.out.printf("业务:查询余额 ¥%.2f\n", accountList.get(t).getBalance());
}
}
public class Main {
public static void main(String[] args) {
ArrayList<String> ATMList1 = new ArrayList<>();
ATMList1.add("01");
ATMList1.add("02");
ATMList1.add("03");
ATMList1.add("04");
Bank jsyh = new Bank("中国建设银行", ATMList1, 0.02);
ArrayList<String> ATMList2 = new ArrayList<>();
ATMList2.add("05");
ATMList2.add("06");
Bank gsyh = new Bank("中国工商银行", ATMList2, 0.03);
ArrayList<String> ATMList3 = new ArrayList<>();
ATMList3.add("07");
ATMList3.add("08");
ATMList3.add("09");
ATMList3.add("10");
ATMList3.add("11");
Bank nyyh = new Bank("中国农业银行", ATMList3, 0.04);
ArrayList<Bank> bankList = new ArrayList<>();
bankList.add(jsyh);
bankList.add(gsyh);
bankList.add(nyyh);
ArrayList<String> cardList1 = new ArrayList<>();
cardList1.add("6217000010041315709");
cardList1.add("6217000010041315715");
Account account1 = new Account("杨过", "3217000010041315709", "88888888", 10000.00, bankList, jsyh, cardList1, "借记账户");
ArrayList<String> cardList2 = new ArrayList<>();
cardList2.add("6217000010041315718");
Account account2 = new Account("杨过", "3217000010041315715", "88888888", 10000.00, bankList, jsyh, cardList2, "借记账户");
ArrayList<String> cardList3 = new ArrayList<>();
cardList3.add("6217000010051320007");
Account account3 = new Account("郭靖", "3217000010051320007", "88888888", 10000.00, bankList, jsyh, cardList3, "借记账户");
ArrayList<String> cardList4 = new ArrayList<>();
cardList4.add("6222081502001312389");
Account account4 = new Account("张无忌", "3222081502001312389", "88888888", 10000.00, bankList, gsyh, cardList4, "借记账户");
ArrayList<String> cardList5 = new ArrayList<>();
cardList5.add("6222081502001312390");
Account account5 = new Account("张无忌", "3222081502001312390", "88888888", 10000.00, bankList, gsyh, cardList5, "借记账户");
ArrayList<String> cardList6 = new ArrayList<>();
cardList6.add("6222081502001312399");
cardList6.add("6222081502001312400");
Account account6 = new Account("张无忌", "3222081502001312399", "88888888", 10000.00, bankList, gsyh, cardList6, "借记账户");
ArrayList<String> cardList7 = new ArrayList<>();
cardList7.add("6222081502051320785");
Account account7 = new Account("韦小宝", "3222081502051320785", "88888888", 10000.00, bankList, gsyh, cardList7, "借记账户");
ArrayList<String> cardList8 = new ArrayList<>();
cardList8.add("6222081502051320786");
Account account8 = new Account("韦小宝", "3222081502051320786", "88888888", 10000.00, bankList, gsyh, cardList8, "借记账户");
ArrayList<String> cardList9 = new ArrayList<>();
cardList9.add("6640000010045442002");
cardList9.add("6640000010045442003");
Account account9 = new Account("张三丰", "3640000010045442002", "88888888", 10000.00, bankList, jsyh, cardList9, "贷记账户");
ArrayList<String> cardList10 = new ArrayList<>();
cardList10.add("6640000010045441009");
Account account10 = new Account("令狐冲", "3640000010045441009", "88888888", 10000.00, bankList, gsyh, cardList10, "贷记账户");
ArrayList<String> cardList11 = new ArrayList<>();
cardList11.add("6630000010033431001");
Account account11 = new Account("乔峰", "3630000010033431001", "88888888", 10000.00, bankList, nyyh, cardList11, "贷记账户");
ArrayList<String> cardList12 = new ArrayList<>();
cardList12.add("6630000010033431008");
Account account12 = new Account("洪七公", "3630000010033431008", "88888888", 10000.00, bankList, nyyh, cardList12, "贷记账户");
ArrayList<Account> accountList = new ArrayList<>();
accountList.add(account1);
accountList.add(account2);
accountList.add(account3);
accountList.add(account4);
accountList.add(account5);
accountList.add(account6);
accountList.add(account7);
accountList.add(account8);
accountList.add(account9);
accountList.add(account10);
accountList.add(account11);
accountList.add(account12);
Scanner scanner = new Scanner(System.in);
String kp;
kp = scanner.nextLine();
while (!kp.equals("#")) {
String[] split = kp.split("\\s+");
int t = 0;
boolean flag = false;
for (int i = 0; i < accountList.size(); i++) {
for (int j = 0; j < accountList.get(i).getCardList().size(); j++) {
if (split[0].equals(accountList.get(i).getCardList().get(j))) {
t = i;
flag = true;
break;
}
if (flag)
break;
}
}
if (flag) {
if (split.length != 1) {
int n=0;
Check check = new Check(accountList, split[0], split[1], split[2], Double.parseDouble(split[3]));
if (check.check(t)) {
Access access = new Access(accountList, split[2], Double.parseDouble(split[3]));
n=access.access(t);
Show show = new Show(accountList, split[0], split[2], Double.parseDouble(split[3]));
show.show(true, t,n);
}
} else {
Show show = new Show(accountList, split[0], null, 0);
show.show(false, t,0);
}
} else {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}
kp = scanner.nextLine();
}
}
}
三、踩坑心得
这次题目集写的时候一定要细心,看清楚输出要求,否则很多容易出现检查很久前面逻辑错误,看不出来,最后发现是输出问题心态爆炸的情况。在处理输出问题时,一定要理清楚输出逻辑再动手,否则一路写下去,发现错误时,回头检查会非常痛苦。
四、改进建议
代码还是有很多可以改进的地方,有很多地方还不够简洁,代码还是显得很臃肿,有一些地方的逻辑还比较乱,可读性较低,面向对象的理解还是有待提升。
五、总结
经过这三次题目集的锻炼进一步加深了我对类的继承、多态性使用方法以及接口的理解,明白对实体类的设计要做到单一职责原则,合成复用原则,才能编写出合格的代码。同时对集合框架有了进一步的认识,但由于其类容较多,想要灵活使用,还要在日后不断学习,反复使用。

浙公网安备 33010602011771号