Menu
Coddy logo textTech

Riepilogo - Denaro e valuta

Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 31 di 57.

challenge icon

Sfida

Medio

Crea una piccola libreria per gestire il denaro in due file.

  • Money.R: la classe Money (slot amount, currency) con una regola di validità currency must be 3 capital letters (controlla con grepl("^[A-Z]{3}$", ...)); un metodo show() che stampa 12.50 EUR e una nuova riga; + per due oggetti Money che si interrompe con cannot add EUR and USD (usa call. = FALSE); e Arith per Money e un numero con callGeneric().
  • Convert.R: il generico convert(m, to, rates) con un metodo per signature("Money", "character") che converte usando i tassi, i quali indicano quante unità di ciascuna valuta equivalgono a 1 EUR: 11 USD equivalgono a 10 EUR.

Il codice fornito mantiene un portafoglio e legge i comandi add 10 EUR, sum (somma l'intero portafoglio), convert 2 USD (il secondo elemento) oppure double 1, stampando ogni risultato oppure error: e il messaggio.

Il tuo codice va in Money.R e Convert.R. main.R contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

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

# Codice di input/output fornito: lascialo così com'è
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 = ""))
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore R online