[Buổi 25][Đóng gói][HW] Bài 5: Hồ sơ GPA tích lũy an toàn


LÀM BÀI

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

Author:
Problem types
Allowed languages
C++

Hồ sơ GPA tích lũy an toàn

Bối cảnh

Một hồ sơ học tập không lưu trực tiếp GPA tùy ý mà lưu hai aggregate private: tổng gradePoints và tổng credits. Lệnh ADD grade credit chỉ hợp lệ khi 0≤grade≤4credit>0; nếu thành công cộng grade*credit và credit. REMOVE grade credit chỉ được chấp nhận nếu sau khi trừ, credits không âm và gradePoints không âm; dữ liệu test đảm bảo thao tác remove mô tả đúng một khối điểm đã từng được cộng theo tổng aggregate. GPA in trung bình 2 decimals, nếu credits=0 in 0.00.

Bài Medium nhấn mạnh không cho main gán GPA trực tiếp. GPA là derived value từ state hợp lệ, nên interface chỉ cho thay đổi thông qua các giao dịch có kiểm tra.

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. Private gradePoints(double), credits(int).
  2. ADD/REMOVE validation.
  3. GPA query 2 decimals.
  4. Fail không đổi state.

Input

Dòng 1 q; q command.

Output

Mỗi ADD/REMOVE in OK/FAIL; GPA một dòng.

Ràng buộc

q≤5000, credit≤1000.

Ví dụ 1

Input

6
ADD 4 3
ADD 3 2
GPA
REMOVE 3 2
GPA
REMOVE 4 3

Output

OK
OK
3.60
OK
4.00
OK

Giải thích

ADD4x3 tạo12 points/3 credits; ADD3x2 thêm6/2, tổng18/5 nên GPA3.60. REMOVE3x2 đưa về12/3, GPA4.00. REMOVE4x3 hợp lệ và hồ sơ trở về0 credits.

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

4
GPA
ADD 5 3
ADD 3 0
GPA

Output

0.00
FAIL
FAIL
0.00

Giải thích

GPA ban đầu0.00. ADD grade5 fail vì vượt4; ADD credit0 fail. State vẫn rỗng nên GPA cuối vẫn0.00.

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 aggregates, invariant, weighted average, 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