Báo cáo lớp học
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 25 trên 64.
Thử thách
DễThêm lệnh REPORT. 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.
REPORT: trả lời bằng một dòng cho mỗi học sinh đã lưu, theo thứ tự bảng chữ cái, với định dạng giống câu trả lời choAVG(ada: 88.8hoặcbo: no grades). Sau đó thêm dòngClass average:, theo sau là điểm trung bình của mọi điểm đã ghi nhận của tất cả học sinh, với một chữ số thập phân, hoặcno gradesnếu chưa ghi nhận điểm nào.
Một lệnh REPORT tạo ra nhiều câu trả lời, mỗi câu được in trên một dòng riêng.
Code được cung cấp chuyển từng dòng đầu vào cho gradebook() dưới dạng một lệnh và in mỗi câu trả lời được trả về trên một dòng riêng. Tên là một từ viết thường, và dữ liệu đầu vào chỉ chứa các lệnh đã mô tả đến thời điểm 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]])))
}
}
}
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