A Crash Course in C - Part 2

Branching and Iteration.

التفرع والتكرار Branching and Iteration

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

و تتمثل في:

كما توفر ثلاث طرق لتنفيذ حلقات التكرار وتنفسم الي:

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

و تحتوي تلك الطرق سواء كانت جمل شرطية او حلقات تكرار علي بناء من الأكواد بداخلها يتم وضعه بين الحضانات {} ويسمي Block كما في الدوال Functions ولكن ما يحدد تنفيذ او عدم تنفيذ تلك الأكواد هو صحة او بطلان الجملة الشرطية المُستخدمة، فإذا كانت تساوي القيمة 0 فذلك يمثل false ويعني بطلان الجملة الشرطية، اما في حالة عدم مساواته للرقم 0 كمثال 1 فذلك يمثل true ويدل علي صحة الجملة الشرطية مما سيترتب عليه تنفيذ الـ Block المراد تنفيذه في حالة صحة الشرط.

 

الجمل الشرطية باستخدام if، else، else .. if

الجمل الشرطية باستخدام if تأخذ الشكل التالي:

الأمثلة التالية توضح أستخدام if else else .. if:

if

في المثال السابق قمنا بسؤال المستخدم وانتظاره لإدخال رقم وفي حالة أن الرقم كان اكبر من 100 سيتم طباعة الجملة Number is Bigger than 100. البرنامج يعمل بشكل جيد ولكن يمكننا تحسينه باستخدام else ليقوم بطباعة رسالة تخبر المٌستخدم أن الرقم الذي ادخله اصغر من 100 كما في المثال التالي:

ifelse

لاحظ كيف تقوم elseبتنفيذ الـ Block الخاص بها في حالة عدم صحة الشروط التي سبقتها داخل الجملة الشرطية الواحدة، ولكن المشكلة هنا انه إن كان الرقم يساوي 100 فسيتم طباعة نفس الرسالة Number is Smaller than 100 وهذا خطأ. يمكننا تصحيح ذلك باستخدام else if كما في المثال التالي:

elseif

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

ifs

لاحظ كيف تم تنفيذ الـ Block في كلي الجملتين لصحته ولم يتم تنفيذ اول شرط صحيح كما في الأمثلة السابقة بسبب استقلال الجملتين عن بعضهم.

 

التعبير الشرطي باستخدام ? و:

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

حيث يتم تنفيذ التعبير الثاني في حالة صحة التعبير الأول والتعبير الثالث في حالة بطلان التعبير الأول كمثال:

expcond

لاحظ أن قيمة num3 تم تعيينها لتساوي 2 بسبب كون num1 اصغر من num2.

 

الجمل الشرطية باستخدام switch

يتم استعمال جمل siwtch بدلا من جمل if عندما نريد مقارنة متغير واحد مع العديد من الثوابت وتأخذ جمل switch الشكل التالي:

ويساوي default داخل جمل switch استعمال else داخل جمل if، وفي حالة عدم إنهاء الـ Block داخل جملة switch بكتابة break سيتم التأكد من صحة باقي الشروط بشكل تسلسلي. المثال التالي يوضح الفرق بين آلة حاسبة بسيطة تمت كتابتها باستخدام if وآخري باستخدام switch:

switch

لاحظ ورغم زيادة عدد الأسطر في مثال switch الي ان البرنامج اسهل واسرع في قراءته وكتابته من مثيله في if.

 

حلقات التكرار باستخدام while

تأخذ حلقات while الشكل العام التالي:

ويتم استخدام الحلقات بشكل عام لتكرار الـ Block بعدد مرات معين حتي تبطل صحة الجملة الشرطية المُستخدمة، المثال التالي يوضح استخدام while في كتابة حلقة تقوم بالعد من 1 الي 5:

while

و يمكن استخدام الحلقات في إنشاء برامج اكثر تفاعلية فكمثال يمكن التعديل علي برنامج الآلة الحاسبة السابق باستخدام while لنتمكن من عمل أكثر من مسئلة حسابية بدون الحاجة الي إعادة تشغيل البرنامج في كل مرة.

`

في المثال السابق تم تعيين الثابت الرمزي true بقيمة 1 واستخدامه كعبارة شرطية لحلقة while مما يضمن استمرار الحلقة الي ما لا نهاية لأن ناتج الشرط في هذه الحالة هو قيمته. وتسمي الحلقات من ذلك النوع infinite loops، بعد ذلك تم استخدام if للتأكد ما إذا كان اختيار المستخدم يساوي الحرف q وفي حالة انه يساويه سيتم كسر حلقة while باستخدام break، لاحظ استخدام break بشكل عام لللإنهاء الـ Block الذي يتم تنفيذه في أكثر من موضع مثل حلقات while وجمل switch.

 

حلقات التكرار باستخدام do .. while

تمتلك حلقات الـ do while الشكل العالم التالي:

وتتشابه كثيرا مع حلقات while ولكن الفرق يكمن في التحقق من صحة الشرط بعد تنفيذه مما يعني أن الـ Block الخاص بحلقات do while سيتم تنفيذه علي الأقل مرة واحدة. المثال التالي يوضح الفرق بين while وdo while في تنفيذ الـ Block بناء علي شرط غير صحيح.

dowhile

لاحظ أن while لم تقم بتنفيذ اي شيء بعكس do while.

 

حلقات التكرار باستخدام for

تمتلك حلقات for الشكل العام التالي:

و تستخدم لتكرار الـ Block بعدد مرات معين، اما عن وسائط حلقات for فهم ثلاثة؛ يمثل الوسيط في المنتصف الجملة الشرطية التي سيتم التحقق منها، اما الوسيط الأول فيتم استخدامه لتعيين متغير بقيمة يبدأ العد من عندها ويتدرج بالشكل الذي يحدده الوسيط الثالث سواء بالزيادة او النقصان. المثال التالي يشرح استخدام حلقات for للطباعة من الرقم 0 حتي الرقم 9.

for

لاحظ كيف يمكننا استخدام المتغير في الوسيط الأول داخل الـ Block مع ذلك استخدامه خارجه سيعطي رسالة خطأ.

هذا بسبب ان نطاق المتغير محدود ببداية و نهاية الحلقة فقط و ليس علي نطاق الدالة ككل، يمكن حل تلك المشكلة بتعريف المتغير i قبل بداية الحلقة علي النحو التالي

سيتم شرح النطاقات تفصيلا في الأجزاء القادمة بإذن الله.

 

استخدام Break وContinue

كما رأينا بالفعل يمكننا استخدام break لإنهاء الحلقات وجمل siwtch بينما يتم استخدام continue في الحلقات فقط لتخطي باقي الـ Block والعودة مباشرة الي بداية الحلقة ليتم استكمالها. المثال التالي يوضح استخدام break وcontinue

contbreak

لاحظ كيف تم كسر حلقة while بعد 4 مرات من تنفيذها بداية من الرقم 0 حتي 3 مع تجنب طباعة الرقم 3 داخل حلقة for.

 

استخدام goto

بالرغم من السمعة السيئة عن goto في إنتاج برنامج صعب القراءة وغير منظم إلا انها مفيدة في بعض الأحيان ويوفر استخدامها سهولة في التنقل بين اجزاء الـ Block التابع لنفس الدالة. المثال التالي يوضح استخدام goto للخروج من عدة حلقات لا نهائية بشكل بسيط دون الحاجة الي إعادة استخدام break في كل مرة واستكمال البرنامج عند الـ label المسمي ret:

goto