الفصل الثالث: أساسيات الكتابة البرمجية في بايثون
مقدمة الفصل
في هذا الفصل، سندخل إلى قلب اللغة نفسها ونضع حجر الأساس الذي ستبني عليه كل معرفتك القادمة. سنتعلم القواعد الأساسية لكتابة الكود، وكيفية التعامل مع البيانات، وتنفيذ العمليات الأساسية.
ما هي “البنية” (Syntax) في البرمجة؟
في أي لغة بشرية، هناك قواعد نحوية تحدد كيف نركب الكلمات لنكون جملة مفهومة. في البرمجة، تسمى هذه القواعد البنية (Syntax). إنها مجموعة القواعد التي تحكم كيف يجب كتابة الأكواد بشكل صحيح. إذا خالفت هذه القواعد، فلن يفهم الحاسوب ما تريد، وسيظهر لك خطأ بنائي (Syntax Error).
1. التعليقات: ملاحظاتك الخاصة داخل الكود
التعليق هو ملاحظة تكتبها لنفسك أو للمبرمجين الآخرين داخل الكود لتوضيح ما يفعله جزء معين. مترجم بايثون يتجاهل التعليقات تمامًا ولا يقوم بتنفيذها. تبدأ التعليقات في بايثون برمز المربع (#
).
# هذا تعليق. سيتم تجاهله بالكامل.
# أستخدم التعليقات لتذكير نفسي بوظيفة الكود أدناه.
عادة برمجية جيدة: اعتد على كتابة تعليقات واضحة. هو شيء اختياري لكنه مهم أكثر مما تتصور في المشاريع الكبيرة.
2. أول أمر لك: الطباعة على الشاشة (print
)
أبسط مهمة هي عرض رسالة على الشاشة. نستخدم لهذا الغرض دالة (Function) بايثون المدمجة print()
. الدالة هي أمر جاهز يؤدي مهمة محددة. ولكي نستخدمها، يجب أن نستدعيها (Call) بذكر اسمها متبوعًا بقوسين.
# استدعاء دالة print لطباعة نص على الشاشة
print("أهلاً بك في عالم بايثون!")
ما نضعه بين القوسين يسمى معامل (Argument). في هذا المثال، مررنا نصًا كمعامل للدالة print
.
🎯 مشروعنا المصغر: حاسبة تكلفة الرحلة سنقوم ببناء برنامج صغير على مدار هذا الفصل. لنبدأ بالخطوة الأولى:
# الخطوة الأولى في مشروعنا: طباعة رسالة ترحيب
print("--- مرحباً بك في حاسبة تكلفة الرحلة ---")
3. جوهر البرامج: القيم والمتغيرات
كل البرامج، مهما كانت معقدة، تتعامل مع البيانات. هذه البيانات تسمى في البرمجة القيم (Values).
ما هي القيمة (Value)؟
القيمة هي البيانات الحقيقية أو المواد الخام التي يعمل عليها برنامجك.
"أحمد" # هذه قيمة من نوع نص (String)
25 # هذه قيمة من نوع عدد صحيح (Integer)
3.14 # هذه قيمة من نوع عدد عشري (Float)
True # هذه قيمة من نوع منطقي (Boolean)
💡 فكر في القيمة كقطعة خشب أو قطعة حديد في مصنع — لا يمكن بناء أي شيء بدونها!
ما هو المتغير (Variable)؟
المشكلة: إذا كانت لدينا قيمة، كيف نحتفظ بها لنستخدمها مرارًا وتكرارًا في برنامجنا؟
الحل: نستخدم المتغيرات. المتغير ليس هو القيمة نفسها، بل هو اسم تختاره ليمثل مكانًا في ذاكرة الحاسوب حيث يتم تخزين القيمة. أنت تختار الاسم، وبايثون تتكفل بتخزينه في الذاكرة.
الصيغة الأساسية لإنشاء متغير هي:
اسم_المتغير = القيمة
# age هو المتغير، و 27 هي القيمة
age = 27
# message هو المتغير، و "انطلق" هي القيمة
message = "انطلق"
الجانب | القيمة (Value) | المتغير (Variable) |
---|---|---|
ما هو؟ | بيانات فعلية (رقم، نص، إلخ) | اسم للإشارة إلى قيمة مخزنة |
هل يتغير؟ | القيمة نفسها ثابتة (الرقم 5 هو دائمًا 5) | نعم، يمكن تغيير المتغير ليشير إلى قيمة أخرى |
مثال | "سلام" |
welcome_message |
الوظيفة | هي البيانات الخام نفسها | تخزين وتسهيل الوصول إلى البيانات |
⚠️ انتبه: في البرمجة، الرمز
=
يسمى عامل الإسناد (Assignment Operator) ويُستخدم لوضع قيمة داخل متغير. أما إذا أردنا المقارنة (هل س يساوي ص؟)، فنستخدم الرمز==
. سنتطرق لهذا لاحقًا.
4. التفاعل مع المستخدم (input
)
البرامج القوية تتفاعل مع المستخدم. نستخدم لهذا دالة input()
، وهي دالة مدمجة أخرى تسمح للمستخدم بإدخال بيانات من لوحة المفاتيح.
ملاحظة هامة: دالة input()
تعيد دائمًا القيمة التي أدخلها المستخدم على شكل نص (string)، حتى لو أدخل المستخدم أرقامًا.
🎯 تحديث المشروع: لنسأل المستخدم عن اسمه ووجهته ونخزن الإجابات في متغيرات.
# سؤال المستخدم عن المعلومات وتخزينها
traveler_name = input("ما هو اسمك؟ ")
destination = input("إلى أين وجهتك؟ ")
5. معالجة البيانات
لدينا الآن بيانات، حان الوقت لمعالجتها.
أ. العمليات الحسابية الأساسية
يمكنك إجراء العمليات الحسابية في بايثون بسهولة كما في الآلة الحاسبة.
العملية | الرمز | مثال | الناتج |
---|---|---|---|
الجمع | + |
10 + 3 |
13 |
الطرح | - |
10 - 3 |
7 |
الضرب | * |
10 * 3 |
30 |
القسمة | / |
10 / 3 |
3.333... |
الأس | ** |
10 ** 3 |
1000 |
باقي القسمة | % |
10 % 3 |
1 |
ب. أهمية تحويل الأنواع (Type Casting)
المشكلة: بما أن input()
تعيد نصًا، كيف يمكننا إجراء عملية حسابية على رقم أدخله المستخدم؟
الحل: يجب أن نحول (Cast) النص إلى نوع رقمي باستخدام int()
(لعدد صحيح) أو float()
(لعدد عشري).
🎯 تحديث المشروع: لنسأل عن التكاليف، نحولها إلى أرقام، ثم نحسب المجموع.
# أخذ المدخلات الرقمية (تكون كنصوص في البداية)
ticket_cost_str = input("كم تكلفة تذكرة الطيران؟ ")
hotel_cost_str = input("كم تكلفة الفندق؟ ")
# تحويل النصوص إلى أرقام عشرية (float)
ticket_cost = float(ticket_cost_str)
hotel_cost = float(hotel_cost_str)
# إجراء عملية الجمع
total_cost = ticket_cost + hotel_cost
6. تجميع كل شيء وعرض النتائج
بعد أن جمعنا البيانات وعالجناها، نحتاج إلى عرض ملخص منظم للمستخدم.
تنسيق المخرجات: طباعة المتغيرات مع النصوص
المشكلة: كيف ندمج قيم متغيراتنا داخل جملة مفيدة؟
الحل: الطريقة الأفضل والأحدث هي f-string. فقط ضع حرف f
قبل علامة التنصيص، ثم ضع اسم المتغير بين قوسي مجموعة {}
.
🎯 المشروع النهائي: حاسبة تكلفة الرحلة لنجمع كل الأجزاء معًا ونطبع الملخص النهائي.
# --- البرنامج الكامل ---
# 1. الترحيب وجمع البيانات
print("--- مرحباً بك في حاسبة تكلفة الرحلة ---")
traveler_name = input("ما هو اسمك؟ ")
destination = input("إلى أين وجهتك؟ ")
# 2. رسالة ترحيب مخصصة
print(f"أهلاً بك يا {traveler_name}! لنحسب تكلفة رحلتك إلى {destination}.")
print("-" * 40) # طباعة خط فاصل للترتيب
# 3. جمع التكاليف وتحويل الأنواع
ticket_cost_str = input("كم تكلفة تذكرة الطيران؟ ")
hotel_cost_str = input("كم تكلفة الفندق؟ ")
ticket_cost = float(ticket_cost_str)
hotel_cost = float(hotel_cost_str)
# 4. إجراء الحسابات
total_cost = ticket_cost + hotel_cost
# 5. عرض الملخص النهائي باستخدام f-string
print("\n--- ملخص رحلتك ---")
print(f"الوجهة: {destination}")
print(f"التكلفة الإجمالية للرحلة: ${total_cost:.2f}") # .2f تعني عرض رقمين فقط بعد الفاصلة
طرق أخرى لتنسيق النصوص (للمعرفة)
قد تصادف هذه الطرق في الأكواد القديمة، ومن الجيد معرفتها.
- دمج النصوص باستخدام
+
:print("مرحباً يا " + traveler_name)
(تعمل فقط مع النصوص). - استخدام دالة
.format()
:print("مرحباً يا {}, وجهتك هي {}".format(traveler_name, destination))
- الطباعة باستخدام الفاصلة
,
:print("مرحباً يا", traveler_name)
(تضيف مسافة تلقائياً).
7. خيارات متقدمة لدالة print()
-
تغيير الفاصل الافتراضي (
sep
):print("أحمد", "علي", "سالم", sep=" - ")
الناتج:أحمد - علي - سالم
-
تغيير نهاية السطر (
end
):print("الجزء الأول...", end=" ")
print("الجزء الثاني.")
الناتج:الجزء الأول... الجزء الثاني.
تمارين تطبيقية
التمرين 1: طباعة منسقة
المطلوب: اكتب كودًا يستخدم دالة print()
مرة واحدة فقط لطباعة السطر التالي تمامًا كما هو، باستخدام المعامل sep
.
الناتج المطلوب:
Python-is-fun
الحل:
# نستخدم المعامل sep لتحديد "-" كفاصل بين القيم
print("Python", "is", "fun", sep="-")
التمرين 2: محول الدقائق
المطلوب: اكتب برنامجًا يسأل المستخدم عن عدد إجمالي من الدقائق، ثم يقوم البرنامج بتحويلها إلى ساعات ودقائق متبقية. على سبيل المثال، إذا أدخل المستخدم 140
، يجب أن يكون الناتج “140 دقيقة تساوي 2 ساعة و 20 دقيقة”.
الحل:
# سؤال المستخدم عن عدد الدقائق
minutes_str = input("أدخل العدد الإجمالي للدقائق: ")
# تحويل المدخل إلى عدد صحيح
total_minutes = int(minutes_str)
# حساب الساعات (باستخدام القسمة الصحيحة //)
hours = total_minutes // 60
# حساب الدقائق المتبقية (باستخدام باقي القسمة %)
remaining_minutes = total_minutes % 60
# طباعة الناتج باستخدام f-string
print(f"{total_minutes} دقيقة تساوي {hours} ساعة و {remaining_minutes} دقيقة.")
التمرين 3: حاسبة مساحة المربع
المطلوب: اكتب برنامجًا يسأل المستخدم عن طول ضلع مربع. ثم يقوم البرنامج بحساب مساحة المربع (الضلع²
) باستخدام عامل الأس (**
) ويطبع الناتج.
الحل:
# سؤال المستخدم عن طول الضلع
side_length_str = input("أدخل طول ضلع المربع: ")
# تحويل القيمة إلى عدد عشري
side_length = float(side_length_str)
# حساب المساحة باستخدام عامل الأس **
area = side_length ** 2
# طباعة الناتج
print(f"مساحة المربع الذي طول ضلعه {side_length} هي {area}.")
التمرين 4: مولد رمز المنتج
المطلوب: اكتب برنامجًا يسأل المستخدم عن اسم منتج (نص) ورقمه التعريفي (رقم). قم بإنشاء رمز للمنتج عن طريق دمج الاسم مع الرقم وبينهما شرطة، باستخدام عملية الدمج +
فقط. (مثال: “Screen” و 101
يصبح “Screen-101”).
الحل:
# أخذ المدخلات من المستخدم
product_name = input("أدخل اسم المنتج: ")
product_id_str = input("أدخل الرقم التعريفي للمنتج: ")
# تحويل الرقم التعريفي إلى نص لاستخدام عملية الدمج
product_id_as_str = str(product_id_str)
# دمج النصوص باستخدام +
product_code = product_name + "-" + product_id_as_str
print(f"رمز المنتج هو: {product_code}")
التمرين 5: استخدام .format()
مع الفهرسة
المطلوب: اكتب برنامجًا يسأل المستخدم عن اسمه الأول واسم عائلته. باستخدام دالة .format()
والفهرسة ({0}
و {1}
)، اطبع الجملة التالية: “عائلتك هي [اسم العائلة] واسمك الأول هو [الاسم الأول]”.
الحل:
# سؤال المستخدم
first_name = input("أدخل اسمك الأول: ")
last_name = input("أدخل اسم عائلتك: ")
# استخدام .format() مع تحديد ترتيب المتغيرات بالفهرس
output_sentence = "عائلتك هي {1} واسمك الأول هو {0}.".format(first_name, last_name)
print(output_sentence)
التمرين 6: حاسبة فاتورة المطعم
المطلوب: اكتب برنامجًا يسأل المستخدم عن إجمالي الفاتورة. قم بحساب قيمة الإكرامية (بقشيش) بنسبة 18% من قيمة الفاتورة. ثم اطبع قيمة الفاتورة، وقيمة الإكرامية، والإجمالي النهائي، مع تنسيق جميع الأرقام لتظهر برقمين فقط بعد الفاصلة العشرية.
الحل:
# سؤال المستخدم عن إجمالي الفاتورة
bill_total_str = input("أدخل إجمالي قيمة الفاتورة: ")
# تحويل القيمة إلى عدد عشري
bill_total = float(bill_total_str)
# حساب الإكرامية (18%)
tip_amount = bill_total * 0.18
# حساب الإجمالي النهائي
final_total = bill_total + tip_amount
# طباعة النتائج منسقة
print("\n--- تفاصيل الفاتورة ---")
print(f"المبلغ الأساسي: ${bill_total:.2f}")
print(f"قيمة الإكرامية (18%): ${tip_amount:.2f}")
print(f"الإجمالي للدفع: ${final_total:.2f}")
التمرين 7: توزيع المهام
المطلوب: اكتب برنامجًا لتوزيع عدد من المهام بالتساوي على فريق من الموظفين. اسأل المستخدم عن عدد المهام الكلي وعدد الموظفين. اطبع عدد المهام التي سيحصل عليها كل موظف، وعدد المهام المتبقية التي لا يمكن توزيعها بالتساوي.
الحل:
# أخذ المدخلات
total_tasks_str = input("أدخل العدد الكلي للمهام: ")
num_employees_str = input("أدخل عدد الموظفين: ")
# تحويل المدخلات إلى أرقام صحيحة
total_tasks = int(total_tasks_str)
num_employees = int(num_employees_str)
# حساب المهام لكل موظف (قسمة صحيحة)
tasks_per_employee = total_tasks // num_employees
# حساب المهام المتبقية (باقي القسمة)
remaining_tasks = total_tasks % num_employees
# طباعة النتائج
print(f"سيحصل كل موظف على {tasks_per_employee} مهمة.")
print(f"عدد المهام المتبقية هو {remaining_tasks} مهمة.")
التمرين 8: طباعة بدون سطر جديد
المطلوب: اكتب برنامجًا يطبع الأرقام من 1 إلى 3 على نفس السطر، مفصولة بفاصلة ومسافة، باستخدام ثلاث جمل print()
منفصلة والمعامل end
.
الناتج المطلوب:
1, 2, 3
الحل:
print("1", end=", ")
print("2", end=", ")
print("3")
التمرين 9: حاسبة الطاقة
المطلوب: اكتب برنامجًا يحسب الطاقة (E) بناءً على معادلة أينشتاين الشهيرة $E=mc^2$. اسأل المستخدم عن الكتلة (m) بالكيلوجرام. استخدم قيمة ثابتة لسرعة الضوء (c) وهي 299792458
متر/ثانية. اطبع الناتج.
الحل:
# تعريف ثابت سرعة الضوء
SPEED_OF_LIGHT = 299792458 # c
# سؤال المستخدم عن الكتلة
mass_str = input("أدخل قيمة الكتلة (m) بالكيلوجرام: ")
# تحويل الكتلة إلى عدد عشري
mass = float(mass_str)
# حساب الطاقة باستخدام المعادلة وعامل الأس **
energy = mass * (SPEED_OF_LIGHT ** 2) # E = mc^2
# طباعة الناتج النهائي
print(f"كمية الطاقة (E) الناتجة هي: {energy} جول.")
التمرين 10: مولد شعار الشركة
المطلوب: اكتب برنامجًا يسأل المستخدم عن اسم شركته وسنة تأسيسها. قم بإنشاء شعار (Slogan) للشركة بالصيغة التالية: “[اسم الشركة] - نخدمكم منذ عام [سنة التأسيس]”. اطبع هذا الشعار.
الحل:
# سؤال المستخدم عن اسم الشركة وسنة التأسيس
company_name = input("ما هو اسم شركتك؟ ")
foundation_year = input("في أي عام تأسست الشركة؟ ")
# إنشاء الشعار باستخدام f-string
slogan = f"{company_name} - نخدمكم منذ عام {foundation_year}."
# طباعة الشعار
print("\n--- شعار شركتكم المقترح ---")
print(slogan)
خلاصة الفصل
في هذا الفصل، تعلمت القواعد الأساسية التي لا غنى عنها لأي مبرمج:
- بنية الكود (Syntax): القواعد التي يجب اتباعها لكتابة كود صحيح.
- التعليقات (
#
): أهمية توثيق الكود لمساعدتك ومساعدة الآخرين. - القيم والمتغيرات: كيفية تخزين البيانات في متغيرات للإشارة إلى قيم.
- المدخلات والمخرجات: كيفية التفاعل مع المستخدم باستخدام
input()
وprint()
. - العمليات الأساسية: إجراء العمليات الحسابية وتحويل أنواع البيانات.
- تنسيق النصوص: عرض المخرجات بطريقة منظمة باستخدام
f-string
.