Menu
Coddy logo textTech

Revisão - Dinheiro e Moeda

Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 31 de 57.

challenge icon

Desafio

Médio

Crie uma pequena biblioteca monetária em dois arquivos.

  • Money.R: a classe Money (slots amount, currency) com uma regra de validade currency must be 3 capital letters (verifique com grepl("^[A-Z]{3}$", ...)); um método show() que imprime 12.50 EUR e uma nova linha; + para dois objetos Money que interrompe a execução com cannot add EUR and USD (use call. = FALSE); e Arith para Money e um número com callGeneric().
  • Convert.R: o genérico convert(m, to, rates) com um método para signature("Money", "character") que converte usando as taxas, que informam quantas unidades de cada moeda equivalem a 1 EUR: 11 USD equivalem a 10 EUR.

O código fornecido mantém uma carteira e lê os comandos add 10 EUR, sum (adiciona a carteira inteira), convert 2 USD (o segundo item) ou double 1, imprimindo cada resultado ou error: e a mensagem.

Seu código deve estar em Money.R e Convert.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

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

# Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de R online