الحلقات في C#: for و foreach و while
لعبة فيها 50 عدواً على الشاشة: كل إطار، يجب تحريك كل واحد منهم. متجر فيه 1000 منتج: يجب عرض كل واحد في الصفحة. لا أحد يكتب نفس الأمر 1000 مرة. الحلقات تكرر الكود عنك. في هذا الدرس ستتعلم أنواع الحلقات في C#، ومتى تستخدم كل نوع.
حلقة for
Section titled “حلقة for”for (int i = 1; i <= 3; i++){ Console.WriteLine($"الدورة {i}");}الدورة 1الدورة 2الدورة 3ثلاثة أجزاء بين القوسين:
- البداية
int i = 1: تُنفَّذ مرة واحدة. - الشرط
i <= 3: يُفحص قبل كل دورة، وإذا صار خطأ تتوقف الحلقة. - الخطوة
i++: تُنفَّذ بعد كل دورة.
تخيّلها مثل صعود درج: تبدأ من الدرجة الأولى، وتصعد درجة درجة، وتتوقف عندما تصل للطابق.
حلقة foreach
Section titled “حلقة foreach”للمرور على كل عناصر مصفوفة أو قائمة، بدون عدّاد:
string[] fruits = { "تفاح", "موز", "برتقال" };foreach (string fruit in fruits){ Console.WriteLine($"- {fruit}");}- تفاح- موز- برتقالاقرأها كجملة: «لكل fruit في fruits». foreach من أكثر الحلقات استخداماً في C#، لأنها واضحة، ولا يمكن أن تخطئ فيها في حدود المصفوفة. ويمكنك كتابة var fruit بدلاً من string fruit.
حلقة while
Section titled “حلقة while”عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:
int balance = 100;int days = 0;while (balance > 0){ balance -= 30; days++;}Console.WriteLine($"انتهى الرصيد بعد {days} أيام");انتهى الرصيد بعد 4 أيامحلقة do-while
Section titled “حلقة do-while”تُنفَّذ مرة واحدة على الأقل، لأن الشرط يُفحص بعد الدورة:
int n = 10;do{ Console.WriteLine($"يُنفذ مرة واحدة على الأقل: {n}"); n++;} while (n < 5);يُنفذ مرة واحدة على الأقل: 10مثال عملي: قائمة خيارات في برنامج طرفية تُعرض للمستخدم مرة على الأقل، ثم تتكرر حتى يختار «خروج».
break و continue
Section titled “break و continue”for (int i = 1; i <= 10; i++){ if (i % 2 == 0) continue; // تخطَّ الزوجي if (i > 7) break; // توقف بعد 7 Console.Write($"{i} ");}Console.WriteLine();1 3 5 7Console.Write تطبع دون النزول لسطر جديد، و Console.WriteLine() الفارغة تنزل سطراً.
حيلة: تكرار حرف
Section titled “حيلة: تكرار حرف”for (int row = 1; row <= 3; row++){ Console.WriteLine(new string('*', row));}******new string('*', row) تنشئ نصاً فيه الحرف مكرراً row مرة، فتوفر حلقة داخلية كاملة.
أمثلة عملية
Section titled “أمثلة عملية”جدول الضرب:
int num = 7;for (int i = 1; i <= 5; i++){ Console.WriteLine($"{num} × {i} = {num * i}");}7 × 1 = 77 × 2 = 147 × 3 = 217 × 4 = 287 × 5 = 35المجموع من 1 إلى 100:
int sum = 0;for (int i = 1; i <= 100; i++) sum += i;Console.WriteLine(sum);5050جرّب بنفسك
Section titled “جرّب بنفسك”- اطبع العد التنازلي من 10 إلى 1 ثم «انطلق!».
- أنشئ مصفوفة أسماء، واطبع كل اسم مع رقمه بحلقة
for(تلميح:names.Lengthوi + 1). - اطلب من المستخدم أرقاماً بحلقة
do-whileحتى يدخل صفراً، ثم اطبع مجموعها. لقراءة الإدخال استخدمConsole.ReadLine()معint.TryParse. - تحدٍّ (FizzBuzz): من 1 إلى 15، اطبع «Fizz» لمضاعفات 3، و«Buzz» لمضاعفات 5، و«FizzBuzz» لمضاعفات الاثنين.
أخطاء شائعة
Section titled “أخطاء شائعة”- الخطأ بواحد:
i < arr.Lengthصحيحة، أماi <= arr.Lengthفتتجاوز آخر عنصر وتعطي خطأIndexOutOfRangeException. - تعديل القائمة أثناء foreach: خطأ أثناء التشغيل. استخدم
forأو قائمة جديدة. - الحلقة اللانهائية: تأكد أن شيئاً داخل
whileيقرّبها من التوقف.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي حلقة هي الأنسب للمرور على كل عناصر قائمة دون الحاجة لرقم العنصر؟
foreach تمر على كل العناصر مباشرة، وهي أوضح وأأمن عندما لا تحتاج رقم العنصر.
سؤال
ماذا يطبع Console.WriteLine(new string('-', 3));؟
new string(حرف, عدد) تنشئ نصاً فيه الحرف مكرراً بالعدد المحدد.
الخلاصة
Section titled “الخلاصة”forبأجزائها الثلاثة عندما تعرف عدد المرات أو تحتاج العدّاد.foreach (var x in items)للمرور على كل العناصر بأمان.whileحسب شرط، وdo-whileمرة على الأقل.breakللخروج، وcontinueلتخطي الدورة الحالية.- لا تعدّل القائمة أثناء
foreach، وnew string(ch, n)لتكرار حرف.