الحلقات التكرارية (متوسط)

مقدمة

هذا الدرس تكملة لدرس الحلقات التكرارية (مستوى ابتدائي) لذلك ننصح بمراجعة درس المستوى اﻹبتدائي قبل قراءة هذا الدرس

الحلقات التكرارية المتداخلة (Nested Loops)

يمكن إنشاء حلقة تكرارية بداخل حلقة تكرارية، فكما قلنا كل حلقة تكرارية لها كتلة أوامر Block والكتلة ممكن أن تتكون من عدة أوامر، وبالتالي يمكن أن نضع بداخل الكتلة حلقات تكرارية أخرى أو شروط أو أي أوامر!

طباعة اﻷعداد من 1 إلى 4 ثلاث مرات

هذا المثال سيطبع اﻷعداد من 1 إلى 4 ثلاث مرات متتالية، عن طريق الحلقات التكرارية المتداخلة...

  • هناك حلقة تكرارية تتكرر 4 مرات لتطبع اﻷعداد من 1 إلى 4
  • وهناك حلقة تكرارية أخرى تضم بداخلها الحلقة التكرارية اﻷولى، وتتكرر ثلاث مرات، بالتالي تتسبب في تكرار طباعة اﻷعداد 3 مرات
var i = 1;
while (i <= 3){
  var n = 1;
  while(n <= 4){
    console.log(n);
    n = n + 1;
  }
  i = i + 1;
}

جرب المثال السابق في محرر دليل مبرمج السريع أو محرر النصوص vscode

متغير العداد يجب أن يكون مختلف في كل حلقة، لا تستخدم متغير عداد واحد ﻷكثر من حلقة تكرارية

وضع مسافة (سطر فارغ) بين المرات الثلاثة

ويمكننا تحسين المثال السابق عن طريق وضع سطر فارغ بين كل مرة من الثلاث مرات، ولكن كيف تنفيذها؟ بسيطة نتحقق عن طريق if إذا كان الرقم الحالي هو 4 (آخر رقم في حلقة طباعة اﻷرقام) إذن نقوم بطباعة سطر فارغ "".

var i = 1;
while (i <= 3){
  var n = 1;
  while(n <= 4){
    console.log(n);
    if (n == 4){
      console.log("");
    }
    n = n + 1;
  }
  i = i + 1;
}

ويمكننا تنفيذ نفس الفكرة السابقة بحل أفضل، نضع أمر الطباعة خارج الحلقة التكرارية الداخلية، بحيث في كل دورة من دورات الحلقة التكرارية الخارجية يقوم المفسر بطباعة اﻷعداد من 1 إلى 4 ثم يقوم بطباعة سطر جديد فارغ، ثم يعود ليكرر نفس العملية

var i = 1;
while (i <= 3){
  var n = 1;
  while(n <= 4){
    console.log(n);
    n = n + 1;
  }
  
  console.log("");

  i = i + 1;
}
تمرين متقدم

قم بكتابة دالة تأخذ العدد rows كمُدخل وتقوم بطباعة شكل مثلث قائم من النجوم * عدد صفوفه rows.

مثال: عندما قيمة rows تساوي 4 يجب أن يكون الناتج:

ناتج التشغيل *
**
***
****

الحلقة التكرارية for

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

تُستخدم الحلقة for فقط مع الحلقات التكرارية العددية أي التي تتكرر عدد معين من المرات.

طريقة كتابة الحلقة for

for (statement1; statement2; statement3) {
  // block
}
  • statement1: اﻷمر اﻷول، يتنفذ قبل تنفيذ الحلقة التكرارية، مرة واحدة. وفيه نقوم بإنشاء متغير العداد
  • statement2: اﻷمر الثاني، نكتب فيه شرط الحلقة التكرارية، مثلاً i <= 3
  • statement3: اﻷمر الثالث، يتنفذ في نهاية كل دورة من دورات الحلقة التكرارية، تذكر أننا في وفيه نقوم بتغيير متغير العداد

تذكر: نفصل بين اﻷوامر الثلاثة بعلامة ;

مثال على الحلقة for

for (var i = 0; i <= 3; i++) {
  console.log(i);
}
ناتج التشغيل 0
1
2
3

تتكون الحلقة التكرارية في المثال السابق من ثلاثة أوامر:

  • var i = 0: أمر إنشاء متغير العداد i وقيمته تساوي صفر، أي أن الحلقة ستبدأ من الصفر
  • i <= 3: شرط التكرار، ويعني أن الحلقة ستتكرر مادامت قيمة متغير العداد أقل من أو تساوي 3 بالتالي ستتكرر الحلقة 4 مرات (0, 1, 2, 3)
  • i++: أمر تغيير قيمة متغير العداد في كل دورة

اﻷمر الثالث في المثال السابق بالضبط يقوم بنفس مهمة الأمر i += 1 الذي كنا نكتبه مع حلقة while في نهاية كتلة اﻷوامر.

قد درسنا العلامة ++ سابقاً في درس العمليات الحسابية وتعنى زيادة واحد على قيمة المتغير

متى نستخدم for ومتى while

على الرغم من أن while يمكنها فعل ما تفعله for بالضبط، ولكننا نفضّل استخدام for في الأمر التي تختص به، وهو التكرار لعدد معين معلوم من المرات، أما نستخدم while بشكل عام في الحلقات التكرارية التي تتكرر إلى أن يتحقق شرط معين، لا تتكرر عدد من المرات ولكن تتكرر إلى أن يتحقق الشرط، فمثلاً نطلب من المستخدم أن يقوم بإدخال عدد، ونقوم بإنشاء حلقة تكرارية تظل تتكرر إذا لم يقم المستخدم بإدخال عدد، مثلاً أدخل نصّا أو رمزاً، وتظل هذه الحلقة تتكرر إلى أن يقوم المستخدم بإدخال عدد صحيح!

أو في حالة أخرى، نريد أن ننشئ برنامج يتابع سعر الدولار مثلاً، ويظل يتابعه إلى أن يصل الدولار لسعر 20 جنيه، في هذه الحالة نريد التكرار... ولكن عدد غير معين من المرات، نريد التكرار إلى أن يتحقق الشرط "وصول سعر الدولار إلى 20" ولا نعلم هل سيتحقق الشرط بعد 100 مرة أم بعد 100 ألف! في هذه الحالة نستخدم while

الوصول لكل عناصر المصفوفة باستخدام for

كما كنا نستخدم while للوصول لكل عناصر المصفوفة سابقاً في درس المصفوفات يمكننا اﻵن استخدام for للوصول لكل عناصر المصفوفة بكتابة كود أكثر تنسيقاً وسهولة

var numbers = [2,4,6,8];
for (var i = 0; i < numbers.length; i++){
  console.log(numbers[i]);
}
ناتج التشغيل 2
4
6
8

الحلقات المتداخلة باستخدام for

يمكن تطبيق ما تعلمناه عن الحلقات المتداخلة (Nested Loops) مع الحلقة for وستلاحظ أن الكود أصبح مختصراً ومنسقاً أكثر

for (var i = 1; i <= 3; i++){
  for(var n = 1; n <= 4; n++){
    console.log(n);
  }
}

جرب الرجوع لنفس المثال مع while وانظر الفرق بين الكود هنا وهناك!

المساهمين

وجدت خطأ أو تريد المساهمة في محتوى الدرس؟ عدل الصفحة على Github