拿着代码往里打

导航

题目集7~9作业总结

题目集7~9的总结性Blog

      在本次pta题目集7-9的作业中,我们通过创建类,创建对象,创建类中方法、正则表达式的运用、继承、接口、创建列表等方法成功实现了代码。此三次作业难度都不是很大,但对代码的复杂度和要求是一次小考验。其中均存在对正则表达式和列表的运用且十分复杂。题量不是很多,但对编码过程的要求还是比较严格的。虽然可能不是很熟练,但在这里我想把我自己的做法写出来,供大家参考。

       本次作业分为以下部分,三次作业实现介绍(包括调度方法), 总结作业。请读者各取所需。

     (注:本次作业算法仅针对作业题目,对实际情况并不完全相符)

 

一、三次作业的实现(设计与分析)

1、题目集7(7-1)、(7-2)两道题目的递进式设计分析总结

其实这两题的做法均为使用Arraylist列表来实现,但过程较为繁琐。

图形卡片游戏设计,我觉得关键就在于存储数据,以及对数据的处理。题目要求对输入的一串数字进行识别和处理,这里我们便需要在主类中使用Arratlist对其的结束进行判定:

 ArrayList<Integer> list = new ArrayList<Integer>();
        int num = input.nextInt();
        while(num != 0){
            if(num < 0 || num > 4){
                System.out.println("Wrong Format");
                System.exit(0);
            }
            list.add(num);
            num = input.nextInt();
        }
        DealCardList dealCardList = new DealCardList(list);
        if(!dealCardList.validate()){
            System.out.println("Wrong Format");
            System.exit(0);
        }
        dealCardList.showResult();

 

两次作业对数据的判定方法雷同,主要是对数据处理的方法不尽相同。

我们通过创建一个card列表将得出的面积结果和图形进行匹配和处理,这样方便后续的操作,下面附上此代码:

 if(list.get(i)==1){
                double radius=test.input.nextDouble();
                Circle a=new Circle(radius);
                Card card=new Card(a);
                card.getShape().setShapeName("Circle");
                cardList.add(card);
            }

 

这是一段存储圆形Circle面积的一部分代码,对其他图形数据的存储也相同。

这段是在构造方法中创建的,所以我们只需要在写方法时调用构造方法,即可将这些存储的数据成功取出并使用。但对于这两题最大的不同点,还是在于对输出方式的不同,就比如7-1中数据一般都比较单一,一般不需要对图形进行分类,但在7-2题目中,出现了多组相同图形输入的情况,这时候我们便需要对图形进行详细的分类:

       这时候我们便需要对每种图形都创建一个列表,方便对每种图形数据的存储。

    ArrayList<Double> list1=new ArrayList<>();
        ArrayList<Double> list2=new ArrayList<>();
        ArrayList<Double>list3=new ArrayList<>();
        ArrayList<Double>list4=new ArrayList<>();

这分别为四种图形的存储方式,这样我们只需要使用sort,collection等方法便可以对数据的处理轻松实现了。

 

为了方便大家的理解,下面我附上这两题的类图:

 

由于部分结构相同,所以此两题的类图也相同。

 

2、题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

这两题的设计思路和之前写过的求年月日的设计思路相同,通过层层递进的方法来编写代码,当然此两题最重要的还是对用户信息和数据的存储,是通过层层递进的方式来存储的。

 ArrayList<card>one=new ArrayList<>();
         card card1=new card("6217000010041315709","88888888");
         card card2=new card("6217000010041315715","88888888");
         one.add(card1);one.add(card2);

 

我们通过对银行卡卡号,密码的存储,在将此存储再存储到相应的用户list中,再存储到相应的账户list中,再......通过这样的存储方式,我们便可以对用户的信息完全初始化了。当然此存储方法也是在构造方法中体现的,当我们通过创建对象的方法去调用构造方法时,即可完成以及调用用户的初始化信息。

 

再来说一说对类的设计分析:

 

我们通过创建card、account等类来创建能够存储其信息的方法,方便在上述所说的构造方法中对用户的信息进行初始化。但本两题的类之间关联不大,主要是类与用户信息初始化方法的关系,通过创建类来服务于用户的信息。

因为上面已经创建了存储账户的信息,其里面便包含了用户的余额,当我们存钱取钱时用户的余额便会发生改变。

    if (kahao.equals("6217000010041315709") || kahao.equals("6217000010041315715")||kahao.equals("6217000010041315718")) {
            double x = a.getBanks().get(0).getUsers().get(0).getAccounts().get(0).getMoney();
            double y = Double.parseDouble(money);
            if (jihao.equals("01") || jihao.equals("02") || jihao.equals("03") || jihao.equals("04")) {
                     a.getBanks().get(0).getUsers().get(0).getAccounts().get(0).setMoney(x - y);
            }

这边附上一段用户存取钱的判定方法,通过对应的下标可以看出这是对第一个用户的操作方法。

 

当然这两次作业的关键还是在于对输入数据的处理,我们可以通过spilt()的方法对输入的数据进行分割:

 StringBuilder sb=new StringBuilder();
        while(a.equals("#")==false) {
            sb.append(a);
            sb.append("\n");
            a=in.nextLine();
        }
        String a1[]=sb.toString().split("\\\n");

这样便可以成功分割处理了,后面判断会十分方便。

 

     第九次作业便在第八次作业的基础上做出了一点小提升,它允许借贷和跨行取款,但是由于有了第八次作业的经验,第九次便会十分的轻松。

我们只需要再多存储一些用户信息,再加上一点对存取钱和借贷操作的改进即可成功实现,下面我附上一段对存取钱操作的改进:

if ((mon > x.caozuo(l[0], l[2], String.valueOf(0))&&(l[0].equals("6217000010041315709")||l[0].equals("6217000010041315715")||l[0].equals("6217000010041315718")||l[0].equals("6217000010051320007")||l[0].equals("6222081502001312389")
                                        ||l[0].equals("6222081502001312390")||l[0].equals("6222081502001312399")||l[0].equals("6222081502001312400")||l[0].equals("6222081502051320785")||l[0].equals("6222081502051320786")))) {
                                    System.out.print("Sorry,your account balance is insufficient.");
                                    System.exit(0);

当余额小于-50000.00时,便超出了借贷的范围,就执行输出余额不足的语句。

下面附上两次作业的类图:

正如我上面所说的,类与类之间的关系比较单一,甚至无关联,其主要还是体现在用户信息的初始化中。

 

二、采坑心得

(1)、在编写题目7-1的过程中,对于输出结果保留两位小数始终无法得出答案,来看看我的原代码:

 for(int i=0;i<cardList.size();i++){
            System.out.print(cardList.get(i).getShape().getShapeName()+":"+"(cardList.get(i).getShape().getArea())+" ");
        }

发现我并没有实现对于小数点后位的保留操作,经过上网的查询才发现了String.format()的操作方法,只需要像printf()的输出方法一样对其使用%.2f进行输出即可。

 

(2)、在编写题目7-2的过程中,没用实现对图形的分类,导致输出结果始终是mistake。

经过仔细的思考 ,我便总结出了一种方法应对,便是对不同的图形都创建一个列表对其进行存储,在输出是按顺序输出即可;

ArrayList<Double> list1=new ArrayList<>();
        ArrayList<Double> list2=new ArrayList<>();
        ArrayList<Double>list3=new ArrayList<>();
        ArrayList<Double>list4=new ArrayList<>();
  for (int i = 0; i < list2.size(); i++) {
                System.out.printf("Rectangle:%.2f ",list2.get(i));
            }

使用for循环方便对多组数据的存储,其它图形的存储操作也可以通过此来实现。

 

(3)、在编写题目集8的过程中,由于输入的方式为列表,所以无法判断是存钱还是取钱,导致在输出时无法判断,所以我便添加了一个判定方法,并将输入的字符串转化为了double数字。

if(mon>0) {
                        if (mon > x.caozuo(a2[0], a2[2], String.valueOf(0))) {
                            System.out.print("Sorry,your account balance is insufficient.");
                            System.exit(0);
                        } else {
                            System.out.println(x.name2(a2[0]) + "" + x.name(a2[2]) + "" + a2[2] + "号ATM机上取款¥" + mon + 0);
                            System.out.print("当前余额为¥" + String.format("%.2f", x.caozuo(a2[0], a2[2], a2[3])));
                        }
                    }
                    else {
                        mon = 0 - mon;
                            System.out.println(x.name2(a2[0]) + "" + x.name(a2[2]) + "" + a2[2] + "号ATM机上存款¥" + mon+0);
                            System.out.print("当前余额为¥" + String.format("%.2f", x.caozuo(a2[0], a2[2], a2[3])));

                    }

这样便可以实现了。

 

(4)、在编写题目集9的过程中,由于跨行取款存在利息,而我并没有对存钱还是取钱进行判断,导致取钱的时候也会产生利息,最后通过添加一次或几次判断便成功将其运行。

在刚开始编写的时候一定要看清题目的要求,否则后续改会十分的繁琐。

 

三、改进意见

(1).对于超时的代码改进,有时候简单的几句话往往比for循环来的更加的直接,可能在写题目时,我们不会经常性的注意时长,但是在实际生活的运用中,时长还是十分重要的,以后编码也会更加的注重算法和群复杂度,争取让自己以最简单的代码写出最快的过程。

 

(2).对于Arraylist的使用方法还不是很熟练,对于其中的sort(),collection()等方法还不够熟练,为了方便排序等操作还是要熟练使用这些的。

 

(3).碰到继承与多态的题时,经常回去创建抽象类以及抽象方法,但是每次抽象方法都不能做到精简,以至于在后面类的继承中,每次继承都需要对抽象类中的抽象方法进行补全,过程便十分繁琐,以后会对抽象类中的抽象方法做到更加的精简,让后面的代码实现起来更加轻松。

 

(4).对于需要存储信息的题目,可以在构造方法中存储,这样的话既不占用空间,又方便它的调用。可以在不同类和不同方法中对其调用。所以以后对用户信息的初始化便可以在构造方法中实现。同时还会让代码的复杂度大大降低。

 

(5).当遇到类图复杂的题目时,我们要从箭头的最后开始进行分析,这样可以节省很多的时间,同时也方便对代码的编写。

 

四、总结

       本次作业我学习到了继承、多态以及接口的运用,正则表达式的运用和ArrayList的运用,成功掌握了Arraylist中的多种使用方法。但是,我还有许多地方有待进步和改进,比如对于正则表达式的难点题目的突破和ArrayList中sort(),collection()等方法的使用还不够熟练。其它的各种方法我也会抓紧时间去学习,争取下次能写出更精简,更好的代码。

       对于老师的讲学方式我也是比较喜欢的,以腾讯课堂展示,让我们能更好的,更清楚的看清代码以及一些知识。同时呢也希望以后的作业题目集难题能稍微少一些,实验的难度也可以稍稍降低些。

       同时,在这里我要感谢女朋友对我一直的理解和支持,让我在这漫长的代码路上有着不断的动力前行。

       最后,感谢罗老师对我们的指导教学,同时呢也感谢xyh,zs等大佬的帮助与鼓励。

       大家一起加油吧!

 

posted on 2021-06-08 17:31  拿着代码往里打  阅读(44)  评论(0编辑  收藏  举报