PTA题目集7-9的总结

Posted 微笑绝杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA题目集7-9的总结相关的知识,希望对你有一定的参考价值。

PTA题目集7-9的总结

 —————————————————————————————————————————————————————————————————————————

目录:

    1. 前言

 

    2. 设计与分析

 

    3. 采坑心得

 

    4. 总结

 

前言:

 

  关于题目集7:

 题目集四主要是关于java的多态以及继承的知识点,两道题目都比较简单,考察的新知识点为比较器的使用,利用比较器我能更好更方便的使用列表,节省了我很多时间。

 

  关于题目集8:

 题目集八只有一道题目,考察的是ATM机类结构的设计,题目中给了很多的信息,包括各个类的类图以及要输入的数据,要把这些类的关系搞清楚花了我不少时间,并且输入数据也比较繁琐,主要的难点还是搞清楚类的关系,知识点都是之前考察过的。

 

  关于题目集9:

题目集九是题目集八的延伸,在题目集八的基础上加入了贷款的功能,并且加入了另外几个人的信息,和题目集八差不多,并不是那么难。

 

——————————————————————————————————————————————————————————————————————————

 

设计与分析:

 

    这块主要对一些题目和源码进行一些分析。

 

关于题目集七的7-1与7-2:

 

  两道题目都考察了继承与多态的知识

 

  7-1 图形卡片排序游戏

输入格式:

  • 首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
  • 然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。

输出格式:

  • 如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format
  • 如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
  1. 排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
  2. 排序后的各图形类型及面积,格式同排序前的输出;
  3. 所有图形的面积总和,格式为Sum of area:总面积值

 7-1与7-2差不多,这里先分析7-1,7-1这里主要先使用列表存储输入的数据,再对列表进行排序最后输出,这里先附上类图。

这道题涉及的类比较少,所以比较简单,关键在于比较器的使用。

public int compareTo(Shape s){
        if(getArea()>s.getArea())
            return -1;
        else if (getArea()<s.getArea())
            return 1;
        else 
            return 0;
    }

每个图形类都包含了这个方法,在对列表排序的时候就使用了这个方法进行排序,非常方便。

关于题目集八与题目集九

题目集八和题目集九都是关于ATM机结构类设计,题目集九多加了一个贷款的功能,并且区分了两种账户。

  7-1 ATM机类结构设计(二):

输入格式:

每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:

  • 取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔)
  • 查询余额功能输入数据格式: 卡号

输出格式:

①输入错误处理

  • 如果输入卡号不存在,则输出Sorry,this card does not exist.
  • 如果输入ATM机编号不存在,则输出Sorry,the ATM\'s id is wrong.
  • 如果输入银行卡密码错误,则输出Sorry,your password is wrong.
  • 如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.

②取款业务输出

输出共两行,格式分别为:

业务:取款 [用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]

当前余额为¥[金额]

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

③查询余额业务输出

业务:查询余额 ¥[金额]

金额保留两位小数。

附上类图:

 

这道题目主要是搞清楚类之间的关系,以及预想功能的实现,清楚这些之后问题就迎刃而解了。

public void withdraw() {
        /**
         * 校验该卡是否存在
         */        
        Card card = ValidateData.getCardbyCardNO(unionPay, cardNO);
        if(card == null) {
            System.out.println("Sorry,this card does not exist.");
            System.exit(0);
        }
        
        /**
         * 校验ATM是否存在
         */
        ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID);
        if(aTM == null) {
            System.out.println("Sorry,the ATM\'s id is wrong.");
            System.exit(0);
        }
        
        Account account = Account.getAmountbyCardNO(cardNO);
        double balance = account.getBalance();
        
        /**
         * 校验卡密码是否正确
         */
        if(!card.getCardPassword().equals(cardPassword)) {
            System.out.println("Sorry,your password is wrong.");
            System.exit(0);
        }
        /**
         * 校验是否为跨行取款
         */
        if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
            String BankNO = aTM.getBank().getBankNO();
            switch(BankNO){
                case "1001": amount_fact = amount + amount*0.02;
                break;
                case "1002": amount_fact = amount + amount*0.03;
                break;
                case "1003": amount_fact = amount + amount*0.04;
                break;
            }
        }    
        /**
         * 校验取款金额是否大于余额
         */
        if (amount_fact > balance) {
            if(account.getLoan()&&amount_fact+(amount - balance)*0.05-balance<=50000){
                if(balance > 0)
                    amount_fact = amount_fact + (amount - balance)*0.05;
                else
                    amount_fact = amount_fact + amount*0.05;
            }
            else {
                System.out.println("Sorry,your account balance is insufficient.");
                System.exit(0);}
        }
        account.setBalance(balance - amount_fact);//取款更新余额操作

        if(amount >= 0) {
            showResult(account,1);
        }else {
            showResult(account,0);
        }
        
    }

这道题其中一个难点便是卡号的查找了,你需要在每一个银行都找一遍才行,为此需要先遍历存储银行的列表,再去遍历银行里的账户,做完之后输出正确或错误结果即可。

采坑心得

   

关于正则表达式:

 

 在做题目的过程中中运用了正则表达式,而正则表达式算是这次题中的一个难点,我在用正则表达式中遇到的第一个问题便是匹配双引号。在题目中有这样一个要求。

要求中说明了注释和字符串中出现的关键词不计,但在我使用的过程中总是出现从第一个双引号匹配到最后一个双引号的情况,我很长时间才发现问题所在,原来是我的正则表达式中用了/S来进行检索,它把引号也一起检索进去了,换成/w就可解决,究其原因还是我自己考虑的不太充分。

 

总结

 这次的题目集虽然看似比较少,但是题目有一定的难度,在类的关系反面考察的比较多,让我对类的应用有了更深刻的理解,同时也让我对列表的运用有了一定理解,让我学用列表排序存储数据等操作,总之这次的题目集让我收获比较多。

以上是关于PTA题目集7-9的总结的主要内容,如果未能解决你的问题,请参考以下文章

题目集7~9的总结

PTA题目集1~3的总结

7-9次题目集总结

题目集7-9的总结性Blog

PTA题目集4~6的总结

PTA题目集4~6总结