Menu
Coddy logo textTech

Rejestrowanie wydatków

Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 57 z 64.

W tym projekcie zbudujesz narzędzie do śledzenia wydatków, które odczytuje polecenia, po jednym w wierszu. W pięciu krokach nauczy się zapisywać wydatki, podawać łączną kwotę, grupować wydatki według kategorii, wyświetlać największe wydatki i podsumowywać miesiąc. Każdy krok rozbudowuje tę samą funkcję tracker(commands).

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

Wydatki są przechowywane w ramce danych z jednym wierszem na każdy wydatek. Zaczyna się ona od trzech pustych kolumn odpowiednich typów, a rbind() dodaje wiersz dla każdego prawidłowego 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)

Wynik:

[1] 1
[1] 12.5

Wiersz ADD musi mieć cztery części i dodatnią kwotę. Przekonwertuj kwotę za pomocą suppressWarnings(as.numeric()), aby nieprawidłowa wartość dała NA zamiast ostrzeżenia, a następnie sprawdź ją przed dodaniem wiersza:

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

Wynik:

[1] FALSE
challenge icon

Wyzwanie

Łatwy

Uzupełnij tracker(commands) dla pierwszego polecenia:

  • ADD <date> <category> <amount>: jeśli wiersz składa się dokładnie z czterech części, a kwota jest liczbą większą od 0, dodaj wydatek i odpowiedz added <category> <amount>, podając kwotę z dokładnością do dwóch miejsc po przecinku, na przykład added food 12.50. W przeciwnym razie odpowiedz invalid: , po którym następuje całe polecenie.

Podany kod przekazuje każdy wiersz wejściowy do tracker() jako jedno polecenie i wypisuje każdą zwróconą odpowiedź w osobnym wierszu. Daty są zapisywane w formacie YYYY-MM-DD, kategorie to słowa pisane małymi literami, a dane wejściowe zawierają tylko opisane dotąd polecenia.

Spróbuj swoich sił

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]]
    # Napisz tutaj swój kod
  }
  replies
}

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator R online