و يبقى المخطط نفسه : instuctions كما تعرفون تعني تعليمات.و هذا ما سيحصل على الترتيب :
1- الجهاز يقرأ التعليمات من الأعلى إلى الأسفل كالعادة
2- ما إن يصل لنهاية الحلقة boucle يتوجه نحو التعليمة الأولى
3- إذا يعاود قراءة التعليمات كلها من الأعلى إلى الأسفل
4- يصل للحلقة و يعاود الرجوع للأول من جديد و هكذا ..
المشكلة في هذا النوع من الحلقات هو أننا لا نتوقف أبدا ( ندور في نفس الحلقة - سبب التسمية ) فقدرة الجهاز هنا يمكنها أن لا تتوقف إلى مالانهاية و لن يتعب لأنه فقط ينفذ أوامرنا .
و هنا نجد .. الشروط conditions ! فعندما ننشئ حلقة نتبعها دائما بإطلاق شرط ، هذا الشرط يعمل على " تكرار الحلقة دون توقف مادام هذا الشرط صحيحا "
كما قلت فهناك عدة طرق للقيام بذلك و سنبدأ بتحقيق حلقة من نمط while في لغة الC- الحلقة while .
هكذا كيف نشكل حلقة من نوع while : while (/* Condition */)
{
// Instructions à répéter
}
Condition >> شرط
Instructions à répéter >> تعليمة لنكررها
الكلمة while تعني بالفرنسي tann que و بالعربي مادام ، لذا نقول للجهاز مادام الشرط صحيحا : كرر التعليمات المتواجدة بين العاكفتين .
أقترح لكم أن تقوموا باحتبار بسيط : سنطلب من المسعمل ادخال العدد 47، و إن لم يفعل ذلك تتكرر العملية و يطلب منه ادخال العدد و إن لم يفعل تتكرر و هكذا .. و طبعا يتوقف البرنامج عندما يظغط المشتعمل على 47 .
int nombreEntre = 0;while (nombreEntre != 47)
{
printf("Tapez le nombre 47 ! ");
scanf("%d", &nombreEntre);
}
أنظروا النتيجة التي ستظهر، لقد تعمدت عدم الظغط على 47 كثير من المرات لأثبت صحة البرنامج :
Tapez le nombre 47 ! 10
Tapez le nombre 47 ! 27
Tapez le nombre 47 ! 40
Tapez le nombre 47 ! 47
و كما قلت سينتهى البرنامج ما إن أظغط على العدد 47، طبعا الحلقة while تتكرر كلما لم يدخل المستعمل العدد 47 .
الآن لنجعل الأمر أصعب بقليل و نضع الحلقة تنتهي بعد عدد معين من المحاولات فقط، و لهذا سنستعين بالمتغيرة "compteur" التي ستأخذ القيمة 0 في بداية البرنامج ثم نعمل لها إضافة، هل تتذكرون من الدرس السابق l'incrémentation ؟ و التي تنص هنا على زيادة الرقم 1 للمتغيرة و نكتب حينها "variable++;".
إقرؤوا جيدا الكود و حاولوا التمعن به و فهمه :
int compteur = 0;while (compteur < 10)
{
printf("Salut les Zeros !\n");
compteur++;
}
النتيجة :
Salut les Zeros !
Salut les Zeros !
Salut les Zeros !
Salut les Zeros !
Salut les Zeros !
Salut les Zeros !
Salut les Zeros !
Salut les Zeros !
Salut les Zeros !
Salut les Zeros !
البرنامج يكرر عشر مرات العبارة "Salut les Zeros !"
- كيف يعمل بالتحديد ؟
1- في البداية لدينا متغيرة compteur مستقرة على القيمة 0
2- الحلقة while تنظم تكرارها " مادامت compteur أقل من 10 " فعندما تأخذ compteur القيمة 0 في البداية ندخل في الحلقة .
3- تتم طباعة "Salut les Zeros !" على الشاشة باستخدام الدالة printf
4- نقوم بإضافة للمتغيرة compteur بفضل التعليمة "compteur++;" فإن كانت الcompteir تحمل القيمة 0 فهي الآن تحمل القيمة 1 .
5- نصل لنهاية الحلقة ( عاكفة مقفلة ) و نعاود العملية من جديد و نرى ما إن تم تكرار العملية أقل من 10 فإن كانت قد تتكررت مثلا 8 مرات أو 9 فستكرر مرة أخرى و ما إن تصل للتكرار 10 تتوقف وفقا للتعليمة التي تم نسبها إليها " أعتقد أن هذا مفهوم
فكما ترون العبارة تكتب مرة ، ثم مرة ثانية، ثالثة ... عاشرة، حينها يكون الشرط "compteur < 10" خاطئ، و طبعا التعليمة أيضا خاطئة و منه نخرج من الحلقة .
يمكنا مراقبة تغيرات compteur بإجراء العملية التالية :
int compteur = 0;while (compteur < 10)
{
printf("La variable compteur vaut %d\n", compteur);
compteur++;
}
و النتيجة :
La variable compteur vaut 0
La variable compteur vaut 1
La variable compteur vaut 2
La variable compteur vaut 3
La variable compteur vaut 4
La variable compteur vaut 5
La variable compteur vaut 6
La variable compteur vaut 7
La variable compteur vaut 8
La variable compteur vaut 9
و طبعا إن فهمتهم هذا فقد فهمتم كلّ شيء ، و يمكنكم الاستمتاع بتجربة أعداد بدل العشرة فبدل أن تضعوا تتوقف الحلقة عند عشرة تضعون العدد 100 أو أي عدد آخر ( كعقوبة منزلية للجهاز لعدم إنجازه فرضه لليوم ههه )
- إحذروا من الحلقات غير المنتهية !
عندما تنشؤون حلقة فاعملوا دائما على إيقافها في عدد معين، لأنه مادام الشرط صحيحا لن يتوقف الجهاز من التنفيذ !
و ه ذا مثال على ذلك :
while (1)
{
printf("Boucle infinie\n");
}
تذكروا ما قلناه بخصوص القيم المنطقية booléen ، فصحيح vrai = 1 و خاطئ faux = 0 ، و ما دمنا قد كتبنا في الكود 1 يعني دائما الشرط صحيح فإن الجهاز لن يتوقف أبدا في كتابة العبارة "Boucle infinie" . لكن إن جربتم ذلك و أردتم الخروج من البرنامج ، لمستعملي الويندوز اضغطوا على الزر X بالأحمر في أعلى البرنامج و لمستخدمي اللينكس اظغطوا على Ctrl + C .
لكن توخوا الحذر، تجنبوا دائما الحلقات غير المنتهية ، بلرغم من أنها مفيدة في بعض الحالات ( و خصوصا في برمجة ألعاب الفيديو ) إلا أنني انصحكم بعدم استعمالها الآن حتى أحدثكم لاحقا بخصوصها .
- الحلقة do .. while
هذا النمط يشبه كثيرا سابقة إلا أنه قليل الاستعمال، سنستعين هنا بما فعلناه سابقا إلا أننا ستغير الشرط من بداية الكود إلى نهايته .
int compteur = 0;do
{
printf("Salut les Zeros !\n");
compteur++;
} while (compteur < 10);
- ما الذي تغير ؟
هذا أمر بسيط فالحلقة while يمكن لها أن لا تتحقق أبدا إذا كان الشرط خاطئا من البدابة، فمثلا حتى لو وضعنا الحلقة تنتهي عند 50 ووضعناها خاطئة من البداذية فإننا لن ندخل الحلقة أبدا ! و لكن من أجل الحلقة do .. while فهذا شيء مختلف، هذه الحلقة تتكرر دائما مرة واحدة ! فحتى لو وضعنا الcompteur ليتوقف عند 50 فإنها تتوقف بعد مرة واحدة فقط . و لهذا ينفع أحيانا استخدام الحلقات من هذا النوع، لنضمن تكرارها العملية على الأقل مرة واحدة .
ملاحظة : هناك استثناء في الحلقة do .. while يغفله الكثير من المبتدئين، و هو وجود ; في نهاية الwhile و ليس مثل السابق ( راجعوا الأعلى ) . لهذا لا تنسوها أو سيتوقف البرنامج أثناء الترجمة !
- الحلقة for
في الواقع الحلقة while تلبي رغبتنا في أي نوع كان من التكرارات، فكما رأينا في الشرةط وجود السويتش فإنه هنا أيضا يوجد طريقة أخرى لكتابة الكودسورس باختصار و سرعة . و لا تنسوا بأن الحلقات مستخدمة كثيرا في البرمجة، لا أملك مثالا معينا أعطيه لكم لكن كونوا واثقين أنكم ستحتاجون مستقبلا الwhile أكثر منه من ل for . و لهذا وجب أن تتأقلموا مع هذا النوع من الحلقات و كيفية استخدامها .
و كما قلت لكم فالحلقات for ماهم إلا كتابة أخرى للحلقات while .
هذا مثال سابق باستخدام الwhile
int compteur = 0;while (compteur < 10)
{
printf("Salut les Zeros !\n");
compteur++;
}
و هذا نفس الكود باستخدام الحلقة for .
int compteur;for (compteur = 0 ; compteur < 10 ; compteur++)
{
printf("Salut les Zeros !\n");
}
- ما الاختلاف ؟
1- لم نظبط المتغيرة compteur في قيمة 0 . يعني ليس ضروريا هنا
2- هناك الكثير من الكتابات داخل القوسين بعد الfor و سنفصل عن ذلك لاحقا
3- لا توجد التعليمة compteur++; في الحلقة
فلنهتم بما يوجد داخل القوسين فهو كل ما جاءت الحلقة for من أجله، هناك ثلاث تعليمات مختلفة مفرق بينها بالرمز ;
1- الأولى هي النهيئة l'initialisation : هذه التعليمة تعمل على تجهيز المتغيرة compteur و في حالتنا ظبطها على القيمة 0
2- الثانية هي الشرك condition : كما رأينا في الحلقة while فإن الشرط يعلن ما إن كانت العملية صحيحة أم لا و بما أنها صحيحة فسيكمل البرنامج العمل .
3- أخيرا الإضافة l'incrémentation : هذه التعليمة يتم تنفيذها في نهاية كل مرة في الحلقة و هي تزيد العداد compteur في كل مرة بالرقم 1 يعني العداد يحسب كم من مرة يدور الحلقة، و يمكننا طبعا جعله يزيد بالـ: 2 بكتابة التعليمة variable += 2; يعني في كل نهاية حلقة يزيد برتبتين بدل رتبه واحدة ، و يمكن الإنقاص décrémentation بكابة التعليمة variable -- ; .
و أخيرا نجد بأن الfor أسهل حلقة يمكن استخدامها و أذكركم بأنكم ستحتاجونها هي و الwhile كثيرا في البرمجة .