أساسيات البرمجةالمصفوفات الثنائية
- مفهوم المصفوفات الثنائية
- تعريف مصفوفة ثنائية
- عرض قيم المصفوفة الثنائية
- تغيير قيم عناصر المصفوفة الثنائية
- الحصول على عدد أسطر و عناصر المصفوفة الثنائية
- التعامل مع المصفوفة الثنائية بواسطة حلقة
- تمارين شاملة حول المصفوفات الثنائية
مفهوم المصفوفات الثنائية
المصفوفة الثنائية ( 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);
سنحصل على النتيجة التالية عند التشغيل.
في حال كان العنصر فارغ، بمعنى أنه لا يوجد فيه أي قيمة و حاولت طباعة قيمته سيظهر لك أن قيمته undefined
للإشارة إلى أنه بالأساس لا يحتوي أي شيء.
في المثال التالي قمنا بتعريف مصفوفة تحتوي سطرين و كل سطر فيه ثلاث خانات و لم نضع أي قيم فيها.
بعدها قمنا بعرض جميع قيم العناصر الموجودة فيها حتى تلاحظ أنه سيظهر لك undefined
عند محاولة طباعة قيمة أي عنصر لا يملك أساساً أي قيمة.
مثال
var a = array(2, 3); write(a);
سنحصل على النتيجة التالية عند التشغيل.
عرض قيمة عنصر محدد
لعرض قيمة عنصر محدد في المصفوفة عليك تحديد رقم السطر الموجود و رقم الخانة الموجود فيهما. فعلى سبيل المثال إن كانت المصفوفة إسمها 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][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[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);
سنحصل على النتيجة التالية عند التشغيل.
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);
سنحصل على النتيجة التالية عند التشغيل.
الحصول على عدد العناصر الموجودة في السطر
لمعرفة عدد العناصر أو الخانات الموجودة في كل سطر في المصفوفة قم بطباعة قيمة الخاصية 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[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);
سنحصل على النتيجة التالية عند التشغيل.
إذا كان شكل المصفوفة يشبه المستطيل (أي عدد العناصر في كل سطر متساوي) فإجمالي عدد العناصر يمكن حسابه كما في الصورة التالية.
مثال
var a = [ [1, 2, 3], [4, 5, 6] ]; var totalElements = a.length * a[0].length; write("Total number of elements = " + totalElements);
سنحصل على النتيجة التالية عند التشغيل.
إذا كان عدد عناصر المصفوفة ليس ثابتاً في كل سطر كما في الصورة التالية فإنك بحاجة لحلقة تمر على كل سطر في و تسجل عدد الأسطر الموجودة فيه عدد العناصر يمكن حسابه كما في الصورة التالية.
مثال
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"); }
سنحصل على النتيجة التالية عند التشغيل.
4 5 6
نحن لم نقم بشرح طريقة عمل هذا الكود من قبل و لهذا لا تقلق إذا شعرت أنه معقد أو صعب لأننا سنشرحه بالتفصيل في التمارين و ستجده عندها بغاية السهولة و الوضوح.
تمارين شاملة حول المصفوفات الثنائية
التمرين الأول
- أكتب برنامج يطلب من المستخدم إعطائه عددين أكبر من صفر, العدد الأول يمثل عدد أسطر مصفوفة ثنائية إسمها
matrix
و العدد الثاني يمثل عدد أعمدتها. خزّن العدد الأول في متغير إسمهrows
و العدد الثاني في متغير إسمهcols
. - ثم ينشئ المصفوفة
matrix
و يحدد أن عدد أسطرها يساويrows
و عدد أعمدتها يساويcols
. - ثم يطلب من المستخدم إدخال قيمة لكل عنصر من عناصر المصفوفة
matrix
. - ثم يعرض له جميع قيم عناصر المصفوفة
matrix
.
التمرين الثاني
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 3 أعمدة. - ثم يطلب من المستخدم إدخال قيم في جميع عناصرها.
- ثم يعرض للمستخدم ناتج جمع جميع قيم عناصرها.
التمرين الثالث
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 3 أعمدة. - ثم يطلب من المستخدم إدخال قيم في جميع عناصرها.
- ثم يعرض للمستخدم ناتج جمع قيم العناصر الموجودة في كل سطر فيها.
التمرين الرابع
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 3 أعمدة. - ثم يطلب من المستخدم إدخال قيم في جميع عناصرها.
- ثم يعرض للمستخدم ناتج جمع قيم العناصر الموجودة في كل عمود فيها.
التمرين الخامس
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة. - ثم يقوم بتخزين جميع القيم الموجودة في المصفوفة
matrix
بداخل مصفوفة أحادية إسمهاvector
. - ثم يعرض للمستخدم جميع القيم التي أصبحت تحتويها المصفوفة
matrix
. - في النهاية يعرض للمستخدم جميع القيم التي أصبحت تحتويها المصفوفة
vector
على نفس السطر.
التمرين السادس
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة. - بعدها يقوم بجمع قيم جميع العناصر الموجودة على القطر (On diagonal)، فوق القطر (Above diagonal)، و تحت القطر (Under diagonal).
- في الأخير يعرض للمستخدم ناتج الجمع.
التمرين السابع
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة. - ثم يطلب من المستخدم إدخال أي عدد و العدد الذي يدخله يخزنه في متغير إسمه
keyword
. - بعدها يشيّك على جميع عناصر المصفوفة ليرى كم مرة قيمة
keyword
موجودة فيها. - في النهاية يعرض للمستخدم ناتج عملية البحث، أي كم مرة وجد نفس قيمة المتغير
keyword
في المصفوفةmatrix
.
التمرين الثامن
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة. - ثم يطلب من المستخدم إدخال أي عدد و العدد الذي يدخله يخزنه في متغير إسمه
keyword
. - بعدها يبحث في المصفوفة عن العدد الذي أدخله المستخدم ليرى إن كان هذا العدد موجوداً فيها أم لا.
إنتبه: يكفي أن يكون العدد موجوداً مرة واحدة في المصفوفة و بالتالي عملية البحث يجب أن تتوقف بمجرد إيجاد تطابق. - في الأخير يعرض للمستخدم ناتج عملية البحث، أي إذا وجد نفس قيمة المتغير
keyword
في المصفوفةmatrix
أم لا.
التمرين التاسع
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 3 أعمدة و فيها قيم جاهزة. - بعدها يقوم بجمع قيم العناصر الموجودة في كل سطر و يخزن ناتج الجمع في مصفوفة أحادية إسمها
vector
. - في النهاية يعرض للمستخدم جميع القيم التي أصبحت تحتويها المصفوفة
matrix
و المصفوفةvector
.