شرح الموضوع
هياكل تراكيب البيانات
- سأتعلَّم في هذا الدرس كيف أَصِف تراكيب البيانات المختلفة، وكيف أختار التركيب المناسب لتمثيل مُدخَلات البرامج ومُخرَجاتها.
- كذلك سأستكشف الطرائق التي تُستخدَم فيها هذه التراكيب استخدامًا فاعلًا لتحسين كفاءة البرامج وضمان ملاءمتها لطبيعة البيانات المطلوبة.
نتاجات التعلُّم :
- أُحدِّد نوع البيانات المناسبة لتمثيل مُدخلات مشكلة مُحدَّدة ومُخرجاتها، مثل: النصوص (String)، والقوائم (Lists)، والمصفوفات (Arrays)، والمكدسات (Stacks).
- أُقارن بين تراكيب البيانات المختلفة من حيث الخصائص والاستخدامات.
- أختار أنسب الهياكل لتراكيب البيانات من بين مجموعة خيارات مُحدَّدة بما يُوائم أهداف البرنامج.
هياكل البيانات: كيف نرتّب بياناتنا لنستعملها بكفاءة؟
تعرَّفتُ سابقًا مفهوم القائمة في لغة البرمجة بايثون وأهميتها في إدارة تنظيم البيانات والتعامل معها واسترجاعها بسهولة، وسأتعرَّف في هذا الدرس أنواعًا أخرى من هياكل البيانات.
- تتيح هذه الهياكل تخزين بيانات أساسية من أنواع مُتعدِّدة (مثل: int, float, boolean, char and string)، أو بيانات مُركَّبة (مثل: List, Tuple, Set and Dictionary).
اعتمادًا على ما تعلَّمتُه في الصف الحادي عشر عن القوائم (Lists) في لغة البرمجة بايثون (Python) وكيفية تعريفها، أكتب مقطعًا برمجيًا لتعريف قائمة تحتوي على أسماء زملائي/ زميلاتي في الصف، ثمَّ أُدخل هذه الأسماء باستخدام البرنامج. بعد ذلك أُجرِّب تشغيل البرنامج بواسطة مُفسِّر لغة البرمجة بايثون للتحقق من صحَّة النتائج.
البيانات المُركَّبة في لغة البرمجة بايثون:
البيانات المركّبة: أكثر من قيمة في تركيب واحد
- تُستخدَم البيانات المُركَّبة في تخزين البيانات وتنظيمها على نحوٍ مُتَّسق يتيح للمبرمج تنفيذ عمليات مُعقَّدة بكفاءة.
- يمتاز كل نوع من البيانات المُركَّبة بخصائص ووظائف تُناسب أغراضًا مُحدَّدة.
- وهذه بعض أنواع البيانات المُركَّبة في لغة البرمجة بايثون وكيفية استخدامها:
أول هذه الأنواع عرفته في الصف الحادي عشر: القوائم.
١- القوائم (Lists):
القوائم: قيم مخزّنة معًا بمعنى مشترك
- فمثلاً، يُمكن تخزين أسماء شوارع مدينة ما في قائمة، وتخزين أسعار البضائع التي اشتراها عميل ما في قائمة، وتخزين إحداثيات تحرُّك سيارة ما في قائمة، وهكذا.
- لا يُشترط في القائمة أن تكون جميع عناصرها من النوع نفسه؛ إذ يُمكن تخزين أرقام صحيحة وأرقام عشرية وسلاسل حروف في قائمة واحدة، حتى إنَّه يُمكن تخزين قوائم أخرى في هذه القائمة.
List_name = [value1, value2, ... value n]
- (اسم القائمة: List_name، المحتوى: value1, value2, ... value n، الأقواس: [ ])
- يُمكن تعريف قائمة ما باستخدام الأقواس المُربَّعة، وكذا الفصل بين عناصر القائمة بفواصل على النحو الآتي:
- List_name: اسم القائمة.
- [ ]: الأقواس المُربَّعة (تُستخدَم في حصر عناصر القائمة).
- Value1: العنصر الأوَّل في القائمة.
- Value n: العنصر الأخير في القائمة.
مثال (١):
- يُبيِّن البرنامج الآتي كيف تُستخدَم الأوامر مع القوائم في لغة البرمجة بايثون.
مثال (٢):
- يُبيِّن البرنامج الآتي كيفية تعريف إحدى القوائم في لغة البرمجة بايثون، ثمَّ طباعة كلٍّ من قِيَمها ونوعها.
أجد النمط الخاص بعناصر القائمة في المثال السابق.
أكتب البرنامج في بيئة بايثون، ثمَّ أضيف عنصرين آخرين إلى هذه القائمة باستخدام لغة البرمجة بايثون.
أطبع العنصر الثالث من القائمة، ثمَّ أُشارك الزملاء/ الزميلات بالصف في ما أتوصل إليه من نتائج.
٢- الصفوف (Tuples):
الصفوف: قيم مرتبة لا تتغيّر بعد إنشائها
- وهذا يعني إمكانية الوصول إلى العناصر داخل الصفوف، ولكن من دون تغيير العناصر الموجودة أو إضافة عناصر أُخرى.
- عند إنشاء الصفوف، توضع العناصر المُكوِّنة لها داخل أقواس، ويُفصل بينها بفواصل.
- تُعرَّف الصفوف باستخدام الأقواس الدائرية، ويُفصل بين عناصر القائمة بفواصل كما يأتي:
الصيغة العامة لتعريف الصف (Tuple):
Tuple_name = (value1, value2, ... value n)
- (اسم الصف: Tuple_name، المحتوى: value1, value2, ... value n، الأقواس: ( ))
- Tuple_name: اسم الصف.
- ( ): الأقواس الدائرية التي تُستخدَم في حصر عناصر الصف (Tuple).
مثال:
- يُبيِّن البرنامج الآتي كيفية تعريف الصف (Tuple)، ثمَّ طباعة كلٍّ من القِيَم والنوع.
أُنفِّذ - بالتعاون مع أفراد مجموعتي - المهمة الآتية:
فتح (IDLE) الخاص بلغة البرمجة بايثون، ثمَّ إدخال البرنامج الوارد ذكره في المثال السابق.
حفظ البرنامج، ثمَّ تنفيذه. هل يوجد تشابه بين هذه النتائج والنتائج التي ظهرت في المثال؟
إضافة عنصر إلى الصف (tuple) السابق باستخدام أمر (append). ماذا نُلاحظ؟
التعديل على العنصر الثاني بحيث تصبح قيمته: T[1]=A. ماذا نُلاحظ؟
أُنفِّذ البرنامج الآتي باستخدام مُفسِّر لغة البرمجة بايثون.
``python Tuple_elements = (5,) print(Tuple_elements) print(type(Tuple_elements)) `` ما مُخرجات البرنامج؟
أحذف الفاصلة بعد الرقم (5) عند تعريف الصف، ثمَّ أعمل على حفظ البرنامج، ثمَّ أُنفِّذه. ما مُخرجات البرنامج؟ ماذا أستنتج؟
أُشارك الزملاء/ الزميلات بالصف في ما أتوصل إليه من نتائج.
``python Names = ('Hmad', 'Omar', 'Saleh', 'Ali', 'Zaid', 'Yazan', 10, 12, 14, 16) ` `python print(Names) print(Names[3:7]) print(type(Names)) `` ما مُخرجات البرنامج؟
كيف تتعامل لغة البرمجة بايثون مع الصفوف لتعرُّف عناصرها؟
٣- القواميس (Dictionaries):
القواميس: مفتاح يفتح قيمته
- فعلى سبيل المثال، يُمكن تعرُّف اسم الطالب عن طريق الرقم الجامعي الذي يحمله؛ فهذا الرقم هو المفتاح، واسم الطالب هو القيمة.
- كذلك يُمكن استخدام الرقم الجامعي مفتاحًا، واستخدام المواد التي يدرسها الطالب بوصفها قيمةً تُخزَّن في قائمة ما.
الصيغة العامة لتعريف القاموس (Dictionary):
- يُمكن تعريف القاموس كما هو مُبيَّن في الآتي:
- اسم القاموس الذي نرغب في إنشائه.
- كلمة محجوزة تُستخدم في تعريف قاموس فارغ في لغة البرمجة بايثون، وتوضع أقواس دائرية بعدها.
- الكلمة المفتاحية الأولى في القاموس، وهي المفتاح الذي يُمكن عن طريقه الوصول إلى القيمة.
- القيمة المُرتبطة بالمفتاح الأوَّل في القاموس.
- أي لا يُمكن للقاموس أن يحتوي على مفتاحين يحملان الاسم نفسه.
- أمَّا القِيَم المُرتبطة بالمفاتيح فقد تتكرَّر، ولكن لا يُشترط فيها أن تكون فريدة.
مثال:
- يُبيِّن البرنامج الآتي كيف يُمكن إنشاء قاموس خاص بمجموعة من كلمات اللغة الإنجليزية ومعانيها باللغة العربية، ثمَّ طباعتها.
- يُلاحظ أنَّ البرنامج عرض القاموس باستخدام أقواس المجموعة { } (curly parenthesis)،
- وأنَّ كل كلمة مفتاحية طُبعت بين إشارات اقتباس فردية متبوعة بنقطتين رأسيتين، تلتها القيمة المُرتبطة بتلك الكلمة،
- وأنَّه فُصل بين العناصر داخل القاموس بفواصل عادية؛ إذ طُبع كل عنصر بالصيغة الآتية: (القيمة المُرتبطة بها: الكلمة المفتاحية)، وهكذا.
أكتب البرنامج الآتي باستخدام مُفسِّر لغة البرمجة بايثون، ثمَّ أعمل على تنفيذه، وأُلاحظ الناتج.
```python Dic = {"eat": "أكل", "sleep": "نام", "swim": "سبح"}
print(Dic) print(type(Dic)) ``` أستخرج الصيغة العامة الأخرى لتعريف القاموس.
٤- المجموعات (Sets):
المجموعات: عناصر بلا ترتيب ولا تكرار
مثال:
- يُبيِّن البرنامج الآتي كيف يُمكن إنشاء مجموعة، ثمَّ طباعتها وحذف العناصر المُتكرِّرة.
مزايا المجموعات (Sets):
٥- نوع البيانات المُجرَّدة (Abstract Data Type: ADT):
البيانات المجرّدة: ما تفعله لا كيف تُخزَّن
- تعرَّفتُ آنفًا كيف تُخزَّن البيانات في بعض التراكيب بأشكال مختلفة تبعًا لنوع هذه البيانات، والغرض من استخدامها.
- ولكن تعتمد طريقة تخزين البيانات على مجموعة من العوامل، أبرزها: الحاجة إلى تعديل البيانات، وإمكانية تكرار العناصر، وطبيعة العمليات التي يُراد تنفيذها.
- فكل نوع من تراكيب البيانات (مثل: القوائم، والصفوف، والقواميس، والمجموعات) يمتاز بخصائص مُعيَّنة تُناسب مُتطلبات مُحدَّدة في البرمجة.
- من الأمثلة على نوع البيانات المُجرَّدة (ADT): القوائم المُترابطة (Linked List)، والمكدس (Stack).

أوَّلًا- القوائم المُترابطة :
القوائم المترابطة: عُقد يشير بعضها إلى بعض
- البيانات (Data): تُخزِّن البيانات قيمة العنصر (يُظهر الشكل وجود (10) في العُقدة الأولى، و(20) في العُقدة الثانية، و(30) في العُقدة الثالثة).
- المؤشِّر (Pointer): يحتوي المؤشِّر على عنوان العُقدة التالية.
- البداية (Start).
- نهاية القائمة (NULL).
- العُقدة (Node) تضمُّ البيانات والمؤشِّر.
ثانيًا- المكدس :
المكدس: آخر من يدخل أول من يخرج
- وهذا يعني أنَّ لهذه القائمة بوَّابة واحدة فقط تُستخدم مُدخلًا ومُخرَجًا كما هو مُبيَّن في الشكل (٣-٢).

- المكدس (Stack): تتمُّ عملية الإدخال (Insertion) وعملية الإزالة (Deletion) من الطرف نفسه، وهو قمَّة المكدس.
- Push: إضافة عنصر جديد إلى المكدس.
- Pop: إزالة العنصر الموجود في أعلى المكدس.
- Top: العنصر الموجود في قمَّة المكدس.
- في لغة البرمجة بايثون، يُمكن استخدام المكدس (Stack) بواسطة القوائم، أو مكتبة (Collections)، أو أحد تطبيقات (Deque).
- في ما يأتي توضيح للعمليات التي يُمكن تنفيذها على المكدس:
المواطنة الرقمية:
المواطنة الرقمية: اختيار الهيكل بمسؤولية
- محو الأمية الرقمية (Digital Literacy): أتعلم كيف أختار هيكل البيانات المناسب (مثل: القوائم للقِيَم المُتكرِّرة، والقواميس للعلاقات بين المفاتيح والقِيَم)، وأعمل على توعية المُستخدمين بأهمية تنظيم البيانات جيدًا لتحسين مستوى الكفاءة والأداء.
- المسؤولية الرقمية (Digital Responsibility): أعي أهمية الاستخدام الصحيح للبيانات المُخزَّنة وما قد يحدث إذا أُسيء استخدامها، وأحرص على استخدام نوع البيانات المناسب لمشروعي؛ كي أستفيد من الموارد المُتوافرة أيما استفادة.
أُقيِّم تعلُّمي
أُقيِّم تعلُّمي: أسئلة المراجعة
أوضح المقصود بكلٍّ ممَّا يأتي:
هياكل البيانات.
البيانات المُجرَّدة.
أُحدِّد نوع البيانات في كل جملة ممَّا يأتي:
تُخزَّن فيها البيانات على هيئة عُقد.
مجموعات مُتسلسلة ومُرتَّبة من الكائنات، يُمكن الوصول إلى العناصر داخلها من دون تغييرها أو إضافة عناصر جديدة إليها، وتُكتب هذه العناصر بين أقواس دائرية.
تُخزَّن محتوياته في صورة أزواج من المفاتيح والقِيَم.
تسلسلات من القِيَم مُرتَّبة ومُرتبطة معًا بمعنى وظيفي مُشترك.
مجموعة من الكائنات غير مُرتَّبة، وغير مُكرَّرة، وغير قابلة للتعديل.
أوَّل عنصر يدخل إلى القائمة هو آخر عنصر يخرج منها.
أستخدم لغة البرمجة بايثون في تعريف قاموس يحتوي على أنواع البيانات التي تناولها هذا الدرس، وتعريف كلٍّ منها.
أكتشف الخطأ في كل مقطع برمجي ممَّا يأتي، ثمَّ أُحدِّد طريقة تعديله:
``python Time_dictionary = dict () Time_dictionary(time) = وقت Time_dictionary {second} = ثانية Time_dictionary <minute> = دقيقة prtn Time_dictionary ``
``python b = [Amman, Jarash, Zarqa, Aqaba, Mafraq] # b is list b.append(Ajloun) print(b) ``