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); }
这些都是自己按照要求改的,踩到点得分。其他的也不敢乱改。
综上:这些作业对我来说就不是巩固新学的内容,而是让我以前学的东西更熟练,同时让我学了一点新东西。

浙公网安备 33010602011771号