Menu
Coddy logo textTech

Podsumowanie — pieniądze i waluta

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

challenge icon

Wyzwanie

Średni

Zbuduj małą bibliotekę do obsługi pieniędzy w dwóch plikach.

  • Money.R: klasa Money (sloty amount, currency) z regułą poprawności currency must be 3 capital letters (sprawdź za pomocą grepl("^[A-Z]{3}$", ...)); metoda show() wypisująca 12.50 EUR i znak nowej linii; operator + dla dwóch obiektów Money, który zgłasza błąd cannot add EUR and USD (użyj call. = FALSE); oraz Arith dla obiektu Money i liczby, używający callGeneric().
  • Convert.R: funkcja generyczna convert(m, to, rates) z metodą dla signature("Money", "character"), która przelicza walutę za pomocą kursów określających, ile jednostek każdej waluty odpowiada 1 EUR: 11 USD to 10 EUR.

Dostarczony kod przechowuje portfel i odczytuje polecenia add 10 EUR, sum (sumuje cały portfel), convert 2 USD (drugi element) lub double 1, wypisując każdy wynik albo error: i komunikat.

Umieść swój kod w plikach Money.R i Convert.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

source("Money.R")
source("Convert.R")

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

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator R online