المحاضرة 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 everystepcharacters).
- خذ المحارف من
- إذا أعطيت رقمين، أي
[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):
- الخوارزمية تستخدم التقريب المتتالي (Successive Approximation):
- شيفرة جزئية من الخوارزمية تأخذ المدخلات وتجد التخمين التالي:
# 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 = 2y = 20y = 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.