Menu
Coddy logo textTech

Rückblick – Parkuhr

Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 21 von 57.

challenge icon

Aufgabe

Mittel

Vervollständige die Factory make_meter(rate) in Meter.R. rate ist die Anzahl der Minuten, die ein Cent kauft; sperre ihn mit lockBinding() innerhalb der Factory, sodass er sich niemals ändern kann. Der Zähler speichert die verbleibenden Minuten und die bezahlten Cents als private Variablen und gibt vier Funktionen zurück:

  • insert(cents) akzeptiert nur 10, 20, 50 oder 100 und bricht andernfalls mit coin not accepted ab; jede Münze addiert cents * rate Minuten und wird auf den bezahlten Betrag angerechnet.
  • wait(minutes) lässt Zeit vergehen: Die verbleibenden Minuten werden weniger, aber niemals kleiner als 0. Ein negatives Warten bricht mit time cannot go back ab.
  • status() gibt 12 min left zurück oder expired, wenn keine Zeit mehr übrig ist.
  • paid() gibt die bezahlten Cents zurück.

Verwende call. = FALSE. Der bereitgestellte Code liest den Tarif ein, anschließend die Zeilen coin 20 oder wait 5, und gibt nach jeder Zeile den Status oder error: sowie die Nachricht aus. Zum Schluss gibt er den bezahlten Betrag aus und versucht, rate innerhalb der Umgebung der Factory zu ändern.

Dein Code gehört in Meter.R. main.R enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

source("Meter.R")

# Gelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
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 = "")

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-R-Compiler