Java实验11 类与类之间的关系

题目类别: 实验



关键字: 类、对象、封装、聚合、组合



内容要求:

一、实验目的

(1)在理解和掌握类的定义和封装的基础上了解类之间的关系。

(2)理解和掌握this关键字的使用。


二、实验内容

步骤1:按照以下要求编写一个名为Point的类,代表二维坐标系中的一个点。

(1) 放在包ex03中;

(2) 两个int类型的数据域x和y,分别代表点的横、纵坐标;

(3) 对数据域进行封装;

(4) 无参构造方法,初始化的坐标是(0,0);

(5) 有参构造方法,两个参数x,y分别初始化数据域x和y;

(6) 一个计算两个点之间距离的方法distance(Point other),返回值类型double,表示当前对象与参数对象之间的距离。



步骤2:按照以下要求编写一个名为Circle的类,代表二维坐标系中的一个圆。

(1) 放在包ex03中;

(2) 一个Point类型的数据域center,代表圆的圆心;

(3) 一个double类型的数据域radius,代表圆的半径;

(4) 对数据域进行封装;

(5) 无参构造方法将圆心坐标设为坐标圆点(0,0),半径设为1.0;

(6) 有参构造方法需要根据参数值设置圆心坐标和半径值;

(7) 一个计算圆面积的方法double getArea();

(8) 一个判断当前圆对象与参数圆对象是否相交的方法(相交方式见下图): boolean isIntersected(Circle other)
在这里插入图片描述
(9) 一个判断当前圆对象是否包含参数圆对象的方法(包含方式见下图): boolean contains(Circle other)
在这里插入图片描述
(10)提供返回当前圆的字符串的方法,返回的字符串格式为:[Circle(x,y)-raduis]

String getCircle()



步骤3:按照以下要求编写一个名为Circles的类,其中包含一个对圆操作的功能。

(1) 放在包ex03中;

(2) 编写静态方法createCircles,

参数:int n,表示生成圆的个数;

返回值:Circle[],存放生成圆对象的数组;

功能:生成位置和大小均随机的n个圆对象。

(3) 编写静态方法outputCircles,

参数:Circle[],存放圆对象的数组;

返回值:void

功能:输出数组中所有的圆,每行一个;

(4) 编写静态方法getIsolatedCircles

参数:Circle[] circles

返回值:Circle[],由符合条件的圆组成的数组

功能:找到参数circles数组中所有孤立的圆,孤立圆是指该圆与数组中其他的圆都不存在相交或包含的关系。



步骤4:按照以下要求编写主类Main, 放在包main中,主方法main实现以下步骤:

(1) 从键盘输入生成圆的个数n;

(2) 生成n个圆对象并存放在数组中;

(3) 输出这n个圆对象;

(4) 找出这n个圆中的孤立圆,存储在数组中;

(5) 输出所有的孤立圆,如果没有输出“无孤立圆”。




备注

提交:打包为可以执行的JAR文档,其中要包含源程序文件。 思考题:画出本实验中的类图。



实现代码:

Point类:

package ex03;

/**
 * @author zg
 */
public class Point {
    /**
     * 横坐标
     */
    private double x;
    /**
     * 纵坐标
     */
    private double y;

    /**
     * 无参构造方法,初始化的坐标是(0,0)
     */
    public Point() {
        this(0.0,0.0);
    }

    /**
     * 有参构造方法,
     * @param x 初始化数据域x
     * @param y 有初始化数据域y
     */
    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    /**
     *访问器和修改器
     */
    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    /**
     *
     * @param other 另一个点
     * @return 两个点之间距离
     */
    public double distance(Point other){
        return Math.sqrt((this.x-other.getX())*(this.x-other.getX())+(this.y-other.getY())*(this.y-other.getY()));
    }
}


Circle类:

package ex03;

/**
 * @author zg
 */
public class Circle {

    /**
     * 圆的圆心
     */
    private Point center;
    /**
     * 圆的半径
     */
    private double radius;

    /**
     * 无参构造方法将圆心坐标设为坐标圆点(0,0),半径设为1.0
     */
    public Circle() {
        this(new Point(0,0),1.0);
    }

    /**
     * 有参构造方法需要根据参数值设置圆心坐标和半径值
     * @param center 圆心
     * @param radius 半径
     */
    public Circle(Point center, double radius) {
        this.center = center;
        this.radius = radius;
    }

    /**
     * 访问器和修改器
     */
    public Point getCenter() {
        return center;
    }

    public void setCenter(Point center) {
        this.center = center;
    }

    public double getRadius() {
        return radius;
    }

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

    /**
     *
     * @return 圆面积
     */
    public double getArea(){
        return this.radius*this.radius*Math.PI;
    }

    /**
     *
     * @param other 另一个圆
     * @return 判断当前圆对象与参数圆对象是否相交
     */
    public boolean isIntersected(Circle other){
        //  较大的圆的半径
        double maxRadius=Math.max(this.radius,other.getRadius());
        //  较小的圆的半径
        double minRadius=this.radius+other.getRadius()-maxRadius;
        //  两圆心的距离
        double distance = this.getCenter().distance(other.getCenter());
        return distance>=maxRadius-minRadius&&distance<=maxRadius+minRadius;
    }

    /**
     *
     * @param other 另一个圆
     * @return 判断当前圆对象是否包含参数圆对象
     */
    public boolean contains(Circle other){
        double distance = this.getCenter().distance(other.getCenter());
        return distance<this.radius- other.getRadius();
    }

    /**
     *
     * @return 提供返回当前圆的字符串的方法
     */
    public String getCircle(){
        return "[Circle("+this.center.getX()+","+this.center.getY()+")-"+this.radius+"]";
    }
}


Circles类:

package ex03;

import java.util.Random;

/**
 * @author zg
 */
public class Circles {
    /**
     *
     * @param n 生成圆的个数
     * @return 存放生成圆对象的数组
     */
    public static Circle[] createCircles(int n){
        Random random=new Random();
        Circle[] circles = new Circle[n];
        for(int i=0;i<n;i++){
            circles[i]=new Circle(new Point(random.nextInt(100),random.nextInt(100)),
                    random.nextInt(10)+1);
        }
        return circles;
    }

    /**
     *
     * @param circles 存放圆对象的数组
     */
    public static void outputCircles(Circle[] circles){
        for (Circle circle : circles) {
            System.out.println(circle.getCircle());
        }
    }

    /**
     *
     * @param circles 由符合条件的圆组成的数组
     * @return 找到参数circles数组中所有孤立的圆,孤立圆是指该圆与数组中其他的圆都不存在相交或包含的关系
     */
    public static Circle[] getIsolatedCircles(Circle[] circles){
        Circle[] newCircle=new Circle[circles.length];
        int count =0;
        for(int i=0;i<circles.length;i++){
            boolean isolatedCircles=true;
            for(int j=0;j<circles.length;j++){
                if(i!=j){
                    if(circles[i].contains(circles[j])||circles[i].isIntersected(circles[j])){
                        isolatedCircles=false;
                        break;
                    }
                }
            }
            if(isolatedCircles){
                newCircle[count++]=circles[i];
            }
        }
        //去除值为null的元素
        Circle[] returnCircle=new Circle[count];
        if (count >= 0) {
            System.arraycopy(newCircle, 0, returnCircle, 0, count);
        }
        return returnCircle;
    }
}


Main类:

package main;

import ex03.Circle;
import ex03.Circles;

import java.util.Scanner;

/**
 * @author zg
 */
public class Main {
    public static void main(String[] args) {
        System.out.print("输入生成圆的个数:");
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        sc.close();

        System.out.println("这"+n+"个圆对象分别是:");
        Circle[] circles = Circles.createCircles(n);
        Circles.outputCircles(circles);
        System.out.println();

        Circle[] isolatedCircles = Circles.getIsolatedCircles(circles);
        if(isolatedCircles.length<=0){
            System.out.println("无孤立圆");
        }else{
            System.out.println("这"+n+"个圆中的孤立圆有"+isolatedCircles.length+"个,分别为:");
            Circles.outputCircles(isolatedCircles);
        }
    }
}


思考题:画出本实验中的类图:
在这里插入图片描述
第一次画UML图,类之间的关系图没有用到特定的图形,也可能有些许错误(其实不太熟悉UML啦)
😒
😒
😒
😒

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值