الدوال Functions — أساسيات C++
الدوال (Functions)
الدالة كتلة كود لها اسم، تقسّم البرنامج إلى أجزاء صغيرة واضحة يمكن إعادة استخدامها واختبارها.
البنية
double average(int a, int b) { // نوع القيمة المرجعة، الاسم، المعاملات
return (a + b) / 2.0;
}- نوع القيمة المرجعة إلزامي؛ void تعني لا ترجع شيئاً.
- لكل معامل نوع.
- دالة غير void يجب أن ترجع قيمة في كل المسارات، وإلا فالنتيجة غير معرّفة.
يجب أن تُعرف الدالة قبل استدعائها
المترجم يقرأ الملف من الأعلى. إذا استدعيت دالة معرّفة أسفل main، اكتب تصريحها (prototype) أولاً:
#include <iostream>
using namespace std;
int add(int a, int b); // تصريح
int main() {
cout << add(2, 3);
}
int add(int a, int b) { // تعريف
return a + b;
}في المشاريع الكبيرة توضع التصريحات في ملفات .h والتعريفات في .cpp.
التمرير بالقيمة (الافتراضي)
void tryChange(int x) {
x = 100; // يعدّل نسخة فقط
}الدالة تستلم نسخة؛ المتغير الأصلي لا يتغير. (التمرير بالمرجع لتعديل الأصل هو موضوع الدرس التالي.)
القيم الافتراضية
void greet(string name = "ضيف") — توضع القيم الافتراضية في التصريح إن وُجد، ومن اليمين إلى اليسار.
التحميل الزائد (Overloading)
عدة دوال بنفس الاسم ومعاملات مختلفة:
int multiply(int a, int b);
double multiply(double a, double b);المترجم يختار الدالة حسب أنواع الوسائط.
النطاق
المتغيرات داخل الدالة محلية لها. تجنب المتغيرات العامة القابلة للتعديل؛ مرّر ما تحتاجه كمعاملات وأرجع النتيجة.
تمرين
اكتب دوال: isPrime(int n) ترجع bool، و maxOf(int a, int b, int c)، و printLine(char ch = '-', int length = 20)، واستخدمها من main مع تصريحات قبلها.
#include <iostream>
#include <string>
using namespace std;
// Function prototypes
void greet();
int add(int a, int b);
void modifyByRef(int& x);
double average(int arr[], int size);
int main() {
// استدعاء دالة بدون معاملات
greet();
// دالة بمعاملات وقيمة مرجعة
int result = add(5, 3);
cout << "5 + 3 = " << result << endl;
// By Reference
int num = 10;
cout << "قبل: " << num << endl;
modifyByRef(num);
cout << "بعد: " << num << endl;
// دالة مع مصفوفة
int numbers[] = {10, 20, 30, 40, 50};
cout << "المتوسط: " << average(numbers, 5) << endl;
return 0;
}
// تعريف الدوال
void greet() {
cout << "مرحباً!" << endl;
}
int add(int a, int b) {
return a + b;
}
void modifyByRef(int& x) {
x *= 2; // يعدل المتغير الأصلي
}
double average(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return (double)sum / size;
}
// دالة بقيمة افتراضية
void greetPerson(string name = "ضيف") {
cout << "مرحباً " << name << "!" << endl;
}
// Function Overloading
int multiply(int a, int b) {
return a * b;
}
double multiply(double a, double b) {
return a * b;
}
// Inline function (للدوال القصيرة)
inline int square(int x) {
return x * x;
}اختبر فهمك