Menu
CoddyTech

Triển khai hình tròn

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 45 trên 61.

challenge icon

Thử thách

Dễ

Hãy tiếp tục xây dựng dự án Shape Drawer bằng cách triển khai Circle: một hình cụ thể nhúng cấu trúc Shape cơ sở và cung cấp logic vẽ cùng tính diện tích riêng.

Dựa trên nền tảng từ bài học trước, bạn sẽ mở rộng dự án với các tệp sau:

  • shape.h: Giữ lại giao diện Shape cơ sở từ bài học trước, cùng các kiểu con trỏ hàm DrawFunc và AreaFunc.
  • circle.h: Định nghĩa cấu trúc Circle tại đây. Một hình tròn nhúng Shape làm thành viên đầu tiên (cho phép áp dụng quy tắc thành viên đầu tiên để ép kiểu lên) và thêm trường radius có kiểu double. Khai báo hàm khởi tạo create_circle, nhận bán kính và trả về một Circle theo giá trị.
  • circle.c: Triển khai các hành vi riêng của hình tròn tại đây:
    • draw_circle: in ra Drawing Circle with radius: X.XX (bán kính hiển thị với 2 chữ số thập phân)
    • area_circle: trả về π × bán kính² (dùng 3.14159 cho π)
    • create_circle: khởi tạo một Circle, gán các con trỏ hàm của Shape được nhúng để trỏ đến draw_circle và area_circle, đặt bán kính rồi trả về hình tròn
  • main.c: Kết hợp mọi thứ. Đọc giá trị bán kính từ đầu vào, tạo hình tròn bằng hàm khởi tạo, sau đó gọi cả draw và area thông qua các con trỏ hàm của Shape được nhúng. In diện tích với 2 chữ số thập phân.

Chương trình sẽ nhận một đầu vào: giá trị bán kính (dưới dạng số thực).

Ví dụ đầu ra khi đầu vào là 5.0:

Drawing Circle with radius: 5.00
Area: 78.54

Ví dụ đầu ra khi đầu vào là 3.5:

Drawing Circle with radius: 3.50
Area: 38.48

Điểm mấu chốt là Circle chứa Shape làm thành viên đầu tiên, vì vậy bạn có thể truy cập các con trỏ hàm thông qua circle.base.draw và circle.base.area (hoặc tên bạn đặt cho thành viên được nhúng). Khi gọi các hàm này, hãy truyền vào con trỏ đến thành viên Shape. Nhớ dùng include guard trong tất cả các tệp tiêu đề.

Tự làm thử

#include <stdio.h>
#include "shape.h"
#include "circle.h"

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: Tạo một Circle bằng create_circle
    
    // TODO: Gọi draw qua con trỏ hàm (function) của Shape được nhúng
    
    // TODO: Gọi area qua con trỏ hàm của Shape được nhúng
    // và in ra với 2 chữ số thập phân: "Area: %.2f\n"
    
    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