Menu
Coddy logo textTech

Добавление учеников

Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 22 из 64.

В этом проекте вы создадите журнал оценок, который считывает команды, по одной в каждой строке, и отвечает на каждую из них. За пять шагов он научится добавлять учеников, записывать оценки, сообщать средние значения и находить лучшего ученика. На каждом шаге расширяется одна и та же функция gradebook(commands).

ADD ada
GRADE ada 90
AVG ada
REPORT
TOP

Оценки хранятся в именованном списке: имя каждого ученика сопоставляется с числовым вектором оценок этого ученика. Список подходит, потому что у каждого ученика хранится несколько значений.

grades <- list()
grades[["ada"]] <- numeric(0)
grades[["ada"]] <- c(grades[["ada"]], 90)
print(length(grades[["ada"]]))
print(names(grades))

Результат:

[1] 1
[1] "ada"

numeric(0) — это пустой числовой вектор. Присваивание c() здесь не сработало бы: результатом является NULL, а присваивание NULL удаляет элемент списка.

Каждая команда разделяется по пробелам, поэтому parts[1] — это команда, а parts[2] — имя. Цепочка if / else if выбирает, что делать:

for (cmd in commands) {
  parts <- strsplit(cmd, " ")[[1]]
  name <- parts[2]
  if (parts[1] == "ADD") {
    # обработать ADD
  }
}

Ответы собираются с помощью replies <- c(replies, ...), а затем возвращаются в конце.

challenge icon

Задание

Легко

Реализуйте gradebook(commands) для первой команды:

  • ADD <name>: если учащийся новый, сохраните его без оценок и верните ответ added <name>. Если имя уже сохранено, верните ответ <name> already exists.

Предоставленный код передаёт каждую входную строку в gradebook() как одну команду и выводит каждый возвращённый ответ в отдельной строке. Имя представляет собой одно слово в нижнем регистре, а входные данные содержат только описанные на данный момент команды.

Попробуйте сами

gradebook <- function(commands) {
  grades <- list()
  replies <- c()
  for (cmd in commands) {
    parts <- strsplit(cmd, " ")[[1]]
    name <- parts[2]
    # Напишите свой код здесь
  }
  replies
}

# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор R