العمليات الحسابية
أهداف التعلّم
بعد إتمام هذا القسم
- ستكون قادرًا على استخدام المتغيّرات في عمليات حسابية متنوّعة
- ستعرف كيف تتعامل مع الأعداد في مُدخَل المستخدم
- ستعرف كيف تحوّل القيم إلى أنواع بيانات أساسية أخرى
لقد رأيت في الأقسام السابقة أمثلة على العمليات الحسابية الأساسية. وفي الجدول التالي ترى أكثر مشغّلات الحساب شيوعًا في Python، مع أمثلة:
| المشغّل | الغرض | المثال | النتيجة |
|---|---|---|---|
+ |
الجمع | 2 + 4 |
6 |
- |
الطرح | 10 - 2.5 |
7.5 |
* |
الضرب | -2 * 123 |
-246 |
/ |
القسمة (نتيجة عشرية) | 9 / 2 |
4.5 |
// |
القسمة (نتيجة صحيحة) | 9 // 2 |
4 |
% |
باقي القسمة | 9 % 2 |
1 |
** |
الأس | 2 ** 3 |
8 |
ترتيب العمليات مألوف من الرياضيات: أولًا تُحسب الأسس، ثمّ الضرب والقسمة، وأخيرًا الجمع والطرح. ويمكن تغيير هذا الترتيب بالأقواس.
فمثلًا هذه الشيفرة
print(2 + 3 * 3)
print((2 + 3) * 3)
تطبع
11
15
المُعاملات والمشغّلات وأنواع البيانات
تتكوّن العملية الحسابية عادةً من مُعاملات (operands) ومشغّلات (operators):

نوع بيانات المُعامل هو ما يحدّد عادةً نوع بيانات النتيجة: فإذا جُمِع عددان صحيحان، تكون النتيجة عددًا صحيحًا أيضًا. وإذا طرح عدد عشري من عدد عشري آخر، تكون النتيجة عددًا عشريًا. وفي الواقع، إذا كان أحد المُعاملات في تعبير ما عددًا عشريًا، تكون النتيجة عددًا عشريًا أيضًا، بغضّ النظر عن المُعاملات الأخرى.
القسمة / استثناء لهذه القاعدة. فناتجها عدد عشري، حتى لو كان المُعاملان عددين صحيحين. فمثلًا 1 / 5 ينتج العدد العشري 0.2.
مثال:
height = 172.5
weight = 68.55
# the Body Mass Index, or BMI, is calculated by dividing body mass with the square of height
# height is converted into metres in the formula
bmi = weight / (height / 100) ** 2
print(f"The BMI is {bmi}")
يطبع هذا البرنامج ما يلي:
The BMI is 23.037177063642087
لاحظ أن لدى Python أيضًا مشغّل قسمة الأعداد الصحيحة وهو //. فإذا كان المُعاملان عددين صحيحين، فسينتج عدد صحيح. وتُقرَّب النتيجة إلى أسفل إلى أقرب عدد صحيح. فمثلًا هذا البرنامج
x = 3
y = 2
print(f"/ operator {x/y}")
print(f"// operator {x//y}")
يطبع
/ operator 1.5
// operator 1
الأعداد كمُدخَل
لقد استخدمنا الأمر input من قبل لقراءة سلاسل نصية من المستخدم. ويمكن استخدام الدالة نفسها لقراءة الأعداد، لكن يجب عندئذٍ أن تُحوَّل السلسلة النصية التي تنتجها الدالة إلى نوع بيانات رقمي في شيفرة البرنامج. وفي القسم السابق حوّلنا الأعداد الصحيحة إلى سلاسل نصية بدالة str. والمبدأ الأساسي نفسه ينطبق هنا، لكن اسم دالة التحويل سيكون مختلفًا.
يمكن تحويل سلسلة نصية إلى عدد صحيح بالدالة int. يسأل البرنامج التالي المستخدم عن سنة ميلاده ويخزّنها في المتغيّر input_str. ثم ينشئ البرنامج متغيّرًا آخر هو year، ويحتوي على السنة محوَّلة إلى عدد صحيح. وبعد ذلك تصبح العملية الحسابية 2021-year ممكنة باستخدام القيمة التي قدّمها المستخدم.
input_str = input("Which year were you born? ")
year = int(input_str)
print(f"Your age at the end of the year 2021: {2021 - year}" )
Which year were you born? **1995**
Your age at the end of the year 2021: 26
عادةً لا تحتاج إلى إنشاء متغيّرَين منفصلَين (مثل input_str وyear أعلاه) لقراءة قيمة عددية من المستخدم. بل يمكن بدلًا من ذلك قراءة المُدخَل بالدالة input وتحويله بالدالة int في خطوة واحدة:
year = int(input("Which year were you born? "))
print(f"Your age at the end of the year 2021: {2021 - year}" )
وبالمثل، يمكن تحويل سلسلة نصية إلى عدد عشري بالدالة float. يسأل هذا البرنامج المستخدم عن طوله ووزنه، ويستخدمهما لحساب مؤشر كتلة الجسم:
height = float(input("What is your height? "))
weight = float(input("What is your weight? "))
height = height / 100
bmi = weight / height ** 2
print(f"The BMI is {bmi}")
مثال على مخرجات البرنامج:
What is your height? **163**
What is your weight? **74.45**
The BMI is 28.02137829801649
تمرين تفاعلي: الخمسة أضعاف
يُرجى كتابة برنامج يسأل المستخدم عن عدد. ثم يطبع البرنامج العدد مضروبًا في خمسة.
ينبغي أن يعمل البرنامج على النحو التالي:
Please type in a number: **3**
3 times 5 is 15
ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.
تمرين تفاعلي: الاسم والعمر
يُرجى كتابة برنامج يسأل المستخدم عن اسمه وسنة ميلاده. ثم يطبع البرنامج رسالة على النحو التالي:
What is your name? **Frances Fictitious**
Which year were you born? **1990**
Hi Frances Fictitious, you will be 31 years old at the end of the year 2021
ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.
استخدام المتغيّرات
لننظر إلى برنامج يحسب مجموع ثلاثة أعداد يعطيها المستخدم:
number1 = int(input("First number: "))
number2 = int(input("Second number: "))
number3 = int(input("Third number: "))
sum = number1 + number2 + number3
print(f"The sum of the numbers: {sum}")
مثال على تنفيذ البرنامج:
First number: **5**
Second number: **21**
Third number: **7**
The sum of the numbers: 33
يستخدم البرنامج أربعة متغيّرات مختلفة، لكن متغيّرَين يكفيان في هذه الحالة بسهولة:
sum = 0
number = int(input("First number: "))
sum = sum + number
number = int(input("Second number: "))
sum = sum + number
number = int(input("Third number: "))
sum = sum + number
print(f"The sum of the numbers: {sum}")
الآن تُقرأ كل المُدخَلات من المستخدم في المتغيّر نفسه number. وتُزاد قيمةُ المتغيّر sum بمقدار قيمة المتغيّر number في كل مرة يُدخل فيها المستخدم عددًا جديدًا.
لننظر عن كثب إلى هذا الأمر:
sum = sum + number
هنا تُجمع قيمة المتغيّر sum مع قيمة المتغيّر number، وتُخزَّن النتيجة من جديد في المتغيّر sum. فمثلًا، إذا كانت قيمة sum قبل الأمر هي 3 وقيمة number هي 2، فإن قيمة sum بعد تنفيذ الأمر تصبح 5.
زيادة قيمة متغيّر عملية شائعة جدًّا. ولهذا فهناك صيغة اختصار مستخدمة على نطاق واسع تُحقّق النتيجة نفسها التي يحقّقها الجمع الصريح أعلاه:
sum += number
وهذا يسمح لنا بكتابة البرنامج أعلاه بصورة أدقّ قليلًا:
sum = 0
number = int(input("First number: "))
sum += number
number = int(input("Second number: "))
sum += number
number = int(input("Third number: "))
sum += number
print(f"The sum of the numbers: {sum}")
وفي الواقع، لا نحتاج بالضرورة إلى المتغيّر number على الإطلاق. إذ يمكن أيضًا معالجة مُدخَلات المستخدم على النحو التالي:
sum = 0
sum += int(input("First number: "))
sum += int(input("Second number: "))
sum += int(input("Third number: "))
print(f"The sum of the numbers: {sum}")
وبالطبع، يعتمد عدد المتغيّرات المطلوبة على السياق. فإذا كان مطلوبًا تذكّر كل قيمة يُدخلها المستخدم، فلن يكون من الممكن "إعادة استخدام" المتغيّر نفسه لقراءة قيم مختلفة من المستخدم. تأمّل ما يلي:
number1 = int(input("First number: "))
number2 = int(input("Second number: "))
print(f"{number1} + {number2} = {number1+number2}")
First number: **2**
Second number: **3**
2 + 3 = 5
ومن جهة أخرى، لا يملك البرنامج أعلاه متغيّرًا مسمًّى لتخزين مجموع القيمتين.
لا معنى لـ"إعادة استخدام" متغيّر إلا عندما تكون هناك حاجة لتخزين أشياء مؤقتًا متقاربة في النوع والغرض، مثلًا عند جمع الأعداد.
في المثال التالي يُستخدم المتغيّر data أولًا لتخزين اسم المستخدم، ثم عمره. وهذا غير منطقي على الإطلاق.
data = input("What is your name? ")
print("Hi " + data + "!")
data = int(input("What is your age? "))
# program continues...
وفكرة أفضل هي استخدام متغيّرات منفصلة بأسماء وصفية:
name = input("What is your name? ")
print("Hi " + name + "!")
age = int(input("What is your age? "))
# program continues...
تمرين تفاعلي: الثواني في اليوم
يُرجى كتابة برنامج يسأل المستخدم عن عدد من الأيام. ثم يطبع البرنامج عدد الثواني في مقدار الأيام المُعطى.
ينبغي أن يعمل البرنامج على النحو التالي:
How many days? **1**
Seconds in that many days: 86400
مثال آخر:
How many days? **7**
Seconds in that many days: 604800
ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.
تمرين تفاعلي: إصلاح الشيفرة: الضرب
يسأل هذا البرنامج المستخدم عن ثلاثة أعداد. ثم يطبع البرنامج حاصل ضربها، أي الأعداد مضروبة في بعضها. لكن هناك خلل ما في البرنامج - فهو لا يعمل بشكل صحيح تمامًا، كما سترى إذا شغّلته. يُرجى إصلاحه.
مثال على التنفيذ المتوقّع للبرنامج:
Please type in the first number: **2**
Please type in the second number: **3**
Please type in the third number: **5**
The product is 30
ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.
تمرين تفاعلي: المجموع والمنتج
يُرجى كتابة برنامج يسأل المستخدم عن عددين. ثم يطبع البرنامج مجموع العددين وحاصل ضربهما.
ينبغي أن يعمل البرنامج على النحو التالي:
Number 1: **3**
Number 2: **7**
The sum of the numbers: 10
The product of the numbers: 21
ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.
تمرين تفاعلي: المجموع والمتوسط
يُرجى كتابة برنامج يسأل المستخدم عن أربعة أعداد. ثم يطبع البرنامج مجموع الأعداد ومتوسطها.
ينبغي أن يعمل البرنامج على النحو التالي:
Number 1: **2**
Number 2: **1**
Number 3: **6**
Number 4: **7**
The sum of the numbers is 16 and the mean is 4.0
ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.
تمرين تفاعلي: المصروف على الطعام
يُرجى كتابة برنامج يقدّر المصروف المعتاد لمستخدم على الطعام.
يسأل البرنامج المستخدم كم مرة في الأسبوع يتناول الطعام في مطعم الطلبة. ثم يسأل عن سعر وجبة غداء طلابية معتادة، وعن المال المُنفَق على المواد الغذائية خلال الأسبوع.
وبناءً على هذه المعلومات يحسب البرنامج مصروف المستخدم المعتاد على الطعام أسبوعيًّا ويوميًّا.
ينبغي أن يعمل البرنامج على النحو التالي:
How many times a week do you eat at the student cafeteria? **4**
The price of a typical student lunch? **2.5**
How much money do you spend on groceries in a week? **28.5**
Average food expenditure:
Daily: 5.5 euros
Weekly: 38.5 euros
ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.
تمرين تفاعلي: الطلاب في مجموعات
يُرجى كتابة برنامج يسأل عن عدد الطلاب في دورة ما وعن حجم المجموعة المطلوب. ثم يطبع البرنامج عدد المجموعات المتكوّنة من طلاب الدورة. وإذا لم تكن القسمة تامّة، فقد يكون إحدى المجموعات عدد أعضائها أقل من المُحدَّد.
إذا لم تستطع تشغيل شيفرتك على النحو المتوقّع، فالأمر مقبول تمامًا أن تتابع وتعود إلى هذا التمرين لاحقًا. وموضوع القسم التالي هو الجمل الشرطية. ويمكن أيضًا حلّ هذا التمرين باستخدام صيغة شرطية.
How many students on the course? **8**
Desired group size? **4**
Number of groups formed: 2
How many students on the course? **11**
Desired group size? **3**
Number of groups formed: 4
تلميح: قد يكون مشغّل قسمة الأعداد الصحيحة // مفيدًا هنا.
ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.