مسائل الدوال

عدد المسائل: 8  الوقت التقديري: 45–60 دقيقة

تم ترتيب المسائل من الأسهل إلى الأصعب. اكتب الحل في الخلايا البرمجية أدناه.

1. حساب الأجر

عرِّف الدالة wage التي تحسب الأجر من عاملين:

  • hours: float: عدد الساعات
  • per_hour_rate: float: سعر الساعة الواحدة

اجعل نوع العائد float باستعمال -> float.

def wage(hours: float, per_hour_rate: float) -> float:
    pass  # اكتب هنا

# أمثلة (غيّر القيم لتجرب):
print(wage(10, 50))
print(wage(3.5, 120))

2. حساب العمر

اكتب دالة age_at تحسب عمر الشخص في سنة معيّنة، معطى عمره الحالي والسنة الحالية والسنة المطلوبة.

  • age_now: int — العمر الآن
  • current_year: int — السنة الحالية
  • at_year: int — السنة التي تريد حساب العمر فيها

تلميح: الفرق بين السنتين يُضاف إلى العمر الحالي (أو يُطرح إذا كانت السنة المطلوبة في الماضي).

def age_at(age_now: int, current_year: int, at_year: int) -> int:
    pass  # اكتب هنا

print(age_at(0, 2000, 2010))   # بعد الولادة
print(age_at(20, 2000, 2010))  # في المستقبل
print(age_at(20, 2000, 1995))  # في الماضي

3. المحاذاة إلى اليمين

المطلوب: اكتب الدالة print_right(text) بحيث يظهر آخر حرف من text في العمود 40 (كأن السطر مكوّنًا من 40 عمودًا).

تلميح: استخدم len، وجمع النصوص (+)، وتكرار النص (*).

def print_right(text: str) -> None:
    pass  # اكتب هنا

print_right('Monty')
print_right("Python's")
print_right('Flying Circus')

4. هرم

المطلوب: اكتب الدالة triangle(letter, height) التي تطبع هرمًا من height مستويات باستخدام letter، بحيث يزداد طول كل صف حتى آخر مستوى.

def triangle(letter: str, height: int) -> None:
    pass  # اكتب هنا

triangle('L', 10)

5. مستطيل

المطلوب: اكتب الدالة rectangle(letter, width, height) التي تطبع مستطيلًا بعرض width وارتفاع height من letter.

def rectangle(letter: str, width: int, height: int) -> None:
    pass  # اكتب هنا

rectangle('X', width=5, height=2)

6. أبيات الشاي

المطلوب: اكتب الدالة tea_verse(number) لتطبع أربعة أسطر من البيت، يبدأ بعدد number كوبًا وينتهي بـ number - 1 كوبًا (وفق النموذج في المثال التوضيحي بعد الحل).

فكرة السطرين الأوسطين: مثلاً «Pour one out, pass it around».

def tea_verse(number: int) -> None:
    pass  # اكتب هنا

tea_verse(99)

إذا أردت طباعة الأغنية عدة مرات، يمكنك استخدام حلقة for مع range (اختياري).

# اختياري — لا يلزم لإكمال المسألة:
# for n in range(5, 0, -1):
#     tea_verse(n)
#     print()

7. طول الخط المستقيم بين نقطتين

المسافة الإقليدية بين نقطتين \((x_1, y_1)\) و \((x_2, y_2)\):

\[ \text{distance} = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} \]

وتذكّر أن \(\sqrt{x} = x^{1/2}\).

المطلوب: الدالة euclidean_distance(x1, y1, x2, y2) -> float.

def euclidean_distance(x1: float, y1: float, x2: float, y2: float) -> float:
    pass  # اكتب هنا

print(euclidean_distance(x1=0, y1=0, x2=3, y2=4))
print(euclidean_distance(1, 1, -2, -2))

8. سحب الرصيد

نمذجة سحب نقدي:

  1. إن كان رصيد المستخدم يكفي للمبلغ المطلوب، فتأكد أن جهاز الصراف يملك نقودًا كافية لصرفه.
  2. إن تحققت الشروط، اطبع رسالة نجاح مناسبة؛ وإلا اطبع سبب الرفض.

المطلوب: الدالة withdraw_cash(balance, amount, atm_cash) (يمكنك إضافة تلميحات الأنواع إن رغبت).

def withdraw_cash(balance, amount, atm_cash):
    pass  # اكتب هنا

withdraw_cash(500, 200, 1000)
withdraw_cash(500, 200, 100)
withdraw_cash(500, 600, 1000)