Menu
Coddy logo textTech

Klassenbericht

Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 25 von 64.

challenge icon

Aufgabe

Einfach

Füge den Befehl REPORT hinzu. Jeder Befehl aus den vorherigen Schritten muss weiterhin genau wie zuvor funktionieren.

  • REPORT: Antworte für jeden gespeicherten Schüler in alphabetischer Reihenfolge mit einer Zeile, formatiert wie die Antwort auf AVG (ada: 88.8 oder bo: no grades). Füge anschließend die Zeile Class average: hinzu, gefolgt vom Mittelwert aller aufgezeichneten Noten aller Schüler mit einer Dezimalstelle, oder no grades, wenn noch nichts aufgezeichnet wurde.

Ein REPORT-Befehl erzeugt mehrere Antworten, und jede wird in einer eigenen Zeile ausgegeben.

Der bereitgestellte Code übergibt jede Eingabezeile als einen Befehl an gradebook() und gibt jede zurückgegebene Antwort in einer eigenen Zeile aus. Ein Name besteht aus einem kleingeschriebenen Wort, und die Eingabe enthält nur die bisher beschriebenen Befehle.

Probier es selbst

average_text <- function(scores) {
  if (length(scores) == 0) "no grades" else sprintf("%.1f", mean(scores))
}

gradebook <- function(commands) {
  grades <- list()
  replies <- c()
  for (cmd in commands) {
    parts <- strsplit(cmd, " ")[[1]]
    name <- parts[2]
    if (parts[1] == "ADD") {
      if (name %in% names(grades)) {
        replies <- c(replies, paste(name, "already exists"))
      } else {
        grades[[name]] <- numeric(0)
        replies <- c(replies, paste("added", name))
      }
    } else if (parts[1] == "GRADE") {
      if (!(name %in% names(grades))) {
        replies <- c(replies, paste("no student", name))
      } else {
        score <- as.numeric(parts[3])
        grades[[name]] <- c(grades[[name]], score)
        replies <- c(replies, paste("recorded", score, "for", name))
      }
    } else if (parts[1] == "AVG") {
      if (!(name %in% names(grades))) {
        replies <- c(replies, paste("no student", name))
      } else {
        replies <- c(replies, paste0(name, ": ", average_text(grades[[name]])))
      }
    }
  }
  replies
}

# Gelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")

Alle Lektionen in Logik und Ablaufsteuerung

Übe selbstständig: Online-R-Compiler