C++: هياكل الحلقات
آخر تحديث: 2026-08-26
لنفترض أنك تحتاج لطباعة "Hello" 100 مرة على الشاشة. كيف ستفعل ذلك؟appelé
نسخ ولصق 100 سطر من
std::cout << "Hello" << std::endl;؟ هذا سخيف.نهج المبرمج — الحلقات. دع الكمبيوتر يكرر كتلة كود حتى يتحقق شرط.
1. حلقة for
(1) 1.1 الصياغة الأساسية
for (initialization; condition; update) {
// Loop body: repeats while condition is true
}
سير التنفيذ:
- التهيئة: تُنفَّذ مرة واحدة فقط (تُستخدم عادةً لتعريف متغير الحلقة)
- فحص الشرط: إذا كان صحيحًا، نفّذ جسم الحلقة؛ إذا كان خاطئًا، اخرج من الحلقة
- تنفيذ جسم الحلقة
- التحديث: بعد تنفيذ جسم الحلقة، حدّث متغير الحلقة
- عد إلى الخطوة 2
▶ مثال 1: إخراج 1-10 (صعوبة ⭐)
#include <iostream>
int main() {
for (int i = 1; i <= 10; i++) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
الخرج:
1
2
3
4
5
6
7
8
9
تحليل الكود:
int i = 1: التهيئة، i يبدأ من 1i <= 10: الشرط، الحلقة تستمر طالما i <= 10std::cout << i << " ": جسم الحلقة، إخراج ii++: التحديث، زيادة i بمقدار 1
2. حلقة while
(1) 2.1 الصياغة الأساسية
while (condition) {
// Loop body: repeats while condition is true
}
سير التنفيذ:
- افحص الشرط
- إذا كان صحيحًا، نفّذ جسم الحلقة
- عد إلى الخطوة 1
💡 نقطة مهمة: حلقة while تُحدِّث متغير الحلقة داخل جسم الحلقة!
▶ مثال 2: إخراج 1-10 باستخدام while (صعوبة ⭐)
#include <iostream>
int main() {
int i = 1; // Initialization
while (i <= 10) { // Condition
std::cout << i << " ";
i++; // Update (inside the loop body!)
}
std::cout << std::endl;
return 0;
}
الخرج:
1 2 3 4 5 6 7 8 9 10
3. حلقة do-while
(1) 3.1 الصياغة الأساسية
do {
// Loop body
} while (condition);
سير التنفيذ:
- نفّذ جسم الحلقة (مرة واحدة على الأقل)
- افحص الشرط
- إذا كان صحيحًا، عد إلى الخطوة 1
💡 نقطة مهمة: حلقة do-while تُنفَّذ مرة واحدة على الأقل!
▶ مثال 3: لعبة تخمين الأرقام (صعوبة ⭐⭐)
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
std::srand(static_cast<unsigned int>(std::time(nullptr)));
int secretNumber = std::rand() % 100 + 1;
int guess;
do {
std::cout << "Guess a number from 1-100: ";
std::cin >> guess;
if (guess > secretNumber) {
std::cout << "Too high!" << std::endl;
} else if (guess < secretNumber) {
std::cout << "Too low!" << std::endl;
}
} while (guess != secretNumber);
std::cout << "🎉 Got it!The answer is " << secretNumber << std::endl;
return 0;
}
الخرج:
Guess a number from 1-100:
Too high!
Too low!
🎉 Got it!The answer is 42
💡 لماذا نستخدم do-while؟ لأن المستخدم يجب أن يخمّن مرة واحدة على الأقل، لذا جسم الحلقة يجب أن يُنفَّذ مرة واحدة على الأقل.
4. for مقابل while مقابل do-while
| نوع الحلقة | أفضل حالة استخدام | الخاصية |
|---|---|---|
| for | عدد تكرارات معروف | التهيئة والشرط والتحديث مجمعون معًا — بنية واضحة |
| while | تكرارات غير معروفة لكن شرط معروف | متغير الحلقة يُحدَّث داخل جسم الحلقة |
| do-while | يجب التنفيذ مرة واحدة على الأقل | جسم الحلقة يُنفَّذ مرة واحدة على الأقل |
نصيحة الاختيار:
- إذا كنت تعرف عدد التكرارات (مثل "أخرج 100 مرة")، استخدم for
- إذا كنت لا تعرف عدد التكرارات لكنك تعرف الشرط (مثل "استمر في التخمين حتى الصحة")، استخدم while أو do-while
5. break وcontinue
(1) 5.1 break: الخروج من الحلقة بالكامل
break يُستخدم لإنهاء الحلقة مبكرًا.
مثال: إيجاد أول عدد قابل للقسمة على 7 (صعوبة ⭐)
#include <iostream>
int main() {
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0) {
std::cout << "The first number divisible by 7 is: " << i << std::endl;
break; // Exit the loop after finding it
}
}
return 0;
}
(2) 5.2 continue: تخطي التكرار الحالي
continue يُستخدم لتخطي التكرار الحالي والانتقال مباشرة إلى التالي.
مثال: إخراج الأعداد الفردية من 1-10 (صعوبة ⭐)
#include <iostream>
int main() {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // If even, skip this iteration
}
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
6. الحلقات المتداخلة
يمكن للحلقة أن تحتوي على حلقة أخرى بداخلها — هذا يسمى حلقة متداخلة.
▶ مثال 4: طباعة جدول الضرب (صعوبة ⭐⭐)
#include <iostream>
int main() {
for (int i = 1; i <= 9; i++) { // Outer loop: controls rows
for (int j = 1; j <= i; j++) { // Inner loop: controls columns
std::cout << j << " x " << i << " = " << i * j << "\t";
}
std::cout << std::endl; // Newline
}
return 0;
}
الخرج:
1 x 1 = 1
1 x 2 = 2 2 x 2 = 4
...
💡 سير التنفيذ:
- الحلقة الخارجية
i = 1: الحلقة الداخليةjتذهب من 1 إلى 1، تُخرج عمودًا واحدًا - الحلقة الخارجية
i = 2: الحلقة الداخليةjتذهب من 1 إلى 2، تُخرج عمودين - ...
- الحلقة الخارجية
i = 9: الحلقة الداخليةjتذهب من 1 إلى 9، تُخرج 9 أعمدة
7. الحلقات اللانهائية
إذا كان شرط الحلقة صحيحًا دائمًا، تتشكل حلقة لانهائية.
▶ مثال 5: حلقة لانهائية (صعوبة ⭐)
#include <iostream>
int main() {
while (true) { // Condition is always true
std::cout << "Infinite loop..." << std::endl;
}
return 0; // This line is never reached
}
الخرج:
Infinite loop...
💡 كيف تتوقف؟ اضغط Ctrl + C لإنهاء البرنامج قسريًا.
💡 هل الحلقات اللانهائية مفيدة؟ نعم! مثلًا، برامج الخوادم تحتاج للاستمرار في التشغيل وانتظار طلبات المستخدمين.
8. تطبيق: حساب المضروب
▶ مثال 6: حساب n! (صعوبة ⭐⭐)
#include <iostream>
int main() {
int n;
std::cout << "Please enter a positive integer: ";
std::cin >> n;
long long factorial = 1; // Use long long to prevent overflow
for (int i = 1; i <= n; i++) {
factorial *= i;
}
std::cout << n << " ! is: " << factorial << std::endl;
return 0;
}
الخرج:
Please enter a positive integer: 5
5 ! is: 120
نتيجة التشغيل:
Please enter a positive integer: 5
5 ! is: 120
💡 نصيحة: 20! تتجاوز مدى long long، لذا حتى مع long long يمكنك حساب حتى 20 فقط.
❓ أسئلة شائعة
for (; i <= 10; i++) تحذف التهيئة، for (;;) هي حلقة لانهائية (تكافئ while(true)).for يمكن إعادة كتابتها كـ while، والعكس بالعكس. قاعدة الاختيار: استخدم for عندما تعرف العدد، واستخدم while عندما تعرف الشرط.break يخرج فقط من مستوى الحلقة الحالي. للخروج من مستويات متعددة، استخدم "متغير عَلَم" أو goto (غير موصى به كبديل).📖 ملخص
- حلقة for: استخدمها عندما تعرف عدد التكرارات
- حلقة while: استخدمها عندما لا تعرف عدد التكرارات لكنك تعرف الشرط
- حلقة do-while: استخدمها عندما يجب أن تُنفَّذ الحلقة مرة واحدة على الأقل
- break: الخروج من الحلقة بالكامل
- continue: تخطي التكرار الحالي والانتقال إلى التالي
- يمكن تداخل الحلقات؛ الحلقة الداخلية تعمل بالكامل لكل تكرار من الحلقة الخارجية
📝 تمارين
-
أساسي (صعوبة ⭐): استخدم حلقة for لإخراج جميع الأعداد من 1-100 القابلة للقسمة على 3.
-
متوسط (صعوبة ⭐⭐): استخدم حلقات متداخلة لطباعة النمط التالي:
*
**
***
****
*****
- تحدي (صعوبة ⭐⭐⭐): اكتب برنامجًا يتيح للمستخدم إدخال عدد صحيح موجب n، ثم إخراج n صفوف من مثلث باسكال.
Please enter number of rows: 5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
- حلقة for: استخدمها عندما تعرف عدد التكرارات
- حلقة while: استخدمها عندما تعرف الشرط
- حلقة do-while: استخدمها عندما يجب التنفيذ مرة واحدة على الأقل
- break يخرج من الحلقة، continue يتخطى التكرار الحالي
- في الحلقات المتداخلة، الحلقة الداخلية تعمل بالكامل لكل تكرار من الحلقة الخارجية
9. 🚀 الخطوة التالية
الآن بعد أن تعلمت الحلقات، سنتعلم بعد ذلك الدوال (الدرس 08) — تغليف الكود في وحدات قابلة لإعادة الاستخدام لجعل البرامج أنظف وأسهل في الصيانة!