بسم الله الرحمن الرحيم
الجلسة الثالثة: وهي عن الـ Array (المصفوفات)
سوف نتكلم في جلسة اليوم عن عصب البرمجة ... أو كما يطلقون عليها .. العامود الفقري ..
ما رأيك قبل ذلك أن نرجع إلى الجلسه الأولى حيث تكلمنا عن الـ Datatype ... وطرحنا بآخر الجلسة ما هو المتغير ... أعتقد أنه آن الآوان لنعرف المتغير ...
قلنا سابقاً أن كل Datatype يخزن في الذاكرة وبحسب حجمة, لنفرض بأن لدي إثنان من الـ Datatype ومن نفس النوع وهو Int.
وهم كالتالي:
الرقم الأول = 3
الرقم الثاني = 5
أتعلم كيف سيكون توضعهم في الذاكرة ... سيكون كالتالي
الأرقام التي بالأسفل تمثل عناوين الذاكرة في الـ RAM والتي تتوضع عليها الأرقام ويكون بنظام الـ Hexadecimal.
أعتقد بأن الآن أصبح من السهل التميز بين الرقمين ... حيث نستطيع إستدعاء أي رقم منهما بإستخدام عنوانه في الذاكرة...
ولأكن كيف لي أن أعلم العنوان ... من هنا جائت فكرة المتغيرات (Variables), إذن المتغيرات هي أسماء مستعارة نطلقها على عناوين الذاكرة.
لتصبح كالتالي:
نمثل الشكل بالأعلا برمجياً كالتالي:
Int A = 3
Int F = 5
أي أنني إستبدلت أرقام الذاكرة بي الحرفين A و F والذي يقوم بعملية الإستبدال هذا هو المترجم (Compiler)
أرجوا أن تكون فكرة المتغيرات وضحت الآن ..
حسناً .. ألا يراودك الفضول لتسأل ... لماذا قمت بجعل خانتان خاليتان بين الرقمين 3 و 5 .. هل يوجد هدف لذلك أم أنها محق مصادفة ..
في الحقيقة عندما نريد أن نخزن الرقم 5 كما في الشكل بالأعلا يقوم الـ Compiler بعدة خطوات:
أولاً: ما هو الحجم الذي يجب على المترجم أن يحجزة وبالطبع سيعتمد ذلك على الـ Datatype
ثانياً: إيجاد مكان خالي بداخل الـ RAM مساوي لحجم الـ Datatype (كما قلنا في أول جلسه ... مثال البحث عن شقة).
ثالثاً: طريقة البحث تكون بشكل عشوائي لذلك سميت بي RAM أي Random Access Memory.
أي أنه على سبيل المثال سيقوم بالبحث عن المربع الأول في الذاكرة فإذا كان مشغول (يوجد به بيانات) سيذهب إلى التالي .. وهكذا إلى أن يصل إلى مربع خالي ليضع فيع معطياته.
لذلك من الممكن أن نرى بأن الرقم 3 قد توضع في الأول والرقم 5 قد توضع في الآخر
رابعاً: أعطي لعنوان الذاكرة الإسم المستعار وهو F
خامساً: ضع في الـ F القيمة 5
أعتقد بأن الأمور إلى الآن واضحة ....
جميل .. الآن إذا طلبت منك جمع الرقمين 5 و 3 ... كيف سيتعامل الـ Compiler مع هذا الأمر ...
سيقوم بالبحث عن الإسم المستعار للـ A والتي تمثل عنوان للرقم 3
ومن ثم سيقوم بالبحث عن الإسم المستعار للـ F والتي تمثل عنوان للرقم 5
ومن ثم يقوم بجمعهما...
تكمن المشكلة في المثال السابق بأن المترجم سيستغرق وقت أثناء البحث عن العناوين ومن ثم إستخلاص النتائج ... وأيضاً تظهر المشكلة في صعوبة التحكم بهذه المعطيات لأنها بعيده عن بعضها البعض.. وأيضاً عند الرغبة بعمل عمليات مثل ترتيب تصاعدي أو تنازلي أو التريتب الفقاعي ... الخ
ومن هنا طرح السؤال التالي: ألا توجد طريقة لجعل جميع البيانات المراد تخزينها في الـ RAM تأخذ عنوان واحد وتكون بجانب بعضها البعض.. جاء الجواب على يد الـ Array
لنبدأ على بركة الله...
إذن مما سبق نقول بأن الـ Array هي مجموعة من العناصر تترتب بجانب بعضها البعض في الذاكرة.
ما رأيك بأن نلقي نظرة على تمثيل الـ Array في الذاكرة قبل الخوض في تفاصيله:
لنحلل الشكل بالأعلا:
إسم الـ Array وهو RAAD والذي بدورة يمثل الإسم المستعار لثلاثة عناوين في الذاكرة, أي وكأني دمجت الثلاثة عناوين بالأسم المستعار RAAD
وأسفل منه وهي الأرقام المخزنه في الذاكرة وهم 3,5,9
وأسفل منه عناوين هذه الأرقام في الذاكرة.
وآخر صف يمثل الـ Index لكل متغير أو قل الإزاحة.
ما رأيك الآن أن نمثل الشكل الذي بالأعلا برمجياً:
Int RAAD[2]= {3,5,9}
لنحلل الكود ...
Int هي الـ datatype
RAAD إسم الـ Array
[2] يمثل حجم المنطقة المراد حجزها, وهذا يعني بأنها تتسع لثلاثة أرقام من نوع Int حيث ان العد يبدأ من صفر.
{3,5,9} يمثل القيم المراد طباعتها
حسناً الآن لو أردت طباعة الأرقام بداخل هذه الـ Array فكل ما علي فعله هو تحديد الـ Index للقيمة التي أريد طباعتها ... أي كالتالي
إطبع RAAD[0]
إطبع RAAD[1]
إطبع RAAD[2]
لتظهر النتيجة
3
5
9
هذه هي الـ Array بكل بساطة ... طبعاً هناك أمور أخري فرعية لم نذكرها مثل
Multidimensional Arrays أو Array with Pointer
الجلسة الثالثة: وهي عن الـ Array (المصفوفات)
سوف نتكلم في جلسة اليوم عن عصب البرمجة ... أو كما يطلقون عليها .. العامود الفقري ..
ما رأيك قبل ذلك أن نرجع إلى الجلسه الأولى حيث تكلمنا عن الـ Datatype ... وطرحنا بآخر الجلسة ما هو المتغير ... أعتقد أنه آن الآوان لنعرف المتغير ...
قلنا سابقاً أن كل Datatype يخزن في الذاكرة وبحسب حجمة, لنفرض بأن لدي إثنان من الـ Datatype ومن نفس النوع وهو Int.
وهم كالتالي:
الرقم الأول = 3
الرقم الثاني = 5
أتعلم كيف سيكون توضعهم في الذاكرة ... سيكون كالتالي
الأرقام التي بالأسفل تمثل عناوين الذاكرة في الـ RAM والتي تتوضع عليها الأرقام ويكون بنظام الـ Hexadecimal.
أعتقد بأن الآن أصبح من السهل التميز بين الرقمين ... حيث نستطيع إستدعاء أي رقم منهما بإستخدام عنوانه في الذاكرة...
ولأكن كيف لي أن أعلم العنوان ... من هنا جائت فكرة المتغيرات (Variables), إذن المتغيرات هي أسماء مستعارة نطلقها على عناوين الذاكرة.
لتصبح كالتالي:
نمثل الشكل بالأعلا برمجياً كالتالي:
Int A = 3
Int F = 5
أي أنني إستبدلت أرقام الذاكرة بي الحرفين A و F والذي يقوم بعملية الإستبدال هذا هو المترجم (Compiler)
أرجوا أن تكون فكرة المتغيرات وضحت الآن ..
حسناً .. ألا يراودك الفضول لتسأل ... لماذا قمت بجعل خانتان خاليتان بين الرقمين 3 و 5 .. هل يوجد هدف لذلك أم أنها محق مصادفة ..
في الحقيقة عندما نريد أن نخزن الرقم 5 كما في الشكل بالأعلا يقوم الـ Compiler بعدة خطوات:
أولاً: ما هو الحجم الذي يجب على المترجم أن يحجزة وبالطبع سيعتمد ذلك على الـ Datatype
ثانياً: إيجاد مكان خالي بداخل الـ RAM مساوي لحجم الـ Datatype (كما قلنا في أول جلسه ... مثال البحث عن شقة).
ثالثاً: طريقة البحث تكون بشكل عشوائي لذلك سميت بي RAM أي Random Access Memory.
أي أنه على سبيل المثال سيقوم بالبحث عن المربع الأول في الذاكرة فإذا كان مشغول (يوجد به بيانات) سيذهب إلى التالي .. وهكذا إلى أن يصل إلى مربع خالي ليضع فيع معطياته.
لذلك من الممكن أن نرى بأن الرقم 3 قد توضع في الأول والرقم 5 قد توضع في الآخر
رابعاً: أعطي لعنوان الذاكرة الإسم المستعار وهو F
خامساً: ضع في الـ F القيمة 5
أعتقد بأن الأمور إلى الآن واضحة ....
جميل .. الآن إذا طلبت منك جمع الرقمين 5 و 3 ... كيف سيتعامل الـ Compiler مع هذا الأمر ...
سيقوم بالبحث عن الإسم المستعار للـ A والتي تمثل عنوان للرقم 3
ومن ثم سيقوم بالبحث عن الإسم المستعار للـ F والتي تمثل عنوان للرقم 5
ومن ثم يقوم بجمعهما...
تكمن المشكلة في المثال السابق بأن المترجم سيستغرق وقت أثناء البحث عن العناوين ومن ثم إستخلاص النتائج ... وأيضاً تظهر المشكلة في صعوبة التحكم بهذه المعطيات لأنها بعيده عن بعضها البعض.. وأيضاً عند الرغبة بعمل عمليات مثل ترتيب تصاعدي أو تنازلي أو التريتب الفقاعي ... الخ
ومن هنا طرح السؤال التالي: ألا توجد طريقة لجعل جميع البيانات المراد تخزينها في الـ RAM تأخذ عنوان واحد وتكون بجانب بعضها البعض.. جاء الجواب على يد الـ Array
لنبدأ على بركة الله...
إذن مما سبق نقول بأن الـ Array هي مجموعة من العناصر تترتب بجانب بعضها البعض في الذاكرة.
ما رأيك بأن نلقي نظرة على تمثيل الـ Array في الذاكرة قبل الخوض في تفاصيله:
لنحلل الشكل بالأعلا:
إسم الـ Array وهو RAAD والذي بدورة يمثل الإسم المستعار لثلاثة عناوين في الذاكرة, أي وكأني دمجت الثلاثة عناوين بالأسم المستعار RAAD
وأسفل منه وهي الأرقام المخزنه في الذاكرة وهم 3,5,9
وأسفل منه عناوين هذه الأرقام في الذاكرة.
وآخر صف يمثل الـ Index لكل متغير أو قل الإزاحة.
ما رأيك الآن أن نمثل الشكل الذي بالأعلا برمجياً:
Int RAAD[2]= {3,5,9}
لنحلل الكود ...
Int هي الـ datatype
RAAD إسم الـ Array
[2] يمثل حجم المنطقة المراد حجزها, وهذا يعني بأنها تتسع لثلاثة أرقام من نوع Int حيث ان العد يبدأ من صفر.
{3,5,9} يمثل القيم المراد طباعتها
حسناً الآن لو أردت طباعة الأرقام بداخل هذه الـ Array فكل ما علي فعله هو تحديد الـ Index للقيمة التي أريد طباعتها ... أي كالتالي
إطبع RAAD[0]
إطبع RAAD[1]
إطبع RAAD[2]
لتظهر النتيجة
3
5
9
هذه هي الـ Array بكل بساطة ... طبعاً هناك أمور أخري فرعية لم نذكرها مثل
Multidimensional Arrays أو Array with Pointer