Menu
Coddy logo textTech

Repaso: dinero y moneda

Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 31 de 57.

challenge icon

Desafío

Intermedio

Construye una pequeña biblioteca de dinero en dos archivos.

  • Money.R: la clase Money (ranuras amount, currency) con una regla de validez currency must be 3 capital letters (compruébala con grepl("^[A-Z]{3}$", ...)); un método show() que imprima 12.50 EUR y una nueva línea; + para dos objetos Money que se detenga con cannot add EUR and USD (usa call. = FALSE); y Arith para Money y un número con callGeneric().
  • Convert.R: el genérico convert(m, to, rates) con un método para signature("Money", "character") que convierta mediante las tasas, las cuales indican cuántas unidades de cada moneda equivalen a 1 EUR: 11 USD equivalen a 10 EUR.

El código proporcionado mantiene una cartera y lee los comandos add 10 EUR, sum (suma toda la cartera), convert 2 USD (el segundo elemento) o double 1, e imprime cada resultado o error: y el mensaje.

Tu código va en Money.R y Convert.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

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

# Código de entrada/salida suministrado: déjalo tal como está
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 = ""))
}

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de R online