סיכום – מדחן
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 21 מתוך 57.
אתגר
בינוניהשלימו את המפעל 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 = "")
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין