اذهب إلى المحتوى
  • 0

مشكلة برمجية في توزيع أوقات ضمن حلقة

Jasem Alabdullah

السؤال

السلام عليكم

عندي مصفوفيتين وحدة بيها مواعيد الجلسات والثانية بيها الطلاب

ابغى اوزع اول كم طالب (مثلاً اول 3) ع اوقات لحالهم (لانهم يكونون اعضاء مميزين عندي بالموقع) والثانيين ياخدون نفس الموعد ويكونون مع بعضهم لكن ينطيني هذا الخطأ

image.png.78cd180860ac8a03f40ba5037fdec885.png

الخرج اللي اريده:
جاسم بالساعة 9:00
خلف بالساعة 9:30
عبدلله بالساعة 10:00
والباقيين ما يهم كم عددهم لكن المهم ياخدون الموعد الاخير عندي بمصفوفة المواعيد 10:30

أتمنى تساعدوني واتشكركم

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

الخطأ الذي ظهر في الصورة التي قدمتها يعود إلى أن الدالة `range(len(students))` تولد قيم من 0 إلى عدد الطلاب الذي يزيد عن عدد الأوقات المتاحة في قائمة `appointment_times`. بما أن عدد الأوقات هو 4 فقط، ولكنك تحاول الوصول إلى فهرس في القائمة يتجاوز هذا العدد، فإنه ينتج عن ذلك خطأ `IndexError: list index out of range`.

هذا الخطأ يحدث عندما يكون عدد الطلاب أكبر من عدد الأوقات المتوفرة في `appointment_times` وتحاول الوصول إلى فهرس غير موجود في قائمة الأوقات.

لنحل هذه المشكلة، يجب التأكد من عدم تجاوز الدورة لعدد الأوقات المتاحة، أو كما في المثال التالي الذي يضمن توزيع الطلاب بطريقة تضمن عدم حدوث هذا التجاوز:

students = ['جاسم', 'خلف', 'عبدالله', 'زيد', 'ممدوح']
appointment_times = ['9:00', '9:30', '10:00', '10:30']

# طباعة المواعيد لأول ثلاث طلاب
for i in range(min(3, len(students))):  # يضمن هذا عدم تجاوز القائمة إذا كان عدد الطلاب أقل من 3
    print(f"{students[i]} بالساعة {appointment_times[i]}")

# توزيع الطلاب الباقين على الموعد الأخير
for i in range(3, len(students)):
    print(f"{students[i]} بالساعة {appointment_times[-1]}")

هذا الكود سيضمن توزيع الطلاب الثلاثة الأوائل على المواعيد الثلاثة الأولى، والطلاب الباقين جميعا على الموعد الأخير (10:30)، وهذه الطريقة تعمل حتى لو كان عدد الطلاب أقل من ثلاثة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

الخطأ بسبب تجاوز حدود المصفوفة كما ترا المصفوفة الاولى يختلف حجمها عن الثانية لذلك انته لهذه المشكلة ولحل المشكلة 

يمكن تخزين اول ثلاث طلاب في حال كانت المصفوفة مرتبة حسب الافضل  

students = ['جاسم', 'خلف', 'عبدلله', 'مسعود', 'زايد', 'مصطفى']
appointment_times = ['9:00', '9:30', '10:00', '10:30'] 

first_3_students = students[:3]
first_3_appointment_times= appointment_times[:3]

تسمى هذه العملية بSlicing اي اقتطاع اول 3 عناصر هنا من مصفوفة الطلاب 

بعدها يمكن المرور  على المصفوفتات المتشابهتان بالحجم

بالطريقة التالية 

for i in range(first_3_students):
     print(f"{first_3_students[i]} وقته {first_3_appointment_times[i]}")

ولباقي الطلاب 

rest_students = students[3:]

for i in range(rest_students):
     print(f"{first_3_students[i]} وقته {appointment_times[-1]}")

الخرج :

image.png.7b9a1fdb42f510f538d2871411014df9.png

 

لكن ليكون الكود اكثر احترافية يمكن استعمال الدالة zip  لتمشي على المصفوفتان سويا وتاخذ الطول الاقصر دون ان تعطي خطأ

وبعدها يمكن المرور على باقي الطلاب واعطائهم اخر قيمة

students = ['جاسم', 'خلف', 'عبدلله', 'مسعود', 'زايد', 'مصطفى']
appointment_times = ['9:00', '9:30', '10:00', '10:30'] 

first_3_students = students[:3]

unique_appointments = {student: time for student, time in zip(first_3_students, appointment_times)}

shared_appointment_time = appointment_times[-1]
shared_appointments = {student: shared_appointment_time for student in students[3:]}

all_appointments = {**unique_appointments, **shared_appointments}

for student, time in all_appointments.items():
    print(f"{student} وقته {time}")

 حيث العملية التالية هي وضعهم ضمن قاموس (dictionary) 

لنتيجة الطلاب الاوائل والطلاب الباقين على التوالي 

{student: shared_appointment_time for student in students[3:]}
{student: shared_appointment_time for student in students[3:]}

ثم دمج القاموسين عن طريق التعليمة التالية 

{**unique_appointments, **shared_appointments}

 

ويكون الخرج مشابه كالاتي 

image.png.ca65913e8d8f9cda04716fbafee13a41.png

وفيما يلي الشكل dictionary   التي تتكون من مفتاح عبارة عن الاسم والقيمة هي الوقت الخاص فيه

image.png.b01a72c45274772f6cba5a9a1d82c553.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 ساعة قال Ali Ibrahim12:

الخطأ بسبب تجاوز حدود المصفوفة كما ترا المصفوفة الاولى يختلف حجمها عن الثانية لذلك انته لهذه المشكلة ولحل المشكلة 

يمكن تخزين اول ثلاث طلاب في حال كانت المصفوفة مرتبة حسب الافضل  

students = ['جاسم', 'خلف', 'عبدلله', 'مسعود', 'زايد', 'مصطفى']
appointment_times = ['9:00', '9:30', '10:00', '10:30'] 

first_3_students = students[:3]
first_3_appointment_times= appointment_times[:3]

تسمى هذه العملية بSlicing اي اقتطاع اول 3 عناصر هنا من مصفوفة الطلاب 

بعدها يمكن المرور  على المصفوفتات المتشابهتان بالحجم

بالطريقة التالية 

for i in range(first_3_students):
     print(f"{first_3_students[i]} وقته {first_3_appointment_times[i]}")

ولباقي الطلاب 

rest_students = students[3:]

for i in range(rest_students):
     print(f"{first_3_students[i]} وقته {appointment_times[-1]}")

الخرج :

image.png.7b9a1fdb42f510f538d2871411014df9.png

 

لكن ليكون الكود اكثر احترافية يمكن استعمال الدالة zip  لتمشي على المصفوفتان سويا وتاخذ الطول الاقصر دون ان تعطي خطأ

وبعدها يمكن المرور على باقي الطلاب واعطائهم اخر قيمة

students = ['جاسم', 'خلف', 'عبدلله', 'مسعود', 'زايد', 'مصطفى']
appointment_times = ['9:00', '9:30', '10:00', '10:30'] 

first_3_students = students[:3]

unique_appointments = {student: time for student, time in zip(first_3_students, appointment_times)}

shared_appointment_time = appointment_times[-1]
shared_appointments = {student: shared_appointment_time for student in students[3:]}

all_appointments = {**unique_appointments, **shared_appointments}

for student, time in all_appointments.items():
    print(f"{student} وقته {time}")

 حيث العملية التالية هي وضعهم ضمن قاموس (dictionary) 

لنتيجة الطلاب الاوائل والطلاب الباقين على التوالي 

{student: shared_appointment_time for student in students[3:]}
{student: shared_appointment_time for student in students[3:]}

ثم دمج القاموسين عن طريق التعليمة التالية 

{**unique_appointments, **shared_appointments}

 

ويكون الخرج مشابه كالاتي 

image.png.ca65913e8d8f9cda04716fbafee13a41.png

وفيما يلي الشكل dictionary   التي تتكون من مفتاح عبارة عن الاسم والقيمة هي الوقت الخاص فيه

image.png.b01a72c45274772f6cba5a9a1d82c553.png

شكرا لحضرتك

بتاريخ 3 ساعة قال عبد الوهاب بومعراف:

الخطأ الذي ظهر في الصورة التي قدمتها يعود إلى أن الدالة `range(len(students))` تولد قيم من 0 إلى عدد الطلاب الذي يزيد عن عدد الأوقات المتاحة في قائمة `appointment_times`. بما أن عدد الأوقات هو 4 فقط، ولكنك تحاول الوصول إلى فهرس في القائمة يتجاوز هذا العدد، فإنه ينتج عن ذلك خطأ `IndexError: list index out of range`.

هذا الخطأ يحدث عندما يكون عدد الطلاب أكبر من عدد الأوقات المتوفرة في `appointment_times` وتحاول الوصول إلى فهرس غير موجود في قائمة الأوقات.

لنحل هذه المشكلة، يجب التأكد من عدم تجاوز الدورة لعدد الأوقات المتاحة، أو كما في المثال التالي الذي يضمن توزيع الطلاب بطريقة تضمن عدم حدوث هذا التجاوز:

students = ['جاسم', 'خلف', 'عبدالله', 'زيد', 'ممدوح']
appointment_times = ['9:00', '9:30', '10:00', '10:30']

# طباعة المواعيد لأول ثلاث طلاب
for i in range(min(3, len(students))):  # يضمن هذا عدم تجاوز القائمة إذا كان عدد الطلاب أقل من 3
    print(f"{students[i]} بالساعة {appointment_times[i]}")

# توزيع الطلاب الباقين على الموعد الأخير
for i in range(3, len(students)):
    print(f"{students[i]} بالساعة {appointment_times[-1]}")

هذا الكود سيضمن توزيع الطلاب الثلاثة الأوائل على المواعيد الثلاثة الأولى، والطلاب الباقين جميعا على الموعد الأخير (10:30)، وهذه الطريقة تعمل حتى لو كان عدد الطلاب أقل من ثلاثة.

حل بسيط وجميل شكرا لك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...