OOP第三次总结分析作业
一、前言
本次为对题目集7-9的分析总结,题量越来越少,反之,题目难度有明显的提升。
题目集7的知识点:
- 继承、多态的应用;
- ArrayList泛型的应用方法
- Comparable接口及泛型的应用
- 单一职责原则的应用
- “开-闭”原则的应用
题目集8的知识点:
- 对象的封闭性,可拓展性
- 各实体类之间的关系,一对多的组合关系
- 单一职责原则的应用
题目集9的知识点:
- 继承、多态及抽象类的应用
二、设计与分析
1.题目集7两题的递进式设计分析总结:
①shape类实现Comparable<>接口,由circle类、rectangle类、triangle类和trapezoid类继承shape类,三个类中都有获得各个图形面积的方法;
设计DealCardList类获取主类中的输入,再对数据进行分类,排序、判断以及输出。
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; import java.util.TreeSet; 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(); } } class DealCardList{ ArrayList<Shape> cardList=new ArrayList<>(); public DealCardList() { } public DealCardList(ArrayList<Integer> list) { //Scanner input = new Scanner(System.in); for (Integer i : list) { if (i==0)break; switch (i){ case 1: Circle circle=new Circle(Main.input.nextDouble()); circle.setShapeName("Circle",circle); cardList.add(circle); break; case 2: Rectangle rectangle=new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()); rectangle.setShapeName("Rectangle",rectangle); cardList.add(rectangle); break; case 3: Triangle triangle=new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()); triangle.setShapeName("Triangle",triangle); cardList.add(triangle); break; case 4: Trapezoid trapezoid=new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()); trapezoid.setShapeName("Trapezoid",trapezoid); cardList.add(trapezoid); break; } } } public boolean validate(){ for (Shape card : cardList) { if (!card.validate()) return false; break; } return true; } public void cardSort(){ Collections.sort(cardList); for (Shape card : cardList) { System.out.print(card.getShape()); } } public double getAllArea(){ double sum=0; for (Shape card : cardList) { sum+=card.getArea(); } return sum; } public void showResult(){ System.out.println("The original list:"); for (Shape card : cardList) { System.out.print(card.getShape()); } System.out.println(); System.out.println("The sorted list:"); cardSort(); System.out.println(); System.out.printf("Sum of area:%.2f\n",getAllArea()); } } abstract class Shape implements Comparable<Shape>{ private String shapeName; Shape shape; public Shape() { } public Shape(String shapeName) { this.shapeName = shapeName; } public String getShapeName() { return shapeName; } public void setShapeName(String shapeName,Shape shape) { this.shapeName = shapeName; this.shape = shape; } public Shape getShape(){ this.shape=shape; return shape; } public abstract double getArea(); public abstract boolean validate(); /** * 重写了toString的方法 * 利用Shape类的shapeName变量来表示相应的图形, * 而不是用getclass方法得到类名 * @return */ public int compareTo(Shape shape) { return (int)(shape.getArea()-this.shape.getArea()); } @Override public String toString() { return getShapeName()+":"+String.format("%.2f ",getArea()); } } class Circle extends Shape{ private double radius; public Circle() { } public Circle(double radius) { this.radius = radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } @Override public double getArea() { return Math.PI*radius*radius; } @Override public boolean validate() { return this.radius>0; } } class Rectangle extends Shape{ private double width,height; public Rectangle() { } public Rectangle(double width, double height) { this.width = width; this.height = height; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } @Override public double getArea() { return height*width; } @Override public boolean validate() { return width>0&&height>0; } } class Triangle extends Shape{ private double side1,side2,side3; public Triangle() {} public Triangle(double side1, double side2, double side3) { this.side1 = side1; this.side2 = side2; this.side3 = side3; } @Override public double getArea() { double s=0,area=0; s=(side1 +side2 +side3)/2; area = Math.sqrt(s*(s-side1)*(s-side2)*(s-side3)); return area; } @Override public boolean validate() { if (side1+side2>side3&&side1+side3>side2&&side2+side3>side1) return true; else return false; } } class Trapezoid extends Shape{ private double topSide,bottomSide,height; public Trapezoid() {} public Trapezoid(double topSide, double bottomSide, double height) { this.topSide = topSide; this.bottomSide = bottomSide; this.height = height; } @Override public double getArea() { return (topSide+bottomSide)*height/2; } @Override public boolean validate() { return topSide>0&&height>0&&bottomSide>0; } }


②7-2在7-1的基础上进行稍加改动,只需添加各自的arraylist链表存入图形数据,输出添加一些数据即可


2.题目集8和9ATM仿真题目的设计分析总结:
①创建银行类、账户类、ATM类、银行卡类分别管理输入的信息,储存于链表内,类与类之间实现调用关系实现相关输出,采用迭代器判断数据是否合理。
相关类图如下:


②在题目集8的基础上添加贷款的功能,只需添加判断即可
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("360722199810107788","张三丰","18178974177"); User linghuchong = new User("360223197711111211","令狐冲","15727763677"); User qiaofeng = new User("360788200908099988","乔峰","13670987877"); User hongqigong = new User("360229299209091188","洪七公","13226276655"); Account ccbAcc1 = new Account("3217000010041315709",10000.00,Yangguo,ccb); Account ccbAcc2 = new Account("3217000010041315715",10000.00,Yangguo,ccb); Account ccbAcc3 = new Account("3217000010051320007",10000.00,Guojing,ccb); Account icbcAcc1 = new Account("3222081502001312389",10000.00,Zhangwuji,icbc); Account icbcAcc2 = new Account("3222081502001312390",10000.00,Zhangwuji,icbc); Account icbcAcc3 = new Account("3222081502001312399",10000.00,Zhangwuji,icbc); Account icbcAcc4 = new Account("3222081502051320785",10000.00,Weixiaobao,icbc); Account icbcAcc5 = new Account("3222081502051320786",10000.00,Weixiaobao,icbc); Account ccbAcc4 = new Account("3640000010045442002",10000.00,zhangsanfeng,ccb); Account icbcAcc6 = new Account("3640000010045441009",10000.00,linghuchong,icbc); Account abcAcc1 = new Account("3630000010033431001",10000.00,qiaofeng,abc); Account abcAcc2 = new Account("3630000010033431008",10000.00,hongqigong,abc); 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); 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 ccbCard11 = new Card("6640000010045442002","88888888",ccbAcc4); Card ccbCard12 = new Card("6640000010045442003","88888888",ccbAcc4); Card icbcCard13 = new Card("6640000010045441009","88888888",icbcAcc6); Card abcCard14 = new Card("6630000010033431001","88888888",abcAcc1); Card abcCard15 = new Card("6630000010033431008","888888888",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(ccbCard11); ccbAcc4.addCard(ccbCard12); icbcAcc6.addCard(icbcCard13); abcAcc1.addCard(abcCard14); abcAcc2.addCard(abcCard15); StringBuilder sb = new StringBuilder(); 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>(); public Account() { super(); // TODO Auto-generated constructor stub } public Account(String accountNO, double balance, User user, Bank bank) { super(); this.accountNO = accountNO; this.balance = balance; this.user = user; this.bank = bank; } 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 = 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); double balance = account.getBalance(); /** * */ if(!card.getCardPassword().equals(cardPassword)) { System.out.println("Sorry,your password is wrong."); System.exit(0); } /** * */ if (amount > balance) { if(!cardNO.equals("6640000010045442002")&&!cardNO.equals("6640000010045442003")&& !cardNO.equals("6640000010045441009")&&!cardNO.equals("6630000010033431001")&&!cardNO.equals("6630000010033431008")) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } } /** * */ // if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) { // System.out.println("Sorry,cross-bank withdrawal is not supported."); // System.exit(0); // } if(account.getBank().getBankNO() != aTM.getBank().getBankNO()) { if(amount-balance>50000) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } else { if(amount-balance<0) { if(aTM.getBank().getBankNO()=="1001") account.setBalance(balance - amount*1.02); else if(aTM.getBank().getBankNO()=="1002") account.setBalance(balance - amount*1.03); else account.setBalance(balance - amount*1.04); } else { if(aTM.getBank().getBankNO()=="1001") { if(!cardNO.equals("6640000010045442002")&&!cardNO.equals("6640000010045442003")&& !cardNO.equals("6640000010045441009")&&!cardNO.equals("6630000010033431001")&&!cardNO.equals("6630000010033431008")) { if(balance - amount*1.02-(amount-balance)*0.05<0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } else account.setBalance(balance - amount*1.02-(amount-balance)*0.05); } else account.setBalance(balance - amount*1.02-(amount-balance)*0.05); } else if(aTM.getBank().getBankNO()=="1002") { if(!cardNO.equals("6640000010045442002")&&!cardNO.equals("6640000010045442003")&& !cardNO.equals("6640000010045441009")&&!cardNO.equals("6630000010033431001")&&!cardNO.equals("6630000010033431008")) { if(balance - amount*1.03-(amount-balance)*0.05<0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } else account.setBalance(balance - amount*1.03-(amount-balance)*0.05); } else account.setBalance(balance - amount*1.03-(amount-balance)*0.05); } else { if(!cardNO.equals("6640000010045442002")&&!cardNO.equals("6640000010045442003")&& !cardNO.equals("6640000010045441009")&&!cardNO.equals("6630000010033431001")&&!cardNO.equals("6630000010033431008")) { if(balance - amount*1.04-(amount-balance)*0.05<0) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } else account.setBalance(balance - amount*1.04-(amount-balance)*0.05); } else account.setBalance(balance - amount*1.04-(amount-balance)*0.05); } } } } else { if(amount-balance<0) account.setBalance(balance - amount);// else account.setBalance(balance - (amount-balance)*0.05-amount); } if(amount >= 0) { showResult(account,1); }else { showResult(account,0); } } public void showResult(Account account,int flag) { String type = ""; if(flag == 1) { type = "取款"; }else { type = "存款"; amount *= -1; } ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID); String userName = account.getUser().getName(); //String bankName = account.getBank().getBankName(); 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; } /** * * @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(); } }


三、踩坑心得
1.题目集7-1中较难解决的问题是重写compareTo方法以及要熟练运用Arraylist链表的处理方法,7-2只需在7-1的基础上完善一些代码即可,没有复杂之处。

2.题目集8和9重点在于合理规划所得数据,存入恰当的类中,各类所需要的方法大体一致,困难之处在于实现功能的方法,我借鉴采用老师提供的思路加以完善,但对于某些测试点的正误仍然无从判别。

四、改进建议
1.Arraylist对于分组数据的处理作用极大,还可以将不同组数据进行绑定,熟练掌握相关功能能极大优化代码量;
2.对于数据的比较可以实现接口comparable,重写toString方法有助于输出的简化;
3.collection排序可以对对象排序;
五、总结
1.多看书勤思考,遇事不决上百度,迫不得已问同学,自己思考出来的才能成为自己的,学习是先模仿再理解的过程,在这之上可以实现创新,写代码是很好的锻炼思维的机会。
2.多学多练才能有提高,先动脑再动手,好的思路是成功的关键,方向错了怎么走都是错的。


浙公网安备 33010602011771号