إن تقنية تعريف الطرق الجديدة وتعريف دورات for - كما هي مفيدة - لا تمكن كاريل من حل أي مشاكل جديدة. في كل مرة تقوم فيها ببرنامج run ، فإنه دائمًا ما يفعل نفس الشيء تمامًا. تصبح البرامج أكثر فائدة عندما تتمكن من الاستجابة بشكل مختلف لمدخلات مختلفة.
كمثال. دعنا كاريل أنك تريد أن تكتب برنامجًا ليكون لديك كاريل move على الحائط. لكنك لا تريد ببساطة أن يعمل هذا البرنامج على عالم واحد بحجم ثابت. كنت ترغب في كتابة برنامج واحد يمكن أن تعمل على أي عالم.
حاول تغيير العالم بالنقر فوق القائمة المنسدلة "تغيير العالم" أعلى العالم. لأي عالم بحجم ، كاريل سوف move حتى تصل إلى الحائط. لاحظ أن هذا العمل الفذ لا يمكن أن يكون acomplished باستخدام for دورة . وهذا يتطلب منا أن نعرف حجم العالم في وقت البرمجة.
في كاريل ، while يتم استخدام دورة لتكرار نص التعليمات البرمجيةطالماشرط معين يحمل. while دورة لديه الشكل العام التالي:
while( اختبار ){
البيانات لتكرارها
}
التحكم في التدفق من while دورة هو على النحو التالي. عندما يصل البرنامج إلى while دورة ، يبدأ في تكرار عملية حيث أولًاالشيكاتإذا نجح الاختبار ، وإذا كان الأمر كذلكrun قالرمز في الجسم.
عند البرنامجالشيكاتإذا نجح الاختبار ، فإنه يقرر ما إذا كاناختبارهذا صحيح للحالة الراهنة في العالم. إذا كان الأمر كذلك ، فإن دورة سوف run رمز في الجسم. إذا فشل الاختبار ، فإن دورة قد انتهى والبرنامج move ق على.عند البرنامجrun قجسم دورة ، ينفذ البرنامج الخطوط في الجسم واحدة تلو الأخرى. عندما يصل البرنامج في نهاية while دورة ، ينتقل مرة أخرى إلى الجزء العلوي من دورة . ثم يعيد فحص الاختبار ، ويستمر حتى دورة إذا دورة . لا يخرج البرنامج من دورة حتى يتم التحقق منه ، وفشل الاختبار.
كاريل لديه الكثيراختبارالبيانات ، وسنتجاوز كل منهم في الفصل التالي. في الوقت الحالي ، سنستخدم عبارة اختبار واحدة: frontIsClear() وهذا صحيح إذا لم يكن هناك جدار أمام كاريل مباشرة.
دعونا تعديل برنامجنا أعلاه لجعله أكثر إثارة للاهتمام. بدلاً من مجرد الانتقال إلى الحائط ، ضع كاريل على خط مخروط ثانية ، واحد في كل مربع. مرة أخرى ، نريد أن يعمل هذا البرنامج من أجل عالم من أي حجم:
هذا يبدو عظيما. باستثناء مشكلة واحدة. على كل عالم كاريل لا مكان مخروط على آخر مربع من الخط (ننظر عن كثب). عندما يكون كاريل في المربع الأخير ، لا ينفذ البرنامج جسم دورة لأن الاختبار لم يعد يمر - يواجه كاريل جدارًا. قد يكون لديك إغراء لمحاولة تبديل ترتيب الجسم بحيث كاريل move ثانية قبل وضع البيرة. الكود قابل للتحرير ، لذا حاول تجربته!
هناك مشكلة أعمق لا يمكن لأي إعادة ترتيب للجسم حلها. بالنسبة للعالم الذي كاريل 7 أعمدة ، يحتاج كاريل إلى وضع 7 مخروط ثانية ، ولكن يجب فقط move 6 مرات. نظرًا لأن while دورة ينفذ كلا الخطين عند اجتياز الاختبار ، فكيف يمكنك الحصول على البرنامج لتنفيذ أمر واحد مرة أخرى أكثر من الآخر؟
الخطأ في هذا البرنامج هو مثال على مشكلة في البرمجة تسمى a خطأ فينسبوست . يأتي الاسم من حقيقة أنه إذا كنت ترغب في بناء سياج مصنوع من اللوحات التي تحتوي على منشور سياج واحد على أي من الحجمين ، يكون عدد منشورات السياج دائمًا واحد أكبر من عدد الأجزاء. كم عدد وظائف السياج ، على سبيل المثال ، هل تحتاج إلى بناء سياج مع 10 لوحات؟ الجواب هو 11 ، كما يتضح من المخطط التالي:
بمجرد اكتشافه ، يصبح إصلاح هذا الخطأ في الواقع أمرًا سهلاً للغاية. قبل توقف كاريل في نهاية العالم ، كل ما يجب على البرنامج فعله هو وضع مخروط نهائيًا: