添加学生
本课属于 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, ...) 收集回复,并在最后返回。
挑战
简单为第一个命令补全 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")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器