题目集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等大佬的帮助与鼓励。
大家一起加油吧!