復習 - 図形の面積
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 11/57。
チャレンジ
中級4つのファイルで小さな図形ライブラリを構築してください。コンストラクターは与えられています。
Shape.R: ジェネリック関数area(shape, ...)、perimeter(shape, ...)、describe(shape, ...)。デフォルトのarea()およびperimeter()メソッドは、unknown shape: hexagonで停止します(call. = FALSEを使用)。デフォルトのdescribe()は、図形の最初のクラスと2つのジェネリック関数から構成された、少数点以下2桁のcircle: area 3.14, perimeter 6.28を返します。Circle.R、Rectangle.R、Triangle.R: 各図形のareaおよびperimeterメソッド。三角形は辺a、b、cを持ち、その面積は、sを周長の半分としたsqrt(s * (s - a) * (s - b) * (s - c))です。
提供されたコードは、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オンラインコンパイラ