הוצאות לפי קטגוריה
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 59 מתוך 64.
אתגר
קלהוסף את הפקודה CATEGORY. ודא שכל הפקודות מהשלבים הקודמים ממשיכות לעבוד בדיוק כמו קודם.
CATEGORY: השב בשורה אחת לכל קטגוריה, בסדר אלפביתי,food: 20.50, עם הסכום הכולל של הקטגוריה בשתי ספרות אחרי הנקודה העשרונית. אם לא נשמרו נתונים, השבno expenses.
פקודת CATEGORY אחת מפיקה כמה תשובות, וכל אחת מהן מודפסת בשורה נפרדת.
הקוד שסופק מעביר כל שורת קלט אל tracker() כפקודה אחת ומדפיס כל תשובה שהוחזרה בשורה נפרדת. התאריכים נכתבים בתבנית YYYY-MM-DD, הקטגוריות הן מילים באותיות קטנות, והקלט מכיל רק את הפקודות שתוארו עד כה.
נסו בעצמכם
tracker <- function(commands) {
expenses <- data.frame(date = character(0), category = character(0), amount = numeric(0))
replies <- c()
for (cmd in commands) {
parts <- strsplit(cmd, " ")[[1]]
if (parts[1] == "ADD") {
amount <- suppressWarnings(as.numeric(parts[4]))
if (length(parts) != 4 || is.na(amount) || amount <= 0) {
replies <- c(replies, paste("invalid:", cmd))
} else {
expenses <- rbind(expenses, data.frame(date = parts[2], category = parts[3], amount = amount))
replies <- c(replies, sprintf("added %s %.2f", parts[3], amount))
}
} else if (parts[1] == "TOTAL") {
replies <- c(replies, sprintf("total: %.2f, count: %d", sum(expenses$amount), nrow(expenses)))
}
}
replies
}
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבהתרגלו בעצמכם: קומפיילר R אונליין