C++: الجمل الشرطية

آخر تحديث: 2026-08-26

في الدروس السابقة، كانت البرامج تُنفَّذ من الأعلى إلى الأسفل بدون تفريع.

لكن البرامج الواقعية تحتاج لـ "اتخاذ قرارات" — مثلًا:

  • إذا كانت النتيجة >= 60، أخرج "ناجح"؛ وإلا أخرج "راسب"
  • إذا كان عطلة نهاية الأسبوع، اخرج والعب؛ وإلا، ادرس

هذا هو غرض الجمل الشرطية.


1. جملة if

(1) 1.1 الصياغة الأساسية

TEXT 📖 للعرض فقط
if (condition) {
 // code to execute when condition is true
}

سير التنفيذ:

  1. تقييم الشرط (يجب أن يكون نوع bool أو قابل للتحويل إلى bool)
  2. إذا كان true، نفّذ الكود داخل الأقواس
  3. إذا كان false، تجاوزه

▶ مثال 1: فحص زوجي أو فردي (صعوبة ⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Please enter an integer: 
 is Even
 is Odd

نتيجة التشغيل:

TEXT 📖 للعرض فقط
Please enter an integer: 7
7 is Odd

💡 نصيحة: البرنامج أعلاه يستخدم جملتي if، لكن يمكن تبسيطه باستخدام if-else (انظر القسم التالي).



2. جملة if-else

(1) 2.1 الصياغة الأساسية

TEXT 📖 للعرض فقط
if (condition) {
 // execute when condition is true
} else {
 // execute when condition is false
}

نقطة مهمة: واحد من الفرعين بالضبط سيُنفَّذ، أبدًا كلاهما وأبدًا لا شيء.

▶ مثال 2: فحص زوجي أو فردي (محسّن) (صعوبة ⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Please enter an integer: 
 is Even
 is Odd

(2) 2.2 حذف الأقواس (غير موصى به)

إذا كان هناك عبارة واحدة فقط بعد if أو else، يمكنك حذف الأقواس:

TEXT 📖 للعرض فقط
if (num % 2 == 0)
 std::cout << "Even" << std::endl; // ✅ Only one statement, braces can be omitted
else
 std::cout << "Odd" << std::endl;

💡 لكن! يُنصح بشدة بعدم فعل ذلك — حذف الأقواس يؤدي بسهولة إلى أخطاء:

CPP
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:

TEXT 📖 للعرض فقط
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: تقييم الدرجات (صعوبة ⭐⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Please enter a score (0-100): 
Excellent! Grade: A
Good! Grade: B
Medium! Grade: C
Pass! Grade: D
Not Pass! Grade: F

نتيجة التشغيل:

TEXT 📖 للعرض فقط
Please enter a score (0-100): 85
Good! Grade: B

💡 تقنية: else if (score >= 80) تتضمن ضمنيًا الشرط score < 90 (لأنه لو كان score >= 90 صحيحًا، ما كان البرنامج سيصل إلى هذه النقطة).



4. if المتداخلة

يمكن لجملة if أن تحتوي على if آخر بداخلها — هذا يسمى التداخل.

▶ مثال 4: فحص السنة الكبيسة (صعوبة ⭐⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Please enter a year: 
 is a leap year
 is a leap year
 is not a leap year
 is not a leap year

💡 نصيحة: يمكن تبسيط هذا البرنامج باستخدام العوامل المنطقية (تعلمناها في الدرس 04):

CPP
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 الصياغة الأساسية

TEXT 📖 للعرض فقط
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: آلة حاسبة بسيطة (صعوبة ⭐⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
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").

CPP
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 تنفذ نفس الكود)، لكن أضف تعليقًا للتوضيح.

CPP
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 الصياغة الأساسية

TEXT 📖 للعرض فقط
condition ? expression1 : expression2

المعنى: إذا كان الشرط صحيحًا، أرجع قيمة expression1؛ وإلا أرجع قيمة expression2.

▶ مثال 6: إيجاد القيمة القصوى (صعوبة ⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Maximum is: 20

💡 نصيحة: العامل الثلاثي مناسب للإسناد الشرطي البسيط. إذا كان المنطق معقدًا، فإن if-else أوضح.



7. تطبيق: لعبة تخمين الأرقام

▶ مثال 7: خمّن الرقم (صعوبة ⭐⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
========== 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。

نتيجة التشغيل:

TEXT 📖 للعرض فقط
========== 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) — يمكنك نسخه حاليًا وفهم المنهج العام.


❓ أسئلة شائعة

س لماذا لا يسبب if (x = 5) خطأ؟
ج تعبير الإسناد x = 5 قيمته 5 (غير الصفري يُعامل كصحيح)، فالشرط يكون صحيحًا دائمًا. تقنية مضادة للأخطاء: ضع الثابت على اليسار — if (5 = x) سيسبب خطأ ترجمة، if (5 == x) صحيح.
س هل يمكنني كتابة عدد صحيح مباشرة بعد if؟ مثل if (5)؟
ج نعم. في C++، يُعامل 0 كخاطئ وغير الصفري كصحيح. لكن هذا غير بديهي وغير موصى به.
س هل يمكن لـ switch-case فحص أعداد الفاصلة العائمة؟
ج لا. تعبير switch يجب أن يكون نوع عدد صحيح (int، char، enum). لمقارنات الفاصلة العائمة، استخدم if-else، وانتبه لمشاكل دقة الفاصلة العائمة.
س لماذا سلسلة if-else الخاصة بي تنفذ فقط if الأولى؟
ج عادةً الشرط خاطئ أو هناك مشكلة في نطاق الأقواس. نصيحة تصحيح: أضف علامات std::cout في كل فرع لترى أي واحد يصل إليه البرنامج.

📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): اكتب برنامجًا يتيح للمستخدم إدخال عدد صحيح ويحدد هل هو موجب أم سالب أم صفر.
TEXT 📖 للعرض فقط
Please enter an integer: -5
-5 isNegative number
  1. متوسط (صعوبة ⭐⭐): اكتب برنامجًا يتيح للمستخدم إدخال سنة ويحدد هل هي سنة كبيسة.

  2. قاعدة السنة الكبيسة: قابلة للقسمة على 4 لكن ليس على 100، أو قابلة للقسمة على 400

  3. نفّذها باستخدام if-else

  4. تحدي (صعوبة ⭐⭐⭐): اكتب برنامجًا ينفذ "آلة حاسبة بسيطة":

  5. دع المستخدم يدخل عددين وعامل (+ - * /)

  6. نفّذها باستخدام switch-case

  7. إذا كان المقسوم 0، اعرض خطأ

  8. إذا كان العامل غير مدعوم، اعرض خطأ

  9. نتيجة التشغيل:

TEXT 📖 للعرض فقط
Please enter the first number: 10
Please enter an operator: /
Please enter the second number: 3
Result: 10 / 3 = 3.33333

8. 🚀 الخطوة التالية

الآن بعد أن تعلمت الجمل الشرطية، سنتعلم بعد ذلك هياكل الحلقات (for، while، do-while) (الدرس 07) — تمكين البرامج من تكرار الكود بدون كتابته يدويًا 100 مرة!

Web-Tutorial.com

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

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

100%