المصفوفات

عندما يحتاج البرنامج إلى عدد كبير من المتغيرات، فإن تعريف كل متغير على حدة قد تكون عملية طويلة وتجعل البرنامج غير منظم. لحل هذه المشكلة، يمكننا استخدام المصفوفات (arrays)، والتي تتيح لنا تجميع البيانات ذات العلاقة معًا بطريقة مرتبة.

ما هي المصفوفة

المصفوفة هي عدد ثابت من المتغيرات التي تكون من نفس النوع، يتم تخزينها في الذاكرة بشكل متتابع وتشترك في اسم واحد. تُسمى المتغيرات داخل المصفوفة عناصر (elements).

للتفريق بين العناصر داخل المصفوفة، يتم إعطاء كل عنصر رقم مميز يُعرف باسم الموقع (index).
عندما تحتوي المصفوفة على n عنصرًا، يتم ترقيم هذه العناصر بشكل متتابع من 0 إلى n - 1.

تعريف المصفوفات

لتعريف مصفوفة في لغة C++ نستخدم الصيغة التالية:

type name[size];
العنصر الشرح
type نوع جميع العناصر داخل المصفوفة (مثل int أو double).
name الاسم الذي سنستخدمه للوصول إلى المصفوفة.
size عدد العناصر التي تحتويها المصفوفة.

على سبيل المثال:

int a[4];

هذا التعريف يُنشئ مصفوفة اسمها a[] تتكون من 4 عناصر.

Noteملحوظة

حجم المصفوفة ثابت ولا يمكن تغييره بعد إنشائها.

من الممكن أن لا يكون حجم المصفوفة رقمًا صريحا بل يمكن أن يكون تعبيرًا يُحسب أثناء تنفيذ البرنامج، مما يمكننا من تحديد حجم المصفوفة بناءً على حالة البرنامج أثناء التنفيذ:

int n;
cin >> n;
int a[n + 1]; // n + 1 تنشئ مصفوفة بحجم

تحديد قيم المصفوفة

عند تعريف مصفوفة محليًا، فإن جميع عناصرها لا تحتوي على قيم محددة، أي أن قيمها غير معروفة.
لتحديد قيم المصفوفة فإننا نعطيها قيم ابتدائية، على سبيل المثال نكتب:

int a[4] = {2, 4, 5, 0};

هذا الأمر ينشئ مصفوفة تحتوي على القيم 2، 4، 5، و0.
يمكننا تمثيلها كما في الصورة التالية، حيث تمثل الخلايا عناصر المصفوفة، والأرقام الموجودة تحتها هي المواقع:

إذا أردنا تعريف مصفوفة محليا وجعل جميع عناصرها تبدأ بالقيمة 0، يمكننا كتابة:

int a[2000] = {};

هذا السطر البرجي ينشئ مصفوفة تحتوي على 2000 عنصرًا، كل عنصر فيها يساوي 0.

الوصول إلى العناصر

يمكن الوصول إلى أي عنصر داخل المصفوفة باستخدام الموقع الخاص به، عبر الصيغة التالية:

name[index];
العنصر الشرح
name اسم المصفوفة.
index الموقع الخاص بالعنصر المراد الوصول إليه.

العناصر داخل المصفوفة تتصرف مثل أي متغير عادي. المثال التالي يوضح كيفية التعامل مع عناصر المصفوفة:

#include <iostream>
using namespace std;

int main () {
    int a[5] = {1, 2, 3, 4, 5}; // a[0] القيمة 1 عينت للعنصر
    int x = a[0];               // ب1 x ستصبح قيمة
    a[0]++;                     // ب2 a[0] ستصبح قيمة
    cout << x << endl;          // طباعة 1
    cout << a[0] << endl;       // طباعة 2
}

البرنامج أعلاه يوضح أن عناصر المصفوفة يمكن قراءتها أو تعديلها بسهولة كما هو الحال مع أي متغير.

أمثلة على استخدام المصفوفات

التكرار عبر المصفوفة (يمكن تغيير كلمة تكرار)

يمكننا استخدام حلقات للتكرار عبر جميع عناصر المصفوفة بالتكرار عبر مواقعها (من 0 إلى حجم المصفوفة - 1).
على سبيل المثال، إذا أردنا حساب مجموع جميع عناصر لمصفوفة، يمكننا كتابة:

#include <iostream>
using namespace std;

int main () {
    int n;
    cin >> n;                    // يدخل حجم المصفوفة
    
    int a[n];                    // n تعريف مصفوفة بحجم
    for(int i = 0; i < n; i++) { // n - 1 التكرار عبر الرقام من 0 إلي 
        cin >> a[i];             // a[i] سندخل قيمة ،i لكل موقع
    }

    int sum = 0;
    for (int i = 0 ; i < n ; i++) {
        sum += a[i];            // sum للمتغير  a[i] سنضيف قيمة ،i لكل موقع
    }
    cout << sum << endl;
}

في هذا المثال: ندخل عدد العناصر n من المستخدم. ثم ننشئ مصفوفة a بحجم n. ونستخدم حلقة لإدخال قيم المصفوفة. ثم نستخدم حلقة أخرى لحساب المجموع الكلي للعناصر وطباعة النتيجة.

المصفوفات متعددة الأبعاد

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

انظر إلى المثال التالي:

#include <iostream>
using namespace std;

int main () {
  int a[5];
  int b[5][4];
}

في هذا البرنامج:

العنصر الشرح
a مصفوفة أحادية الأبعاد تحتوي على 5 أعداد صحيحة.
b مصفوفة ثنائية الأبعاد، تتكون من 5 مصفوفات، تحتوي كل مصفوفة على 4 أعداد صحيحة.
Noteملحوظة

a[0] تمثل عددًا صحيحًا، بينما b[0] تمثل مصفوفة من أربعة أعداد صحيحة.

للوصول إلى عنصر داخل مصفوفة متعددة الأبعاد، يجب تحديد الموقع في كل بُعد:
على سبيل المثال، للوصول إلى عنصر في a نكتب a[i]،
أما للوصول إلى عنصر في b فنكتب b[i][j].

إذا قمنا بتعبئة المصفوفة b ببعض القيم، يمكننا تمثيلها كما في الشكل التالي:

في هذا التمثيل: - b[0] هي مصفوفة من أربعة أعداد صحيحة. - b[2][1] هو العنصر الذي يحمل القيمة 14.

عدد الخلايا الكلي في المصفوفة متعددة الأبعاد يساوي حاصل ضرب أطوال جميع الأبعاد.
في مثالنا السابق، تحتوي b على 5 * 4 = 20 عنصرًا.

يمكن أن تحتوي المصفوفة على أكثر من بعدين، بل ويمكن أن تكون ذات سبعة أبعاد أو أكثر.
على سبيل المثال، المصفوفة التالية تحتوي على سبعة أبعاد:

int c[4][6][7][54][32][2][7];