Menu
Coddy logo textTech

רישום הוצאות

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 57 מתוך 64.

בפרויקט הזה תבנה כלי למעקב אחר הוצאות שקורא פקודות, אחת בכל שורה. לאורך חמישה שלבים הוא ילמד לתעד הוצאות, להציג את הסכום הכולל, לקבץ הוצאות לפי קטגוריה, להציג את ההוצאות הגדולות ביותר ולסכם חודש. בכל שלב מרחיבים את אותה הפונקציה tracker(commands).

ADD 2024-05-01 food 12.50
ADD 2024-05-02 rent 500
TOTAL
CATEGORY
TOP 2
MONTH 2024-05

ההוצאות מאוחסנות במסגרת נתונים, עם שורה אחת לכל הוצאה. היא מתחילה עם שלוש עמודות ריקות מהסוגים המתאימים, ו־rbind() מוסיפה שורה עבור כל ADD תקין:

expenses <- data.frame(date = character(0), category = character(0), amount = numeric(0))
expenses <- rbind(expenses, data.frame(date = "2024-05-01", category = "food", amount = 12.5))
print(nrow(expenses))
print(expenses$amount)

פלט:

[1] 1
[1] 12.5

שורת ADD חייבת להכיל ארבעה חלקים וסכום חיובי. המר את הסכום באמצעות suppressWarnings(as.numeric()) כדי שערך לא תקין יחזיר NA במקום אזהרה, ואז בדוק אותו לפני הוספת השורה:

parts <- strsplit("ADD 2024-05-01 food abc", " ")[[1]]
amount <- suppressWarnings(as.numeric(parts[4]))
print(length(parts) == 4 && !is.na(amount) && amount > 0)

פלט:

[1] FALSE
challenge icon

אתגר

קל

השלם את tracker(commands) עבור הפקודה הראשונה:

  • ADD <date> <category> <amount>: אם בשורה יש בדיוק ארבעה חלקים והסכום הוא מספר גדול מ־0, הוסף את ההוצאה והשב added <category> <amount> כאשר הסכום מוצג עם שתי ספרות אחרי הנקודה העשרונית, למשל added food 12.50. אחרת השב invalid: ואחריו הפקודה כולה.

הקוד שסופק מעביר כל שורת קלט ל־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]]
    # כתבו את הקוד שלכם כאן
  }
  replies
}

# קוד קלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר R אונליין