作业

34 阅读1分钟
package Level02

// 1. 定义 Point 类(核心修复:补充 x/y 属性、修正象限逻辑、完善方法)
class Point(val x: Double, val y: Double) {

  // 修复:正确的象限判断逻辑(补全第二象限,修正象限编号)
  def whereAmI(): String = {
    if (x > 0 && y > 0) {
      "第1象限"  
    } else if (x < 0 && y > 0) {
      "第2象限"  
    } else if (x < 0 && y < 0) {
      "第3象限"
    } else if (x > 0 && y < 0) {
      "第4象限"
    } else {
      "坐标轴上"  // x=0 或 y=0(含原点)
    }
  }
  def getDist(): Double = {
    Math.sqrt(x * x + y * y)
  }

  def fromPoint(other: Point): Double = {
    val dx = other.x - this.x
    val dy = other.y - this.y
    Math.sqrt(dx * dx + dy * dy)
  }

  override def toString: String = s"Point(${x}, ${y})"
  override def equals(obj: Any): Boolean = obj match {
    case other: Point => this.x == other.x && this.y == other.y  
    case _ => false  
  }

  override def hashCode(): Int = (x, y).hashCode()
}

class LabelPoint(x: Double, y: Double) extends Point(x, y) {
}

object class02 extends App {
  // 测试用例
  val p1 = new Point(-0.1, 0.1)   // 第二象限
  val p2 = new Point(0.1, 0.1)    // 第一象限
  val p3 = new Point(-0.2, -0.2)  // 第三象限
  val p4 = new Point(0.3, -0.3)   // 第四象限
  val origin = new Point(0, 0)    // 坐标轴(原点)

  // 测试象限判断
  println(s"$p1 位于:${p1.whereAmI()}")  // 输出:Point(-0.1, 0.1) 位于:第2象限
  println(s"$p2 位于:${p2.whereAmI()}")  // 输出:Point(0.1, 0.1) 位于:第1象限

  // 测试到原点距离(保留3位小数)
  println(s"$p1 到原点距离:${p1.getDist().formatted("%.3f")}")  // 输出:0.141

  // 测试两点间距离
  println(s"$p1$p2 的距离:${p1.fromPoint(p2).formatted("%.3f")}")  // 输出:0.200

  // 测试上转型(LabelPoint 转型为 Point)
  val labelPoint: Point = new LabelPoint(0.05, 0.05)  // 上转型:子类实例赋值给父类变量
  println(s"上转型对象 $labelPoint 位于:${labelPoint.whereAmI()}")  // 输出:第1象限
}

image.png