طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 111 · أساسيات برمجة الحاسب
الدرس 20 · الوحدة 4: الدوال والقوائم

استراتيجيات الحل: البحث والترتيب

نتعلّم طرقًا مجرّبة للبحث عن عنصر، وإيجاد الأكبر، وترتيب البيانات. ⏱ نحو 20 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تفكّر في الحل خطوة بخطوة قبل كتابة الكود.
  • تجد الأكبر أو الأصغر بحلقة بنفسك.
  • تكتب دالة البحث الخطّي.
  • ترتّب القائمة بـ sort و sorted.

١كيف نفكّر في الحل؟

قبل الكود نفكّر: ماذا يفعل الإنسان لو حلّ المشكلة بيده؟ لو أعطاك المعلم كومة أوراق اختبار وطلب أعلى درجة، ستقلّب الأوراق واحدة واحدة، وتتذكر أعلى درجة رأيتها حتى الآن. هذه هي الخوارزمية، والكود مجرد ترجمة لها.

٢إيجاد الأكبر بأنفسنا

بدون max: نفترض أن أول عنصر هو الأكبر، ثم نقارن به كل عنصر:

main.py
marks = [70, 85, 92, 60, 78]biggest = marks[0]for m in marks:    if m > biggest:        biggest = mprint("الأعلى:", biggest)
Shell×
>>> %Run main.py
الأعلى: 92
>>>

لماذا نتعلّم هذا وعندنا max؟ لأن الفكرة نفسها تحلّ مشكلات لا توجد لها دالة جاهزة، مثل: من صاحب أعلى درجة؟

main.py
names = ["علي", "سارة", "خالد"]marks = [70, 95, 88]best = 0for i in range(len(marks)):    if marks[i] > marks[best]:        best = iprint("الأول:", names[best], "بدرجة", marks[best])
Shell×
>>> %Run main.py
الأول: سارة بدرجة 95
>>>

٣البحث الخطّي

البحث الذي كتبته في الدرس السابق اسمه البحث الخطّي: نفحص العناصر بالترتيب من الأول. نكتبه هنا في دالة تُرجع رقم الخانة، أو -1 إذا لم نجد العنصر:

main.py
def search(items, target):    for i in range(len(items)):        if items[i] == target:            return i    return -1 codes = [305, 112, 480, 221]print(search(codes, 480))print(search(codes, 999))
Shell×
>>> %Run main.py
2
-1
>>>

لاحظ أن return -1 خارج الحلقة: لا نقول «غير موجود» إلا بعد أن نفحص كل العناصر.

٤الترتيب

ترتيب البيانات يسهّل قراءتها والبحث فيها. في بايثون طريقتان جاهزتان:

الطريقةماذا تفعل
a.sort()ترتّب القائمة نفسها
sorted(a)تُرجع قائمة جديدة مرتبة، والأصلية لا تتغيّر
a.sort(reverse=True)ترتيب من الأكبر إلى الأصغر
main.py
marks = [70, 85, 92, 60, 78]marks.sort()print(marks)marks.sort(reverse=True)print("أعلى ثلاث درجات:", marks[0], marks[1], marks[2])
Shell×
>>> %Run main.py
[60, 70, 78, 85, 92]
أعلى ثلاث درجات: 92 85 78
>>>
📎 للاستزادة (اختياري): كيف يرتّب الحاسب؟

أبسط فكرة: ابحث عن أصغر عنصر وضعه في الخانة الأولى، ثم ابحث عن أصغر الباقي وضعه في الثانية، وهكذا. اسمها الترتيب بالاختيار:

main.py
a = [5, 2, 8, 1]for i in range(len(a)):    small = i    for j in range(i + 1, len(a)):        if a[j] < a[small]:            small = j    a[i], a[small] = a[small], a[i]print(a)
Shell×
>>> %Run main.py
[1, 2, 5, 8]
>>>

توقّع وتحقّق

عند البحث عن الأكبر بأنفسنا، بأي قيمة نبدأ؟

أول عنصر آمن في كل الحالات.

ماذا تُرجع دالة search في الدرس إذا لم تجد العنصر؟

اتفقنا أن -1 تعني «غير موجود».

ما الفرق بين sort و sorted؟

sorted تحافظ على الأصلية.

لترتيب القائمة من الأكبر إلى الأصغر نكتب:

reverse=True تعكس الاتجاه.

الخلاصة

تحدٍّ برمجي: أقل درجة بلا min

متوسط

لديك marks = [77, 64, 90, 58, 83]. اكتب برنامجًا يجد أقل درجة بحلقة for دون استخدام min، ثم يطبعها.

المطلوب:
  • ابدأ smallest بأول عنصر.
  • قارن كل عنصر بـ smallest.
  • اطبع: الأقل: ثم القيمة.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
marks = [77, 64, 90, 58, 83]smallest = marks[0]
المطلوب×
الأقل: 58
💡 تلميح 1
for m in marks:
💡 تلميح 2
if m < smallest: smallest = m

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
marks = [77, 64, 90, 58, 83]smallest = marks[0]for m in marks:    if m < smallest:        smallest = mprint("الأقل:", smallest)
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←