مقدمة في علوم الحاسوب والبرمجة باستخدام Python › المحاضرة 2: النصوص، والإدخال/الإخراج، والتفرّع 4 / 30 السابق التالي

المحاضرة 2: شرائح السلاسل النصية والإدخال/الإخراج والتفريع كاملة

المحاضرة 2: السلاسل النصية والإدخال/الإخراج والتفريع (Strings, Input/Output, and Branching)

المصادر والنسبة والترخيص

المادة الأصلية: آنا بيل (Ana Bell)، MIT OpenCourseWare (MIT OCW)، معهد ماساتشوستس للتكنولوجيا، مقرر 6.100L: مقدمة في علوم الحاسوب والبرمجة باستخدام Python، خريف 2022 (Fall 2022).

هذه ترجمة وتكييف عربي غير رسمي وفق رخصة CC BY-NC-SA 4.0: النسبة–غير التجاري–المشاركة بالمثل، ولا تعني اعتمادًا أو تأييدًا من MIT أو MIT OCW. شروط الاستخدام والاستشهاد.

منهج الترجمة: لكل صفحة في ملف الشرائح عنوان مستقل ورقم مطابق، بما في ذلك الشرائح المتكرّرة التي تُبنى تدريجيًا (من 15 إلى 25). نُقلت الجداول والمخططات إلى نصوص وجداول تحافظ على تسلسلها وقيمها. الشيفرة وشبه الشيفرة (Pseudocode) محفوظتان بالإنجليزية، وأسطر أوامر Python داخل الحصار مُترجمة. لم تُضمَّن صور أو صفحات PDF.

الشريحة 1: السلاسل النصية والإدخال/الإخراج والتفريع

(STRINGS, INPUT/OUTPUT, and BRANCHING)

(نزّل الشرائح وملفات .py لمتابعة الشرح).

6.100L، المحاضرة 2 — آنا بيل (Ana Bell).

الشريحة 2: مراجعة

  • الكائنات (Objects):
    • الكائنات في الذاكرة لها أنواع.
    • الأنواع تخبر بايثون ما العمليات التي يمكنك إجراؤها على الكائنات.
    • التعابير تُقيَّم إلى قيمة واحدة، وتشمل كائنات وعمليات.
    • المتغيّرات تربط الأسماء بالكائنات.
    • علامة = هي إسناد، مثل var = type(5*4):
var = type(5*4)

النتيجة: var مربوطة بالقيمة int.

  • البرامج (Programs):
    • البرامج لا تفعل إلا ما تأمرها به.
    • أسطر الشيفرة تُنفَّذ بالترتيب.
    • أسماء المتغيّرات الجيدة والتعليقات تساعدك على قراءة الشيفرة لاحقًا.

مثال المراجعة:

pi = 3.14
radius = 2.2
area = pi*(radius**2)
radius = radius+1
المتغيّر القيمة
pi 3.14
radius 2.2
radius بعد إعادة الربط 3.2
area 15.1976

الشريحة 3: السلاسل النصية (Strings)

(STRINGS)

الشريحة 4: السلاسل النصية

  • تخيّل السلسلة str على أنها تسلسل من محارف حسّاسة لحالة الأحرف (Case Sensitive):
    • حروف، ومحارف خاصة، ومسافات، وأرقام.
  • تُحصر بين علامتَي تنصيص مزدوجتين (Quotation Marks) أو علامتَي تنصيص مفردتين.
    • يكفي أن تكون متّسقة في استخدام علامتَي التنصيص:
a = "me"
z = 'you'
  • يمكنك دمج السلاسل النصية وتكرارها:
b = "myself"
c = a + b
d = a + " " + b
silly = a * 3
المتغيّر القيمة
a "me"
b "myself"
c "memyself"
d "me myself"
silly "mememe"

الشريحة 5: جرّب بنفسك!

ما قيمتا s1 وs2؟

b = ":"
c = ")"
s1 = b + 2*c
f = "a"
g = " b"
h = "3"
s2 = (f+g)*int(h)

الشريحة 6: عمليات السلاسل النصية

  • الدالة len() دالة تُستخدم لجلب طول السلسلة النصية بين الأقواس:
s = "abc"
len(s)      # تُقيَّم إلى 3
chars = len(s)

الشريحة 7: التقطيع (Slicing) للحصول على محرف واحد في سلسلة نصية

  • تُستخدم الأقواس المربّعة (Square Brackets) لإجراء الفهرسة (Indexing) داخل السلسلة النصية للحصول على القيمة عند فهرس/موضع معيّن:
s = "abc"
الفهرس 0 1 2
الفهرس الموجب 0 1 2
الفهرس السالب -3 -2 -1
  • الفهرسة تبدأ دائمًا عند 0.
  • فهرس آخر عنصر هو len(s) - 1 أي -1.
التعبير النتيجة
s[0] يُقيَّم إلى "a"
s[1] يُقيَّم إلى "b"
s[2] يُقيَّم إلى "c"
s[3] محاولة فهرسة خارج الحدود، خطأ
s[-1] يُقيَّم إلى "c"
s[-2] يُقيَّم إلى "b"
s[-3] يُقيَّم إلى "a"

الشريحة 8: التقطيع للحصول على سلسلة جزئية (Substring)

  • يمكنك تقطيع السلاسل النصية باستخدام [start:stop:step]:
    • خذ المحارف من start حتى stop - 1 ضمنًا. خُذ كل step من المحارف (taking every step characters).
  • إذا أعطيت رقمين، أي [start:stop]، فإن step = 1 بشكل افتراضي.
  • إذا أعطيت رقمًا واحدًا، فأنت تعود إلى الفهرسة للحصول على المحرف عند موضع واحد (الشريحة السابقة).
  • يمكنك أيضًا حذف الأرقام وترك نقطتين فقط (جرّب ذلك!).

الشريحة 9: أمثلة التقطيع

  • يمكنك تقطيع السلاسل النصية باستخدام [start:stop:step].
  • انظر إلى step أولًا:
    • قيمة موجبة تعني الاتجاه من اليسار إلى اليمين.
    • قيمة سالبة تعني الاتجاه من اليمين إلى اليسار.
s = "abcdefgh"
الفهرس الموجب 0 1 2 3 4 5 6 7
الفهرس السالب -8 -7 -6 -5 -4 -3 -2 -1
التعبير النتيجة
s[3:6] يُقيَّم إلى "def"، أي ما يعادل s[3:6:1]
s[3:6:2] يُقيَّم إلى "df"
s[:] يُقيَّم إلى "abcdefgh"، أي ما يعادل s[0:len(s):1]
s[::-1] يُقيَّم إلى "hgfedcba"
s[4:1:-2] يُقيَّم إلى "ec"

الشريحة 10: جرّب بنفسك!

s = "ABC d3f ghi"
s[3:len(s)-1]
s[4:0:-1]
s[6:3]

الشريحة 11: السلاسل النصية غير قابلة للتغيير (Immutable)

  • السلاسل النصية «غير قابلة للتغيير» — لا يمكن تعديلها.
  • يمكنك إنشاء كائنات جديدة تكون نسخًا من الأصل.
  • اسم المتغيّر لا يمكن أن يُربط إلا بكائن واحد:
s = "car"
s[0] = 'b'

← يعطي خطأً.

s = 'b'+s[1:len(s)]

← مسموح، وs مربوطة بكائن جديد.

قبل بعد
"car" "bar"

الشريحة 12: الفكرة الكبرى

إن كنت تتساءل «ماذا يحدث لو…» فجرّبها في وحدة الطرفية (Console)!

الشريحة 13: الإدخال/الإخراج (INPUT/OUTPUT)

(INPUT/OUTPUT)

الشريحة 14: الطباعة (PRINTING)

  • تُستخدم لإخراج الأشياء إلى وحدة الطرفية.
In [11]: 3+2
Out[11]: 5
  • الأمر هو print:
In [12]: print(3+2)
5
  • طباعة كائنات كثيرة في الأمر نفسه:
    • افصل بين الكائنات بفواصل لطباعتها مفصولة بمسافات.
    • استخدم + لدمج السلاسل النصية معًا وطباعتها ككائن واحد.
a = "the"
b = 3
c = "musketeers"
print(a, b, c)
print(a + str(b) + c)

الشريحة 15: الإدخال (INPUT)

  • x = input(s):
    • يطبع قيمة السلسلة النصية s.
    • يكتب المستخدم شيئًا ويضغط Enter.
    • تُسنَد تلك القيمة إلى المتغيّر x.
  • تُربط تلك القيمة بمتغيّر.
text = input("Type anything: ")
print(5*text)
  • مخرجات الصدفة (SHELL) في هذه الشريحة:
Type anything:

الشريحة 16: الإدخال (INPUT) — تُضاف كتابة المستخدم

text = input("Type anything: ")
print(5*text)
Type anything: howdy

الشريحة 17: الإدخال (INPUT) — القيمة تُربط بالمتغيّر text

  • في الذاكرة:
text
"howdy"

الشريحة 18: الإدخال (INPUT)

text
"howdy"

الشريحة 19: الإدخال (INPUT)

text
"howdy"
Type anything: howdy
howdyhowdyhowdyhowdyhowdy

الشريحة 20: الإدخال (INPUT) — input يُعيد دائمًا نوع str

  • input يُعيد دائمًا سلسلة نصية (str)، ويجب التحويل (Cast) إذا كنت تعمل مع أعداد:
num1 = input("Type a number: ")
print(5*num1)
num2 = int(input("Type a number: "))
print(5*num2)
Type a number: 3
num1
"3"

الشريحة 21: الإدخال (INPUT) — تكرار السلسلة

num1
"3"
Type a number: 3
33333
  • بما أن num1 سلسلة نصية، فإن 5*num1 يكرّرها خمس مرات.

الشريحة 22: الإدخال (INPUT) — الخطوة الثانية

Type a number: 3

الشريحة 23: الإدخال (INPUT) — المتغيّر num2

num1
"3"
num2
3
  • num2 عدد صحيح لأننا استخدمنا int(...).

الشريحة 24: الإدخال (INPUT) — النتيجة

Type a number: 3
33333
Type a number: 3
15

الشريحة 25: جرّب بنفسك!

  • اكتب برنامجًا:
    • يطلب من المستخدم فعلًا (Verb).
    • يطبع «I can _ better than you» مع استبدال _ بالفعل.
    • ثم يطبع الفعل خمس مرات متتالية مفصولة بمسافات.
  • مثال: إذا أدخل المستخدم run، فيُطبع:
I can run better than you!
run run run run run

الشريحة 26: خوارزمية مهمّة: طريقة نيوتن (Newton’s Method)

  • تجد جذور متعدّد الحدود (Polynomial):
f(g,x)=g3−x=0f(g, x) = g^3 - x = 0
  • الخوارزمية تستخدم التقريب المتتالي (Successive Approximation):
next_guess=guess−f(guess)f′(guess)next\_guess = guess - \frac{f(guess)}{f'(guess)}
  • شيفرة جزئية من الخوارزمية تأخذ المدخلات وتجد التخمين التالي:
# Try Newton Raphson for cube root
x = int(input('What x to find the cube root of? '))
g = int(input('What guess to start with? '))
print('Current estimate cubed = ', g**3)
next_g = g - ((g**3 - x)/(3*g**2))
print('Next guess to try = ', next_g)

الشريحة 27: سلاسل f (F-STRINGS)

  • متاحة منذ بايثون 3.6.
  • محرف f يتبعه سلسلة نصية منسّقة (Formatted String Literal).
  • يقبل أي شيء يمكن أن يظهر في سلسلة نصية عادية.
  • تُحاط التعبيرات بأقواس معقوفة { }.
  • التعبيرات داخل الأقواس المعقوفة تُقيَّم وقت التشغيل (Runtime)، وتُحوَّل تلقائيًا إلى سلاسل نصية، وتُدمج مع السلسلة التي تسبقها:
num = 3000
fraction = 1/3
print(num*fraction, 'is', fraction*100, '% of', num)
print(num*fraction, 'is', str(fraction*100) + '% of', num)
print(f'{num*fraction} is {fraction*100}% of {num}')

الشريحة 28: الفكرة الكبرى

يمكن وضع التعابير في أي مكان، وبايثون تقيّمها!

الشريحة 29: شروط التفريع (CONDITIONS for BRANCHING)

(CONDITIONS for BRANCHING)

الشريحة 30: ربط المتغيّرات بالقيم، واختبار المساواة

  • في علوم الحاسوب، هناك مفهومان مختلفان للتساوي:
    • الإسناد (Assignment).
    • اختبار المساواة (Equality Test).
الصيغة المعنى
variable = value غيّر القيمة المخزَّنة في المتغيّر إلى value. لا شيء لنا لنحلّه، الحاسوب فقط يفعل الفعل.
some_expression == other_expression اختبار تساوٍ. لا يحدث ربط. يُستبدل التعبيران بالقيمتين والحاسوب يفرّق بينهما فقط. يستبدل السطر كله بـ True أو False.

الشريحة 31: عوامل المقارنة (COMPARISON OPERATORS)

  • i وj أسماء متغيّرات.
  • يمكن أن تكون من نوع int أو float أو سلاسل نصية، إلخ.
  • المقارنات التالية تُقيَّم إلى النوع البولياني (Boolean).
  • النوع البولياني له قيمتان فقط: True وFalse.
العامل المعنى
i > j أكبر من
i >= j أكبر من أو يساوي
i < j أصغر من
i <= j أصغر من أو يساوي
i == j اختبار التساوي، True إذا كان i هو نفسه j
i != j اختبار عدم التساوي، True إذا كان i ليس نفسه j

الشريحة 32: العوامل المنطقية على bool

  • a وb أسماء متغيّرات (بقيم بوليانية).
  • not a ← True إذا كان a هو False، وFalse إذا كان a هو True.
  • a and b ← True إذا كان كلاهما True.
  • a or b ← True إذا كان أحدهما أو كلاهما True.
A B A and B A or B
True True True True
True False False True
False True False True
False False False False

الشريحة 33: مثال على المقارنة

pset_time = 15
sleep_time = 8

print(sleep_time > pset_time)
derive = True
drink = False

both = drink and derive
print(both)
المتغيّر القيمة
pset_time 15
sleep_time 8
derive True
drink False
both False

الشريحة 34: جرّب بنفسك!

  • اكتب برنامجًا:
    • يحفظ عددًا سريًّا في متغيّر.
    • يطلب من المستخدم تخمينًا.
    • يطبع قيمة بوليانية False أو True حسب ما إذا كان التخمين يطابق العدد السري.

الشريحة 35: لماذا bool؟

  • عندما نصل إلى تدفّق التحكم (Flow of Control)، أي التفريع إلى تعابير مختلفة حسب القيم، نحتاج طريقة لمعرفة ما إذا كان الشرط صحيحًا.
  • مثال: إذا كان شيء ما صحيحًا، فافعل هذا، وإلا فافعل ذاك.

الشريحة 36: الخوارزميات الممتعة تنطوي على قرارات

  • الساعة منتصف الليل:
    • هل وصل بريد «طعام مجاني»؟ → انهبض واذهب تجلبه!
    • وإلا → نَم.

الشريحة 37: مخطط التفريع

  • إذا كان اليمين خاليًا، فاذهب يمينًا.
  • إذا كان اليمين مسدودًا والأمام خالًا، فاذهب يسارًا.
  • إذا كان اليمين مسدودًا، فاذهب إلى الأمام.
  • إذا كان اليمين والأمام واليسار مسدودة، فارجع للخلف.

الشريحة 38: التفريع في بايثون

if <condition>:
    <code>
    <code>
    ...
<rest of program>
  • لـ<condition> قيمة True أو False.
  • المسافة البادئة (Indentation) مهمة في بايثون!
  • نفّذ الشيفرة داخل كتلة if إذا كان الشرط True.

الشريحة 39: التفريع في بايثون — else

if <condition>:
    <code>
    <code>
    ...
else:
    <expression>
    <expression>
    ...
<rest of program>
  • لـ<condition> قيمة True أو False.
  • المسافة البادئة مهمة في بايثون!
  • نفّذ الشيفرة داخل كتلة if عندما يكون الشرط True، أو الشيفرة داخل كتلة else عندما يكون الشرط False.

الشريحة 40: التفريع في بايثون — elif

if <condition>:
    <code>
    <code>
    ...
<rest of program>

if <condition>:
    <code>
    <code>
    ...
else:
    <code>
    <code>
    ...
<rest of program>

if <condition>:
    <code>
    <code>
    ...
elif <condition>:
    <code>
    <code>
    ...
elif <condition>:
    <code>
    <code>
    ...
<rest of program>
  • لـ<condition> قيمة True أو False.
  • المسافة البادئة مهمة في بايثون!
  • شغّل الكتلة الأولى التي يقابلها شرط قيمته True.

الشريحة 41: التفريع في بايثون — else في النهاية

if <condition>:
    <code>
    <code>
    ...
elif <condition>:
    <code>
    <code>
    ...
else:
    <code>
    <code>
    ...
<rest of program>
  • لـ<condition> قيمة True أو False.
  • المسافة البادئة مهمة في بايثون!
  • شغّل الكتلة الأولى التي يقابلها شرط قيمته True. وتُشغَّل كتلة else عندما لا يكون أي شرط True.

الشريحة 42: مثال على التفريع

pset_time = ???
sleep_time = ???

if (pset_time + sleep_time) > 24:
    print("impossible!")
elif (pset_time + sleep_time) >= 24:
    print("full schedule!")
else:
    leftover = abs(24-pset_time-sleep_time)
    print(leftover,"h of free time!")

print("end of day")

الشريحة 43: جرّب بنفسك!

  • البنية الدلالية تطابق البنية المرئية.
  • صحّح هذه الشيفرة المعطوبة (تلميح: فيها مسافة بادئة خاطئة!):
x = int(input("Enter a number for x: "))
y = int(input("Enter a different number for y: "))
if x == y:
print(x,"is the same as",y)
print("These are equal!")

الشريحة 44: المسافة البادئة والتفريع المتداخل (Nested Branching)

  • المسافة البادئة مهمة في بايثون.
  • هي الطريقة التي تدلّ بها على كتل الشيفرة.
x = float(input("Enter a number for x: "))
y = float(input("Enter a number for y: "))
if x == y:
    print("x and y are equal")
    if y != 0:
        print("therefore, x / y is", x/y)
    else:
        print("thanks!")
elif x < y:
    print("x is smaller")
else:
    print("y is smaller")
  • الشريحة تعرض هذا المقتطف نفسه ثلاث مرات، وبجانب كل فرع نتيجة الشرط المقابلة: True، ثم False، ثم True، مع القيم التي أدخلها المستخدم في كل مرة.

الشريحة 45: الفكرة الكبرى

  • التدريب يساعدك على بناء نموذج ذهني (Mental Model) لتتبّع الشيفرة.
  • المسافة البادئة تقوم بجزء كبير من العمل نيابةً عنك!

الشريحة 46: جرّب بنفسك!

  • ماذا يطبع هذا الشيفرة مع:
    • y = 2
    • y = 20
    • y = 11
  • وماذا لو تحوّل if x <= y: إلى elif x <= y:؟
answer = ''
x = 11
if x == y:
    answer = answer + 'M'
if x >= y:
    answer = answer + 'i'
else:
    answer = answer + 'T'
print(answer)

الشريحة 47: جرّب بنفسك!

  • اكتب برنامجًا:
    • يحفظ عددًا سريًّا.
    • يطلب من المستخدم تخمينًا.
    • يطبع ما إذا كان التخمين أقل من اللازم، أو أكبر من اللازم، أو مساويًا للعدد السري.

الشريحة 48: الفكرة الكبرى

  • صحّح الأخطاء مبكرًا، وصحّحها كثيرًا.
  • اكتب قليلًا واختبر قليلًا.
  • لا تكتب برنامجًا كاملًا دفعة واحدة، فهذا يقدّم أخطاء كثيرة.
  • استخدم Python Tutor لتنفّذ الشيفرة خطوة بخطوة عندما ترى شيئًا غير متوقّع!

الشريحة 49: ملخص

  • السلاسل النصية (Strings) توفّر نوع بيانات جديدًا:
    • وهي تسلسلات من المحارف، أول محرف عند الفهرس 0.
    • ويمكن فهرستها وتقطيعها.
  • الإدخال (Input):
    • يتم بالأمر input.
    • كل ما يدخله المستخدم يُقرأ على أنه كائن سلسلة نصية!
  • الإخراج (Output):
    • يتم بالأمر print.
    • لا تظهر في الصدفة (Shell) إلا الكائنات التي تُطبع في ملف شيفرة .py.
  • التفريع (Branching):
    • تنفّذ البرامج كتل الشيفرة عندما تكون الشروط صحيحة.
    • في بنية if-elif-elif…، يُنفَّذ أول شرط قيمته True.
    • المسافة البادئة مهمة في بايثون!

الشريحة 50: بيانات MIT OpenCourseWare

MIT OpenCourseWare — https://ocw.mit.edu

6.100L: مقدمة في علوم الحاسوب والبرمجة باستخدام Python.

خريف 2022.

للحصول على معلومات عن الاستشهاد بهذه المواد أو شروط استخدامها، تفضّل بزيارة https://ocw.mit.edu/terms.