Menu
CoddyTech

Ghi lại các khoản chi

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 57 trên 64.

Trong dự án này, bạn sẽ xây dựng một trình theo dõi chi tiêu đọc các lệnh, mỗi dòng một lệnh. Qua năm bước, chương trình sẽ ghi lại các khoản chi, báo cáo tổng số tiền, nhóm chi tiêu theo danh mục, liệt kê các khoản chi lớn nhất và tổng hợp chi tiêu trong một tháng. Mỗi bước mở rộng cùng một hàm tracker(commands).

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

Các khoản chi nằm trong một khung dữ liệu, mỗi hàng ứng với một khoản chi. Khung dữ liệu bắt đầu với ba cột trống có kiểu dữ liệu phù hợp, còn rbind() thêm một hàng cho mỗi ADD hợp lệ:

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)

Đầu ra:

[1] 1
[1] 12.5

Một dòng ADD phải có bốn phần và một số tiền dương. Chuyển đổi số tiền bằng suppressWarnings(as.numeric()) để giá trị không hợp lệ cho kết quả NA thay vì cảnh báo, rồi kiểm tra trước khi thêm hàng:

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

Đầu ra:

[1] FALSE
challenge icon

Thử thách

Dễ

Hoàn thiện tracker(commands) cho lệnh đầu tiên:

  • ADD <date> <category> <amount>: nếu dòng có đúng bốn phần và số tiền lớn hơn 0, hãy thêm khoản chi và trả lời added <category> <amount> với số tiền có hai chữ số thập phân, chẳng hạn như added food 12.50. Nếu không, hãy trả lời invalid: theo sau là toàn bộ lệnh.

Code được cung cấp chuyển từng dòng đầu vào cho tracker() 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. Ngày được viết theo định dạng YYYY-MM-DD, danh mục là các từ viết thường, và dữ liệu đầu vào chỉ chứa những lệnh đã mô tả đến đây.

Tự làm thử

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]]
    # Viết code của bạn ở đây
  }
  replies
}

# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch R online