البرمجة بلغة بايثون · الفصل 3 — التنفيذ الشرطيביצוע מותנה · יסודות התכנות בשפת Python⌂📚🏠
الفصل 3

التنفيذ الشرطي

ביצוע מותנה
· 20 ساعات تعليمية

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

في هذا الفصل:
  • نكتب شروطا بمعاملات المقارنة ونفحص نتيجتها.
  • نربط بين الشروط بواسطة المعاملات البوليانية ونعرف ترتيب حسابها.
  • نكتب بنى if وelse وelif والشرط داخل الشرط.
  • نفحص صلاحية المُدخَلات قبل أن نستعملها.
  • نتابع البرنامج بجدول متابعة فيه عمود لكل متغيّر وعمود لكل شرط.

3.1 النوع البولياني – הטיפוס הבוליאני (bool)

كل قرار في البرنامج يبدأ بسؤال جوابه نعم أو لا: هل الباب مفتوح؟ هل الجهد أعلى من الحد؟ لهذا النوع من الأجوبة نوع معطيات خاص.

القيمة البوليانية (ערך בוליאני): قيمة لها حالتان فقط: True (صواب) وFalse (خطأ). نوعها في بايثون اسمه bool.
lamp_on = True
door_open = False
print(lamp_on)
print(door_open)
print(type(lamp_on))
المُخرَج
True
False
<class 'bool'>

القيمتان True وFalse ليستا جملتين نصيتين، ولذلك لا نضعهما بين علامتي اقتباس. والحرف الأول فيهما كبير حتما.

خطأ شائع: نكتب true بحرف صغير، فلا تعرفها بايثون وتعتبرها اسم متغيّر لم نعرّفه:
lamp_on = true
المُخرَج
NameError: name 'true' is not defined

3.2 معاملات المقارنة – אופרטורי השוואה

الطريق الأساسي للحصول على قيمة بوليانية هو المقارنة بين قيمتين. لدينا ستة معاملات مقارنة (אופרטורי השוואה)، ونتيجة كل واحد منها إما True وإما False.

الأمرعمله
a == bيساوي: يتحقّق عندما تكون القيمتان متساويتين
a != bلا يساوي: يتحقّق عندما تختلف القيمتان
a > bأكبر من
a < bأصغر من
a >= bأكبر من أو يساوي
a <= bأصغر من أو يساوي
volts = 12
print(volts == 12)
print(volts != 12)
print(volts > 12)
print(volts < 15)
print(volts >= 12)
print(volts <= 9)
المُخرَج
True
False
False
True
True
False
خطأ شائع: إشارة واحدة = هي إسناد (השמה): تضع قيمة في متغيّر. أما الإشارتان == فهما مقارنة. وإذا كتبنا الإسناد مكان المقارنة في شرط، توقّف البرنامج قبل أن يبدأ:
volts = 12
if volts = 12:
    print("ok")
المُخرَج
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

المقارنة تأخذ النوع في الحساب أيضا: العدد 5 والجملة النصية "5" ليسا القيمة نفسها، أما العدد الصحيح 5 والعدد العشري 5.0 فمتساويان لأن قيمتهما العددية واحدة. لذلك نحوّل ما قرأناه بالدالة input إلى عدد قبل أن نقارنه بعدد.

print(5 == 5.0)
print(5 == "5")
print("Volt" == "volt")
المُخرَج
True
False
False
مثال 3.1
نقرأ جهد بطارية من المستخدم، ونطبع هل هو كافٍ للتشغيل. الحد الأدنى في هذا المثال 11.8 V.
الحل:
volts = float(input("Battery voltage: "))
print("Can start:", volts >= 11.8)
المُخرَج
Battery voltage: 12.1
Can start: True

لم نكتب هنا أي أمر شرطي بعد: المقارنة وحدها أعطتنا قيمة بوليانية، وطبعناها كما هي.

سؤال 3.1: ماذا يطبع البرنامج التالي؟
a = 7
b = 2
print(a % b == 1)
print(a // b > 3)
print(a / b != 3.5)

3.3 المقارنة بين الأعداد العشرية – בעייתיות ההשוואה בערכים עשרוניים

العدد العشري float يُخزَّن في الحاسوب بالنظام الثنائي، وكثير من الكسور العشرية البسيطة لا يمكن كتابتها فيه بدقة تامة، كما لا يمكن كتابة الثلث بالأعداد العشرية بدقة. لذلك تتراكم فروق صغيرة جدا في الحساب:

total = 0.1 + 0.2
print(total)
print(total == 0.3)
المُخرَج
0.30000000000000004
False

الحساب صحيح تقريبا، لكن المقارنة == تطلب تساويا تاما، فلا يتحقّق الشرط. وللسبب نفسه قد يتحقّق != حيث لا نتوقع.

القاعدة: لا نقارن عددين عشريين بالمعاملين == و!=. نفحص بدل ذلك هل الفرق بينهما أصغر من سماح (סבילות) نختاره حسب الدقة المطلوبة، وبالقيمة المطلقة abs لأننا لا نعرف أيهما الأكبر.
مثال 3.2
مقاومتان موصولتان على التوالي، 0.1 kΩ و0.2 kΩ. نفحص هل مجموعهما يساوي 0.3 kΩ بسماح قدره 0.001 kΩ.
الحل:
expected = 0.3
measured = 0.1 + 0.2
tolerance = 0.001
print(measured == expected)
print(abs(measured - expected) < tolerance)
المُخرَج
False
True

السطر الأول من المُخرَج يبيّن الطريقة الخاطئة، والثاني يبيّن الطريقة الصحيحة.

سؤال 3.2: ماذا يطبع البرنامج التالي؟ نفسّر الفرق بين السطرين.
x = 1.1 + 2.2
print(x == 3.3)
print(abs(x - 3.3) < 0.01)

3.4 المعاملات البوليانية وجداول الصواب – אופרטורים בוליאניים וטבלאות האמת

قرار حقيقي يعتمد في الغالب على أكثر من سؤال: نشغّل المحرك إذا كان الباب مغلقا والزر مضغوطا. نربط بين الشروط بثلاثة معاملات بوليانية (אופרטורים בוליאניים):

الأمرعمله
a and bيتحقّق فقط عندما يتحقّق الطرفان معا
a or bيتحقّق عندما يتحقّق طرف واحد على الأقل
not aيقلب القيمة: الصواب يصبح خطأ والخطأ يصبح صوابا

نلخّص عمل المعاملات في جدول الصواب (טבלת אמת)، وهو الجدول نفسه الذي نعرفه من البوابات المنطقية في الأنظمة الرقمية:

aba and ba or b
FalseFalseFalseFalse
FalseTrueFalseTrue
TrueFalseFalseTrue
TrueTrueTrueTrue
جدول الصواب للمعاملين and وor
anot a
FalseTrue
TrueFalse
جدول الصواب للمعامل not
مثال 3.3
محرك يعمل عندما يكون الباب مغلقا والزر مضغوطا. وصفّارة الإنذار تعمل عندما تكون الحرارة أعلى من 80 درجة أو الضغط أعلى من 6 وحدات.
الحل:
door_open = False
button = True
temp = 72
pressure = 6.5
motor = not door_open and button
alarm = temp > 80 or pressure > 6
print("Motor:", motor)
print("Alarm:", alarm)
المُخرَج
Motor: True
Alarm: True
سؤال 3.3: ماذا يطبع البرنامج التالي؟
a = True
b = False
print(a and b)
print(a or b)
print(not b)
print(not a or b)

3.5 التعابير البوليانية وترتيب العمليّات – ביטויים בוליאניים וסדר הפעולות

التعبير البولياني (ביטוי בוליאני) قد يكون بسيطا مثل x > 3 أو مركبا من عدة شروط. عندما لا توجد أقواس، تحسب بايثون التعبير حسب الترتيب التالي، من الأعلى إلى الأسفل:

الترتيبالعمليّات
1الأقواس ( )
2الحساب: ** ثم * / // % ثم + -
3المقارنة: == != < > <= >=
4not
5and
6or
مثال 3.4
نحسب قيمة التعبير التالي عندما x = 5 وy = 12:
x > 3 and y < 10 or y == 12
الحل:

نحسب المقارنات أولا: x > 3 يعطي True، وy < 10 يعطي False، وy == 12 يعطي True.

ثم and قبل or: نحسب True and False فنحصل على False.

وأخيرا False or True يعطي True. نفحص بالتشغيل:

x = 5
y = 12
print(x > 3 and y < 10 or y == 12)
print(x > 3 and (y < 10 or y == 12))
المُخرَج
True
True

في هذه الحالة أعطت الأقواس في السطر الثاني النتيجة نفسها، لكنها تجعل المقصود واضحا. عندما يختلط and وor نستعمل الأقواس دائما.

لفحص أن قيمة واقعة في مجال، تسمح لنا بايثون بكتابة مقارنتين متتاليتين، وهما تعنيان الشرط نفسه المكتوب بالمعامل and:

adc = 512
print(0 <= adc <= 1023)
print(adc >= 0 and adc <= 1023)
المُخرَج
True
True
خطأ شائع: نريد أن نفحص هل وضع الجهاز 3 أو 7، فنكتب mode == 3 or 7. بايثون تقرأ هذا الشرط هكذا: هل الوضع 3؟ وإن لم يكن، فالقيمة هي 7. وكل عدد غير الصفر يُحسب صوابا، فيتصرف الشرط كأنه يتحقّق دائما. يجب أن نكتب المقارنة كاملة في الطرفين:
mode = 5
print(mode == 3 or 7)
print(mode == 3 or mode == 7)
المُخرَج
7
False

وهناك أمر آخر مفيد: تتوقف بايثون عن الحساب حين تعرف النتيجة، وهذا ما يسمى اختصار الطريق (קיצור דרך בחישוב). فإذا كان الطرف الأيسر في and خطأ، فلا يُحسب الطرف الأيمن أبدا، وكذلك إذا كان الطرف الأيسر في or صوابا. لذلك يعمل البرنامج التالي بلا خطأ، مع أن فيه قسمة على مقاومة صفرية:

r = 0
print(r != 0 and 12 / r > 1)
المُخرَج
False
سؤال 3.4: ماذا يطبع البرنامج التالي؟
a = 4
b = 9
print(a > 5 or b > 5 and a != 4)
print((a > 5 or b > 5) and a != 4)
print(not a > 5 and b > 5)

3.6 الأمر if – ביצוע מותנה: if

الأمر if ينفّذ مجموعة أوامر فقط عندما يتحقّق شرط. نكتبه هكذا:

if condition:
    statement
    statement
next_statement
الشرطجسم الشرطالأمر التاليTrueFalse
مخطط انسياب الأمر if: إذا لم يتحقّق الشرط نتخطى الجسم كله
مثال 3.5
نقرأ حرارة محرك. إذا كانت أعلى من 40 درجة نطبع إنذارا. وفي كل حال نطبع أن الفحص انتهى.
الحل:
temp = int(input("Temperature: "))
if temp > 40:
    print("Too hot!")
    print("Turn the fan on")
print("Check finished")
المُخرَج
Temperature: 47
Too hot!
Turn the fan on
Check finished

وللمُدخَل 30 لا يتحقّق الشرط، فيُطبع السطر الأخير فقط: Check finished

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

temp = 30
if temp > 40:
    print("Too hot!")
print("Turn the fan on")
المُخرَج
Turn the fan on

وإذا نسينا الإزاحة تماما، فلا يبدأ البرنامج أصلا:

temp = 47
if temp > 40:
print("Too hot!")
المُخرَج
IndentationError: expected an indented block after 'if' statement on line 2

جدول المتابعة – טבלת מעקב:

جدول المتابعة هو الأداة الأساسية لفهم برنامج ولفحصه، وهو مطلوب في امتحان البجروت. نفتح فيه عمودا لكل متغيّر، عمودا لكل شرط وعمودا للمُخرَج، ونكتب سطرا لكل أمر يُنفَّذ. الخانة الفارغة تعني أن القيمة لم تتغير. الأمر الذي لا يُنفَّذ لا يظهر في الجدول.

متابعة البرنامج للمُدخَل 47
الأمرtemptemp > 40المُخرَج
temp = int(input("Temperature: "))47Temperature: 47
if temp > 40:True
print("Too hot!")Too hot!
print("Turn the fan on")Turn the fan on
print("Check finished")Check finished
سؤال 3.5: ماذا يطبع البرنامج التالي؟ نبني جدول متابعة ونفحص.
a = 3
b = 8
if b > a:
    a = a + b
    b = 0
if a > 10:
    b = 1
print(a, b)

3.7 الأمر if مع else – ביצוע מותנה: if..else

عندما نريد عملا عند تحقّق الشرط وعملا آخر عند عدم تحقّقه، نضيف else. عندها يُنفَّذ واحد بالضبط من الجسمين. لا يوجد بعد else شرط، بل نقطتان فقط.

الشرطجسم ifجسم elseالأمر التاليTrueFalse
مخطط انسياب if..else: مساران ولا يُنفَّذ إلا واحد منهما
مثال 3.6
مصباح يشغّله زر واحد: الضغطة الأولى تشعله والثانية تطفئه. نقرأ عدد الضغطات ونطبع حالة المصباح. يكون المصباح مشتعلا عندما يكون باقي قسمة عدد الضغطات على 2 واحدا.
الحل:
presses = int(input("Button presses: "))
if presses % 2 == 1:
    print("Lamp ON")
else:
    print("Lamp OFF")
print("done")
المُخرَج
Button presses: 14
Lamp OFF
done
متابعة البرنامج للمُدخَل 7
الأمرpressespresses % 2 == 1المُخرَج
presses = int(input("Button presses: "))7Button presses: 7
if presses % 2 == 1:True
print("Lamp ON")Lamp ON
print("done")done
مثال 3.7
حمل يتغذى من مصدرين: لوح شمسي وبطارية. نقرأ جهد كل منهما ونختار صاحب الجهد الأعلى. نخزّن الاسم في متغيّر، ونطبعه مرة واحدة بعد انتهاء البنية.
الحل:
solar = float(input("Solar panel V: "))
battery = float(input("Battery V: "))
if solar > battery:
    source = "solar"
else:
    source = "battery"
print("Load runs from:", source)
المُخرَج
Solar panel V: 11.2
Battery V: 12.4
Load runs from: battery

الأمر print خارج البنية، ولذلك يُنفَّذ في المسارين.

سؤال 3.6: ماذا يطبع البرنامج التالي:
(أ) للمُدخَل 12.
(ب) للمُدخَل 7.
x = int(input("x: "))
if x % 3 == 0:
    x = x // 3
else:
    x = x + 1
print(x)

3.8 سلسلة الشروط elif – שרשרת תנאים: elif

عندما توجد أكثر من حالتين نضيف elif، وهي اختصار لقولنا «وإلا فإذا». تُفحص الشروط من الأعلى إلى الأسفل، وعند أول شرط يتحقّق يُنفَّذ جسمه وتُتخطى بقية السلسلة. الجزء else في النهاية اختياري، ويعمل إذا لم يتحقّق أي شرط.

الشرط الأولالجسم 1TrueFalseالشرط الثانيالجسم 2TrueFalseالشرط الثالثالجسم 3TrueFalse
مخطط انسياب سلسلة elif: يُنفَّذ جسم واحد على الأكثر
مثال 3.8
نصنّف حالة بطارية حسب جهدها. الحدود في هذا المثال قيم نموذجية اخترناها للتمرين: 12.6 V فما فوق ممتلئة، و12 V فما فوق مشحونة جزئيا، و11.8 V فما فوق منخفضة، وما دون ذلك فارغة.
الحل:
volts = float(input("Battery voltage: "))
if volts >= 12.6:
    print("Full")
elif volts >= 12.0:
    print("Partly charged")
elif volts >= 11.8:
    print("Low")
else:
    print("Empty")
المُخرَج
Battery voltage: 12.2
Partly charged
متابعة البرنامج للمُدخَل 12.2
الأمرvoltsvolts >= 12.6volts >= 12.0المُخرَج
volts = float(input("Battery voltage: "))12.2Battery voltage: 12.2
if volts >= 12.6:False
elif volts >= 12.0:True
print("Partly charged")Partly charged

الشرط الثالث لم يُفحص، ولذلك لا يوجد له عمود في الجدول. يكفي أن نكتب volts >= 12.0 من دون volts < 12.6، لأننا لا نصل إلى هذا السطر إلا إذا كان الجهد أقل من 12.6 V.

خطأ شائع: ترتيب الشروط مهم. إذا وضعنا الشرط الواسع أولا فلن نصل إلى الضيّق أبدا. في البرنامج التالي بطارية ممتلئة تُوصف بأنها منخفضة:
volts = 13.0
if volts >= 11.8:
    print("Low")
elif volts >= 12.6:
    print("Full")
المُخرَج
Low

وليس هذا كسلسلة من أوامر if منفصلة: في الأوامر المنفصلة يُفحص كل شرط مهما حدث قبله، فقد يُنفَّذ أكثر من جسم واحد:

temp = 95
if temp >= 90:
    print("Shutdown")
if temp >= 70:
    print("Alarm")
if temp >= 50:
    print("Fan on")
المُخرَج
Shutdown
Alarm
Fan on
▶تجربة حية — مختبر التنفيذ الشرطينشغّل سلسلة elif خطوة بعد خطوة، نغيّر القيم في المحرر، ونرى أي فرع اختير ولماذا. لا يوجد في المختبر إدخال من المستخدم، ولذلك نكتب القيمة مباشرة في المتغيّر بدل input.
⚠
المختبر غير متاح الآن. المادة في هذا الفصل كاملة من دونه — نواصل القراءة، ونعود إلى التجربة لاحقا أو نفتحها مباشرة من الرابط الذي تحت الإطار.
https://fahed-lab.com/electronics/python_basics#cond
نفتح المختبر في صفحة مستقلة ↗ fahed-lab.com/electronics/python_basics#cond
سؤال 3.7: ماذا يطبع البرنامج التالي:
(أ) للمُدخَل 75.
(ب) للمُدخَل 10.
(ج) للمُدخَل 101.
n = int(input("n: "))
if n > 100:
    print("A")
elif n > 50:
    print("B")
elif n > 10:
    print("C")
else:
    print("D")

3.9 شرط داخل شرط – תנאי בתוך תנאי

جسم الشرط يمكن أن يحتوي أي أمر، بما في ذلك أمر if آخر. هذا هو الشرط المتداخل (קינון תנאים). كل مستوى تداخل يضيف إزاحة، وelse تتبع if الذي في عمودها نفسه.

مثال 3.9
نحسب مقاومة حماية لثنائي باعث للضوء (LED). نأخذ قيما نموذجية: هبوط جهد 2 V وتيار 0.02 A. إذا لم يكن جهد المصدر أعلى من 2 V فلا يضيء الثنائي. وإذا خرجت المقاومة أقل من 220 Ω، فنستعمل 220 Ω، وهي أصغر مقاومة في مخزننا في هذا المثال.
الحل:
R = VS − VF I
supply = float(input("Supply voltage: "))
if supply > 2:
    resistor = (supply - 2) / 0.02
    if resistor >= 220:
        print("Use", resistor, "ohm")
    else:
        print("Use 220 ohm")
else:
    print("Supply too low")
المُخرَج
Supply voltage: 12
Use 500.0 ohm
متابعة البرنامج للمُدخَل 5
الأمرsupplyresistorsupply > 2resistor >= 220المُخرَج
supply = float(input("Supply voltage: "))5.0Supply voltage: 5
if supply > 2:True
resistor = (supply - 2) / 0.02150.0
if resistor >= 220:False
print("Use 220 ohm")Use 220 ohm

للمُدخَل 1.5 نحصل على المسار الثالث: Supply too low

الشرط الذي يتبع شرطا من دون أي عمل بينهما يمكن كتابته بالمعامل and، والبرنامج يصبح أقصر:

if temp > 40:
    if fan_ok:
        print("Fan on")
شرط داخل شرط
if temp > 40 and fan_ok:
    print("Fan on")
الشرط نفسه بالمعامل and

أما في برنامج المثال السابق فلا يمكن ذلك بهذه البساطة، لأن بين الشرطين أمرا يحسب المقاومة، ولأن لكل شرط فرع else خاصا به.

سؤال 3.8: ماذا يطبع البرنامج التالي:
(أ) عندما a=−1 وb=4.
(ب) عندما a=2 وb=0.
a = int(input("a: "))
b = int(input("b: "))
if a > 0:
    if b > 0:
        print("both")
    else:
        print("first")
else:
    if b > 0:
        print("second")
    else:
        print("none")

3.10 صلاحية المُدخَلات – תקינות קלט ומסננת קלט פשוטה

البرنامج الجيد لا يثق بما يكتبه المستخدم. مصفاة المُدخَلات (מסננת קלט) تفحص القيمة قبل استعمالها، وتتوقف عن الحساب إذا كانت غير صالحة. في هذا الفصل نكتبها بشرط فقط؛ في الفصل 4 نعلّم البرنامج أن يعيد السؤال حتى يصل مُدخَل صحيح.

مثال 3.10
نقرأ قراءة من محوّل تماثلي-رقمي (ADC) ذي عشر خانات، ونطبع في أي نصف من المجال تقع. القراءة الصالحة من 0 حتى 1023، وما عداها يعني خللا في الحسّاس.
الحل:
adc = int(input("ADC reading: "))
if 0 <= adc <= 1023:
    if adc >= 512:
        print("Upper half")
    else:
        print("Lower half")
else:
    print("Sensor fault")
المُخرَج
ADC reading: 1200
Sensor fault

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

v = 12.0
r = float(input("R: "))
print("I =", v / r)
المُخرَج
R: 0
ZeroDivisionError: division by zero

نضع الحساب داخل شرط، فلا يصل البرنامج إلى القسمة إلا بقيمة صالحة:

v = 12.0
r = float(input("R: "))
if r > 0:
    print("I =", v / r)
else:
    print("R must be positive")
المُخرَج
R: 0
R must be positive
ملاحظة: التحويل int(input()) ينهار أيضا إذا كتب المستخدم حروفا بدل عدد. معالجة ذلك تحتاج إلى أدوات نتعلمها لاحقا، في الفصل الاختياري عن الاستثناءات.

3.11 الأمر match – משפט בחירה: switch-case (match)

عندما نقارن متغيّرا واحدا بقائمة قيم محددة، كما في قائمة خيارات، نستطيع أن نكتب بدل سلسلة elif الأمر match. تسميه خطة التعليم (משפט switch-case) كما في لغات أخرى، وهو موجود في بايثون منذ الإصدار 3.10.

مثال 3.11
قائمة أوامر لوحة تحكم: 1 لتشغيل المحرك، 2 لإيقافه، 3 أو 4 لعرض الحالة. أي رقم آخر غير معروف.
الحل:
choice = int(input("Choice: "))
match choice:
    case 1:
        print("Start motor")
    case 2:
        print("Stop motor")
    case 3 | 4:
        print("Show status")
    case _:
        print("Unknown choice")
المُخرَج
Choice: 4
Show status

بعد case نكتب القيمة، والإشارة | تعني «أو»، والإشارة _ تعني «كل قيمة أخرى»، وهي تقوم مقام else. عند أول حالة مطابقة يُنفَّذ جسمها وتنتهي البنية.

تنبيه: الأمر match يقارن المتغيّر بقيم ثابتة. أما مجال مثل «أكبر من 40» فنكتبه بسلسلة if وelif. والأمر match لا يعمل في المختبر الحي في الموقع، بل في بايثون نفسها على الحاسوب أو في بيئة مثل Google Colab.
مشروع الكتاب: محطة القياس · المرحلة 3 — المحطة تقرّر

في مشروع هذا الكتاب نبني خطوة بعد خطوة محطة قياس تعمل ببطارية ولوح شمسي: حسّاسات، حمل ومروحة. في الفصل السابق حوّلت المحطة قراءاتها إلى جهد وحرارة. الآن تقرّر: تفصل الحمل إذا هبطت البطارية عن 11.8 V، وتشغّل المروحة إذا زادت الحرارة على 40 درجة والحمل يعمل.

battery = float(input("Battery V: "))
temp = float(input("Temperature: "))
if battery < 11.8:
    load = False
else:
    load = True
if temp > 40 and load:
    fan = "ON"
else:
    fan = "OFF"
print("Load on:", load)
print("Fan:", fan)
المُخرَج
Battery V: 12.4
Temperature: 46
Load on: True
Fan: ON

نجرّب بأنفسنا: ماذا يتغيّر عندما يكون جهد البطارية 11.5 V؟ ولماذا تتوقف المروحة أيضا؟

أهمّ أفكار الفصل:

ملخّص أوامر الفصل:

الأمرعمله
if condition:ينفّذ الجسم فقط إذا تحقّق الشرط
else:ينفّذ الجسم إذا لم يتحقّق الشرط
elif condition:شرط إضافي، يُفحص إذا لم يتحقّق ما قبله
match x: case 1: case _:اختيار حسب قيمة متغيّر واحد
== != > < >= <=معاملات المقارنة
and or notالمعاملات البوليانية
abs(a - b) < toleranceمقارنة عددين عشريين بسماح

قاموس المصطلحات – מילון מונחים:

بالعربيةبالعبرية (كما تظهر في الامتحان)English
القيمة البوليانيةערך בוליאניBoolean value
معامل مقارنةאופרטור השוואהComparison operator
معامل بوليانيאופרטור בוליאניBoolean operator
جدول الصوابטבלת אמתTruth table
تعبير بوليانيביטוי בוליאניBoolean expression
الشرطתנאיCondition
التنفيذ الشرطيביצוע מותנהConditional execution
جسم الشرطגוף התנאיBody of the condition
الإزاحةהזחהIndentation
شرط داخل شرطתנאי בתוך תנאי (קינון)Nested condition
جدول المتابعةטבלת מעקבTrace table
المُدخَل · المُخرَجקלט · פלטInput · Output
مصفاة المُدخَلاتמסננת קלטInput filter
السماحסבילותTolerance
الإجابات النهائية لأسئلة الفصل
3.1 True ، False ، False
3.2 False ، True — المجموع لا يساوي 3.3 تماما، لكن الفرق بينهما أصغر من السماح.
3.3 False ، True ، True ، False
3.4 False ، False ، True
3.5 11 1
3.6 (أ) 4 ، (ب) 8
3.7 (أ) B ، (ب) D ، (ج) A
3.8 (أ) second ، (ب) first

أسئلة للتمرين:

المستوى الأول — أساسي
1.
ماذا يطبع البرنامج؟
a = 6
b = 15
print(a > 5 and b < 10)
print(a > 5 or b < 10)
print(not (a == 6))
print(b % a == 3)
الإجابات: False , True , False , True
2.
نكتب شرطا بلغة بايثون لكل حالة:
(أ) العدد x بين 10 و20، شاملا الطرفين.
(ب) العدد x مضاعف للعدد 7.
(ج) المتغيّران a وb مختلفان وكلاهما موجب.
الإجابات: (أ) 10 <= x <= 20 ، (ب) x % 7 == 0 ، (ج) a != b and a > 0 and b > 0
3.
ماذا يطبع البرنامج:
(أ) للمُدخَل 3.
(ب) للمُدخَل 8.
(ج) للمُدخَل 12.
x = int(input("x: "))
y = 1
if x > 5:
    y = y + x
if x > 10:
    y = y * 2
else:
    y = y - 1
print(y)
الإجابات: (أ) 0 ، (ب) 8 ، (ج) 26
4.
نجد ثلاثة أخطاء في هذا البرنامج ونصلحها:
t = 30
if t = 30
print("ok")
الإجابات: بعد if يجب أن تكون المقارنة ==، وبعد الشرط نقطتان، والأمر print يجب أن يكون مزاحا:
t = 30
if t == 30:
    print("ok")
5.
نكتب برنامجا يقرأ جهدا، ويطبع Safe إذا كان موجبا ولا يزيد على 5 V، وإلا يطبع Unsafe.
الإجابات:
v = float(input("V: "))
if 0 < v <= 5:
    print("Safe")
else:
    print("Unsafe")
المستوى الثاني — متوسط
6.
نكتب برنامجا يقرأ حرارة ويطبع: Freezing تحت 0 درجة، Cold تحت 15، Warm تحت 30، وإلا Hot.
الإجابات:
t = float(input("Temperature: "))
if t < 0:
    print("Freezing")
elif t < 15:
    print("Cold")
elif t < 30:
    print("Warm")
else:
    print("Hot")
للمُدخَل 15 يطبع: Warm
7.
نكتب برنامجا يقرأ القيمة الاسمية لمقاومة وقيمتها المقيسة. تكون المقاومة جيدة إذا كان الفرق حتى 5% في الاتجاهين. يطبع البرنامج Good resistor للمقاومة الجيدة وReject لغيرها.
الإجابات:
nominal = float(input("Nominal: "))
measured = float(input("Measured: "))
low = nominal * 0.95
high = nominal * 1.05
if low <= measured <= high:
    print("Good resistor")
else:
    print("Reject")
للقيمتين 470 و500 يطبع: Reject
8.
نكتب برنامجا يقرأ التيار في ثلاثة خطوط L1 وL2 وL3، ويطبع اسم الخط ذي التيار الأعلى وقيمته، من دون استعمال الدالة max.
الإجابات:
l1 = float(input("L1: "))
l2 = float(input("L2: "))
l3 = float(input("L3: "))
top = l1
name = "L1"
if l2 > top:
    top = l2
    name = "L2"
if l3 > top:
    top = l3
    name = "L3"
print("Highest:", name, top)
للتيارات 4.5, 9, 2 يطبع: Highest: L2 9.0
9.
نبني جدول متابعة للبرنامج التالي عندما a=3 وb=11.
a = int(input("a: "))
b = int(input("b: "))
if a > b:
    a = a - b
elif a == b:
    a = 0
else:
    b = b - a
    if b > 3:
        b = b // 2
print(a, b)
الإجابات:
الأمرaba > ba == bb > 3المُخرَج
a = int(input("a: "))3a: 3
b = int(input("b: "))11b: 11
if a > b:False
elif a == b:False
b = b - a8
if b > 3:True
b = b // 24
print(a, b)3 4
10.
نكتب برنامجا يقرأ جهدا ومقاومة ويطبع التيار. إذا لم تكن المقاومة موجبة يطبع رسالة ولا يحسب.
الإجابات:
v = float(input("V: "))
r = float(input("R: "))
if r > 0:
    print("I =", v / r)
else:
    print("R must be positive")
للقيمتين 12 و4 يطبع: I = 3.0
المستوى الثالث — تحدٍّ
11.
السنة الكبيسة تقبل القسمة على 4 ولا تقبل القسمة على 100، إلا إذا قبلت القسمة على 400. نكتب برنامجا بشرط واحد مركب يفحص سنة.
الإجابات:
year = int(input("Year: "))
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
    print("Leap year")
else:
    print("Common year")
للسنوات 2024, 1900, 2000 يطبع على الترتيب: Leap year , Common year , Leap year
12.
مقارن نافذة (window comparator) يفحص هل الجهد بين 2 V و3 V شاملا الطرفين. نكتب برنامجا يطبع: قراءة غير صالحة للجهد السالب، تحت النافذة، داخلها أو فوقها.
الإجابات:
low = 2.0
high = 3.0
v = float(input("V: "))
if v < 0:
    print("Bad reading")
elif v < low:
    print("Below window")
elif v <= high:
    print("Inside window")
else:
    print("Above window")
للقيم -1, 1.5, 3, 4 يطبع على الترتيب: Bad reading , Below window , Inside window , Above window
13.
نكتب حاسبة لقانون أوم بالأمر match: يختار المستخدم ماذا يحسب، ثم يدخل قيمتين. في الخيار 1 نحسب V من I وR، في الخيار 2 نحسب I من V وR، وفي الخيار 3 نحسب R من V وI. نمنع القسمة على صفر.
الإجابات:
choice = int(input("Find (1=V, 2=I, 3=R): "))
a = float(input("First value: "))
b = float(input("Second value: "))
match choice:
    case 1:
        print("V =", a * b)
    case 2:
        if b != 0:
            print("I =", a / b)
        else:
            print("Division by zero")
    case 3:
        if b != 0:
            print("R =", a / b)
        else:
            print("Division by zero")
    case _:
        print("Unknown choice")
للمُدخَلات 2, 12, 4 يطبع: I = 3.0

שאלות בגרות – أسئلة بجروت للفصل 3

معظم أسئلة البرمجة في البجروت تحتاج إلى حلقات وقوائم وفئات، وسنلتقيها في الفصول القادمة. لكن البند (ب) من السؤال التالي هو سلسلة شروط نقية، ونستطيع أن نحل جوهره منذ الآن. تظهر الأسئلة بالعبرية كما في الامتحان.
بجروت 2026 السؤال 10 — بطاقة السفر
بجروت 2026
البندالمطلوبالإجابة
(ب)نكتب برنامجا يطبع اسم صاحب البطاقة ذات الرصيد الأعلى من بين بطاقتين. إذا تساوى الرصيدان يطبع رسالة ملائمة.في الأسفل
(أ) ، (ج)يعتمدان على الفئة TravelCard نفسها.في الفصل 8
الحل الكامل بالعربية: fahed-lab.com/exams/electronics-815381/815381/solutions/solution-2026

لم نتعلم الفئات بعد، ولذلك نحفظ كل اسم وكل رصيد في متغيّر خاص به. منطق البند هو السلسلة نفسها بالضبط:

name1 = input("Name 1: ")
balance1 = float(input("Balance 1: "))
name2 = input("Name 2: ")
balance2 = float(input("Balance 2: "))
if balance1 > balance2:
    print(name1)
elif balance2 > balance1:
    print(name2)
else:
    print("Both cards have the same balance.")
المُخرَج
Name 1: Dana
Balance 1: 75.5
Name 2: Omar
Balance 2: 40
Dana

ويطبع البرنامج Both cards have the same balance. عندما يتساوى الرصيدان. وفي حل الامتحان نفسه، بعد أن نتعلم الفئات، نكتب c1.balance بدل balance1، ويبقى الشرط كما هو.