题目类别: 实验
关键字: 类、对象、封装、聚合、组合
内容要求:
一、实验目的
(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啦)
😒
😒
😒
😒