جدولة الفعاليات
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 56 من 57.
التحدي
صعبأنشئ مجدولًا للأحداث عبر ملفين.
Event.R: فئة S3 المسماةeventمع الحقولtitleوdayوstartوend(بالساعات). اكتبnew_event()؛ وvalidate_event()، التي تتوقف معday must be from 1 to 31أوhours must be within 0 to 24 and start before end؛ والمساعدevent(title, day, start, end)، الذي يحوّل الوسائط النصية إلى أرقام؛ وformat.event()، الذي يعيدday 3 09-11 standup؛ وoverlaps(a, b)، التي تكون قيمتهاTRUEعندما يكون حدثان في اليوم نفسه ويبدأ كل منهما قبل انتهاء الآخر.Scheduler.R: تحافظmake_scheduler()على خصوصية أحداثها وتعيدadd(e)، التي تردّ بـduplicateللعنوان نفسه في اليوم نفسه، أوconflicts with reviewعندما يتداخل الحدث مع حدث موجود، أوadded؛ وagenda()، وهي الأحداث المنسّقة مرتبة حسب اليوم ووقت البدء والعنوان؛ وbusiest_day()، التي تعيدbusiest: day 3 (4 hours)وفق إجمالي الساعات (ويُختار اليوم الأسبق عند التعادل)، أوno events.
استخدم call. = FALSE. يقرأ الكود المزوَّد أسطرًا بالصيغة title,day,start,end، ويطبع الرد لكل سطر، ثم جدول الأعمال واليوم الأكثر ازدحامًا.
ضع الكود في Event.R وScheduler.R. يحتوي main.R على كود الإدخال/الإخراج المزوَّد ولا يمكن تعديله.
جرّب بنفسك
source("Event.R")
source("Scheduler.R")
# كود الإدخال/الإخراج المُزوَّد: اتركه كما هو
input <- suppressWarnings(readLines(file("stdin")))
s <- make_scheduler()
for (line in input) {
p <- strsplit(line, ",")[[1]]
reply <- tryCatch(s$add(event(p[1], p[2], p[3], p[4])), error = function(e) paste("invalid:", conditionMessage(e)))
cat(p[1], ": ", reply, "\n", sep = "")
}
cat("agenda:\n")
for (l in s$agenda()) cat(" ", l, "\n", sep = "")
cat(s$busiest_day(), "\n", sep = "")
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت