Menu
Coddy logo textTech

復習 - 図形の面積

CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 11/57。

challenge icon

チャレンジ

中級

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オンラインコンパイラ