Học sinh đứng đầu
Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 26 trên 64.
Thử thách
Trung bìnhThêm lệnh (command) TOP. Giữ cho mọi lệnh từ các bước trước tiếp tục hoạt động chính xác như trước.
TOP: trả lời bằngTop:, theo sau là học sinh có giá trị trung bình (mean) cao nhất và giá trị trung bình đó với một chữ số thập phân trong ngoặc, nhưTop: ada (92.0). Bỏ qua học sinh chưa có điểm. Nếu giá trị trung bình bằng nhau, chọn học sinh có tên đứng trước theo thứ tự bảng chữ cái. Nếu không học sinh nào có điểm, trả lờiTop: none.
Code được cung cấp chuyển từng dòng đầu vào vào hàm (function) gradebook() dưới dạng một lệnh và in ra từng câu trả lời được trả về trên một dòng riêng. Tên gồm một từ viết thường, và đầu vào chỉ chứa các lệnh đã mô tả đến đây.
Tự làm thử
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]])))
}
} else if (parts[1] == "REPORT") {
for (student in sort(names(grades))) {
replies <- c(replies, paste0(student, ": ", average_text(grades[[student]])))
}
replies <- c(replies, paste("Class average:", average_text(unlist(grades))))
}
}
replies
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")
Tất cả bài học trong Logic và luồng điều khiển
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểmTự luyện tập: Trình biên dịch R online