أساسيات البرمجة للمبتدئين بالعربية مع تمارين عملية

المصفوفات الثنائية في البرمجة

مفهوم المصفوفات الثنائية المصفوفة الثنائية ( Two Dimensional Array ) عبارة عن سلسلة من العقد و كل عقدة منهم بداخلها سلسلة من العناصر. في العادة يتم رسم...
وقت الدراسة
23 دقيقة

المسار: أساسيات البرمجة الوحدة: المصفوفات في أساسيات البرمجة

مدخل إلى الدرس: المصفوفات الثنائية في البرمجة

مفهوم المصفوفات الثنائية المصفوفة الثنائية ( Two Dimensional Array ) عبارة عن سلسلة من العقد و كل عقدة منهم بداخلها سلسلة من العناصر. في العادة يتم رسم...

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

مفهوم المصفوفات الثنائية

المصفوفة الثنائية ( Two Dimensional Array ) عبارة عن سلسلة من العقد و كل عقدة منهم بداخلها سلسلة من العناصر. في العادة يتم رسم المصفوفة الثنائية كجدول يتألف من أسطر و أعمدة ليكون التعامل معها أكثر سهولة.


الرسم بأسلوب العُقد

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

رسم المصفوفة الثنائية بشكل هرمي


الرسم بأسلوب الجدول

يمكنك رسم المصفوفة السابقة كجدول يتألف من سطرين و كل سطر فيه ثلاث خانات كما يلي.

رسم المصفوفة الثنائية كجدول


أغلب المبرمجين يفضلون رسم المصفوفة بأسلوب الجدول لأنه أكثر سهولة و لكن يمكنك استخدام أي أسلوب تريده لأن الفكرة هي نفسها تماماً.


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

تعريف مصفوفة ثنائية

هناك طريقتين أساسيتين لتعريف المصفوفات:

  • تعريف المصفوفة مع تحديد عدد العقد (الأسطر) و عدد العناصر (الأعمدة) المراد تخزينها في كل عقدة و هذا الأمر نفعله بواسطة الدالة array().
  • تعريف المصفوفة و تمرير القيم التي تريد تخزينها في كل عقدة فيها بشكل مباشر.

إنشاء مصفوفة ثنائية بواسطة الدالة array()

لإنشاء مصفوفة ثنائية بواسطة الدالة array() يجب أن تحدد عدد أسطرها و عدد العناصر التي تريد وضعها في كل سطر بين أقواسها، و كذلك يجب أن تضعها في متغير لكي تستطيع التعامل معها لاحقاً.

مثال

var a = array(2, 3);

إذاً المصفوفة a تحتوي سطرين و كل سطر فيه ثلاث أعمدة كما يلي.

تعريف مصفوفة ثنائية فارغة

إنشاء مصفوفة ثنائية و إعطاءها قيم أولية

يمكنك إنشاء مصفوفة ثنائية و تمرير قيم لها بواسطة الرمز [] نفسه الذي تستخدمه لإنشاء مصفوفات أحادية.

مثال

يمكنك تعريفها كالتالي ليكون التعامل معها سهل عليك.

var a = [
    [1, 2, 3],   // ضروري وضع فاصلة بين الأسطر
    [4, 5, 6]
];

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

var a = [  [1, 2, 3], [4, 5, 6] ];

إذاً المصفوفة a تحتوي سطرين و كل سطر فيه 3 خانات كما يلي.

تعريف مصفوفة ثنائية فيها قيم

قاعدة مهمة

محتوى المصفوفة يجب أن يوضع بداخل [] و كل سطر في المصفوفة يجب أن يوضع بداخل [] كما رأينا في المثال السابق.

و يجب وضع فاصلة بين القيم الموجودة في ذات السطر و كذلك يجب وضع فاصلة بين الرموز التي تفصل كل سطر عن الآخر.

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

عرض قيم المصفوفة الثنائية

لعرض جميع القيم التي تحتويها المصفوفة بشكل سهل في محرر هرمش، يمكنك تمرير إسم المصفوفة للدالة write() و هي ستعرض لك قيمها.

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6]
];

write(a);

النتيجة

[[1, 2, 3], [4, 5, 6]]

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.


في حال كان العنصر فارغ، بمعنى أنه لا يوجد فيه أي قيمة و حاولت طباعة قيمته سيظهر لك أن قيمته undefined للإشارة إلى أنه بالأساس لا يحتوي أي شيء.


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

مثال

var a = array(2, 3);
write(a);

النتيجة

[[undefined, undefined, undefined], [undefined, undefined, undefined]]

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.


عرض قيمة عنصر محدد

لعرض قيمة عنصر محدد في المصفوفة عليك تحديد رقم السطر الموجود و رقم الخانة الموجود فيهما. فعلى سبيل المثال إن كانت المصفوفة إسمها a و تريد عرض قيمة العنصر الموجود في السطر الأول في الخانة الثالثة فيجب أن تكتب a[0][2] للوصول إليه كما يلي.

الوصول لقيم عناصر المصفوفة الثنائية


فيما يلي قمنا بطباعة قيم العناصر الموجودة في كل سطر من خلال تحديد رقم السطر و رقم الخانة الموجود فيها العنصر.

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6]
];

// هنا قمنا بعرض قيم عناصر السطر الأول
write("a[0][0] = " + a[0][0] + "\n");
write("a[0][1] = " + a[0][1] + "\n");
write("a[0][2] = " + a[0][2] + "\n");

// هنا قمنا بعرض قيم عناصر السطر الثاني
write("a[1][0] = " + a[1][0] + "\n");
write("a[1][1] = " + a[1][1] + "\n");
write("a[1][2] = " + a[1][2] + "\n");

النتيجة

a[0][0] = 1
a[0][1] = 2
a[0][2] = 3
a[1][0] = 4
a[1][1] = 5
a[1][2] = 6

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.


عرض كل القيم الموجودة في سطر محدد

في محرر هرمش يمكنك عرض كل القيم الموجود في سطر محدد من خلال تحديد رقم السطر فقط.

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6]
];

// هنا قمنا بعرض قيم السطر الأول
write("a[0] = " + a[0] + "\n");

// هنا قمنا بعرض قيم السطر الثاني
write("a[1] = " + a[1]);

النتيجة

a[0] = [1, 2, 3]
a[1] = [4, 5, 6]

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.

تغيير قيم عناصر المصفوفة الثنائية

يمكنك تغيير قيمة أي عنصر في المصفوفة من خلال رقم الفهرس الخاص به و الذي يتكون من رقم السطر و الخانة الموجود فيهما كالتالي.

مثال

var a = array(2, 3);

write("Before a = " + a);

a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;
a[1][0] = 4;
a[1][1] = 5;
a[1][2] = 6;

write("\nAfter a = " + a);

النتيجة

Before a = [[undefined, undefined, undefined], [undefined, undefined, undefined]]
After a = [[1, 2, 3], [4, 5, 6]]

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.

الحصول على عدد أسطر و عناصر المصفوفة الثنائية

الخاصيّة length في المصفوفات الثنائية يمكن من خلالها معرفة عدد الأسطر الموجودة فيها و كذلك يمكن من خلالها معرفة عدد العناصر الموجودة في كل سطر.


الحصول على عدد الأسطر

لمعرفة عدد العُقد أو عدد الأسطر في المصفوفة الموجودة في المصفوفة الثنائية قم بطباعة قيمة الخاصية length بشكل مباشر من إسم المصفوفة.

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6]
];

write("Number of rows is " + a.length);

النتيجة

Number of rows is 2

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.


الحصول على عدد العناصر الموجودة في السطر

لمعرفة عدد العناصر أو الخانات الموجودة في كل سطر في المصفوفة قم بطباعة قيمة الخاصية length بشكل مباشر من رقم السطر في المصفوفة.

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6]
];

write("Number of elements in a[0] = " + a[0].length + "\n");
write("Number of elements in a[1] = " + a[1].length);

النتيجة

Number of elements in a[0] is 3
Number of elements in a[1] is 3

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.


حساب إجمالي عدد عناصر المصفوفة

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

إذا كان شكل المصفوفة يشبه المربع (أي عدد العناصر في كل سطر يساوي إجمالي عدد الأسطر) فإجمالي عدد العناصر يمكن حسابه كما في الصورة التالية.

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

var totalElements = a.length * a.length;

write("Total number of elements = " + totalElements);

النتيجة

Total number of elements = 9

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.


إذا كان شكل المصفوفة يشبه المستطيل (أي عدد العناصر في كل سطر متساوي) فإجمالي عدد العناصر يمكن حسابه كما في الصورة التالية.

حساب عدد عناصر المصفوفة الثنائية المربعة الشكل

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6]
];

var totalElements = a.length * a[0].length;

write("Total number of elements = " + totalElements);

النتيجة

Total number of elements = 6

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.


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

حساب عدد عناصر المصفوفة الثنائية المستطيلة الشكل

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14]
];

var totalElements = 0;

for (var i=0; i<a.length; i++)
{
    totalElements = totalElements + a[i].length;
}

write("Total number of elements = " + totalElements);

النتيجة

Total number of elements = 14

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.

التعامل مع المصفوفة الثنائية بواسطة حلقة

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

الأسلوب التالي في كتابة الحلقات يسمح لك بالمرور على جميع عناصر المصفوفة مهما كان شكلها (مربعة، مستطيلة، عدد عناصرها يختلف من سطر لآخر) و سيمر معك كثيراً في التمارين.

نريد منك أن تلاحظ فقط كيف أننا اعتمدنا على قيمة a.length لجعل الحلقة i تبدأ من 0 و تتوقف عند رقم السطر الأخير، و كيف أننا اعتمدنا على قيمة a[i].length لجعل الحلقة j تبدأ من 0 و تتوقف عند الخانة الأخيرة في كل سطر.

مثال

var a = [
    [1, 2, 3],
    [4, 5, 6]
];

for (var i=0; i<a.length; i++)
{
    for (var j=0; j<a[i].length; j++)
    {
        write(a[i][j] + "   ");
    }

    write("\n");
}

النتيجة

1   2   3  
4   5   6

تمرين: انسخ المثال وجرّبه بنفسك، ثم عدّل القيم ولاحظ النتيجة.

تمرين تطبيقي: أعد كتابة المثال بنفسك، غيّر قيمة واحدة، وتوقع الناتج قبل التنفيذ.

تمارين شاملة حول المصفوفات الثنائية


التمرين الأول

  1. أكتب برنامج يطلب من المستخدم إعطائه عددين أكبر من صفر, العدد الأول يمثل عدد أسطر مصفوفة ثنائية إسمها matrix و العدد الثاني يمثل عدد أعمدتها. خزّن العدد الأول في متغير إسمه rows و العدد الثاني في متغير إسمه cols.
  2. ثم ينشئ المصفوفة matrix و يحدد أن عدد أسطرها يساوي rows و عدد أعمدتها يساوي cols.
  3. ثم يطلب من المستخدم إدخال قيمة لكل عنصر من عناصر المصفوفة matrix.
  4. ثم يعرض له جميع قيم عناصر المصفوفة matrix.

الحل و التفسير


التمرين الثاني

  1. أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة.
  2. ثم يطلب من المستخدم إدخال قيم في جميع عناصرها.
  3. ثم يعرض للمستخدم ناتج جمع جميع قيم عناصرها.

الحل و التفسير


التمرين الثالث

  1. أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة.
  2. ثم يطلب من المستخدم إدخال قيم في جميع عناصرها.
  3. ثم يعرض للمستخدم ناتج جمع قيم العناصر الموجودة في كل سطر فيها.

الحل و التفسير


التمرين الرابع

  1. أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة.
  2. ثم يطلب من المستخدم إدخال قيم في جميع عناصرها.
  3. ثم يعرض للمستخدم ناتج جمع قيم العناصر الموجودة في كل عمود فيها.

الحل و التفسير


التمرين الخامس

  1. أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة.
  2. ثم يقوم بتخزين جميع القيم الموجودة في المصفوفة matrix بداخل مصفوفة أحادية إسمها vector.
  3. ثم يعرض للمستخدم جميع القيم التي أصبحت تحتويها المصفوفة matrix.
  4. في النهاية يعرض للمستخدم جميع القيم التي أصبحت تحتويها المصفوفة vector على نفس السطر.

الحل و التفسير


التمرين السادس

  1. أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة.
  2. بعدها يقوم بجمع قيم جميع العناصر الموجودة على القطر (On diagonal)، فوق القطر (Above diagonal)، و تحت القطر (Under diagonal).
  3. في الأخير يعرض للمستخدم ناتج الجمع.

الحل و التفسير


التمرين السابع

  1. أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة.
  2. ثم يطلب من المستخدم إدخال أي عدد و العدد الذي يدخله يخزنه في متغير إسمه keyword.
  3. بعدها يشيّك على جميع عناصر المصفوفة ليرى كم مرة قيمة keyword موجودة فيها.
  4. في النهاية يعرض للمستخدم ناتج عملية البحث، أي كم مرة وجد نفس قيمة المتغير keyword في المصفوفة matrix.

الحل و التفسير


التمرين الثامن

  1. أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة.
  2. ثم يطلب من المستخدم إدخال أي عدد و العدد الذي يدخله يخزنه في متغير إسمه keyword.
  3. بعدها يبحث في المصفوفة عن العدد الذي أدخله المستخدم ليرى إن كان هذا العدد موجوداً فيها أم لا.
    إنتبه: يكفي أن يكون العدد موجوداً مرة واحدة في المصفوفة و بالتالي عملية البحث يجب أن تتوقف بمجرد إيجاد تطابق.
  4. في الأخير يعرض للمستخدم ناتج عملية البحث، أي إذا وجد نفس قيمة المتغير keyword في المصفوفة matrix أم لا.

الحل و التفسير


التمرين التاسع

  1. أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة.
  2. بعدها يقوم بجمع قيم العناصر الموجودة في كل سطر و يخزن ناتج الجمع في مصفوفة أحادية إسمها vector.
  3. في النهاية يعرض للمستخدم جميع القيم التي أصبحت تحتويها المصفوفة matrix و المصفوفة vector.

الحل و التفسير

مراجعة وتمرين تثبيت المهارة

اختبار سريع: اشرح بعبارتك معنى «المصفوفات الثنائية في البرمجة»، ثم بيّن أين ستستخدمه داخل برنامج صغير لحل مشكلة يومية مع مدخلات ونتائج يمكن التحقق منها، وما الخطأ الذي يجب اختباره قبل الاعتماد على الحل.

تحدٍّ إضافي: غيّر شرطًا واحدًا في التطبيق، وتوقع النتيجة، ثم نفّذ الاختبار وفسّر الاختلاف.

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

دروس نصية

#1

تعلم أساسيات البرمجة

#2

دالة الطباعة في البرمجة

#3

المتغيرات في البرمجة

#4

العوامل في البرمجة

#5

حلقات التكرار في البرمجة

#6

المصفوفات و أنواعها في البرمجة

#7

تعريف دوال جديدة في البرمجة

#8

محرر الكود للمبتدئين في البرمجة

#9

دمج البيانات في أساسيات البرمجة

#10

أنواع البيانات في البرمجة

#11

جمل الشرط في البرمجة

#12

الحلقة for في البرمجة

#13

المصفوفات الأحادية في البرمجة

#14

الإستدعاء الذاتي في البرمجة

#15

محلل الكود للمبتدئين في البرمجة

#16

أحرف الهروب في البرمجة

#17

دالة الإدخال في البرمجة

#18

الشروط المتداخلة في البرمجة

#19

الحلقة while في البرمجة

#20

المصفوفات الثنائية في البرمجة

#21

كتابة كود أقل في البرمجة

#22

التحقق من أنواع القيم في البرمجة

#23

الحلقة do while في البرمجة

#24

المصفوفات الثلاثية في البرمجة

#25

الخطوة التالية بعد تعلم أساسيات البرمجة

#26

الحلقات المتداخلة في البرمجة

#27

العمليات الحسابية المتسلسلة في البرمجة

#28

حساب قيمة العاملي للعدد في البرمجة

#29

حساب المضاعف للعدد في البرمجة

عرض الدروس كاملة تحقق من صفحة تعلم الدورة
درس نصي 3/29
أنت تشاهد
المصفوفات الثنائية في البرمجة