[Buổi 29][Đa hình][HW] Bài 3: Tổng diện tích và hình lớn nhất
Tổng diện tích và hình lớn nhất
Bối cảnh
Một engine hình học đọc Circle, Rectangle và Triangle qua abstract base Shape. Mỗi derived class override area() và name(). Hệ thống cần tính tổng diện tích và tìm hình có diện tích lớn nhất; nếu hòa, index xuất hiện nhỏ hơn thắng.
Bài Medium buộc dùng collection polymorphic và gọi virtual method qua base. Sau khi object đã được tạo, phase xử lý không được dùng switch theo loại hình. Nếu cấp phát động, base phải có virtual destructor để cleanup an toàn.
Ở B29, sau khi runtime object đã được tạo, phase xử lý nên làm việc thông qua interface base. Nếu code tiếp tục if/switch theo type trong từng phép tính, polymorphism chưa thực sự được sử dụng. Base cần virtual destructor nếu object bị xóa qua base pointer, và collection phải tránh object slicing để dynamic type được giữ nguyên.
Yêu cầu
- Abstract Shape với virtual area/name và virtual destructor.
- Derived Circle/Rectangle/Triangle.
- Tính TOTAL area.
- BEST index name area.
- Format 2 decimals.
Input
Dòng 1 n; n dòng: C r, R w h, T b h.
Output
Hai dòng TOTAL và BEST.
Ràng buộc
1≤n≤5000, kích thước không âm.
Ví dụ 1
Input
3
C 1
R 3 4
T 10 2
Output
TOTAL 25.14
BEST 1 RECTANGLE 12.00
Giải thích
Area lần lượt Circle≈3.14, Rectangle12, Triangle10. Tổng≈25.14. Rectangle ở index1 lớn nhất nên BEST là 1 RECTANGLE 12.00. Engine không cần biết công thức khi gọi qua Shape.
Mẫu này không chỉ kiểm tra giá trị số cuối mà còn kiểm tra dynamic dispatch. Cùng một call-site qua interface base phải chọn implementation đúng với runtime type. Nếu quên virtual, bị slicing hoặc giữ switch sai chỗ, output của một trong các loại object sẽ khác ngay ở bước trace này.
Ví dụ 2
Input
2
R 2 2
T 4 2
Output
TOTAL 8.00
BEST 0 RECTANGLE 4.00
Giải thích
Rectangle2x2 và Triangle4x2 đều area4. Tie chọn index nhỏ hơn0, nên BEST là Rectangle index0 dù hai area bằng nhau.
Mẫu này không chỉ kiểm tra giá trị số cuối mà còn kiểm tra dynamic dispatch. Cùng một call-site qua interface base phải chọn implementation đúng với runtime type. Nếu quên virtual, bị slicing hoặc giữ switch sai chỗ, output của một trong các loại object sẽ khác ngay ở bước trace này.
Thông tin học tập
- Module: M08
- Buổi: B29
- Loại bài: HOMEWORK
- Độ khó: Medium
- Concepts: abstract base, virtual area, polymorphic collection, virtual destructor
- Giới hạn kiến thức: B01-B29
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments