Java第三次BLOG

目录
1. 前言
题目分析
(1)第七次PTA作业涉及知识点及难度分析
在题目集7-1和7-2中,有很多关于继承、多态和接口的用法,类的继承、多态性使用方法以及Comparable 接口的应用。
难点分析:主要考察自身对知识点的熟练掌握
(2)第八次PTA作业涉及知识点及难度分析
在7-3 ATM机类结构设计(一)主要考察对对于之前知识的总结和运用,学会系统性的构建代码

(3)第九次PTA作业涉及知识点及难度分析

2.设计与分析
题目集7-1
输入格式:
首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
排序后的各图形类型及面积,格式同排序前的输出;
所有图形的面积总和,格式为Sum of area:总面积值。
输入样例1:
在这里给出一组输入。例如:

1 5 3 2 0

结尾无空行
输出样例1:
在这里给出相应的输出。例如:

Wrong Format

代码如下:
`

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

public class Main{
public static Scanner input = new Scanner(System.in);

public static void main(String[] args) {
ArrayList list = new ArrayList();
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 list = new ArrayList<>();
DealCardList(){

}
DealCardList(ArrayList list){
for(int i = 0 ; i < list.size() ; i++) {
switch(list.get(i)) {
case 0:;break;
case 1:
Card a1 = new Card(new Circle(Main.input.nextDouble()));
this.list.add(a1);
a1.getShape().setShapeName("Circle");
break;
case 2:
Card a2 = new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
this.list.add(a2);
a2.getShape().setShapeName("Rectangle");
break;
case 3:
Card a3 = new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
this.list.add(a3);
a3.getShape().setShapeName("Triangle");
break;
case 4:
Card a4 = new Card(new Traperiod(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
this.list.add(a4);
a4.getShape().setShapeName("Trapezoid");
break;
}

}

}
public boolean validate(){
boolean flag = true;
for(int i = 0; i < list.size() ; i++) {
if(!list.get(i).getShape().validate()) {
flag = false;
break;
}
}
return flag;

}
public void cardSort() {

list.sort(Card::compareTo);

}
public double getAllArea() {
double AllArea = 0;
for(int i =0 ; i< this.list.size() ; i++) {
AllArea += this.list.get(i).getShape().getArea();
}
return AllArea;
}
public void showResult() {
System.out.println("The original list:");
for(int i =0 ; i< this.list.size() ; i++) {
System.out.print(this.list.get(i).getShape().getShapeName()+"😊;
System.out.printf("%.2f ",this.list.get(i).getShape().getArea());
}
System.out.println("\nThe sorted list:");
cardSort();
for(int i =0 ; i< this.list.size() ; i++) {
System.out.print(this.list.get(i).getShape().getShapeName()+"😊;
System.out.printf("%.2f ",this.list.get(i).getShape().getArea());
}
System.out.printf("\nSum of area:%.2f",getAllArea());
}
}
class Card implements Comparable{
Shape shape;
Card(){

}
Card(Shape shape){
this.shape = shape;
}
public Shape getShape() {
return this.shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public int compareTo(Card card) {
return -(int)(shape.getArea()-card.getShape().getArea());
}
}
abstract class Shape{
String shapeName;
Shape(){

}
Shape(String shapeName){
this.shapeName = shapeName;
}
public String getShapeName() {
return shapeName;
}
public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
public abstract double getArea();
public abstract boolean validate();

public String toString() {
return shapeName;
}
}
class Circle extends Shape{
double radius;
Circle(){

}
Circle(double radius){
this.radius = radius;
}
public double getRadius() {
return this.radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() {
return Math.PIthis.radiusthis.radius;
}
public boolean validate() {
return this.radius > 0;
}
}
class Rectangle extends Shape{
double width;
double length;
Rectangle(){

}
Rectangle(double width,double length){
this.length = length;
this.width = width;
}
public double getWidth() {
return this.width;
}
public void setWidth(double width){
this.width = width;
}
public double getLength() {
return this.length;
}
public void setLength(double length) {
this.length = length;
}
public double getArea() {
return this.length*this.width;
}
public boolean validate() {
return (this.length > 0 && this.width >0);
}
}
class Triangle extends Shape{
double side1;
double side2;
double side3;
Triangle(){

}
Triangle(double side1,double side2,double side3){
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public double getArea() {
double a=(this.side1 + this.side2 + this.side3) / 2;
return Math.sqrt(a(a - this.side1)(a - this.side2)*(a - this.side3));
}
public boolean validate(){
return this.side1 + this.side2 > this.side3 && this.side1 + this.side3 > this.side2 &&this.side2 + this.side3 > this.side1;
}

}
class Traperiod extends Shape{
double topside;
double bottomside;
double height;
Traperiod(){

}
Traperiod(double topside, double bottomside, double height){
this.topside = topside;
this.bottomside = bottomside;
this.height = height;
}
public double getArea() {
return (this.topside + this.bottomside) * this.height / 2;
}
public boolean validate() {
return (this.topside > 0 && this.bottomside >0 && this.height > 0);
}
}
`
代码圈复杂度图如下:

代码的类图如下:

题目集7(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:面积值。
输入样例1:
在这里给出一组输入。例如:

1 5 3 2 0

结尾无空行
输出样例1:
在这里给出相应的输出。例如:

Wrong Format

结尾无空行

代码如下:
`
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.TreeSet;

public class Main{
public static Scanner input = new Scanner(System.in);

public static void main(String[] args) {
ArrayList list = new ArrayList();
int num = input.nextInt();
if(num == 0) {
System.out.println("Wrong Format");
}else {
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 list = new ArrayList<>();
ArrayList listMaxArea = new ArrayList<>();
ArrayList listCircle = new ArrayList<>();
ArrayList listRectangle = new ArrayList<>();
ArrayList listTriangle = new ArrayList<>();
ArrayList listTrapezoid = new ArrayList<>();
DealCardList(){

}
DealCardList(ArrayList list){
for(int i = 0 ; i < list.size() ; i++) {
switch(list.get(i)) {
case 0:;break;
case 1:
Card a1 = new Card(new Circle(Main.input.nextDouble()));
this.list.add(a1);
this.listCircle.add(a1);
a1.getShape().setShapeName("Circle");
break;
case 2:
Card a2 = new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
this.list.add(a2);
this.listRectangle.add(a2);
a2.getShape().setShapeName("Rectangle");
break;
case 3:
Card a3 = new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
this.list.add(a3);
this.listTriangle.add(a3);
a3.getShape().setShapeName("Triangle");
break;
case 4:
Card a4 = new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
this.list.add(a4);
this.listTrapezoid.add(a4);
a4.getShape().setShapeName("Trapezoid");
break;
}

}

}
public boolean validate(){
boolean flag = true;
for(int i = 0; i < list.size() ; i++) {
if(!list.get(i).getShape().validate()) {
flag = false;
break;
}
}
return flag;

}
public void cardSort(ArrayList card) {
card.sort(Card::compareTo);
}
public double getAllArea(ArrayList card) {
double AllArea = 0;
for(int i =0 ; i< card.size() ; i++) {
AllArea += card.get(i).getShape().getArea();
}
return AllArea;
}
public void showResult() {
System.out.printf("The original list:\n[");
for(int i =0 ; i< this.list.size() ; i++) {
System.out.print(this.list.get(i).getShape().getShapeName()+"😊;
System.out.printf("%.2f ",this.list.get(i).getShape().getArea());
}
System.out.printf("]\nThe Separated List:\n");
show(listCircle);
show(listRectangle);
show(listTriangle);
show(listTrapezoid);
System.out.printf("\nThe Separated sorted List:\n");
cardSort(listCircle);
cardSort(listRectangle);
cardSort(listTriangle);
cardSort(listTrapezoid);
show(listCircle);
show(listRectangle);
show(listTriangle);
show(listTrapezoid);

System.out.printf("\nThe max area:%.2f",maxArea());

}
public double maxArea() {
double a[] = new double[4];
a[0] = getAllArea(listCircle);
a[1] = getAllArea(listRectangle);
a[2] = getAllArea(listTriangle);
a[3] = getAllArea(listTrapezoid);
Arrays.sort(a);
return a[3];
}
public void show(ArrayList card) {
System.out.print("[");
for(int i =0 ; i< card.size() ; i++) {
System.out.print(card.get(i).getShape().getShapeName()+"😊;
System.out.printf("%.2f ",card.get(i).getShape().getArea());
}
System.out.print("]");
}
}
class Card implements Comparable{
Shape shape;
Card(){

}
Card(Shape shape){
this.shape = shape;
}
public Shape getShape() {
return this.shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public int compareTo(Card card) {
return -(int)(shape.getArea()-card.getShape().getArea());
}
}
abstract class Shape{
String shapeName;
Shape(){

}
Shape(String shapeName){
this.shapeName = shapeName;
}
public String getShapeName() {
return shapeName;
}
public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
public abstract double getArea();
public abstract boolean validate();

public String toString() {
return shapeName;
}
}
class Circle extends Shape{
double radius;
Circle(){

}
Circle(double radius){
this.radius = radius;
}
public double getRadius() {
return this.radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() {
return Math.PIthis.radiusthis.radius;
}
public boolean validate() {
return this.radius > 0;
}
}
class Rectangle extends Shape{
double width;
double length;
Rectangle(){

}
Rectangle(double width,double length){
this.length = length;
this.width = width;
}
public double getWidth() {
return this.width;
}
public void setWidth(double width){
this.width = width;
}
public double getLength() {
return this.length;
}
public void setLength(double length) {
this.length = length;
}
public double getArea() {
return this.length*this.width;
}
public boolean validate() {
return (this.length > 0 && this.width >0);
}
}
class Triangle extends Shape{
double side1;
double side2;
double side3;
Triangle(){

}
Triangle(double side1,double side2,double side3){
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public double getArea() {
double a=(this.side1 + this.side2 + this.side3) / 2;
return Math.sqrt(a(a - this.side1)(a - this.side2)*(a - this.side3));
}
public boolean validate(){
return this.side1 + this.side2 > this.side3 && this.side1 + this.side3 > this.side2 &&this.side2 + this.side3 > this.side1;
}

}
class Trapezoid extends Shape{
double topside;
double bottomside;
double height;
Trapezoid(){

}
Trapezoid(double topside, double bottomside, double height){
this.topside = topside;
this.bottomside = bottomside;
this.height = height;
}
public double getArea() {
return (this.topside + this.bottomside) * this.height / 2;
}
public boolean validate() {
return (this.topside > 0 && this.bottomside >0 && this.height > 0);
}
}`

使用SourceMonitor对此次作业代码进行圈复杂度分析如下:

(3)类图

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

存款、取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。
查询余额功能输入数据格式: 卡号
输出格式:
①输入错误处理

如果输入卡号不存在,则输出Sorry,this card does not exist.。
如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.。
如果输入银行卡密码错误,则输出Sorry,your password is wrong.。
如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.。
如果检测为跨行存取款,则输出Sorry,cross-bank withdrawal is not supported.。
②取款业务输出

输出共两行,格式分别为:

[用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]

当前余额为¥[金额]

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

③存款业务输出

输出共两行,格式分别为:

[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]

当前余额为¥[金额]

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

④查询余额业务输出

¥[金额]

金额保留两位小数。

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

6222081502001312390 88888888 06 -500.00

结尾无空行
输出样例1:
在这里给出相应的输出。例如:

张无忌在中国工商银行的06号ATM机上存款¥500.00
当前余额为¥10500.00
结尾无空行
代码如下:
`

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
ArrayList CardListyg1 = new ArrayList<>();
ArrayList CardListyg2 = new ArrayList<>();

ArrayList CardListgj1 = new ArrayList<>();

ArrayList CardListzwj1 = new ArrayList<>();
ArrayList CardListzwj2 = new ArrayList<>();
ArrayList CardListzwj3 = new ArrayList<>();

ArrayList CardListwxb = new ArrayList<>();
ArrayList CardListwxb1 = new ArrayList<>();
ArrayList CardListwxb2 = new ArrayList<>();
// 杨过的账号
Card a1 = new Card("6217000010041315709", "88888888");
CardListyg1.add(a1);

Card a2 = new Card("6217000010041315715", "88888888");
CardListyg1.add(a2);
User useryg1 = new User(new Bank("中国建设银行", new Account("3217000010041315709", 10000.00, CardListyg1)), "杨过");
list.add(useryg1);

Card a3 = new Card("6217000010041315718", "88888888");
CardListyg2.add(a3);
User useryg2 = new User(new Bank("中国建设银行", new Account("3217000010041315715", 10000.00, CardListyg2)), "杨过");
list.add(useryg2);
// 郭靖的账号
Card b1 = new Card("6217000010051320007", "88888888");
CardListgj1.add(b1);
User usergj1 = new User(new Bank("中国建设银行", new Account("3217000010051320007", 10000.00, CardListgj1)), "郭靖");
list.add(usergj1);
// 张无忌的账号
Card c1 = new Card("6222081502001312389", "88888888");
CardListzwj1.add(c1);
User userzwj1 = new User(new Bank("中国工商银行", new Account("3222081502001312389", 10000.00, CardListzwj1)), "张无忌");
list.add(userzwj1);

Card c2 = new Card("6222081502001312390", "88888888");
CardListzwj2.add(c2);
User userzwj2 = new User(new Bank("中国工商银行", new Account("3222081502001312390", 10000.00, CardListzwj2)), "张无忌");
list.add(userzwj2);

Card c3 = new Card("6222081502001312399", "88888888");
CardListzwj3.add(c3);
Card c4 = new Card("6222081502001312400", "88888888");
CardListzwj3.add(c4);
User userzwj3 = new User(new Bank("中国工商银行", new Account("3222081502001312399", 10000.00, CardListzwj3)), "张无忌");
list.add(userzwj3);

// 韦小宝的账号
Card d1 = new Card("6222081502051320785", "88888888");
CardListwxb1.add(d1);
User userwxb1 = new User(new Bank("中国工商银行", new Account("3222081502051320785", 10000.00, CardListwxb1)), "韦小宝");
list.add(userwxb1);

Card d2 = new Card("6222081502051320786", "88888888");
CardListwxb1.add(d2);
User userwxb2 = new User(new Bank("中国工商银行", new Account("3222081502051320786", 10000.00, CardListwxb2)), "韦小宝");
list.add(userwxb2);

DataBase database = new DataBase(list);

int i = 0;
int flag;
Scanner in = new Scanner(System.in);
String[] message ;
StringBuilder a=new StringBuilder(in.nextLine());
String en = in.nextLine();
while (!en.equals("#")){
a.append('\n').append(en);
en=in.nextLine();
}
String b= String.valueOf(a);
String[] input =b.split("\n");
for (i = 0; i < input.length; i++) {
message = input[i].split("\s+");
if (message.length > 1 ) {
message[0].trim();
message[1].trim();
message[2].trim();
message[3].trim();
//System.out.println(message[0]+message[1]+message[2]+message[3]);
flag = 0;
for (int j = 0; j < list.size() && flag == 0; j++) {
for (int k = 0; k < list.get(j).getBank().getAccount().getCardList().size(); k++) {
if (list.get(j).getBank().getAccount().getCardList().get(k).getCard().equals(message[0])) {
flag = 1;
if (message[2].equals("01") || message[2].equals("02") || message[2].equals("03")
|| message[2].equals("04") || message[2].equals("05") || message[2].equals("06")) {
double money = Double.parseDouble(message[3]);

database.validata(message[1], message[2], money, j, k);
} else {
System.out.println("Sorry,the ATM's id is wrong.");
}

break;
}
}
}
}else {
message[0].trim();

flag = 0;
for (int j = 0; j < list.size() && flag == 0; j++) {
for (int k = 0; k < list.get(j).getBank().getAccount().getCardList().size(); k++) {
if (list.get(j).getBank().getAccount().getCardList().get(k).getCard().equals(message[0])) {
flag = 1;
System.out.printf("¥%.2f\n",list.get(j).getBank().getAccount().getAccountBalance());
break;
}
}
}

}

if (flag == 0) {
System.out.println("Sorry,this card does not exist.");
}
}
// database.show();
}
}

class Bank {
String BankName;
Account account;

Bank() {

}

Bank(String BankName, Account account) {
this.BankName = BankName;
this.account = account;
}

public void setBankName(String BankName) {
this.BankName = BankName;
}

public String getBankName() {
return this.BankName;
}

public void setAccount(Account account) {
this.account = account;
}

public Account getAccount() {
return this.account;
}
}

class Account {
String AccountName;
double AccountBalance;

ArrayList CardList = new ArrayList<>();

Account() {

}

Account(String AccountName, double AccountBalance, ArrayList CardList) {
this.AccountName = AccountName;
this.AccountBalance = AccountBalance;
this.CardList = CardList;
}

public void setAccountName(String AccountName) {
this.AccountName = AccountName;
}

public String getAccountName() {
return this.AccountName;
}

public void setAccountBalance(double AccountBalance) {
this.AccountBalance = AccountBalance;
}

public double getAccountBalance() {
return this.AccountBalance;
}

public void setCardList(ArrayList CardList) {
this.CardList = CardList;
}

public ArrayList getCardList() {
return this.CardList;
}

public void updateBalance(double money) {
this.AccountBalance -= money;
}

public boolean updateBalanceValidata(double money) {
return this.AccountBalance > money ;
}
}

class Card {
String CardName;
String Key;

Card() {

}

Card(String CardName, String Key) {
this.CardName = CardName;
this.Key = Key;
}

public void setCard(String CardName) {
this.CardName = CardName;
}

public String getCard() {
return this.CardName;
}

public void setKey(String Key) {
this.Key = Key;
}

public String getKey() {
return this.Key;
}
}

class User {
Bank bank;
String UserName;

User() {

}

User(Bank bank, String UserName) {
this.bank = bank;
this.UserName = UserName;
}

public Bank getBank() {
return this.bank;
}

public void setBank(Bank bank) {
this.bank = bank;
}

public String getUserName() {
return this.UserName;
}

public void setUserName(String UserName) {
this.UserName = UserName;
}
}

class ATM extends Bank {
ATM() {

}

ATM(String number) {
switch (number) {
case "01":
setBankName("中国建设银行");
break;
case "02":
setBankName("中国建设银行");
break;
case "03":
setBankName("中国建设银行");
break;
case "04":
setBankName("中国建设银行");
break;
case "05":
setBankName("中国工商银行");
break;
case "06":
setBankName("中国工商银行");
break;
}
}

}

class DataBase {
ArrayList list = new ArrayList<>();

DataBase() {

}

DataBase(ArrayList list) {
this.list = list;
}

public void show() {
for (int i = 0; i < this.list.size(); i++) {
for (int j = 0; j < this.list.get(i).getBank().getAccount().getCardList().size(); j++) {
System.out.println(this.list.get(i).getUserName() + this.list.get(i).getBank().getBankName()
+" " +this.list.get(i).getBank().getAccount().getAccountName()
+ " "+this.list.get(i).getBank().getAccount().getAccountBalance()
+ " "+this.list.get(i).getBank().getAccount().getCardList().get(j).getCard());
}

}
}

public boolean validata(String secret, String atm, double money, int j, int k) {
String operate;
ATM Atm = new ATM(atm);
if (this.list.get(j).getBank().getAccount().getCardList().get(k).getKey().equals(secret)) {
if (this.list.get(j).getBank().getBankName().equals(Atm.getBankName())) {

if (this.list.get(j).getBank().getAccount().updateBalanceValidata(money)) {

this.list.get(j).getBank().getAccount().updateBalance(money);
if(money>0) {
operate = new String("取款");
}else {
operate = new String("存款");
}
System.out.printf(this.list.get(j).getUserName() + "在" + this.list.get(j).getBank().getBankName()
+ "的" + atm + "号ATM机上"+operate+"¥%.2f\n", Math.abs(money));
System.out.printf("当前余额为¥%.2f\n",this.list.get(j).getBank().getAccount().AccountBalance);

} else {
System.out.println("Sorry,your account balance is insufficient.");
}
} else {
System.out.println("Sorry,cross-bank withdrawal is not supported.");
}
} else {
System.out.println("Sorry,your password is wrong.");
}
return false;
}
}
`

(2)圈复杂度分析

类图如下:

题目集9:

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

取款功能输入数据格式: 卡号 密码 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编号]上取款¥[金额]

当前余额为¥[金额]

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

③查询余额业务输出

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

金额保留两位小数。

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

6222081502001312390 88888888 06 500.00

结尾无空行
输出样例1:
在这里给出相应的输出。例如:

业务:取款 张无忌在中国工商银行的06号ATM机上取款¥500.00
当前余额为¥9500.00

结尾无空行

代码如下:
`

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
ArrayList CardListyg1 = new ArrayList<>();
ArrayList CardListyg2 = new ArrayList<>();

ArrayList CardListgj1 = new ArrayList<>();

ArrayList CardListzwj1 = new ArrayList<>();
ArrayList CardListzwj2 = new ArrayList<>();
ArrayList CardListzwj3 = new ArrayList<>();

ArrayList CardListwxb = new ArrayList<>();
ArrayList CardListwxb1 = new ArrayList<>();
ArrayList CardListwxb2 = new ArrayList<>();

ArrayList CardListzsf1 = new ArrayList<>();

ArrayList CardListlhc1 = new ArrayList<>();

ArrayList CardListqf1 = new ArrayList<>();

ArrayList CardListhqg1 = new ArrayList<>();
// 杨过的账号
Card a1 = new Card("6217000010041315709", "88888888", "借记卡");
CardListyg1.add(a1);

Card a2 = new Card("6217000010041315715", "88888888", "借记卡");
CardListyg1.add(a2);
User useryg1 = new User(new Bank("中国建设银行", new Account("3217000010041315709", 10000.00, CardListyg1)), "杨过");
list.add(useryg1);

Card a3 = new Card("6217000010041315718", "88888888", "借记卡");
CardListyg2.add(a3);
User useryg2 = new User(new Bank("中国建设银行", new Account("3217000010041315715", 10000.00, CardListyg2)), "杨过");
list.add(useryg2);
// 郭靖的账号
Card b1 = new Card("6217000010051320007", "88888888", "借记卡");
CardListgj1.add(b1);
User usergj1 = new User(new Bank("中国建设银行", new Account("3217000010051320007", 10000.00, CardListgj1)), "郭靖");
list.add(usergj1);
// 张无忌的账号
Card c1 = new Card("6222081502001312389", "88888888", "借记卡");
CardListzwj1.add(c1);
User userzwj1 = new User(new Bank("中国工商银行", new Account("3222081502001312389", 10000.00, CardListzwj1)), "张无忌");
list.add(userzwj1);

Card c2 = new Card("6222081502001312390", "88888888", "借记卡");
CardListzwj2.add(c2);
User userzwj2 = new User(new Bank("中国工商银行", new Account("3222081502001312390", 10000.00, CardListzwj2)), "张无忌");
list.add(userzwj2);

Card c3 = new Card("6222081502001312399", "88888888", "借记卡");
CardListzwj3.add(c3);
Card c4 = new Card("6222081502001312400", "88888888", "借记卡");
CardListzwj3.add(c4);
User userzwj3 = new User(new Bank("中国工商银行", new Account("3222081502001312399", 10000.00, CardListzwj3)), "张无忌");
list.add(userzwj3);

// 韦小宝的账号
Card d1 = new Card("6222081502051320785", "88888888", "借记卡");
CardListwxb1.add(d1);
User userwxb1 = new User(new Bank("中国工商银行", new Account("3222081502051320785", 10000.00, CardListwxb1)), "韦小宝");
list.add(userwxb1);

Card d2 = new Card("6222081502051320786", "88888888", "借记卡");
CardListwxb1.add(d2);
User userwxb2 = new User(new Bank("中国工商银行", new Account("3222081502051320786", 10000.00, CardListwxb2)), "韦小宝");
list.add(userwxb2);

//张三丰的账号
Card e1 = new Card("6640000010045442002", "88888888", "贷记卡");
CardListzsf1.add(e1);
Card e2 = new Card("6640000010045442003", "88888888", "贷记卡");
CardListzsf1.add(e2);
User userzsf1 = new User(new Bank("中国建设银行", new Account("3640000010045442002", 10000.00, CardListzsf1)), "张三丰");
list.add(userzsf1);

//令狐冲的账号
Card f1 = new Card("6640000010045441009", "88888888", "贷记卡");
CardListlhc1.add(f1);
User userlhc1 = new User(new Bank("中国工商银行", new Account("3640000010045441009", 10000.00, CardListlhc1)), "令狐冲");
list.add(userlhc1);

//乔峰的账号
Card g1 = new Card("6630000010033431001", "88888888", "贷记卡");
CardListqf1.add(g1);
User userqf1 = new User(new Bank("中国农业银行", new Account("3630000010033431001", 10000.00, CardListqf1)), "乔峰");
list.add(userqf1);

//洪七公的账号
Card h1 = new Card("6630000010033431008", "88888888", "贷记卡");
CardListhqg1.add(h1);
User userhqg1 = new User(new Bank("中国农业银行", new Account("3630000010033431008", 10000.00, CardListhqg1)), "洪七公");
list.add(userhqg1);

DataBase database = new DataBase(list);

//database.show();

int i = 0;
int flag;
Scanner in = new Scanner(System.in);
String[] message ;
StringBuilder a=new StringBuilder(in.nextLine());
String en = in.nextLine();
while (!en.equals("#")){
a.append('\n').append(en);
en=in.nextLine();
}
String b= String.valueOf(a);
String[] input =b.split("\n");
boolean mark = true;
for (i = 0; i < input.length && mark; i++) {
message = input[i].split("\s+");

// System.out.println(message[1]);
// System.out.println(message[2]);
// System.out.println(message[3]);
if (message.length > 1 ) {
message[0].trim();
message[1].trim();
message[2].trim();
message[3].trim();
//System.out.println(message[0]+message[1]+message[2]+message[3]);
ATM ATMtest = new ATM();
flag = 0;
for (int j = 0; j < list.size() && flag == 0; j++) {
for (int k = 0; k < list.get(j).getBank().getAccount().getCardList().size(); k++) {
if (list.get(j).getBank().getAccount().getCardList().get(k).getCard().equals(message[0])) {
flag = 1;
if (ATMtest.validata(message[2]) ) {
double money = Double.parseDouble(message[3]);

mark = database.validata(message[1], message[2], money, j, k);
} else {
System.out.println("Sorry,the ATM's id is wrong.");
mark = false;
}

break;
}
}
}
}else {
message[0].trim();

flag = 0;
for (int j = 0; j < list.size() && flag == 0; j++) {
for (int k = 0; k < list.get(j).getBank().getAccount().getCardList().size(); k++) {
if (list.get(j).getBank().getAccount().getCardList().get(k).getCard().equals(message[0])) {
flag = 1;
System.out.printf("业务:查询余额 " + "¥%.2f",list.get(j).getBank().getAccount().getAccountBalance());
break;
}
}
}

}

if (flag == 0) {
System.out.println("Sorry,this card does not exist.");
mark = false;
}
}
// database.show();
}
}

class Bank {
String BankName;
Account account;

Bank() {

}

Bank(String BankName, Account account) {
this.BankName = BankName;
this.account = account;
}

public void setBankName(String BankName) {
this.BankName = BankName;
}

public String getBankName() {
return this.BankName;
}

public void setAccount(Account account) {
this.account = account;
}

public Account getAccount() {
return this.account;
}
}

class Account {
String AccountName;
double AccountBalance;

ArrayList CardList = new ArrayList<>();

Account() {

}

Account(String AccountName, double AccountBalance, ArrayList CardList) {
this.AccountName = AccountName;
this.AccountBalance = AccountBalance;
this.CardList = CardList;
}

public void setAccountName(String AccountName) {
this.AccountName = AccountName;
}

public String getAccountName() {
return this.AccountName;
}

public void setAccountBalance(double AccountBalance) {
this.AccountBalance = AccountBalance;
}

public double getAccountBalance() {
return this.AccountBalance;
}

public void setCardList(ArrayList CardList) {
this.CardList = CardList;
}

public ArrayList getCardList() {
return this.CardList;
}

public void updateBalance(double money) {
this.AccountBalance -= money;
}

public boolean updateBalanceValidata(double money,int k) {
if(this.getCardList().get(k).getCardType().equals("贷记卡")) {

return this.AccountBalance + 50000 > money + money*0.05;

}else {
return this.AccountBalance > money ;
}

}
}

class Card {
String CardName;
String Key;
String CardType;
Card() {

}

Card(String CardName, String Key , String CardType) {
this.CardName = CardName;
this.Key = Key;
this.CardType = CardType;
}

public void setCard(String CardName) {
this.CardName = CardName;
}

public String getCard() {
return this.CardName;
}

public void setKey(String Key) {
this.Key = Key;
}

public String getKey() {
return this.Key;
}

public void setCardType(String CardType) {
this.CardType = CardType;
}

public String getCardType() {
return this.CardType;
}
}

class User {
Bank bank;
String UserName;

User() {

}

User(Bank bank, String UserName) {
this.bank = bank;
this.UserName = UserName;
}

public Bank getBank() {
return this.bank;
}

public void setBank(Bank bank) {
this.bank = bank;
}

public String getUserName() {
return this.UserName;
}

public void setUserName(String UserName) {
this.UserName = UserName;
}
}

class ATM extends Bank {
ATM() {

}

ATM(String number) {
switch (number) {
case "01":
setBankName("中国建设银行");
break;
case "02":
setBankName("中国建设银行");
break;
case "03":
setBankName("中国建设银行");
break;
case "04":
setBankName("中国建设银行");
break;
case "05":
setBankName("中国工商银行");
break;
case "06":
setBankName("中国工商银行");
break;
case "07":
setBankName("中国农业银行");
break;
case "08":
setBankName("中国农业银行");
break;
case "09":
setBankName("中国农业银行");
break;
case "10":
setBankName("中国农业银行");
break;
case "11":
setBankName("中国农业银行");
break;
}
}
public boolean validata(String number) {
return number.equals("01") || number.equals("02") || number.equals("03") ||
number.equals("04") || number.equals("05") || number.equals("06") ||
number.equals("07") || number.equals("08") || number.equals("09") ||
number.equals("10") || number.equals("11");
}
public double poundageRate(String number) {
double rate = 0;
if(number.equals("01") || number.equals("02") || number.equals("03") ||number.equals("04")) {
rate = 0.02;
}else if(number.equals("05") || number.equals("06")) {
rate = 0.03;
}else if(number.equals("07") || number.equals("08") || number.equals("09") ||
number.equals("10") || number.equals("11")) {
rate = 0.04;
}
return rate;
}
}

class DataBase {
ArrayList list = new ArrayList<>();

DataBase() {

}

DataBase(ArrayList list) {
this.list = list;
}

public void show() {
for (int i = 0; i < this.list.size(); i++) {
for (int j = 0; j < this.list.get(i).getBank().getAccount().getCardList().size(); j++) {
System.out.println(this.list.get(i).getUserName() + this.list.get(i).getBank().getBankName()
+" " +this.list.get(i).getBank().getAccount().getAccountName()
+ " "+this.list.get(i).getBank().getAccount().getAccountBalance()
+ " "+this.list.get(i).getBank().getAccount().getCardList().get(j).getCard());
}

}
}

public boolean validata(String secret, String atm, double money, int j, int k) {
String operate;
ATM Atm = new ATM(atm);
if (this.list.get(j).getBank().getAccount().getCardList().get(k).getKey().equals(secret)) {
if (this.list.get(j).getBank().getBankName().equals(Atm.getBankName())) { // 本行取款

if (this.list.get(j).getBank().getAccount().updateBalanceValidata(money , k)) {
if(this.list.get(j).getBank().getAccount().getCardList().get(k).getCardType().equals("贷记卡") && money > 0) {
if(this.list.get(j).getBank().getAccount().getAccountBalance() < money && this.list.get(j).getBank().getAccount().getAccountBalance() > 0) {
this.list.get(j).getBank().getAccount().updateBalance((money - this.list.get(j).getBank().getAccount().getAccountBalance())*0.05 + money);

}else if(this.list.get(j).getBank().getAccount().getAccountBalance() < 0) {
this.list.get(j).getBank().getAccount().updateBalance(money * 1.05);
}else {
this.list.get(j).getBank().getAccount().updateBalance(money);
}

}else {
this.list.get(j).getBank().getAccount().updateBalance(money);
}

if(money>0) {
operate = new String("取款");
}else {
operate = new String("存款");
}
System.out.printf("业务:" + operate + " " + this.list.get(j).getUserName() + "在" + Atm.getBankName()
+ "的" + atm + "号ATM机上"+operate+"¥%.2f\n", Math.abs(money));
System.out.printf("当前余额为¥%.2f\n",this.list.get(j).getBank().getAccount().getAccountBalance());

} else {
System.out.println("Sorry,your account balance is insufficient.");
return false;
}
} else {// 跨行取款
//System.out.println("Sorry,cross-bank withdrawal is not supported.");
double rate = Atm.poundageRate(atm);
double ratemoney = 0;
if(money > 0) {
ratemoney += money*rate;
}

if (this.list.get(j).getBank().getAccount().updateBalanceValidata(money + ratemoney , k)) {
if(this.list.get(j).getBank().getAccount().getCardList().get(k).getCardType().equals("贷记卡") && money > 0) {
if(this.list.get(j).getBank().getAccount().getAccountBalance() < money + ratemoney && this.list.get(j).getBank().getAccount().getAccountBalance() > 0) {
this.list.get(j).getBank().getAccount().updateBalance((money - this.list.get(j).getBank().getAccount().getAccountBalance())*0.05 + money + ratemoney);

}else if(this.list.get(j).getBank().getAccount().getAccountBalance() < 0){
this.list.get(j).getBank().getAccount().updateBalance(money*1.05 + ratemoney);

}else {
this.list.get(j).getBank().getAccount().updateBalance(money + ratemoney);
}
}else {
this.list.get(j).getBank().getAccount().updateBalance(money);
}

if(money>0) {
operate = new String("取款");
}else {
operate = new String("存款");
}
System.out.printf("业务:" + operate + " " + this.list.get(j).getUserName() + "在" + Atm.getBankName()
+ "的" + atm + "号ATM机上"+operate+"¥%.2f\n", Math.abs(money));
System.out.printf("当前余额为¥%.2f\n",this.list.get(j).getBank().getAccount().getAccountBalance());

} else {
System.out.println("Sorry,your account balance is insufficient.");
return false;
}
}
} else {
System.out.println("Sorry,your password is wrong.");
return false;
}
return true;
}
}
`
(2)圈复杂度分析

(3)类图

总结
1、经过多次pta的练习,对于Java语言的编程方式有了更加深入的了解与学习,合理编程可以降低代码的圈复杂度,降低维护成本和提高可读性。因此,掌握常见的数据结构和实用算法;培养良好的企业级编程习惯,是提高自己编程水平和技术的重要部分。

2、对于Java有了更多的理解

3、对Java语言的封装、继承、接口和多态有了更深入的了解,学习了类的正确使用,明白了掌握更多的Java库函数和类可以更好的帮助自己简洁明了用代码解决问题;

4.知识都是主动摄取的,不是被动灌输的,要提前学习Java,这样才能跟上老师的步伐

5.害怕困难是行不通的,应该在过pta题目时寻找快乐,不能有惧怕困难的心理,在今后的题目集中直接迎难而上

posted @ 2021-12-18 22:00  辰新  阅读(65)  评论(0)    收藏  举报