Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

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

  • مفهوم المصفوفات الثنائية
  • تعريف مصفوفة ثنائية
  • عرض قيم المصفوفة الثنائية
  • تغيير قيم عناصر المصفوفة الثنائية
  • الحصول على عدد أسطر و عناصر المصفوفة الثنائية
  • التعامل مع المصفوفة الثنائية بواسطة حلقة
  • تمارين شاملة حول المصفوفات الثنائية

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

المصفوفة الثنائية ( 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 lines is " + a.length);

سنحصل على النتيجة التالية عند التشغيل.

Number of lines 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.

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