Menu
CoddyTech

Ôn tập: tiền và tiền tệ

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 31 trên 57.

challenge icon

Thử thách

Trung bình

Tạo một thư viện tiền tệ nhỏ trong hai tệp.

  • Money.R: lớp Money (các slot amount, currency) với quy tắc hợp lệ currency must be 3 capital letters (kiểm tra bằng grepl("^[A-Z]{3}$", ...)); phương thức show() in ra 12.50 EUR và một dòng mới; toán tử + cho hai đối tượng Money, báo lỗi cannot add EUR and USD (dùng call. = FALSE); và Arith cho Money cùng một số, dùng callGeneric().
  • Convert.R: hàm generic convert(m, to, rates) với một phương thức cho signature("Money", "character"), chuyển đổi dựa trên tỷ giá, cho biết cần bao nhiêu đơn vị của mỗi loại tiền tệ để đổi lấy 1 EUR: 11 USD bằng 10 EUR.

Code được cung cấp lưu một ví tiền và đọc các lệnh add 10 EUR, sum (cộng toàn bộ ví tiền), convert 2 USD (mục thứ hai) hoặc double 1, rồi in từng kết quả hoặc error: cùng thông báo lỗi.

Code của bạn nằm trong Money.R và Convert.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("Money.R")
source("Convert.R")

# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
rates <- c(EUR = 1, USD = 1.1, GBP = 0.85)
wallet <- list()
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  out <- tryCatch({
    if (p[1] == "add") {
      m <- new("Money", amount = as.numeric(p[2]), currency = p[3])
      wallet[[length(wallet) + 1]] <- m
      print(m)
    } else if (p[1] == "sum") {
      print(Reduce(`+`, wallet))
    } else if (p[1] == "convert") {
      print(convert(wallet[[as.numeric(p[2])]], p[3], rates))
    } else if (p[1] == "double") {
      print(wallet[[as.numeric(p[2])]] * 2)
    }
  }, error = function(e) cat("error: ", sub(".*object: ", "", conditionMessage(e)), "\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