C#: هياكل الحلقات

1. حلقة while

تكرر الحلقة while كتلة التعليمات البرمجية طالما أن شرطها هو true. يتم التحقق من الشرط قبل كل تكرار — وإذا كان false، يتم تخطي نص الحلقة بالكامل.

CSHARP
int count = 1;
while (count <= 5)
{
    Console.WriteLine($"Execution #{count}");
    count++;
}
TEXT 📖 للعرض فقط
Execution #1
Execution #2
Execution #3
Execution #4
Execution #5

نصيحة: إذا كان الشرط هو false منذ البداية، فلن يتم تنفيذ جسم الحلقة أبدًا.


2. حلقة do...while

تقوم الحلقة do...while بتنفيذ نص الحلقة أولاً، ثم تتحقق من الشرط. ويتم تنفيذ نص الحلقة مرة واحدة على الأقل، بغض النظر عن الشرط.

CSHARP
int number;
do
{
    Console.WriteLine("Enter a positive number:");
    number = int.Parse(Console.ReadLine());
} while (number <= 0);
Console.WriteLine($"You entered: {number}");

تحذير: الفاصلة المنقوطة في نهاية do...while إلزامية — وهذا يمثل اختلافًا في بناء الجملة عن حلقة while.


3. حلقة for

تجمع حلقة for بين التهيئة والشرط وتحديث التكرار في سطر واحد، مما يجعلها مثالية عندما يكون عدد التكرارات معروفًا مسبقًا.

CSHARP
for (int i = 1; i <= 5; i++)
{
    Console.WriteLine($"i = {i}");
}
TEXT 📖 للعرض فقط
i = 1
i = 2
i = 3
i = 4
i = 5

يمكن حذف الأجزاء الثلاثة جميعها من العبارة for، لكن يجب الإبقاء على الفواصل المنقوطة:

CSHARP
int j = 0;
for (; j < 3; )
{
    Console.WriteLine($"j = {j}");
    j++;
}
TEXT 📖 للعرض فقط
j = 0
j = 1
j = 2

4. حلقة foreach

تعد حلقة foreach إحدى ميزات لغة C# التي تتيح التكرار على كل عنصر في مجموعة. وهي توفر بناءً جملًا واضحًا وآمنًا، وتعمل مع المصفوفات والقوائم وأي مجموعة تنفذ واجهة IEnumerable.

CSHARP
string[] fruits = { "Apple", "Banana", "Orange" };
foreach (var fruit in fruits)
{
    Console.WriteLine($"Fruit: {fruit}");
}
TEXT 📖 للعرض فقط
Fruit: Apple
Fruit: Banana
Fruit: Orange

تحذير: حلقة foreach هي حلقة للقراءة فقط — متغير التكرار هو نسخة للقراءة فقط. لا يمكنك تعديل عناصر المجموعة من خلالها، ولا إضافة عناصر أو إزالتها أثناء التكرار، وإلا سيتم إصدار استثناء InvalidOperationException.

▶ مثال

CSHARP
int[] scores = { 90, 85, 72, 60, 95 };
int sum = 0;
foreach (int score in scores)
{
    sum += score;
}
Console.WriteLine($"Total: {sum}, Average: {(double)sum / scores.Length:F1}");
▶ جرّب الكود
TEXT 📖 للعرض فقط
Total: 402, Average: 80.4

5. الحلقات المتداخلة

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

CSHARP
for (int row = 1; row <= 3; row++)
{
    for (int col = 1; col <= 4; col++)
    {
        Console.Write($"{row * col,4}");
    }
    Console.WriteLine();
}
TEXT 📖 للعرض فقط
   1   2   3   4
   2   4   6   8
   3   6   9  12

تحذير: تتميز الحلقات المتداخلة بتعقيد زمني يبلغ O(n^2) — فكلما زاد عدد الطبقات، انخفض الأداء. في الممارسة العملية، تجنب التداخل العميق وفكر في استخدام LINQ أو استخراج الطرق لتحسين الأداء.


6. break و continue

(1) فاصل

break يخرج فورًا من الحلقة الحالية، متخطيًّا جميع التكرارات المتبقية.

CSHARP
for (int i = 0; i < 10; i++)
{
    if (i == 5) break;
    Console.Write($"{i} ");
}
TEXT 📖 للعرض فقط
0 1 2 3 4

(2) تابع

continue يتخطى بقية الدورة الحالية وينتقل إلى الدورة التالية.

CSHARP
for (int i = 0; i < 6; i++)
{
    if (i % 2 == 0) continue;
    Console.Write($"{i} ");
}
TEXT 📖 للعرض فقط
1 3 5

نصيحة: لا تؤثر break وcontinue إلا على الحلقة الأعمق. للخروج من طبقات متعددة، استخدم متغير علامة أو عبارات ذات تسميات.


7. أنماط الحلقات الشائعة

(1) نمط العد

عد العناصر التي تستوفي شرطًا ما:

CSHARP
int[] data = { 12, 25, 8, 33, 17, 6, 41 };
int count = 0;
foreach (int val in data)
{
    if (val > 20) count++;
}
Console.WriteLine($"Count of values > 20: {count}");
TEXT 📖 للعرض فقط
Count of values > 20: 3

(2) نمط التراكم

حساب مجموع متتابعة من الأعداد:

CSHARP
int sum = 0;
for (int i = 1; i <= 100; i++)
{
    sum += i;
}
Console.WriteLine($"Sum of 1 to 100: {sum}");
TEXT 📖 للعرض فقط
Sum of 1 to 100: 5050

(3) نمط البحث

البحث عن عنصر مستهدف في مجموعة:

CSHARP
int[] numbers = { 3, 7, 15, 22, 9, 31 };
int target = 22;
int index = -1;
for (int i = 0; i < numbers.Length; i++)
{
    if (numbers[i] == target)
    {
        index = i;
        break;
    }
}
Console.WriteLine(index >= 0 ? $"Found {target} at index {index}" : "Not found");
TEXT 📖 للعرض فقط
Found 22 at index 3

▶ مثال

الجمع بين أنماط متعددة - حساب توزيع الدرجات وحساب المتوسط:

CSHARP
int[] scores = { 92, 78, 55, 88, 43, 96, 67, 73, 81, 50 };
int excellent = 0, pass = 0, fail = 0, total = 0;
foreach (int s in scores)
{
    total += s;
    if (s >= 90) excellent++;
    else if (s >= 60) pass++;
    else fail++;
}
double avg = (double)total / scores.Length;
Console.WriteLine($"Excellent: {excellent}, Pass: {pass}, Fail: {fail}");
Console.WriteLine($"Average: {avg:F1}");
▶ جرّب الكود
TEXT 📖 للعرض فقط
Excellent: 2, Pass: 5, Fail: 3
Average: 72.3

8. الحلقات اللانهائية وكيفية تجنبها

تحدث الحلقة اللانهائية عندما تكون شرط الحلقة دائمًا true، مما يؤدي إلى عدم انتهاء الحلقة أبدًا. أنماط الحلقات اللانهائية الشائعة:

CSHARP
while (true)
{
}

for (; ; )
{
}

▶ مثال

حلقة محكومة مع شروط خروج لتجنب الحلقات اللانهائية:

CSHARP
Random rnd = new Random();
int attempts = 0;
while (true)
{
    int value = rnd.Next(1, 101);
    attempts++;
    if (value == 42)
    {
        Console.WriteLine($"Got 42 on attempt #{attempts}!");
        break;
    }
    if (attempts > 1000)
    {
        Console.WriteLine("Too many attempts, exiting loop.");
        break;
    }
}
▶ جرّب الكود

إرشادات لتجنب الحلقات اللانهائية:

من الناحية العملية، يُعد استخدام while (true) مع break نمطًا شائعًا للحلقات، ولكن يجب التأكد من أن كل فرع لديه فرصة للخروج.


❓ أسئلة شائعة

س ما الفرق بين while وdo...while؟
ج while تتحقق من الشرط أولاً وقد لا تنفذ الجسم أبدًا؛ أما do...while فتنفذ الجسم أولاً، لذا فهي تُنفَّذ مرة واحدة على الأقل.
س هل يمكنني تعديل عناصر المجموعة في حلقة foreach؟
ج لا. متغير التكرار هو نسخة للقراءة فقط — ولا يؤثر تعديله على المجموعة الأصلية. استخدم حلقة for مع الوصول عبر الفهرس إذا كنت بحاجة إلى تعديل العناصر.
س هل يمكن لـ break الخروج من عدة حلقات متداخلة؟
ج لا. break يخرج فقط من الحلقة الأعمق. للخروج من عدة طبقات، استخدم متغير علامة أو افصل الحلقة الداخلية في دالة واستخدم return.
س هل هناك فرق بين for (; ; ) وwhile (true)؟
ج إنهما متطابقان من الناحية الوظيفية — فكلاهما يُنشئ حلقات لا نهائية. while (true) أسهل في القراءة، بينما قد يساعد for (; ; ) في تجنب تحذيرات المُترجم في بعض البيئات.

📖 ملخص

📝 تمارين

  1. اكتب برنامجًا يستخدم حلقة while لحساب قوى العدد 2 حتى يتجاوز القيمة 1000، ثم اعرض جميع النتائج.
  2. استخدم حلقة for لطباعة جدول الضرب في الصيغة المثلثية العلوية (مع تجنب التكرار).
  3. إذا كان لدينا مصفوفة من السلاسل، فاستخدم foreach لحساب عدد السلاسل التي يزيد طولها عن 5.
  4. اكتب برنامجًا باستخدام do...while يطلب من المستخدم إدخال كلمة المرور مرارًا وتكرارًا حتى يتم إدخال كلمة المرور الصحيحة (حدد كلمة المرور الصحيحة بنفسك).
  5. استخدم حلقات for متداخلة لإيجاد جميع الأعداد الأولية بين 1 و50.
  6. استخدم continue داخل حلقة for لطباعة جميع الأعداد من 1 إلى 20 التي لا تقبل القسمة على 3.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%