C++: أساسيات المصفوفات

آخر تحديث: 2026-08-26

في الدروس الساببة، كان كل متغير يستطيع تخزين قيمة واحدة فقط.

لكن إذا كنت تحتاج لتخزين 100 نتيجة طالب، لا يمكنك تعريف 100 متغير، أليس كذلك؟

المصفوفات تحل هذه المشكلة — كتلة ذاكرة متجاورة تستخدم لتخزين قيم متعددة من نفس النوع.



1. ما هي المصفوفة؟

(1) 1.1 المصفوفات في الحياة اليومية

تشبيه من الحياة المقابل البرمجي
صف صناديق بريد (كل واحد برقم مختلف) مصفوفة (كل عنصر له فهرس مختلف)
كرتون بيض (12 بيضة، مرقمة 1-12) مصفوفة (12 عنصر، فهارس 0-11)

خصائص المصفوفات:

  1. جميع العناصر من نفس النوع (جميعها int، أو جميعها double)
  2. ذاكرة متجاورة (العناصر مخزنة واحدة بعد الأخرى)
  3. الفهارس تبدأ من 0 (ليس من 1!)

(2) 1.2 لماذا نحتاج المصفوفات؟

بدون مصفوفات (مثال سيئ):

▶ مثال 2: تطبيق برمجي أساسي (صعوبة ⭐)

CPP
#include <iostream>

int main() {
 int score1 = 90;
 int score2 = 85;
 int score3 = 92;
 // ... need to declare 100 variables!

 return 0;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
(Program output)

بالمصفوفات (مثال جيد):

CPP
#include <iostream>

int main() {
 int scores[100]; // array that can hold 100 integers

 // use loop to assign values
 for (int i = 0; i < 100; i++) {
 scores[i] = 0;
 }
 
 return 0;
}


2. تعريف المصفوفة وتهيئتها

(1) 2.1 تعريف مصفوفة

الصياغة:

TEXT 📖 للعرض فقط
Type arrayName[Number of elements];

مثال:

CPP
int scores[5]; // array that can hold 5 integers
double prices[10]; // array that can hold 10 doubles
char letters[26]; // array that can hold 26 chars

💡 نقطة مهمة: فهارس المصفوفة تبدأ من 0، لذا scores[5] لها فهارس من 0 إلى 4 (ليس 1 إلى 5).

(2) 2.2 تهيئة مصفوفة

الطريقة 1: التهيئة عند التعريف

TEXT 📖 للعرض فقط
int scores[5] = {90, 85, 92, 78, 88};

الطريقة 2: تهيئة جزئية

CPP
int scores[5] = {90, 85}; // only initialize first two, rest become 0 automatically

الطريقة 3: دع المترجم يستنتج الحجم

CPP
int scores[] = {90, 85, 92, 78, 88}; // compiler infers size as 5

💡 نصيحة: الطريقة 3 موصى بها — إذا غيّرت محتوى المصفوفة لاحقًا، لا تحتاج لتحديث الحجم يدويًا.



3. الوصول إلى عناصر المصفوفة

(1) 3.1 قراءة العناصر

الصياغة:

TEXT 📖 للعرض فقط
arrayName[Index]

مثال:

CPP
#include <iostream>

int main() {
 int scores[5] = {90, 85, 92, 78, 88};
 
 std::cout << "First score: " << scores[0] << std::endl; // 90
 std::cout << "Third score: " << scores[2] << std::endl; // 92
 std::cout << "Last score: " << scores[4] << std::endl; // 88
 
 return 0;
}

(2) 3.2 تعديل العناصر

CPP
#include <iostream>

int main() {
 int scores[5] = {90, 85, 92, 78, 88};
 
 scores[1] = 95; // change second score to 95
 std::cout << "Modified second score: " << scores[1] << std::endl; // 95
 
 return 0;
}


4. اجتياز مصفوفة

(1) 4.1 الاجتياز بحلقة for

CPP
#include <iostream>

int main() {
 int scores[5] = {90, 85, 92, 78, 88};
 
 std::cout << "All scores: " << std::endl;
 for (int i = 0; i < 5; i++) {
 std::cout << "No. " << i + 1 << " Score: " << scores[i] << std::endl;
 }
 
 return 0;
}

💡 نقطة مهمة: عند اجتياز مصفوفة، شرط الحلقة عادةً i < array_size، بدلًا من i <= array_size - 1 (الأول أقل عرضة للخطأ).



5. حجم المصفوفة

(1) 5.1 حساب عدد العناصر بـ sizeof

CPP
#include <iostream>

int main() {
 int scores[5] = {90, 85, 92, 78, 88};
 
 int size = sizeof(scores) / sizeof(scores[0]); // calculate array size
 std::cout << "Array size:" << size << std::endl; // 5
 
 return 0;
}

كيف تعمل:

💡 نصيحة: هذه الطريقة تعمل فقط مع المصفوفات الفعلية، وليس المؤشرات (ستُغطى لاحقًا).



6. المصفوفات كمعلمات دالة

(1) 6.1 المشكلة: المصفوفات تتحول إلى مؤشرات

عند تمرير مصفوفة إلى دالة، تتحول إلى مؤشر (تفقد معلومات الحجم).

CPP
#include <iostream>

// array as parameter, need to pass size
void printArray(int arr, int size) {
 for (int i = 0; i < size; i++) {
 std::cout << arr[i] << " ";
 }
 std::cout << std::endl;
}

int main() {
 int scores[5] = {90, 85, 92, 78, 88};
 printArray(scores, 5); // pass array name (which is address of first element)
 return 0;
}

💡 نقطة مهمة: عند تمرير مصفوفة كمعلمة، يجب تمرير الحجم أيضًا.



7. الأخطاء الشائعة

(1) 7.1 خروج المصفوفة عن الحدود

مثال خطأ:

CPP
#include <iostream>

int main() {
 int scores[5] = {90, 85, 92, 78, 88};
 
 std::cout << scores[5] << std::endl; // ERROR: out of bounds! max index is 4
 
 return 0;
}

العاقبة: قراءة قيم عشوائية، أو انهيار البرنامج.

💡 نصيحة: C++ لا تتحقق تلقائيًا من حدود المصفوفة! هذا أحد أسباب سرعة C++، لكنه أيضًا مصدر شائع للأخطاء.

(2) 7.2 استخدام متغير كحجم مصفوفة (قبل C++11)

مثال خطأ (قبل C++11):

CPP
#include <iostream>

int main() {
 int n = 5;
 int scores[n]; // ERROR (before C++11): array size must be compile-time constant
 
 return 0;
}

الطريقة الصحيحة (مدعومة بعد C++11):

CPP
#include <iostream>

int main() {
 int n = 5;
 int scores[n]; // OK (after C++11): Variable Length Array (VLA) supported
 
 return 0;
}

💡 نهج أفضل: استخدم std::vector (ستُغطى لاحقًا)، الذي يدعم الأحجام الديناميكية.



8. تطبيق: حساب المعدل

▶ مثال 1: حساب المعدل (صعوبة ⭐⭐)

CPP
#include <iostream>
#include <iomanip>

int main() {
 int scores[5] = {90, 85, 92, 78, 88};
 int sum = 0;
 
 // calculate total score
 for (int i = 0; i < 5; i++) {
 sum += scores[i];
 }

 // calculate average score
 double average = static_cast<double>(sum) / 5;
 
 std::cout << std::fixed << std::setprecision(2);
 std::cout << "Total: " << sum << std::endl;
 std::cout << "Average: " << average << std::endl;
 
 return 0;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Total: 433
Average: 86.60

❓ أسئلة شائعة

س كيف أُهيئ جميع عناصر المصفوفة إلى 0؟
ج > > int scores[100] = {0}; // Method 1: Partial initialization(remaining auto-fill with 0) > > int scores[100]; > for (int i = 0; i < 100; i++) { > scores[i] = 0; // Method 2: Assign with loop > } >

▶ مثال 3: اجتياز المصفوفة (صعوبة ⭐)

CPP
#include <iostream>

int main() {
    int scores[] = {85, 92, 78, 90, 88};
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        sum += scores[i];
    }

    double avg = sum / 5.0;
    std::cout << "Average: " << avg << std::endl;

    return 0;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Average: 86.6
💡 نصيحة: المصفوفات يمكن تهيئتها بـ {}، وعدد العناصر يمكن حسابه باستخدام sizeof(arr) / sizeof(arr[0]).


📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): عرّف مصفوفة double لتخزين 5 أسعار، ثم استخدم حلقة لحساب السعر الإجمالي.

  2. متوسط (صعوبة ⭐⭐): اكتب دالة int findMax(int arr, int size) تجد القيمة القصوى في مصفوفة. اختبرها في main.

  3. تحدي (صعوبة ⭐⭐⭐): اكتب برنامجًا يتيح للمستخدم إدخال 10 أعداد صحيحة، يخزنها في مصفوفة، ثم:

  4. يجد القيمتين الصغرى والعظمى

  5. يحسب المعدل

  6. يُخرج جميع النتائج فوق المعدل


9. 🚀 الخطوة التالية

الآن بعد أن تعلمت أساسيات المصفوفات، لنتابع إلى المصفوفات متعددة الأبعاد (الدرس 17) — التعامل مع البيانات الجدولية (مثل المصفوفات، لوحات الألعاب).

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%