Menu
Coddy logo textTech

Powtórzenie — pola figur

Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 11 z 57.

challenge icon

Wyzwanie

Średni

Zbuduj niewielką bibliotekę kształtów w czterech plikach. Konstruktory są podane.

  • Shape.R: metody generyczne area(shape, ...), perimeter(shape, ...) i describe(shape, ...). Domyślne metody area() i perimeter() przerywają działanie z komunikatem unknown shape: hexagon (użyj call. = FALSE). Domyślna metoda describe() zwraca circle: area 3.14, perimeter 6.28, utworzony na podstawie pierwszej klasy kształtu oraz dwóch metod generycznych, z dwoma miejscami po przecinku.
  • Circle.R, Rectangle.R, Triangle.R: metody area i perimeter dla każdego kształtu. Trójkąt ma boki a, b, c; jego pole wynosi sqrt(s * (s - a) * (s - b) * (s - c)), gdzie s to połowa obwodu.

Dostarczony kod odczytuje wiersze circle 1, rectangle 2 3, triangle 3 4 5 lub dowolną inną nazwę, wypisuje describe() albo error: i komunikat, a na końcu łączne pole.

Umieść swój kod w plikach Shape.R, Circle.R, Rectangle.R i Triangle.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

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

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator R online