C++: الجمل الشرطية
آخر تحديث: 2026-08-26
في الدروس السابقة، كانت البرامج تُنفَّذ من الأعلى إلى الأسفل بدون تفريع.
لكن البرامج الواقعية تحتاج لـ "اتخاذ قرارات" — مثلًا:
- إذا كانت النتيجة >= 60، أخرج "ناجح"؛ وإلا أخرج "راسب"
- إذا كان عطلة نهاية الأسبوع، اخرج والعب؛ وإلا، ادرس
هذا هو غرض الجمل الشرطية.
1. جملة if
(1) 1.1 الصياغة الأساسية
if (condition) {
// code to execute when condition is true
}
سير التنفيذ:
- تقييم
الشرط(يجب أن يكون نوعboolأو قابل للتحويل إلىbool) - إذا كان
true، نفّذ الكود داخل الأقواس - إذا كان
false، تجاوزه
▶ مثال 1: فحص زوجي أو فردي (صعوبة ⭐)
#include <iostream>
int main() {
int num;
std::cout << "Please enter an integer: ";
std::cin >> num;
if (num % 2 == 0) {
std::cout << num << " is Even" << std::endl;
}
if (num % 2 != 0) {
std::cout << num << " is Odd" << std::endl;
}
return 0;
}
الخرج:
Please enter an integer:
is Even
is Odd
نتيجة التشغيل:
Please enter an integer: 7
7 is Odd
💡 نصيحة: البرنامج أعلاه يستخدم جملتي if، لكن يمكن تبسيطه باستخدام if-else (انظر القسم التالي).
2. جملة if-else
(1) 2.1 الصياغة الأساسية
if (condition) {
// execute when condition is true
} else {
// execute when condition is false
}
نقطة مهمة: واحد من الفرعين بالضبط سيُنفَّذ، أبدًا كلاهما وأبدًا لا شيء.
▶ مثال 2: فحص زوجي أو فردي (محسّن) (صعوبة ⭐)
#include <iostream>
int main() {
int num;
std::cout << "Please enter an integer: ";
std::cin >> num;
if (num % 2 == 0) {
std::cout << num << " is Even" << std::endl;
} else {
std::cout << num << " is Odd" << std::endl;
}
return 0;
}
الخرج:
Please enter an integer:
is Even
is Odd
(2) 2.2 حذف الأقواس (غير موصى به)
إذا كان هناك عبارة واحدة فقط بعد if أو else، يمكنك حذف الأقواس:
if (num % 2 == 0)
std::cout << "Even" << std::endl; // ✅ Only one statement, braces can be omitted
else
std::cout << "Odd" << std::endl;
💡 لكن! يُنصح بشدة بعدم فعل ذلك — حذف الأقواس يؤدي بسهولة إلى أخطاء:
if (num % 2 == 0)
std::cout << "Even" << std::endl;
std::cout << "This number is divisible by 2" << std::endl; // ❌ This line always executes (indentation fooled you)
الممارسة الموصى بها: استخدم الأقواس دائمًا، حتى لعبارة واحدة.
3. سلسلة if-else if-else
عندما تكون هناك شروط متعددة للتحقق، استخدم else if:
if (condition1) {
// execute when condition1 is true
} else if (condition2) {
// execute when condition1 is false and condition2 is true
} else if (condition3) {
// execute when conditions 1 and 2 are false and condition3 is true
} else {
// execute when none of the above conditions are true
}
💡 نقطة مهمة: بمجرد أن يكون شرط صحيح، فروع else if وelse اللاحقة لن تُنفَّذ.
▶ مثال 3: تقييم الدرجات (صعوبة ⭐⭐)
#include <iostream>
int main() {
int score;
std::cout << "Please enter a score (0-100): ";
std::cin >> score;
if (score >= 90) {
std::cout << "Excellent! Grade: A" << std::endl;
} else if (score >= 80) {
std::cout << "Good! Grade: B" << std::endl;
} else if (score >= 70) {
std::cout << "Medium! Grade: C" << std::endl;
} else if (score >= 60) {
std::cout << "Pass! Grade: D" << std::endl;
} else {
std::cout << "Not Pass! Grade: F" << std::endl;
}
return 0;
}
الخرج:
Please enter a score (0-100):
Excellent! Grade: A
Good! Grade: B
Medium! Grade: C
Pass! Grade: D
Not Pass! Grade: F
نتيجة التشغيل:
Please enter a score (0-100): 85
Good! Grade: B
💡 تقنية: else if (score >= 80) تتضمن ضمنيًا الشرط score < 90 (لأنه لو كان score >= 90 صحيحًا، ما كان البرنامج سيصل إلى هذه النقطة).
4. if المتداخلة
يمكن لجملة if أن تحتوي على if آخر بداخلها — هذا يسمى التداخل.
▶ مثال 4: فحص السنة الكبيسة (صعوبة ⭐⭐)
#include <iostream>
int main() {
int year;
std::cout << "Please enter a year: ";
std::cin >> year;
if (year % 400 == 0) {
std::cout << year << " is a leap year" << std::endl;
} else {
if (year % 4 == 0) {
if (year % 100 != 0) {
std::cout << year << " is a leap year" << std::endl;
} else {
std::cout << year << " is not a leap year" << std::endl;
}
} else {
std::cout << year << " is not a leap year" << std::endl;
}
}
return 0;
}
الخرج:
Please enter a year:
is a leap year
is a leap year
is not a leap year
is not a leap year
💡 نصيحة: يمكن تبسيط هذا البرنامج باستخدام العوامل المنطقية (تعلمناها في الدرس 04):
bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (isLeapYear) {
std::cout << year << " is a leap year" << std::endl;
} else {
std::cout << year << " is not a leap year" << std::endl;
}
5. جملة switch-case
عندما يكون الشرط مقارنة مساواة أعداد صحيحة، يمكنك استخدام switch-case بدلًا من سلسلة if-else if.
(1) 5.1 الصياغة الأساسية
switch (expression) {
case value1:
// execute when expression == value1
break;
case value2:
// execute when expression == value2
break;
...
default:
// execute when none of the above match
break;
}
▶ مثال 5: آلة حاسبة بسيطة (صعوبة ⭐⭐)
#include <iostream>
int main() {
double num1, num2;
char op;
std::cout << "Please enter the first number: ";
std::cin >> num1;
std::cout << "Please enter an operator (+ - * /): ";
std::cin >> op;
std::cout << "Please enter the second number: ";
std::cin >> num2;
switch (op) {
case '+':
std::cout << num1 << " + " << num2 << " = " << num1 + num2 << std::endl;
break;
case '-':
std::cout << num1 << " - " << num2 << " = " << num1 - num2 << std::endl;
break;
case '*':
std::cout << num1 << " * " << num2 << " = " << num1 * num2 << std::endl;
break;
case '/':
if (num2 != 0) {
std::cout << num1 << " / " << num2 << " = " << num1 / num2 << std::endl;
} else {
std::cout << "Error: Divisor cannot be 0!" << std::endl;
}
break;
default:
std::cout << "Error: Unsupported operator!" << std::endl;
break;
}
return 0;
}
الخرج:
Please enter the first number:
Please enter an operator (+ - * /):
Please enter the second number:
+ =
- =
* =
/ =
Error: Divisor cannot be 0!
Error: Unsupported operator!
(2) 5.2 دور break
break يُستخدم للخروج من جملة switch. إذا نسيت كتابة break، سيستمر البرنامج في تنفيذ case التالي (هذا يسمى "fall-through").
int day = 2;
switch (day) {
case 1:
std::cout << "Monday" << std::endl;
// ❌ No break, will continue to case 2
case 2:
std::cout << "Tuesday" << std::endl;
break;
case 3:
std::cout << "Wednesday" << std::endl;
break;
}
// Output:
// Tuesday
💡 نصيحة: أحيانًا استخدام fall-through المتعمد يمكن أن يبسّط الكود (مثلًا، عدة case تنفذ نفس الكود)، لكن أضف تعليقًا للتوضيح.
char grade = 'B';
switch (grade) {
case 'A':
case 'B': // Intentional fall-through: A and B execute the same code
case 'C':
std::cout << "Passed!" << std::endl;
break;
case 'D':
case 'F':
std::cout << "Failed..." << std::endl;
break;
}
6. العامل الشرطي (العامل الثلاثي)
C++ لديها "اختصار" لـ if-else يسمى العامل الثلاثي.
(1) 6.1 الصياغة الأساسية
condition ? expression1 : expression2
المعنى: إذا كان الشرط صحيحًا، أرجع قيمة expression1؛ وإلا أرجع قيمة expression2.
▶ مثال 6: إيجاد القيمة القصوى (صعوبة ⭐)
#include <iostream>
int main() {
int a = 10, b = 20;
int max = (a > b) ? a : b; // If a > b is true, max = a; otherwise max = b
std::cout << "Maximum is: " << max << std::endl; // Output: Maximum is: 20
return 0;
}
الخرج:
Maximum is: 20
💡 نصيحة: العامل الثلاثي مناسب للإسناد الشرطي البسيط. إذا كان المنطق معقدًا، فإن if-else أوضح.
7. تطبيق: لعبة تخمين الأرقام
▶ مثال 7: خمّن الرقم (صعوبة ⭐⭐)
#include <iostream>
#include <cstdlib> // For rand() and srand()
#include <ctime> // For time()
int main() {
// Use current time as random seed (covered in detail later)
std::srand(static_cast<unsigned int>(std::time(nullptr)));
int secretNumber = std::rand() % 100 + 1; // Generate random number 1-100
int guess;
int attempts = 0;
std::cout << "========== Number Guessing Game ==========\n";
std::cout << "I'm thinking of a number from 1-100. Try to guess!\n\n";
do {
std::cout << "Please enter your guess: ";
std::cin >> guess;
attempts++;
if (guess > secretNumber) {
std::cout << "Too high!Try again。\n";
} else if (guess < secretNumber) {
std::cout << "Too low!Try again。\n";
} else {
std::cout << "\n🎉 Congratulations! You got it!\n";
std::cout << "You guessed " << attempts << " time。\n";
}
} while (guess != secretNumber);
return 0;
}
الخرج:
========== Number Guessing Game ==========
I'm thinking of a number from 1-100. Try to guess!
Please enter your guess:
Too high!Try again。
Too low!Try again。
🎉 Congratulations! You got it!
You guessed times。
نتيجة التشغيل:
========== Number Guessing Game ==========
I'm thinking of a number from 1-100. Try to guess!
Please enter your guess: 50
Too high!Try again。
Please enter your guess: 25
Too low!Try again。
Please enter your guess: 37
Too high!Try again。
Please enter your guess: 31
🎉 Congratulations! You got it!
You guessed 4 time。
💡 نصيحة: يستخدم هذا البرنامج حلقة do-while (ستُغطى بالتفصيل في الدرس 07) — يمكنك نسخه حاليًا وفهم المنهج العام.
❓ أسئلة شائعة
x = 5 قيمته 5 (غير الصفري يُعامل كصحيح)، فالشرط يكون صحيحًا دائمًا. تقنية مضادة للأخطاء: ضع الثابت على اليسار — if (5 = x) سيسبب خطأ ترجمة، if (5 == x) صحيح.switch يجب أن يكون نوع عدد صحيح (int، char، enum). لمقارنات الفاصلة العائمة، استخدم if-else، وانتبه لمشاكل دقة الفاصلة العائمة.std::cout في كل فرع لترى أي واحد يصل إليه البرنامج.📖 ملخص
ifيفحص شرطًا وينفذه عندما يكون صحيحًاif-elseلديه فرعان؛ واحد بالضبط سيُنفَّذ- سلسلة
if-else if-elseتتعامل مع شروط متعددة switch-caseجيد لمقارنات مساواة الأعداد الصحيحة؛ لا تنسَbreak- العامل الثلاثي
? :اختصار لـif-else - الإسناد
=والمقارنة==مختلفان — لا تخلط بينهما!
📝 تمارين
- أساسي (صعوبة ⭐): اكتب برنامجًا يتيح للمستخدم إدخال عدد صحيح ويحدد هل هو موجب أم سالب أم صفر.
Please enter an integer: -5
-5 isNegative number
-
متوسط (صعوبة ⭐⭐): اكتب برنامجًا يتيح للمستخدم إدخال سنة ويحدد هل هي سنة كبيسة.
-
قاعدة السنة الكبيسة: قابلة للقسمة على 4 لكن ليس على 100، أو قابلة للقسمة على 400
-
نفّذها باستخدام
if-else -
تحدي (صعوبة ⭐⭐⭐): اكتب برنامجًا ينفذ "آلة حاسبة بسيطة":
-
دع المستخدم يدخل عددين وعامل (+ - * /)
-
نفّذها باستخدام
switch-case -
إذا كان المقسوم 0، اعرض خطأ
-
إذا كان العامل غير مدعوم، اعرض خطأ
-
نتيجة التشغيل:
Please enter the first number: 10
Please enter an operator: /
Please enter the second number: 3
Result: 10 / 3 = 3.33333
- if يفحص شرطًا وينفذ كتلة الكود عندما يكون صحيحًا
- if-else لديه فرعان؛ واحد بالضبط سيُنفَّذ
- سلسلة if-else if-else تتعامل مع شروط متعددة
- switch-case يتعامل مع سيناريوهات التفريع المتعدد للأعداد الصحيحة
- العامل الشرطي ?: يبسّط if-else البسيطة
8. 🚀 الخطوة التالية
الآن بعد أن تعلمت الجمل الشرطية، سنتعلم بعد ذلك هياكل الحلقات (for، while، do-while) (الدرس 07) — تمكين البرامج من تكرار الكود بدون كتابته يدويًا 100 مرة!