pta作业总结3
Posted pta作业总结
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pta作业总结3相关的知识,希望对你有一定的参考价值。
(1)前言:总结三次题目集的知识点、题量、难度等情况
第七次作业到第九次作业贯穿始终的主题是继承与多态,第七次作业的两道题一道是游戏卡片排序游戏。另一道则是游戏卡片分组游戏。排序其实相对简单,将计算结果分组输出是这次题目的重难点。
而第八和第九次作业则每次只有一道题,内容都是ATM机的类结构设计,第九次作业在第八次的基础上增加了几个对象和他们对应的属性并对跨行转账的业务做了更加的细致的规定。
总的来说,三次作业虽然都只有一两道题,但都是非常具有综合性的考察的很全面。难度也设置的是只要认真学认真做基础相对较差的同学也能做个十之七八。
(2)设计与分析
7-1 图形卡片排序游戏 7-2 图形卡片分组游戏
7-1 ATM机类结构设计(一) 7-1 ATM机类结构设计(二)
①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
在题目中已经给出了明确的设计的类及接口即Shape类,Rectangle类,Triangle类,Circle类,Trapezoid类,Card类,Main类,DealCardList类以及Coaparable接口。
其实整体结构已经确定了,我们需要做的就是往这些类中添加方法和将他们联系起来。关于继承:
继承就是保持已有类的特性而构造新类的过程。继承后,子类能够利用父类中定义的变量和方法,就像它们属于子类本身一样。
单继承:在类层次中,子类只继承一个父类的数据结构和方法,一个类只有一个父类
多继承:在类层次中,子类继承了多个父类的数据结构和方法,一个类允许有多个继承。
还有就是通过set,get方法对其进行改变和获取,提高了代码的可用性和可维护性。
多态:1、使用父类类型的引用只想子类的对象
2、该引用只能调用父类中定义的方法和变量
3、如果子类中重写(覆盖)了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法
4、变量不能被重写(覆盖),重写只针对方法,如果在子类中重写了父类的变量,编译时会报错
具体到这道题的表现则是Trapezoid类继承抽象类Shape,Circle类继承抽象类Shape,Trapezoid类继承抽象类Shape,Rectangle类继承抽象类Shape,Card类实现接口Comparable
而第二道题在第一题的基础上增加了根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。关于这个我的做法是使用链表,将相同属性的类放在一起。下面是我新增加的DealCardList类:
class DealCardList { double maxarea1=0,maxarea2=0,maxarea3=0,maxarea4=0; ArrayList<Integer> cardList=new ArrayList<Integer>(); ArrayList<String> data=new ArrayList<String>();//储存数据 circle:area ArrayList<Double> areadata=new ArrayList<Double>(); ArrayList<String> datacircle=new ArrayList<String>();//储存数据 circle:area ArrayList<String> rectangle=new ArrayList<String>();//储存数据 circle:area ArrayList<String> Triangle=new ArrayList<String>();//储存数据 circle:area ArrayList<String> Traperoid=new ArrayList<String>();//储存数据 circle:area double maxarea=0; DealCardList(){ }
不知道什么原因我测试了所有的用例都通过了,但是在pta上面总有一个测试点过不去,个人觉得可能是pta出了点小问题。
②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
在这两道题中有银行、银行用户、银行账户、银行卡、ATM机等共同的实体类。要实现的核心功能:基础数据的初始化; 用户存款、取款及查询余额功能;跨行转账、扣除手续费和查询余额功能。
在完成这两道题的时候我引入了一些体系结构和设计模式的内容,但因为学艺不精,所以还存在着不少的问题。下面是我的主函数的部分代码:
public class Main { static YongHuAbstract yg = new YG(); static YongHuAbstract gj = new GJ(); static YongHuAbstract wxb = new WXB(); static YongHuAbstract zwj = new ZWJ(); static JSYHATM jsyhatm_yg = new JSYHATM(yg); static JSYHATM jsyhatm_gj = new JSYHATM(gj); static GSYHATM gsyhatm_wxb = new GSYHATM(wxb); static GSYHATM gsyhatm_zwj = new GSYHATM(zwj); public static void main(String[] args){ Scanner input = new Scanner(System.in); String[] ss = new String[100]; int pd = 0; String sr = ""; //System.out.println("请输入卡号 密码 ATM机编号 金额(由一个或多个空格分隔)"); //String ss = input.nextLine(); while(true){ sr = input.nextLine(); if (sr.equals("#")) break; else { ss[pd] = new String(); ss[pd++] = sr; } } //System.out.println(pd); for(int i=0;i<pd;i++){ String[] str = ss[i].split("\\\\s+"); caozuo(str); } }
以用户抽象类分别将信息按下表存入并进行操作。
部分代码如下:
abstract class YongHuAbstract { String name; String[] kahao; double[] money; abstract int getKahao(String kahao); abstract void show(String yh,String bh,int i,double money); abstract boolean pdMoney(int i,double moy); abstract void printMoney(int i); } interface YHImplements { public void cunqukuan(int i,double money,String bh); public int chaxun(String kahao); public boolean pdMoney(int i,double moy); } class GJ extends YongHuAbstract { public GJ (){ this.name = "郭靖"; this.kahao = new String[]{"6217000010051320007"}; this.money = new double[]{10000.00}; } public int getKahao(String kahao){ for (int i=0;i<this.kahao.length;i++){ if(kahao.equals(this.kahao[i])){ return i; } } return -1; } public void show(String yh,String bh,int i,double money){ String prt; if(money<=0){ prt = this.name+"在"+yh+"的"+bh+"号ATM机上存款¥"+String.format("%.2f",money*(-1)); this.money[i] += money; } else { prt = this.name+"在"+yh+"的"+bh+"号ATM机上取款¥"+String.format("%.2f",money); this.money[i] -= money; } System.out.println(prt); System.out.print("当前余额为"); printMoney(i); //张无忌在中国工商银行的06号ATM机上存款¥500.00 //当前余额为¥10500.00 } public boolean pdMoney(int i,double moy){ if(this.money[i]<moy) return false; return true; } public void printMoney(int i){ System.out.println("¥"+String.format("%.2f",this.money[i])); } } class YG extends YongHuAbstract { public YG(){ this.name = "杨过"; this.kahao = new String[]{"6217000010041315709","6217000010041315715","6217000010041315718"}; this.money = new double[]{10000.00,10000.00,10000.00}; }
通过对以存入的数据进行计算比较完成题目所给的要求
而第九次作业则是增加了四位用户的信息数据,这个按第八次作业可以依葫芦画瓢再写四个类。这道题的难点是跨行转账的手续费以及透支限额的计算的规则的大幅改变。
还有银行卡包含借记卡和信用卡两类,且允许跨行办理相关业务。
下表是具体的内容:
这道题我通过了题目给出的测试用例,但是只得了五十分,问题因为出在跨行转账的业务上,因为基本所有的关于跨行业务的测试点都没有拿到分
(3)采坑心得:
在完成这三次作业的过程中,我感觉到了题目越来越综合,并且有着承上启下的特点。例如在第七次作业的两个图形游戏中,都是各种形状的类继承Shape类。在对应他们的面积计算公式和编号。
而八九两次作业相对第七次来说更加具有灵活性,在题目没有给出明确的类图和可视化的功能点的前提下,凭借自己的理解构造工程。在这里我想讲讲在这三次题目中收获的一些易错而且重要的知识点。
jvm的执行过程:(1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化
(2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。
(3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。
那么,在这里A的成员函数当然是访问自己的成员变量了。super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中,目的是访问直接父类中被屏蔽的成员。
派生类是虚函数,基类是普通函数。(基类没有虚指针和虚表)
如果派生类没有从基类继承到vfptr,那么派生类中产生vfptr。该vfptr一定排到最前端;如果从基类几层了vfptr,派生类自己的vfptr不产生,产生的vftable内容合并到基类的vftable中。并且基类指针一定要精确的指向派生类基类部分的起始地址。
(2)继承时构造函数不能给函数默认值,这样派生类中永远得不到该默认值。
(3)继承时在构造函数中调用虚函数,永远都是静态绑定。(因为在此时,还没有对象,不存在虚函数,故不会发生动态绑定)
(4)改进建议
第七次作业因为已经给出了类图和类关系的设计,所以没有什么好改的照着题目意思写就行了。而第八九次作业,我将每个用户作为一个单独的类来写虽然比较容易进行修改
和发现问题,但是太过于累赘和繁杂,不简洁、运行效率低下。而且会出现一个运算符号有问题需要修改几个甚至十几个地方,非常的不方便。
(5)总结:
这个学期的java的学习到这也已经告一段落了,这三次作业可以说是最后的总结和升华,让我对类的合理设计和各种小技巧有了更深的认识,也让我更加深入的明白了
继承与多态的效用。通过一次次pta的训练,使得我的能力不断的提升,但是自己对这门课还存在很多问题,在每次考核时,发现自己对知识点的理解特别的差,我不知道该如何应用,但是后面通大量的练习,发现自也有了一定的进步可以独立完成一些程序。希望我自己能够学好本事不断去探索更好的未来
以上是关于pta作业总结3的主要内容,如果未能解决你的问题,请参考以下文章