Menu
CoddyTech

Ôn tập: Hộp bí mật

Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 21 trên 61.

challenge icon

Thử thách

Dễ

Hãy xây dựng một module Box minh họa tính đóng gói hoàn chỉnh. Hộp của bạn sẽ có ba kích thước ẩn: chiều rộng, chiều cao và chiều sâu. Bạn chỉ có thể truy cập các kích thước này thông qua những hàm bạn cung cấp. Đây chính là mẫu con trỏ mờ hoàn chỉnh!

Bạn sẽ tạo ba tệp:

  • box.h: Giao diện công khai. Khai báo kiểu Box mờ chỉ bằng khai báo trước: phần thân của struct vẫn được ẩn. Khai báo các hàm sau:
    • create_box: nhận ba số nguyên (chiều rộng, chiều cao, chiều sâu) và trả về con trỏ Box
    • destroy_box: giải phóng bộ nhớ đã cấp phát
    • get_volume: nhận một const Box * và trả về thể tích (chiều rộng × chiều cao × chiều sâu)
    • set_dimensions: nhận một con trỏ Box và ba giá trị kích thước mới, trả về int (1 nếu thành công, 0 nếu bất kỳ kích thước nào nhỏ hơn hoặc bằng không)
    Dùng các bảo vệ include với ký hiệu BOX_H.
  • box.c: Định nghĩa struct Box thực tế với ba thành viên ẩn: int width, int height và int depth. Triển khai cả bốn hàm. Hàm khởi tạo cần cấp phát và khởi tạo hộp. Hàm set_dimensions phải xác thực rằng cả ba giá trị đều dương (lớn hơn không) trước khi áp dụng thay đổi. Nếu bất kỳ giá trị nào không đạt yêu cầu xác thực, hãy từ chối toàn bộ cập nhật và trả về 0.
  • main.c: Minh họa cách dùng Box đã đóng gói bằng cách tạo một hộp, kiểm tra thể tích, thử thay đổi kích thước (cả hợp lệ lẫn không hợp lệ) và dọn dẹp đúng cách.

Bạn sẽ nhận năm đầu vào: chiều rộng ban đầu, chiều cao ban đầu, chiều sâu ban đầu, sau đó là ba kích thước mới cần thử thiết lập (có thể bao gồm các giá trị không hợp lệ).

Trong tệp chính, hãy tạo một Box với các kích thước ban đầu và in thể tích của hộp. Sau đó, thử thiết lập các kích thước mới: in xem cập nhật có thành công hay không và thể tích sau cập nhật. Cuối cùng, giải phóng hộp và xác nhận đã dọn dẹp.

In đầu ra theo định dạng sau:

Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyed

Ví dụ, với các đầu vào 2, 3, 4, 5, 5, 5, đầu ra sẽ là:

Volume: 24
Set: 1
Volume: 125
Destroyed

Với các đầu vào 2, 3, 4, -1, 5, 5, đầu ra sẽ là:

Volume: 24
Set: 0
Volume: 24
Destroyed

Lưu ý cách bước xác thực trong set_dimensions bảo vệ hộp của bạn khỏi trạng thái không hợp lệ: code bên ngoài không thể vượt qua các quy tắc của bạn vì các kích thước được ẩn hoàn toàn phía sau giao diện.

Tự làm thử

#include <stdio.h>
#include "box.h"

int main() {
    // Đọc các kích thước ban đầu
    int width, height, depth;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &depth);
    
    // Đọc các kích thước mới để thử thiết lập
    int new_w, new_h, new_d;
    scanf("%d", &new_w);
    scanf("%d", &new_h);
    scanf("%d", &new_d);
    
    // TODO: Tạo một Box với các kích thước ban đầu
    
    
    // TODO: In ra thể tích ban đầu theo định dạng: "Volume: {volume}"
    
    
    // TODO: Thử thiết lập các kích thước mới và lưu kết quả
    
    
    // TODO: In ra trạng thái thiết lập thành công hay không theo định dạng: "Set: {0 or 1}"
    
    
    // TODO: In ra thể tích sau khi thiết lập theo định dạng: "Volume: {volume}"
    
    
    // TODO: Hủy hộp và in ra "Destroyed"
    
    
    return 0;
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C online