[Buổi 27][Củng cố OOP cơ bản][HW] Bài 2: Sổ chi tiêu theo danh mục


LÀM BÀI

Points: 100
Time limit: 1.0s
Memory limit: 256M

Author:
Problem types
Allowed languages
C++

Sổ chi tiêu theo danh mục

Bối cảnh

Một ứng dụng chi tiêu có hai lớp: Expense lưu id, category, amount; ExpenseBook quản lý danh sách Expense. ID giao dịch phải duy nhất và amount>0.

Command:

  • ADD id category amount
  • REMOVE id
  • TOTAL: tổng toàn bộ
  • CATEGORY name: tổng theo category
  • TOP: category có tổng chi lớn nhất; tie theo tên tăng. Nếu chưa có expense in EMPTY.

ExpenseBook phải là nơi duy nhất quản lý collection; main chỉ chuyển command. Bài Medium tích hợp class responsibility, validation, aggregate query và tie-break mà chưa cần inheritance.

Bài tích hợp B27 cần thể hiện rõ trách nhiệm giữa các class. Object nhỏ bảo vệ state cục bộ; class quản lý/aggregate root chịu trách nhiệm tìm object và phối hợp workflow. Một thao tác liên quan nhiều object phải kiểm tra đủ điều kiện trước khi mutation để tránh trạng thái chỉ cập nhật một nửa.

Yêu cầu

  1. Class Expense là data object.
  2. Class ExpenseBook private vector<Expense>.
  3. ID unique, amount>0.
  4. Queries TOTAL/CATEGORY/TOP.

Input

Dòng 1 q; q command.

Output

Mỗi command một dòng: ADD/REMOVE OK/FAIL; query kết quả.

Ràng buộc

q≤5000, amount≤1e12.

Ví dụ 1

Input

9
ADD E1 FOOD 100
ADD E2 BOOK 200
ADD E3 FOOD 50
TOTAL
CATEGORY FOOD
TOP
REMOVE E2
TOP
TOTAL

Output

OK
OK
OK
350
150
BOOK 200
OK
FOOD 150
150

Giải thích

Sau ba ADD, total350; FOOD150. TOP là BOOK200 vì lớn hơn FOOD150. Remove E2 làm chỉ còn FOOD150, nên TOP FOOD 150 và TOTAL150.

Ví dụ này cũng kiểm tra trách nhiệm giữa manager và object domain: lookup/điều phối được thực hiện ở lớp quản lý, còn object tự quyết định mutation hợp lệ của state riêng. Vì vậy sau mỗi lệnh, các query tiếp theo phản ánh một trạng thái nhất quán thay vì các field bị sửa rời rạc.

Ví dụ 2

Input

5
TOP
TOTAL
CATEGORY X
REMOVE E1
ADD E1 A 0

Output

EMPTY
0
0
FAIL
FAIL

Giải thích

Khi book rỗng, TOP=EMPTY, TOTAL0, CATEGORY X=0, REMOVE fail. ADD amount0 cũng fail nên state vẫn rỗng.

Ví dụ này cũng kiểm tra trách nhiệm giữa manager và object domain: lookup/điều phối được thực hiện ở lớp quản lý, còn object tự quyết định mutation hợp lệ của state riêng. Vì vậy sau mỗi lệnh, các query tiếp theo phản ánh một trạng thái nhất quán thay vì các field bị sửa rời rạc.

Thông tin học tập

  • Module: M07
  • Buổi: B27
  • Loại bài: HOMEWORK
  • Độ khó: Medium
  • Concepts: multiple classes, private state, aggregation, command flow, vector, map-like lookup
  • Giới hạn kiến thức: B01-B27
  • Time limit: 1 second(s)
  • Memory limit: 256 MB
  • Point: 100

Comments

There are no comments at the moment.

Zalo