البرمجة بلغة C/ف2:بنى الاختيار

تسلسل التنفيذ

عدل
 
تسسلسل التنفيذ في لغة C: والاختيار (1 ثُمَّ 2 أو 3 ثُمَّ 4) والتكرار (1 ثُمَّ 2 ثُمَّ 2 ثُمَّ 2 .... ثُمَّ 3) والقفز (1 ثُمَّ 3)

يتألف البرنامج من مجموعة من العبارات المرتبة ترتيباً متسلسلاً، ويكون التنفيذ خطياً، بدءاً من العبارة الأولى حتى العبارة الأخيرة، عبارة تلو الأخرى. ويمكن تعديل تسلسل تنفيذ البرنامج بواحدة من الطرق الثلاثة:

  1. الاختيار: ويعني وجود مسارين أو أكثر لتنفيذ البرنامج، ويلزم عندها اختيار أحد هذه المسارات فقط لتنفيذ العبارات الواردة فيها، في حين تُهمل سائر المسارات الأخرى بما فيها. يوجد 3 بنى اختيار في لغة C، هي بنية الاختيار وحيدة المسار if وبنية الاختيار مزودجة المسارات if/else وبنية الاختيار عديدة المسارات switch، وستُدرس في هذا الفصل.
  2. التكرار: ويعني إعادة تنفيذ مجموعة محددة من العبارات لعدد محدود أو غير محدود من المرات، يوجد 3 بنى تكرار في لغة C، هي while وdo/while وfor، وستُدرس هذه الطريقة في الفصل الثالث.
  3. القفز: ويعني إعادة الانتقال مباشرةً لموقع ما وإكمال التنفيذ المتسلسل هناك، يوجد 4 عبارات قفز في لغة C، هي continue وbreak وgoto وreturn، وهي تستعمل كما يأتي:
  • continue وbreak: تستخدم هاتان العبارتان داخل بنى الاختيار أو التكرار لتجاوز مجموعة عبارات محددة وعدم تنفيذها. تستعمل العبارة Break لإهمال تنفيذ العبارات المتبقية داخل البنية والخروج من البنية، أما العبارة continue فتستعمل لإهمال تنفيذ العبارات المتبقية داخل البنية والعودة لبدايتها من البنية.
  • goto: وتستخدم لنقل التنفيذ مباشرة إلى موقع آخر مُحدد بلافتة lablel، وفق ما يلي:
 
عبارات القفز في لغة C
goto label;
... .. ...
... .. ...
label: statement;
لا يُنصح باستعمال هذه العبارة، إذ تجعل البرنامج صعب القراءة وذي بنية معقدة.
أما عبارة retrun فتستعمل مع الدوال، والغرض منها إعادة قيمة إلى الموقع الذي استدعى الدالة، وستناقش بالتفصيل في الفصل الخامس.

بنية الاختيار وحيدة المسار if

عدل
 
Statements A;
if (condition){
       Statements B;
              }
Statements C;         }

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

يُبين البرنامج X بنية الاختيار حيدة المسار، لو تحقق الشرط condition، ستُنفَّذ مجموعة العبارات Statements B ولو لم يتحقق، فإن هذه العبارات لن تُنفَّذ. في كلتا الحالتين يستمر تنفيذ البرنامج خطياً بعد البنية، أي أن العبارات اللاحقة للبنية وهي Statements C، ستُنفَّذ سواء أنفذ المسار الفرعي أم لم ينفذ.

مثال
 
int N;
printf ("enter the note N");
scanf("%d", &N);
if (N > 59){
       printf ("success");

يُدخل المستخدم درجة الطالب، إن كانت الدرجة أكبر أو تساوي 60، يطبع البرنامج عبارة "ناجح".


 
int N;
printf ("enter the note N");
scanf("%d", &N);
if (N > 59){
   printf ("success");
                      }
if (N < 60){
   printf (" fail ");
                      }

في ما لو أردنا أيضاً طباعة "غير ناجح" لو حقق أدنى من ذلك، عندها نحتاج لإضافة بنية اختيار أخرى وحيدة المسار لفحص حالة عدم النجاح تُضاف بعد القسم السابق مباشرة.

بنية الاختيار مزدوجة المسارات if/else

عدل
 
Statements A;
if (condition){
       Statements B;
                      }
else {
       Statements C;
        }
Statements D;

بنية الاختيار مزدوجة المسارات هي بنية اختيار وحيدة الشرط، تتيخ إنشاء مسارين مختلفين، في كل منهما مجموعة من العبارات. سينفَّذ مسار واحد فقط من المسارين، ويمكن تحديده بواسطة شرط يُذكر في بداية البنية.

يُبين البرنامج X بنية الاختيار مزدوجة المسارات، لو تحقق الشرط condition، ستُنفَّذ مجموعة العبارات Statements B ولو لم يتحقق، ستنفذ مجموعة أخرى من العبارات هي Statements C. في كلتا الحالتين يُستمر تنفيذ البرنامج خطياً بعد البنية، أي أن العبارات اللاحقة للبنية وهي Statements D، ستُنفَّذ أياً كان المسار المُختار.

يلزم الانتباه إلى أن اختيار أحد المسارين إلزامي في بنية الاختيار مزدوجة المسارات.

مثال

عدل
 
int N;
printf ("enter the note N");
scanf("%d", &N);
if (N >= 60){
   printf ("Success");
                      }
else{
   printf ("Fail");
       }
  • يدخل المستخدم درجة الطالب، إن كانت الدرجة أكبر أو تساوي 60، يطبع البرنامج كلمة ناجح، بخلاف ذلك، يطبع البرنامج كلمة غير ناجح.


العبارة الشرطية

عدل

هي عبارة برمجية تكافئ البنية مزدوجة المسارات، تُستعمل هذه العبارة لغرض الاختصار وغالباً عندما تكون كتابة المسارين ممكنة في سطر واحد. تتألف هذه العبارة من 3 أقسام متتابعة، يوجد في الأول تعبير وفي الثاني والثالث عبارتان برمجيتان، يفصل بين التعبير والعبارة المحرف ?، وبين العبارة الأولى والثانية المحرف :، ويكون شكلها expression? statement A:statement B، وهو يُقرأ كما يأتي افحص التعبير expression، لو كان محققاً نفذ العبارة statement A، وإلا نفذ العبارة statement B.

يكتب المثال السابق، الخاص بتحديد هل نجح الطالب أم رسب، باستعمال العبارة الشرطية كما يأتي:

N >= 60 ? printf("Success"): printf("Fail");

بنى if/else المتداخلة

عدل
 
if (condition1){
       Statements A;
                      }
       else {if (condition2) 
              {Statements B;}
               }
             else {if (condition3) 
                    {Statements C; }
	         }	
                     else {Statements D;}


 
if (N >=90){
       printf ("A");
                      }
       else if (N >=80){ 
              printf ("B");
                                 }
             else if (N >=70){ 
                    printf ("C");
	                      }
                     else if (N >=60){ 
                            printf ("D");
		          }
                              else {printf ("F") ;}
مثال
  • يُدخل المستخدم علامة طالب:
  • إن كانت > 90، اطبع A
  • إن كانت بين 80 و90، اطبع B
  • إن كانت بين 70 و80، اطبع C
  • إن كانت بين 60 و70، اطبع D
  • إن كانت <60، اطبع F


بنية الاختيار عديدة المسارات switch

عدل

بنية الاختيار عديدة المسارات هي بنية اختيار متعددة الشروط، تتيح إنشاء مسارات مختلفة، يُمثل كل منها ببند يبدأ بالكلمة المحجوزة case، ويرتبط كل يند بشرط وبمجموعة من العبارات. تُرتَّب البنود في قائمة متسلسلة، ولها الترتيب أهمية قصوى، فعند التنفيذ، سيُختار بند واحد فقط من القائمة ويُنفَّذ، ويتحدَّد هذا البند بواسطة الشروط وبترتيب البنود في القائمة، فكلما كان البند في موقع أعلى في القائمة، كانت أولوية تنفيذه أعلى من البنود أسفله، في حال تحقق الشرط الذي يرتبط بأكثر من بند في الوقت نفسه. توضع عبارة break في نهاية كل بند، ما عدا بند واحد يُسمَّى البند الافتراضي، يُوضع في نهاية القائمة، بعد الكلمة المحجوزة default، ويكون من غير شرط ولا تُضاف عبارة break إلى نهايته، تُنفَّذ عبارات البند الافتراضي لو لو يتحقق أي شرطٍ من شروط البنود في القائمة أعلاه.

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

يُبين البرنامج X بنية الاختيار عديدة المسارات، يُقارن المُتغير variable، مع القيمة المذكورة في اليند الأول، وهي value1، لو تطابقت القيمتان ستُنفَّذ مجموعة العبارات statements A ثُمَّ break فيُهمل ما تبقى من البنية ويُخرج منها. أما لو لم تتطابق القيمتان، فيُقارن المُتغير variable، مع القيمة المذكورة في البند الثاني، وهي value2، وفق ما سبق، وهكذا حتى تتطابق إحدى القيم، وإذا لم تتطابق أيٌّ منها اختير البند الافتراضي >break فيُهمل ما تبقى من البنية ويُخرج منها. أما لو لم تتطابق القيمتان، فيُقارن المُتغير variable، مع القيمة المذكورة في البند الثاني، وهي statementN ونُفِّذ.

switch (variable){
	case value1: statements A; break;
    case value2: statements B; break;
    case value3: statements C; break;
	default: statementN;
                              }

لو كان تحقق شرطان أو أكثر من شروط البنود معاً، يؤدي إلى تنفيذ مجموعة العبارات نفسها، فلا داعٍ لكتابة البندين منفصلين، ويمكن دمجهما معاً كما يأتي:

case value1: case value2 : statementA; break;

وهذا يعني أن قيمة المُتغير variable تُقارن أواً مع القيمة value1 ولو تطابقت القيمتان، ستُنفَّذ مجموعة العبارات statements A ويلي ذلك الخروج من البنية، وإن لم تتطابق، تقارن قيمة المُتغير variable مع القيمة value2 ثانياً، فلو تطابقت القيمتان، ستُنفَّذ مجموعة العبارات statements A نفسها ويلي ذلك الخروج من البنية.

مثال

يُدرج المستخدم عدداً بين 1 و7:

  • يطبع البرنامج اليوم المقابل (1 ليوم الاثنين).
  • إذا كان الرقم المدرج خارج النطاق، يطبع البرنامج جملة تعكس هذه الحالة.
int x;
printf("Please enter a number (between 1 and 7):\n");
scanf ("%d",&x);
switch (x){
    case 1: printf ("Monday"); break;
    case 2: printf ("Tuesday"); break;
    case 3: printf ("Wednesday"); break;
    case 4: printf ("Thursday"); break;
    case 5: printf ("Friday"); break;
    case 6: printf ("Saturday"); break;
    case 7: printf ("Sunday"); break;
    default: printf ("The number you have entered is not correct");
                    }