当前位置: 首页 > news >正文

定义类强化——移动的圆

1.构造一个Location类:

1)该类有两个double型私有成员变量x和y,分别表示横坐标和纵坐标;

2)该类有一个有参构造方法,能初始化成员变量x和y;

3)该类具有成员变量的x和y的访问方法和赋值方法。

2.构造一个Circle类:

1)该类有一个double型成员变量radius存放半径;

2)该类有一个Location型成员变量center,存放圆心坐标;

2)该类有一个有参构造方法Circle(double x, double y, double r),初始化成员变量radius、center,其中center的初始化过程是:使用参数x和y创建类Location的实例,并将这个对象引用赋值给center;

3)该类具有translate(double tx, double ty) 方法,方法无返回值,这个方法能移动圆心坐标,使x坐标增加tx,y坐标增加ty。

4)该类具有overlaps(Circle other)方法,该方法返回值为boolean型,方法判定参数圆是否和当前圆重叠。如果两个圆圆心的距离小于两个圆半径的和则两个圆重叠。圆心距离由如下公式计算:距离= sqrt((x1-x2)^2 + (y1-y2)^2)。其中(x1,y1) and (x2,y2) 分别是两个圆的圆心坐标。

3.主类中,要求用户输入第一个圆的圆心的x、y坐标、半径,创建第一个Circle类对象,然后用户输入第二个圆的圆心的x、y坐标、半径,创建第二个Circle类对象。当两个圆没有重叠时,将第二个圆的x和y坐标都移动0.5,直到两个圆出现重叠为止。

裁判测试程序样例:

import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);      double x=scanner.nextDouble();double y=scanner.nextDouble();double r=scanner.nextDouble();Circle c1 = new Circle(x,y,r);x=scanner.nextDouble();y=scanner.nextDouble();r=scanner.nextDouble();Circle c2 = new Circle(x,y,r);System.out.println("Circle 1's center is at ("+c1.getCenter().getX()+","+c1.getCenter().getY()+") with a radius of "+c1.getRadius());System.out.println("Circle 2's center is at ("+c2.getCenter().getX()+","+c2.getCenter().getY()+") with a radius of "+c2.getRadius());while(!c1.overlaps(c2)){c2.translate(0.5, 0.5);System.out.printf("Circle 2's center is now at (%.1f,%.1f)\n",c2.getCenter().getX(),c2.getCenter().getY());}System.out.printf("The circles now overlap!");scanner.close();}
}/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

3 3 0.25
0 0 1

输出样例:

在这里给出相应的输出。例如:

Circle 1's center is at (3.0,3.0) with a radius of 0.25
Circle 2's center is at (0.0,0.0) with a radius of 1.0
Circle 2's center is now at (0.5,0.5)
Circle 2's center is now at (1.0,1.0)
Circle 2's center is now at (1.5,1.5)
Circle 2's center is now at (2.0,2.0)
Circle 2's center is now at (2.5,2.5)
The circles now overlap!

还是定义类的强化,基本的定义属性和构造器、方法,我们也不再多做介绍——需要细细了解的小伙伴,咱们移步前面的《定义类》

定义类:定义一个类Square表示正方形_定义一个square类,当客户访问该页面时,服务器创建该类的对象,只要客户给出正方形-CSDN博客

闲话少叙,正文开始: 

 直接肝的定义部分:

 

class Location
{private double x;private double y;//俩私有的成员变量public Location(double x,double y)
{this.x = x;this.y = y;
}//有参构造器public double getX()
{return x;
}public double getY()
{return y;
}//俩方法为成员变量的访问方法public void setX(double x)
{this.x = x;
}public void setY(double y)
{this.y = y;
}//俩方法为成员变量的赋值方法}

Location类定义完成,接着是Circle类 

定义类:定义一个类Square表示正方形_定义一个square类,当客户访问该页面时,服务器创建该类的对象,只要客户给出正方形-CSDN博客

class Circle
{private double radius;//半径定义}

划重点 

当本类中有个成员变量类型为——我们定义过的类 

可知,Location类是我们上面定义的第一个类,现在在Circle类中需要创建个成员变量,类型就是Location。

定义有一个Location型成员变量,名字叫center。意欲何为?存放圆心坐标。

怎么理解?既然center的类型是Location,center本身应该就是一个实例化的类——即对象。

对象怎么来?自然是创建:调用构造器。

至于存放圆心坐标,简直是个很妙的设计:就像一个数组,把x,y聚在一堆。但是又和数组不同,不需要下标,循环啥的访问。直接.操作符,要谁点谁。

代码长这样:

class Circle
{private double radius;//半径定义private Location center = new Location();//类中成员为另一类的实例对象,需要创建,new+构造器
}

发现前面没有默认构造器是不是?在前面添一个就是。

class Location{
public Location(){}//添加进去,我这里就不拷贝前面的了
}

 Circle类的有参构造器

“并将这个对象引用赋值给center”,意思就是把传过来的x,y赋值给center里面的x,y。

至于说引用赋值,就是传参——什么时候传参,自然是需要调用参数的方法里面。可见,题目上也暗示我们直接给人x,y赋值是行不通的。

还记得大明湖畔:公开访问和赋值私有成员变量的两个方法吗?setter和getter方法:公开是让你随时随地调用。

以后的题目,一般就默认说赋值,提示语句就不会有了。

咱们再看眼代码,就了然了。

class Circle
{private double radius;//半径定义private Location center = new Location();//类中成员为另一类的实例对象,需要创建,new+构造器public Circle(double x,double y,double radius){this.center.setX(x);//“这个对象引用赋值”就是用center这个对象名,加上.操作符this.center.setY(y);//标准反面教材:this.center.x = x;要是center的x能被公开访问,这样写可以。可是上一个类里面,x属于private,不能在其他类里面公开访问,更别说赋值this.radius = radius;}//有参构造器}

举一反三:

 它的代码逻辑:也是改变x,y的值(赋值)

代码如下:

public void translate(double tx,double ty)
{this.center.setX(center.getX() + tx);this.center.setY(center.getY() + ty);//一定要在每个方法调用的时候,前面加上引用出处。咱们一般调用的是实例方法,缺少“实例”(对象名)也不行。这里的center.getY()
/*标准错误写法:this.center.x = center.x + tx;this.center.y = center.y + ty;又是公开访问私有变量*/}

 正是返回好Boolean,判断时节又逢君(Math类)

:该类具有overlaps(Circle other)方法,该方法返回值为boolean型,方法判定参数圆是否和当前圆重叠。如果两个圆圆心的距离小于两个圆半径的和则两个圆重叠。圆心距离由如下公式计算:距离= sqrt((x1-x2)^2 + (y1-y2)^2)。其中(x1,y1) and (x2,y2) 分别是两个圆的圆心坐标。 

这题明眼就看出来,代码逻辑已经跃然纸上。

前面我们说会再次遇见Math类的俩方法,所谓念念不忘,必有回响:

public boolean overlaps(Circle other)//传参为一个对象,要的是里面的成员和方法
{double dis = 0.0;//俩圆心距离
dis = Math.sqrt(Math.pow((this.center.getX() - other.center.getX(),2 + Math.pow(this.center.getY() - other.center.getY(),2));
/*这个dis代码看着长,就是两部分,Math.pow() + Math.pow(),再对它俩和开方 */if(dis < this.radius + other.radius)return true;//boolean的值有俩:true,false(不是1和0)elsereturn false;}

this指的是本对象.里面的成员(center).成员里面的成员(x,y)。 --- 可千万不能忽略了谁

针对这种成员变量center的代码:

要点有3:

1.定义的时候,记得能创建就创建——创建什么?这个类的实例对象(center)

2.后面只要涉及这个对象里面的成员(x,y),不可直接调用,采用合法的访问和赋值方法。(setter和getter),要使用私有变量,优先考虑getter;赋值,就是setter

3.对这个对象的访问和赋值方法,写返回类型的是——它所属的类

实践出真知嘛,上面都是改出来的总结。

完整代码参考:

class Location
{private double x;private double y;public Location(){}public Location(double x,double y){this.x =x;this.y = y;   }public void setX(double x){this.x = x;}public void setY(double y){this.y = y;}public double getX(){return x;}public double getY(){return y;}}class Circle
{private double radius;private Location center = new Location();public Circle(double x,double y,double r){center.setX(x);//center 的初始化center.setY(y);radius = r;}public void translate(double tx,double ty){center.setX(center.getX() + tx);center.setY(center.getY() + ty);}public boolean overlaps(Circle other){double dis = 0.0;dis = Math.sqrt(Math.pow(other.center.getX() - this.center.getX(),2) + Math.pow(other.center.getY() - this.center.getY(),2));if(dis < other.radius + this.radius)return true;elsereturn false;}public Location getCenter(){return center;}public double getRadius(){return radius;}}

相关文章:

  • Composer常见错误解决
  • “直播曝光“有哪些媒体直播分流资源?
  • Java基础语法(八)| 继承
  • 基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
  • ArcGIS矢量裁剪矢量
  • SpringBoot --条件注解与属性绑定
  • Contos7 安装 Maven
  • sqlite3的安装
  • 前端Ajax请求从后端获取二进制文件并下载
  • STM32学习笔记(9_2)- USART串口外设
  • qt学习第三天,qt设计师的第一个简单案例
  • JVM(一)——内存结构
  • 实验十 枚举问题(过程模拟)
  • 正则表达式 vs. 字符串处理:解析优势与劣势
  • [linux][调度] 内核抢占入门 —— 高优先级线程被唤醒时会立即抢占当前线程吗 ?
  • Angular数据绑定机制
  • canvas绘制圆角头像
  • HTTP 简介
  • Java Agent 学习笔记
  • Java反射-动态类加载和重新加载
  • Promise面试题2实现异步串行执行
  • QQ浏览器x5内核的兼容性问题
  • Redash本地开发环境搭建
  • springboot_database项目介绍
  • 从重复到重用
  • 分享几个不错的工具
  • 关于extract.autodesk.io的一些说明
  • 观察者模式实现非直接耦合
  • 经典排序算法及其 Java 实现
  • 警报:线上事故之CountDownLatch的威力
  • 利用DataURL技术在网页上显示图片
  • 漂亮刷新控件-iOS
  • 日剧·日综资源集合(建议收藏)
  • 微信开放平台全网发布【失败】的几点排查方法
  • $ git push -u origin master 推送到远程库出错
  • (007)XHTML文档之标题——h1~h6
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (理论篇)httpmoudle和httphandler一览
  • (四)鸿鹄云架构一服务注册中心
  • (循环依赖问题)学习spring的第九天
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Mysql的优化设置
  • .equals()到底是什么意思?
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net wcf memory gates checking failed