تخطَّ إلى المحتوى

الحلقات في C#‎: for و foreach و while

الدرس 4 من 11 · C#

لعبة فيها 50 عدواً على الشاشة: كل إطار، يجب تحريك كل واحد منهم. متجر فيه 1000 منتج: يجب عرض كل واحد في الصفحة. لا أحد يكتب نفس الأمر 1000 مرة. الحلقات تكرر الكود عنك. في هذا الدرس ستتعلم أنواع الحلقات في C#‎، ومتى تستخدم كل نوع.

for (int i = 1; i <= 3; i++)
{
Console.WriteLine($"الدورة {i}");
}
الناتج
الدورة 1
الدورة 2
الدورة 3

ثلاثة أجزاء بين القوسين:

  1. البداية int i = 1: تُنفَّذ مرة واحدة.
  2. الشرط i <= 3: يُفحص قبل كل دورة، وإذا صار خطأ تتوقف الحلقة.
  3. الخطوة i++: تُنفَّذ بعد كل دورة.

تخيّلها مثل صعود درج: تبدأ من الدرجة الأولى، وتصعد درجة درجة، وتتوقف عندما تصل للطابق.

للمرور على كل عناصر مصفوفة أو قائمة، بدون عدّاد:

string[] fruits = { "تفاح", "موز", "برتقال" };
foreach (string fruit in fruits)
{
Console.WriteLine($"- {fruit}");
}
الناتج
- تفاح
- موز
- برتقال

اقرأها كجملة: «لكل fruit في fruits». foreach من أكثر الحلقات استخداماً في C#‎، لأنها واضحة، ولا يمكن أن تخطئ فيها في حدود المصفوفة. ويمكنك كتابة var fruit بدلاً من string fruit.

عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:

int balance = 100;
int days = 0;
while (balance > 0)
{
balance -= 30;
days++;
}
Console.WriteLine($"انتهى الرصيد بعد {days} أيام");
الناتج
انتهى الرصيد بعد 4 أيام

تُنفَّذ مرة واحدة على الأقل، لأن الشرط يُفحص بعد الدورة:

int n = 10;
do
{
Console.WriteLine($"يُنفذ مرة واحدة على الأقل: {n}");
n++;
} while (n < 5);
الناتج
يُنفذ مرة واحدة على الأقل: 10

مثال عملي: قائمة خيارات في برنامج طرفية تُعرض للمستخدم مرة على الأقل، ثم تتكرر حتى يختار «خروج».

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 7

Console.Write تطبع دون النزول لسطر جديد، و Console.WriteLine() الفارغة تنزل سطراً.

for (int row = 1; row <= 3; row++)
{
Console.WriteLine(new string('*', row));
}
الناتج
*
**
***

new string('*', row) تنشئ نصاً فيه الحرف مكرراً row مرة، فتوفر حلقة داخلية كاملة.

جدول الضرب:

int num = 7;
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"{num} × {i} = {num * i}");
}
الناتج
7 × 1 = 7
7 × 2 = 14
7 × 3 = 21
7 × 4 = 28
7 × 5 = 35

المجموع من 1 إلى 100:

int sum = 0;
for (int i = 1; i <= 100; i++) sum += i;
Console.WriteLine(sum);
الناتج
5050
  1. اطبع العد التنازلي من 10 إلى 1 ثم «انطلق!».
  2. أنشئ مصفوفة أسماء، واطبع كل اسم مع رقمه بحلقة for (تلميح: names.Length و i + 1).
  3. اطلب من المستخدم أرقاماً بحلقة do-while حتى يدخل صفراً، ثم اطبع مجموعها. لقراءة الإدخال استخدم Console.ReadLine() مع int.TryParse.
  4. تحدٍّ (FizzBuzz): من 1 إلى 15، اطبع «Fizz» لمضاعفات 3، و«Buzz» لمضاعفات 5، و«FizzBuzz» لمضاعفات الاثنين.
  • الخطأ بواحد: i < arr.Length صحيحة، أما i <= arr.Length فتتجاوز آخر عنصر وتعطي خطأ IndexOutOfRangeException.
  • تعديل القائمة أثناء foreach: خطأ أثناء التشغيل. استخدم for أو قائمة جديدة.
  • الحلقة اللانهائية: تأكد أن شيئاً داخل while يقرّبها من التوقف.

سؤال

أي حلقة هي الأنسب للمرور على كل عناصر قائمة دون الحاجة لرقم العنصر؟

سؤال

ماذا يطبع Console.WriteLine(new string('-', 3));؟

  • for بأجزائها الثلاثة عندما تعرف عدد المرات أو تحتاج العدّاد.
  • foreach (var x in items) للمرور على كل العناصر بأمان.
  • while حسب شرط، و do-while مرة على الأقل.
  • break للخروج، و continue لتخطي الدورة الحالية.
  • لا تعدّل القائمة أثناء foreach، و new string(ch, n) لتكرار حرف.