تعلّم البرمجة بلغة كوتلن (17): القيم المنطقية Booleans

تعلّم البرمجة بلغة كوتلن (17): القيم المنطقية Booleans
أستمع الى المقال

في سياق حديثنا عن التعبير الشرطي if، استعرضنا بطريقة مختصرة عوامل جبر بُول المنطقية Boolean Algebra. مثل، عامل النفي ويرمز له بـ (!) أو Not، وعامل العطف أو الوصل ويرمز له في البرمجة بـ (&&) أو and، وعامل الفصل ويرمز له في البرمجة بـ (||) أو or. للأهمية الكبيرة لهذه العوامل في إنشاء التطبيقات البرمجية، سنشرح في هذا الدرس استخدامات هذه العوامل بطريقة عملية أكثر، لضمان فهمها جيدًا.

عاملي جبر بُول (&&) و (||):

  • (&&) أو and: عند استخدام هذا العامل، يجب أن تكون نتيجة التعبير يمين هذا العامل والتعبير على يساره، القيمة true. كمثال: (3 < 5 && 5 > 3). 

التعبير الأول في المعادلة هو، أن 3 أصغر من 5، هذا صحيح والنتيجة true. والتعبير الثاني هو، أن 5 أكبر من 3، هذا أيضًا صحيح والنتيجة true. فإذا وضعنا هذه المعادلة في كتلة if مثلًا، سيتم تنفيذ الشفرة داخل الكتلة، لأن النتيجة true.

  • (||) أو or: عند استخدام هذا العامل، يكفي أن تكون نتيجة التعبير يمين هذا العامل أو التعبير على يساره، القيمة true. كمثال: (3 == 5 && 5 > 3).

التعبير الأول في المعادلة هو، أن 3 أصغر من 5، هذا صحيح والنتيجة true. والتعبير الثاني هو، أن 5 تساوي 3، هذا غير صحيح والنتيجة false. ولكن، إذا وضعنا هذه المعادلة في كتلة if، سيتم أيضًا تنفيذ الشفرة داخل الكتلة، لأن نتيجة أحد التعبيرين كانت true، غض النظر عن نتيجة التعبير الثاني.

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

برنامج لمعرفة ما إذا كان المتجر مفتوح:

سننشئ دالة نضع لها معامل Int يمثل الساعة (من 1 إلى 24). وعند استدعاء هذه الدالة، سنضع لها قيمة argument لمعاملها. لتقوم الدالة بإجراء حساب بسيط باستخدام العوامل المنطقية. فإذا كانت النتيجة true، ستطبع الدالة الجملة:

 “Store is open: true”

 مباشرة باستخدام دالة الطباعة ()println. أما إذا كانت النتيجة false، فستقوم بطباعة:

 “Store is open: false”

كالتالي:

داخل الدالة، أعلنا عن متغير openTime يُمثل ساعة فتح المتجر وهي التاسعة صباحًا، ومتغير closeTime يُمثل ساعة الإغلاق العاشرة مساءً. ثم متغير ثالث status لحفظ القيمة التي ستعود من كتلة if الشرطية.

في كتلة if، إذا كانت الساعة التي تم إرسالها للدالة أكبر من أو تساوي قيمة المتغير openTime و نفس الوقت كانت الساعة أصغر من أو تساوي قيمة المتغير closeTime، سنحفظ في المتغير status القيمة true. أما غير ذلك، سنحفظ في المتغير status القيمة false. بعدها تطبع الدالة الجملة السابقة مرفقة بقيمة المتغير status أيًا كانت، بنفس طريقة القوالب النصية في كوتلن.

استدعاء دالة ()isOpen في دالة ()main كـ Single-expression:

إذا أردنا أن نعرف ما إذا كان المتجر يعمل في الساعة 10 صباحًا مثلًا، كل ما علينا هو استدعاء الدالة ()isOpen من الدالة ()main، ووضع القيمة 10 كقيمة لمعاملها. وﻷن دالة ()isOpen تقوم بكل العمل الذي نريده، لذا يمكننا استدعاؤها من دالة ()main بطريقة الـ Single-expression كما شرحناها في درس الدوال، كالتالي:

عند تنفيذ هذا البرنامج، سيطبع لنا الجملة: “Store is open: true”. وهذا لأن الدالة وجدت أن 10 تقع ضمن النطاق 9 – 22 الذي وضعناه كشرط لإعادة القيمة true. أما إذا وضعنا الساعة 8 مثلًا:

ستطبع الدالة الجملة: “Store is open: false”، ﻷن 8 لا تحقق شرط كتلة if لذا أعادة الدالة القيمة false.

برنامج لمعرفة ما إذا كان المتجر مغلق:

سننشئ دالة أخرى باسم isClosed، لمعرفة ما إذا كان المتجر مغلق أم لا، بالتعديل على دالة ()isOpen واستبدال العامل && بالعامل ||، كالتالي:

عند استخدام العامل ||، بدلنا أيضًا عوامل المقارنة العلائقية وعكسناها. في هذه الحالة، يكفي أن يكون أحد الشرطين true. فإذا كانت الساعة المرسلة للدالة، أصغر من ساعة الفتح openTime، أو أكبر من ساعة الإغلاق closeTime، ستعتبر كتلة if أن الشرط تحقق وتعيد القيمة true.

سنستدعي دالة ()isClosed بنفس الطريقة السابقة:

سيطبع البرنامج الجملة: “Store is closed: false”.

سيطبع البرنامج الجملة: “Store is closed: true”.

تحسين وتبسيط شفرة برنامج المتجر:

استخدمنا في برنامج المتجر دالتين ()isOpen و ()isClose، لإبراز الفرق بين العاملين && و ||. ولكن يمكننا تبسيط البرنامج بدمج الدالتين في دالة واحدة نسميها storeStatus تعيد لنا النتيجة المناسبة، وأيضًا تحسين شفرة كتلة if، كالتالي:

كما نرى في الشفرة أعلاه، أننا تخلصنا من كتلة if ووضعنا التعبير المنطقي مباشرة. في هذه الحالة أيضًا، إذا تحقق الشرطين ستكون النتيجة true وإذا لم يتحقق الشرطين فستكون النتيجة false. أيًا كانت النتيجة، سيتم إسنادها للمتغير status.

ثم وضعنا كتلة if داخل دالة الطباعة ()println، لأنه كما قلنا سابقًا، تعتبر كتلة if في كوتلن تعبير وتعيد قيمة. وفي حالتنا هذه، ستتحقق كتلة if من القيمة التي تم تخزينها سابقًا في المتغير status، هل هي القيمة true، ستطبع الدالة الجملة:

The store is open at $hour O’Clock

أما إذا كانت قيمة المتغير status هي false، ستطبع الجملة:

The store is closed at $hour O’Clock

مع مراعاة أنه سيتم تعويض مكان المتغير hour$ بقيمته التي يتم إرسالها عند استدعاء الدالة.

تنفيذ برنامج المتجر:

الآن يمكننا تنفيذ برنامج المتجر باستدعاء دالة ()storeStatus داخل الدالة ()main، بالقدر الذي نريده من المرات. فمثلًا، إذا أردنا معرفة ما إذا المتجر مفتوح أو مغلق في الساعات الأربع: 8 صباحًا، 10 صباحًا، 15 الثالثة عصرًا و 23 الحادية عشر مساءً، يمكننا استدعاء الدالة كالتالي:

فستكون نتيجة البرنامج أعلاه هي:

The store is close at 8 O’Clock

The store is open at 10 O’Clock

The store is open at 15 O’Clock

The store is close at 23 O’Clock

دمج العوامل المنطقية وأسبقيات التنفيذ:

يمكننا دمج التعبيرات التي تحتوي على عوامل منطقية لإنشاء تعبيرات منطقية أكثر تعقيدًا. كما أن هناك ترتيب وأسبقية لعوامل العمليات الحسابية مثل الضرب والجمع …إلخ كما رأينا في درس أنواع العدد، أيضًا العوامل المنطقية لها ترتيب وأسبقية لعامل على غيره، كالتالي:

  • الأقواس ( ): التعبيرات المنطقية التي نضعها بين أقواس ستنفذ أولًا.
  • عامل النفي (!) Not.
  • العامل && and.
  • العامل || or.

فمثلًا، إذا كان لدينا التعبير التالي:

على الرغم من أن العاملين ! و && لديهما الأسبقية على العامل ||، ولكن لأننا وضعنا تعبير العامل || بين قوسين، سيتم تنفيذه أولًا، ثم عامل النفي !، وأخيرًا العامل &&.

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

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