[Buổi 25][Đóng gói][HW] Bài 2: Ví điện tử có hạn mức


LÀM BÀI

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

Author:
Problem types
Allowed languages
C++

Ví điện tử có hạn mức

Bối cảnh

Một ví điện tử cần giữ hai invariant: balance không âm và tổng tiền đã chi trong ngày không vượt dailyLimit. Object bắt đầu với balance ban đầu và limit. Các lệnh:

  • ADD x: nạp tiền nếu x>0.
  • PAY x: chỉ thành công nếu x>0, đủ balance và spent+x≤dailyLimit.
  • RESET: sang ngày mới, đặt spent=0 nhưng balance giữ nguyên.
  • INFO: in balance spent remainingLimit.

Field phải private; main không được sửa balance/spent trực tiếp. Bài Medium buộc người học nghĩ theo state machine nhỏ và mọi mutation đều phải đi qua interface kiểm soát invariant.

Vì đây là phần encapsulation, mọi field tạo nên invariant cần được đặt sau một interface kiểm soát. Một command thất bại phải là thao tác atomic: state trước và sau phải giống nhau hoàn toàn. Khi có nhiều field liên quan, nên viết rõ điều kiện hợp lệ trước rồi mới thực hiện bất kỳ phép gán nào.

Yêu cầu

  1. Class Wallet private balance, spent, limit.
  2. Implement add/pay/reset/info getters.
  3. Xử lý command.
  4. PAY fail không đổi state.

Input

Dòng 1 initial limit q; q dòng command.

Output

Mỗi ADD/PAY in OK/FAIL, RESET in OK, INFO in ba số.

Ràng buộc

0≤initial,limit≤1e12, q≤5000.

Ví dụ 1

Input

100 80 7
PAY 50
PAY 40
ADD 30
PAY 30
INFO
RESET
INFO

Output

OK
FAIL
OK
OK
50 80 0
OK
50 0 80

Giải thích

PAY50 hợp lệ: balance50, spent50. PAY40 fail vì spent sẽ90>80. ADD30 làm balance80. PAY30 hợp lệ, balance50 spent80. INFO in 50 80 0. RESET đưa spent về0 nên INFO cuối 50 0 80.

Ví dụ này còn kiểm tra nguyên tắc atomic của interface: khi một điều kiện không đạt, object không được giữ lại thay đổi dở dang. Các dòng output vì vậy không chỉ phản ánh OK/FAIL mà còn xác nhận state sau mỗi command vẫn thỏa invariant của class.

Ví dụ 2

Input

0 10 5
PAY 1
ADD 5
PAY 5
INFO
RESET

Output

FAIL
OK
OK
0 5 5
OK

Giải thích

PAY1 fail vì balance0. ADD5 OK, PAY5 OK làm balance0 spent5. INFO 0 5 5. RESET chỉ đổi spent về0, không ảnh hưởng balance.

Ví dụ này còn kiểm tra nguyên tắc atomic của interface: khi một điều kiện không đạt, object không được giữ lại thay đổi dở dang. Các dòng output vì vậy không chỉ phản ánh OK/FAIL mà còn xác nhận state sau mỗi command vẫn thỏa invariant của class.

Thông tin học tập

  • Module: M07
  • Buổi: B25
  • Loại bài: HOMEWORK
  • Độ khó: Medium
  • Concepts: class, private state, invariant, daily limit, command simulation
  • Giới hạn kiến thức: B01-B25
  • Time limit: 1 second(s)
  • Memory limit: 256 MB
  • Point: 100

Comments

There are no comments at the moment.

Zalo