前言:本次一共总结三次题目集的内容,为题目集7-9。题目集7共有两道题,涉及到类的继承、多态使用方法及接口的应用知识点;题目集8和9分别有一道题,并且都为银行ATM机仿真题目。题目集8主要要求我们实现基础数据的初始化、用户存款及查询余额功能,题目集9主要要求我们实现基础数据的初始化、用户取款及查询余额功能。就难度而言,题目集7的题目7-1图形卡片排序游戏属于中等偏易难度,题目集7的题目7-2图形卡片分组游戏与题目7-1类似但在此基础上加了点难度为中等难度。具体题目要求如下:
题目集7:题目7-1:

题目7-2:

题目集8:


题目集9:

设计与分析:
题目集7:题目7-1类图如下:

题目集7-2类图如下:

题目集8类图如下:

题目集9类图如下:

1、题目集7(7-1)、(7-2)递进式设计分析总结
题目7-1为一款适合于小学生的卡片(Card)排序游戏,其规则为随机发放一些卡片给学生,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种 卡片的相应参数,要求学生能够迅速求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排 序,同时求出所有卡片的面积之和。
题目7-2沿袭作业 7-1,主要对卡片(Card)进行分组游戏,其规则为随机发放一些卡片给学生, 卡片仍然分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid), 并给出各种卡片的相应参数,要求学生首先根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。
题目7-1测试数据如图:

题目7-2测试数据如图:

题目集7结合了课程的学习和任务特点,为递进式教学法,按照课程知识点的逐步推进。
2、题目集8和题目集9ATM机仿真题目的设计思路分析总结
首先是题目集8,我们从解题报告中明确要初始化的信息,找出其中的联系,创建出多个类从而实现初始化。从题目所给的解题报告分析可明确做这题的大致思路流程:初始化、用户的姓名、隶属银行、隶属卡号、银行账号、初始余额。题目集9是在老师给的代码中进行迭代,其实我们可以看到很明显的对应关系,UnoinPay类里面有银行链表;Bank类里面有账户链表,银行卡链表;Account类里面有银行卡链表银联与银行是关联关系(1对多)银行与账户是关联关系(1对多)用户与账户是关联关系(1对多)账户与银行卡是关联关系(1对多)银行与ATM是关联关系(1对多)。题目集8与题目集9两道题相对比题目有了些改变,银行账户分成了两种:借记账户和贷记账户。并且,借记账户不能透支而贷记账户可以透支,但可能需要手续费。本次作业银行卡包含借记卡和信用卡两类,并且有跨行办理业务相关功能且不同银行跨行取款利率也会有区别。我们需要做的在老师代码上迭代即可,其实只要在老师代码的bank类的基础上加上rate,在有参构造函数中加上rate,并在初始化中附上利率值,并对原来没有初始化的信息初始化。
题目集8测试数据如图:

题目集9测试数据如图:

踩坑心得:
就题目7而言,主要存在的问题就是刚开始代码太过冗长导致没有办法提交,后来发现是重复的方法写太多了导致代码太长。
题目集7题目7-1代码:
import java.util.Collections; import java.util.ArrayList; import java.util.Scanner; import java.util.*; public class Main{ //在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接 //使用Main.input.next…即可(避免采坑) public static Scanner input = new Scanner(System.in); public static void main(String[] args) { // TODO Auto-generated method stub 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(); input.close(); } } interface comparable{ } class Card implements Comparable<Card>{ Shape shape; Card(){ } Card(Shape shape){ this.shape = shape; } public Shape getShape() { return shape; } public void setShape(Shape shape) { this.shape = shape; } @Override public int compareTo(Card card) { return -(int)(shape.getArea()-card.getShape().getArea()); } } abstract class Shape{ String shapeName; Shape(){ } Shape(String shapeName){ this.shapeName = shapeName; } public String getShapeName() { return shapeName; } public void setShapeName(String shapeName) { this.shapeName = shapeName; } abstract public double getArea(); abstract public boolean validate() ; @Override public String toString(){//重写toString的方法 return getShapeName()+":"+String.format("%.2f ",getArea()); } } class Circle extends Shape{//圆 double radius; Circle(){ } Circle(double radius){ this.radius = radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } @Override public double getArea() {//圆面积 return Math.PI*radius*radius; } @Override public boolean validate() { if(radius > 0) { return true; } else { return false; } } /*@Override public String toString() { return null; }*/ } class Rectangle extends Shape{//矩形 double width,length; Rectangle(){ } Rectangle(double width,double length){ this.width = width; this.length = length; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getLength() { return length; } public void setLength(double length) { this.length = length; } @Override public double getArea() { return width*length; } @Override public boolean validate() { if(width > 0 && length > 0) return true; else return false; } /*@Override public String toString() { return null; }*/ } class Trapezoid extends Shape{//梯形 double topSide,bottomSide,height; Trapezoid(){ } Trapezoid(double topSide,double bottomSide,double height){ this.topSide = topSide; this.bottomSide = bottomSide; this.height = height; } @Override public double getArea() { return (topSide + bottomSide)*height/2; } @Override public boolean validate() { if(topSide > 0 && bottomSide > 0 && height > 0) return true; return false; } /*@Override public String toString() { return null; }*/ } class Triangle extends Shape{//三角形 double side1,side2,side3; Triangle(){ } Triangle(double side1,double side2,double side3){ this.side1 = side1; this.side2 = side2; this.side3 = side3; } @Override public double getArea() { //海伦公式 double p=(side1+side2+side3)/2; double s=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3)); return s; } @Override public boolean validate() { if(side1+side2<=side3||side1+side3<=side2||side2+side3<=side1) { return false; } if(side1-side2>=side3||side1-side3>=side2||side2-side3>=side1) { return false; } return true; } /*@Override public String toString() { return null; }*/ } class DealCardList{//卡片属性 ArrayList<Card> cardList= new ArrayList<Card>(); DealCardList(){ } DealCardList(ArrayList<Integer>list){ int i ; for (i = 0; i < list.size();i++){ if (list.get(i)==0) break; switch(list.get(i)){ case 1: Card card1 = new Card(new Circle(Main.input.nextDouble())); card1.getShape().setShapeName("Circle"); cardList.add(card1); break; case 2: Card card2 = new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble())); card2.getShape().setShapeName("Rectangle"); cardList.add(card2); break; case 3: Card card3=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble())); card3.getShape().setShapeName("Triangle"); cardList.add(card3); break; case 4: Card card4=new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble())); card4.getShape().setShapeName("Trapezoid"); cardList.add(card4); break; } } } public boolean validate() { boolean ret=true; for (Card card : cardList) { if (!card.getShape().validate()){ ret=false; break; } } return ret; } public void cardSort() { TreeSet<Card> cards = new TreeSet<>(cardList); for (Card card : cards) { System.out.print(card.getShape()); } } public double getAllArea() { double allArea = 0; for (Card card : cardList) { allArea+=card.getShape().getArea(); } return allArea; } public void showResult() { System.out.println("The original list:"); for (Card card : cardList) { System.out.print(card.getShape()); } System.out.println(); System.out.println("The sorted list:"); cardSort(); System.out.println(); System.out.printf("Sum of area:%.2f\n",getAllArea()); } }
然后是题目集8,个人觉得类的设计是真的不太好设计,类的种类太多了。其实自己在pta上提交的代码太过冗长和繁琐,类的设计没有设计好,也是后来题目集时间截止之后老师讲过了这个题类的设计之后思路才清晰了很多。接着是对一张卡连续存取款时,没有办法接着上次存取款的金额进行计算,后来发现其实只要在每一次输出当前余额的时候改变Account上面的余额就好了。
题目集8部分代码:
class Account{ DecimalFormat a = new DecimalFormat("0.00"); Account(){ } String id; String password="88888888"; int num,money; String[] k; String[] account; Account(String[] account) { this.account=account; } String str1="6217000010041315709"; String str2="6217000010041315715"; String str3="6217000010041315718"; String str4="6217000010051320007"; String st1="6222081502001312389"; String st2="6222081502001312390"; String st3="6222081502001312399"; String st4="6222081502001312400"; String st5="6222081502051320785"; String st6="6222081502051320786"; double ma1=10000,ma2=10000,ma3=10000,mb1=10000,mb2=10000,mb3=10000,mb4=10000,mb5=10000;
最后是题目集9,其实一开始贷记和借记一直都分不太清,后来发现,对于借记账户取款时10000是包括手续费的,如果是跨行取款取10000是取不出来的。总之,这几次题目集中的题给我个人的感觉是类的设计是个比较纠结的问题,可能还是自己经验不足,类设计思维还比较生疏。
改进建议:
其实题目集7和题目集8代码的复杂度相当,都不太复杂。但是在题目集9中可以明显感觉到自己用了很多的if-else判断语句来进行判断,这样导致代码可读性太差。这给了我教训,日后写代码要注意这方面的问题。还有就是初始化的问题,其实初始化本身是不难的,但是通过题目集8和题目集9的ATM初始化,我发现虽然初始化本身不难,但是一旦数据多了,也会变得复杂起来,这告诉我们拿到一大堆数据不要盲目上手,不然找不到合适的方法会重复很多代码。所以拿到众多的初始化数据要找到每一类之间的关系,最后一起初始化。
总结:
在此总结一下心得吧,做了这么多题目会发现其实拿到一个题目我们应该先通过题目确定各个方法的属性,考虑每个东西的特性,一对多的时候用链表。构造方法分为有参构造方法和无参构造方法,有了构造方法才能在该类里new该类的一般方法,最重要的是我们要明确类与类之间的关系。其实从题目集7-9可以发现,从卡片游戏到ATM机类的设计越来越贴合我们的日常生活,在设计时我们会不由自主地结合我们的日常生活,会慢慢地发现Java这门编程语言是极其有用和重要的。当然,通过题目集7-9我也学到了非常多的东西,其中印象最深的是类的设计的思想,其实我个人一直都觉得建立非常完备的编程思想确确实实是挺难的。但是这种思维是可以锻炼的,我相信经过我们每个人的努力,最后肯定能收获自己想要的东西。
浙公网安备 33010602011771号