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

مراجعة - عدّاد مواقف السيارات

جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 21 من 57.

challenge icon

التحدي

متوسط

أكمل دالة المصنع make_meter(rate) في Meter.R. ‏rate هو عدد الدقائق التي تشتريها سنت واحد؛ اقفله باستخدام lockBinding() داخل دالة المصنع حتى لا يمكن تغييره مطلقًا. يحتفظ العداد بالدقائق المتبقية والسنتات المدفوعة كمتغيرات خاصة، ويعيد أربع دوال:

  • insert(cents) يقبل فقط 10 أو 20 أو 50 أو 100، وإلا يتوقف مع coin not accepted؛ يضيف كل نقد cents * rate من الدقائق ويُحتسب ضمن المبلغ المدفوع.
  • wait(minutes) يتيح مرور الوقت: تنخفض الدقائق المتبقية، ولكن لا تقل أبدًا عن 0. يؤدي الانتظار بقيمة سالبة إلى التوقف مع time cannot go back.
  • status() يعيد 12 min left، أو expired عند عدم بقاء أي وقت.
  • paid() يعيد السنتات المدفوعة.

استخدم call. = FALSE. يقرأ الكود المزوَّد قيمة المعدل، ثم يقرأ الأسطر coin 20 أو wait 5، ويطبع الحالة أو error: والرسالة بعد كل منها. وأخيرًا يطبع المبلغ المدفوع ويحاول تغيير rate داخل بيئة دالة المصنع.

ضع الكود في Meter.R. يحتوي main.R على كود الإدخال/الإخراج المزوَّد ولا يمكن تعديله.

جرّب بنفسك

source("Meter.R")

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
meter <- make_meter(as.numeric(input[1]))
for (line in input[-1]) {
  p <- strsplit(line, " ")[[1]]
  msg <- tryCatch({
    if (p[1] == "coin") meter$insert(as.numeric(p[2]))
    if (p[1] == "wait") meter$wait(as.numeric(p[2]))
    meter$status()
  }, error = function(e) paste("error:", conditionMessage(e)))
  cat(line, ": ", msg, "\n", sep = "")
}
cat("paid: ", meter$paid(), " cents\n", sep = "")
r <- tryCatch({ environment(meter$insert)$rate <- 0; "rate changed" }, error = function(e) "rate is locked")
cat(r, "\n", sep = "")

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم R عبر الإنترنت