第三次BLOG
1)前言:
后面几次作业都综合性比较高,目的是把学的知识都串联起来起来。
第七次作业两道题都是图形卡片分组游戏,只是第二道题增加了些内容,在于考察类设计的合理性和独立性,内容和题量都还好,难度也不大。

第八次和第九次两道题也是一样的只是第九次作业执行加了些内容,都是ATM类结构设计,题量比第七次大,在设计类时考虑的东西比较多。

 
(2)设计与分析:
①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
题目7(7-1)


对代码生成类图的简要分析:
可以在类图中看到Shape的子类包括Circle、Triangle、Rectangle、Trapezoid一共四个子类。
card对象用来储存shape的几种子类,而DealCardList用Arraylist来储存Card对象,形成card的对象数组。
具体的思路就是,将输入的数字转化成形状存入Card的对象数组中,将出入的各个形状的相应数据(如边长,半径等),再利用每一个形状中的方法来计算面积和周长。
源代码如下:
import java.util.ArrayList;
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();
	for(int xx=0;xx<100;) {
		xx++;
	}
	}
	}
class DealCardList{
    ArrayList<Card> cardList=new ArrayList<>();
    DealCardList(){}
    DealCardList(ArrayList<Integer> card){
    	for(Integer integer : card) {
    		for(int xx=0;xx<100;) {
    			xx++;
    		}
    		if(integer==0)
    			break;
    		switch(integer) {
    		case 1:
    			Card card1=new Card(new Circle(Main.input.nextDouble()));
    			card1.getShape().setShapeName("Circle");
                cardList.add(card1);
    			break;
    		case 2:
    			Card card2=new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
                card2.getShape().setShapeName("Rectangle");
                cardList.add(card2);
    			break;
    		case 3:
    			Card card3=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
                card3.getShape().setShapeName("Triangle");
                cardList.add(card3);
    			break;
    		case 4:
    			Card card4=new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
                card4.getShape().setShapeName("Trapezoid");
                cardList.add(card4);
    			break;
    		}
    }
    }
public boolean validate(){
    	boolean ret=true;
    	for(Card card:cardList) {
    		if (!card.getShape().validate()){
                ret=false;
                break;
    	}
    }
    	return ret;
}
public void cardSort() {
	TreeSet<Card> cards = new TreeSet<>(cardList);
    for (Card card : cards) {
        System.out.print(card.getShape());
    }
    }
public double getAllArea(){
    double sum=0;
	for(int xx=0;xx<100;) {
		xx++;
	}
    for (Card card : cardList) {
        sum+=card.getShape().getArea();
    }
    return sum;
}
public void showResult(){
    System.out.println("The original list:");
    for (Card 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());
}
}
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) {
    	for(int xx=0;xx<100;) {
    		xx++;
    	}
        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() {
    	for(int xx=0;xx<100;) {
    		xx++;
    	}
        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 p=(side1+side2+side3)/2;
        return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
    }
    @Override
    public boolean validate() {
        boolean ret=true;
        if (!(side1>0&&side3>0&&side2>0))ret=false;
        else{
            if (!(side1+side2>side3&&side1+side3>side2&&side2+side3>side1))ret=false;
        }
        return ret;
    }
}
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(7-2)

 
可以从这张类图上看得到,总体上与上一题目没有多大的改变,只是在有一些算法的设计上与原来的有一些区别,具体是在输出的时候,要将Rectangle、Triangle、Circle和Trapezoid这几种形状按类型排号,而且还要注意要将输出的每个形状的面积按照大小顺序排序,其实说实话也没又加上多少的难度,可以理解为老师是为了锻炼我们对代码理解的能力。这些额外的加上去的东西就是我们在算法上要考虑的问题,在设计上考虑代码的排版问题。
源代码如下:
import java.util.ArrayList;
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();
	for(int xx=0;xx<100;) {
		xx++;
	}
	}
	}
class DealCardList{
    ArrayList<Card> cardList=new ArrayList<>();
	ArrayList<Card> CircleList=new ArrayList<>();
	ArrayList<Card> RectangleList=new ArrayList<>();
	ArrayList<Card> TriangleList=new ArrayList<>();
	ArrayList<Card> TrapezoidList=new ArrayList<>();
    DealCardList(){}
    DealCardList(ArrayList<Integer> card){
    	for(Integer integer : card) {
    		for(int xx=0;xx<100;) {
    			xx++;
    		}
    		if(integer==0)
    			break;
    		switch(integer) {
    		case 1:
    			Card card1=new Card(new Circle(Main.input.nextDouble()));
    			card1.getShape().setShapeName("Circle");
                cardList.add(card1);
    			break;
    		case 2:
    			Card card2=new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
                card2.getShape().setShapeName("Rectangle");
                cardList.add(card2);
    			break;
    		case 3:
    			Card card3=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
                card3.getShape().setShapeName("Triangle");
                cardList.add(card3);
    			break;
    		case 4:
    			Card card4=new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
                card4.getShape().setShapeName("Trapezoid");
                cardList.add(card4);
    			break;
    		}
    }
    }
public boolean validate(){
    	boolean ret=true;
    	for(Card card:cardList) {
    		if (!card.getShape().validate()){
                ret=false;
                break;
    	}
    }
    	return ret;
}
public void cardSort(ArrayList<Card> cardList) {
	TreeSet<Card> cards = new TreeSet<>(cardList);
	System.out.print("[");
    for (Card card : cards) {
        System.out.print(card.getShape());
    }
    System.out.print("]");
    }
public double getMaxArea(ArrayList<Card> a,ArrayList<Card> b,ArrayList<Card> c,ArrayList<Card> d){
    double sum1=0,sum2=0;
    for (Card card : a) {
        sum1+=card.getShape().getArea();
    }
    for (Card card : b) {
        sum2+=card.getShape().getArea();
    }
    if(sum2>sum1)
    	sum1=sum2;
    for (Card card : c) {
        sum2+=card.getShape().getArea();
    }
    if(sum2>sum1)
    	sum1=sum2;
    for (Card card : d) {
        sum2+=card.getShape().getArea();
    }
    if(sum2>sum1)
    	sum1=sum2;
    return sum1;
}
public void show(ArrayList<Card> cardList) {
	System.out.print("[");
    for (Card card : cardList) {
        System.out.print(card.getShape());
    }
    System.out.print("]");
}
public void showResult(){
    System.out.println("The original list:");
    show(cardList);
    System.out.println();
    fenzu();
    System.out.println("The Separated List:");
    //输出圆分组
    show(CircleList);
  //输出矩形分组
    show(RectangleList);
  //输出三角分组
    show(TriangleList);
  //输出梯形分组
    show(TrapezoidList);
    System.out.println();
    System.out.println("The Separated sorted List:");
    cardSort(CircleList);
    cardSort(RectangleList);
    cardSort(TriangleList);
    cardSort(TrapezoidList);
    
    System.out.println();
    System.out.printf("The max area:%.2f",getMaxArea(CircleList,RectangleList,TriangleList,TrapezoidList));
}
public void fenzu() {
	for(Card card:cardList) {
		if(card.getShape().getShapeName().equals("Circle"))
			CircleList.add(card);
		if(card.getShape().getShapeName().equals("Rectangle"))
			RectangleList.add(card);
		if(card.getShape().getShapeName().equals("Triangle"))
			TriangleList.add(card);
		if(card.getShape().getShapeName().equals("Trapezoid"))
			TrapezoidList.add(card);
	}
}
}
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) {
    	for(int xx=0;xx<100;) {
    		xx++;
    	}
        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() {
    	for(int xx=0;xx<100;) {
    		xx++;
    	}
        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 p=(side1+side2+side3)/2;
        return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
    }
    @Override
    public boolean validate() {
        boolean ret=true;
        if (!(side1>0&&side3>0&&side2>0))ret=false;
        else{
            if (!(side1+side2>side3&&side1+side3>side2&&side2+side3>side1))ret=false;
        }
        return ret;
    }
}
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;
    }
}
②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题目集8

 
一定要坚持独立性原则,一个事物一个类,不然要对代码进行优化的时候会很艰难。
如上类图内容包括ATM继承并且关联Agent类,然后Agent关联Bank类最后用main类将ATM类,Agent类,User类Account类,Bank类集合起来处理。
可能类中还有一些关系没有表示出来,可能是因为生成类图工具的原因
源代码如下:
import java.util.Scanner;
import java.util.ArrayList;
//Bank类
class Bank {
    private String bankname;
    private ArrayList<String> ATMList;
    //创建无参构造方法
    public Bank(){
    }
    //创建带参构造方法
    public Bank(String bankname,ArrayList<String> ATMList)
    {
        this.bankname=bankname;
        this.ATMList=ATMList;
    }
    //getter
    public String getBankname() {
        return bankname;
    }
    public ArrayList<String> getATMList() {
        return ATMList;
    }
    //setter
    public void setBankname(String bankname){
        this.bankname=bankname;
    }
    public void setATMList(ArrayList<String> tATMList){
        this.ATMList=ATMList;
    }
}
//Account类
class Account {
    private String name;
    private String account;
    private String password;
    private double balance;
    Bank bank;
    private  ArrayList<String> cardList;
    //创建无参构造方法
    public Account(){
    }
    //创建带参构造方法
    public Account(String name,String account,String password,double balance,Bank bank,ArrayList<String> cardList){
        this.name=name;
        this.account=account;
        this.password=password;
        this.balance=balance;
        this.bank=bank;
        this.cardList=cardList;
    }
    //getter
    public String getName() {
        return name;
    }
    public String getAccount() {
        return account;
    }
    public String getPassword() {
        return password;
    }
    public double getBalance() {
        return balance;
    }
    public ArrayList<String> getCardList() {
        return cardList;
    }
    //setter
    public void setName(String name) {
        this.name = name;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    public void setCardList(ArrayList<String> cardList) {
        this.cardList = cardList;
    }
}
class Check{
    String card;
    String passport;
    String ATMId;
    double digit;
    ArrayList<Account> accountList;
    int flag=0;
    int i,j,k;
    boolean z=true;
    public Check(ArrayList<Account> accountList,String card,String passport,String ATMId,double digit){
        this.ATMId=ATMId;
        this.card=card;
        this.digit=digit;
        this.passport=passport;
        this.accountList=accountList;
    }
    public Check(ArrayList<Account> accountList,String card){
        this.card=card;
        this.accountList=accountList;
    }
    void AllCheck() {
        //验证输入卡号是否存在
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j))) {
                    flag = 1;
                    k = i;
                }
            }
        }
        if (flag == 0) {
            System.out.println("Sorry,this card does not exist.");
            System.exit(0);
        }
        flag = 0;
        //验证输入ATM号是否存在
        if (ATMId.equals("01") || ATMId.equals("02") || ATMId.equals("03") || ATMId.equals("04") || ATMId.equals("05") || ATMId.equals("06")) {
            flag = 1;
        }
        if (flag == 0) {
            System.out.println("Sorry,the ATM's id is wrong.");
            System.exit(0);
        }
        flag = 0;
        //验证银行卡密码是否存在
        if (!passport.equals("88888888")) {
            System.out.println("Sorry,your password is wrong.");
            System.exit(0);
        }
        //验证取款金额是否大于余额
        if (digit>0&&digit >= accountList.get(k).getBalance()) {
            System.out.println("Sorry,your account balance is insufficient.");
            System.exit(0);
        }
        //检测是否为跨行存取款
        for (i = 0; i < accountList.get(k).bank.getATMList().size(); i++) {
            if (ATMId.equals(accountList.get(k).bank.getATMList().get(i))) {
                flag=1;
            }
        }
        if(flag==0){
            System.out.println("Sorry,cross-bank withdrawal is not supported.");
            System.exit(0);
        }
    }
    void CardExist(){
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j))) {
                    flag = 1;
                }
            }
        }
        if (flag == 0) {
            System.out.println("Sorry,this card does not exist.");
            System.exit(0);
        }
    }
}
class Operation{
    String card;
    double digit;
    String ATM;
    ArrayList<Account> accountList;
    int i,j,t;
    public Operation(ArrayList<Account> accountList,String card){
        this.accountList=accountList;
        this.card=card;
    }
    public Operation(ArrayList<Account> accountList,String card,String ATM,double digit){
        this.accountList=accountList;
        this.card=card;
        this.ATM=ATM;
        this.digit=digit;
    }
    void CunQU(){
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j))) {
                    t=i;
                }
            }
        }
        if(digit>0){
            accountList.get(t).setBalance(accountList.get(t).getBalance()-digit);
            System.out.printf(accountList.get(t).getName()+"在"+accountList.get(t).bank.getBankname()+"的"+ATM+"号ATM机上取款¥%.2f\n",digit);
            System.out.printf("当前余额为¥%.2f\n",accountList.get(t).getBalance());
        }
        else{
            double digit1=-digit;
            accountList.get(t).setBalance(accountList.get(t).getBalance()-digit);
            System.out.printf(accountList.get(t).getName()+"在"+accountList.get(t).bank.getBankname()+"的"+ATM+"号ATM机上存款¥%.2f\n",digit1);
            System.out.printf("当前余额为¥%.2f\n",accountList.get(t).getBalance());
        }
    }
    void show(){
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j))){
                    t=i;
                    break;
                }
            }
        }
        System.out.printf("¥%.2f\n",accountList.get(t).getBalance());
    }
}
public class Main {
    public static void main(String[] args){
        //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<String> cardList1 = new ArrayList<>();
        cardList1.add("6217000010041315709");
        cardList1.add("6217000010041315715");
        Account account1 = new Account("杨过", "3217000010041315709", "88888888", 10000.00, jsyh,cardList1);
        ArrayList<String> cardList2 = new ArrayList<>();
        cardList2.add("6217000010041315718");
        Account account2 = new Account("杨过", "3217000010041315715", "88888888", 10000.00, jsyh,cardList2);
        ArrayList<String> cardList3 = new ArrayList<>();
        cardList3.add("6217000010051320007");
        Account account3 = new Account("郭靖", "3217000010051320007", "88888888", 10000.00, jsyh,cardList3);
        ArrayList<String> cardList4 = new ArrayList<>();
        cardList4.add("6222081502001312389");
        Account account4 = new Account("张无忌", "3222081502001312389", "88888888",  10000.00,gsyh,cardList4);
        ArrayList<String> cardList5 = new ArrayList<>();
        cardList5.add("6222081502001312390");
        Account account5 = new Account("张无忌", "3222081502001312390", "88888888",  10000.00,gsyh,cardList5);
        ArrayList<String> cardList6 = new ArrayList<>();
        cardList6.add("6222081502001312399");
        cardList6.add("6222081502001312400");
        Account account6 = new Account("张无忌", "3222081502001312399", "88888888", 10000.00, gsyh,cardList6);
        ArrayList<String> cardList7 = new ArrayList<>();
        cardList7.add("6222081502051320785");
        Account account7 = new Account("韦小宝", "3222081502051320785", "88888888", 10000.00, gsyh,cardList7);
        ArrayList<String> cardList8 = new ArrayList<>();
        cardList8.add("6222081502051320786");
        Account account8 = new Account("韦小宝", "3222081502051320786", "88888888", 10000.00, gsyh,cardList8);
        //用户总数组
        ArrayList<Account> accountList = new ArrayList<>();
        accountList.add(account1);
        accountList.add(account2);
        accountList.add(account3);
        accountList.add(account4);
        accountList.add(account5);
        accountList.add(account6);
        accountList.add(account7);
        accountList.add(account8);
        Scanner xx=new Scanner(System.in);
        String s=xx.nextLine();
        while(!s.equals("#")){
            String[] input=s.split("\\s+");
            if(input.length!=1){
                double money=Double.parseDouble(input[3]);
                Check check=new Check(accountList,input[0],input[1],input[2],money);
                check.AllCheck();
                Operation operation=new Operation(accountList,input[0],input[2],money);
                operation.CunQU();
            }
            else{
                Check check=new Check(accountList,input[0]);
                check.CardExist();
                Operation operation=new Operation(accountList,input[0]);
                operation.show();
            }
            s=xx.nextLine();
        }
    }
}
题目集9


整体代码综合性高,考察的方面较为广泛,对学生的各方面考察较为具体。主要考查的是与题目集8一样的类与类之间的关系,搞清楚类与类之间的关系来这种题目就迎刃而解了。与题目集8最大的不同就是,题目集9在题目及8的基础上加上了一些再类关系处理上的复杂性,因为加入了关于借记卡和贷记卡的账户样式,加入了关于跨行取款利息与超额取款利息的细节,准确理解老师的意图,在类的关系上加上这样的一些东西。
源代码如下:
import java.util.Scanner;
import java.util.ArrayList;
class Card{
    double balance;
    String name;
    Card(String name,double balance) {
        this.balance = balance;
        this.name = name;
    }
}
//Bank类
class Bank {
    private String bankname;
    private ArrayList<String> ATMList;
    private double khCharge;
    private double tzCharge=0.05;
    private double tzMax=50000;
    //创建无参构造方法
    public Bank(){
    }
    //创建带参构造方法
    public Bank(String bankname,ArrayList<String> ATMList,double khCharge)
    {
        this.bankname=bankname;
        this.ATMList=ATMList;
        this.khCharge=khCharge;
    }
    //getter
    public String getBankname() {
        return bankname;
    }
    public ArrayList<String> getATMList() {
        return ATMList;
    }
    //setter
    public void setBankname(String bankname){
        this.bankname=bankname;
    }
    public void setATMList(ArrayList<String> tATMList){
        this.ATMList=ATMList;
    }
    public double getKhCharge() {
        return khCharge;
    }
    public void setKhCharge(double khCharge) {
        this.khCharge = khCharge;
    }
}
//Account类
class Account {
    private String name;
    private String account;
    private String password;
    private int Accounttype;//1是借记 2是贷记
    Bank bank;
    private  ArrayList<Card> cardList;
    private ArrayList<Bank> BankList;
    //创建无参构造方法
    public Account(){
    }
    //创建带参构造方法
    public Account(String name,String account,String password,Bank bank,ArrayList<Card> cardList,int Accounttype,ArrayList<Bank> BankList){
        this.name=name;
        this.account=account;
        this.password=password;
        this.bank=bank;
        this.cardList=cardList;
        this.Accounttype=Accounttype;
        this.BankList=BankList;
    }
    //getter
    public String getName() {
        return name;
    }
    public String getAccount() {
        return account;
    }
    public String getPassword() {
        return password;
    }
    public ArrayList<Card> getCardList() {
        return cardList;
    }
    public int getAccounttype(){return Accounttype;}
    //setter
    public void setName(String name) {
        this.name = name;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setCardList(ArrayList<Card > cardList) {
        this.cardList = cardList;
    }
    public void  getAccounttype(int Accounttype){this.Accounttype=Accounttype;}
    public ArrayList<Bank> getBankList() {
        return BankList;
    }
    public void setBankList(ArrayList<Bank> bankList) {
        BankList = bankList;
    }
}
class Check{
    String card;
    String passport;
    String ATMId;
    double digit;
    ArrayList<Account> accountList;
    ArrayList<Bank> BankList;
    int flag=0;
    int i,j,k;
    boolean z=true;
    public Check(ArrayList<Account> accountList,String card,String passport,String ATMId,double digit,ArrayList<Bank> BankList){
        this.ATMId=ATMId;
        this.card=card;
        this.digit=digit;
        this.passport=passport;
        this.accountList=accountList;
        this.BankList=BankList;
    }
    public Check(ArrayList<Account> accountList,String card,ArrayList<Bank> BankList){
        this.card=card;
        this.accountList=accountList;
    }
    void AllCheck() {
        //验证输入卡号是否存在
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j).name)) {
                    flag = 1;
                    k = i;
                }
            }
        }
        if (flag == 0) {
            System.out.println("Sorry,this card does not exist.");
            System.exit(0);
        }
        flag = 0;
        //验证输入ATM号是否存在
        for(i=0;i<BankList.size();i++){
            for(j=0;j<BankList.get(i).getATMList().size();j++){
                if(ATMId.equals(BankList.get(i).getATMList().get(j)))
                flag=1;
            }
        }
        if (flag == 0) {
            System.out.println("Sorry,the ATM's id is wrong.");
            System.exit(0);
        }
        flag = 0;
        //验证银行卡密码是否存在
        if (!passport.equals("88888888")) {
            System.out.println("Sorry,your password is wrong.");
            System.exit(0);
        }
    }
    void CardExist(){
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j).name)) {
                    flag = 1;
                }
            }
        }
        if (flag == 0) {
            System.out.println("Sorry,this card does not exist.");
            System.exit(0);
        }
    }
}
class Operation{
    String card;
    double digit;
    String ATM;
    ArrayList<Account> accountList;
    ArrayList<Bank> BankList;
    int i,j,t,x,z,h;
    double y;
    double money;
    public Operation(ArrayList<Account> accountList,String card,ArrayList<Bank> BankList){
        this.accountList=accountList;
        this.card=card;
        this.BankList=BankList;
    }
    public Operation(ArrayList<Account> accountList,String card,String ATM,double digit,ArrayList<Bank> BankList){
        this.accountList=accountList;
        this.card=card;
        this.ATM=ATM;
        this.digit=digit;
        this.BankList=BankList;
    }
    void CunQU(){
        for (i = 0; i < accountList.size(); i++) {
            for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
                if (card.equals(accountList.get(i).getCardList().get(j).name)) {
                    t=i;
                    h=j;
                }
            }
        }
        for(i=0;i<accountList.get(t).bank.getATMList().size();i++){
            if(ATM.equals(accountList.get(t).bank.getATMList().get(i)))
                x=1;
        }
for(i=0;i<BankList.size();i++){
    for(j=0;j<BankList.get(i).getATMList().size();j++){
        if(ATM.equals(BankList.get(i).getATMList().get(j))) {
            y = BankList.get(i).getKhCharge();
            z = i;
        }
    }
}
        if(digit>0){
            if(x==1) {//没跨行
                if(accountList.get(t).getAccounttype()==1){//借记
                    money=accountList.get(t).getCardList().get(h).balance-digit;
                    if(money<0){
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    for(i=0;i<accountList.get(t).getCardList().size();i++){
                        accountList.get(t).getCardList().get(i).balance=money;
                    }                    System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" +BankList.get(z).getBankname() + "的" + ATM + "号ATM机上取款¥%.2f\n", digit);
                    System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getCardList().get(h).balance);
                }
                else if(accountList.get(t).getAccounttype()==2){//贷记
                    if(accountList.get(t).getCardList().get(h).balance<0){
                        money=accountList.get(t).getCardList().get(h).balance-digit*(0.05+1);
                    }
                    else {
                        if(accountList.get(t).getCardList().get(h).balance-digit<0)
                            money=accountList.get(t).getCardList().get(h).balance-digit-(digit-accountList.get(t).getCardList().get(h).balance)*0.05;
                        else
                        money = accountList.get(t).getCardList().get(h).balance - digit;
                    }
                    if(money<-50000){
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    for(i=0;i<accountList.get(t).getCardList().size();i++){
                    accountList.get(t).getCardList().get(i).balance=money;
                    }
                    System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" + BankList.get(z).getBankname() + "的" + ATM + "号ATM机上取款¥%.2f\n", digit);
                    System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getCardList().get(h).balance);
                }
            }
            else{//跨行
                if(accountList.get(t).getAccounttype()==1){//借记
                    money=accountList.get(t).getCardList().get(h).balance-digit*(1+y);
                    if(money<0){
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    for(i=0;i<accountList.get(t).getCardList().size();i++){
                        accountList.get(t).getCardList().get(i).balance=money;
                    }                    System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" + BankList.get(z).getBankname() + "的" + ATM + "号ATM机上取款¥%.2f\n", digit);
                    System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getCardList().get(h).balance);
                }
                else if(accountList.get(t).getAccounttype()==2){//贷记
                    if(accountList.get(t).getCardList().get(h).balance<0){
                        money=accountList.get(t).getCardList().get(h).balance-digit*(0.05+1+y);
                    }
                    else {
                        if(accountList.get(t).getCardList().get(h).balance-digit<0)
                            money=accountList.get(t).getCardList().get(h).balance-digit*(1+y)-(digit-accountList.get(t).getCardList().get(h).balance)*0.05;
                        else
                            money = accountList.get(t).getCardList().get(h).balance - digit*(1+y);
                    }
                    if(money<-50000){
                        System.out.println("Sorry,your account balance is insufficient.");
                        System.exit(0);
                    }
                    for(i=0;i<accountList.get(t).getCardList().size();i++){
                        accountList.get(t).getCardList().get(i).balance=money;
                    }
                    System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" + BankList.get(z).getBankname() + "的" + ATM + "号ATM机上取款¥%.2f\n", digit);
                    System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getCardList().get(h).balance);
                }
            }
            }
    }
    void show(){
        for(i=0;i<accountList.size();i++){
            for(j=0;j<accountList.get(i).getCardList().size();j++){
                if(card.equals(accountList.get(i).getCardList().get(j).name)){
                    t=i;
                    h=j;
                }
            }
        }
        System.out.printf("业务:查询余额 ¥%.2f\n",accountList.get(t).getCardList().get(h).balance);
    }
}
public class Main {
    public static void main(String[] args){
        //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);
//用户数组
        Card card1=new Card("6217000010041315709",10000.00);
        Card card2=new Card("6217000010041315715",10000.00);
        ArrayList<Card> cardList1 = new ArrayList<>();
        cardList1.add(card1);
        cardList1.add(card2);
        Account account1 = new Account("杨过", "3217000010041315709", "88888888",  jsyh,cardList1,01,BankList);
        Card card3=new Card("6217000010041315718",10000.00);
        ArrayList<Card> cardList2 = new ArrayList<>();
        cardList2.add(card3);
        Account account2 = new Account("杨过", "3217000010041315715", "88888888",  jsyh,cardList2,01,BankList);
        Card card4=new Card("6217000010051320007",10000.00);
        ArrayList<Card> cardList3 = new ArrayList<>();
        cardList3.add(card4);
        Account account3 = new Account("郭靖", "3217000010051320007", "88888888",  jsyh,cardList3,01,BankList);
        Card card5=new Card("6222081502001312389",10000.00);
        ArrayList<Card> cardList4 = new ArrayList<>();
        cardList4.add(card5);
        Account account4 = new Account("张无忌", "3222081502001312389", "88888888",  gsyh,cardList4,01,BankList);
        Card card6=new Card("6222081502001312390",10000.00);
        ArrayList<Card> cardList5 = new ArrayList<>();
        cardList5.add(card6);
        Account account5 = new Account("张无忌", "3222081502001312390", "88888888",  gsyh,cardList5,01,BankList);
        Card card7=new Card("6222081502001312399",10000.00);
        Card card8=new Card("6222081502001312400",10000.00);
        ArrayList<Card> cardList6 = new ArrayList<>();
        cardList6.add(card7);
        cardList6.add(card8);
        Account account6 = new Account("张无忌", "3222081502001312399", "88888888",  gsyh,cardList6,01,BankList);
        Card card9=new Card("6222081502051320785",10000.00);
        ArrayList<Card> cardList7 = new ArrayList<>();
        cardList7.add(card9);
        Account account7 = new Account("韦小宝", "3222081502051320785", "88888888",  gsyh,cardList7,01,BankList);
        Card card10=new Card("6222081502051320786",10000.00);
        ArrayList<Card> cardList8 = new ArrayList<>();
        cardList8.add(card10);
        Account account8 = new Account("韦小宝", "3222081502051320786", "88888888",  gsyh,cardList8,01,BankList);
        Card card11=new Card("6640000010045442002",10000.00);
        Card card12=new Card("6640000010045442003",10000.00);
        ArrayList<Card> cardList9 = new ArrayList<>();
        cardList9.add(card11);
        cardList9.add(card12);
        Account account9 = new Account("张三丰", "3640000010045442002", "88888888",  jsyh,cardList9,02,BankList);
        Card card13=new Card("6640000010045441009",10000.00);
        ArrayList<Card> cardList10 = new ArrayList<>();
        cardList10.add(card13);
        Account account10 = new Account("令狐冲", "3640000010045441009", "88888888",  gsyh,cardList10,02,BankList);
        Card card14=new Card("6630000010033431001",10000.00);
        ArrayList<Card> cardList11 = new ArrayList<>();
        cardList11.add(card14);
        Account account11 = new Account("乔峰", "3630000010033431001", "88888888",  nyyh,cardList11,02,BankList);
        Card card15=new Card("6630000010033431008",10000.00);
        ArrayList<Card> cardList12 = new ArrayList<>();
        cardList12.add(card15);
        Account account12 = new Account("洪七公", "3630000010033431008", "88888888",  nyyh,cardList12,02,BankList);
        //用户总数组
        ArrayList<Account> accountList = new ArrayList<>();
        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);
        Scanner xx=new Scanner(System.in);
        String s=xx.nextLine();
        while(!s.equals("#")){
            String[] input=s.split("\\s+");
            if(input.length!=1){
                double money=Double.parseDouble(input[3]);
                Check check=new Check(accountList,input[0],input[1],input[2],money,BankList);
                check.AllCheck();
                Operation operation=new Operation(accountList,input[0],input[2],money,BankList);
                operation.CunQU();
            }
            else{
                Check check=new Check(accountList,input[0],BankList);
                check.CardExist();
                Operation operation=new Operation(accountList,input[0],BankList);
                operation.show();
            }
            s=xx.nextLine();
        }
    }
}
(3)采坑心得:
在卡片分组问题上我分的吧各个图片分在同一个数组里面,呈现出来的也是散乱的,可以说是没有分组。这也是我应该提升的地方,没有看实验报告的要求随便分组,导致我后面几个点也因为我随便分组,导致面积求和也是错误的,也就是说我刚开始就没对相应图形进行分组。剩下的功能和上一道题基本实现的是一个功能,进行的还算顺利。
(4)改进建议:
对于第三阶段的作业代码,每一道题基本上都在两百行以上,题目量大,考验的就是一个思路以及对代码的理解。
1.我对基础知识掌握不牢固,比如说抽象类接口应用不熟练,面向对象类设计的思想大概有所训练,但还是很难写出所谓的好代码。
2.这几次作业都是对面向对象设计原则的具体体现,比如说可拓展性维护性开闭性等,而自己不是那么深刻了解其应用,导致还是存在面向过程编程。
(5)总结:
这是本学期的最后一次Blog总结,从刚开始接触写博客感觉很拘谨,到目前写过三次,每次Blog总结都有不同的心情,从第一次的自我反思,刚接触JAVA的初学者,到第二次感慨JAVA难学的悲愤大学生,到目前第三次对JAVA算是刚入门的学生,每次写博客的心情都都不同。回顾之前两次的Blog作业每次都有不小的收获。代码量难度也是从每次作业中不断提升,这也正是考验我们编程能力的鉴证。博客也是我们每次阶段性总结的笔记,在这里能看到我们的不足和收获。第三次博客作业总结也是前面作业的基础,到最后总结的大作业,虽然有些艰难但是怎么说也算活这出来了。经过一个学期的JAVA学习,真正算理解我们学习的专业与生活是哪么密不可分,面向对象的思维是JAVA学习中所学到的。总之JAVA学习还是挺折磨的,等完成一道题或多或少也有一些成就感,但是折磨占一大部分。希望自己日后还能在提高自己的编程水平,在生活上也要学习敲PTA的精神,真是逼到不行才能知道自己原来不吃饭也能挺能坚持的。
                    
                
                
            
        
浙公网安备 33010602011771号