[Buổi 29][Đa hình][HW] Bài 5: Cảm biến và cảnh báo đa hình
Cảm biến và cảnh báo đa hình
Bối cảnh
Một hệ thống IoT có base abstract Sensor. Temperature: calibrated=raw+offset, alert nếu >50. Humidity: calibrated=raw*factor, alert nếu >80. Pressure: calibrated=raw-offset, alert nếu <900. Hệ thống in calibrated value và ALERT/OK cho từng sensor; cuối cùng in số ALERT và sensor có calibrated value lớn nhất, tie index nhỏ.
Mỗi loại sensor phải tự chứa công thức calibration và policy alert. Engine chỉ gọi interface chung.
Ở 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.
Ở 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 Sensor: value(), alert(), label().
- Derived TEMP/HUM/PRES.
- In từng result.
- Summary alerts và MAX.
Input
Dòng 1 n; n dòng T raw offset, H raw factor, P raw offset.
Output
n dòng result; hai dòng summary.
Ràng buộc
1≤n≤5000.
Ví dụ 1
Input
3
T 48 3
H 60 1.5
P 950 60
Output
TEMP 51.00 ALERT
HUM 90.00 ALERT
PRES 890.00 ALERT
ALERTS 3
MAX 2 PRES 890.00
Giải thích
TEMP value51 nên ALERT; HUM value90 nên ALERT; PRES value890 nên ALERT vì dưới900. Có3 alert. Giá trị lớn nhất890 ở index2 PRES nên MAX 2 PRES 890.00.
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
T 50 0
H 80 1
Output
TEMP 50.00 OK
HUM 80.00 OK
ALERTS 0
MAX 1 HUM 80.00
Giải thích
TEMP50 đúng ngưỡng nên không alert vì rule là >50. HUM80 cũng không alert. ALERTS0; MAX giữa80 và50 là HUM index1.
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 sensor, virtual calibrated value, virtual alert, polymorphic batch
- Giới hạn kiến thức: B01-B29
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments