Menu
CoddyTech

复习:形状面积

本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 11 课,共 57 课。

challenge icon

挑战

中等

在 4 个文件中构建一个小型形状库。构造函数已给出。

  • Shape.R:泛型 area(shape, ...)、perimeter(shape, ...) 和 describe(shape, ...)。默认的 area() 和 perimeter() 方法会以 unknown shape: hexagon 停止(使用 call. = FALSE)。默认的 describe() 会返回 circle: area 3.14, perimeter 6.28,根据形状的第一个类和这两个泛型生成,保留两位小数。
  • Circle.R、Rectangle.R、Triangle.R:每种形状的 area 和 perimeter 方法。三角形有 a、b、c 三条边;它的面积为 sqrt(s * (s - a) * (s - b) * (s - c)),其中 s 是周长的一半。

提供的代码会读取以下行:circle 1、rectangle 2 3、triangle 3 4 5,或其他任意名称;然后打印 describe() 的结果,或打印 error: 和错误消息,最后打印总面积。

你要在 Shape.R、Circle.R、Rectangle.R 和 Triangle.R 中编写代码。main.R 保存了提供的输入和输出代码,不能编辑。

亲手试试

source("Shape.R")
source("Circle.R")
source("Rectangle.R")
source("Triangle.R")

# 提供的输入输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
total <- 0
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  n <- as.numeric(p[-1])
  s <- switch(p[1],
    circle = new_circle(n[1]),
    rectangle = new_rectangle(n[1], n[2]),
    triangle = new_triangle(n[1], n[2], n[3]),
    structure(list(), class = p[1]))
  out <- tryCatch({
    total <- total + area(s)
    describe(s)
  }, error = function(e) paste("error:", conditionMessage(e)))
  cat(out, "\n", sep = "")
}
cat(sprintf("total area: %.2f", total), "\n", sep = "")

面向对象编程中的所有课

自己练习: R 在线编译器