Menu
CoddyTech

添加学生

本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 22 课,共 64 课。

在这个项目中,你将构建一个成绩簿,它会逐行读取命令,并对每条命令作出回复。通过 5 个步骤,它将学会添加学生、记录成绩、报告平均分并找出成绩最高的学生。每一步都会扩展同一个 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 在线编译器