المؤثرات المنطقية في C++

المؤثرات المنطقية

رأينا الي الأن عائلتين من المؤثرات , ( بالإضافة إلي المؤثر العجيب ؛ المؤثر الشرطي ) الحسابية والعلائقية . ونعرض الأن لعائلة ثالثة , هي المؤثرات المنطقية operators logical . وتتيح لك هذه المؤثرات أن تربط التعابير البولية , أي التعابير التي ترتبط بمعادلات الجبر البولي , وتكون نتائجها إما صواب أو خطأ ( أي متحقق / غير متحقق (true/false . فمثلا , للعبارة " اليوم هو الأحد " قيمة بولية لأنها تحتمل أن تكون صوابا أو خطأ , زمن العبارات ذات القيم البولية أيضا "ماريا أخذت السيارة " , وبالتالي يمكننا ربط العبارات التالية بمعادلة بولية : " إذا كان اليوم الأحد , " و" أخذت ماريا السيارة , فسوف أستخدم الباص " . الرابطة بين العبارتين هنا هي الحرف "و" . وهو عني أن العبارة الثالثة صحيحة فقط في حالة كون العبارة الأولي "و" الثانية صحيحتان .

ولدينا المؤثرات الثلاثة المنطقية التالية :

المؤثر

تأثيره

&&

||

!

العلاقة "و"

العلاقة " أو "

النفي المنطقي "ليس"

المؤثر المنطقي "و"

لنري كيف أن المؤثرات المنطقية تربط التعابير البولية في لغة السي . إليك تطويرا للعبة المغامرة من أخر برامجها وهو adswitch.cpp , وسوف ندفن كنزا في الموضع (11,7) ونري إن كان باستطاعة اللاعب اكتشافه .

Advenand.cpp

advenand.cpp


 


// advenand.cpp


// demonstrates AND logical operator


#include <iostream.h>


#include <process.h>             // for exit()


#include <conio.h>               // for getche()


void main()


   {


   char ucs='a';


   int x=10, y=10;


 


   while( ucs != '\r' )


      {


      cout << "\nYour location is " << x << ", " << y;


      cout << "\nEnter direction (n, s, e, w): ";


      ucs = getche();            // get direction


      switch(ucs)


     {


     case 'n': y--; break;   // update coordinates


     case 's': y++; break;


     case 'e': x++; break;


     case 'w': x--; break;


     }


      if( x==7 && y==11 )        // if x is 7 and y is 11


     {


     cout << "\nYou found the treasure!\n";


     exit(0);                // exit from program


     }


      }  // end switch


   }  // end main




العبارة الرئيسية في البرنامج هي :



If ( x==7&& y ==11)



وفيها المؤثر && هو المؤثر المنطقي "و" , وتعني العبارة : " إذا كان المتغير x يساوي 7 "و" المتغير y يساوي 11 ".



وتلاحظ أننا لم تضمن كل علاقة تساوي قوسين علي النحو التالي :



If ( (x==7) && (y==11) )



وذلك لأن المؤثرات الحسابية لها في التنفيذ علي المؤثرات المنطقية .



المؤثر "أو"



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



Advenor.cpp




Advenor.cpp


 


// advenor.cpp


// demonstrates OR logical operator


#include <iostream.h>


#include <process.h>             // for exit()


#include <conio.h>               // for getche()


void main()


   {


   char ucs='a';


   int x=10, y=10;


 


   while( ucs != '\r' )          // quit on Enter key


      {


      cout << "\n\nYour location is " << x << ", " << y;


 


      if( x<5 || x>15 )          // if x west of 5 OR east of 15


     cout << "\nBeware: UCS Labs. here";


 


      cou << "\nEnter direction (n, s, e, w): ";


      ucs = getche();            // get direction


      switch(ucs)


     {


     case 'n': y--; break;   // update coordinates


     case 's': y++; break;


     case 'e': x++; break;


     case 'w': x--; break;


     }


      }


   }




والعبارة التي تظهر حين التعرض لوحش هي :



If ( x < 5 || x > 15)



وتعني أن رسالة الإنذار سوف تظهر في حالة كون المتغير قد تجاوز إحدي القيمتين , 5 "أو" 15 .



وهنا أيضا تجد أن المؤثر المنطقي له أولوية أقل من المؤثر العلائقي , فلم نحتج لأقواس داخلية .



المؤثر المنطقي "ليس"



المؤثر المنطقي "ليس" وحيد التأثير unary operator بمعني أنه يدخل علي معمل واحد . (كل المؤثرات التي تعرضنا لها من قبل ثنائية التأثير binary operator عدا المؤثر الشرطي , فهو الوحيد ثلاثي التأثير ternary operator ) , وتأثير هذا المؤثر هو عكس الحالة المنطقية , إذا كانت صحيحة (متحققة) يجعلها غير صحيحة , والعكس بالعكس .



فالتعبير (s==7) صحيح في حالة كون s يساوي 7 , أما التعبير (x==7) ! فصحيح في حالة s لا يساوي 7 (في هذه الحالة بالذات , فإن المؤثر العلائقي x != 7 له نفس التأثير ) .



قيمة التحقق والاتحقق لكل عدد صحيح



لعلك أخذت انطباعا بأن قيم التحقق و الا تحقق لا تكون إلا نتيجة علاقة منطقية . ولكن الحقيقة هي أن أي عدد صحيح بمفرده يعتبر متحققا إذا لك تكن قيمته صفر , وغير متحقق إذا كان صفرا . فبدلا من التعبير : if ( x=0) يمكنك ببساطة كتابة if ! x , وهو يعني نفس الشئ , في حالة كون x يساوي الصفر " , أو قيمة x غير متحققة " كما يحلو لك التعبير . والأن إليك مثالا أكثر تطورا تخيل أنك تريد أن تدخل فطر عش الغراب في منطقة المغامرة التي ننشئها ( لعلك تعلم أن عش الغراب يعد اللاعب الذي يأكله يقوي سحرية ) , وأنك اخترت أن يكون في كل مكان يكون فيه الإحداثي السيني أو الصادي من مضاعفات الرقم 7 ] لا تنس أن هذا يعني أن باقي القسمة علي 7 يساوي الصفر [ , يمكنك أن تضع الشرط كالتالي :



if ( %7==0 && y%7==0)



cout << ''there is a mushroom here.\n'';



علي أن الصيغة الأكثر إيجازا تكون كالتالي :



// if not x%7 and not y%7if ( !(x%7) && !(y%7) )



ملحوظة : لقد سبق القول بأن المؤثرات المنطقية أدني مرتبة من حيث الأولوية من المؤثرات الحسابية مثل % , فلماذا أحيط التعبيرين x%7,y%7 بالقوسين , والمفروض أنهما الأعلي مرتبة من المؤثرات المنطقية الموجودة في التعبير ؟ لأن المؤثرات وحيدة التأثير لها أسبقية أعلي عموما , من المؤثرات الحسابية . وإليك جدول يضم درجات الأولوية لكافة المؤثرات بحسب ترتيبها التنازلي , أما المؤثرات علي نفس الدرجة فلها نفس الدرجة من الأولوية :























النوع



المؤثرات



وحيد التأثير





حسابي









علائقي









منطقي





 



شرطي





تخصيص



! , ++, –, -





الضرب , القسمة



الجمع والطرح





عدم التساوي : < , > , =>,



=<



التساوي: ==, =!





"و" &&



"أو" ||





:?





=% ,=/* ,=+ ,=


التسميات: