复习:形状面积
本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 11 课,共 57 课。
挑战
中等在 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 在线编译器