PTA第七次到第九次大作业分析
PTA第七次到第九次大作业分析
——OOP第三次总结
一 、前言
OOP的这三次大作业的题目概述如下:
- 第七次的OOP作业共有两道题:
1:图形卡片排序游戏.
此题是要求我们掌握有关类的继承、多态性的使用方法以及接口的应用。因此所涉及的知识点有:接口的应用、排序算法、OOP的继承以及多态的应用了。
2:图形卡片分组游戏.
此题同样是要求我们掌握类的继承、多态性的使用方法以及接口的应用。因此所涉及的知识点和第一题相差不大,可以说两者基本相同。
- 第八次的OOP作业共有一道题:
1:ATM机类结构设计(一)
此题是要求我们编写一个银行ATM机的模拟程序,能够完成用户的存款、取款以及查询余额功能。所涉及的部分知识点有OOP的继承、ArrayList类以及数组等等
- 第九次的OOP作业共有一道题:
2:ATM机类结构设计(二)
此题同样是要求我们编写一个银行ATM机的模拟程序,能够完成用户的取款以及查询余额等功能。和第八次的OOP作业相差并不是很大,因此所能涉及的知识点
也基本相同。
- 题量:从第七次的OOP作业到第九次的OOP作业分析来看,从有的两道题、到有的一道题、再到有的一道题,题目的数量可以说是肉眼可见的少了很多;但是从
整体内容来看的话,每一道题里面的难易程度都是在中等水平之上的,因此对于部分的同学来说,题量不但没有减少,相反的可能还增加了;另外的话,像是第
八次和第九次的OOP作业,由于只有一道题目的缘故,因此一旦完成了此题,这周的OOP的大作业就算完成了,因此更满足一种成就感了。
- 难度:虽然可以说这三次OOP大作业加起来只有四道题目,看似简单,但是难度还是有不小的,第一点就是因为每次的题目要考察的功能相对以往来说还是比较
大的,就比如举个例子就是:第七次的作业中,题目为:图形卡片排序游戏的题,此题它要求实现这些功能,根据用户的输入能够判断所输入的卡片种类与数量,
主要是能够判断出所输入的数字是那种的图形并根据此类图形去提示用户输入此图形的相关参数(比如三角形应该输入它的三条边长),其次的话,它还要求我
们实现这些功能,就是能够判断所输入的数据是否合法,一旦不合法给出相应的提示,然后如果输入的数据正确的话,那么对它进行排序,输出排序前和排序后所
得到的面积,同时还需要注意它的格式要求,不然很可能过不了测试点等等。最后还要输出它的总面积。从举的这个例子来看,可以知道,这四道大题的作业,
每道作业都是类似于此,一道题要求我们实现很多的功能,以前的作业更像是将一道综合大题的所有功能拆分成各个的小功能,这样题目数量就上来了,而现如
今便是综合的大题,因此题目的难度可以说有微增不减了。
二 、 设计与分析
-
- 第七次OOP分析
- 题目集第七次OOP作业的第一题:图形卡片排序游戏.分析如下:
首先我在这分享一下我所写的类图,如下

然后的话,我把我所写的此题代码在SourceMonitor下生成的报表内容展示如下:

分析如下:首先的话,此题的思路我是借鉴了CSDN上面的,然后我所写的思路是这样的:在Main类当中事先写好input,也就是说在Main当中就直接输入用户想
要输入的数据,首先输入一整行的图形数字,每个数字代表着对应的一种图形,然后在后续当中输入对应图形的数据,比如一个三角形应该输入它的三条边长,
这样的话便是在Main类和后续的部分操作当中把输入这一个板块完成了;然后是处理自己或者说用户输入的这些数据,处理完之后便可得到答案进行输出,处理是
我是这样的,如下所述:首先建造一个DealCardList的对象并将输入了一整行数字的数据初始化到里面,然后将这些数据拆分,拆分之后对每个数据判断是哪个图
形,然后根据图形输入其相应的数据,后面再进行初始化、求面积以及排序即可,最后通过dealCardList.showResult();类似于C语言当中的构造化思想去分布完成
各项功能,然后各个功能解题。此题它所涉及的知识点可以说不是很多,给我的感觉无非就是Java当中的继承,分块完成各项功能的书写和编写代码风格,而且还
用到了排序算法,更像是一道综合题,难度还不算小。
2. 题目集第七次OOP作业的第二题:图形卡片分组游戏.分析如下:
首先我在这分享一下我所写的类图,如下

然后的话,我同样把我所写的此题代码在SourceMonitor下生成的报表内容展示如下:

此题可以说和上面的图形卡片排序游戏的题相差不大,只是第一题是要求我们输入一整行的图形数字数据,然后输入其图形的相应数据,最后求面积,算出面积之
和;而第二题则是:首先要求我们输入的数据可以说完全一样的,因此输入没什么好说的(参照上一题所述),只是此题进行了一种分划,难度应该算是略微上去
了,它要求我们按照四种图形的种类对我们所输入的数据进行分组,一般是分为四组(因为有四种图形:三角形、矩形、圆形和梯形),当然了,如果是输入的图
形数字当中不足四种图形,那么分组将不足四组。由于部分的思路是和上一题相同的,有些地方我就不累赘的多加介绍了,我也只是在上一题的代码基础上添加了
一些它的要求便解决了此题,也就是分组求面积并得到这个组的总面积,然后排序,以及最后的分组输出即可。
3. 两题对比之后分析如下:由于第二题是建立在第一题的基础之上展开的,而且我个人认为只需要把第一题能够按照自己清晰的思路写出来的话,那么第二题便可轻
松的解决,因为第二题只是分个组,差不多就没了,仍然还是排序的思路,求总面积最大的算法,不过在此题当中,我对ArrayList的使用和了解可以说是上升了一
个档次,然后就是创建一个实例和继承,运用的更加清楚明了了。
-
- 第八次OOP分析
1. 题目集第八次OOP作业题为:ATM机类结构设计(一)分析如下:
同理,首先我先在这分享一下我所写的类图,如下

然后的话,我同样把我所写的此题代码在SourceMonitor下生成的报表内容展示如下:

此题可以说是这三次OOP作业当中难度最大了的,因为当时做的时候还是感觉到了难度,但也不是那种难易下手的样子,此题我是自己一个人慢慢研究出来的,没有
请教过别人和查阅网上的资料,所以在当时一天到两天的时间把此题完成之后心里还是很有成就感的,我来说一下我都大致思路吧:首先此题是写了九个类,后面的
介绍当中会慢慢的讲出来的,先在Main类当中对题目的要求进行一个初始化的数据处理,在这里我写了一个用户类即user类,创建了四个对象,并对每个对象进行了
初始化数据,然后在这里还创建了两个库,其中一个库里面主要还是对银行账户卡号进行存储,另一个库主要是对ATM机的编号进行存储,这些存储数据的库是为了
方便之后使用,比如说进行判断,需要使用一些银行账户的卡号或者说ATM机子,判断输入的数据合不合法等等,帮助会大点,也可能是和我自己所写的代码也有一
定的关系,可能别人不会用上这种库,也就是思路各有所异吧。初始化数据了之后,便是对数据的输入了,首先是对输入的数据做一个判断,也就是如果输入的只是
单纯的一个卡号的话,那么就进行之后对应的操作,如果输入的数据是那种有卡号,也有密码,ATM机编号的,那么进行对应的操作,这两种操作都要进行判断输入
的数据是否合法,不合法则提示用户哪里输入错误了,合法则进行存取款的操作或者查询余额的操作了。在这里我还是附上我的代码和注释,这样更好一些,如下:
1 //卡号存在的情况之下,显示出余额 2 for(int i=0 ; i < 4; i++) 3 { 4 for(int j=0 ; j < use[i].account.size() ; j++) 5 { 6 for(int k=0; k < use[i].account.get(j).card.size() ; k++) 7 { 8 for(int m=0 ; m < use[i].account.get(j).card.get(k).IdCard.size() ; m++) 9 { 10 if(data.equals(use[i].account.get(j).card.get(k).IdCard.get(m))) 11 { 12 System.out.printf("¥%.2f",use[i].account.get(j).getBalance()); 13 System.out.println(); 14 break; 15 } 16 } 17 } 18 } 19 }
1 //处理输入时为存款和取款的操作 2 //当输入的数据为存款的时候 3 // legal(dataHandle); 4 if(!CardNumberlegal(dataHandle[0])) 5 { 6 System.out.println("Sorry,this card does not exist."); 7 break; 8 } 9 else if(!dataHandle[1].equals("88888888")) 10 { 11 System.out.println("Sorry,your password is wrong."); 12 break; 13 } 14 else if(!ATMNumberLegal(dataHandle[2])) 15 { 16 System.out.println("Sorry,the ATM's id is wrong."); 17 break; 18 } 19 else if(returnBalance(dataHandle[0]) < Math.abs(Double.parseDouble(dataHandle[3])) && Double.parseDouble(dataHandle[3]) > 0) 20 { 21 System.out.println("Sorry,your account balance is insufficient."); 22 break; 23 } 24 else if(returnUse(dataHandle[0]).ccb.size()!=0) 25 { 26 int m = 0; 27 for(int i=0 ; i < 4 ; i++) 28 { 29 if(dataHandle[2].equals(returnUse(dataHandle[0]).ccb.get(0).ATMNumber[i])) 30 { 31 m++; 32 continue; 33 } 34 } 35 if(m==0) 36 { 37 System.out.println("Sorry,cross-bank withdrawal is not supported."); 38 break; 39 } 40 } 41 else if(returnUse(dataHandle[0]).icbc.size()!=0) 42 { 43 int m = 0; 44 for(int i=0 ; i < 2 ; i++) 45 { 46 if(dataHandle[2].equals(returnUse(dataHandle[0]).icbc.get(0).ATMNumber[i])) 47 { 48 m++; 49 continue; 50 } 51 } 52 if(m==0) 53 { 54 System.out.println("Sorry,cross-bank withdrawal is not supported."); 55 break; 56 } 57 58 } 59 if(Double.parseDouble(dataHandle[3]) < 0 ) 60 { 61 for(int i=0 ; i < 4; i++) 62 { 63 for(int j=0 ; j < use[i].account.size() ; j++) 64 { 65 for(int k=0; k < use[i].account.get(j).card.size() ; k++) 66 { 67 for(int m=0 ; m < use[i].account.get(j).card.get(k).IdCard.size() ; m++) 68 { 69 if(dataHandle[0].equals(use[i].account.get(j).card.get(k).IdCard.get(m))) 70 { 71 use[i].account.get(j).setBalance(use[i].account.get(j).getBalance()+Math.abs(Double.parseDouble(dataHandle[3]))); 72 System.out.print(use[i].getUserName()+"在"+use[i].getBankName()+"的"+dataHandle[2]+"号ATM机上存款¥"); 73 System.out.printf("%.2f",Math.abs(Double.parseDouble(dataHandle[3]))); 74 System.out.println(); 75 System.out.printf("当前余额为¥%.2f",use[i].account.get(j).getBalance()); 76 System.out.println(); 77 break; 78 } 79 } 80 } 81 } 82 } 83 }
1 //取款的时候 2 else if(Double.parseDouble(dataHandle[3]) > 0) 3 { 4 for(int i=0 ; i < 4; i++) 5 { 6 for(int j=0 ; j < use[i].account.size() ; j++) 7 { 8 for(int k=0; k < use[i].account.get(j).card.size() ; k++) 9 { 10 for(int m=0 ; m < use[i].account.get(j).card.get(k).IdCard.size() ; m++) 11 { 12 if(dataHandle[0].equals(use[i].account.get(j).card.get(k).IdCard.get(m))) 13 { 14 use[i].account.get(j).setBalance(use[i].account.get(j).getBalance()-Double.parseDouble(dataHandle[3])); 15 System.out.print(use[i].getUserName()+"在"+use[i].getBankName()+"的"+dataHandle[2]+"号ATM机上取款¥"); 16 System.out.printf("%.2f",Math.abs(Double.parseDouble(dataHandle[3]))); 17 System.out.println(); 18 System.out.printf("当前余额为¥%.2f",use[i].account.get(j).getBalance()); 19 System.out.println(); 20 break; 21 22 23 } 24 } 25 } 26 } 27 }
这些便是对存取款和只输入卡号查询余额的主要操作了,此题难点之一便是存取款和查询余额的操作,除此之外还有一个难点,便是要自己理清楚各个类之间的关系是
如何的,比如说:银行账户和银行卡两者之间是种什么样的关系,组合还是继承等等。这里的话,我也是一样用到了ArrayList,对ArrayList的运用进一步上升了,除此
之外的话,在此题当中也是需要明白各个类之间的关系,主要还是关联关系,这个类和另一个类之间有关,然后又和另一个类有一定的联系,理清楚这个是比较难的,
因为如果能够理清楚各个之间的联系的话,那么设计起来会是相当的容易。
-
- 第九次OOP分析
1. 题目集第九次OOP作业题为:ATM机类结构设计(二)分析如下:
同理,首先我先在这分享一下我所写的类图,如下

然后的话,我同样把我所写的此题代码在SourceMonitor下生成的报表内容展示如下:

此题是第八次OOP作业的延申题,只需要在第八次OOP大作业代码的基础之上修改即可,当时我也是在那个基础之上添加和修改了共计两个小时的时间,然后调试了
半个小时到一个小时的时间就完成了此题,最多三个小时不到的时间便是把一周的OOP大作业写完了,回想一下,当时还是有相当多的人没完成呢,成就感自然上来
了。在这里的话,我只是做个简单的讲解即可,因为难度已经下来了,主要的难度对我个人来说还是主要是一开始做第八次OOP作业时,无法一下子理清楚如何设计的
烦恼罢了。这里只是添加了手续费的费用,多了跨行的操作,以及对银行账户的种类进行了分类,就比如说一个银行账户,他隶属下的银行卡可以是借记账号或者是贷
记账号,两者的不同之处只是贷记账号是允许透支银行余额的,比如说卡上已经没钱了,那么贷记账号的话,是允许没钱的情况之下还是可以取银行账户当中的钱,但
账户里面的金额不能小于五万元的额度,也是很好理解的。后面也多了一个银行种类,多了 一个江西农业银行。多的银行只需要适当添加即可,也是很简单的。然后附
上主要和第八次OOP作业不同的代码如下:
1 for(int i=0 ; i < account.getBank().getATMList().size() ; i++) 2 { 3 if(ATMID.equals(account.getBank().getATMList().get(i).getATMID())) 4 { 5 if(account.getAccountType().equals("贷记账号") && amount > balance) 6 { 7 if(balance>0) 8 { 9 double tempBalance = balance - amount - (amount - balance)*0.05; 10 account.setBalance(tempBalance); 11 break; 12 } 13 else 14 { 15 double tempBalance = balance - amount - amount*0.05; 16 account.setBalance(tempBalance); 17 break; 18 } 19 } 20 else 21 { 22 account.setBalance(balance - amount); 23 break; 24 } 25 26 } 27 if(i==(account.getBank().getATMList().size())-1) 28 { 29 double tempBalance; 30 int ATMid = Integer.parseInt(ATMID); 31 if(ATMid>=01&&ATMid<=04) 32 { 33 if(account.getAccountType().equals("贷记账号") && amount > balance) 34 { 35 if(balance>0) 36 { 37 tempBalance = balance - amount - (amount - balance)*0.05 - amount*0.02; 38 account.setBalance(tempBalance); 39 } 40 else 41 { 42 tempBalance = balance - amount - amount*0.05 - amount*0.02; 43 account.setBalance(tempBalance); 44 } 45 } 46 else 47 { 48 tempBalance = balance - amount - amount*0.02; 49 account.setBalance(tempBalance); 50 } 51 } 52 if(ATMid>=05&&ATMid<=06) 53 { 54 if(account.getAccountType().equals("贷记账号") && amount > balance) 55 { 56 if(balance>0) 57 { 58 tempBalance = balance - amount - (amount - balance)*0.05 - amount*0.03; 59 account.setBalance(tempBalance); 60 } 61 else 62 { 63 tempBalance = balance - amount - amount*0.05 - amount*0.03; 64 account.setBalance(tempBalance); 65 } 66 } 67 else 68 { 69 tempBalance = balance - amount - amount*0.03; 70 account.setBalance(tempBalance); 71 } 72 } 73 if(ATMid>=07&&ATMid<=11) 74 { 75 if(account.getAccountType().equals("贷记账号") && amount > balance) 76 { 77 if(balance>0) 78 { 79 tempBalance = balance - amount - (amount - balance)*0.05 - amount*0.04; 80 account.setBalance(tempBalance); 81 } 82 else 83 { 84 tempBalance = balance - amount - amount*0.05 - amount*0.04; 85 account.setBalance(tempBalance); 86 } 87 } 88 else 89 { 90 tempBalance = balance - amount - amount*0.04; 91 account.setBalance(tempBalance); 92 } 93 } 94 } 95 }
-
- 第九次和第八次OOP作业对比分析总结如下:
这两道题的不同之处主要是第九次的OOP当中体现,如果把第九次的OOP和第八次的OOP不同之处删了的话,那么第九次的OOP就等同于第八次的OOP了,因此可
以说第九次的OOP是建立在第八次OOP的基础之上建立起来的或者是添加了部分的要求罢了。在第八次的OOP设计当中,我尤其记得最清楚的一个东东便是,我使用
了四层循环,可以说当时打算使用四层循环的时候,感觉这样会非常的麻烦,但是不嫌麻烦的还是写下去了,比较总会遇到点麻烦地方,但是心里隐隐约约的还是感觉
可以在这里简单的书写和改进,可能我一开始设计的各个类关系之间并没有创建出一个最优的方案吧。
三 、 踩坑心得
由于第七次的OOP作业距离如今也有四、五周的感觉了,我也不太记得当时哪些地方出现过错误之地,所以这里并不打算对第七次的OOP展开详细的心得体会了。
在第八次的OOP作业当中,为了方便,我于是写了两个库,分别是存放银行卡号和ATM机子编号的两种库,主要是为了之后的判断和调用做一个铺垫,但是我个人觉
得在这种设计之下,还是可以简化的。同理,在第八次的OOP设计当中,我使用了四层循环,可以说当时打算使用四层循环的时候,感觉这样会非常的麻烦,但是不嫌
麻烦的还是写下去了,比较总会遇到点麻烦地方,但是心里隐隐约约的还是感觉可以在这里简单的书写和改进,可能我一开始设计的各个类关系之间并没有创建出一个
最优的方案吧。
四 、 改进建议
在此三次的OOP作业当中,我更加明白了各个类之间的关系,组合,基础,关联等等关系,这些关系一开始我觉得理解一下就很简单了,但是遇到那种很强关联的
类或者说关系的时候,我发现设计起来居然如此的头大,因为考虑的东西很多,比如它的实用性,可不可以在之后方便扩展等等,因此需要自己在之后的学习过程当中
充分理解Java当中的类之间的关系了。另外我发现自己编写代码的速度很一般,这点需要自己的锻炼了。另外一点的话,我发现自己对Java的很多知识点还是有个漏洞
感觉有很多的东西没有去学习,因此之后我要尽力的去学习更多的知识点。
五 、 总结
这三次的OOP作业,共计四道题目,对我自身而言取得了不小的突破了,就比如说,第八次作业我是单独依靠自己一个人,并没有查阅资料的前提之下能够在一天到两
天的时间内写完并做好相应的调试,在第九次的OOP当中,更是让我自己都震惊的一点是自己居然能够在两个小时之内完成此题,可能对有的人来说很简单,但是我对比
一下自己就发现了自己取得的进步很大了,另外对比了大部分的同学,我进步也在上升,这点所带来的成就感是比较让自己舒服的一点。即便如此,我还是能感觉到自己
和部分同学的差距很大,渐渐明白了我们专业的确是需要好好实践加学习,这样进步的速度很快,之后便更会努力的学习,学习这种学习方法,毕竟此次给我自身带来了
很强的自信了。

浙公网安备 33010602011771号