Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - المال والعملة

جزء من قسم البرمجة كائنية التوجه في رحلة 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 عبر الإنترنت