تعلّم البرمجة بلغة كوتلن (18): حلقة التكرار while

تعلّم البرمجة بلغة كوتلن (18): حلقة التكرار while
أستمع الى المقال

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

حسنًا، لدينا عدة طرق لفعل ذلك. من ضمنها استخدام حلقة while أو حلقة (do … while). في هذا الدرس، سنستعرض عمليًا استخدام الحلقتين والفرق بينهما.

عوامل الإسناد في كوتلن:

قبل شرح حلقة التكرار، دعونا نستعرض سوية عوامل الإسناد في كوتلن، لأننا سنستخدمها في الحلقات.

تُستخدم عوامل الإسناد، لإسناد قيمة للمتغيرات. واستخدمنا العامل (=) كثيراً في هذه السلسلة، بدءًا من درس المتغيرات والقيم، لإسناد القيم للمتغيرات. فإذا كان لدينا متغير x، وأردنا إضافة القيمة له بعد إعلانه، فسنفعل التالي:

var x = 9

x = x + 3

أعلنا x كمتغير var ليتسنى لنا تغيير قيمته لاحقًا، وأسندنا القيمة 9 إليه. ثم اضفنا له القيمة 3، لتصبح قيمة x في نهاية الأمر تساوي 12. يمكننا القيام بنفس الأمر باستخدام الطريقة المختصرة، بدمج عامل الجمع (+) مع عامل الإسناد (=). بدل كتابة x = x + 3، نكتبها x += 3، وسينتج نفس النتيجة.

مثل عامل الجمع، نستطيع دمج عامل الإسناد (=)، مع العوامل الحسابية الأساسية الأخرى، مثل: (الطرح – والضرب * والقسمة / وباقي القسمة %)، لتكوين عامل إسناد جديد، كالتالي:

  • =+: إضافة القيمة يمين العامل إلى قيمة المتغير يسار العامل، ثم إسناد النتيجة إلى المتغير. 
  • =-: طرح القيمة يمين العامل من قيمة المتغير يسار العامل، ثم إسناد النتيجة إلى المتغير.
  • =*: ضرب قيمة المتغير في القيمة يمين العامل، ثم إسناد النتيجة إلى المتغير.
  • =/: قسمة قيمة المتغير على القيمة يمين العامل، ثم إسناد النتيجة إلى المتغير.
  • =%: إجراء عملية القسمة بباقي على القيمة يمين العامل، ثم إسناد باقي القسمة إلى المتغير.

هناك طرق أخرى تخص عاملي الجمع والطرح. فمثلًا، إذا أردنا إضافة أو إنقاص رقم 1 فقط من المتغير، يمكننا كتابتهما بهذه الطريقة: (++)، (–). فإذا أردنا إضافة الرقم 1 للمتغير x أعلاه، نستطيع أن نكتبه هكذا: x = x + 1 أو هكذا: x += 1 أو هكذا: ++x، وستنتج التعبيرات الثلاث نفس النتيجة. شرحنا عاملي الزيادة والنقصان بتفصيل، في الدرس 21 من هذه السلسلة.

حلقة التكرار while:

تكون أبسط صورة للإعلان عن حلقة التكرار هذه، هي باستخدام الكلمة المفتاحية while. ثم قوسين ( ) لوضع الشرط المنطقي، و قوسين معقوفين { }، نضع بداخلهما الشفرة المراد تكرارها، كالتالي:

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

برنامج لطباعة الأرقام من 0 – 9:

كمثال، إذا أردنا طباعة الأرقام من 0 – 9، نستخدم الحلقة كالتالي:

أعلنا عن متغير var أسندنا له الرقم صفر، وهو الرقم الذي نريد البدء منه. في حلقة while، وضعنا شرط طالما أن قيمة n أصغر من 10، إطبع قيمة n. إذا ظلت قيمة n صفر، فسيكون شرط n أصغر من 10 دائمًا متحققا true ويتم طباعة الرقم صفر إلى ما لانهاية. لتجنب ذلك، وضعنا التعبير n += 1 والذي يضمن لنا أن تزيد قيمة n ولا تظل صفر دائمًا.

في المرة الأولى قيمة n تساوي صفر، إذًا: 1 =+ 0 تساوي 1، أصبحت قيمة n تساوي الآن تساوي 1. سيعود إلى الشرط المنطقي، هل قيمة n الجديدة 1 أصغر من 10، نعم، سيطبع قيمة n الجديدة. وهكذا حتى تصل قيمة n للرقم 10، عندها يصبح الشرط غير متحقق false، لأن 10 ليست أصغر من 10. بالتالي سيطبع الأرقام من 0 – 9 وينتهي تنفيذ الشفرة في كتلة while.

حلقة التكرار do … while:

طريقة أخرى لتكرار الشفرة، بضم الحلقة while إلى الكلمة المفتاحية do، كالتالي:

نكتب الكلمة المفتاحية do ثم نفتح قوسين معقوفين { } نضع بداخلهما الشفرة المراد تنفيذها. ثم الكلمة المفتاحية while مع قوسيها واللذين سنضع بهما الشرط المنطقي.

الفرق الرئيسي بين الحلقتين هو، أن حلقة while، كما قلنا أعلاه، تقوم بالتحقق من الشرط أولًا ثم تنفذ الشفرة إذا كان الشرط متحقق true. أما حلقة do…while، فهي تنفذ الشفرة في المرة الأولى دون التحقق من الشرط بين قوسي while، ثم تتحقق من الشرط. وستعود لتنفيذ الشفرة مرة أخرى إذا كان الشرط ture، أو ينتهي التنفيذ للمرة الأولى فقط، إذا كان الشرط false.

تنفيذ الشفرة عبر do…while:

إذا أعدنا كتابة برنامجنا السابق، وأسندنا القيمة 10 للمتغير n، كالتالي:

قيمة المتغير n ليست أصغر من 10، لذا حلقة while لن تنفذ الشفرة. ولكننا سنجد حلقة do…while طبعت لنا الرقم 10، وزادت قيمة n بـ 1 لتصبح قيمته 11، ثم تحققت من شرط أن قيمة n أصغر من 10. بالطبع 11 ليست أصغر من 10، فأنتهى تنفيذ الشفرة.

وللتأكد من أن قيمة n أصبحت 11، يمكننا طباعة قيمته مرة أخرى بعد الزيادة في المعادلة: n += 1، كالتالي:

سيتم طباعة 10 و 11 على التوالي، وينتهي التنفيذ.

التكرار اللانهائي Infinite Loop:

علينا أن نعرف، بأنه من مسؤوليتنا التأكد من أن يصبح الشرط المنطقي في مرحلة ما خاطئ false، وإلا ستستمر الحلقة في التنفيذ إلا ما لا نهاية، مما يؤدي إلى تحطم برنامجنا وعدم استجابته، وبالتالي استهلاك موارد الجهاز الذي يعمل به برنامجنا.

فمثلًا، إذا أعدنا كتابة شفرة البرنامج أعلاه، ووضعنا شرط متحقق دائمًا true، كالتالي:

لن يتوقف البرنامج عن زيادة قيمة المتغير n بواحد وطباعة قيمته أبدًا. وإذا جربتها في جهازك الكمبيوتر، ستجد أن صوته ارتفع والذاكرة المؤقتة (RAM) تكاد تمتلئ فقط بهذه الشفرة الصغيرة.

لتوضيح الصورة أكثر، نفذنا الشفرة أعلاه على برنامج IntelliJ IDEA، كانت نتيجة التنفيذ كما يظهر في الصورة التالية:

  1. في الجزء اليسار من الصورة شفرة while.
  2. في هذه النافذة التي يظهر بها الرقم 2 في الصورة، تظهر نتيجة طباعة قيمة المتغير n. ونلاحظ أن المتغير أصبح يحمل قيم كبيرة جدًا من الأعداد بسرعة كبيرة جدًا.
  3. في النافذة أقصى يمين في الصورة، معلومات حالة الجهاز. والتي يظهر فيها أن حرارة المعالج وصلت إلى 100%. وأن على الأقل نواتين من الأنوية الست التي يملكها المعالج، أصبحت تعمل بأقصى طاقتها. وأن برنامج IntelliJ (يظهر باسم java في الصورة)، أصبح يمتلك ربع الذاكرة المؤقتة (RAM) حتى الآن. ويستمر في إحتلال المزيد منها، كلما طال وقت تنفيذ البرنامج.
  4. سنضطر في النهاية الضغط على هذا المربع الأحمر الذي يظهر قرب الرقم 4 في الصورة، لإنهاء تنفيذ الشفرة، ﻷنها لن تتوقف من تلقاء نفسها.

عمليًا، استخدام الحلقة do…while أقل بكثير من استخدام الحلقة while. والتي بدورها تستخدم أقل من استخدام الحلقة for والتي ستكون موضوع درسنا القادم.

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

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