C#: هياكل الحلقات
1. حلقة while
تكرر الحلقة while كتلة التعليمات البرمجية طالما أن شرطها هو true. يتم التحقق من الشرط قبل كل تكرار — وإذا كان false، يتم تخطي نص الحلقة بالكامل.
int count = 1;
while (count <= 5)
{
Console.WriteLine($"Execution #{count}");
count++;
}
Execution #1
Execution #2
Execution #3
Execution #4
Execution #5
نصيحة: إذا كان الشرط هو
falseمنذ البداية، فلن يتم تنفيذ جسم الحلقة أبدًا.
2. حلقة do...while
تقوم الحلقة do...while بتنفيذ نص الحلقة أولاً، ثم تتحقق من الشرط. ويتم تنفيذ نص الحلقة مرة واحدة على الأقل، بغض النظر عن الشرط.
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 بين التهيئة والشرط وتحديث التكرار في سطر واحد، مما يجعلها مثالية عندما يكون عدد التكرارات معروفًا مسبقًا.
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"i = {i}");
}
i = 1
i = 2
i = 3
i = 4
i = 5
يمكن حذف الأجزاء الثلاثة جميعها من العبارة for، لكن يجب الإبقاء على الفواصل المنقوطة:
int j = 0;
for (; j < 3; )
{
Console.WriteLine($"j = {j}");
j++;
}
j = 0
j = 1
j = 2
4. حلقة foreach
تعد حلقة foreach إحدى ميزات لغة C# التي تتيح التكرار على كل عنصر في مجموعة. وهي توفر بناءً جملًا واضحًا وآمنًا، وتعمل مع المصفوفات والقوائم وأي مجموعة تنفذ واجهة IEnumerable.
string[] fruits = { "Apple", "Banana", "Orange" };
foreach (var fruit in fruits)
{
Console.WriteLine($"Fruit: {fruit}");
}
Fruit: Apple
Fruit: Banana
Fruit: Orange
تحذير: حلقة
foreachهي حلقة للقراءة فقط — متغير التكرار هو نسخة للقراءة فقط. لا يمكنك تعديل عناصر المجموعة من خلالها، ولا إضافة عناصر أو إزالتها أثناء التكرار، وإلا سيتم إصدار استثناءInvalidOperationException.
▶ مثال
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}");
Total: 402, Average: 80.4
5. الحلقات المتداخلة
تُسمى الحلقة الموجودة داخل حلقة أخرى «حلقة متداخلة»، وتُستخدم عادةً لمعالجة هياكل البيانات ثنائية الأبعاد مثل المصفوفات والجداول.
for (int row = 1; row <= 3; row++)
{
for (int col = 1; col <= 4; col++)
{
Console.Write($"{row * col,4}");
}
Console.WriteLine();
}
1 2 3 4
2 4 6 8
3 6 9 12
تحذير: تتميز الحلقات المتداخلة بتعقيد زمني يبلغ O(n^2) — فكلما زاد عدد الطبقات، انخفض الأداء. في الممارسة العملية، تجنب التداخل العميق وفكر في استخدام LINQ أو استخراج الطرق لتحسين الأداء.
6. break و continue
(1) فاصل
break يخرج فورًا من الحلقة الحالية، متخطيًّا جميع التكرارات المتبقية.
for (int i = 0; i < 10; i++)
{
if (i == 5) break;
Console.Write($"{i} ");
}
0 1 2 3 4
(2) تابع
continue يتخطى بقية الدورة الحالية وينتقل إلى الدورة التالية.
for (int i = 0; i < 6; i++)
{
if (i % 2 == 0) continue;
Console.Write($"{i} ");
}
1 3 5
نصيحة: لا تؤثر
breakوcontinueإلا على الحلقة الأعمق. للخروج من طبقات متعددة، استخدم متغير علامة أو عبارات ذات تسميات.
7. أنماط الحلقات الشائعة
(1) نمط العد
عد العناصر التي تستوفي شرطًا ما:
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}");
Count of values > 20: 3
(2) نمط التراكم
حساب مجموع متتابعة من الأعداد:
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
Console.WriteLine($"Sum of 1 to 100: {sum}");
Sum of 1 to 100: 5050
(3) نمط البحث
البحث عن عنصر مستهدف في مجموعة:
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");
Found 22 at index 3
▶ مثال
الجمع بين أنماط متعددة - حساب توزيع الدرجات وحساب المتوسط:
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}");
Excellent: 2, Pass: 5, Fail: 3
Average: 72.3
8. الحلقات اللانهائية وكيفية تجنبها
تحدث الحلقة اللانهائية عندما تكون شرط الحلقة دائمًا true، مما يؤدي إلى عدم انتهاء الحلقة أبدًا. أنماط الحلقات اللانهائية الشائعة:
while (true)
{
}
for (; ; )
{
}
▶ مثال
حلقة محكومة مع شروط خروج لتجنب الحلقات اللانهائية:
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وforستتحولان في النهاية إلى الحالةfalse - عند استخدام
while (true)أوfor (; ; )، يجب دائمًا توفير مسار خروجbreak - تحديد الحد الأقصى لعدد مرات التكرار كإجراء احترازي
- تحقق جيدًا من منطق تحديث متغير loop لتجنب تخطي عمليات الزيادة أو النقصان عن غير قصد
من الناحية العملية، يُعد استخدام
while (true)معbreakنمطًا شائعًا للحلقات، ولكن يجب التأكد من أن كل فرع لديه فرصة للخروج.
❓ أسئلة شائعة
while وdo...while؟while تتحقق من الشرط أولاً وقد لا تنفذ الجسم أبدًا؛ أما do...while فتنفذ الجسم أولاً، لذا فهي تُنفَّذ مرة واحدة على الأقل.foreach؟for مع الوصول عبر الفهرس إذا كنت بحاجة إلى تعديل العناصر.break الخروج من عدة حلقات متداخلة؟break يخرج فقط من الحلقة الأعمق. للخروج من عدة طبقات، استخدم متغير علامة أو افصل الحلقة الداخلية في دالة واستخدم return.for (; ; ) وwhile (true)؟while (true) أسهل في القراءة، بينما قد يساعد for (; ; ) في تجنب تحذيرات المُترجم في بعض البيئات.📖 ملخص
whileيتحقق من الشرط أولاً؛ ولا يتم تنفيذ الجسم إلا عندما يكون الشرط هوtruedo...whileينفذ نص الدالة مرة واحدة قبل التحقق من الشرطforمثالي لحالات عدد التكرارات المعروفة مع بناء جملة موجزforeachهي ميزة في لغة C# تتيح تكرار المجموعات بطريقة منظمة، لكن متغير التكرار يكون للقراءة فقط- تعالج الحلقات المتداخلة البيانات متعددة الأبعاد — انتبه إلى تأثير الأداء من الدرجة O(n^2)
breakيخرج فورًا من الحلقة؛continueيتخطى التكرار الحالي- الأنماط الشائعة: العد، التراكم، البحث، الاستعراض
- يمكن التحكم في الحلقات اللانهائية باستخدام
while (true)+break، ولكن يجب دائمًا تعيين شرط للخروج
📝 تمارين
- اكتب برنامجًا يستخدم حلقة
whileلحساب قوى العدد 2 حتى يتجاوز القيمة 1000، ثم اعرض جميع النتائج. - استخدم حلقة
forلطباعة جدول الضرب في الصيغة المثلثية العلوية (مع تجنب التكرار). - إذا كان لدينا مصفوفة من السلاسل، فاستخدم
foreachلحساب عدد السلاسل التي يزيد طولها عن 5. - اكتب برنامجًا باستخدام
do...whileيطلب من المستخدم إدخال كلمة المرور مرارًا وتكرارًا حتى يتم إدخال كلمة المرور الصحيحة (حدد كلمة المرور الصحيحة بنفسك). - استخدم حلقات
forمتداخلة لإيجاد جميع الأعداد الأولية بين 1 و50. - استخدم
continueداخل حلقةforلطباعة جميع الأعداد من 1 إلى 20 التي لا تقبل القسمة على 3.