المؤثرات المنطقية في 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 بالقوسين , والمفروض أنهما الأعلي مرتبة من المؤثرات المنطقية الموجودة في التعبير ؟ لأن المؤثرات وحيدة التأثير لها أسبقية أعلي عموما , من المؤثرات الحسابية . وإليك جدول يضم درجات الأولوية لكافة المؤثرات بحسب ترتيبها التنازلي , أما المؤثرات علي نفس الدرجة فلها نفس الدرجة من الأولوية :
النوع | المؤثرات |
وحيد التأثير حسابي علائقي منطقي
شرطي تخصيص | ! , ++, –, - الضرب , القسمة الجمع والطرح عدم التساوي : < , > , =>, =< التساوي: ==, =! "و" && "أو" || :? =% ,=/* ,=+ ,= |
تعليقات
إرسال تعليق