OOP第三次作业
- 前言:
在三次作业中,第一次作业是两道卡片求值题,第一题只用到类、字段、方法、构造方法的知识。第二题则在此基础上增加了类的继承、字段与方法的增加与覆盖,几个图形类均继承自Shape,并增加了接口,达到多重继承的效果。
第二次作业和第三次作业都是关于银行的一个程序,随着功能和规则增多难度逐渐增加。从设计层面,除了用于功能实现的ATM、Account、User、Card、Unionpay、Bank等等类,还必须添加连接这些单一职责类的“胶水”,但是我在第二次作业时没能写出这些“胶水”程序,导致我无法将我写出的庞杂冗长的程序运行实现。
第三次作业,在老师讲解的基础上,我理解并增加了GetBalance、ValidateDate、Withdarw三个类。是不是看名称就知道这三个类的作用了,有了这三根金手指,我很快就写出了这个银行程序。只能说agent程序非常妙。
- 设计与分析:
三次作业的类图如下:
第七次作业

第八及第九次作业

圈复杂度分析结果如下:
第七次作业:
因为我按照pta的要求把所有类放进同一个文件了,所以分析结果只有总行数非常高,其它数据无法得出。


第八次及第九次作业:
因为是在老师的基础上改的,所以圈复杂度和函数深度头一次达标了(老泪纵横),比较高的数值只有函数数目和注释比例。

3.采坑心得:
第七次作业因为是五一布置的,比较容易,但我还是有两个点一直通过不了,也来不及找出问题。第八次则完全没做出来,只拿了一个错误输入的分。
第九次作业增加了几个用户和一个银行,这个只要仔细就可以了。然后卡被分成了贷记卡和信用卡,信用卡可以透支,我最初在Card类里增加了信用卡,但是运行错误了,改了好多次,最终在Account类里直接增加一个参数,在输入数据的时候就直接标记能透支和不能透支的账户,终于可以了。最后这次ATM可以跨行,将原本不能跨行的判断代码注释即可。
以下是三次作业的源码:
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
public class Main {
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
// TODO 自动生成的方法存根
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();
}
if(list.size() == 0) {
System.out.println("Wrong Format");
System.exit(0);
}
DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
dealCardList.showResult();
input.close();
}
}
class DealCardList {
ArrayList<Card> cardList = new ArrayList<>();
ArrayList<Card> cir = new ArrayList<>();
ArrayList<Card> rec = new ArrayList<>();
ArrayList<Card> tri = new ArrayList<>();
ArrayList<Card> tra = new ArrayList<>();
public DealCardList() {
}
public DealCardList(ArrayList<Integer> list) {
super();
for(int j : list) {
switch(j) {
case 1:
Card circle = new Card(new Circle(Main.input.nextDouble()));
circle.getShape().setShapeName("Circle");
cardList.add(circle);
cir.add(circle);
break;
case 2:
Card rectangle = new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
rectangle.getShape().setShapeName("Rectangle");
cardList.add(rectangle);
rec.add(rectangle);
break;
case 3:
Card triangle=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
triangle.getShape().setShapeName("Triangle");
cardList.add(triangle);
tri.add(triangle);
break;
case 4:
Card trapezoid = new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
trapezoid.getShape().setShapeName("Trapezoid");
cardList.add(trapezoid);
tra.add(trapezoid);
break;
}
}
}
public boolean validate() {
for(int i=0;i<cardList.size();i++){
if(cardList.get(i).getShape().validate() == false)
return false;
}
return true;
}
public void cardSort(ArrayList<Card> list) {
for(int i = 0; i < list.size(); i ++) {
for(int j = i + 1; j < list.size(); j ++){
if(list.get(i).getShape().getArea() < list.get(j).getShape().getArea())
Collections.swap(list, i, j);
}
System.out.print(list.get(i).getShape());
}
}
public double getAllArea(ArrayList<Card> list) {
double sum = 0;
for (Card card :list) {
sum += card.getShape().getArea();
}
return sum;
}
public void getMaxArea() {
double[] sum = new double[4];
double max = 0;
sum[0] = getAllArea(cir);
sum[1] = getAllArea(rec);
sum[2] = getAllArea(tri);
sum[3] = getAllArea(tra);
for(int i = 0; i < sum.length; i++) {
if(max < sum[i]) {
max = sum[i];
}
}
System.out.printf("%.2f",max);
}
public void showResult() {
System.out.println("The original list:");
System.out.print("[");
for (Card card : cardList) {
System.out.print(card.getShape());
}
System.out.println("]");
System.out.println("The Separated List:");
System.out.print("[");
for (Card card : cir) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.print("[");
for (Card card : rec) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.print("[");
for (Card card : tri) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.print("[");
for (Card card : tra) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.println();
System.out.println("The Separated sorted List:");
System.out.print("[");
cardSort(cir);
System.out.print("]");
System.out.print("[");
cardSort(rec);
System.out.print("]");
System.out.print("[");
cardSort(tri);
System.out.print("]");
System.out.print("[");
cardSort(tra);
System.out.print("]");
System.out.println();
System.out.printf("The max area:");
getMaxArea();
}
}
interface Comparable{
public int compareTo(Card card);
}
class Card implements Comparable{
private Shape shape;
public Card() {
}
public Card(Shape shape) {
this.shape = shape;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
@Override
public int compareTo(Card card) {
return -(int)(shape.getArea()-card.getShape().getArea());
}
}
abstract class Shape {
private String shapeName;
public Shape() {
}
public 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();
@Override
public String toString() {
return getShapeName()+":"+String.format("%.2f", getArea()) + " ";
}
}
class Circle extends Shape{
private double radius;
public Circle(double radius) {
super();
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
return Math.PI*radius*radius;
}
@Override
public boolean validate() {
// TODO 自动生成的方法存根
if(radius < 0) {
return false;
}
return true;
}
}
class Triangle extends Shape{
private double side1;
private double side2;
private double side3;
public Triangle(double side1, double side2, double side3) {
super();
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
if(validate() == false) {
System.out.println("Wrong Format");
System.exit(0);
}
}
public double getSide1() {
return side1;
}
public void setSide1(double side1) {
this.side1 = side1;
}
public double getSide2() {
return side2;
}
public void setSide2(double side2) {
this.side2 = side2;
}
public double getSide3() {
return side3;
}
public void setSide3(double side3) {
this.side3 = side3;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
double p = ( side1 + side2 + side3 ) / 2;
return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
}
@Override
public boolean validate() {
// TODO 自动生成的方法存根
if( ( side1 + side2) <= side3 || (side2 + side3 ) <= side1 || (side1 + side3 ) <= side2 || side1 < 0 || side2 < 0 || side3 < 0)
return false;
return true;
}
}
class Rectangle extends Shape{
private double width;
private double length;
public Rectangle(double width, double length) {
super();
this.width = width;
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
return width*length;
}
@Override
public boolean validate() {
if(width < 0|| length < 0) {
return false;
}
// TODO 自动生成的方法存根
return true;
}
}
class Trapezoid extends Shape{
private double upside;
private double downside;
private double height;
public Trapezoid() {
super();
// TODO 自动生成的构造函数存根
}
public Trapezoid(double upside, double downside, double height) {
super();
this.upside = upside;
this.downside = downside;
this.height = height;
}
public double getUpside() {
return upside;
}
public void setUpside(double upside) {
this.upside = upside;
}
public double getDownside() {
return downside;
}
public void setDownside(double downside) {
this.downside = downside;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getArea() {
// TODO 自动生成的方法存根
return (upside + downside) * height * 0.5 ;
}
public boolean validate() {
if(upside < 0|| downside < 0 || height < 0) {
return false;
}
// TODO 自动生成的方法存根
return true;
}
}
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
public class Main {
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
// TODO 自动生成的方法存根
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();
}
if(list.size() == 0) {
System.out.println("Wrong Format");
System.exit(0);
}
DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
dealCardList.showResult();
input.close();
}
}
class DealCardList {
ArrayList<Card> cardList = new ArrayList<>();
ArrayList<Card> cir = new ArrayList<>();
ArrayList<Card> rec = new ArrayList<>();
ArrayList<Card> tri = new ArrayList<>();
ArrayList<Card> tra = new ArrayList<>();
public DealCardList() {
}
public DealCardList(ArrayList<Integer> list) {
super();
for(int j : list) {
switch(j) {
case 1:
Card circle = new Card(new Circle(Main.input.nextDouble()));
circle.getShape().setShapeName("Circle");
cardList.add(circle);
cir.add(circle);
break;
case 2:
Card rectangle = new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
rectangle.getShape().setShapeName("Rectangle");
cardList.add(rectangle);
rec.add(rectangle);
break;
case 3:
Card triangle=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
triangle.getShape().setShapeName("Triangle");
cardList.add(triangle);
tri.add(triangle);
break;
case 4:
Card trapezoid = new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
trapezoid.getShape().setShapeName("Trapezoid");
cardList.add(trapezoid);
tra.add(trapezoid);
break;
}
}
}
public boolean validate() {
for(int i=0;i<cardList.size();i++){
if(cardList.get(i).getShape().validate() == false)
return false;
}
return true;
}
public void cardSort(ArrayList<Card> list) {
for(int i = 0; i < list.size(); i ++) {
for(int j = i + 1; j < list.size(); j ++){
if(list.get(i).getShape().getArea() < list.get(j).getShape().getArea())
Collections.swap(list, i, j);
}
System.out.print(list.get(i).getShape());
}
}
public double getAllArea(ArrayList<Card> list) {
double sum = 0;
for (Card card :list) {
sum += card.getShape().getArea();
}
return sum;
}
public void getMaxArea() {
double[] sum = new double[4];
double max = 0;
sum[0] = getAllArea(cir);
sum[1] = getAllArea(rec);
sum[2] = getAllArea(tri);
sum[3] = getAllArea(tra);
for(int i = 0; i < sum.length; i++) {
if(max < sum[i]) {
max = sum[i];
}
}
System.out.printf("%.2f",max);
}
public void showResult() {
System.out.println("The original list:");
System.out.print("[");
for (Card card : cardList) {
System.out.print(card.getShape());
}
System.out.println("]");
System.out.println("The Separated List:");
System.out.print("[");
for (Card card : cir) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.print("[");
for (Card card : rec) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.print("[");
for (Card card : tri) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.print("[");
for (Card card : tra) {
System.out.print(card.getShape());
}
System.out.print("]");
System.out.println();
System.out.println("The Separated sorted List:");
System.out.print("[");
cardSort(cir);
System.out.print("]");
System.out.print("[");
cardSort(rec);
System.out.print("]");
System.out.print("[");
cardSort(tri);
System.out.print("]");
System.out.print("[");
cardSort(tra);
System.out.print("]");
System.out.println();
System.out.printf("The max area:");
getMaxArea();
}
}
interface Comparable{
public int compareTo(Card card);
}
class Card implements Comparable{
private Shape shape;
public Card() {
}
public Card(Shape shape) {
this.shape = shape;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
@Override
public int compareTo(Card card) {
return -(int)(shape.getArea()-card.getShape().getArea());
}
}
abstract class Shape {
private String shapeName;
public Shape() {
}
public 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();
@Override
public String toString() {
return getShapeName()+":"+String.format("%.2f", getArea()) + " ";
}
}
class Circle extends Shape{
private double radius;
public Circle(double radius) {
super();
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
return Math.PI*radius*radius;
}
@Override
public boolean validate() {
// TODO 自动生成的方法存根
if(radius < 0) {
return false;
}
return true;
}
}
class Triangle extends Shape{
private double side1;
private double side2;
private double side3;
public Triangle(double side1, double side2, double side3) {
super();
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
if(validate() == false) {
System.out.println("Wrong Format");
System.exit(0);
}
}
public double getSide1() {
return side1;
}
public void setSide1(double side1) {
this.side1 = side1;
}
public double getSide2() {
return side2;
}
public void setSide2(double side2) {
this.side2 = side2;
}
public double getSide3() {
return side3;
}
public void setSide3(double side3) {
this.side3 = side3;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
double p = ( side1 + side2 + side3 ) / 2;
return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
}
@Override
public boolean validate() {
// TODO 自动生成的方法存根
if( ( side1 + side2) <= side3 || (side2 + side3 ) <= side1 || (side1 + side3 ) <= side2 || side1 < 0 || side2 < 0 || side3 < 0)
return false;
return true;
}
}
class Rectangle extends Shape{
private double width;
private double length;
public Rectangle(double width, double length) {
super();
this.width = width;
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
return width*length;
}
@Override
public boolean validate() {
if(width < 0|| length < 0) {
return false;
}
// TODO 自动生成的方法存根
return true;
}
}
class Trapezoid extends Shape{
private double upside;
private double downside;
private double height;
public Trapezoid() {
super();
// TODO 自动生成的构造函数存根
}
public Trapezoid(double upside, double downside, double height) {
super();
this.upside = upside;
this.downside = downside;
this.height = height;
}
public double getUpside() {
return upside;
}
public void setUpside(double upside) {
this.upside = upside;
}
public double getDownside() {
return downside;
}
public void setDownside(double downside) {
this.downside = downside;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getArea() {
// TODO 自动生成的方法存根
return (upside + downside) * height * 0.5 ;
}
public boolean validate() {
if(upside < 0|| downside < 0 || height < 0) {
return false;
}
// TODO 自动生成的方法存根
return true;
}
}
package 新建;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
UnionPay unionPay = new UnionPay();
Bank ccb = new Bank("1001","中国建设银行");
Bank icbc = new Bank("1002","中国工商银行");
Bank abc = new Bank("1003","中国农业银行");
unionPay.addBank(ccb);
unionPay.addBank(icbc);
unionPay.addBank(abc);
ATM aTM1 = new ATM("01",ccb);
ATM aTM2 = new ATM("02",ccb);
ATM aTM3 = new ATM("03",ccb);
ATM aTM4 = new ATM("04",ccb);
ATM aTM5 = new ATM("05",icbc);
ATM aTM6 = new ATM("06",icbc);
ATM aTM7 = new ATM("07",abc);
ATM aTM8 = new ATM("08",abc);
ATM aTM9 = new ATM("09",abc);
ATM aTM10 = new ATM("10",abc);
ATM aTM11 = new ATM("11",abc);
ccb.addATM(aTM1);
ccb.addATM(aTM2);
ccb.addATM(aTM3);
ccb.addATM(aTM4);
icbc.addATM(aTM5);
icbc.addATM(aTM6);
abc.addATM(aTM7);
abc.addATM(aTM8);
abc.addATM(aTM9);
abc.addATM(aTM10);
abc.addATM(aTM11);
User Yangguo = new User("360101200102122324","杨过","13856223254");
User Guojing = new User("360101200012302552","郭靖","13800021124");
User Zhangwuji = new User("360502199805163221","张无忌","13952110011");
User Weixiaobao = new User("360201200513243326","韦小宝","13025996587");
User Zhangsanfeng = new User("360101200012302552","张三丰","13800021124");
User Linghuchong = new User("360502199805163221","令狐冲","13952110011");
User Qiaofeng = new User("360201200513243326","乔峰","13025996587");
User Hongqigong = new User("360201200513243326","洪七公","13025996587");
//身份证,电话号码不确定
Account ccbAcc1 = new Account("3217000010041315709",10000.00,Yangguo,ccb,0);
Account ccbAcc2 = new Account("3217000010041315715",10000.00,Yangguo,ccb,0);
Account ccbAcc3 = new Account("3217000010051320007",10000.00,Guojing,ccb,0);
Account icbcAcc1 = new Account("3222081502001312389",10000.00,Zhangwuji,icbc,0);
Account icbcAcc2 = new Account("3222081502001312390",10000.00,Zhangwuji,icbc,0);
Account icbcAcc3 = new Account("3222081502001312399",10000.00,Zhangwuji,icbc,0);
Account icbcAcc4 = new Account("3222081502051320785",10000.00,Weixiaobao,icbc,0);
Account icbcAcc5 = new Account("3222081502051320786",10000.00,Weixiaobao,icbc,0);
Account ccbAcc4 = new Account("3640000010045442002",10000.00,Zhangsanfeng,ccb,1);
Account icbcAcc6 = new Account("3640000010045441009",10000.00,Linghuchong,icbc,1);
Account abcAcc1 = new Account("3630000010033431001",10000.00,Qiaofeng,abc,1);
Account abcAcc2 = new Account("3630000010033431008",10000.00,Hongqigong,abc,1);
//创建账户
ccb.addAccount(ccbAcc1);
ccb.addAccount(ccbAcc2);
ccb.addAccount(ccbAcc3);
icbc.addAccount(icbcAcc1);
icbc.addAccount(icbcAcc2);
icbc.addAccount(icbcAcc3);
icbc.addAccount(icbcAcc4);
icbc.addAccount(icbcAcc5);
ccb.addAccount(ccbAcc4);
icbc.addAccount(icbcAcc6);
abc.addAccount(abcAcc1);
abc.addAccount(abcAcc2);
//账户加入银行
//System.out.println(ccb.getAccountList());
Yangguo.addAccount(ccbAcc1);
Yangguo.addAccount(ccbAcc2);
Guojing.addAccount(ccbAcc3);
Zhangwuji.addAccount(icbcAcc1);
Zhangwuji.addAccount(icbcAcc2);
Zhangwuji.addAccount(icbcAcc3);
Weixiaobao.addAccount(icbcAcc4);
Weixiaobao.addAccount(icbcAcc5);
Zhangsanfeng.addAccount(ccbAcc4);
Linghuchong.addAccount(icbcAcc6);
Qiaofeng.addAccount(abcAcc1);
Hongqigong.addAccount(abcAcc2);
//账户加入使用者
Card ccbCard1 = new Card("6217000010041315709","88888888",ccbAcc1);
Card ccbCard2 = new Card("6217000010041315715","88888888",ccbAcc1);
Card ccbCard3 = new Card("6217000010041315718","88888888",ccbAcc2);
Card ccbCard4 = new Card("6217000010051320007","88888888",ccbAcc3);
Card icbcCard5 = new Card("6222081502001312389","88888888",icbcAcc1);
Card icbcCard6 = new Card("6222081502001312390","88888888",icbcAcc2);
Card icbcCard7 = new Card("6222081502001312399","88888888",icbcAcc3);
Card icbcCard8 = new Card("6222081502001312400","88888888",icbcAcc3);
Card icbcCard9 = new Card("6222081502051320785","88888888",icbcAcc4);
Card icbcCard10 = new Card("6222081502051320786","88888888",icbcAcc5);
Card ccbCard5 = new Card("6640000010045442002","88888888",ccbAcc4);
Card ccbCard6 = new Card("6640000010045442003","88888888",ccbAcc4);
Card icbcCard11 = new Card("6640000010045441009","88888888",icbcAcc6);
Card abcCard1 = new Card("6630000010033431001","88888888",abcAcc1);
Card abcCard2 = new Card("6630000010033431008","88888888",abcAcc2);
//创建卡号
ccbAcc1.addCard(ccbCard1);
ccbAcc1.addCard(ccbCard2);
ccbAcc2.addCard(ccbCard3);
ccbAcc3.addCard(ccbCard4);
icbcAcc1.addCard(icbcCard5);
icbcAcc2.addCard(icbcCard6);
icbcAcc3.addCard(icbcCard7);
icbcAcc3.addCard(icbcCard8);
icbcAcc4.addCard(icbcCard9);
icbcAcc5.addCard(icbcCard10);
ccbAcc4.addCard(ccbCard5);
ccbAcc4.addCard(ccbCard6);
icbcAcc6.addCard(icbcCard11);
abcAcc1.addCard(abcCard1);
abcAcc2.addCard(abcCard2);
//卡号加入账户
StringBuilder sb = new StringBuilder();
//可连接的字符串sb,用于存储输入
String data;
while(!((data = input.nextLine()).equals("#"))) {
sb.append(data + "\n");
}
String[] dt = sb.toString().split("\n");//从换行处分开成多个字符串
for(int i = 0; i < dt.length; i++) {
String[] dataLine = dt[i].toString().split("\\s+");//从空格处分开成多个字符串
if(dataLine.length == 1) {
GetBalance gb = new GetBalance(unionPay);
System.out.println("业务:查询余额 "+String.format("¥%.2f", gb.getBalance(dataLine[0])));
}else {
Withdraw wd = new Withdraw(unionPay,dataLine[0],dataLine[1],dataLine[2],Double.parseDouble(dataLine[3]));
wd.withdraw();
}
}
}
}
class Bank {
private String bankNO;
private String bankName;
private ArrayList<Account> accountList = new ArrayList<Account>();
private ArrayList<ATM> ATMList = new ArrayList<ATM>();
public Bank() {
super();
// TODO Auto-generated constructor stub
}
public Bank(String bankNO, String bankName) {
super();
this.bankNO = bankNO;
this.bankName = bankName;
}
public String getBankNO() {
return bankNO;
}
public void setBankNO(String bankNO) {
this.bankNO = bankNO;
}
public String getBankName() {
return bankName;
}
public void setBankName(String bankName) {
this.bankName = bankName;
}
public void addAccount(Account account) {
this.accountList.add(account);
}
public void removeAccount(Account account) {
this.accountList.remove(account);
}
public void addATM(ATM aTM) {
this.ATMList.add(aTM);
}
public void removeATM(ATM aTM) {
this.ATMList.remove(aTM);
}
public ArrayList<Account> getAccountList() {
return accountList;
}
public void setAccountList(ArrayList<Account> accountList) {
this.accountList = accountList;
}
public ArrayList<ATM> getATMList() {
return ATMList;
}
public void setATMList(ArrayList<ATM> aTMList) {
ATMList = aTMList;
}
}
class User {
private String ID;
private String name;
private String Phone;
ArrayList<Account> list = new ArrayList<Account>();
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String iD, String name, String phone) {
super();
ID = iD;
this.name = name;
Phone = phone;
}
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getPhone() {
return Phone;
}
public void setPhone(String phone) {
Phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void addAccount(Account account) {
this.list.add(account);
}
public void removeAccount(Account account) {
this.list.remove(account);
}
}
class Account {
private String accountNO;
private double balance = 0;
private User user = null;
private Bank bank = null;
private static ArrayList<Card> list = new ArrayList<Card>();
private int flag=0;
public Account() {
super();
// TODO Auto-generated constructor stub
}
public Account(String accountNO, double balance, User user, Bank bank,int flag) {
super();
this.accountNO = accountNO;
this.balance = balance;
this.user = user;
this.bank = bank;
this.flag = flag;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public void addCard(Card card) {
list.add(card);
}
public void removeCard(Card card) {
list.remove(card);
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getAccountNO() {
return accountNO;
}
public void setAccountNO(String accountNO) {
this.accountNO = accountNO;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Bank getBank() {
return bank;
}
public void setBank(Bank bank) {
this.bank = bank;
}
public ArrayList<Card> getList() {
return list;
}
public void setList(ArrayList<Card> list) {
Account.list = list;
}
public static Account getAmountbyCardNO(String cardNO) {
Iterator<Card> cardItr = Account.list.iterator();
Card card = null;
while(cardItr.hasNext()) {
card = cardItr.next();
if(card.getCardNO().equals(cardNO)) {
return card.getAccount();
}
}
return null;
}
}
class Card {
private String cardNO;
private String cardPassword;
private Account account = null;
public Card() {
super();
// TODO Auto-generated constructor stub
}
public Card(String cardNO, String cardPassword, Account account) {
super();
this.cardNO = cardNO;
this.cardPassword = cardPassword;
this.account = account;
}
public String getCardNO() {
return cardNO;
}
public void setCardNO(String cardNO) {
this.cardNO = cardNO;
}
public String getCardPassword() {
return cardPassword;
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
public void setCardPassword(String cardPassword) {
this.cardPassword = cardPassword;
}
public boolean checkCard() {
Pattern p = Pattern.compile("\\d{16}+");
Matcher m = p.matcher(this.cardNO);
return m.matches();
}
public boolean checkPassword(String password) {
return this.cardPassword.equals(password);
}
}
class ATM {
private String ATMID;
private Bank bank = null;
public ATM() {
super();
// TODO Auto-generated constructor stub
}
public ATM(String aTMID, Bank bank) {
super();
ATMID = aTMID;
this.bank = bank;
}
public String getATMID() {
return ATMID;
}
public void setATMID(String aTMID) {
ATMID = aTMID;
}
public Bank getBank() {
return bank;
}
public void setBank(Bank bank) {
this.bank = bank;
}
}
class Withdraw {
private UnionPay unionPay;
private String cardNO;
private String cardPassword;
private String ATMID;
private double amount;
public Withdraw() {
super();
// TODO Auto-generated constructor stub
}
public Withdraw(UnionPay unionPay, String cardNO, String cardPassword, String aTMID, double amount) {
super();
this.unionPay = unionPay;
this.cardNO = cardNO;
this.cardPassword = cardPassword;
ATMID = aTMID;
this.amount = amount;
}
public Withdraw(String cardNO, String cardPassword, String aTMID, double amount) {
super();
this.cardNO = cardNO;
this.cardPassword = cardPassword;
ATMID = aTMID;
this.amount = amount;
}
public void withdraw() {
/**
* 校验该卡是否存在
*/
Card card = ValidateData.getCardbyCardNO(unionPay, cardNO);
if(card == null) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}
/**
* 校验ATM是否存在
*/
ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID);
if(aTM == null) {
System.out.println("Sorry,the ATM's id is wrong.");
System.exit(0);
}
Account account = Account.getAmountbyCardNO(cardNO);//获取了一个对象
//System.out.println(account.getAccountNO());
double balance = account.getBalance();
/**
* 校验卡密码是否正确
*/
if(!card.getCardPassword().equals(cardPassword)) {
System.out.println("Sorry,your password is wrong.");
System.exit(0);
}
/**
* 校验取款金额是否大于余额
*/
if (amount >balance&&account.getFlag()==0) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
else if(account.getFlag()==1&&(balance-amount*1.05)<-50000) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
/**
* 校验是否为跨行取款并获取余额
*/
if(account.getFlag()==0) {
if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
if(aTM.getBank().getBankNO()=="1001")
account.setBalance(balance - amount-0.02*amount);
if(aTM.getBank().getBankNO()=="1002")
account.setBalance(balance - amount-0.03*amount);
if(aTM.getBank().getBankNO()=="1003")
account.setBalance(balance - amount-0.04*amount);
if (amount>account.getBalance()) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
if(amount >= 0) {
showResult(account,1,aTM);
}else {
showResult(account,0,aTM);
}
//System.exit(0);
}
else {
account.setBalance(balance - amount);//取款更新余额操作
if(amount >= 0) {
showResult(account,1,aTM);
}else {
showResult(account,0,aTM);
}
}}//借记账户------------------------------------------
else {
if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
if(amount>balance&&balance>0) {
if(aTM.getBank().getBankNO()=="1001")
account.setBalance(balance - amount-0.02*amount- (amount-balance)*0.05);
if(aTM.getBank().getBankNO()=="1002")
account.setBalance(balance - amount-0.03*amount- (amount-balance)*0.05);
if(aTM.getBank().getBankNO()=="1003")
account.setBalance(balance - amount-0.04*amount- (amount-balance)*0.05);
if (account.getBalance()<-50000) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
if(amount >= 0) {
showResult(account,1,aTM);
}else {
showResult(account,0,aTM);
}
}//余额不足且余额为正
else if(amount>balance&&balance<=0) {
if(aTM.getBank().getBankNO()=="1001")
account.setBalance(balance - amount-0.02*amount- amount*0.05);
if(aTM.getBank().getBankNO()=="1002")
account.setBalance(balance - amount-0.03*amount- amount*0.05);
if(aTM.getBank().getBankNO()=="1003")
account.setBalance(balance - amount-0.04*amount- amount*0.05);
if (account.getBalance()<-50000) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
if(amount >= 0) {
showResult(account,1,aTM);
}else {
showResult(account,0,aTM);
}
}
else {
if(aTM.getBank().getBankNO()=="1001")
account.setBalance(balance - amount-0.02*amount);
if(aTM.getBank().getBankNO()=="1002")
account.setBalance(balance - amount-0.03*amount);
if(aTM.getBank().getBankNO()=="1003")
account.setBalance(balance - amount-0.04*amount);
if (account.getBalance()-amount <-50000) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
if(amount >= 0) {
showResult(account,1,aTM);
}else {
showResult(account,0,aTM);
}
//System.exit(0);
}
}//跨行办理
else {
if(balance<amount&&balance>0) {
account.setBalance(balance - (amount-balance)*0.05-amount);
}
else if(balance<amount&&balance<=0){
account.setBalance(balance - amount*0.05-amount);
}
else
account.setBalance(balance - amount);//取款更新余额操作
if (account.getBalance()-amount <-50000) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
if(amount >= 0) {
showResult(account,1,aTM);
}else {
showResult(account,0,aTM);
}
}
}//贷记账户---------------------------
}
public void showResult(Account account,int flag,ATM aTM) {
String type = "";
if(flag == 1) {
type = "取款";
}else {
type = "存款";
amount *= -1;
}
String userName = account.getUser().getName();
String bankName =aTM.getBank().getBankName();
System.out.println("业务:"+type+" "+userName + "在" +
bankName + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount));
System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance()));
}
}
class ValidateData {
/**
* 校验卡号是否存在
* @param unionPay
* @param cardNO
* @return
*/
public static Card getCardbyCardNO(UnionPay unionPay,String cardNO) {
Card card = null;
Iterator<Bank> bankItr = unionPay.getBankList().iterator();
while(bankItr.hasNext()) {
ArrayList<Account> accountList = bankItr.next().getAccountList();
Iterator<Account> accountItr = accountList.iterator();
while(accountItr.hasNext()) {
ArrayList<Card> cardList = accountItr.next().getList();
Iterator<Card> cardItr = cardList.iterator();
while(cardItr.hasNext()) {
card = cardItr.next();
if(card.getCardNO().equals(cardNO)) {
return card;
}
}
}
}
return null;
}
/**
* 校验ATM ID是否存在
* @param unionPay
* @param ATMID
* @return
*/
public static ATM getATMbyATMID(UnionPay unionPay,String ATMID) {
Iterator<Bank> bankItr = unionPay.getBankList().iterator();
Bank bank = null;
ATM aTM = null;
while(bankItr.hasNext()) {
bank = bankItr.next();
Iterator<ATM> aTMItr = bank.getATMList().iterator();
while(aTMItr.hasNext()) {
aTM = aTMItr.next();
if(aTM.getATMID().equals(ATMID)) {
return aTM;
}
}
}
return null;
}
}
class UnionPay {
private ArrayList<Bank> bankList = new ArrayList<Bank>();
public UnionPay() {
super();
// TODO Auto-generated constructor stub
}
public UnionPay(ArrayList<Bank> bankList) {
super();
this.bankList = bankList;
}
public ArrayList<Bank> getBankList() {
return bankList;
}
public void setBankList(ArrayList<Bank> bankList) {
this.bankList = bankList;
}
public void addBank(Bank bank) {
this.bankList.add(bank);
}
public void removeBank(Bank bank) {
this.bankList.remove(bank);
}
}
class GetBalance {
private UnionPay unionPay;
public GetBalance() {
super();
// TODO Auto-generated constructor stub
}
public GetBalance(UnionPay unionPay) {
super();
this.unionPay = unionPay;
}
public double getBalance(String cardNO) {
return ValidateData.getCardbyCardNO(unionPay, cardNO).getAccount().getBalance();
}
}
4.改进建议:最后一次作业了,就不写什么改进建议了吧,建议百度不要老给我推值发广告我搜代码但我没秃呀没秃!
5.总结:PTA里的测试点,测试用例主要从边界值,特殊值,错误输入值这三方面来检验。因此debug是必不可少的。Debug可以在每一步中检查每一个值,表达式的变化,找到异常的数值,从而找出错误,这样会让测试更加简便。
经过本学期对JAVA的学习,我们对OOP也有所理解和感悟。面向对象程序设计有封装性、继承性与多态性三大技术特性。这三个技术特性的关系密切,封装可以使代码模块化,而继承可以实现父类子类之间模块的联系,再赋予多态用于接口,使接口重用。这样相互配合就可以提高代码的逻辑性和复用性。总结起来就是一句话OOP=对象+类+继承+多态+消息。
其次就是面向对象设计有两个基本原则,单一职责原则和开闭原则。单一职责原则是一个类只负责一项职责。而开闭原则是指应该对扩展开放,对修改关闭。换句话说,如果修改或者添加一个功能,应该是通过扩展原来的代码,而不是通过修改原来的代码。
最后要说的是UML图的应用。在平时的作业里我发现给了UML图程序实现起来就很轻松,而没有UML的程序就需要你自己去设计。“类”顾名思义起到了分类的作用,让你的程序更有逻辑性和可读性,成为你解决问题的框架。同时也提升了复用性。再结合封装性、继承性与多态性三大技术特性也就完成了OOP。
浙公网安备 33010602011771号