努力打卡 每天学习 不浪费每一天 Day48

题目:

2.3.2编程题
1.(基本题)本题目要求实现的各个类,按照其继承的顺序,分别是:
抽象Geometry类:calculateArea()抽象方法。
Circle类:用来描述圆的状态和行为,为Geometry的子类;
Ellipse类:描述椭圆的状态和行为,为Geometry的子类;
Cylinder类:描述圆柱体,该类的属性bottom是Circle类对象;
Test类:实例化以上各个类。
各个类的具体说明如下:
(1).编写描述圆的Circle类
Circle类只有一个属性值radius,记录圆的半径。该类的方法包括:
构造方法Circle(doubleradius),设置圆的半径;
get和set方法(设置和获取属性值radius);
calculateArea方法:计算圆的面积并返回结果。
(2).编写描述椭圆的Ellipse类
Ellipse,包含两个属性a和b,表示长短轴,实现的方法包括:
构造方法Ellipse(doublea,doubleb);
get和set方法(设置和获取属性值a,b);
calculateArea方法:覆盖父类中的calculateArea方法,计算椭圆的面积。
(3.14*(a/2)*(b/2))
(3).编写描述圆柱体的Cylinder类,
Cylinder类,包含两个属性,该属性bottom是Geometry类引用;属性h表示圆柱体的
高。实现的方法包括:
构造方法Cylinder(Geometrya,doubleh);
get和set方法;
calculateArea方法,计算圆柱体的表面积;
(4).编写类Test,该类内有方法voiddraw(Geometryg),该方法输出“目前正在画一个
xxx”,xxx为圆形或椭圆形。
该类有main方法,方法内实例化以上各个类,过程如下:
a.初始化一个Cylinder类型的数组,长度为3(元素中有bottom为Circle的也有bottom为
Eclipse的),并用按对象面积对该数组排序,打印出排序后的结果;
b.初始化一个Geometry类型的数组,长度为3,该数组中元素有Circle,也有Eclipse,并利
用Test类的draw方法将数组元素逐个画出。
(5).将Geometry抽象类改为interface接口的定义,修改以上完成的程序,使程序功能正
常执行。

mport java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        Cylinder[] cylinder={
                new Cylinder(new Circle(3),5),
                new Cylinder(new Ellipse(7,3),15),
                new Cylinder(new Ellipse(6,3),10)};

        System.out.println("===========厡式=================");
        for (Cylinder cylinder1 : cylinder) {
            System.out.println(cylinder1);
        }
        System.out.println("===========面积从小到大===========");
        Arrays.sort(cylinder,(o1, o2) -> Double.compare(o1.calculateArea(), o2.calculateArea()));
        for (Cylinder cylinder1 : cylinder) {
            System.out.println(cylinder1);
        }
        System.out.println("===========面积从大到小===========");
        Arrays.sort(cylinder,(o1, o2) -> Double.compare(o2.calculateArea(), o1.calculateArea()));
        for (Cylinder cylinder1 : cylinder) {
            System.out.println(cylinder1);
        }
        System.out.println("============测试draw功能===========");
        Geometry[] geometries={
                new Circle(3),
                new Ellipse(4,3),
                new Circle(5)};
        for (int i = 0; i < geometries.length; i++) {
            draw(geometries[i]);
        }

    }
    public static void draw(Geometry g){
        if(g instanceof Circle)
        {
            System.out.println("目前正在画一个柱体,底面为圆形");
        }
        if (g instanceof Ellipse){
            System.out.println("目前正在画一个柱体,底面为椭圆形");
        }
    }
}
import java.math.BigDecimal;
import java.math.RoundingMode;

public class Ellipse extends Geometry{
    private double a;//长
    private double b;//短

    public Ellipse(double a, double b) {
        this.a = a;
        this.b = b;
    }

    public double getA() {
        return a;
    }

    public void setA(double a) {
        this.a = a;
    }

    public double getB() {
        return b;
    }

    public void setB(double b) {
        this.b = b;
    }

    @Override
    public double calculateArea() {
        return new BigDecimal(Math.PI*(a/2.0)*(b/2.0)).setScale(3, RoundingMode.HALF_UP).doubleValue();
    }
}
mport java.math.BigDecimal;
import java.math.RoundingMode;

public class Cylinder extends Geometry{
    private Geometry bottom;
    private double h;

    public Cylinder(Geometry a, double h) {
        //多态
        bottom=a;
        this.h=h;
    }

    public Geometry getBottom() {
        return bottom;
    }

    public void setBottom(Circle bottom) {
        this.bottom = bottom;
    }

    public double getH() {
        return h;
    }

    public void setH(double h) {
        this.h = h;
    }

    @Override
    public double calculateArea() {
        if(bottom instanceof Circle)
        {
            return
                    new BigDecimal(2*bottom.calculateArea()+2.0*Math.PI*((Circle) bottom).getRadius()*h)
                            .setScale(3, RoundingMode.HALF_UP).doubleValue();
        }
        else if (bottom instanceof Ellipse){
            return new BigDecimal((2*bottom.calculateArea()+2.0*Math.PI* (((Ellipse) bottom).getB()/2.0)
                    +4.0*((((Ellipse) bottom).getA())/2.0-((Ellipse) bottom).getB()/2.0))*h).setScale(3,RoundingMode.HALF_UP)
                    .doubleValue();
        }
        return -1;
    }

    @Override
    public String toString() {
        if(bottom instanceof Circle){
            return "底面半径为"+((Circle) bottom).getRadius()+",高为:"+h+"的柱体表面积为"+this.calculateArea();
        }
        else if (bottom instanceof Ellipse){
            return "底面长轴为:"+((Ellipse) bottom).getA()+",短轴为:"+((Ellipse) bottom).getB()+",高为:"+h+"的柱体表面积为"+this.calculateArea();
        }
        else
            return null;

    }
}
import java.math.BigDecimal;
import java.math.RoundingMode;

public class Circle extends Geometry{
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return new BigDecimal(Math.PI*Math.pow(radius,2)).setScale(3, RoundingMode.HALF_UP).doubleValue();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值