Menu
Coddy logo textTech

Повторение — деньги и валюта

Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 31 из 57.

challenge icon

Задание

Средне

Создайте небольшую библиотеку для работы с деньгами в двух файлах.

  • Money.R: класс Money (слоты amount, currency) с правилом проверки допустимости currency must be 3 capital letters (проверяйте с помощью grepl("^[A-Z]{3}$", ...)); метод show(), выводящий 12.50 EUR и новую строку; + для двух объектов Money, который останавливается с сообщением cannot add EUR and USD (используйте call. = FALSE); и Arith для Money и числа с помощью callGeneric().
  • Convert.R: обобщённая функция convert(m, to, rates) с методом для signature("Money", "character"), который выполняет конвертацию через курсы, указывающие, сколько единиц каждой валюты составляют 1 EUR: 11 USD — это 10 EUR.

Предоставленный код хранит кошелёк и считывает команды add 10 EUR, sum (складывает весь кошелёк), convert 2 USD (второй элемент) или double 1, выводя каждый результат либо error: и сообщение.

Ваш код должен находиться в Money.R и Convert.R. В main.R находится предоставленный код ввода/вывода, и его нельзя редактировать.

Попробуйте сами

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

# Предоставленный код ввода/вывода: оставьте его как есть
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 = ""))
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор R