OOP-题目集7-9

       目录

1.前言

2.设计与分析

3.踩坑心得

4.改进建议

5.总结

一、前言

题目集7:

知识点:考察类的继承、多态性使用方法以及接口的应用,Comparable 接口的使用、java集合工具类(如ArrayList的使用)等等

 

题量:少

 

难度:一般,但题目代码量大,但本集题目2通过题目1修改后实现

 

题目集8:

 

知识点:考察类的继承、多态性使用方法以及接口的应用,正则表达式的应用以及类之间的设计关系应用,字符串的处理,java集合工具类(如ArrayList的使用)等等

 

题量:少

 

难度:一般,但题目代码量大

 

题目集9:

知识点:考察类的继承、多态性使用方法,抽象类的使用以及接口的应用,正则表达式的应用以及类之间的设计关系应用,对象属性的处理,java集合工具类(如ArrayList、HashSet的使用)以及迭代器的使用等等

 

题量:少

 

难度:一般,但题目代码量大

 

二、设计与分析

1.分析题目集7(7-1)、(7-2)的递进式设计分析

 

题目:题目集7(7-1)

 

考虑一款适合于小学生的卡片(Card)排序游戏,其规则为随机发放一些卡片给学生,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种 卡片的相应参数,要求学生能够迅速求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排 序,同时求出所有卡片的面积之和。设计类图如下:

OOP-题目集7-9

 

 

输入格式:

  • 首先,在一行上输入一串数字(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:总面积值

 

设计分析:本题实现形状的判断、判断输入数据的正确性、面积的计算以及按面积对图形对象进行排序。设计思路:用ArrayList作为Card集合,包含一个个Card对象(代表卡片集中的一张张卡片),Card类中关联一个Shape对象,四种具体的形状继承Shape类。本题难度一般般,但要合理利用好ArrayList集合对数据进行处理,关联好各类之间的关系即可。

 

部分代码展示:

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;
    }
    public double getArea(){
        return Math.PI*radius*radius;
    }
    public boolean validate() {
        if(radius<=0) {
            return false;
        }
        return true;
    }
    public String toString() {
        String str ="Circle: ";
        System.out.printf("Circle:%.2f ",getArea());
        return str;
    }
}

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;
    }
    public double getArea(){
        return width*length;
    }
    public boolean validate() {
        if(width<=0||length<=0)
            return false;
        else 
            return true;
    }
    public String toString() {
        String str ="Rectangle: ";
        System.out.printf("Rectangle:%.2f ",getArea());
        return str;
    }
}

 

生成报表展示:(使用SourceMonitor)

OOP-题目集7-9

 

类图展示:(使用PowerDesigner)

OOP-题目集7-9

 

题目:题目集7(7-2)

 

沿袭作业 7-1,本次作业主要对卡片(Card)进行分组游戏,其规则为随机发放一些卡片给学生, 卡片仍然分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid), 并给出各种卡片的相应参数,要求学生首先根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。

 

输入格式:

  • 在一行上输入一串数字(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. 输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
  3. 各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
  4. 各组中面积之和的最大值输出,格式为The max area:面积值

 

设计分析:本题在题目7-1的基础上进行修改,在针对对象属性排序的基础上增加对同一种图形对象的分类,需要把握好如何处理类的属性以及重写compareTo方法。

 

这道题就不展示代码了~~~

 

生成报表展示:(使用SourceMonitor)

OOP-题目集7-9

 

类图展示:(使用PowerDesigner)

OOP-题目集7-9

 

2.题目集8题目集9设计思路分析总结

 题目:题目集8(8-1)

编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。

输入格式:

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

  • 存款、取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。
  • 查询余额功能输入数据格式: 卡号

输出格式:

①输入错误处理

  • 如果输入卡号不存在,则输出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.
  • 如果检测为跨行存取款,则输出Sorry,cross-bank withdrawal is not supported.

②取款业务输出

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

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

当前余额为¥[金额]

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

③存款业务输出

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

[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]

当前余额为¥[金额]

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

④查询余额业务输出

¥[金额]

金额保留两位小数。

 

设计分析:此题没有参考实验提供类图而编码,因此导致代码冗长复杂。设计思路:将题目提供的账户信息分别创建成不同类,对输入的内容进行正则匹配判断正误后,去修改对象属性并显示于控制台界面。

 

生成报表展示:(使用SourceMonitor)

OOP-题目集7-9

 

类图展示:(使用PowerDesigner)

 

OOP-题目集7-9

 

 题目:题目集9(9-1)

略,相比于8-1增加信用卡类

 

设计分析:相比于8-1,重新构造类图设计,使用多重从大及小的关联设计,使得程序代码更加简洁并且提高了程序的复用性,程序整体结构清晰良好。

 

生成报表展示:(使用SourceMonitor)

 

OOP-题目集7-9

 

 

 

类图展示:(使用PowerDesigner)

OOP-题目集7-9

 

三、踩坑心得

编写代码之前应构造设计好合适的类图,java不是面向过程,不能为了得到某个结果而去编写代码,应设计好类之间的关系,否则代码将会太过于冗长繁杂且难懂。

 

四、改进建议

1.提前设计好类图,确保类之间结构清晰

 

2.写代码需要加上必要的注释并保证代码编写的规范性

 

3.编写代码时,保证java语言的抽象、继承、封装和多态性

 

4.编写方法时要从对象的身上多去考虑,提高程序的简洁性、建立各个对象之间的松耦合关系

 

五、总结

通过这三次题目集的训练,使我进一步对java语言有了更深的理解,意识到了编写java代码时需要注意的细节,例如:优先将java对象数据初始化、将职责过多的类进行分解等等,特别在本次将题目集8、9中,使我明白了设计一个好的类图的重要性。通过这段时间的学习,能更好地使用继承和接口,提高代码的拓展性、适应性。未来将继续学习java,按时回顾知识内容,进一步提升自己对java语言使用的能力!

 

上一篇:面向对象11方法重写


下一篇:面试中常被问到(三)c/c++区别