定义类强化——移动的圆

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)
    else
      return 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;
        else
            return false;
        }
    public Location getCenter()
    {
        return center;
    }
    public double getRadius()
    {
        return radius;
    }
    
    


    
}

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验内容: 一、定义一个名为Circle的,位于shape包中。要求如下: (1) 该需要描述在二维坐标系中的位置,心的横、纵坐标值均取整数;描述的半径,取双精度型。 (2) 无参构造方法将心坐标设为坐标点,半径设为1.0;有参构造方法需要根据参数值设置心坐标和半径值。 (3) 提供一个计算面积的方法double getArea()。 (4) 提供一个判断当前对象与参数对象是否相交的方法(相交方式见下图): boolean isIntersected(Circle another) (5) 提供一个判断当前对象是否包含参数对象的方法(包含方式见下图): boolean contains(Circle another) (6) 提供一个判断当前对象与参数对象的大小关系的方法(判断依据是半径,半径之差的绝对值小于0.0001认为相等;返回负数表示当前对象小,0表示相等,正数表示当前对象) int compareTo(Circle another) (7) 提供返回当前的字符串的方法,格式为:[Circle(x,y)-raduis] String toString() 二、定义一个包含main方法的TestCircle,位于shape包中。要求如下: (1) main方法中调用以下方法。 (2) 编写静态方法createArray,生成位置和大小均随机的10个对象,置于数组中。 (3) 编写静态方法sort对这10个对象进行升序排序,并输出。 (4) 编写静态方法computeArea计算这10个中互不相交和包含的的面积之和。 提交要求:打包为可以执行的JAR文档,其中要包含源程序文件。
抽象是一种不能被实例化的,它的主要作用是为其子提供一个公共的接口。在Python中,我们可以通过abc模块来定义抽象。在按揭贷款的例子中,我们可以定义一个抽象来规范不同种的贷款计算器的接口。以下是一个按揭贷款计算器抽象的示例代码: ```python from abc import ABC, abstractmethod class MortgageCalculator(ABC): @abstractmethod def calculate_total_payments(self): pass ``` 在这个示例中,我们定义了一个名为MortgageCalculator的抽象,并且定义了一个名为calculate_total_payments的抽象方法。这个方法没有具体的实现,而是由子来实现。这个方法的作用是计算按揭贷款的总还款额。 我们可以通过继承这个抽象来创建不同种的按揭贷款计算器,并实现calculate_total_payments方法。例如,我们可以创建一个名为FixedRateMortgageCalculator的来计算固定利率按揭贷款的总还款额: ```python class FixedRateMortgageCalculator(MortgageCalculator): def __init__(self, loan_amount, interest_rate, loan_term): self.loan_amount = loan_amount self.interest_rate = interest_rate self.loan_term = loan_term def calculate_total_payments(self): monthly_interest_rate = self.interest_rate / 1200 total_payments = self.loan_amount * monthly_interest_rate * ((1 + monthly_interest_rate) ** (self.loan_term * 12)) / (((1 + monthly_interest_rate) ** (self.loan_term * 12)) - 1) return total_payments ``` 在这个示例中,我们创建了一个名为FixedRateMortgageCalculator的,并继承了MortgageCalculator抽象。我们实现了calculate_total_payments方法来计算固定利率按揭贷款的总还款额。这个方法使用了贷款金额、利率和贷款期限等参数来计算总还款额。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值