Menu
CoddyTech

Phương thức hỗ trợ

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

Đến giờ, chúng ta đã thấy các hàm sửa đổi dữ liệu struct (như player_take_damage) và các hàm chỉ hiển thị dữ liệu. Nhưng còn một loại hàm quan trọng khác: các hàm tính toán giá trị suy ra từ các thành viên của struct mà không thay đổi gì.

Xét một struct Rectangle lưu chiều rộng và chiều cao. Diện tích không được lưu lại mà được tính khi cần:

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

Đây là các phương thức hỗ trợ. Chúng lấy dữ liệu hiện có của struct và tạo ra một giá trị mới. Lưu ý rằng chúng dùng con trỏ const vì chỉ đọc, không ghi. Kết quả tính được sẽ được trả về thay vì lưu trong struct.

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

Mẫu này giúp các struct gọn nhẹ: chỉ lưu dữ liệu thiết yếu, còn mọi thứ khác thì tính khi cần. Mẫu này cũng đảm bảo các giá trị suy ra luôn nhất quán với trạng thái hiện tại.

challenge icon

Thử thách

Dễ

Hãy xây dựng một module Circle để tính các giá trị dẫn xuất từ dữ liệu đã lưu. Bạn sẽ luyện viết các phương thức hỗ trợ: những hàm tính kết quả từ các thành viên của struct mà không sửa đổi chúng.

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

  • circle.h: Khai báo một struct Circle có một thành viên double radius. Đồng thời khai báo hai phương thức hỗ trợ:
    • circle_area: nhận một con trỏ const đến Circle và trả về diện tích
    • circle_circumference: nhận một con trỏ const đến Circle và trả về chu vi
    Dùng include guard với ký hiệu CIRCLE_H.
  • circle.c: Triển khai cả hai phương thức hỗ trợ. Khi tính toán, dùng 3.14159 làm giá trị của pi. Công thức tính diện tích là pi * radius * radius, còn công thức tính chu vi là 2 * pi * radius. Cả hai hàm chỉ nên đọc radius, không bao giờ sửa đổi giá trị này.
  • main.c: Tạo một Circle và dùng các phương thức hỗ trợ để tính, rồi hiển thị các thuộc tính của nó.

Bạn sẽ nhận một đầu vào: bán kính của hình tròn (dưới dạng double).

Trong tệp main, khởi tạo một Circle với bán kính đã cho, sau đó dùng các phương thức hỗ trợ để tính và in ra diện tích cùng chu vi.

In kết quả theo định dạng sau:

Area: {area}
Circumference: {circumference}

Dùng %.2f cho cả hai giá trị để hiển thị hai chữ số thập phân.

Ví dụ, với bán kính 5.0, kết quả sẽ là:

Area: 78.54
Circumference: 31.42

Tự làm thử

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

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: Tạo một struct Circle với bán kính đã cho
    
    // TODO: Dùng các phương thức hỗ trợ circle_area và circle_circumference
    // để tính toán và in ra kết quả
    
    // Định dạng in ra:
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\n", ...);
    
    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

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