Menu
CoddyTech

Ôn tập: diện tích hình

Thuộc phần Lập trình hướng đối tượng trong hành trình R của Coddy. Bài học 11 trên 57.

challenge icon

Thử thách

Trung bình

Xây dựng một thư viện hình dạng nhỏ gồm bốn tệp. Các hàm khởi tạo (constructor) đã được cung cấp.

  • Shape.R: các hàm generic area(shape, ...), perimeter(shape, ...) và describe(shape, ...). Các phương thức mặc định area() và perimeter() dừng lại với unknown shape: hexagon (dùng call. = FALSE). describe() mặc định trả về circle: area 3.14, perimeter 6.28, được tạo từ lớp đầu tiên của hình dạng và hai hàm generic, với hai chữ số thập phân.
  • Circle.R, Rectangle.R, Triangle.R: các phương thức area và perimeter của từng hình dạng. Hình tam giác có các cạnh a, b, c; diện tích của nó là sqrt(s * (s - a) * (s - b) * (s - c)), trong đó s bằng một nửa chu vi.

Code được cung cấp đọc các dòng circle 1, rectangle 2 3, triangle 3 4 5 hoặc bất kỳ tên nào khác, in ra describe() hoặc error: cùng với thông báo lỗi, rồi in ra tổng diện tích.

Code của bạn nằm trong các tệp Shape.R, Circle.R, Rectangle.R và Triangle.R. main.R chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

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

# Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyên
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 = "")

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch R online