[Buổi 25][Đóng gói][HW] Bài 4: Hình chữ nhật có invariant


LÀM BÀI

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

Author:
Problem types
Allowed languages
C++

Hình chữ nhật có invariant

Bối cảnh

Một SafeRectangle luôn phải có width,height dương. Constructor nhận w,h; nếu input không hợp lệ, dùng 1 cho chiều tương ứng. Hệ thống nhận lệnh W x, H x, SCALE k, AREA, PERIMETER. Setter chỉ nhận x>0; SCALE chỉ nhận k>0 và nhân cả hai chiều. Lệnh fail không thay state.

Bài Medium cho thấy setter không chỉ "gán field": nó bảo vệ invariant để các behavior area/perimeter có thể giả định object luôn hợp lệ. Width/height phải private.

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.

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 width,height.
  2. Constructor normalize invalid về1.
  3. Methods setWidth,setHeight,scale.
  4. AREA/PERIMETER query.

Input

Dòng 1 w h q; q command.

Output

Mutation in OK/FAIL; query in số.

Ràng buộc

|w|,|h|,|x|≤1e9, kết quả vừa long long.

Ví dụ 1

Input

3 4 6
AREA
W 5
PERIMETER
H 0
SCALE 2
AREA

Output

12
OK
18
FAIL
OK
80

Giải thích

Area đầu 12. W5 OK làm w5,h4 nên perimeter18. H0 fail, state giữ h4. SCALE2 OK thành10x8. AREA cuối80.

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

-1 0 3
AREA
PERIMETER
SCALE 3

Output

1
4
OK

Giải thích

Constructor nhận -1,0 nên normalize cả hai về1. AREA1, PERIMETER4. SCALE3 thành3x3 và in OK.

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, encapsulation, geometry invariant, setter validation, derived behavior
  • 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