Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الأساليب المساعدة

جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 10 من 61.

حتى الآن، رأينا دوالاً تقوم بتعديل بيانات الـ struct (مثل player_take_damage) ودوالاً تقوم ببساطة بعرضها. ولكن هناك فئة مهمة أخرى: وهي الدوال التي تحسب قيماً مشتقة من أعضاء الـ struct دون تغيير أي شيء.

لنفترض وجود Rectangle struct يخزن العرض والارتفاع. لا يتم تخزين المساحة — بل يتم حسابها عند الطلب:

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);
}

هذه هي دوال مساعدة—فهي تأخذ بيانات الـ struct الحالية وتنتج قيمة جديدة. لاحظ أنها تستخدم مؤشرات const لأنها تقرأ فقط، ولا تكتب أبداً. يتم إرجاع النتيجة المحسوبة بدلاً من تخزينها في الـ 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

يحافظ هذا النمط على بساطة الـ structs الخاصة بك—قم بتخزين البيانات الأساسية فقط، وقم بحساب كل شيء آخر عند الحاجة. كما يضمن أيضاً أن القيم المشتقة متسقة دائماً مع الحالة الحالية.

challenge icon

التحدي

سهل

لنقم ببناء وحدة Circle تقوم بحساب القيم المشتقة من البيانات المخزنة. ستتدرب على كتابة الدوال المساعدة (helper methods)—وهي دوال تحسب النتائج من أعضاء الـ struct دون تعديلها.

ستقوم بإنشاء ثلاثة ملفات:

  • circle.h: قم بالتصريح عن struct باسم Circle يحتوي على عضو واحد من نوع double باسم radius. قم أيضاً بالتصريح عن دالتين مساعدتين:
    • circle_area — تأخذ مؤشراً من نوع const إلى Circle وتعيد المساحة.
    • circle_circumference — تأخذ مؤشراً من نوع const إلى Circle وتعيد المحيط.
    استخدم حواجز التضمين (include guards) مع الرمز CIRCLE_H.
  • circle.c: قم بتنفيذ كلتا الدالتين المساعدتين. بالنسبة للحسابات، استخدم 3.14159 كقيمة لـ pi. صيغة المساحة هي pi * radius * radius، وصيغة المحيط هي 2 * pi * radius. يجب على كلتا الدالتين قراءة نصف القطر فقط—ولا تقوما بتعديله أبداً.
  • main.c: قم بإنشاء Circle واستخدم الدوال المساعدة لحساب وخصائصه وعرضها.

ستتلقى مدخلاً واحداً: radius (نصف قطر) الدائرة (كـ double).

في ملفك الرئيسي، قم بتهيئة Circle بنصف القطر المعطى، ثم استخدم دوالك المساعدة لحساب وطباعة المساحة والمحيط.

اطبع النتائج بهذا التنسيق:

Area: {area}
Circumference: {circumference}

استخدم %.2f لكلا القيمتين لعرض منزلتين عشريتين.

على سبيل المثال، مع نصف قطر قيمته 5.0، سيكون الناتج:

Area: 78.54
Circumference: 31.42

ورقة مرجعية

يمكن للدوال حساب القيم المشتقة من أعضاء الـ struct دون تعديل الـ struct. وتسمى هذه طرقاً مساعدة (helper methods).

تستخدم الطرق المساعدة مؤشرات const لأنها تقرأ البيانات فقط ولا تكتبها أبداً:

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);
}

استخدام الطرق المساعدة:

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

يحافظ هذا النمط على رشاقة الـ structs من خلال تخزين البيانات الأساسية فقط وحساب القيم المشتقة عند الطلب، مما يضمن الاتساق مع الحالة الحالية.

جرّب بنفسك

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

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: قم بإنشاء هيكل Circle بنصف القطر المعطى
    
    // TODO: استخدم الدوال المساعدة circle_area و circle_circumference
    // لحساب وطباعة النتائج
    
    // تنسيق الطباعة:
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\n", ...);
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming