דוח כיתתי
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 25 מתוך 64.
אתגר
קלהוסף את הפקודה REPORT. ודא שכל הפקודות מהשלבים הקודמים ממשיכות לפעול בדיוק כמו קודם.
REPORT: החזר שורה אחת לכל תלמיד שמור, בסדר אלפביתי, בפורמט כמו התשובה שלAVG(ada: 88.8אוbo: no grades). לאחר מכן הוסף את השורהClass average:ואחריה את הממוצע של כל הציונים שנרשמו לכל התלמידים, עם ספרה אחת אחרי הנקודה העשרונית, אוno gradesאם לא נרשמו ציונים.
פקודת REPORT אחת מפיקה כמה תשובות, וכל אחת מהן מודפסת בשורה נפרדת.
הקוד שסופק מעביר כל שורת קלט אל gradebook() כפקודה אחת, ומדפיס כל תשובה שהוחזרה בשורה נפרדת. שם הוא מילה אחת באותיות קטנות, והקלט מכיל רק את הפקודות שתוארו עד כה.
נסו בעצמכם
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
}
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבהתרגלו בעצמכם: קומפיילר R אונליין