PTA第三阶段blog作业

这三次作业完成得前所未有的艰难,而且完成的时候也是钻了空子PTA踩点得分的空子,不至于得分太难看,说到底还是用老方法套新题目。第七次的话还是比较简单的,而写ATM机的第八次和第九次则是完全懵的状态。甚至看别人写的代码也还是很难,就完全不能将自己学的组合起来。反正就是感觉自己似乎对于Java有点提不起兴趣的感觉,但每次写的时候又特别有成就感,总的感觉就是完全没有找到学习的方法,自己看书敲代码的话就那个进度比较慢,而网上视频感觉又没找到比较合适的,还是最近才找到的,现在只能疯狂赶了。

一、题目集七(7-1和7-2)的总结:

在做题目7-1的时候还是比较顺利的,但是当时并没有理解构造方法是什么,就感觉心里堵得慌,不知道怎么写,而且按照类图来写的话也是不知道应该怎么去将这些类组合起来,还有就是ArrayList当时也是没学,然后就不得不去临时看了,就这么跌跌碰碰写完了。

	public static Scanner input = new Scanner(System.in);
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		int num ;
     //   Scanner input = new Scanner(System.in);
		do{
			num = Main.input.nextInt();
			if(num < 0 || num > 4) {
				System.out.println("Wrong Format");
				System.exit(0);
			}
			list.add(num);
			
		}while(num != 0) ;

 

		if(!dealCardList.validate()) {//图形数量非法(小于 0)或图形属性值非法(数值小于 0 以及三角形三边不能组成三角形)	
			System.out.println("Wrong Format");
			System.exit(0);
		}
		dealCardList.showResult();
		input.close();
	}

  这段代码是解题报告中的,但是刚开始让我看得一脸懵逼,主要还是这里没弄明白

DealCardList dealCardList = new DealCardList(list);

不知道这参数还可以是ArrayList类型的,不过写还是照样写,依葫芦画瓢。其次就是还没弄明白参数还可以是类,通过类来传递,这些其实也还是看看书还能看懂,就是加了点新东西。

再说说(7-2)吧,这题目其实本来是跟上一道题目相差不大的,但是当时还是不熟练ArrayList打印,最后放弃了,改用之前学的数组,就是写起来比较复杂,因为ArrayList打印有[ ],这样就导致非常的麻烦,而且老是出现bug,虽然最终是踩上点得了满分,但总感觉不是那么回事,毕竟这题目是为了巩固我们所学的新内容,而我却用老办法去写。

public void cardSort() {
        String name = null;
        int n = 0;
        double temp1,temp2,temp3,temp4;
        for(int k=0;k<4;k++) {
            if(k==0) {
                name = "Circle";
                 n=x1;
            }
            else if(k==1) {
                name = "Rectangle";
                 n=x2;            
            }
            else if(k==2) {
                name = "Triangle";
                 n=x3;    
            }
            else {
                name = "Trapezoid";
                 n=x4;    
            }
            if(n==0) {
                System.out.print("[]");
            }
            for(int i=0;i<n;i++) {
                for(int j=0;j<n-i-1;j++) {
                    if(area[k][j] < area[k][j+1]) {
                        temp1 = area[k][j];
                        area[k][j] = area[k][j+1];
                        area[k][j+1] = temp1;
                    }
                }
            }
            
                
            
                for(int i1=0;i1<n;i1++) {
                    if(n !=1) {
                        if(i1==0)
                            System.out.printf("[%s:%.2f ",name,area[k][i1]);
                        else if(i1==n-1) 
                            System.out.printf("%s:%.2f ]",name,area[k][i1]);            
                        else
                            System.out.printf("%s:%.2f ",name,area[k][i1]);                
                    }
                    else 
                        System.out.printf("[%s:%.2f ]",name,area[k][i1]);                
                }        
            
        }    
        
    }

这完全就是之前的方法,而且刚开始写完的时候,代码长度还超过了长度限制,最终还是各种裁剪,优化代码,反正最后就这么写完了。

 二、题目集八的总结:

这次的作业是我做PTA以来最难受的一次,明明这些东西都是我们已经学过的东西,现在只是将他们组合运用起来而已,结果就是自己完完全全不知道应该怎么去弄,而看那些类图更是看得头晕,之前好歹还是能有一点思路的,明白大概需要怎么去写,有一个大概的方向。可是这次真的是感觉自己特别low,甚至我还看了几个人写的,但自己看都没有自己的思路,单个拎出来还是能够看懂,而一旦将他们联系起来,脑子里就完全是一团浆糊。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class M {
    public static void main(String[] args) {
        /*
         * 创建一个中国建设银行的链表 和 一个中国工商银行的链表
         *功能:存放每个银行里面所有的ATM机
         * */
        
        List<Atm> constrcionAtm = new ArrayList<>();
        List<Atm> ICBCAtm = new ArrayList<>();
        
        //初始化所有ATM机的信息(ATM机编号,银行名字)
        //调用构造方法 Atm(ATM编号,银行名字)
        constrcionAtm.add(new Atm("01","中国建设银行")); 
        constrcionAtm.add(new Atm("02","中国建设银行"));
        constrcionAtm.add(new Atm("03","中国建设银行")); 
        constrcionAtm.add(new Atm("04","中国建设银行"));
        ICBCAtm.add(new Atm("05","中国工商银行")); 
        ICBCAtm.add(new Atm("06","中国工商银行"));

        //所有八个账号(每个账号底下包括子卡)
        List<String > yangguo1 = new ArrayList<>(); //账号一
        List<String > yangguo2 = new ArrayList<>(); 
        List<String > guojing = new ArrayList<>(); 
        List<String > zhangwuji1 = new ArrayList<>(); 
        List<String > zhangwuji2 = new ArrayList<>(); 
        List<String > zhangwuji3 = new ArrayList<>();
        List<String > weixiaobao1 = new ArrayList<>(); 
        List<String > weixiaobao2 = new ArrayList<>();
        
        //存入每张卡的卡号,属于cardList的子卡的集合
        yangguo1.add("6217000010041315709");//账号一的第一张卡
        yangguo1.add("6217000010041315715");//账号一的第二张卡
        
        yangguo2.add("6217000010041315718");//账号二的唯一一张卡
        
        guojing.add("6217000010051320007");
        
        zhangwuji1.add("6222081502001312389"); 
        
        zhangwuji2.add("6222081502001312390");
        
        zhangwuji3.add("6222081502001312399"); 
        zhangwuji3.add("6222081502001312400");
       
        weixiaobao1.add("6222081502051320785"); 
        
        weixiaobao2.add("6222081502051320786");
        
        
        //杨过所有账号的集合
        List<Card> yangguoCards = new ArrayList<>();
        //郭靖所有账号的集合
        List<Card> guojingCards = new ArrayList<>();
        //张无忌所有账号的集合
        List<Card> zhangwujiCards = new ArrayList<>();
        //韦小宝所有账号的集合
        List<Card> weixiaobaoCards = new ArrayList<>();
        //初始化每个人所属卡的数据    
        //调用构造方法Card(银行名字,【subBankNum(哪一家银行)如果是建设银行就是1,工商银行就是2】,银行账号,密码,初始余额,该账号下的所有子卡)
        yangguoCards.add(new Card("中国建设银行",1,"3217000010041315709","88888888",10000,yangguo1));
        yangguoCards.add(new Card("中国建设银行",1,"3217000010041315715 ","88888888",10000,yangguo2));
        guojingCards.add(new Card("中国建设银行",1,"3217000010051320007", "88888888",10000,zhangwuji1));
        zhangwujiCards.add(new Card("中国工商银行",2,"3222081502001312389","88888888",10000,zhangwuji1));
        zhangwujiCards.add(new Card("中国工商银行",2,"3222081502001312390","88888888",10000,zhangwuji2));
        zhangwujiCards.add(new Card("中国工商银行",2,"3222081502001312399","88888888",10000,zhangwuji3));
        weixiaobaoCards.add(new Card("中国工商银行",2,"3222081502051320785","88888888",10000,weixiaobao1));
        weixiaobaoCards.add(new Card("中国工商银行",2,"3222081502051320786","88888888",10000,weixiaobao2));
    
        //创建中国建设银行使用者链表,用来存放这个银行里面的用户
        List<Account> constructionAccountList = new ArrayList<>();
        //创建中国工商银行使用者链表,用来存放这个银行里面的用户
        List<Account> ICBCAccountList = new ArrayList<>();
        
        
        //初始化使用者:
        //调用构造方法Account (用户姓名,账号的集合)
        constructionAccountList.add(new Account("杨过",yangguoCards)); 
        constructionAccountList.add(new Account("郭靖",guojingCards));
        ICBCAccountList.add(new Account("张无忌",zhangwujiCards));  
        ICBCAccountList.add(new Account("韦小宝",weixiaobaoCards));
        
        //初始化信息结束
        Scanner sc = new Scanner(System.in);
        //创建一个链表,用来存储从键盘输入的每一行的数据
        List<String> input = new ArrayList<>();
        String string = sc.nextLine();
        String end = "#";
        while(string.equals(end)==false) {
            input.add(string);
            string = sc.nextLine();
        }     

        Bank ConstructionBank = new ChinaConstructionBank("中国建设银行",1,constrcionAtm,constructionAccountList);
        Bank ICBC = new ICBC("中国工商银行",2,ICBCAtm,ICBCAccountList);

        Bank bank = null;
        Bank anotherBank = null;
        for (String line : input) {//检索input集合里面的每个元素(每个元素都是一行)
            String[] arr = line.split("\\s+");
            if (arr[0].substring(0,3).equals("622")) {//622——是工商银行
                bank = ICBC; 
                anotherBank = ConstructionBank;
            } else if (arr[0].substring(0,3).equals("621")) {//621——是建设银行
                bank = ConstructionBank; 
                anotherBank = ICBC;
            }
        //------------------------分界线---------------------- 
            
            if(arr.length == 1){//如果只输入一个数据,那么就是要显示余额
                bank.findMoney(arr[0]);//arr[0]是卡号,由卡号寻找
            } 
            else {
                Card card = new Card(arr[0],arr[1]);//调用构造方法Card(银行卡号,密码)
                bank.alterMoney(anotherBank,card,arr[2],Double.parseDouble(arr[3]));//Double相当于强制类型转换
                //reviseMoney()方法传入另一家银行,card(银行卡号,密码),存取款数目
            }
        }
    }
}
class Account{
    //用户名
    private String username;
    
    //Card类型的链表cardList
    List<Card> cardList;

    public Account() { }
    public Account(String userName, List<Card> cardList) {
        this.username = userName;
        this.cardList = cardList;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public List<Card> getCardList() {
        return cardList;
    }
    public void setCardList(List<Card> cardList) {
        this.cardList = cardList;
    }
    

   
}
// class Atm extends Bank{
class Atm {
    public String num;
    public String belongToBank;
    public Atm() { }
    public Atm(String num,String belongToBank) {
        this.num = num;
        this.belongToBank = belongToBank;
    }
    
    public String getbelongToBank() {
        return belongToBank;
    }
    public void setBelongBank(String belongToBank) {
        this.belongToBank = belongToBank;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public String getNum() { 
        return num; 
    }
}
class Bank {
    public String bankName;
    public int bankNum;
    List<Atm> ATMs;
    private List<Account> accountList;
    Card findCard;
    Account findAccount;
    public Bank() { }
    public Bank(String bankName, int bankNum, List<Atm> atmList, List<Account> accountList) {
        this.bankName = bankName;
        this.bankNum = bankNum;
        this.ATMs = atmList;
        this.accountList = accountList;
    }
    public List<Atm> getAtmList() { 
        return ATMs; 
    }
    public void setAtmList(List<Atm> atmList) { 
        this.ATMs = atmList; 
    }
    public List<Account> getAccountList() { 
        return accountList; 
    }
    public void setAccountList(List<Account> accountList) { 
        this.accountList = accountList; 
    }
    public boolean alterMoney(Bank anotherBank, Card card,String atmNum, double alterMoney){
        if(checkCardIsExist(card) && checkAtmIsExist(atmNum,anotherBank) && DrawMoneyIsLegal(alterMoney)){
            this.findCard.modifyMoney(alterMoney);
            if (alterMoney < 0) {
                System.out.printf("%s在%s的%s号ATM机上存款¥%.2f\n",this.findAccount.getUsername()
                ,this.bankName,atmNum,(-alterMoney));
            } 
            else {
                System.out.printf("%s在%s的%s号ATM机上取款¥%.2f\n",this.findAccount.getUsername()
                        ,this.bankName,atmNum,alterMoney);
            }
            System.out.printf("当前余额为¥%.2f\n",this.findCard.getBalance());
            return true;
        }
        return false;
    }
    public double findMoney(String cardNum) {
        for(Account a : this.accountList) {
            for(Card c : a.cardList) {
                for (String sudNum : c.getSubCardNumList()) {
                    if ( cardNum.equals(sudNum) )  {
                        System.out.printf("¥%.2f\n",c.getBalance());
                        return c.getBalance();
                    }
                }
            }
        }
        return -1;
    }
    public boolean checkCardIsExist(Card card){
        boolean numError = true;
        boolean pwdError = true;
//        boolean haveAtm = false;
        for(Account a : this.accountList){
            for(Card c : a.cardList){
               for (String sudNum : c.getSubCardNumList()) {
                   if ( card.getBankCardNum().equals(sudNum) ) {
                       numError = false;
                   }
                   if ( card.getCardPassword().equals(c.getCardPassword()) ) {
                       pwdError = false;
                   }
               }
               if( !numError && !pwdError ){
                    this.findCard = c;
                    this.findAccount = a;
                    return true;
               }
            }
        }
        if (numError) {
            System.out.println("Sorry,this card does not exist.");
        }
        if (pwdError) {
            System.out.println("Sorry,your password is wrong.");
        }
        return false;
    }
    public boolean checkAtmIsExist(String atmNum,Bank antherBank){
        for (Atm atm : this.ATMs){
            if ( atmNum.equals(atm.getNum())  ) {
                return true;
            }
        }
        for (Atm atm : antherBank.ATMs) {
            if ( atmNum.equals(atm.getNum())  ) {
                System.out.println("Sorry,cross-bank withdrawal is not supported.");
                return false;
            }
        }
        System.out.println("Sorry,the ATM's id is wrong.");
        return false;
    }
    private boolean DrawMoneyIsLegal(double drawMoney) {
        boolean Yse = false;
        if (this.findCard.getBalance() < drawMoney) {
            System.out.println("Sorry,your account balance is insufficient.");
            return false;
        }
        if (findCard.subBankNum != this.bankNum) {
            System.out.println("Sorry,cross-bank withdrawal is not supported.");
        } 
        else {
            Yse = true;
        }
        return Yse;
    }

}
class ChinaConstructionBank extends Bank{
    public ChinaConstructionBank() { }
    public ChinaConstructionBank(String bankName, int bankNum, List<Atm> atmList, List<Account> accountList) {
        super(bankName, bankNum, atmList, accountList);//调用父类的方法
    }
}

class ICBC extends Bank{
    public ICBC() { }
    public ICBC(String bankName, int bankNum, List<Atm> atmList, List<Account> accountList) {
        super(bankName, bankNum, atmList, accountList);
    }
}

就上面这些,也是完全就是一种零碎的状态,就组合不起来,看的话就觉得确实应该这么写,没有多大的问题,但是想以此来想出自己的方法时,脑海里就是一团浆糊。到最后快要结束了才不得不放弃,还是先用老办法来写,最后勉勉强强地踩点,混到了80分,但是写完后我还是不知道应该怎么去学,整个人就特别地迷茫。

 三、题目集九的总结:

 这次作业是在上一次作业中进一步改进的,这次还是比较顺利的,毕竟还是有前一次的代码,只需要做改进就好了,虽然如此,但还是有些代码看不懂,不清楚为什么要这样操作,但是这并不妨碍修改主体代码。

Card icbcCard12 = new Card("6222081502051320786","88888888",icbcAcc5);     
        Card icbcCard13 = new Card("6640000010045441009","88888888",icbcAcc6);//L
        
        Card abcCard14 = new Card("6630000010033431001","88888888",abcAcc1);
        Card abcCard15 = new Card("6630000010033431008","88888888",abcAcc2);
        

我大部分都是来添加上面这些信息的,再回想一下上一次的就突然茅塞顿开了,之前不明白的地方,现在全都懂了,才发现这些都是很简单的东西。还有其他的东西我也不敢改很多只能在有限的区域改动,如以下:

if(cardNO.equals("6640000010045442002")||cardNO.equals("6640000010045442003")||cardNO.equals("6640000010045441009")||cardNO.equals("6630000010033431001")||cardNO.equals("6630000010033431008")) {
                 if(balance < 0 ) {
                     if(balance - amount *(1 + kRate + touzhiRate) <-50000) {
                           System.out.println("Sorry,your account balance is insufficient.");
                          System.exit(0);
                        }
                   account.setBalance(balance - amount *(1 + kRate + touzhiRate));
                   }
                   else 
                  {
                       if(balance - amount*(1 + kRate )-(amount - balance) * touzhiRate < -50000) {
                            System.out.println("Sorry,your account balance is insufficient.");
                            System.exit(0);
                      }
                     else  if(balance - amount >0)
                          account.setBalance(balance - amount *(1 + kRate ));//取款更新余额操作
                   else 
                        account.setBalance(balance - amount*(1 + kRate )-(amount - balance) * touzhiRate);//取款更新余额操作

                 }
            }
       else {
           if(balance - amount*(1 + kRate )< 0) {
                            System.out.println("Sorry,your account balance is insufficient.");
                            System.exit(0);
            }
           else {
               account.setBalance(balance - amount *(1 + kRate ));//取款更新余额操作
           }
       }
       
        if(amount >= 0) {
            showResult(account,1);
        }else {
            showResult(account,0);
        }

这些都是自己按照要求改的,踩到点得分。其他的也不敢乱改。

综上:这些作业对我来说就不是巩固新学的内容,而是让我以前学的东西更熟练,同时让我学了一点新东西。

posted @ 2021-06-18 18:28  时年少  阅读(64)  评论(0)    收藏  举报