جود ثيمز

السبت، 10 أغسطس 2013

الجمل الشرطية في ++C - جملة if else

ملاحظة يتطلب منك هذا الدرس ان تكون ملماً بالمعاملات الرياضية والمنطقية في ++C , ويمكنك عبر هذا الرابط الانتقال إلى درس المعاملات الرياضية والمنطقية في ++C .
ايضاً يجب أن تكون ملماً بالمنطق الرياضي , أو انتقل إلى درس المنطق الرياضي .

وصلنا الآن إلى الجزء الممتع في البرمجة وهو جُمل التحكم التي تساعدك في بناء برامج أكثر ذكاءً ومرونة , وأول جُمل التحكم التي سنتناولها هي جملة if else الشرطية .
نستخدم جملة if else لاختبار عدد لا محدود من الشروط التي تحتاج إليها لتسيير البرنامج كما تريد , وعبارة if else تقوم بفحص الشرط مرة واحدة فقط فإذا كان صحيحاً تنفذ الأوامر التي تسندها إليها , وإذا كان خاطئاً تتجاوز مباشرة إلى الأوامر التي بعدها .

القاعدة العامة لكتابة جملة if else هي كالتالي :

if (اختباره تريد الذي الشرط)
{
//الشرط تحقق إذا تنفيذها تريد التي الأوامر
}
else if (اختباره تريد الذي الآخر الشرط)
{
//الشرط تحقق إذا تنفيذها تريد التي الأوامر
}
else if (اختباره تريد الذي الآخر الشرط)
{
//الشرط تحقق إذا تنفيذها تريد التي الأوامر
}
......
......
else
{
//خاطئة أعلاه الشروط جميع كانت اذا تنفيذها تريد التي الأوامر
}
ملاحظة :
العبارة الأساسية في القاعدة الموضحة أعلاه هي عبارة if فيجب كتابتها وبدونها لن تستطيع اختبار أي شرط أما عبارة else if وعبارة else فهما اختياريتان ويمكنك الاستغناء عنهما وهذا حسب حاجتك في البرنامج , وسيتضح من خلال الامثلة التالية ...
المثال الأول :
برنامج يطلب من المستخدم ادخال أي رقم فإذا كان الرقم يساوي 5 فإن البرنامج يخبره ان الرقم هو 5 , وإذا كان أكبر من 5 أو أصغر من 5 لا يقوم البرنامج بفعل أي شئ ويتم الخروج من البرنامج .
الحل :
ما سنحتاجه أولاً هو متغير يمثل الرقم الذي سيدخله المستخدم وسنسميه "number" و سيكون من النوع float .

قد تسأل لماذا اخترت النوع float ؟ لماذا لم تختر النوع integer ؟

لأن النوع float يشمل الأعداد الكسرية أما integer فيشمل الأعداد الصحيحة فقط , لنفرض أن المستخدم أدخل العدد 5.3 (وهو أكبر من 5) فإذا جعلت المتغير من النوع integer فإن العدد الذي أدخله المستخدم سيتحول من 5.3 إلى 5 وبالتالي سيعتبره البرنامج مساوياً لـ 5 , وهذا خطأ كبير فالعدد 5.3 أكبر من 5 وليس مساوياً له , لهذا استخدمت النوع float .
ثانياً يجب ان نقارن الرقم الذي سيدخله المستخدم مع العدد 5 لهذا سنحتاج إلى جملة if وسنستخدم معامل المقارنة (==) لنفحص هل الرقم مساوي لـ 5 أم لا .
كود البرنامج :
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
float number;  /* المستخدم سيدخله الذي الرقم يمثل المتغير هذا */
cout << "Enter a number: ";
cin >> number;  /* الرقم ليدخل المستخدم انتظار */
if (number == 5)  /* 5 يساوي number هل */
{
cout << "The number is = 5 .";
}

getch();
return 0;
}

المثال الثاني :
برنامج يطلب من المستخدم ادخال رقم , فإذا كان الرقم أكبر من "5" فإن البرنامج يخبره أن الرقم أكبر من "5", بالمثل اذا كان أصغر من "5" يخبره البرنامج أن الرقم أقل من "5" , ايضاً اذا كان الرقم يساوي "5" فإن البرنامج سيخبره أن الرقم يساوي "5" .
الحل :
أول ماسنفعله أننا سنحجز متغيراً في الذاكرة من النوع float وهذا المتغير سيمثل الرقم الذي سنطلب من المستخدم ادخاله وسنقوم بمقارنته مع العدد "5" , وسنسميه بالاسم "number" .
ثانياً المطلوب منا هو أن نقارن المتغير بالعدد "5" فإذا كان أكبر من "5" (يعني number>5) نطبع للمستخدم رسالة ان هذا الرقم أكبر من "5" , نفس الشئ اذا كان أصغر من "5" واذا كان يساوي "5" ...

لا تقلق اذا لم تفهم الأمر بعد , فمع كتابتك للكود بنفسك سوف تفهم كل ما قلته :
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
float number;  /* المستخدم سيدخله الذي الرقم يمثل المتغير هذا */
cout << "Enter a number: ";
cin >> number;  /* الرقم ليدخل المستخدم انتظار */
if (number > 5)  /* 5 من أكبر number هل */
{
cout << "The number is greater than 5 .";
}
else if (number < 5)  /* 5 من أصغر number هل */
{
cout << "The number is less than 5 .";
}
else  /* اذا لم يكن أكبر من 5 ولا اصغر منه اذن فهو يساويه */
{
cout << "The number is 5 .";
}

getch();
return 0;
}

المثال الثالث :
برنامج يطلب من المستخدم ادخال رقم ثم يقوم بإخباره هل الرقم الذي أدخله سالب (negative) أم موجب (positive) .
الحل :
كيف نعرف أن الرقم سالب أو موجب؟ يكون الرقم موجب إذا كان أكبر من الصفر ويكون سالب إذا كان أصغر من الصفر , إذن فأول ماسنفعله بالتأكيد هو حجز متغير في الذاكرة من النوع float يمثل الرقم الذي سيدخله المستخدم وسنسميه "testNumber" .
ثانياً سنقارن المتغير testNumber مع العدد "صفر" فإذا كان أكبر من الصفر (testNumber > 0) فإنه موجب وإذا كان أصغر من الصفر فإنه سالب .
كود البرنامج :
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
float testNumber;
cout << "Enter any number: ";
cin >> testNumber;
if (testNumber > 0)
{
cout << "The number is positive .";
}
else if (testNumber < 0)
{
cout << "The number is negative .";
}
else  /* اذا لم يكن الرقم سالب ولا موجب إذن فهو = صفر */
{
cout << "The number = 0 .";
}

getch();
return 0;
}
المثال الرابع :
برنامج يطلب من المستخدم ادخال رقم ثم يخبره أن هذا الرقم زوجي (Even) أو فردي (Odd) .
الحل :
كيف نعرف أن الرقم زوجي أو فردي؟ الرقم الزوجي يقبل القسمة على 2 بدون باقي (يعني باقي القسمة يساوي صفر) , أما الرقم الفردي فلا يقبل القسمة على 2 (يعني يكون للقسمة باقي) , مثلاً العدد 10 يقبل القسمة على 2 لأن 10÷2=5 والباقي "صفر" اذن فهو عدد زوجي , ولكن 13 لا يقبل القسمة على 2 لأن 13÷2=6 والباقي 1 اذن فهو عدد فردي .
لن أقول لك ماذا سنحتاج لبناء البرنامج , فأنت بالتأكيد تعرف ماذا سنحتاج ^_^
كود البرنامج :
قبل كتابة الكود أود تنبيهك إلى أنه لا يمكنك استعمال معامل باقي القسمة (%) مع الأعداد الكسرية float , بل يستخدم مع النوع integer فقط , لهذا سيكون المتغير الذي سنستخدمه من النوع integer .
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
int number;
cout << "Enter a number: ";
cin >> number;
if ( (number%2) == 0 )
{
cout << "The number is even .";
}
else if ( (number%2) != 0 )
{
cout << "The number is odd .";
}
else
{
cout << "The number is = 0 .";
}

getch();
return 0;
}

الأوامر التي تنفذها لا تقتصر على الطباعة فقط بل يمكنك القيام بأي امر تريد تنفيذه إذا تحقق الشرط , انظر للمثال التالي ..
المثال الخامس :
للوهلة الأولى قد يبدو هذا المثال معقداً ولكنه بسيط جداً , فقط اقرأ المثال عدة مرات ثم جهز المتطلبات بنفسك أما انا فسازودك مباشرة بكود البرنامج .
المثال هو : برنامج يطلب من المستخدم ادخال رقمين , فإذا كان الرقم الأول اكبر من الثاني فإنه يقوم بإيجاد ناتج الجمع لهذين الرقمين , أما اذا كان الرقم الأول اصغر من الثاني فإن البرنامج يقوم بإيجاد الفرق بين الرقمين (يعني ناتج الطرح) , أما اذا كان الرقمان متساويان فلا يقوم البرنامج بأي شئ ويتم الخروج من البرنامج .
الحل :
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
float number1, number2, result;
cout << "Enter the first number: ";
cin >> number1;
cout << "Enter the second number: ";
cin >> number2;
if ( number1 > number2 )
{
result = number1 + number2;
cout << result;
}
else if ( number1 < number2 )
{
result = number1 - number2;
cout << result;
}

getch();
return 0;
}
كما ترى لم نستخدم العبارة else لانه اذا لم يكن الرقم الأول أكبر من الثاني ولا أصغر منه اذن سيكون مساوياً له , لهذا لا حاجة لوضع عبارة else وأنا أريد أن يتم الخروج من البرنامج اذا كان الرقمان متساويان .

تداخل الجمل الشرطية :

لا تخف من العنوان فما أقصده هو أن نضع جملة شرطية بداخل جملة شرطية اخرى (يعني جملة if else داخل جملة if else أخرى) , انظر للمثال التالي :
المثال السادس :
برنامج يطلب من المستخدم ادخال رقم فإذا كان الرقم زوجي فإن البرنامج يتحقق أيضاً ان الرقم موجب ثم يطبع البرنامج رسالة "أن الرقم موجب وزوجي" , أما اذا كان غير ذلك فإن البرنامج يطبع رسالة "أن الرقم غير موجب أو غير زوجي" .
الحل :
انت تعرف كيف نفرق بين الرقم السالب والموجب , أيضاً تعرف كيف نفرق بين الرقم الزوجي و الفردي , إذن لنبدأ العمل ...
كود البرنامج :
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
int number;
cout << "Enter a number: ";
cin >> number;
if ( (number%2) == 0 )
{
   if (number > 0)
    {
      cout << "The number is even and positive .";
    }
   else
    {
      cout << "The number is not even or not positive .";
    }
}
else
{
cout << "The number is not even or not positive .";
}

getch();
return 0;
}
حيث أن جملة if الاولى (الحاضنة) ستفحص اذا كان الرقم زوجي , فإذا كان زوجي سيأتي دور if الثانية (المحضونة) والتي ستفحص إذا كان الرقم موجب أم لا ... ولكن ماذا لو كان الرقم زوجي ولكن ليس موجب؟
هنا سيأتي دور العبارة else التابعة لجملة if الثانية (المحضونة) والتي ستطبع أن "الرقم غير زوجي أو غير موجب" .

استخدام الروابط المنطقية مع الجمل الشرطية :

الروابط المنطقية في لغة ++C هي And (ويمثله المعامل &&)  , و Or (ويمثله المعامل ||) .
تفيدنا الروابط المنطقية في جملة if else بأنها تمكننا من فحص اكثر من شرط في وقت واحد وهذا سيوفر علينا كتابة المزيد من السطور البرمجية , انظر للأمثلة :
المثال السابع :
في هذا المثال سنتناول نفس المثال السادس ولكن سنعدل على الكود الخاص به :
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
int number;
cout << "Enter a number: ";
cin >> number;
if ( (number%2) == 0 && number > 0 )
{
cout << "The number is even and positive .";
}
else
{
cout << "The number is not even or not positive .";
}

getch();
return 0;
}
كما ترى استخدمنا الرابط And لكي نفحص اذا كان الرقم الذي أدخله المستخدم زوجي وموجب في نفس الوقت , يعني لن يكون الشرط صحيحاً إلا اذا كان الرقم زوجي وموجب في نفس الوقت وفي الحالات الأخرى سيكون الشرط خاطئاً .

المثال الثامن :
برنامج يطلب من المستخدم ادخال رقم , فإذا كان موجب وزوجي في آن واحد يطبع البرنامج رسالة أن الرقم موجب وزوجي , وإذا كان إما موجب او زوجي يطبع البرنامج رسالة ان الرقم موجب او زوجي , أما اذا لم يكن موجب ولا زوجي يخبره البرنامج بذلك .
الحل :
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
int number;
cout << "Enter a number: ";
cin >> number;
if ( (number%2) == 0 && number > 0 )
{
cout << "The number is even AND positive .";
}
else if ( (number%2) == 0 || number > 0 )
{
cout << "The number is even OR positive .";
}
else
{
cout << "The number is not even and not positive .";
}

getch();
return 0;
}

هكذا نكون اتممنا درس جملة if else وتذكر ان هذا من اهم الدروس فلا يكاد يخلو برنامج من الجمل الشرطية سواء جملة  if else أو غيرها .
تدرب جيداً و قم بالتعديل في الأمثلة السابقة واستخدم معاملات رياضية ومنطقية اخرى فكل هذا كفيل بجعلك تفهم جيداً كيفية عمل الجمل الشرطية .