الخميس، 26 مارس 2015

إستخدام المعاملات المنطقيـة مع الجملـة if :

إستخدام المعاملات المنطقيـة مع الجملـة if :
للمتغيرات المنطقيـة فوائد كثيرة للغايـة ، إلا أنها تخفـى عـنا بسـبب اعتمادنـا
الكبير على المتغيرات الأخرى وبسبب أيضاً أنها تأخرت قليلاً في الظهـور فـي
المترجمــات المشهـــورة مثــل البورلانــد والفيجــوال ، للمتغيــرات المنطقيـــة
قيمتين فحسب واحدة منها هـي صواب true والأخرى هـي false ، ولن نقوم
بوضع أي أمثلة عـملية هـنا بل سنترك الأمر كمهارة لك في المستقبل ، انظر
لهذه الأسطر:
bool value=true;
if (value)
cout << "Hellow";
قمنا بتهيئـة المتغير المنطقي value بالقيمـة true ثم تقوم الجملـة if بإختبار
الشــرط وهـــو إذا كانــت قيمـــة value صحيحـــة أو true ثــم تقــوم بطباعتهــا ،
الجملة if شبيهـة بالشرط التالي:
if (value==true)
أما في حال ما أردنا العـكس فبإمكاننا كتابة التالي:
if (!value)
والتي تعـني السطر التالي:
if (value==false)
لاحـظ هـنا أننا لم نقـم بوضع علامتي أقواس الكتل الكبيرة { } والسبب فـي
ذلك أننا لم نرد للجملـة if أن تقوم سوى بتنفيذ جملـة واحـدة فحسـب أمـا إذا
أردنا كتابة أكثر من جملة فعلينا بتضمين الجمل أو الأوامر بين قوسين.
المعاملات المنطقية:
لم نناقش هذا الموضوع في الوحدة السابقة ولـيس السـبب فـي ذلـك عــدم
أهـميتـه بـل إن السـبب يعــود بالدرجــة الأولـى إلـى تأجيـل الموضـوع لحـين
ظهـور فائدتـه وبالتالي التأكيد على أهـميتـه.
تستخدم المعاملات المنطقية كثيراً في الجمل الشرطيـة ، والسبب في ذلـك
إلى أنها تناور الجملـة if وتجعلها تقبل أكثر من شرط مع العلم أن الجملـة if لا
تقوم بإختبار أكثر مـن شـرط ولكـن بواسطــة المعـاملات المنطقيـة فبإمكانـك
جعل أكثر من شرط شرطاً واحداً وبالتالي تستطيع مناورة الجملـة if .
صحيح أننا قمنا بمناقشـة بعضاً من هذا الموضوع في الوحدة السابقة إلا أننا
لم نتعرض لثلاث معاملات أخرى مهـمـة وهـي:
1- معامل ( و) And : ورمزه && .
2- معامل ( أو ) OR : ورمزه || .
3- معامل (ليس) Not: ورمزه ! .
المعامل (And ):
هـذا المعامـل يقـوم باختبـار تعبيــرين وإذا كـان كلاهــما صــحيحاً فإنــه يرجــع
بالقيمـة true ، لنفرض أنك تقوم بكتابة برنـامج يقـوم باختبـار درجـات الطـلاب
وإعطاؤهـم التقدير المناسب ، فإنك ستكتب لحساب التقدير ممتاز هـكذا:
if ( (total > 90) && (total < 100 ) )
وبالتـالي فلـن تعــمل الجملــة if إلا إذا كـان التعبيـرين صــحيحين أمـا إذا كـان
أحدهـما صحيح فلن تعـمل .
المعـامل ( OR ):
يقوم المعامل باختبار تعبيرين وفي حال كان أحد التعبيرين صحيحاً فإنـه يرجع
بالقيمـة true ، لنفرض أنك تـود إضـافة جملـة شرطيــة تقـوم بالتأكـد مـن أن
المستخدم أدخل رقماً صـحيحاً (نتحـدث هــنا عــن برنـامج درجـات الطـلاب) ،
فإنك ستجعل الجملـة if هـكذا:
if ( (total < 0) || (total > 100 )
وبالتالي فستعـمل الجملــة if إذا أدخـل المسـتخدم عــدداً أصـغر مـن الصـفر
وستعـمل أيضاً إذا أدخل عـدداً أكبر من 100 .
المعامل ( NOT ) :
يقوم هذا المعامل باختبار تعبير واحد وهي تعـود بالقيمـة true إذا كان التعبير
الذي يجري اختباره خـطأ ، لنفرض أنك تود كتابة برنامج يقوم المسـتخدم مـن
خلالـه بإدخـال عــددين اثنـين ثـم يتأكـد البرنـامج إن كـان العـدد الثـاني لـيس
قاسماً للعدد الأول (ليكون قاسماً لا بد أن يكون خارج باقي القسمـة يسـاوي
الصفر) ، انظر لهذا الكـود:
if ( !(numberOne% numberTwo == 0))
وبالتالي ففي حال كان خارج القسمـة يساوي الصفر فلن يـتم تنفيـذ الجملـة
. if
مثال عـملي:
سنقوم الآن بكتابة برنامج بسيط للطلاب يقوم الطالب فيه بإدخال درجتـه ثـم
يقوم الحاسب بإعطاءه التقدير (ممتاز أم جيد .. إلخ) .
وسنستخدم في هذا المثال العبـارة if/else والمعـاملات المنطقيــة وبـالطبع
ففي نهاية هذه الوحدة سنقوم بتطوير الكـود ليقدم خدمات أكثر فائدة. وربمـا
في المستقبل تستطيع تطويره ليصبح مشروعاً رسومياً متكاملاً.
CODE
1- #include <iostream>
2- using namespace std;
3-
4- int main()
5- {
6- float degree=0;
7- char mark;
8-
9- cout << "Please Enter Your degree:\t" ;
10- cin >> degree;
11-
12- if ((degree <=100) && (degree>= 90))
13- mark='A';
14-
15- else if ((degree <90) && (degree>= 80))
16- mark='B';
17-
18- else if ((degree <80) && (degree>= 70))
19- mark='C';
20-
21- else if ((degree <70) && (degree>= 60))
22- mark='D';
23-
24- else if ((degree <60) || (degree>= 0))
25- mark='F';
26-
27- else if((degree >100) || (degree < 0)) {
28- cout << "False degree" << endl;return 0;
29- }
30- else {cout << "Bad command" << endl;
31- return 0 ;}
32- cout << endl;
33- cout << "Your Mark:\t" << mark ;
34- cout << endl;
35-
36- return 0;
37- }
في السطر 6 و7 قمنا بالإعلان عـن متغيـرين اثنـين المتغيـر الأول هــو درجــة
الطالب والمتغير الثاني هـو تقدير الطالب.
في السطر 10 يطلب البرنامج من المستخدم إدخال درجتـه ثم ينتقل التنفيـذ
إلى عبارات if/else ، ولنفـرض أن المسـتخدم أدخـل كدرجــة لـه العــدد 102
وكما تعلم فإن هذه الدرجـة غير صحيحـة لأنها تجاوزت الدرجـة النهائية وهـي
100 ، وبالتالي فإن التنفيذ سيصل للجملـة if التي تعـالج هـذا الوضـع وهــي
موجودة في السطر 27 وهـي كالتالي:
1- else if((degree >100) || (degree < 0)) {
2- cout << "False degree" << endl;
3- return 0;
4- }
كما ترى فإن التعبيرين الذين تقـوم الجملــة if/else باختبارهــما ، إذا مـا كـان
أحدهــما صــحيحاً فسـتقوم بتنفيـذ نفسـها وإلا فسـتمنع البرنـامج مـن تنفيـذ
الســطر الثــاني والثالــث وكمــا تــرى فــإن التعبيــر الأول فــي حــال مــا أدخــل
المستخدم الدرجـة 102 يعيد القيمـة true وبالتالي يتجاهـل البرنـامج التعبيـر
الثـاني ولا يقـوم باختبـاره أمـا إذا كـان التعبيـر الأول يعيـد القيمـة false فلـن
يتجاهل التعبيـر الثـاني وسـيقوم باختبـاره ، بالنسـبة لحالتنـا الأولـى فسـيتم
تنفيذ السطر الثاني والثالث ، وكما ترى ففـي السـطر الثـاني يقـوم البرنـامج
بطباعــة الجملــة degree False ثـم حينمـا يصـل للســطر الثالـث يـتم إنهــاء
البرنامج بواسطـة الكلمـة 0 return وهذا الفعـل صـحيح 100% ولا يعيبـه أي
خـطأ أو حتى تحذير من المترجم ، أما بالنسبة لإنهائنا البرنامج فيعــود إلا أننـا
لا نريد من البرنامج أن يكون مضحكاً حاول أن تقوم بإلغـاء السـطر الثالـث مـن
الكـود ثم أعـد تنفيـذ البرنـامج وانظـر مالـذي سـيحدث والنتـائج الغريبـة التـي
ستظهر.
بالنسبة لبقيـة عبـارات if/else فـلا جــديد فيهـا وتقـوم فقـط باختبـار الدرجــة
المعطاة وإظهار التقدير العام للدرجـة.
الآن ما رأيك لو نخمـن مـا هـي ادخـالات المسـتخدم ، لنفـرض أن المسـتخدم
حاول أن يكتـب فـي هـذا البرنـامج اسمــه الكامـل بـدلاً مـن أن يقـوم بإدخـال
درجتـه فهل تستطيع التخـمين عـما سيحدث في البرنامج.
لا أحد يعرف مـا الـذي سـيحدث وقـد تختلـف النتـائج مـن جهــاز لجهــاز ولكـن
حسب تخـميني فقد ينتقل التنفيذ إلى الجملـة if/else في السـطر 24 . أمـا
عـن كيفيـة معالجـة هذه الادخـالات فبإمكــاني تزويـدك بإحـدى التقنيـات وإن
كانت ناقصـة فبإمكـانك أن تكتب في أعلى جملـة if ما يلي:
1- if (cin.fail() ) {
2- cout << "False degree" << endl;
3- return 0;
4- }
حيث يقوم التعبير fail.cin باختبـار مـا إذا كـان الإدخـال فشـل. وأنـا لا أعــني
حينما أقول بأن الإدخال فشل أي إدخال درجـة الطالب بل أي إدخال آخر فـي
البرنـامج فـأي متغيـر الآن تقـوم بكتابتـه وإدخالـه بواسطــة تيـار الإدخـال cin
فسيتم تطبيق الجملـة if عليه وإنهـاء البرنـامج حتـى وإن كـان إدخـال درجــة
الطالب صحيح. ولا تعتقد أن الأمر ينتهي عـند هذا الحد بل هـناك أمور ينبغـي
علينا معالجتها من ضمنها آثار الخـطأ الذي قام المسـتخدم بإدخالـه لا تشـغل
بالك الآن بهذه الأمـور فسيأتي وقتها فيما بعـد.

ليست هناك تعليقات:

إرسال تعليق