تعلّم البرمجة بلغة كوتلن (10): مرحبًا بالعالم !Hello, World

تعلّم البرمجة بلغة كوتلن (10): مرحبًا بالعالم !Hello, World
أستمع الى المقال

قمنا في درس سابق بتنفيذ أول برنامج كوتلن عبر واجهة سطر الأوامر، يطبع لنا كلمتي Hello World. ثم قمنا بتحميل وتثبيت بيئة تطوير متكاملة، ونفذنا البرنامج مرة أخرى باستخدام بيئة التطوير. ولكن في الحالتين، لم نشرح ماذا تعني الشفرة التي استخدمناها لطباعة الكلمتين. في هذا الدرس، سنشرح ماذا تعني شفرة برنامجنا الأول عبر كوتلن، والذي يطبع “!Hello، World”. 

على الرغم من أن البرنامج نفسه بسيط للغاية، إلا أنه لا يزال برنامجًا يعمل ويظهر التركيب الأساسي للغة البرمجة. طباعة كلمتي مرحبًا بالعالم Hello World، تعد هي الخطوة الأولى المعتادة في طريق تعلم المبتدئين أي لغة برمجة.

الوظيفة أو الدالة الأولى First Fun:

دعونا نطّلع على شفرة لبرنامج كوتلن فارغ لايقوم بفعل أي شيء:

بتشريح الشفرة أعلاه، سنجد أنها تتكون من كلمات ورموز. لدى كوتلن مثل باقي لغات البرمجة، الكثير من الكلمات المفتاحية Keywords الخاصة بها. من هذه الكلمات كلمة fun وهي اختصار لكلمة Function والتي تعني وظيفة أو دالة. نستخدم كلمة fun في كوتلن، حينما نريد أن نعلن عن كتلة block من التعليمات البرمجية، تقوم بوظيفة محددة.

هذه الدالة لديها اسم، وهو في الدالة أعلاه ()main. لابد أن يتبع اسم الدالة قوسين ( )، هذين القوسين، يمكننا تركهما فارغين، أو يمكن أن نضع بهما قيمة معامل تسمى argumment لأن دالة الـ main يمكنها أن تستقبل قيمة لمعامل من نوع مصفوفة نستعملها عند الضرورة (تحدثنا عن المعاملات في فقرة أسفل هذا الدرس). ثم الأقواس المعقوفة { } لإعلان بداية ونهاية الكتلة البرمجية، لهذه الدالة.

 الدالة ()main، هي الدالة الرئيسية في برنامج كوتلن. لذا، سنضع الشفرة التي نريد تنفيذها، داخل الأقواس المعقوفة { } للدالة ()main. يتم استدعاء الدالة ()main تلقائيًا عند بدء تشغيل برنامج كوتلن. وإذا لم تكن موجودة فلن يعمل البرنامج من الأساس. ويجب أن نكتب اسم الدالة هذه بالحروف الإنجليزية الصغيرة فقط.

بجانب الدالة ()main، تملك كوتلن الكثير جدًا من الدوال التي تقوم بمهام مختلفة. حينما نريد القيام بمهمة معينة، مثل عملية طباعة كلمتين، يمكننا استدعاء invoke الدالة أو الدوال التي تقوم بذلك. عملية الاستدعاء هذه، تتم بكتابة اسم الدالة مع الأقواس، على النحو التالي:

()main

بكتابة السطر أعلاه، يمكننا استدعاء الدالة ()main. ولكن لأن الدالة ()main هي الدالة الرئيسية، فنحن لن نستدعيها لأن تشغيل البرنامج يبدأ منها، لذا سيتم استدعاءها تلقائيًا. ما سنقوم به، هو استدعاء الدوال التي نحتاجها داخل الدالة ()main.

بجانب الدوال التي تأتي مع اللغة، يمكننا أيضًا انشاء دوال خاصة بنا تقوم بالمهام التي نريدها منها ونستدعيها في دالة الـ ()main.

الإخراج القياسي Standard output:

الإخراج القياسي، هو عملية عرض المعلومات على شاشة الجهاز. في كوتلن تتولى هذه المهمة، دالتي الطباعة ()print و ()println. باستطاعة الدالتين طباعة (إخراج معلومات على الشاشة) كل أنواع البيانات التي نرسلها، مثل الأعداد بأنواعها والعبارات النصية والحروف المنفردة وغيرها. إذًا، كيف تعمل الدالتان؟

دوال الطباعة ()print و ()println:

حينما نريد أن نكتب برنامج يطبع كلمتي !Hello World، سنستدعي داخل أقواس الـ ()main المعقوفة، دالة تقوم بطباعة print لهاتين الكلمتين على الشاشة. هناك دالتان جاهزتان في لغة كوتلن تقومان بذلك، هما ()print و ()println. وهما خلاف دالة الـ ()main، نحتاج استدعائهما فقط ولا نحتاج تعديل الشفرة التي بداخلهما.

الفرق بين ()print و ()println:

أي من الدالتين ستقوم بالعمل المطلوب، ألا وهو طباعة النص المرسل إليهما. مع الفرق أن دالة ()println تقوم بطباعة سطر جديد بعد طباعة النص الذي تم تمريره لها. ولتوضيح الصورة عمليًا، فلننظر إلى الصورة التالية:

كما نرى في الصورة، عندما استخدمنا دالة الـ ()print لطباعة النص مرتين، تم طباعته في نفس السطر. ولكن عند استخدام دالة الـ ()println، يتم طباعة النص في سطر جديد، كما يظهر في الصورة التالية:

فرق آخر مهم وهو، عند استدعاء دالة الـ ()print، يجب علينا وضع قيمة معامل argumment بين القوسين، لأن الدالة لديها معامل Parameter اجباري وإلا سيحدث خطأ. وسينبهنا برنامج IntelliJ، بوجود هذا الخطأ:

هنا البرنامج يخبرنا بأنه، لا يوجد دالة ()print بدون معامل.مما يعني، أنه يجب وضع القيمة لهذا المعامل داخل أقواس هذه الدالة عند استدعاءها. أما دالة الـ ()println، فالمعامل اختياري، إذا لم نضع له قيمة argument، ستطبع سطر جديد فارغ وينتهي عملها.

المعاملات parametres:

حينما نقوم بإنشاء دالة ما، يجب أن نفكر هل ستحتاج هذه الدالة إلى معلومات إضافية عند استدعاءها للقيام بعملها؟ إذا كانت الإجابة نعم، علينا إذًا جعل الدالة تستقبل متغير Variable يسمى معامل Parameter، ويجب على من يستدعيها إدخال قيمة لهذا المعامل argument بين قوسين بعد اسم الدالة.

أما إذا كانت الدالة يمكنها القيام بعملها بوجود المعامل أو بغيره، هنا نستطيع وضع معامل اختياري، ونترك الخيار لمن يستدعي الدالة، أن يضع قيمة تناسب هذا المعامل أو يترك القوسين فارغين.

وفي حالة عدم احتياج الدالة إلى معامل نترك القوسين فارغين، ومن يستدعي الدالة يجب عليه عدم وضع أي قيمة، فقط يترك القوسين فارغين. المزيد عن المعاملات Parameters وقيمها arguments في درس الدوال Functions.

عند اختيار وضع المعامل للدالة، يجب علينا تحديد نوع هذا المعامل. كما قلنا سابقًا، تم تصميم دالة ()println، لتستقبل معامل parameter واحد اختياري. في واقع الأمر، في لغة كوتلن هناك عدة دوال ()println تستقبل كل واحدة منها نوع واحد من المعاملات. نحن هنا سنستدعي الدالة التي تستقبل معامل نوعه نصي. أي سلسلة من المحارف characters توضع بين علامتي تنصيص ( ” ” ). سلسلة المحارف هذه، تسمى String في لغة كوتلن.

شرحنا تفصيليًا السلاسل النصية String وغيرها من أنواع البيانات في درس أنواع البيانات.

طباعة مرحبًا بالعالم Hello, World:

نحن هنا، سنستخدم دالة الـ ()println. كل ما سنقوم به هو إرسال الكلمتين كقيمة argument لمعاملها، بوضعهما بين علامتي تنصيص داخل أقواس الدالة حين استدعائها. على النحو التالي:

سنعود إلى دالة الـ ()main أعلاه ونعدل عليها، كالتالي:

وعند تنفيذ هذا البرنامج، سينتج لنا كلمتي !Hello, world.

الإدخال القياسي Standard Input:

بعد أن فهمنا كيفية عمل دالتي الطباعة في إخراج وطباعة بيانات (مثل جملة “!Hello, world”) على شاشة الجهاز، سنتعرف الآن على كيف يمكن للمستخدم إدخال بيانات إلى برنامجنا. ويمكن للمستخدم إدخال هذه البيانات، عبر استخدام لوحة المفاتيح فيما يعرف بالإدخال القياسي.

دالة قراءة مدخلات المستخدم ()readln:

توفر كوتلن دالة ()readln لقراءة مدخلات المستخدم. وتقوم هذه الدالة، بقراءة كامل السطر. فمثلًا، إذا كان لدينا البرنامج التالي:

وضعنا دالة ()readln داخل دالة ()println. والآن عند تنفيذ هذه الشفرة بالضغط على الزر الأخضر في برنامج IntelliJ، ستفتح نافذة Run كالتالي:

كما نرى في الصورة، لم تطبع دالة ()println أي شئ في تبويب Run. ويظهر خط عمودي يتحرك، للدلالة على أنه ينتظر إدخال بينات. وهذا يحدث لأن تنفيذ دالة ()readln لم ينتهي بعد، ﻷنها في إنتظار أن يدخل المستخدم البيانات. يمكننا كتابة نفس الجملة السابقة “!Hello, world” بدون علامات التنصيص، والضغط على Enter من لوحة المفاتيح كالتالي:

ما كتبناه يظهر باللون الأخضر، وبعد الضغط على Enter، ستقوم دالة ()readln بقراءة كامل السطر وإرساله إلى دالة ()println. بعدها ستقوم دالة الطباعة، بطباعة الجملة النصية التي تظهر باللون الأبيض.

استقبال مدخلات الأعداد:

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

كتبنا دالتين ()readln داخل دالة ()println، وجمعنا بينهما بعلامة الجمع (+). ثم ادخلنا الرقمين 1 و 1. دالة ()readln الأولى ستقرأ الرقم الأول والثانية ستقرأ الرقم الثاني. ولكن عند الجمع بينهما، كانت النتيجة 11. وهذا ما طبعته لنا دالة الطباعة.

بالطبع النتيجة غير صحيحة، ﻷن 1 + 1 = 2 وليس 11، فكيف حدث هذا؟ هذا حدث ﻷن دالتي قراءة الإدخال قرأتا العددين كنص هكذا: “1” و “1”. هذه تعتبر نصوص في كوتلن وليست أرقام. وجمع النصوص يكون بإضافتها لبعضها لتكون جملة.

إذًا، كيف يمكننا استقبال أعداد من المستخدم بحيث يمكننا إجراء عمليات حسابية عادية عليها كعملية الجمع مثلًا؟

دالة ()toInt:

لفعل ذلك، يمكننا استخدام دوال مساعدة من مكتبة كوتلن القياسية. مثل دالة ()toInt والتي ستحول النصوص إلى أعداد صحيحة Integers، إذا كان النص بالفعل يحتوي على أعداد صحيحة، كالتالي:

قامت دالة ()toInt بتحويل القيمة النصية للمدخلات، إلى أعداد يمكن جمعها بطريقة صحيحة. ولكن يجب الحذر عند استخدام هذه الدالة، ﻷنه إذا قام المستخدم بإدخال نص لا يُمثل عدد، عندها سيتحطم البرنامج منتجًا خطأً استثنائيًا، كالتالي:

ستعمل دالة ()toInt على تحويل المُدخل الأول بدون مشاكل. ولكن المشكلة حدثت عندما حاولت الدالة الثانية تحويل الحرف k إلى رقم. وﻷنه لا يمكن تحويل حرف إلى رقم عبر دالة ()toInt، تحطم البرنامج مظهرًا خطأ استثنائي كما نرى في الصورة. (سنتحدث عن الأخطاء الاستثنائية في درس الاستثناءات Exceptions).

هذا الدرس هو جزء من سلسلة تعليم مبادئ البرمجة بلغة كوتلن. لمُتابعة الدروس منذ البداية ومُشاهدة فهرس المحتويات يمكنك الانتقال إلى الدرس الأول من هنا.

هل أعجبك المحتوى وتريد المزيد منه يصل إلى صندوق بريدك الإلكتروني بشكلٍ دوري؟
انضم إلى قائمة من يقدّرون محتوى إكسڤار واشترك بنشرتنا البريدية.