Menu
Coddy logo textTech

Class Report

Part of the Logic & Flow section of Coddy's R journey. Lesson 25 of 64.

challenge icon

Challenge

Easy

Add the REPORT command. Keep every command from the previous steps working exactly as before.

  • REPORT: reply with one line per stored student in alphabetical order, formatted like the reply to AVG (ada: 88.8 or bo: no grades). Then add the line Class average: followed by the mean of every recorded grade of every student with one decimal, or no grades when nothing has been recorded.

One REPORT command produces several replies, and each is printed on its own line.

The supplied code passes every input line to gradebook() as one command and prints each returned reply on its own line. A name is one lower-case word, and the input holds only the commands described so far.

Try it yourself

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
}

# Supplied input/output code: keep it as it is
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")

All lessons in Logic & Flow

Practice on your own: Online R compiler