作业

12 阅读1分钟
scala
object W59 {

def main(args: Array[String]): Unit = {
  import scala.math.sqrt

  class Point(val x: Double, val y: Double) {

    // 1. 计算到坐标原点的距离
    def distanceToOrigin: Double = sqrt(x * x + y * y)

    // 2. 计算到另一个 Point 的距离
    def distanceTo(other: Point): Double = {
      val dx = x - other.x
      val dy = y - other.y
      sqrt(dx * dx + dy * dy)
    }

    // 3. 判断所在象限(返回 0 表示在坐标轴上)
    def quadrant: Int = (x, y) match {
      case (x, y) if x > 0 && y > 0 => 1
      case (x, y) if x < 0 && y > 0 => 2
      case (x, y) if x < 0 && y < 0 => 3
      case (x, y) if x > 0 && y < 0 => 4
      case _ => 0
    }

    // 4. 重写 equals 方法(判断两点坐标是否完全相等)
    override def equals(other: Any): Boolean = other match {
      case that: Point =>
        (that canEqual this) &&
          x == that.x &&
          y == that.y
      case _ => false
    }

    // 辅助 equals 方法的 canEqual
    def canEqual(other: Any): Boolean = other.isInstanceOf[Point]

    // 重写 hashCode(与 equals 保持一致)
    override def hashCode(): Int = {
      val state = Seq(x, y)
      state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
    }

    // 5. 重写 toString 方法(友好展示点信息)
    override def toString: String =
      f"Point(x=$x%.2f, y=$y%.2f, 到原点距离=${distanceToOrigin}%.2f, 象限=$quadrant)"
  }

  // 继承 Point 的 LabelPoint 类
  class LabelPoint(val label: String, x: Double, y: Double) extends Point(x, y) {
    override def toString: String =
      f"LabelPoint(label='$label', x=$x%.2f, y=$y%.2f, 到原点距离=${distanceToOrigin}%.2f, 象限=$quadrant)"
  }

  // 主程序(测试所有功能)
  object PointTest extends App {
    // 创建测试点
    val p1 = new Point(3, 4)
    val p2 = new Point(0, 5)
    val p3 = new Point(-2, -3)
    val p4 = new Point(3, 4)  // 与 p1 坐标相同
    val origin = new Point(0, 0)
    val labelP = new LabelPoint("A", 1, 1)

    // 1. 测试到原点距离
    println(s"p1 到原点距离: ${p1.distanceToOrigin}")  // 输出 5.0
    println(s"origin 到原点距离: ${origin.distanceToOrigin}")  // 输出 0.0

    // 2. 测试到另一个点的距离
    println(s"p1 到 p2 距离: ${p1.distanceTo(p2)}")  // 输出 5.83095...

    // 3. 测试象限判断
    println(s"p1 所在象限: ${p1.quadrant}")  // 输出 1
    println(s"p3 所在象限: ${p3.quadrant}")  // 输出 3
    println(s"p2 所在象限: ${p2.quadrant}")  // 输出 0(在 y 轴上)

    // 4. 测试 equals 方法
    println(s"p1 == p2? ${p1 == p2}")  // false
    println(s"p1 == p4? ${p1 == p4}")  // true
    println(s"p1 == origin? ${p1 == origin}")  // false

    // 5. 测试 toString 方法
    println(p1)  // 输出格式化的点信息
    println(labelP)  // 输出带标签的点信息
  }

}
}

屏幕截图 2025-11-19 084227.png