الدرس الثالث: كيفية التحكم في مسار تنفيذ البرنامج


#1

بسم الله الرحمن الرحيم
الحمد لله رب العالمين والصلاة والسلام على أشرف المرسلين، بفضل الله وتوفيقه نقدم لكم الدرس الثالث بدورة

أساسيات البرمجة بلغة السي بلس بلس ++C

بعنوان

كيفية التحكم في مسار تنفيذ البرنامج

لحل أي مشكلة هندسية او لعمل اي برنامج يجب ان علينا النظر للعديد من الحلول او المسارات وتحليل كل منهما على حد لمعرفة ان كان أي منهما سيصلنا الي النتيجة المطلوبة ولهذا كانت الحاجة لبعض العبارات والاوامر في لغة السي++ للتحكم في مسار البرنامج.

ويمكن ان نقسم عبارات أو طرق التحكم من حيث الوظيفة الي نوعين

١- عبارات الاختيار Selection Statements

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

٢- عبارات التكرار Repetition Statements

وهي التي تقوم بتكرار جزء معين من البرنامج بناء على شرط معين مثل while او do…while او for وسنتعرض لهم بمزيد من الشرح والتفصيل.

تعرفنا في الدرس السابق على أمر if ويكون في الصورة الاتية

   if ( iGrade >= 50 )
      cout << "Passed";

إذا كانت الدرجة التي حصل عليها الطالب iGrade أكبر من او تساوي ٥٠ فسيظهر على الشاشة كلمة Passed وإذا كانت الدرجة اقل من ٥٠ لن يظهر شيء.

والان سنستخدم الامر else لإظهار Failed في حالة كانت الدرجة اقل من ٥٠ كما يلي

   if ( iGrade >= 50 )
      cout << "Passed";
   else
      cout << "Failed";

او إذا أردنا استخدام الاقواس

   if ( iGrade >= 50 )
   {
      cout << "Passed";
   }
   else
   {
      cout << "Failed";
   }

هناك ايضا العلامة (:?) يمكن استخدامها في لغة السي++ للوصول لنفس النتيجة كما يلي

cout << ( iGrade >= 50 ? "Passed" : "Failed" );

فاذا كان الشرط صحيحا فستكون “Passed” هي ناتج تنفيذ هذا الامر وبناء عليه سيكون ضمن cout وستظهر على الشاشة واذا كان الشرط غير صحيح فستظهر كلمة Failed.

ويمكن ايضا الوصول لنفس الطريقة باستخدام الاتي

iGrade >= 50 ? cout << "Passed" : cout << "Failed";

عبارات if…else يمكن ان تتداخل فمثلا

   if ( iGrade >= 90 ) 
      cout << "Excellent";
   else
      if ( iGrade >= 80 )
         cout << "Very Good";
      else
         if ( iGrade >= 70 )
            cout << "Good";
         else
            if ( iGrade >= 60 )
               cout << "Passed";
            else
               cout << "Failed";

إذا كانت الدرجة اكبر من او تساوي ٩٠ فسيظهر Excellent اما اذا كانت اقل من ٩٠ واكبر من او تساوي ٨٠ فسيظهر Very Good وهكذا

ويمكن كتابة المثال السابق على الصورة الاتية باستخدام الاقواس وسنحصل على نفس النتيجة

   if ( iGrade >= 90 )
   {
      cout << "Excellent";
   }
   else
   {
      if ( iGrade >= 80 )
      {
         cout << "Very Good";
      }
      else
      {
         if ( iGrade >= 70 )
         {
            cout << "Good";
         }
         else
         {
            if ( iGrade >= 60 )
            {
               cout << "Passed";
            }
            else
            {
               cout << "Failed";
            }
         }
      }
   }

وللتبسيط فيمكننا استخدام الامر else if وسنحصل على نفس النتيجة السابقة ولكن سيكون البرنامج أسهل في القراءة والفهم كما يلي

   if ( iGrade >= 90 )
   {
      cout << "Excellent";
   }
   else if ( iGrade >= 80 )
   {
      cout << "Very Good";
   }
   else if ( iGrade >= 70 )
   {
      cout << "Good";
   }
   else if ( iGrade >= 60 )
   {
      cout << "Passed";
   }
   else
   {
      cout << "Failed";
   }

ويرجى دائما الانتباه في حالة عدم استخدام الاقواس فان المجمع يضع الامر else مع الامر if السابق له مباشرة

مثلا

if ( x > 5 )
   if ( y > 5 )
      cout << "x and y are > 5";
else
   cout << "x is <= 5";

سيتم تنفيذه كما في الصورة الاتية

if ( x > 5  )
   if ( y > 5 )
      cout << "x and y are > 5";
   else
      cout << "x is <= 5";

وسنحصل على “x is <= 5” ولكن هي في الحقيقة اكبر من 5 ولذلك ستكون النتيجة ليست كما توقعنا

ولتصحيح هذا الخطأ يجب علينا هنا استخدام الاقواس كما يلي

if ( x > 5 )
{
   if ( y > 5 )
      cout << "x and y are > 5";
}
else
   cout << "x is <= 5";

يستخدم لتكرار جزء معين من البرنامج بناء على شرط محدد، طالما كان هذا الشرط صحيح فان البرنامج سيقوم بتنفيذ ما بداخل while والا فسيخرج منها.

مثلا

int iCounter = 0;

   while ( iCounter <= 100)
      iCounter = iCounter + 1;

سيقوم البرنامج بتنفيذ ما بداخل الامر while وهو الامر الاتي

iCounter = iCounter + 1; 

حتى تصبح قيمة iCounter اقل من او تساوي 100

ويرجى هنا الانتباه دائما ان نقوم بتنفيذ بعض الاوامر داخل while لتقوم بالأخلال بالشرط وايقاف تنفيذ while والا ستكون بلا نهاية وقد تؤدي الي تعليق جهاز الكمبيوتر

يمكن ايضا تنفيذ الامر السابق بالصورة الاتية

iCounter += 1;

حيث سيتم اضافة 1 او اي قيمة نحددها لقيمة iCounter في كل مرة يتم تنفيذ هذا الامر، كذلك يمكن استخدامه مع الطرح والضرب والقسمة

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

iCounter += 10;

سيتم زيادة قيمة iCounter بمقدار 10 كل مرة يتم فيها هذا الامر

وللتبسيط وفى حالة الرغبة بالزيادة او النقصان بمقدار واحد فقط يمكننا استخدام العلامات الاتية

 ++
 --

فكما رأينا ان الامر الاتي

iCounter = iCounter + 1

سيعطي نفس النتيجة ايضا الامر الاتي

iCounter += 1

وايضا

iCounter++;

ونلاحظ اننا هنا استخدمنا العلامة الاتية ++ بعد المتغير ويمكن استخدامها ايضا قبل المتغير كما يلي

 ++iCounter;

والفرق بينهما انه في الحالة

 ++iCounter; 

والتي تسمي preincrement يتم زيادة المتغير اولا بمقدار واحد ومن ثم استخدامه في الامر الجانبي، اما في الحالة postincrement

iCounter++;

فسيتم استخدام المتغير اولا في الامر الجانبي ومن ثم يتم زيادته بقدار واحد، كذلك الحال ايضا للمتغير - -

في المثال السابق لم يكن هناك امر جانبي لتنفيذه ولذلك لن يكون هناك فرق بينهم ولكن في المثال الاتي سنرى الفرق

#include <iostream>

using namespace std;

int main()
{
   int iCounter = 0;

   // postincrement
   iCounter = 5;
   cout << iCounter << endl; // print 5
   cout << iCounter++ << endl; // print 5 then postincrement
   cout << iCounter << endl; // print 6

   cout << endl; // skip a line

   // preincrement
   iCounter = 5; // assign 5 to c
   cout << iCounter << endl; // print 5
   cout << ++iCounter << endl; // preincrement then print 6
   cout << iCounter << endl; // print 6

   return 0;
}

وستكون نتيجة التنفيذ كما يلي

5
5
6

5
6
6

تمرين ١

قم بعمل برنامج لحساب مضروب أي رقم يقوم المستخدم بإدخاله مباشرة، يمكن للمستخدم ادخال اكثر من رقم وفى حالة ادخال 1- سيتم انهاء البرنامج

المضروب هو حاصل ضرب العدد الحالي في نفس العدد مطروح منه واحد وهكذا حتى نصل للواحد مثلا مضروب الرقم 5

5! = 5 * 4 * 3 * 2 * 1 = 120

ومضروب الصفر او الواحد هو 1

وسيكون شكل تنفيذ البرنامج كما يلي

********************************************
* Welcome to factorial calculation program *
*     Enter -1 to terminate the program    *
********************************************
Please enter a positive number : 6
The factorial of 6 is 720
Please enter a positive number : 5
The factorial of 5 is 120
Please enter a positive number : 1
The factorial of 1 is 1
Please enter a positive number : 0
The factorial of 0 is 1
Please enter a positive number : -5
Please enter only positive number or -1 to terminate
Please enter a positive number : -1
Good Bye

تعرفنا على كيفية استخدام الامر while وهو معتمد اساسا على شرط معين في حالة كان هذا الشرط صحيح سيستمر تنفيذ ما بداخل while وسيتوقف التنفيذ عندما يصبح الشرط غير صحيح.

الامر for

سنتعرف الان على الامر for حيث يعتمد على عداد معين نعرف القيمة الاولية له ويستمر هذا العداد فى الزيادة او النقصان حتى يصل للقيمة النهائية وعندها يتوقف تنفيذ ما بداخل الامر for

مثال

#include <iostream>
using namespace std;

int main()
{

  for ( int counter = 1; counter <= 10; counter++ )
  {
     cout << counter << endl;
  }

  return 0;
}

هذا البرنامج يقوم بطباعة قيمة العداد counter كل مرة يتم تنفيذ فيها ما بداخل الامر for وستكون نتيجة التنفيذ كما يلي

1
2
3
4
5
6
7
8
9
10

عند بداية تنفيذ for سيتم تعريف المتغير
counter وسيأخذ القيمة ١

بعدها ستتم عملية مقارنة لتحدد ما اذا كانت القيمة الحالية للمتغير counter اقل من او تساوي ١٠

إذا كانت المقارنة صحيحة سيتم تنفيذ ما بداخل الامر for وهو الامر الاتي

cout << counter << endl;

وبعدها سيتم زيادة العداد بمقدار ١ كما في الامر الاتي

counter++

نلاحظ هنا ان مكان العلامة ++ بعد المتغير

وسيتسمر تنفيذ الامر for حتى تصبح قيمة المتغير counter أكبر من ١٠

مثال

البرنامج الاتي يقوم بجمع الارقام الزوجية من ٢ الي ٢٠

#include <iostream>
using namespace std;

int main()
{
   int total = 0;

   for ( int number = 2; number <= 20; number += 2 )
      total += number;

   cout << "Sum is " << total << endl;
   return 0;
}

وتكون نتيجة التنفيذ كما يلي

Sum is 110

في هذا المثال تم تعريف المتغير number المستخدم داخل for ويحتوي هذا المتغير على القيمة الاولية وهي ٢ وكل مرة يتم تنفيذ فيها for سيتم زيادة المتغير number بمقدار ٢ حتى تصل قيمته الي ٢٠ وفى كل مرة يتم جمع القيمة الحالية للمتغير number على مجموع القيم السابقة المحفوظة في المتغير total

الامر do…while

والان سنتعرف على امر اخر من اوامر التكرر وهو do…while هذا الامر مشابه جدا للأمر while ولكن الفرق الوحيد هو مكان المقارنة

مثلا البرنامج الاتي يقوم بطباعة الارقام من ١ الي ١٠

   int counter1 = 0;

   do
   {
      cout << counter1 << endl;
      counter1++;
   } while ( counter1 <= 10 );

كذلك ايضا البرنامج الاتي

   int counter2 = 0;

   while (counter2 <= 10)
   {
      cout << counter2 << endl;
      counter2++;
   }

وستكون نتيجة التنفيذ لكلا البرنامجين

0
1
2
3
4
5
6
7
8
9
10

والفرق هنا ان الامر do…while يتم التحقق من الشرط بعد تنفيذ اول مرة اما في حالة while يتم التحقق من الشرط قبل التنفيذ

والان إذا قمنا بتغير قيمة المتغير

int counter1 = 11;

سنجد ان النتيجة هي 11

أي ان امر واحد هو ما تم تنفيذه وهو
do…while

والان مع الامر switch

وهو من الاوامر الشائعة الاستخدام في معظم لغات البرمجة فمن خلاله يمكننا تحويل مسار البرنامج بناء على القيمة العددية لمتغير

مثال

#include <iostream>
using namespace std;

int main () {

   char grade;
   cout << "Enter your Grade A, B, C, D or F" << endl;
   cin >> grade;

   switch(grade)
   {
      case 'A' :
         cout << "Excellent!" << endl;
      case 'B' :
      case 'C' :
         cout << "Well done" << endl;
         break;
      case 'D' :
         cout << "You passed" << endl;
         break;
      case 'F' :
         cout << "Better try again" << endl;
         break;
      default :
        cout << "Invalid grade" << endl;
   }

   return 0;
}

في هذا المثال يدخل الطالب التقدير الذي حصل عليه وبناء عليه سيظهر له رسالة محدد.

وفكرة عمل الامر switch تقوم على مقارنة قيمة المتغير ببعض القيم المعرفة سابقا في case فمثلا اذا ادخل المستخدم الحرف A فسيتم تنفيذ السطر الاتي

cout << "Excellent!" << endl;

ولان ليس هناك امر break سيتم ايضا تنفيذ الامر الاتي

cout << "Well done" << endl;

وستكون نتيجة التنفيذ كما يلي

Enter your Grade A, B, C, D or F
A
Excellent!
Well done

اما إذا ادخل المستخدم الحرف B او C فسيتم تنفيذ الامر الاتي فقط

cout << "Well done" << endl;

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

اما اذا لم يدخل المستخدم احد من الحروف المحددة سابقا A, B, C, D or F فسيتم الانتقال الي default :

وتنفيذ الامر الاتي

 cout << "Invalid grade" << endl;

كيفية استخدام break و continue

كما رأينا في المثال السابق اننا استخدمنا break في نهاية حالات الامر switch وذلك حتى يتم ايقاف تنفيذ switch عند هذه النقطة

والامر break يمكن ايضا استخدامه داخل while او for او do…while حتى يتم انهاء التكرر والخروج من الحلقة والهدف من ذلك هو اننا وصلنا للنتيجة المطلوبة ولا داعي للانتظار حتى انتهاء الحلقة بالصورة الطبيعة ولذلك نستخدم break حتى نقوم بالإنهاء سريعا

مثال

#include <iostream>
using namespace std;

int main ()
{

   int count;

   for ( count = 1; count <= 10; count++ ) // loop 10 times
   {
      if ( count == 5 )
      break;

      cout << count << " ";
   }

   cout << "\nBroke out of loop at count = " << count << endl;
   return 0;
}

في هذا البرنامج يتم ايقاف تنفيذ حلقة for عند وصول قيمة المتغير count الي 5

وستكون نتيجة التنفيذ

1 2 3 4 
Broke out of loop at count = 5

الامر continue

يستخدم الامر continue لإنهاء الدورة الحالية من حلقة التكرر عند السطر الموجود فيه continue وسيتم استكمال التكرار مرة اخرى من جديد

فمثلا إذا أردنا طباعة الارقام من ١ الي ١٠ ما عدا الرقم ٧ سنقوم بعمل الاتي

#include <iostream>
using namespace std;

int main ()
{

   int count;

   for ( count = 1; count <= 10; count++ ) // loop 10 times
   {
      if ( count == 7 )
      continue;

      cout << count << " ";
   }

   return 0;
}

وستكون نتيجة التنفيذ كما يلي ونلاحظ عدم طباعة الرقم ٧

1 2 3 4 5 6 8 9 10

العمليات المنطقية

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

&& logical AND 
|| logical OR
!  logical NOT 

فمثلا إذا أردنا اختيار الطلاب من الصف الثالث ودرجاتهم اعلي من ٨٠ سنقوم بعمل الاتي

   if ( studentclass == 3 && studentgrade >= 80 )
      studentSelected++;

فيجب ان يتحقق الشرطان معنا حتى يتم اختيار الطلاب

اما إذا أردنا الاكتفاء بشرط واحد فقط فيمكننا استخدام OR كما يلي

   if ( studentclass == 3 || studentgrade >= 80 )
      studentSelected++;

اما إذا أردنا اختيار اي طالب من أي فصل ما عدا الفصل الثالث فسنقوم باستخدام NOT

   if ( !(studentclass == 3) )
      studentSelected++;

يمكن ايضا استبدال الرموز بكلمات بحروف صغيرة

&& and 
|| or
!  not

يمكن ايضا تعريف متغيرات منطقية bool وستكون قيمتها true او false فقط

مثلا

#include <iostream>
using namespace std;

int main ()
{
   bool isDone = false;

   int currentLevel = 0;
   const int maxLevel = 10;

   while (not isDone)
   {
      cout << "Enter your current level 1:10 " << endl;
      cin >> currentLevel;

      if (currentLevel >= maxLevel)
         isDone = true;
   }

   return 0;
}

لقد قمنا بتعريف المتغير isDone كمتغير منطقي bool وقيمته false

اما المتغير maxLevel فتم تعريفة كثابت اي لا يمكن تغيره وإذا حاولنا تغيير قيمة هذا الثابت داخل البرنامج ستظهر لنا الرسالة الاتية

ولدينا ايضا حلقة while سيتم تنفيذها طالما المتغير isDone يساوي false فاذا كانت قيمته true سيتوقف تنفيذ حلقة while

تعرفنا في هذا الدرس كيفية استخدام العديد من عبارات التحكم لتغيير مسار تنفيذ البرنامج بناء على نتيجة تنفيذ مقارنة منطقية او عداد، سنتعرف فى الدرس القادم على الدوال functions

وإلي اللقاء في الدرس القادم


دورة أساسيات البرمجة بلغة السي بلس بلس
#2

تحميل الدرس فى صورة PDF
الدرس الثالث كيفية التحكم في مسار تنفيذ البرنامج.pdf (237.0% u)