نظرية ديمورجان DeMorgan لعكس الشرط في لغة C++ - ProgrammerTech
Language:

Search

نظرية ديمورجان DeMorgan لعكس الشرط في لغة C++

  • Share this:
نظرية ديمورجان DeMorgan لعكس الشرط في لغة C++

نظرية ديمورجان DeMorgan

نظرية DeMorgan يتم إستخدامها في قواعد المنطق في البرمجة programming من أجل وصف النتيجة العكسية لعمليتي الضرب و الجمع في المنطق.

  • الضرب المنطقي and.
  • الجمع المنطقي or.

بحيث أن:

  1. علامة ( ! ) تُعبّر عن النفي المنطقي NOT.
  2. علامة ( && ) تُعبّر عن الضرب المنطقي AND.
  3. علامة ( || ) تُعبّر عن الجمع المنطقي OR.
  4. علامة ( == ) تُعبني متساويان منطقياً.

ننظر في الدرس السابق درس مفهوم باقي القسمة في المثال الأخير قُمنا بكتابة الكود و قُمنا بالتأكد اولاً من المُدخَل إن كان اكبر من الـ 100 و بنفس الوقت أصغر من 999.

قد تخالفوننا في الرأي بحيث تُريدوُن أن تتأكدوا اولاً بأن المدخل خاطئ و ليس أن تتأكدوا أن المُدخَل صحيحاً فسوف تقوُم فقط بعكس السؤال فماذا سوف تسأل؟.

يوجد هُناك خياران أمامنا لعكس السؤال, الأول أن نقوم بوضع بين القوسين في البداية علامة النفي !, أي إذا لم يتم تحقق الشرط إطبع.

 

تاثير علامة النفي على الجملة الشرطية

إذا كان لديك جملة شرطية و قُمت بإدخال علامة التعجُب ! عليها فسوف تقوم بعكس كل شيئ بها.

مثلاً هذا الشرط x==5 يعني تساوي 5 إذا أدخلنا له علامة النفي ! فسوف تعكِسَهُ و يصبح x!=5 أي أنها لا تساوي 5.

قد يبدوا الأمر هذا بديهياً لأنه عملية بسيطة, لكن إذا كانت.

x > = 100 && x <= 999;

فهذه عندما ندخل لها إشارة التعجب ! سوف تُصبِح

(x < 100 || x > 999)

نُلاحظ أنه تحوَّلت كل أكبر من أو يساوي >= إلى أصغر من <=.

و إذا كان بها إشارة يساوي = سوف تقوم بنزع إشارة اليساوي و تتحول كل and أي && إلى or أي ||.

و تتحول كل أصغر من أو يساوي إلى أصغر من, و هذه تُسمّى قاعدة ديمورغان Demorgan.

في عمليات مقارنة أكبر من أو أصغر من و معها يساوي فإشارة التعجب ! تقوُم بإنتزاع منها إشارة اليساوي و تعكسها.

و إن لم يكن بها يساوي فعلامة التعجب ! ستلحقها بيساوي كما بالصورة الآتية توضح هذه العملية.

1-8.webp

 

مثال 1

#include <iostream>
using namespace std;
int main()
{
    int x;
    cout << "Write the number three digitsت" << endl;
    cin >> x;

    if(x < 100 || x > 999)
    {
        /الرقم خاطئ
        cout << "Bye, the number is wrong" << endl;
        exit(1);
    }
    else {
           /الرقم صحيح
        int a1 = x % 10;
        int a2 = (x / 10) % 10;
        int a3 = x / 100;
        cout << a1 << a2 << a3 << endl;
    }
    return 0;
}

انشأنا متغير عددي int و هو x و قيمته سوف يقوم المستخدم بإدخالها عبر cin.

ثم طبعنا للمستخدم رسالة تُخبره بأن يدخل رقم مؤلف من ثلاث خانات بشكل إجباري حتى يتم عكسها.

بعد ذلك وضعنا دالة cin التي هي من سوف تطلُب من المستخدم إدخال قيمة x و إستقبالها.

و قمنا بوضع شرط عبر دالة if الشرطية و هو معكوس, إذا كانت x اصغر من 100 و x اكبر من 999 يدخل. في شرطين: الأول هو بأن الشرط خاطئ يطبع للمستخدم مع السلامة الرقم خاطئ و يقوم بطرد المستخدم من البرنامج و الشرط الثاني في حال أن الشرط صحيح.

أنشأنا ثلاث متغيرات و هي a1 لخانة الآحاد و a2 لخانة العشرات و a3 لخانة المئات و شروطهم كانت في خانة الآحاد.

نقوم بإنتزاع قيمة الآحاد بالإعتماد على الخاصية الرابعة من الخواص السابقة.

و بالنسبة لخانة العشرات a2 أيضاً نقوم بالإعتماد على الخاصية الرابعة لإنتزاع رقم العشرات عبر (x / 10) % 10.

و ثم في الخانة الثالثة خانة المئات قمنا بتقسيم x على 100 لأن إذا قسّمنا على 100 فالبرنامج سيقوم بحذف رقم الآحاد و رقم العشرات و إبقاء رقم المئات.

عند تنفيذ الكود و و كتابة رقم من ثلاث خانات 789 سوف يقوم بعكسه إلى 987.

789
987   تم عكسه على الفور

مثال 2

قُم بكتابة برنامج يقوم بإختبار الرقم المُدخَل من المستخدم إذا كان الرقم موجب أو سالب و طباعة النتيجة على الشاشة. و من ثم يقوم بإختباره إذا كان زوجياً أم فردياً و طباعة النتيجة على الشاشة أسفل النتيجة السابقة.

#include <iostream>
using namespace std;
int main()
{
    cout << "Enter a integer number ....\n";
    int number;
    cin >> number;
    if (number >= 0)
        cout << number << " Positive number" << endl;
    else
        cout << number << " Negative number" << endl;
    if (number % 2 == 0)
        cout << number << " even number" << endl;
    else
        cout << number << " An odd number" << endl;
    return 0;
}

قمنا عبر دالة الطباعة cout كتابة رسالة للمستخدم بأن يكتب عدد صحيح و في السطر الثاني عرّفنا متغير عددي Int إسمه number.

و قمنا عن طريق الدالة cin الطلب من المستخدم أن يكتب قيمة المتغير number و يجب أن يكون عدد صحيح.

ثم وضعنا جملة شرطية if نقول بها إذا كان الرقم المُدخَل اكبر من الصفر number >= 0 فهو موجب و قم بكتابة الرقم و بعده إطبع نوعه إذا كان موجب.

ثم كتبنا جملة else تقوم بطباعة الرقم و بعده إذا كان نوعه سالب.

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

إذا اخلنا عدد موجب فردي

2-7.webp

 

إذا ادخلنا عدد سالب زوجي

3-7.webp

 

مثال 3

أكتب برنامج يقوم بحساب الفرق بين رقمين و طباعة الفرق على الشاشة.

#include <iostream>
using namespace std;
int main()
{
    int integer1;
    int integer2;
    cout << "Enter the first number...\n";
    cin >> integer1;
    cout << "Enter the second number...\n";
    cin >> integer2;
    int diff = integer1 - integer2;
    cout << "The difference is : ";
    if(diff >= 0)
        cout << diff;
    else
        cout << -1 * diff;
    cout << endl;
    return 0;
}

أنشأنا متغيرين من نوع اعداد صحيحة int و هما integer1 و integer2 و لم نقوم بإعطاءهم قيم لأن القيم سوف يقوم المستخدم بإدخالها.

ثم قمنا بإظهار رسالة للمستخدم بأن يقوم بإدخال الرقم الأول و كتبنا دالة cin المسؤولة عن الطلب من المستخدم أن يدخل بيانات للبرنامج.

و بعد أن يدخل العدد الأول قمنا بالطلب منه أن يدخل العدد الثاني و الطلب منه إدخال قيمته عبر cin.

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

و بعده يقوم بالتأكد من الفرق إن كان موجباً سيقوم بطباعته بشكل مباشر.

و else غير ذلك وضعنا الطباعة هي ضرب عددين سالبين ببعضهما و نحن نعرف أن سالب ضرب سالب يعطي موجب.

و عند التنفيذ و كتابة الرقمين الذي طلبهم سنرى النتيجة بالشكل.

4-9.webp

 

كما لاحظنا من خلال شاشة التنفيذ السابقة أدخلنا له الرقم الأول 17 و من ثم الرقم الثاني 9 و قام مباشرتاً بطباعة الرقم 8 الذي هو الفرق بين الرقمين المدخلات لهذا البرنامج.

مثال 4

قُم بكتابة برنامج يختَبِر القيمة الكُبرى من ثلاث أرقام مٌدخَلة من المُستَخدِم و يقوم بطباعة أكبر قيمة على الشاشة.

#include <iostream>
using namespace std;
int main()
{
    int x1;
    int x2;
    int x3;
    cout << "Enter three values" << endl;
    cin >> x1 >> x2 >> x3;
    int max = x1;
    if(max < x2)
        max = x2;
    if(max < x3)
        max = x3;
    cout << "value max : " << max << endl;
    return 0;
}

قُمنا بتعريف ثلاث متغيرات بدون قيم و هم x1,x2,x3 هن الذي سوف يقوم المستخدم بإدخالهم عند الطلب منه.

و أظهرنا رسالة تُُطالب المستخدم أن يقون بإدخال ثلاث قيم و سوف يتم إظهار القيمة الكُبرى له.

و وضعنا الدالة cin المسؤولة عن الطلب من المستخدم أن يُدخِل القيم الثلاثة.

و أنشأنا متغير إسمه max أي القيمة العُظمى و قيمته الأولية تساوي قيمة x1.

ثم قُمنا بمقارنة المتغير max مع x2 أي هل هو أصغر من x2 يعني هل يوجد هناك رقم أكبر من max إذا كان. يوجد رقم قيمته اكبر من max فإن كان يوجد فإن max ليست القيمة العظمى.

ثم وضعنا أن max تساوي x2 و من ثم قُمنا بمقارنته مع x3 بنفس الطريقة السابقة مع x2.

ثم طلبنا منه أن يطبَع نَص القيمة العُظمى هي و يكتب القيمة بعدها.

عند تشغيل البرنامج و كتابة ثلاث ارقام سيكون بالشكل.

Enter three values
45
95
66
value max : 95

نلاحظ من النتيجة السابقة لقد ادخَل المستخدم ثلاث قيم و هي 45 و 95 و 66 و عند نقره على زر إدخال قام بطباعة الرقم 95 لأنه الرقم الأكبر من القيم المدخلة.

تعرَّفنا على كيفية إستعمال باقي القِسمة سابقاً و في هذا الدرس تعرّفنا على خاصية مهمة. و هي إدخال علامة التعجب ! على الشرط و التي تُعرَف بقاعدة Demorgan التي تنفي الشرط.


Tags:
Muhammad Alush

Muhammad Alush

إسمي محمد تركي العلوش من سورية من ريف حلب الشرقي 1994, محب للتقنية و التعلم الذاتي, و جميع خبراتي تعلمتها ذاتياً, و اللغات البرمجية التي أتقنها هي html, css, javascript, php, c, python بالإضافة إلى حبي الكبير لمجال الشبكات.

موقعي programmer-tech.com