pta纠错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:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
  2. 排序后的各图形类型及面积,格式同排序前的输出;
  3. 所有图形的面积总和,格式为Sum of area:总面积值

输入样例1:

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

1 5 3 2 0
 

输出样例1:

在这里给出相应的输出。例如:

Wrong Format
 

输入样例2:

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

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5
 

输出样例2:

在这里给出相应的输出。例如:

The original list:
Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 
The sorted list:
Circle:98.52 Triangle:4.02 Rectangle:3.22 Trapezoid:1.14 
Sum of area:106.91
 

输入样例3:

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

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 8.4
 

输出样例3:

在这里给出相应的输出。例如:

Wrong Format

代码实现:

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

public class Main {

//在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
//使用Main.input.next…即可(避免采坑)
public static Scanner inpute = new Scanner(System.in);
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
int num = inpute.nextInt();
if(num<0) {
System.out.println("Wrong Format");
System.exit(0);
}
while(num != 0){
if(num < 0 || num > 4){
System.out.println("Wrong Format");
System.exit(0);
}
list.add(num);
num = inpute.nextInt();
}

DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
dealCardList.showResult();
inpute.close();
}
}
class Card implements Comparable<Card>{
private Shape shape;
Card(){

}
Card(Shape shape){
this.setShape(shape);
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
@Override
public int compareTo(Card o) {
Shape one=o.getShape();
if(shape.getArea()<one.getArea())
return 1;
else
return -1;
}
}
abstract class Shape{
private String name;
Shape(){

}
Shape(String name){
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract double getArea();
public abstract boolean validate();
public String toString() {
Formatter formatter = new Formatter();
formatter.format("%.2f", this.getArea());
String str=formatter.toString();
return name+":"+str;
}
}
class Triangle extends Shape{
double a=0,b=0,c=0;
Triangle (){

}
Triangle(double a,double b,double c){
this.a=a;
this.b=b;
this.c=c;
}
@Override
public double getArea() {
double d=(a+b+c)/2;
return Math.sqrt(d*(d-a)*(d-b)*(d-c));
}
@Override
public boolean validate() {
if(a<=0||b<=0||c<=0||(a+b)<=c||(a+c)<=b||(b+c)<=a)
return false;
else
return true;
}
}
class Rectangle extends Shape{
private double width=0,length=0;
Rectangle(){

}
Rectangle(double width,double length){
this.setWidth(width);
this.setLength(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;
}
@Override
public boolean validate() {
if(width>0&&length>0)
return true;
else
return false;
}
@Override
public double getArea() {
return width*length;
}
}
class Circle extends Shape{
private double radius=0;

public double getRadius() {
return radius;
}

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

}
Circle(double radius){
this.radius=radius;
}
@Override
public boolean validate() {
if(radius>0)
return true;
else
return false;
}
@Override
public double getArea() {
return Math.PI*radius*radius;
}
}
class Trapezoid extends Shape{
private double top=0,bottom=0,height=0;
Trapezoid(){

}
Trapezoid(double top,double bottom,double height){
this.top=top;
this.bottom=bottom;
this.height=height;
}
@Override
public boolean validate() {
if(top>0&&bottom>0&&height>0)
return true;
else
return false;
}
@Override
public double getArea() {
return (bottom+top)*height/2;
}
}
class DealCardList{
private boolean isvalid=true;
private ArrayList<Card> list=new ArrayList<>();
DealCardList(){

}
DealCardList(ArrayList<Integer> list){
int i=0,x=0;
while(i<list.size()) {
x=list.get(i);
switch (x){
case 1:{
double radius=Main.inpute.nextDouble();
Shape circle=new Circle(radius);
isvalid=circle.validate();
circle.setName("Circle");
Card card=new Card(circle);
this.list.add(card);

}break;
case 2:{
double heigth=Main.inpute.nextDouble();
double length=Main.inpute.nextDouble();
Shape rectangle =new Rectangle(heigth,length);
isvalid=rectangle.validate();
rectangle.setName("Rectangle");
Card card=new Card(rectangle);
this.list.add(card);
}break;
case 3:{
double a=Main.inpute.nextDouble();
double b=Main.inpute.nextDouble();
double c=Main.inpute.nextDouble();
Shape triangle=new Triangle(a,b,c);
isvalid=triangle.validate();
triangle.setName("Triangle");
Card card=new Card(triangle);
this.list.add(card);
}break;
case 4:{
double top=Main.inpute.nextDouble();
double bottom=Main.inpute.nextDouble();
double height=Main.inpute.nextDouble();
Shape trapezoid =new Trapezoid(top,bottom,height);
isvalid=trapezoid.validate();
trapezoid.setName("Trapezoid");
Card card=new Card(trapezoid);
this.list.add(card);
}break;
default:System.out.println("Wrong Farmat");
}
i++;
}
}
public boolean validate() {
if(isvalid)
return true;
else
return false;
}
public void showResult(){
int i=0,j=0;
System.out.println("The original list:");
while(j<list.size()) {
Card one =list.get(j);
Shape two=one.getShape();
System.out.print(two+" ");
j++;
}
System.out.println();
System.out.println("The sorted list:");
Collections.sort(list);
double sum=0;
while(i<list.size()) {
Card one =list.get(i);
Shape two=one.getShape();
sum+=two.getArea();
System.out.print(two+" ");
i++;
}
System.out.println();
System.out.printf("Sum of area:%.2f",sum);
System.out.println();
}
}题目要求:

7-2 图形卡片分组游戏 (60 分)
 

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

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

输入格式:

  • 在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:1 3 4 2 1 3 4 2 1 3 0
  • 根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。

输出格式:

  • 如果图形数量非法(<=0)或图形属性值非法(数值<0以及三角形三边不能组成三角形),则输出Wrong Format
  • 如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
  1. 排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
  2. 输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
  3. 各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
  4. 各组中面积之和的最大值输出,格式为The max area:面积值

输入样例1:

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

1 5 3 2 0
 

输出样例1:

在这里给出相应的输出。例如:

Wrong Format
 

输入样例2:

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

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5
 

输出样例2:

在这里给出相应的输出。例如:

The original list:
[Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 ]
The Separated List:
[Circle:98.52 ][Rectangle:3.22 ][Triangle:4.02 ][Trapezoid:1.14 ]
The Separated sorted List:
[Circle:98.52 ][Rectangle:3.22 ][Triangle:4.02 ][Trapezoid:1.14 ]
The max area:98.52
 

输入样例3:

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

2 1 2 1 1 3 3 4 4 1 1 1 2 1 0
2.3 3.5 2.5 4.5 2.1 2.6 8.5 3.2 3.1 3.6 8.5 7.5 9.1245 6.5 3.4 10.2 11.2 11.6 15.4 5.8 2.13 6.2011 2.5 6.4 18.65
 

输出样例3:

在这里给出相应的输出。例如:

The original list:
[Rectangle:8.05 Circle:19.63 Rectangle:9.45 Circle:21.24 Circle:226.98 Triangle:4.65 Triangle:29.80 Trapezoid:50.49 Trapezoid:175.56 Circle:105.68 Circle:14.25 Circle:120.81 Rectangle:16.00 Circle:1092.72 ]
The Separated List:
[Circle:19.63 Circle:21.24 Circle:226.98 Circle:105.68 Circle:14.25 Circle:120.81 Circle:1092.72 ][Rectangle:8.05 Rectangle:9.45 Rectangle:16.00 ][Triangle:4.65 Triangle:29.80 ][Trapezoid:50.49 Trapezoid:175.56 ]
The Separated sorted List:
[Circle:1092.72 Circle:226.98 Circle:120.81 Circle:105.68 Circle:21.24 Circle:19.63 Circle:14.25 ][Rectangle:16.00 Rectangle:9.45 Rectangle:8.05 ][Triangle:29.80 Triangle:4.65 ][Trapezoid:175.56 Trapezoid:50.49 ]
The max area:1601.31
 

输入样例4:

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

1 1 3 0
6.5 12.54 3.6 5.3 6.4
 

输出样例4:

在这里给出相应的输出。例如:

The original list:
[Circle:132.73 Circle:494.02 Triangle:9.54 ]
The Separated List:
[Circle:132.73 Circle:494.02 ][][Triangle:9.54 ][]
The Separated sorted List:
[Circle:494.02 Circle:132.73 ][][Triangle:9.54 ][]
The max area:626.75
代码实现:

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

public class Main {

//在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
//使用Main.input.next…即可(避免采坑)
public static Scanner inpute = new Scanner(System.in);
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
int num = inpute.nextInt();
if(num<=0) {
System.out.print("Wrong Format");
System.exit(0);
}
while(num != 0){
if(num < 0 || num > 4){
System.out.print("Wrong Format");
System.exit(0);
}
list.add(num);
num = inpute.nextInt();
}

DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
dealCardList.showResult();
inpute.close();
}
}
class Card implements Comparable<Card>{
private Shape shape;
Card(){

}
Card(Shape shape){
this.setShape(shape);
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
@Override
public int compareTo(Card o) {
Shape one=o.getShape();
if(shape.getArea()<one.getArea())
return 1;
else
return -1;
}
@Override
public String toString() {
Formatter formatter = new Formatter();
formatter.format(shape.getName()+":%.2f ", shape.getArea());
String str=formatter.toString();
return str;
}
}
abstract class Shape{
private String name;
Shape(){

}
Shape(String name){
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract double getArea();
public abstract boolean validate();
public String toString() {
Formatter formatter = new Formatter();
formatter.format("%.2f", this.getArea());
String str=formatter.toString();
return name+":"+str;
}
}
class Triangle extends Shape{
double a=0,b=0,c=0;
Triangle (){

}
Triangle(double a,double b,double c){
this.a=a;
this.b=b;
this.c=c;
}
@Override
public double getArea() {
double d=(a+b+c)/2;
return Math.sqrt(d*(d-a)*(d-b)*(d-c));
}
@Override
public boolean validate() {
if(a<=0||b<=0||c<=0||(a+b)<=c||(a+c)<=b||(b+c)<=a)
return false;
else
return true;
}
}
class Rectangle extends Shape{
private double width=0,length=0;
Rectangle(){

}
Rectangle(double width,double length){
this.setWidth(width);
this.setLength(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;
}
@Override
public boolean validate() {
if(width>0&&length>0)
return true;
else
return false;
}
@Override
public double getArea() {
return width*length;
}
}
class Circle extends Shape{
private double radius=0;

public double getRadius() {
return radius;
}

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

}
Circle(double radius){
this.radius=radius;
}
@Override
public boolean validate() {
if(radius>0)
return true;
else
return false;
}
@Override
public double getArea() {
return Math.PI*radius*radius;
}
}
class Trapezoid extends Shape{
private double top=0,bottom=0,height=0;
Trapezoid(){

}
Trapezoid(double top,double bottom,double height){
this.top=top;
this.bottom=bottom;
this.height=height;
}
@Override
public boolean validate() {
if(top>0&&bottom>0&&height>0)
return true;
else
return false;
}
@Override
public double getArea() {
return (bottom+top)*height/2;
}
}
class DealCardList{
private boolean isvalid=true;
private ArrayList<Card> list=new ArrayList<>();
DealCardList(){

}
DealCardList(ArrayList<Integer> list){
int i=0,x=0;
while(i<list.size()) {
x=list.get(i);
switch (x){
case 1:{
double radius=Main.inpute.nextDouble();
Shape circle=new Circle(radius);
isvalid=circle.validate();
circle.setName("Circle");
Card card=new Card(circle);
this.list.add(card);

}break;
case 2:{
double heigth=Main.inpute.nextDouble();
double length=Main.inpute.nextDouble();
Shape rectangle =new Rectangle(heigth,length);
isvalid=rectangle.validate();
rectangle.setName("Rectangle");
Card card=new Card(rectangle);
this.list.add(card);
}break;
case 3:{
double a=Main.inpute.nextDouble();
double b=Main.inpute.nextDouble();
double c=Main.inpute.nextDouble();
Shape triangle=new Triangle(a,b,c);
isvalid=triangle.validate();
triangle.setName("Triangle");
Card card=new Card(triangle);
this.list.add(card);
}break;
case 4:{
double top=Main.inpute.nextDouble();
double bottom=Main.inpute.nextDouble();
double height=Main.inpute.nextDouble();
Shape trapezoid =new Trapezoid(top,bottom,height);
isvalid=trapezoid.validate();
trapezoid.setName("Trapezoid");
Card card=new Card(trapezoid);
this.list.add(card);
}break;
default:System.out.print("Wrong Farmat");
}
i++;
}
}
public boolean validate() {
if(isvalid)
return true;
else
return false;
}
public void showResult(){
int i=0;
ArrayList<Card> list1=new ArrayList<>();
ArrayList<Card> list2=new ArrayList<>();
ArrayList<Card> list3=new ArrayList<>();
ArrayList<Card> list4=new ArrayList<>();
System.out.println("The original list:");
System.out.print("[");
while(i<list.size()) {
Card one=list.get(i);
Shape two=one.getShape();
System.out.printf(two.getName()+":%.2f ",two.getArea());
if(two.getName().equals("Circle"))
list1.add(one);
else if(two.getName().equals("Rectangle"))
list2.add(one);
else if(two.getName().equals("Triangle"))
list3.add(one);
else
list4.add(one);
i++;
}
System.out.println("]");
System.out.println("The Separated List:");
shuchu(list1);
shuchu(list2);
shuchu(list3);
shuchu(list4);
Collections.sort(list1);
Collections.sort(list2);
Collections.sort(list3);
Collections.sort(list4);
System.out.println();
System.out.println("The Separated sorted List:");
double num1=shuchu(list1);
double num2=shuchu(list2);
double num3=shuchu(list3);
double num4=shuchu(list4);
double [] arry= {num1,num2,num3,num4};
double max=0;
for(double v:arry) {
if(v>max)
max=v;
}
System.out.println();
System.out.printf("The max area:%.2f",max);
}
public double shuchu(ArrayList<Card> list) {
double sum=0;
System.out.print("[");
for(Card v:list) {
sum+=v.getShape().getArea();
System.out.print(v);
}
System.out.print("]");
return sum;
}
}

题目要求:

7-1 ATM机类结构设计(一) (100 分)
 

设计ATM仿真系统,具体要求参见作业说明。 OO作业8-1题目说明.pdf

输入格式:

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

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

输出格式:

①输入错误处理

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

②取款业务输出

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

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

当前余额为¥[金额]

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

③存款业务输出

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

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

当前余额为¥[金额]

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

④查询余额业务输出

¥[金额]

金额保留两位小数。

输入样例1:

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

6222081502001312390 88888888 06 -500.00
#
 

输出样例1:

在这里给出相应的输出。例如:

张无忌在中国工商银行的06号ATM机上存款¥500.00
当前余额为¥10500.00
 

输入样例2:

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

6217000010041315709  88888888 02 3500.00
#
 

输出样例2:

在这里给出相应的输出。例如:

杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥6500.00
 

输入样例3:

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

6217000010041315715
#
 

输出样例3:

在这里给出相应的输出。例如:

¥10000.00
 

输入样例4:

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

6222081502001312390 88888888 06 -500.00
6222081502051320786 88888888 06 1200.00
6217000010041315715 88888888 02 1500.00
6217000010041315709  88888888 02 3500.00
6217000010041315715
#
 

输出样例4:

在这里给出相应的输出。例如:

张无忌在中国工商银行的06号ATM机上存款¥500.00
当前余额为¥10500.00
韦小宝在中国工商银行的06号ATM机上取款¥1200.00
当前余额为¥8800.00
杨过在中国建设银行的02号ATM机上取款¥1500.00
当前余额为¥8500.00
杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥5000.00
¥5000.00
代码实现:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
static ArrayList<User> list=initial(); // list : 初始化,创建所有人的卡号
public static void main(String[] args) {
Main one=new Main();
one.Output(one.Inpute());

}
public void Output(ArrayList<String> list1) { //list1: 6222081502001312390 88888888 06 -500.00
for(int i=0;i<list1.size();i++) {
String str=list1.get(i);
String [] arry=str.split(" ");
for(int j=0;j<list.size();j++) {
User user=list.get(j);
ArrayList<String> list3=user.getList();
for(int z=0;z<list3.size();z++) {
if(arry[0].equals(list3.get(z))) {
if(arry.length==1) {
System.out.printf("¥%.2f",user.getMoney());
break;
}
double num=Double.parseDouble(arry[3]);
if(num<0) {
System.out.printf(user.getName()+"在"+user.getBankname()+"的"+arry[2]+"号ATM机上存款¥%.2f",-num);
user.setMoney(user.getMoney()-num);
System.out.println();
System.out.printf("当前余额为¥%.2f\n",user.getMoney());
break;
}
else {
System.out.printf(user.getName()+"在"+user.getBankname()+"的"+arry[2]+"号ATM机上取款¥%.2f",num);
user.setMoney(user.getMoney()-num);
System.out.println();
System.out.printf("当前余额为¥%.2f\n",user.getMoney());
break;
}
}
}
}
}
}
public ArrayList<String> Inpute() {
ArrayList<String> list=new ArrayList<>();
Scanner inpute=new Scanner(System.in);
while(inpute.hasNext()) {
String str=inpute.nextLine();
str=str.replaceAll("\\s+"," ");
if(str.equals("#"))
break;
if(isvalue(str)) {
list.add(str);
}
else
break;
}
return list;
}

public boolean isvalue(String str) {
ArrayList<String> list1;

// Pattern p1=Pattern.compile("(\\d{19})( )(8{8})( )(0[1-6])( )((10000|\\d{0,4})|(\\-\\d+))");
//6222081502001312390 88888888 06 -500.00
String [] arry=str.split(" ");
boolean flag=false; //判断账号
boolean enoughmoney=false;
boolean correctATM=false;
if(arry.length==1)
return true;
lableA:
for(int i=0;i<list.size();i++) {
User user=list.get(i);
list1=user.getList();
for(int j=0;j<list1.size();j++) {
String str1=list1.get(j);
if(arry[0].equals(str1)) {

flag=true;
//判断金钱是否正确
{
double num=Double.parseDouble(arry[3]);
if(num<0)
enoughmoney=true;
else
if(num>user.getMoney())
enoughmoney=false;
else
enoughmoney=true;
}
//判断ATM机是否正确
{
int num=Integer.parseInt(arry[2]);
String str2=arry[0].substring(0, 3);
if(str2.equals("621")) {
if(num==01||num==02||num==03||num==04) {
correctATM=true;
}
}
else {
if(num==05||num==06)
correctATM=true;
}
}
break lableA;
}
}
}

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

Pattern p2=Pattern.compile("0([1-6])");
Matcher m2=p2.matcher(arry[2]);
if(!m2.find()) {
//System.out.println();
System.out.println("Sorry,the ATM's id is wrong.");
return false;
}

if(!arry[1].equals("88888888")) {
//System.out.println();
System.out.println("Sorry,your password is wrong.");
return false;
}

if(enoughmoney==false) {
//System.out.println();
System.out.println("Sorry,your account balance is insufficient.");
return false;
}

if(correctATM==false) {
//System.out.println();
System.out.println("Sorry,cross-bank withdrawal is not supported.");
return false;
}

return true;
}

public static ArrayList<User> initial() {
ArrayList<User> list=new ArrayList<>();
User usr1=new User("杨过","6217000010041315709","中国建设银行");
usr1.addo("6217000010041315715");
list.add(usr1);

list.add(new User("杨过","6217000010041315718","中国建设银行"));//单独

list.add(new User("郭靖","6217000010051320007","中国建设银行"));
User usr2=new User("张无忌","6222081502001312389","中国工商银行");
usr2.addo("6222081502001312390");
list.add(usr2);
User usr3=new User("张无忌","6222081502001312399","中国工商银行");
usr3.addo("6222081502001312400");
list.add(usr3);
User usr4=new User("韦小宝","6222081502051320785","中国工商银行");
usr4.addo("6222081502051320786");
list.add(usr4);
return list;
}
}
class User{
private String bankname;
private String name;
private double money=10000;
private ArrayList<String> list1=new ArrayList<>();
private int passcord=88888888;
User(String name,String count,String bankname){
this.name=name;
list1.add(count);
this.bankname=bankname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void addo(String count) {
list1.add(count);
}
public ArrayList<String> getList() {
return list1;
}
public void setList(ArrayList<String> list) {
this.list1 = list;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getBankname() {
return bankname;
}
public void setBankname(String bankname) {
this.bankname = bankname;
}
}

题目要求:

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编号]上取款¥[金额]

当前余额为¥[金额]

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

③查询余额业务输出

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

金额保留两位小数。

输入样例1:

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

6222081502001312390 88888888 06 500.00
#
 

输出样例1:

在这里给出相应的输出。例如:

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

输入样例2:

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

6217000010041315709  88888888 06 3500.00
#
 

输出样例2:

在这里给出相应的输出。例如:

业务:取款 杨过在中国工商银行的06号ATM机上取款¥3500.00
当前余额为¥6395.00
 

输入样例3:

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

6217000010041315715
#
 

输出样例3:

在这里给出相应的输出。例如:

业务:查询余额 ¥10000.00
 

输入样例4:

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

6222081502001312390 88888888 01 500.00
6222081502051320786 88888888 06 1200.00
6217000010041315715 88888888 02 1500.00
6217000010041315709  88888888 02 3500.00
6217000010041315715
#
 

输出样例4:

在这里给出相应的输出。例如:

业务:取款 张无忌在中国建设银行的01号ATM机上取款¥500.00
当前余额为¥9490.00
业务:取款 韦小宝在中国工商银行的06号ATM机上取款¥1200.00
当前余额为¥8800.00
业务:取款 杨过在中国建设银行的02号ATM机上取款¥1500.00
当前余额为¥8500.00
业务:取款 杨过在中国建设银行的02号ATM机上取款¥3500.00
当前余额为¥5000.00
业务:查询余额 ¥5000.00
 

输入样例5:

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

6640000010045442002 88888888 09 3000
6640000010045442002 88888888 06 8000
6640000010045442003 88888888 01 10000
6640000010045442002
#
 

输出样例5:

在这里给出相应的输出。例如:

业务:取款 张三丰在中国农业银行的09号ATM机上取款¥3000.00
当前余额为¥6880.00
业务:取款 张三丰在中国工商银行的06号ATM机上取款¥8000.00
当前余额为¥-1416.00
业务:取款 张三丰在中国建设银行的01号ATM机上取款¥10000.00
当前余额为¥-11916.00
业务:查询余额 ¥-11916.00
代码实现:

import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Bank ICBC = new Bank("中国工商银行", 0.03);
Bank CCB = new Bank("中国建设银行", 0.02);
Bank NCBC = new Bank("中国农业银行", 0.04);
Bank.banks.add(ICBC);
Bank.banks.add(CCB);
Bank.banks.add(NCBC);
CCB.atm.add(new Atm("01", CCB));
CCB.atm.add(new Atm("02", CCB));
CCB.atm.add(new Atm("03", CCB));
CCB.atm.add(new Atm("04", CCB));
ICBC.atm.add(new Atm("05", ICBC));
ICBC.atm.add(new Atm("06", ICBC));
NCBC.atm.add(new Atm("07", NCBC));
NCBC.atm.add(new Atm("08", NCBC));
NCBC.atm.add(new Atm("09", NCBC));
NCBC.atm.add(new Atm("10", NCBC));
NCBC.atm.add(new Atm("11", NCBC));
User user1 = new User("杨过");
User user2 = new User("郭靖");
User user3 = new User("张无忌");
User user4 = new User("韦小宝");
User user5 = new User("张三丰");
User user6 = new User("令狐冲");
User user7 = new User("乔峰");
User user8 = new User("洪七公");
Account account1 = new Account("3217000010041315709", 10000.00, CCB, user1, "借记账号");
Account account2 = new Account("3217000010041315715", 10000.00, CCB, user1, "借记账号");
Account account3 = new Account("3217000010051320007", 10000.00, CCB, user2, "借记账号");
Account account4 = new Account("3222081502001312389", 10000.00, ICBC, user3, "借记账号");
Account account5 = new Account("3222081502001312390", 10000.00, ICBC, user3, "借记账号");
Account account6 = new Account("3222081502001312399", 10000.00, ICBC, user3, "借记账号");
Account account7 = new Account("3222081502051320785", 10000.00, ICBC, user4, "借记账号");
Account account8 = new Account("3222081502051320786", 10000.00, ICBC, user4, "借记账号");
Account account9 = new Account("3640000010045442002", 10000.00, CCB, user5, "贷记账号");
Account account10 = new Account("3640000010045441009", 10000.00, ICBC, user6, "贷记账号");
Account account11 = new Account("3630000010033431001", 10000.00, NCBC, user7, "贷记账号");
Account account12 = new Account("3630000010033431008", 10000.00, NCBC, user8, "贷记账号");
Card card1 = new Card("6217000010041315709", "88888888", account1);
Card card2 = new Card("6217000010041315715", "88888888", account1);
Card card3 = new Card("6217000010041315718", "88888888", account2);
Card card4 = new Card("6217000010051320007", "88888888", account3);
Card card5 = new Card("6222081502001312389", "88888888", account4);
Card card6 = new Card("6222081502001312390", "88888888", account5);
Card card7 = new Card("6222081502001312399", "88888888", account6);
Card card8 = new Card("6222081502001312400", "88888888", account6);
Card card9 = new Card("6222081502051320785", "88888888", account7);
Card card10 = new Card("6222081502051320786", "88888888", account8);
Card card11 = new Card("6640000010045442002", "88888888", account9);
Card card12 = new Card("6640000010045442003", "88888888", account9);
Card card13 = new Card("6640000010045441009", "88888888", account10);
Card card14 = new Card("6630000010033431001", "88888888", account11);
Card card15 = new Card("6630000010033431008", "88888888", account12);
account1.cards.put(card1.getCardNumber(), card1);
account1.cards.put(card2.getCardNumber(), card2);
account2.cards.put(card3.getCardNumber(), card3);
account3.cards.put(card4.getCardNumber(), card4);
account4.cards.put(card5.getCardNumber(), card5);
account5.cards.put(card6.getCardNumber(), card6);
account6.cards.put(card7.getCardNumber(), card7);
account6.cards.put(card8.getCardNumber(), card8);
account7.cards.put(card9.getCardNumber(), card9);
account8.cards.put(card10.getCardNumber(), card10);
account9.cards.put(card11.getCardNumber(), card11);
account9.cards.put(card12.getCardNumber(), card12);
account10.cards.put(card13.getCardNumber(), card13);
account11.cards.put(card14.getCardNumber(), card14);
account12.cards.put(card15.getCardNumber(), card15);
CCB.account.add(account1);
CCB.account.add(account2);
CCB.account.add(account3);
ICBC.account.add(account4);
ICBC.account.add(account5);
ICBC.account.add(account6);
ICBC.account.add(account7);
ICBC.account.add(account8);
NCBC.account.add(account9);
NCBC.account.add(account10);
NCBC.account.add(account11);
NCBC.account.add(account12);
user1.accounts.add(account1);
user1.accounts.add(account2);
user2.accounts.add(account3);
user3.accounts.add(account4);
user3.accounts.add(account5);
user3.accounts.add(account6);
user4.accounts.add(account7);
user4.accounts.add(account8);
user5.accounts.add(account9);
user6.accounts.add(account10);
user7.accounts.add(account11);
user8.accounts.add(account12);
for (Bank bank : Bank.banks) {
Atm.atms.addAll(bank.atm);
Account.accounts.addAll(bank.account);
for (Account account : bank.account) {
Card.cards.addAll(account.cards.values());
}
}


String str = input.nextLine();
while (!str.equals("#")) {
String[] opt = str.split("\\s+");
Deal deal = new Deal(opt);
deal.deal();
str = input.nextLine();
}
}

}

class Deal {
private String[] str;
private String userName = "";
private String accountBankName = "";
private Bank atmBank;
private double balance;
private Card card;

Deal(String[] str) {
this.str = str;
}

public void deal() {
if (!validCardNumber()) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}
if (str.length == 1) {
System.out.printf("业务:查询余额 ¥%.2f\n", balance);
} else {
if (!validAtm()) {
System.out.println("Sorry,the ATM's id is wrong.");
System.exit(0);
}
if (!validPassword()) {
System.out.println("Sorry,your password is wrong.");
System.exit(0);
}
double changeBalance = Double.parseDouble(str[3]);
double rateMoney = 0;
if (changeBalance > 0 && !accountBankName.equals(atmBank.getName()))
rateMoney = changeBalance * atmBank.getRate();
//System.out.println(rateMoney);
if (!card.getAccount().changeBalance(changeBalance)) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
//double balanceNow = card.getAccount().getBalance();
balance = card.getAccount().getBalance();
card.getAccount().setBalance(balance - rateMoney);
balance = card.getAccount().getBalance();
if (card.getAccount().getType().equals("借记账号") && balance < 0 || balance <= -50000) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
/*
if (!atmBankName.equals(accountBankName)) {
System.out.println("Sorry,cross-bank withdrawal is not supported.");
System.exit(0);
}
*/
String optType = changeBalance > 0 ? "取款" : "存款";
str[3] = str[3].charAt(0) == '-' ? str[3].substring(1) : str[3];
String dot = str[3].contains(".00") ? "" : ".00";
System.out.println("业务:" + optType + " "
+ userName + "在" + atmBank.getName() + "的" + str[2] + "号ATM机上" + optType + "¥" + str[3] + dot);
System.out.printf("当前余额为¥%.2f\n", card.getAccount().getBalance());
}
}

public boolean validCardNumber() {
for (Account account : Account.accounts) {
//System.out.println(str[0]);
//System.out.println(account.cards.keySet());
if (account.cards.containsKey(str[0])) {
userName = account.getUser().getName();
accountBankName = account.getBankName();
balance = account.getBalance();
return true;
}
}
return false;
}

public boolean validAtm() {
for (Atm atm : Atm.atms) {
if (atm.getId().equals(str[2])) {
atmBank = atm.getBank();
return true;
}
}
return false;
}

public boolean validPassword() {
for (Card card : Card.cards) {
if (card.getCardNumber().equals(str[0]) && card.getPassWord().equals(str[1])) {
this.card = card;
return true;
}
}
return false;
}

}

class Bank {
private String name;
private double rate;

Bank(String name, double rate) {
this.name = name;
this.rate = rate;
}

public double getRate() {
return rate;
}

public void setRate(double rate) {
this.rate = rate;
}

public String getName() {
return name;
}

public static ArrayList<Bank> banks = new ArrayList<>();
public ArrayList<Atm> atm = new ArrayList<>();
public ArrayList<Account> account = new ArrayList<>();
//public ArrayList<User> users = new ArrayList<>();

}

class Atm {
public static ArrayList<Atm> atms = new ArrayList<>();
private String id;
private Bank bank;

Atm(String id, Bank bank) {
this.id = id;
this.bank = bank;
}

public String getBankName() {
return bank.getName();
}

public Bank getBank() {
return bank;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

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

}

class User {
private String name;
public ArrayList<Account> accounts = new ArrayList<>();
public static ArrayList<User> users = new ArrayList<>();

User(String name) {
this.name = name;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

}

class Account {
public static ArrayList<Account> accounts = new ArrayList<>();
public Map<String, Card> cards = new HashMap<>();
private String type;
private User user;
private String number;
private Bank bank;
private double balance;

Account(String number, double balance, Bank bank, User user, String type) {
this.number = number;
this.bank = bank;
this.user = user;
this.balance = balance;
this.type = type;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

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

public String getBankName() {
return bank.getName();
}

public void setUser(User user) {
this.user = user;
}

public User getUser() {
return user;
}

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}

public boolean changeBalance(double x) {
if (x > balance) {
if (type.equals("借记账号"))
return false;
else {
double rateMoney = (x - Math.max(0, balance)) * 0.05;
if (balance - rateMoney - x < -50000)
return false;
balance -= rateMoney;
}
}
balance -= x;
return true;
}

}

class Card {
public static ArrayList<Card> cards = new ArrayList<>();
private String cardNumber;
private String passWord;
private Account account;


Card(String cardNumber, String passWord, Account account) {
this.cardNumber = cardNumber;
this.passWord = passWord;
this.account = account;
}

public String getCardNumber() {
return cardNumber;
}

public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}

public String getPassWord() {
return passWord;
}

public void setPassWord(String passWord) {
this.passWord = passWord;
}

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

public Account getAccount() {
return account;
}

}

posted @ 2021-06-10 21:29  LordFiber  阅读(69)  评论(0)    收藏  举报