第三次作业总结
一、作业总结
第七次作业两题差别不大,写完第一题稍加修改就能完成第二题,主要涉及类的继承、多态性使用方法以及接口的应用。
第八次,第九次作业均为ATM机的设计,第九次需求更多不过只需少量修改即可,主要难点在于ATM机类的设计
二、设计与分析
第七次作业第一题
输入格式:
- 首先,在一行上输入一串数字(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:总面积值。
类图如下

可以看到Card类实现了Comparable接口,用于对各图形排序规则的确定。
源码如下
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
abstract class Shape {
public Shape()
{
}
public Shape(String shapeName) {
super();
this.shapeName = shapeName;
}
private String shapeName;
abstract double getArea();
abstract boolean validate();
public String toString()
{
return this.getClass().getSimpleName();
}
/**
* @return shapeName
*/
public String getShapeName() {
return shapeName;
}
/**
* @param shapeName 要设置的 shapeName
*/
public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
}
class Circle extends Shape {
public Circle()
{
}
public Circle(double radius) {
super();
this.radius = radius;
}
private double radius;
/**
* @return radius
*/
public double getRadius() {
return radius;
}
/**
* @param radius 要设置的 radius
*/
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea()
{
return Math.PI*this.radius*this.radius;
}
@Override
boolean validate() {
// TODO 自动生成的方法存根
if(this.radius<=0)
return false;
return true;
}
}
class Rectangle extends Shape{
public Rectangle()
{
}
public Rectangle(double width, double length) {
super();
this.width = width;
this.length = length;
}
private double width;
private double length;
/**
* @return width
*/
public double getWeight() {
return width;
}
/**
* @param width 要设置的 width
*/
public void setWeight(double width) {
this.width = width;
}
/**
* @return length
*/
public double getLength() {
return length;
}
/**
* @param length 要设置的 length
*/
public void setLength(double length) {
this.length = length;
}
public double getArea()
{
return this.length*this.width;
}
@Override
boolean validate() {
// TODO 自动生成的方法存根
if(this.length<=0||this.width<=0)
return false;
return true;
}
}
class Triangle extends Shape{
public Triangle()
{
}
public Triangle(double side1, double side2, double side3) {
super();
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
private double side1;
private double side2;
private double side3;
/**
* @return side1
*/
public double getSide1() {
return side1;
}
/**
* @param side1 要设置的 side1
*/
public void setSide1(double side1) {
this.side1 = side1;
}
/**
* @return side2
*/
public double getSide2() {
return side2;
}
/**
* @param side2 要设置的 side2
*/
public void setSide2(double side2) {
this.side2 = side2;
}
/**
* @return side3
*/
public double getSide3() {
return side3;
}
/**
* @param side3 要设置的 side3
*/
public void setSide3(double side3) {
this.side3 = side3;
}
@Override
double getArea() {
// TODO 自动生成的方法存根
double p=0.5*(side1+side2+side3);
return Math.sqrt((p*(p-side1)*(p-side2)*(p-side3)));
}
@Override
boolean validate() {
// TODO 自动生成的方法存根
if(side1<=0||side2<=0||side3<=0||side1+side2<=side3||side1+side3<=side2||side2+side3<=side1)
return false;
return true;
}
}
class Trapezoid extends Shape {
public Trapezoid()
{
}
public Trapezoid(double topSide, double bottomSide, double height) {
super();
this.topSide = topSide;
this.bottomSide = bottomSide;
this.height = height;
}
private double topSide;
private double bottomSide;
private double height;
@Override
double getArea() {
// TODO 自动生成的方法存根
return (this.topSide+this.bottomSide)*this.height/2;
}
@Override
boolean validate() {
// TODO 自动生成的方法存根
if(this.topSide<=0||this.bottomSide<=0||this.height<=0)
return false;
return true;
}
}
class Card implements Comparable<Card> {
public Card(Shape shape) {
super();
this.shape = shape;
}
private Shape shape;
Card()
{
}
@Override
public int compareTo(Card o) {
// TODO 自动生成的方法存根
if(this.getShape().getArea()>o.getShape().getArea())
return -1;
else if(this.getShape().getArea()<o.getShape().getArea())
return 1;
else
return 0;
}
/**
* @return shape
*/
public Shape getShape() {
return shape;
}
/**
* @param shape 要设置的 shape
*/
public void setShape(Shape shape) {
this.shape = shape;
}
}
class DealCardList {
ArrayList<Card> cardList=new ArrayList<Card>();
DealCardList()
{
}
DealCardList(ArrayList<Integer> list)
{
for(int i:list)
{
switch(i)
{
case 1: double r=Main.input.nextDouble();
Circle c=new Circle(r);
c.setShapeName("Circle");
Card card1=new Card(c);
cardList.add(card1);
break;
case 2: double width=Main.input.nextDouble();
double length=Main.input.nextDouble();
Rectangle rect=new Rectangle(width,length);
rect.setShapeName("Rectangle");
Card card2=new Card(rect);
cardList.add(card2);
break;
case 3: double side1=Main.input.nextDouble();
double side2=Main.input.nextDouble();
double side3=Main.input.nextDouble();
Triangle tri=new Triangle(side1,side2,side3);
tri.setShapeName("Triangle");
Card card3=new Card(tri);
cardList.add(card3);
break;
case 4:double topSide=Main.input.nextDouble();
double bottomSide=Main.input.nextDouble();
double height=Main.input.nextDouble();
Trapezoid tra=new Trapezoid(topSide,bottomSide,height);
tra.setShapeName("Trapezoid");
Card card4=new Card(tra);
cardList.add(card4);
break;
}
}
}
boolean validate()
{
for(Card c:cardList)
{
if(!c.getShape().validate())
return false;
}
return true;
}
void cardSort()
{
Collections.sort(cardList);
}
double getAllArea()
{
double sum=0;
for(Card c:cardList)
{
sum+=c.getShape().getArea();
}
return sum;
}
void showResult()
{
System.out.println("The original list:");
for(Card c:cardList)
{
System.out.print(c.getShape().toString()+":"+String.format("%.2f",c.getShape().getArea())+" ");
}
System.out.println();
System.out.println("The sorted list:");
cardSort();
for(Card c:cardList)
{
System.out.print(c.getShape().toString()+":"+String.format("%.2f",c.getShape().getArea())+" ");
}
System.out.println();
System.out.println("Sum of area:"+String.format("%.2f", getAllArea()));
}
}
public class Main {
//在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
//使用Main.input.next…即可(避免采坑)
public static Scanner input = new Scanner(System.in);
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
int num = input.nextInt();
while(num != 0){
if(num < 0 || num > 4){
System.out.println("Wrong Format");
System.exit(0);
}
list.add(num);
num = input.nextInt();
}
DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
dealCardList.showResult();
input.close();
}
}
第七次作业第二题
输入格式:
- 在一行上输入一串数字(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:面积值。
可以看到与第一题差别在于对图形种类先排序,在每组图形内在按面积排序
类图没有变化,只是部分代码改动
源码如下
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
abstract class Shape {
public Shape()
{
}
public Shape(String shapeName) {
super();
this.shapeName = shapeName;
}
private String shapeName;
abstract double getArea();
abstract boolean validate();
public String toString()
{
return this.getClass().getSimpleName();
}
/**
* @return shapeName
*/
public String getShapeName() {
return shapeName;
}
/**
* @param shapeName 要设置的 shapeName
*/
public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
}
class Circle extends Shape {
public Circle()
{
}
public Circle(double radius) {
super();
this.radius = radius;
}
private double radius;
/**
* @return radius
*/
public double getRadius() {
return radius;
}
/**
* @param radius 要设置的 radius
*/
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea()
{
return Math.PI*this.radius*this.radius;
}
@Override
boolean validate() {
// TODO 自动生成的方法存根
if(this.radius<=0)
return false;
return true;
}
}
class Rectangle extends Shape{
public Rectangle()
{
}
public Rectangle(double width, double length) {
super();
this.width = width;
this.length = length;
}
private double width;
private double length;
/**
* @return width
*/
public double getWeight() {
return width;
}
/**
* @param width 要设置的 width
*/
public void setWeight(double width) {
this.width = width;
}
/**
* @return length
*/
public double getLength() {
return length;
}
/**
* @param length 要设置的 length
*/
public void setLength(double length) {
this.length = length;
}
public double getArea()
{
return this.length*this.width;
}
@Override
boolean validate() {
// TODO 自动生成的方法存根
if(this.length<=0||this.width<=0)
return false;
return true;
}
}
class Triangle extends Shape{
public Triangle()
{
}
public Triangle(double side1, double side2, double side3) {
super();
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
private double side1;
private double side2;
private double side3;
/**
* @return side1
*/
public double getSide1() {
return side1;
}
/**
* @param side1 要设置的 side1
*/
public void setSide1(double side1) {
this.side1 = side1;
}
/**
* @return side2
*/
public double getSide2() {
return side2;
}
/**
* @param side2 要设置的 side2
*/
public void setSide2(double side2) {
this.side2 = side2;
}
/**
* @return side3
*/
public double getSide3() {
return side3;
}
/**
* @param side3 要设置的 side3
*/
public void setSide3(double side3) {
this.side3 = side3;
}
@Override
double getArea() {
// TODO 自动生成的方法存根
double p=0.5*(side1+side2+side3);
return Math.sqrt((p*(p-side1)*(p-side2)*(p-side3)));
}
@Override
boolean validate() {
// TODO 自动生成的方法存根
if(side1<=0||side2<=0||side3<=0||side1+side2<=side3||side1+side3<=side2||side2+side3<=side1)
return false;
return true;
}
}
class Trapezoid extends Shape {
public Trapezoid()
{
}
public Trapezoid(double topSide, double bottomSide, double height) {
super();
this.topSide = topSide;
this.bottomSide = bottomSide;
this.height = height;
}
private double topSide;
private double bottomSide;
private double height;
@Override
double getArea() {
// TODO 自动生成的方法存根
return (this.topSide+this.bottomSide)*this.height/2;
}
@Override
boolean validate() {
// TODO 自动生成的方法存根
if(this.topSide<=0||this.bottomSide<=0||this.height<=0)
return false;
return true;
}
}
class Card implements Comparable<Card> {
public Card(Shape shape) {
super();
this.shape = shape;
}
private Shape shape;
Card()
{
}
@Override
public int compareTo(Card o) {
// TODO 自动生成的方法存根
if(this.getShape().getArea()>o.getShape().getArea())
return -1;
else if(this.getShape().getArea()<o.getShape().getArea())
return 1;
else
return 0;
}
/**
* @return shape
*/
public Shape getShape() {
return shape;
}
/**
* @param shape 要设置的 shape
*/
public void setShape(Shape shape) {
this.shape = shape;
}
}
class DealCardList {
ArrayList<Card> cardList=new ArrayList<Card>();
ArrayList<Card> cardList1=new ArrayList<Card>();
ArrayList<Card> cardList2=new ArrayList<Card>();
ArrayList<Card> cardList3=new ArrayList<Card>();
ArrayList<Card> cardList4=new ArrayList<Card>();
double sum1=0,sum2=0,sum3=0,sum4=0;
DealCardList()
{
}
DealCardList(ArrayList<Integer> list)
{
for(int i:list)
{
switch(i)
{
case 1: double r=Main.input.nextDouble();
Circle c=new Circle(r);
c.setShapeName("Circle");
Card card1=new Card(c);
cardList.add(card1);
cardList1.add(card1);
break;
case 2: double width=Main.input.nextDouble();
double length=Main.input.nextDouble();
Rectangle rect=new Rectangle(width,length);
rect.setShapeName("Rectangle");
Card card2=new Card(rect);
cardList.add(card2);
cardList2.add(card2);
break;
case 3: double side1=Main.input.nextDouble();
double side2=Main.input.nextDouble();
double side3=Main.input.nextDouble();
Triangle tri=new Triangle(side1,side2,side3);
tri.setShapeName("Triangle");
Card card3=new Card(tri);
cardList.add(card3);
cardList3.add(card3);
break;
case 4:double topSide=Main.input.nextDouble();
double bottomSide=Main.input.nextDouble();
double height=Main.input.nextDouble();
Trapezoid tra=new Trapezoid(topSide,bottomSide,height);
tra.setShapeName("Trapezoid");
Card card4=new Card(tra);
cardList.add(card4);
cardList4.add(card4);
break;
}
}
}
boolean validate()
{
for(Card c:cardList)
{
if(!c.getShape().validate())
return false;
}
return true;
}
void cardSort()
{
//Collections.sort(cardList);
Collections.sort(cardList1);
Collections.sort(cardList2);
Collections.sort(cardList3);
Collections.sort(cardList4);
}
double getAllArea(ArrayList<Card> list)
{
double sum=0;
for(Card c:list)
{
sum+=c.getShape().getArea();
}
return sum;
}
void showResult()
{
sum1=getAllArea(cardList1);
sum2=getAllArea(cardList2);
sum3=getAllArea(cardList3);
sum4=getAllArea(cardList4);
ArrayList<Double> sum=new ArrayList<Double>();
sum.add(sum1);
sum.add(sum2);
sum.add(sum3);
sum.add(sum4);
Collections.sort(sum);
System.out.println("The original list:");
printgroup(cardList);
System.out.println();
System.out.println("The Separated List:");
printgroup(cardList1);
printgroup(cardList2);
printgroup(cardList3);
printgroup(cardList4);
cardSort();
System.out.println();
System.out.println("The Separated sorted List:");
printgroup(cardList1);
printgroup(cardList2);
printgroup(cardList3);
printgroup(cardList4);
System.out.println();
System.out.println("The max area:"+String.format("%.2f", sum.toArray()[3]));
//System.out.println("Sum of area:"+String.format("%.2f", getAllArea()));
}
void printgroup(ArrayList<Card> list)
{
System.out.print("[");
for(Card c:list)
{
System.out.print(c.getShape().toString()+":"+String.format("%.2f",c.getShape().getArea())+" ");
}
System.out.print("]");
}
/*
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
*/
}
public class Main {
//在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
//使用Main.input.next…即可(避免采坑)
public static Scanner input = new Scanner(System.in);
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
int num = input.nextInt();
while(num != 0){
if(num < 0 || num > 4){
System.out.println("Wrong Format");
System.exit(0);
}
list.add(num);
num = input.nextInt();
}
DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
if(list.toArray().length!=0)
dealCardList.showResult();
else
System.out.println("Wrong Format");
input.close();
}
}
第八次作业
输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
- 存款、取款功能输入数据格式:
卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。 - 查询余额功能输入数据格式:
卡号
输出格式:
①输入错误处理
- 如果输入卡号不存在,则输出
Sorry,this card does not exist.。 - 如果输入ATM机编号不存在,则输出
Sorry,the ATM's id is wrong.。 - 如果输入银行卡密码错误,则输出
Sorry,your password is wrong.。 - 如果输入取款金额大于账户余额,则输出
Sorry,your account balance is insufficient.。 - 如果检测为跨行存取款,则输出
Sorry,cross-bank withdrawal is not supported.。
②取款业务输出
输出共两行,格式分别为:
[用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
③存款业务输出
输出共两行,格式分别为:
[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
④查询余额业务输出
¥[金额]
金额保留两位小数。
类图如下

源码如下
import java.util.Scanner;
import java.util.ArrayList;
public class Main
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
String str;
StringBuilder sb=new StringBuilder();
str=input.nextLine();
while(!str.equals("#")){
sb.append(str);
sb.append("\n");
str=input.nextLine();
}
input.close();
getDealDataResult(sb);
}
static void getDealDataResult(StringBuilder sb)
{
Data data=new Data();
data.init();
String str1[]=sb.toString().split("\\n");
for(int len=0;len<str1.length;len++)
{
String[] shuju=str1[len].split("\\s+");//输入的每行数据用空格隔开,存为数组
for(int i=0;i<shuju.length;i++)
{
shuju[i].trim();
}
if(shuju.length!=1)
{
if (Check.check(data.accountList,shuju[0],shuju[1],shuju[2],Double.parseDouble(shuju[3])))
{
Deal handel = new Deal(data.accountList,shuju[0], shuju[1],shuju[2],Double.parseDouble(shuju[3]));
handel.handel();
Show.show(data.accountList,shuju[0], shuju[1],shuju[2],Double.parseDouble(shuju[3]));
}
}
else
{
if(Check.check(data.accountList,shuju[0]))
{
Show.show(data.accountList,shuju[0]);
}
}
}
}
}
class Account {
public Account()
{
}
public Account(String userName, String bankAccount,double balance, ArrayList<Bank> banklist, Bank bank, ArrayList<Card> cardList) {
super();
this.userName = userName;
this.bankAccount = bankAccount;
this.balance=balance;
this.banklist = banklist;
this.bank = bank;
this.cardList = cardList;
}
private String userName;
private String bankAccount;
private double balance;
ArrayList<Bank> banklist;
Bank bank;
private ArrayList<Card> cardList;
/**
* @return userName
*/
public String getUserName() {
return userName;
}
/**
* @param userName 要设置的 userName
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* @return bankAccount
*/
public String getBankAccount() {
return bankAccount;
}
/**
* @param bankAccount 要设置的 bankAccount
*/
public void setBankAccount(String bankAccount) {
this.bankAccount = bankAccount;
}
/**
* @return banklist
*/
public ArrayList<Bank> getBanklist() {
return banklist;
}
/**
* @param banklist 要设置的 banklist
*/
public void setBanklist(ArrayList<Bank> banklist) {
this.banklist = banklist;
}
/**
* @return bank
*/
public Bank getBank() {
return bank;
}
/**
* @param bank 要设置的 bank
*/
public void setBank(Bank bank) {
this.bank = bank;
}
/**
* @return cardList
*/
public ArrayList<Card> getCardList() {
return cardList;
}
/**
* @param cardList 要设置的 cardList
*/
public void setCardList(ArrayList<Card> cardList) {
this.cardList = cardList;
}
/**
* @return balance
*/
public double getBalance() {
return balance;
}
/**
* @param balance 要设置的 balance
*/
public void setBalance(double balance) {
this.balance = balance;
}
}
class Bank {
public Bank()
{
}
public Bank(String bankName, ArrayList<String> atmNum) {
super();
this.bankName = bankName;
this.atmNum = atmNum;
}
String bankName;
ArrayList<String> atmNum;
/**
* @return bankName
*/
public String getBankname() {
return bankName;
}
/**
* @param bankName 要设置的 bankName
*/
public void setBankname(String bankName) {
this.bankName = bankName;
}
/**
* @return atmNum
*/
public ArrayList<String> getAtmNum() {
return atmNum;
}
/**
* @param atmNum 要设置的 atmNum
*/
public void setAtmNum(ArrayList<String> atmNum) {
this.atmNum = atmNum;
}
}
class Card {
private String cardNum;
private String password="88888888";
public Card(String cardNum) {
super();
this.cardNum = cardNum;
}
/**
* @return cardNum
*/
public String getCardNum() {
return cardNum;
}
/**
* @param cardNum 要设置的 cardNum
*/
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
/**
* @return password
*/
public String getPassword() {
return password;
}
/**
* @param password 要设置的 password
*/
public void setPassword(String password) {
this.password = password;
}
}
class Check {
public static boolean check(ArrayList<Account> accountList,String cardNum)
{
int flag=0;
for(int i=0;i<accountList.size();i++)
{
for(int j=0;j<accountList.get(i).getCardList().size();j++)
{
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum()))
{
flag=1;
break;
}
}
if(flag==1)
{
break;
}
}
if(flag==1)
return true;
else
{
System.out.println("Sorry,this card does not exist.");//卡号不存在
return false;
}
}
public static boolean check(ArrayList<Account> accountList, String cardNum,String password,String number,double money)
{
int flag=0,accIndex=0,cardIndex=0;
//检验账号
for(int i=0;i<accountList.size();i++)
{
for(int j=0;j<accountList.get(i).getCardList().size();j++)
{
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum()))
{
flag=1;
accIndex=i;
cardIndex=j;
break;
}
}
if(flag==1)
break;
}
//检验密码
if(flag==1)
{
if(password.equals(accountList.get(accIndex).getCardList().get(cardIndex).getPassword()))
{
flag=2;
}
else
{
System.out.println("Sorry,your password is wrong.");//银行卡密码错误
return false;
}
}
else
{
System.out.println("Sorry,this card does not exist.");//卡号不存在
return false;
}
//检验编号
if(flag==2)
{
for(int i=0;i<accountList.get(accIndex).banklist.size();i++)
{
for(int j=0;j<accountList.get(accIndex).banklist.get(i).atmNum.size();j++)
{
if(number.equals(accountList.get(accIndex).banklist.get(i).atmNum.get(j)))
{
flag=3;
break;
}
}
}
}
//检验金额
if(flag==3)
{
if(money<=accountList.get(accIndex).getBalance())
{
flag=4;
}
else
{
System.out.println("Sorry,your account balance is insufficient.");//取款金额大于账户余额
return false;
}
}
else
{
System.out.println("Sorry,the ATM's id is wrong.");//ATM机编号不存在
return false;
}
//检验跨行
if(flag==4)
{
for(int i=0;i<accountList.get(accIndex).bank.atmNum.size();i++)
{
if(number.equals(accountList.get(accIndex).bank.atmNum.get(i)))
{
flag=5;
break;
}
}
}
if(flag!=5){
System.out.println("Sorry,cross-bank withdrawal is not supported.");//跨行存取款
return false;
}
else
return true;
}
}
class Data {
public ArrayList<Account> accountList = new ArrayList<>();
void init()
{
//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<Card> cardList1 = new ArrayList<>();
Card card1=new Card("6217000010041315709");
Card card2=new Card("6217000010041315715");
cardList1.add(card1);
cardList1.add(card2);
Account account1 = new Account("杨过", "3217000010041315709",10000, bankList, jsyh,cardList1);
ArrayList<Card> cardList2 = new ArrayList<>();
Card card3=new Card("6217000010041315718");
cardList2.add(card3);
Account account2 = new Account("杨过", "3217000010041315715",10000,bankList,jsyh,cardList2);
ArrayList<Card> cardList3 = new ArrayList<>();
Card card4=new Card("6217000010051320007");
cardList3.add(card4);
Account account3 = new Account("郭靖", "3217000010051320007",10000, bankList,jsyh,cardList3);
ArrayList<Card> cardList4 = new ArrayList<>();
Card card5=new Card("6222081502001312389");
cardList4.add(card5);
Account account4 = new Account("张无忌", "3222081502001312389",10000, bankList,gsyh,cardList4);
ArrayList<Card> cardList5 = new ArrayList<>();
Card card6=new Card("6222081502001312390");
cardList5.add(card6);
Account account5 = new Account("张无忌", "3222081502001312390",10000, bankList,gsyh,cardList5);
ArrayList<Card> cardList6 = new ArrayList<>();
Card card7=new Card("6222081502001312399");
Card card8=new Card("6222081502001312400");
cardList6.add(card7);
cardList6.add(card8);
Account account6 = new Account("张无忌", "3222081502001312399",10000, bankList,gsyh,cardList6);
ArrayList<Card> cardList7 = new ArrayList<>();
Card card9=new Card("6222081502051320785");
cardList7.add(card9);
Account account7 = new Account("韦小宝", "3222081502051320785",10000, bankList,gsyh,cardList7);
ArrayList<Card> cardList8 = new ArrayList<>();
Card card10=new Card("6222081502051320786");
cardList8.add(card10);
Account account8 = new Account("韦小宝", "3222081502051320786",10000, bankList,gsyh,cardList8);
accountList.add(account1);
accountList.add(account2);
accountList.add(account3);
accountList.add(account4);
accountList.add(account5);
accountList.add(account6);
accountList.add(account7);
accountList.add(account8);
}
}
class Deal {
ArrayList<Account> accountList;
String cardNum;
String password;
String number;
double money;
public Deal(ArrayList<Account> accountList,String cardNum,String password,String number,double money)
{
this.password=password;
this.number=number;
this.cardNum=cardNum;
this.accountList=accountList;
this.money=money;
}
public void handel()
{
int accIndex=0;
//int cardIndex=0;
//卡号校验
for(int i=0;i<accountList.size();i++){
for(int j=0;j<accountList.get(i).getCardList().size();j++){
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum())){
accIndex=i;
//cardIndex=j;
break;
}
}
}
accountList.get(accIndex).setBalance( accountList.get(accIndex).getBalance()-money);
}
}
class Show {
public static void show(ArrayList<Account> accountList, String cardNum, String password, String number, double money)
{
int i,j;
int accIndex=0;
//int cardIndex=0;
//卡号校验
for(i=0;i<accountList.size();i++){
for(j=0;j<accountList.get(i).getCardList().size();j++){
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum())){
accIndex=i;
//cardIndex=j;
break;
}
}
}
if(money>=0)
{
System.out.printf(accountList.get(accIndex).getUserName()+"在"+accountList.get(accIndex).bank.getBankname()+"的"+number+"号ATM机上取款¥%.2f\n",money);
}
else
{
money=-money;
System.out.printf(accountList.get(accIndex).getUserName()+"在"+accountList.get(accIndex).bank.getBankname()+"的"+number+"号ATM机上存款¥%.2f\n",money);
}
System.out.printf("当前余额为¥%.2f\n",accountList.get(accIndex).getBalance());
}
public static void show(ArrayList<Account> accountList,String cardNum)
{
int accIndex=0;
// int cardIndex=0;
//卡号校验
for(int i=0;i<accountList.size();i++){
for(int j=0;j<accountList.get(i).getCardList().size();j++){
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum())){
accIndex=i;
//cardIndex=j;
break;
}
}
}
System.out.printf("¥%.2f\n",accountList.get(accIndex).getBalance());
}
}
第九次作业
和八次基本一致,多了些情况要考虑,如跨行,透支,数据增加,整体类图无变化。
源码如下
import java.util.Scanner;
import java.util.ArrayList;
class Account {
public Account()
{
}
public Account(String userName, String bankAccount, double balance, ArrayList<Bank> banklist, Bank bank,
ArrayList<Card> cardList, String type) {
super();
this.userName = userName;
this.bankAccount = bankAccount;
this.balance = balance;
this.banklist = banklist;
this.bank = bank;
this.cardList = cardList;
this.type = type;
}
private String userName;
private String bankAccount;
private double balance;
private ArrayList<Bank> banklist;
private Bank bank;
private ArrayList<Card> cardList;
private String type;
/**
* @return type
*/
public String getType() {
return type;
}
/**
* @param type 要设置的 type
*/
public void setType(String type) {
this.type = type;
}
/**
* @return userName
*/
public String getUserName() {
return userName;
}
/**
* @param userName 要设置的 userName
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* @return bankAccount
*/
public String getBankAccount() {
return bankAccount;
}
/**
* @param bankAccount 要设置的 bankAccount
*/
public void setBankAccount(String bankAccount) {
this.bankAccount = bankAccount;
}
/**
* @return banklist
*/
public ArrayList<Bank> getBanklist() {
return banklist;
}
/**
* @param banklist 要设置的 banklist
*/
public void setBanklist(ArrayList<Bank> banklist) {
this.banklist = banklist;
}
/**
* @return bank
*/
public Bank getBank() {
return bank;
}
/**
* @param bank 要设置的 bank
*/
public void setBank(Bank bank) {
this.bank = bank;
}
/**
* @return cardList
*/
public ArrayList<Card> getCardList() {
return cardList;
}
/**
* @param cardList 要设置的 cardList
*/
public void setCardList(ArrayList<Card> cardList) {
this.cardList = cardList;
}
/**
* @return balance
*/
public double getBalance() {
return balance;
}
/**
* @param balance 要设置的 balance
*/
public void setBalance(double balance) {
this.balance = balance;
}
}
class Bank {
public Bank()
{
}
public Bank(String bankName, ArrayList<String> atmNum,double rate) {
super();
this.bankName = bankName;
this.atmNum = atmNum;
this.rate=rate;
}
private String bankName;
private ArrayList<String> atmNum;
private double rate;
/**
* @return bankName
*/
public String getBankName() {
return bankName;
}
/**
* @param bankName 要设置的 bankName
*/
public void setBankName(String bankName) {
this.bankName = bankName;
}
/**
* @return rate
*/
public double getRate() {
return rate;
}
/**
* @param rate 要设置的 rate
*/
public void setRate(double rate) {
this.rate = rate;
}
/**
* @return atmNum
*/
public ArrayList<String> getAtmNum() {
return atmNum;
}
/**
* @param atmNum 要设置的 atmNum
*/
public void setAtmNum(ArrayList<String> atmNum) {
this.atmNum = atmNum;
}
}
class Card {
private String cardNum;
private String password="88888888";
public Card(String cardNum) {
super();
this.cardNum = cardNum;
}
/**
* @return cardNum
*/
public String getCardNum() {
return cardNum;
}
/**
* @param cardNum 要设置的 cardNum
*/
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
/**
* @return password
*/
public String getPassword() {
return password;
}
/**
* @param password 要设置的 password
*/
public void setPassword(String password) {
this.password = password;
}
}
class Check {
public static boolean check(ArrayList<Account> accountList,String cardNum)
{
int flag=0;
for(int i=0;i<accountList.size();i++)
{
for(int j=0;j<accountList.get(i).getCardList().size();j++)
{
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum()))
{
flag=1;
break;
}
}
if(flag==1)
{
break;
}
}
if(flag==1)
return true;
else
{
System.out.println("Sorry,this card does not exist.");//卡号不存在
return false;
}
}
public static boolean check(ArrayList<Account> accountList, String cardNum,String password,String number,double money)
{
int flag=0,accIndex=0,cardIndex=0;
//检验账号
for(int i=0;i<accountList.size();i++)
{
for(int j=0;j<accountList.get(i).getCardList().size();j++)
{
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum()))
{
flag=1;
accIndex=i;
cardIndex=j;
break;
}
}
if(flag==1)
break;
}
//检验密码
if(flag==1)
{
if(password.equals(accountList.get(accIndex).getCardList().get(cardIndex).getPassword()))
{
flag=2;
}
else
{
System.out.println("Sorry,your password is wrong.");//银行卡密码错误
return false;
}
}
else
{
System.out.println("Sorry,this card does not exist.");//卡号不存在
return false;
}
//检验编号
if(flag==2)
{
for(int i=0;i<accountList.get(accIndex).getBanklist().size();i++)
{
for(int j=0;j<accountList.get(accIndex).getBanklist().get(i).getAtmNum().size();j++)
{
if(number.equals(accountList.get(accIndex).getBanklist().get(i).getAtmNum().get(j)))
{
flag=3;
break;
}
}
}
}
//检验金额
if(flag==3)
{
if(money<=accountList.get(accIndex).getBalance())
{
flag=4;
}
else if((accountList.get(accIndex).getType().equals("贷记")))
{
flag=4;
}
else
{
System.out.println("Sorry,your account balance is insufficient.");//取款金额大于账户余额
return false;
}
}
else
{
System.out.println("Sorry,the ATM's id is wrong.");//ATM机编号不存在
return false;
}
return true;
/*
//检验跨行
if(flag==4)
{
for(int i=0;i<accountList.get(accIndex).getBank().getAtmNum().size();i++)
{
if(number.equals(accountList.get(accIndex).getBank().getAtmNum().get(i)))
{
flag=5;
break;
}
}
}
if(flag!=5){
System.out.println("Sorry,cross-bank withdrawal is not supported.");//跨行存取款
return false;
}
else
return true;
*/
}
public static boolean checkOverDraft(ArrayList<Account> accountList,String cardNum,double money)
{
int flag=0,accIndex=0;
//检验账号
for(int i=0;i<accountList.size();i++)
{
for(int j=0;j<accountList.get(i).getCardList().size();j++)
{
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum()))
{
flag=1;
accIndex=i;
break;
}
}
if(flag==1)
break;
}
if(accountList.get(accIndex).getType().equals("贷记")&&money>accountList.get(accIndex).getBalance())
return true;
return false;
}
public static boolean checkAcross(ArrayList<Account> accountList,String cardNum,String number)
{
int flag=0,accIndex=0;
//检验账号
for(int i=0;i<accountList.size();i++)
{
for(int j=0;j<accountList.get(i).getCardList().size();j++)
{
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum()))
{
flag=1;
accIndex=i;
break;
}
}
if(flag==1)
break;
}
for(int i=0;i<accountList.get(accIndex).getBank().getAtmNum().size();i++)
{
if(number.equals(accountList.get(accIndex).getBank().getAtmNum().get(i)))
{
return false;
}
}
return true;
}
public static boolean checkMaxOver(Account a)
{
if(a.getType().equals("借记")&&a.getBalance()<0)
{
System.out.println("Sorry,your account balance is insufficient.");//取款金额大于账户余额
System.exit(0);
return true;
}
if(a.getType().equals("贷记")&&a.getBalance()<-50000)
{
System.out.println("Sorry,your account balance is insufficient.");//取款金额大于账户余额
System.exit(0);
return true;
}
return false;
}
}
class Data {
public ArrayList<Account> accountList = new ArrayList<>();
void init()
{
//ATM机编号数组
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<Card> cardList1 = new ArrayList<>();
Card card1=new Card("6217000010041315709");
Card card2=new Card("6217000010041315715");
cardList1.add(card1);
cardList1.add(card2);
Account account1 = new Account("杨过", "3217000010041315709",10000, bankList, jsyh,cardList1,"借记");
ArrayList<Card> cardList2 = new ArrayList<>();
Card card3=new Card("6217000010041315718");
cardList2.add(card3);
Account account2 = new Account("杨过", "3217000010041315715",10000,bankList,jsyh,cardList2,"借记");
ArrayList<Card> cardList3 = new ArrayList<>();
Card card4=new Card("6217000010051320007");
cardList3.add(card4);
Account account3 = new Account("郭靖", "3217000010051320007",10000, bankList,jsyh,cardList3,"借记");
ArrayList<Card> cardList4 = new ArrayList<>();
Card card5=new Card("6222081502001312389");
cardList4.add(card5);
Account account4 = new Account("张无忌", "3222081502001312389",10000, bankList,gsyh,cardList4,"借记");
ArrayList<Card> cardList5 = new ArrayList<>();
Card card6=new Card("6222081502001312390");
cardList5.add(card6);
Account account5 = new Account("张无忌", "3222081502001312390",10000, bankList,gsyh,cardList5,"借记");
ArrayList<Card> cardList6 = new ArrayList<>();
Card card7=new Card("6222081502001312399");
Card card8=new Card("6222081502001312400");
cardList6.add(card7);
cardList6.add(card8);
Account account6 = new Account("张无忌", "3222081502001312399",10000, bankList,gsyh,cardList6,"借记");
ArrayList<Card> cardList7 = new ArrayList<>();
Card card9=new Card("6222081502051320785");
cardList7.add(card9);
Account account7 = new Account("韦小宝", "3222081502051320785",10000, bankList,gsyh,cardList7,"借记");
ArrayList<Card> cardList8 = new ArrayList<>();
Card card10=new Card("6222081502051320786");
cardList8.add(card10);
Account account8 = new Account("韦小宝", "3222081502051320786",10000, bankList,gsyh,cardList8,"借记");
ArrayList<Card> cardList9 = new ArrayList<>();
Card card11=new Card("6640000010045442002");
Card card12=new Card("6640000010045442003");
cardList9.add(card11);
cardList9.add(card12);
Account account9 = new Account("张三丰", "3640000010045442002",10000, bankList,jsyh,cardList9,"贷记");
ArrayList<Card> cardList10 = new ArrayList<>();
Card card13=new Card("6640000010045441009");
cardList10.add(card13);
Account account10 = new Account("令狐冲", "3640000010045441009",10000, bankList,gsyh,cardList10,"贷记");
ArrayList<Card> cardList11 = new ArrayList<>();
Card card14=new Card("6630000010033431001");
cardList11.add(card14);
Account account11 = new Account("乔峰", "3630000010033431001",10000, bankList,nyyh,cardList11,"贷记");
ArrayList<Card> cardList12 = new ArrayList<>();
Card card15=new Card("6630000010033431008");
cardList12.add(card15);
Account account12 = new Account("洪七公", "3630000010033431008",10000, bankList,nyyh,cardList12,"贷记");
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);
}
}
class Deal {
ArrayList<Account> accountList;
String cardNum;
String password;
String number;
double money;
public Deal(ArrayList<Account> accountList,String cardNum,String password,String number,double money)
{
this.password=password;
this.number=number;
this.cardNum=cardNum;
this.accountList=accountList;
this.money=money;
}
public void handel()
{
int accIndex=0;
//int cardIndex=0;
//卡号校验
for(int i=0;i<accountList.size();i++){
for(int j=0;j<accountList.get(i).getCardList().size();j++){
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum())){
accIndex=i;
//cardIndex=j;
break;
}
}
}
if(Check.checkOverDraft(accountList, cardNum, money))
{
if(accountList.get(accIndex).getBalance()<0)
{
accountList.get(accIndex).setBalance( accountList.get(accIndex).getBalance()-money*0.05);
}
else
accountList.get(accIndex).setBalance( accountList.get(accIndex).getBalance()-(money-accountList.get(accIndex).getBalance())*0.05);
}
accountList.get(accIndex).setBalance( accountList.get(accIndex).getBalance()-money);
Check.checkMaxOver(accountList.get(accIndex));
if(Check.checkAcross(accountList, cardNum, number))
{
accountList.get(accIndex).setBalance( accountList.get(accIndex).getBalance()-money*Deal.getRate(accountList.get(0).getBanklist(), number));
}
Check.checkMaxOver(accountList.get(accIndex));
}
static double getRate(ArrayList<Bank> bankList,String number)
{
for(Bank b:bankList)
{
for(String s:b.getAtmNum())
{
if(s.equals(number))
return b.getRate();
}
}
return 0;
}
static String getBank(ArrayList<Bank> bankList,String number)
{
for(Bank b:bankList)
{
for(String s:b.getAtmNum())
{
if(s.equals(number))
return b.getBankName();
}
}
return "";
}
}
class Show {
public static void show(ArrayList<Account> accountList, String cardNum, String password, String number, double money)
{
int i,j;
int accIndex=0;
//int cardIndex=0;
//卡号校验
for(i=0;i<accountList.size();i++){
for(j=0;j<accountList.get(i).getCardList().size();j++){
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum())){
accIndex=i;
//cardIndex=j;
break;
}
}
}
if(money>=0)
{
System.out.printf("业务:取款 "+accountList.get(accIndex).getUserName()+"在"+Deal.getBank(accountList.get(accIndex).getBanklist(), number)+"的"+number+"号ATM机上取款¥%.2f\n",money);
}
else
{
money=-money;
System.out.printf("业务:存款 "+accountList.get(accIndex).getUserName()+"在"+Deal.getBank(accountList.get(accIndex).getBanklist(), number)+"的"+number+"号ATM机上存款¥%.2f\n",money);
}
System.out.printf("当前余额为¥%.2f\n",accountList.get(accIndex).getBalance());
}
public static void show(ArrayList<Account> accountList,String cardNum)
{
int accIndex=0;
// int cardIndex=0;
//卡号校验
for(int i=0;i<accountList.size();i++){
for(int j=0;j<accountList.get(i).getCardList().size();j++){
if(cardNum.equals(accountList.get(i).getCardList().get(j).getCardNum())){
accIndex=i;
//cardIndex=j;
break;
}
}
}
System.out.printf("业务:查询余额 "+"¥%.2f\n",accountList.get(accIndex).getBalance());
}
}
public class Main
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
String str;
StringBuilder sb=new StringBuilder();
str=input.nextLine();
while(!str.equals("#")){
sb.append(str);
sb.append("\n");
str=input.nextLine();
}
input.close();
getDealDataResult(sb);
}
static void getDealDataResult(StringBuilder sb)
{
Data data=new Data();
data.init();
String str1[]=sb.toString().split("\\n");
for(int len=0;len<str1.length;len++)
{
String[] shuju=str1[len].split("\\s+");//输入的每行数据用空格隔开,存为数组
for(int i=0;i<shuju.length;i++)
{
shuju[i].trim();
}
if(shuju.length!=1)
{
if (Check.check(data.accountList,shuju[0],shuju[1],shuju[2],Double.parseDouble(shuju[3])))
{
Deal handel = new Deal(data.accountList,shuju[0], shuju[1],shuju[2],Double.parseDouble(shuju[3]));
handel.handel();
Show.show(data.accountList,shuju[0], shuju[1],shuju[2],Double.parseDouble(shuju[3]));
}
}
else
{
if(Check.check(data.accountList,shuju[0]))
{
Show.show(data.accountList,shuju[0]);
}
}
}
}
}
三、踩坑心得
第九次作业ATM机中,借记卡跨行取全部时因手续费的存在而出现余额不足一开始忽略了没有考虑
四、改进建议
ATM设计的类复杂度还不够低

五、总结
通过这几次的作业,我对于面向对象的设计有了更深刻的理解,能够自己设计类,没有提供类图的题目一样可以完成。

浙公网安备 33010602011771号