7-9题总结
一、前言
题集七
7-1
知识点:掌握类的继承、多态性使用方法以及接口的应用
难度:较简单
7-2
知识点:掌握类的继承、多态性使用方法以及接口的应用。
难度:较简单
题集八
7-1
知识点:考察设计及实现类,单一职责原则
难度:中
题集九
7-1
知识点:考察类拓展功能
难度:中
二、设计与分析
题集七
7-1
设计总结:父类Shape,四个图形子类均继承Shape类,实现继承设计。
7-2
设计总结:与7-1相比,增加了分组之后再排序功能,对于同类图形增加一个分组即可。
import java.util.*;
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();
if(num == 0){
System.out.println("Wrong Format");
System.exit(0);
}
while(num != 0){
if(num < 0 || num > 4){
System.out.println("Wrong Format");
System.exit(0);
}
list.add(num);
num = input.nextInt();
}
DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
dealCardList.showResult();
//input.close();
}
}
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 String toString(){
return "";
}
abstract double getArea();
abstract boolean validate();
}
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
double getArea() {
return radius * radius * Math.PI;
}
@Override
boolean validate() {
return radius > 0;
}
}
class Rectangle extends Shape{
private double width,length;
public Rectangle() {
}
public Rectangle(double width, double length) {
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
double getArea() {
return width * length;
}
@Override
boolean validate() {
return width > 0 && length > 0;
}
}
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
double getArea() {
return (topSide + bottomSide) * height / 2;
}
@Override
boolean validate() {
return topSide > 0 && bottomSide > 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
double getArea() {
double p = (side1 + side2 + side3) / 2;
return Math.sqrt(p*(p-side2)*(p-side1)*(p-side3));
}
@Override
boolean validate() {
return side1 > 0 && side2 > 0 && side3 > 0 && (side1 + side2 > side3) && (side2 + side3 > side1) && (side1 + side3 > side2);
}
}
class Card implements Comparable<Card> {
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){
if(shape.getArea() > card.getShape().getArea()){
return -1;
}else if(shape.getArea() == card.getShape().getArea()){
return 0;
}else{
return 1;
}
}
}
class DealCardList{
ArrayList<Card> cardList = new ArrayList<Card>();
ArrayList<Card> circleList = new ArrayList<Card>();
ArrayList<Card> rectangleList = new ArrayList<Card>();
ArrayList<Card> trapezoidList = new ArrayList<Card>();
ArrayList<Card> triangleList = new ArrayList<Card>();
double[] sum = new double[4];
int flag = 0;
public DealCardList() {
}
public DealCardList(ArrayList<Integer> list) {
for (int i = 0; i < list.size(); i++) {
//1 代表圆形卡片,2 代表矩形卡片,3 代表三角形卡片,4 代表梯形卡片
if(list.get(i) == 1){
double r = Main.input.nextDouble();
Circle shape = new Circle(r);
Card card = new Card(shape);
cardList.add(card);
circleList.add(card);
}else if(list.get(i) == 2){
double w = Main.input.nextDouble();
double l = Main.input.nextDouble();
Rectangle shape = new Rectangle(w,l);
Card card = new Card(shape);
cardList.add(card);
rectangleList.add(card);
}else if(list.get(i) == 3){
double l1 = Main.input.nextDouble();
double l2 = Main.input.nextDouble();
double l3 = Main.input.nextDouble();
Triangle shape = new Triangle(l1,l2,l3);
Card card = new Card(shape);
cardList.add(card);
triangleList.add(card);
}else if(list.get(i) == 4){
double l1 = Main.input.nextDouble();
double l2 = Main.input.nextDouble();
double l3 = Main.input.nextDouble();
Trapezoid shape = new Trapezoid(l1,l2,l3);
Card card = new Card(shape);
cardList.add(card);
trapezoidList.add(card);
}
}
}
boolean validate(){
for (int i = 0; i < cardList.size(); i++) {
if(!cardList.get(i).getShape().validate()){
System.out.println(cardList.get(i).getShape().getClass().getName());
return false;
}
}
return true;
}
void cardSort(ArrayList<Card> list){
Collections.sort(list);
}
void display(ArrayList<Card> list){
System.out.print("[");
for (int i = 0; i < list.size() ; i++) {
if(flag == 0){
switch (list.get(i).getShape().getClass().getName()){
case "Circle":
sum[0] += list.get(i).getShape().getArea();
break;
case "Rectangle":
sum[1] += list.get(i).getShape().getArea();
break;
case "Triangle":
sum[2] += list.get(i).getShape().getArea();
break;
case "Trapezoid":
sum[3] += list.get(i).getShape().getArea();
break;
}
}
System.out.print(list.get(i).getShape().getClass().getName() + ":" + String.format("%.2f",list.get(i).getShape().getArea()) + " ");
}
flag = 1;
System.out.print("]");
}
double getAllArea(){
return 0;
}
void showResult(){
System.out.print("The original list:\n");
display(cardList);
System.out.print("\nThe Separated List:\n");
display(circleList);
display(rectangleList);
display(triangleList);
display(trapezoidList);
cardSort(circleList);
cardSort(rectangleList);
cardSort(triangleList);
cardSort(trapezoidList);
System.out.println("\nThe Separated sorted List:");
display(circleList);
display(rectangleList);
display(triangleList);
display(trapezoidList);
Arrays.sort(sum);
//for(int i=0;i<4;i++){
// System.out.println(sum[i]);
//}
System.out.println("\nThe max area:" + String.format("%.2f",sum[3]));
//System.out.println("\nThe sorted list:");
//cardSort();
//for (int i = cardList.size() - 1; i >= 0; i--) {
// System.out.print(cardList.get(i).getShape().getClass().getName() + ":" + String.format("%.2f",cardList.get(i).getShape().getArea()) + " ");
//}
//System.out.printf("\nSum of area:%.2f",sum);
}
}
题集八
7-1
设计总结:设计银联类、银行类、账户类、卡类,ATM类,取款类
前四个类是依次依赖关系。每个类实现独立功能,使得设计拥有独立性。
题集九
7-1
设计总结:在题集八7-1中已经将ATM设计的差不多了,只需要在前基础上补充/修改功能即可。例如在Bank类中增加了maxLoan、loanRate、crossBankRate属性,分别对应最大贷款额度,贷款手续费率,跨行转账手续费率。
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
UnionPay u = new UnionPay();
//添加银行☞银联
Bank js = u.addBank("中国建设银行",50000,0.05,0.02);
Bank gs = u.addBank("中国工商银行",50000,0.05,0.03);
Bank ny = u.addBank("中国农业银行",50000,0.05,0.04);
//添加ATM☞银行
js.addAtm("01");
js.addAtm("02");
js.addAtm("03");
js.addAtm("04");
gs.addAtm("05");
gs.addAtm("06");
ny.addAtm("07");
ny.addAtm("08");
ny.addAtm("09");
ny.addAtm("10");
ny.addAtm("11");
//添加用户☞银行
User yg = js.addUser("杨过");
User gj = js.addUser("郭靖");
User zsf = js.addUser("张三丰");
User zwj = gs.addUser("张无忌");
User wxb = gs.addUser("韦小宝");
User lhc = gs.addUser("令狐冲");
User qf = ny.addUser("乔峰");
User hqg = ny.addUser("洪七公");
//添加账户☞银行
Account yg_1 = yg.addAccount("3217000010041315709",10000,0);
Account yg_2 = yg.addAccount("3217000010041315715",10000,0);
Account gj_1 = gj.addAccount("3217000010051320007",10000,0);
Account zwj_1 = zwj.addAccount("3222081502001312389",10000,0);
Account zwj_2 = zwj.addAccount("3222081502001312390",10000,0);
Account zwj_3 = zwj.addAccount("3222081502001312399",10000,0);
Account wxb_1 = wxb.addAccount("3222081502051320785",10000,0);
Account wxb_2 = wxb.addAccount("3222081502051320786",10000,0);
Account zsf_1 = zsf.addAccount("3640000010045442002",10000,1);
Account lhc_1 = lhc.addAccount("3640000010045441009",10000,1);
Account qf_1 = qf.addAccount("3630000010033431001",10000,1);
Account hqg_1 = hqg.addAccount("3630000010033431008",10000,1);
//添加卡☞用户
yg_1.addCard("6217000010041315709",88888888);
yg_1.addCard("6217000010041315715",88888888);
yg_2.addCard("6217000010041315718",88888888);
gj_1.addCard("6217000010051320007",88888888);
zwj_1.addCard("6222081502001312389",88888888);
zwj_2.addCard("6222081502001312390",88888888);
zwj_3.addCard("6222081502001312399",88888888);
zwj_3.addCard("6222081502001312400",88888888);
wxb_1.addCard("6222081502051320785",88888888);
wxb_2.addCard("6222081502051320786",88888888);
zsf_1.addCard("6640000010045442002",88888888);
zsf_1.addCard("6640000010045442003",88888888);
lhc_1.addCard("6640000010045441009",88888888);
qf_1.addCard("6630000010033431001",88888888);
hqg_1.addCard("6630000010033431008",88888888);
String line;
while( !(line = input.nextLine()).equals("#") ){
String[] sp = line.split("\\s+");
if(sp.length == 1){
//查询操作
WithDraw wd = new WithDraw(u);
wd.setCardSno(sp[0]);
wd.getBalance();
}else{
//存取操作
WithDraw wd = new WithDraw(u);
wd.setCardSno(sp[0]);
wd.setCardPassword(Integer.parseInt(sp[1]));
wd.setAtmId(sp[2]);
wd.setAmount(Double.parseDouble(sp[3]));
wd.deposit();
}
}
}
}
class UnionPay{
ArrayList<Bank> bankList = new ArrayList<Bank>();//银联有多少银行
Bank addBank(String name,double maxLoan,double loanRate,double crossBankRate){
Bank temp = new Bank(name,this,maxLoan,loanRate,crossBankRate);
bankList.add(temp);
return temp;
}
ArrayList<Bank> getBankList(){
return bankList;
}
Bank getBankByName(String name){
for(int i = 0; i<bankList.size(); i++){
if(bankList.get(i).getBankName().equals(name)){
return bankList.get(i);
}
}
return new Bank();
}
}
class Bank{
UnionPay unionpay;//绑定银联
String bankName;//银行名字
double maxLoan;//最大贷款
double loanRate;//贷款手续费
double crossBankRate;//跨行手续费
ArrayList<User> userList = new ArrayList<User>();//银行有多少用户
ArrayList<AutoTeller> autotellerList = new ArrayList<AutoTeller>();//银行有多少ATM
public Bank() {
}
public Bank(String bankName, UnionPay unionpay,double maxLoan,double loanRate,double crossBankRate) {
this.unionpay = unionpay;
this.bankName = bankName;
this.maxLoan = maxLoan;
this.loanRate = loanRate;
this.crossBankRate = crossBankRate;
}
AutoTeller addAtm(String atmId){
AutoTeller temp = new AutoTeller(atmId, this);
autotellerList.add(temp);
return temp;
}
User addUser(String userName){
User temp = new User(userName, this);
userList.add(temp);
return temp;
}
public UnionPay getUnionpay() {
return unionpay;
}
public ArrayList<User> getUserList() {
return userList;
}
public ArrayList<AutoTeller> getAutotellerList() {
return autotellerList;
}
public String getBankName() {
return bankName;
}
}
class User{
Bank bank;//绑定银行
String userName;//用户姓名
ArrayList<Account> accountList = new ArrayList<Account>();//用户有多少账号
public User(String userName, Bank bank) {
this.bank = bank;
this.userName = userName;
}
Account addAccount(String sno, double amount,int cardType){
Account temp = new Account(sno, amount,this,cardType);
accountList.add(temp);
return temp;
}
public ArrayList<Account> getAccountList() {
return accountList;
}
public Bank getBank() {
return bank;
}
public String getUserName() {
return userName;
}
}
class Account{
User user;//绑定用户
String sno;//账号ID
double amount;//账户余额
int cardType;//账户类型 ---0借记账号 ---1 贷记账号
ArrayList<Card> cardList = new ArrayList<Card>();//账号有多少张卡
public Account(String sno,double amount, User user,int cardType) {
this.user = user;
this.amount = amount;
this.sno = sno;
this.cardType = cardType;
}
Card addCard(String cardNo, int cardPw){
Card temp = new Card(cardNo, cardPw, this);
cardList.add(temp);
return temp;
}
public ArrayList<Card> getCardList() {
return cardList;
}
public User getUser() {
return user;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public int getCardType() {
return cardType;
}
}
class Card{
Account account;//绑定账号
String cardNo;//卡号
int cardPassword;//卡密
public Card(String cardNo, int cardPassword, Account account) {
this.account = account;
this.cardNo = cardNo;
this.cardPassword = cardPassword;
}
public int getCardPassword() {
return cardPassword;
}
public String getCardNo() {
return cardNo;
}
public Account getAccount() {
return account;
}
}
class AutoTeller{
Bank bank;//绑定银行
String AtmId;//当前ATM的ID
public AutoTeller(String atmId, Bank bank) {
this.bank = bank;
AtmId = atmId;
}
public String getAtmId() {
return AtmId;
}
public Bank getBank() {
return bank;
}
}
class WithDraw{
UnionPay u;
int cardPassword;
double amount;
String cardSno,atmId;
public WithDraw(UnionPay u) {
this.u = u;
}
public int getCardPassword() {
return cardPassword;
}
public void setCardPassword(int cardPassword) {
this.cardPassword = cardPassword;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public String getCardSno() {
return cardSno;
}
public void setCardSno(String cardSno) {
this.cardSno = cardSno;
}
public String getAtmId() {
return atmId;
}
public void setAtmId(String atmId) {
this.atmId = atmId;
}
double getBalance(){
ValidateData v = new ValidateData(u);
if( !v.isCardExist(cardSno) ){
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}
//System.out.println("业务:查询余额 ¥" + String.format("%.2f", v.getCard().getAccount().getAmount()));
System.out.printf("业务:查询余额 ¥%.2f\n",v.getCard().getAccount().getAmount());
return v.getCard().getAccount().getAmount();
}
void deposit(){
ValidateData v = new ValidateData(u);
if( !v.isCardExist(cardSno) ){
System.out.println("Sorry,this card does not exist.");
return;
// System.exit(0);
}
if( !v.isAtmIdExist(atmId) ){
System.out.println("Sorry,the ATM's id is wrong.");
return;
// System.exit(0);
}
if( !v.isPasswordRight(cardPassword) ){
System.out.println("Sorry,your password is wrong.");
return;
// System.exit(0);
}
double am = 0;
//开始计算总共要减去的金额
//1.判断存取款
if(amount < 0){
//存款
am = amount;
}else{
//取款2.判断账号类型
if(v.getCard().getAccount().getCardType() == 1){
//贷记账号
//3.判断是否需要贷款
if(v.isLoan(amount)){
//需要贷款,则需要扣除手续费
am = amount + (v.getCard().getAccount().getAmount() > 0 ? amount - v.getCard().getAccount().getAmount() : amount ) * v.getCard().getAccount().getUser().getBank().loanRate;
}else{
//不需要贷款 可以直接取款
am = amount;
}
}else{
//借记账号
//3.
am = amount;
}
//4.跨行扣款
if( v.isCrossBank() ){
//扣除跨行手续费跨行
am += amount * v.getAtm().getBank().crossBankRate;
}
//5.判断共扣款是否大于 余额(含透支)
if( !v.isMoneyBigThanAmount(am, v.getCard().getAccount().getCardType() == 1 ? true : false) ){
System.out.println("Sorry,your account balance is insufficient.");
return;
// System.exit(0);
}
}
v.getCard().getAccount().setAmount( v.getCard().getAccount().getAmount() - am );
String OperateName = amount > 0 ? "取款" : "存款";
//System.out.println("业务:" + OperateName + " " + v.getCard().getAccount().getUser().getUserName() + "在" + v.getAtm().getBank().getBankName() + "的" + v.getAtm().getAtmId() + "号ATM机上" + OperateName + "¥" + String.format("%.2f",Math.abs(amount)));
//System.out.println("当前余额为¥" + String.format("%.2f", v.getCard().getAccount().getAmount()));
System.out.printf("业务:取款 %s在%s的%s号ATM机上取款¥%.2f\n当前余额为¥%.2f\n",
v.getCard().getAccount().getUser().getUserName(),v.getAtm().getBank().getBankName(),v.getAtm().getAtmId(),amount,v.getCard().getAccount().getAmount());
/*if( v.isCrossBank() ){
System.out.println("Sorry,cross-bank withdrawal is not supported.");
System.exit(0);
}*/
//double am = 0;
//if(amount < 0){
// //存款
// am = v.getCard().getAccount().getAmount() - amount;
//}else if(v.getCard().getAccount().cardType == 1){
// //贷记账户取款
// if( v.isLoan(amount) ){
// //如果需要贷款 则要扣除贷款手续费
// //System.out.println(v.getCard().getAccount().getAmount() + "-" + amount + "-" + ( amount - v.getCard().getAccount().getAmount() ) * v.getCard().getAccount().getUser().getBank().loanRate);
// am = amount - ( v.getCard().getAccount().getAmount() > 0 ? amount - v.getCard().getAccount().getAmount() : amount ) * v.getCard().getAccount().getUser().getBank().loanRate;
// }else{
// //如果不需要贷款
// am = amount;
// }
// if( v.isCrossBank() ){
// //扣除跨行手续费跨行
// am -= amount * v.getAtm().getBank().crossBankRate;
// //System.out.print("&" + amount * v.getCard().getAccount().getUser().getBank().crossBankRate);
// }
//}else{
// //借记账号
//
//}
//
//v.getCard().getAccount().setAmount( am );
//String OperateName = amount > 0 ? "取款" : "存款";
//System.out.println("业务:取款 " + v.getCard().getAccount().getUser().getUserName() + "在" + v.getAtm().getBank().getBankName() + "的" + v.getAtm().getAtmId() + "号ATM机上取款¥" + String.format("%.2f",Math.abs(amount)));
//System.out.println("当前余额为¥" + String.format("%.2f", v.getCard().getAccount().getAmount()));
////System.out.println( v.getCard().getAccount().getUser().getUserName() + "在" + v.getCard().getAccount().getUser().getBank().getBankName() + "的" + v.getAtm().getAtmId() + "号ATM机上" + OperateName + "¥" + String.format("%.2f" , Math.abs(amount)) + "\n当前余额为¥" + String.format("%.2f", v.getCard().getAccount().getAmount()));
}
}
class ValidateData{
UnionPay u;
Card card;
AutoTeller atm;
public ValidateData(UnionPay u) {
this.u = u;
}
boolean isCardExist(String cardNo){//判断是否存在该卡号
ArrayList<Bank> bankList = u.getBankList();
for(int i = 0; i < bankList.size(); i++){
ArrayList<User> userList = bankList.get(i).getUserList();
for(int j = 0; j < userList.size(); j++){
ArrayList<Account> accountList = userList.get(j).getAccountList();
for(int m = 0; m < accountList.size(); m++){
ArrayList<Card> cardList = accountList.get(m).getCardList();
for(int n = 0; n < cardList.size(); n++){
if(cardList.get(n).getCardNo().equals(cardNo)){
card = cardList.get(n);
return true;
}
}
}
}
}
return false;
}
boolean isAtmIdExist(String id){
ArrayList<Bank> bankList = u.getBankList();
for(int i = 0; i < bankList.size(); i++){
ArrayList<AutoTeller> atmList = bankList.get(i).getAutotellerList();
for(int j = 0; j < atmList.size(); j++){
if(atmList.get(j).getAtmId().equals(id)){
atm = atmList.get(j);
return true;
}
}
}
return false;
}
boolean isPasswordRight(int pw){
if ( card.getCardPassword() == pw ){
return true;
}
return false;
}
boolean isMoneyBigThanAmount(double money,boolean canLoan){
if(canLoan){
if ( card.getAccount().getAmount() + card.getAccount().getUser().getBank().maxLoan >= money ){//有的+可贷的
return true;
}
}else{
if ( card.getAccount().getAmount() >= money ){//有的
return true;
}
}
return false;
}
boolean isLoan(double money){
//是否需要贷款
if ( card.getAccount().getAmount() < money ){
return true;
}
return false;
}
boolean isCrossBank(){
if( card.getAccount().getUser().getBank().getBankName().equals( atm.getBank().getBankName() ) ){
return false;//不是跨行
}
return true;//是跨行
}
public Card getCard() {
return card;
}
public AutoTeller getAtm() {
return atm;
}
}
三、采坑心得
在ATM设计的两题中,在第一题时花较多时间在类的设计上,思考怎么设计类能更加简便,达到面向对象设计,而不是仅仅通过多次if-else的面向过程设计。
在第二道ATM设计题中,对于跨行处理、对于贷款处理需要注意,贷款的时候,金额不一定是取款金额,而是取款金额-余额才是贷款金额。同时对于数据的初始化要注意有没有多空格、少数字之类的问题。
四、改进建议
1.在写代码之前先进行构思这样会很有效率。
2.在卡片题目中虽然使用了多态但是没用将多态贯彻到底这就使代码还是出现了一些美中不足,在ATM机的题目中没有正确的运用多态,虽然想到使用多态但是却不能正确的运用。这样就要加强对多态的练习,不仅要有使用多态的意识还要学会怎样正确使用多态。
五、总结
经过这三次题目集的锻炼进一步加深了我对类的继承、多态性使用方法以及接口的理解,明白对实体类的设计要做到单一职责原则,合成复用原则,才能编写出合格的代码。同时对集合框架有了进一步的认识,但由于其内容较多,想要灵活使用,还要在日后不断学习,反复使用。
浙公网安备 33010602011771号