حلقات التكرار والتحكم فيها
بدل كتابة الأمر نفسه مرارًا، نطلب من الحاسب تكراره ما دام الشرط صحيحًا.
- تكتب حلقات while و for و do-while وتحدّد أجزاءها.
- تختار الحلقة المناسبة حسب المسألة.
- تتتبّع تنفيذ الحلقة وتتجنّب الحلقة اللانهائية.
- تستخدم الحلقات المتداخلة.
- تتحكم في الحلقة بـ break و continue.
١الفكرة
طباعة الأرقام من 1 إلى 100، أو إعادة سؤال حتى تصحّ الإجابة: كلاهما تكرار. والحلقة while تعني: «طالما الشرط صحيح، كرّر».
while (الشرط){ // الكود الذي يتكرّر}
٢الأجزاء الثلاثة لأي حلقة
int i = 1;i <= 5i++;int i = 1; while (i <= 5){ System.out.println(i); i++;}
لاحظ أن الشرط يُفحص 6 مرّات: خمس مرّات true، والسادسة false عندما تصبح i = 6.
٣مثال تطبيقي: جمع الأرقام من 1 إلى 5
int i = 1;int sum = 0; while (i <= 5){ sum = sum + i; i++;}System.out.println("المجموع = " + sum);
٤الحلقة اللانهائية
int i = 1;while (i <= 5){ System.out.println(i); // نسينا i++}
- الشرط يُفحص قبل كل تكرار؛ إن كان false من البداية فلن تُنفَّذ الحلقة إطلاقًا.
- هيّئ المتغيّر قبل الحلقة، وغيّره داخلها.
٥تشريح رأس الحلقة
تُفصل الأجزاء الثلاثة بفاصلة منقوطة ; وليست فاصلة عادية.
for (int i = 1; i <= 5; i++){ System.out.println(i);}
٦for مقابل while
العمل نفسه، لكن for تجمع ما كان متفرّقًا:
int i = 1;while (i <= 5) { System.out.println(i); i++;}
for (int i = 1; i <= 5; i++) { System.out.println(i);}
| for | while | |
|---|---|---|
| متى؟ | عدد التكرارات معروف مسبقًا | عدد التكرارات غير معروف |
| مثال | كرّر 10 مرّات، أو من 1 إلى n | كرّر حتى يُدخل المستخدم 0 |
٧أمثلة
العدّ التنازلي باستخدام --
for (int i = 5; i >= 1; i--){ System.out.println(i);}
جمع الأرقام من 1 إلى 5
int sum = 0; for (int i = 1; i <= 5; i++){ sum = sum + i;}System.out.println("المجموع = " + sum);
غيّر البداية والشرط والخطوة، وشاهد القيم التي تمرّ بها i.
٨نقاط مهمة
- المتغيّر المعرَّف داخل for (مثل i) يعمل داخل الحلقة فقط.
- يمكن التغيير بخطوة أكبر من 1، مثل
i = i + 2؛ فإن بدأت من 2 حصلت على الأرقام الزوجية. - انتبه للحدود: من 1 مع
i <= 5خمس دورات، ومعi < 5أربع.
٩الفرق الجوهري
do{ // الكود الذي يتكرّر}while (الشرط);
١٠جرّب الفرق بنفسك
غيّر قيمة x. عند 5 يكون الشرط x > 10 خاطئًا من البداية.
int x = 5;while (x > 10){ System.out.println("نُفّذت");}
int x = 5;do{ System.out.println("نُفّذت");}while (x > 10);
١١الاستخدام الأنسب: قائمة إدخال
يجب أن تظهر القائمة قبل أن نعرف اختيار المستخدم، ثم تتكرّر حتى يختار الخروج.
import java.util.Scanner; public class Menu{ public static void main(String[] args) { Scanner input = new Scanner(System.in); int choice; do { System.out.println("1) بدء"); System.out.println("2) مساعدة"); System.out.println("0) خروج"); System.out.print("اختر: "); choice = input.nextInt(); } while (choice != 0); // كرّر حتى يُدخل 0 System.out.println("تم الخروج"); }}
أنت المستخدم: اختر رقمًا في كل مرّة.
متى تستخدمها؟ عندما يجب تنفيذ الكود مرّة واحدة على الأقل ثم تقرّر التكرار: القوائم، والتحقّق من الإدخال، وإعادة المحاولة. وفي غير ذلك، while و for أكثر شيوعًا.
١٢الفرق في جملة واحدة
وتأتي كلتاهما غالبًا داخل شرط if يتحقّق من حالة معيّنة.
١٣الحلقة نفسها بالكلمتين
for (int i = 1; i <= 5; i++){ if (i == 3) break; System.out.println(i);}System.out.println("انتهت الحلقة");
for (int i = 1; i <= 5; i++){ if (i == 3) continue; System.out.println(i);}System.out.println("انتهت الحلقة");
| break | continue | |
|---|---|---|
| ماذا يفعل؟ | يُنهي الحلقة كلّها | يتخطّى الدورة الحالية فقط |
| ثم ماذا؟ | يخرج من الحلقة نهائيًّا | يعود لأعلى الحلقة للدورة التالية |
| ناتج المثال | 1 2 | 1 2 4 5 |
١٤أمثلة تطبيقية
break: ابحث ثم توقّف
int target = 7; for (int i = 1; i <= 10; i++){ if (i == target) { System.out.println("وجدته عند: " + i); break; // لا داعي لإكمال باقي الأرقام }}
continue: اطبع الفردي فقط
for (int i = 1; i <= 6; i++){ if (i % 2 == 0) continue; // تخطَّ الزوجي System.out.println(i); // اطبع الفردي فقط}
١٥نقاط مهمة
- break تعمل أيضًا في switch بالمعنى نفسه: «اخرج الآن».
- continue لا توقف الحلقة؛ تتخطّى دورة واحدة فقط.
- لا تُفرط فيهما؛ كثرتهما تصعّب تتبّع الكود، وغالبًا يكفي شرط حلقة جيّد.
توقّع وتحقّق
تأمل الكود التالي،
int i = 0;while (i < 3){ System.out.println("مرحبا"); i++;}
كم مرّة تُطبع «مرحبا» عند تنفيذه؟
تأمل الكود التالي،
int x = 10;while (x < 5){ System.out.println(x); x++;}
ماذا سيكون الناتج عند تنفيذه؟
تأمل الكود التالي،
int i = 1;while (i <= 5){ System.out.println(i); i++;}
ما قيمة i بعد انتهاء الحلقة؟
ما الذي يسبّب الحلقة اللانهائية غالبًا؟
تأمل الكود التالي،
for (int i = 0; i < 5; i++){ System.out.println(i);}
كم مرّة يتكرّر جسم الحلقة؟
تأمل الكود التالي،
for (int i = 2; i <= 10; i = i + 2) System.out.print(i + " ");
ماذا سيكون الناتج عند تنفيذه؟
أي جزء من رأس for يُنفَّذ مرّة واحدة فقط؟
تأمل رأس الحلقة التالي،
for (int i = 1, i <= 5, i++){ System.out.println(i);}
ما الخطأ فيه؟
تأمل الكود التالي،
int n = 0;do{ System.out.println("Hi");}while (n > 5);
كم مرّة تُطبع «Hi» عند تنفيذه؟
ما الذي يميّز do…while عن while؟
أي موقف يناسب do…while أكثر؟
تأمل الكود التالي،
for (int i = 1; i <= 6; i++){ if (i == 4) break; System.out.print(i + " ");}
ماذا سيكون الناتج عند تنفيذه؟
تأمل الكود التالي،
for (int i = 1; i <= 6; i++){ if (i == 4) continue; System.out.print(i + " ");}
ماذا سيكون الناتج عند تنفيذه؟
أي كلمة تناسب: «عندما تجد الرقم المطلوب توقّف عن البحث»؟
الخلاصة
- كل حلقة لها تهيئة وشرط وتحديث.
- for عندما نعرف عدد المرات، و while عندما لا نعرفه.
- do-while تنفّذ مرة واحدة على الأقل لأن الشرط في نهايتها.
- break تخرج من الحلقة فورًا، و continue تتخطى بقية الدورة الحالية.
- الحلقة المتداخلة تنفّذ الداخلية كاملة في كل دورة من الخارجية.
تحدٍّ برمجي: جدول الضرب
سهلاطبع جدول ضرب العدد 7 من 1 إلى 10 باستخدام حلقة for.
- كل سطر بالشكل: 7 x 1 = 7
- استخدم متغيّرًا للعدد حتى يسهل تغييره.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
public class Table{ public static void main(String[] args) { int n = 7; // for (…) }}
💡 تلميح 1
💡 تلميح 2
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
public class Table{ public static void main(String[] args) { int n = 7; for (int i = 1; i <= 10; i++) { System.out.println(n + " x " + i + " = " + (n * i)); } }}