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 אונליין