المصفوفة الثنائية ( 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() و هي ستعرض لك قيمها.
في حال كان العنصر فارغ، بمعنى أنه لا يوجد فيه أي قيمة و حاولت طباعة قيمته سيظهر لك أن قيمته 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");
إذا كان عدد عناصر المصفوفة ليس ثابتاً في كل سطر كما في الصورة التالية فإنك بحاجة لحلقة تمر على كل سطر في و تسجل عدد الأسطر الموجودة فيه عدد العناصر يمكن حسابه كما في الصورة التالية.
مثال
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);
إذا أردت المرور على جميع عناصر المصفوفة سواء لإدخال قيم فيها أو للحصول على قيمها فعليك بناء حلقتين متداخلتين، الأولى تنقلك من سطر لآخر، و الثانية تمر على على كل العناصر الموجودة في السطر.
الأسلوب التالي في كتابة الحلقات يسمح لك بالمرور على جميع عناصر المصفوفة مهما كان شكلها (مربعة، مستطيلة، عدد عناصرها يختلف من سطر لآخر) و سيمر معك كثيراً في التمارين.
نريد منك أن تلاحظ فقط كيف أننا اعتمدنا على قيمة 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");
}
نحن لم نقم بشرح طريقة عمل هذا الكود من قبل و لهذا لا تقلق إذا شعرت أنه معقد أو صعب لأننا سنشرحه بالتفصيل في التمارين و ستجده عندها بغاية السهولة و الوضوح.
تمارين شاملة حول المصفوفات الثنائية
التمرين الأول
أكتب برنامج يطلب من المستخدم إعطائه عددين أكبر من صفر, العدد الأول يمثل عدد أسطر مصفوفة ثنائية إسمها matrix و العدد الثاني يمثل عدد أعمدتها. خزّن العدد الأول في متغير إسمه rows و العدد الثاني في متغير إسمه cols.
ثم ينشئ المصفوفة matrix و يحدد أن عدد أسطرها يساوي rows و عدد أعمدتها يساوي cols.
ثم يطلب من المستخدم إدخال قيمة لكل عنصر من عناصر المصفوفة matrix.
أكتب برنامج يعرّف مصفوفة إسمها matrix تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة.
ثم يطلب من المستخدم إدخال أي عدد و العدد الذي يدخله يخزنه في متغير إسمه keyword.
بعدها يبحث في المصفوفة عن العدد الذي أدخله المستخدم ليرى إن كان هذا العدد موجوداً فيها أم لا. إنتبه: يكفي أن يكون العدد موجوداً مرة واحدة في المصفوفة و بالتالي عملية البحث يجب أن تتوقف بمجرد إيجاد تطابق.
في الأخير يعرض للمستخدم ناتج عملية البحث، أي إذا وجد نفس قيمة المتغير keyword في المصفوفة matrix أم لا.