درس ۱۸ روبی: تا وقتی به هدف برسی، برو!
در درسهای قبل کودک باید خانهها را میشمرد. در درس ۱۸ ربات روبی با حلقهی while تا وقتی لازم است ادامه میدهد؛ بدون نیاز به دانستن عدد.
هدف درس تا وقتی برس
هدف این درس آشنایی با بلوک «♾️ تا وقتی» یا while و حسگر onTarget است. کودک یاد میگیرد بهجای اینکه بگوید «۷ بار جلو برو»، بگوید «تا وقتی به هدف نرسیدهای، جلو برو». این یعنی برنامهای که برای مسیر کوتاه و بلند به یک اندازه درست کار میکند.
در پایان، دانشآموز تفاوت حلقهی شمارشی repeat و حلقهی شرطی while را توضیح میدهد و میداند هر کدام کجا مناسب است.
مفهوم برنامهنویسی: حلقهی شرطی
حلقهی while ترکیبی از حلقه و شرط است. قبل از هر دور، شرط بررسی میشود؛ اگر درست بود بدنه اجرا میشود و دوباره شرط پرسیده میشود. به محض نادرست شدن شرط، حلقه تمام میشود. کلمهی not هم جواب حسگر را برعکس میکند.
برای والدین، مثال طرح درس روبی گویاست: «تا وقتی به در نرسیدی، راه برو». ما در زندگی روزمره خیلی کم کارها را با شمارش دقیق انجام میدهیم؛ بیشتر تا وقتی ادامه میدهیم که هدف محقق شود. while این طرز فکر را به برنامه میآورد.
فعالیت قدمبهقدم با ربات روبی
برنامهی اصلی این درس فقط یک خط است: while not onTarget: forward. ربات روبی در هر قدم میپرسد «روی هدف هستم؟» و اگر نه، یک خانه جلو میرود. فرقی نمیکند هدف سه خانه دورتر باشد یا دوازده خانه.
در حالت بلوکی، بلوک «♾️ تا وقتی» را میکشیم، حسگر onTarget را با «نه» در شرط میگذاریم و «⬆️ جلو» را داخلش قرار میدهیم. در ماموریتهای بعدی، میتوان دو حلقه را پشت هم گذاشت: while not frontIsWall: forward، سپس turnRight و بعد while not onTarget: forward.
- ✅ شرط را به شکل «تا وقتی هنوز نرسیده» بنویس
- ✅ داخل حلقه کاری بگذار که روبی را به هدف نزدیک کند
- ✅ برنامه را روی نقشههایی با طول متفاوت امتحان کن
اشتباههای رایج: حلقهی بیپایان
مهمترین خطای این درس حلقهی بیپایان است. اگر داخل حلقه فقط turnLeft باشد، روبی هرگز به هدف نمیرسد و حلقه هیچوقت تمام نمیشود. یا اگر مسیر به دیوار برسد و هدف پشت پیچ باشد، while not onTarget: forward روبی را به دیوار میکوبد.
خطای دیگر فراموش کردن not است: while onTarget: forward از همان اول اجرا نمیشود چون روبی روی هدف نیست. راه رفع همیشه یکی است: بپرسید «این حلقه کی تمام میشود؟ آیا چیزی داخلش روبی را به آن لحظه نزدیک میکند؟».
اشتباه دیگر گذاشتن دستورهای پایانی داخل حلقه است؛ مثلاً اگر turnRight داخل while باشد، روبی بعد از هر قدم میچرخد. قانون ساده را یادآوری کنید: هر کاری که باید بعد از رسیدن انجام شود، بعد از حلقه میآید، نه داخل آن.
فعالیت بدون کامپیوتر: تا وقتی موسیقی پخش است
بازی «تا وقتی موسیقی پخش است، راه برو» را اجرا کنید. بعد نسخهی رباتی آن را بازی کنید: کودک چشمبسته جلو میرود تا وقتی به علامت روی زمین برسد و همکلاسیاش فقط وقتی رسید بگوید «رسیدی!». بعد بپرسید اگر علامت پشت سرش بود چه میشد؟ این همان حلقهی بیپایان است.
یک نسخهی دیگر بازی: کودک ربات باید تا وقتی دیوار جلویش نیست راه برود و بعد بچرخد. با این بازی بچهها حس میکنند شرط while در هر قدم دوباره پرسیده میشود، نه فقط یک بار. این تفاوت مهم میان if و while را بهتر از هر توضیحی جا میاندازد و بعداً در ربات روبی بهراحتی به کد تبدیل میشود.
نکته برای معلم و والدین
دو نسخه از یک ماموریت با طولهای متفاوت نشان دهید و بگذارید کودک ببیند برنامهی repeat روی یکی شکست میخورد اما برنامهی while روی هر دو کار میکند. این لحظهی کشف، بهترین معرفی مفهوم الگوریتم عمومی در آکادمی روبی است.
به کودک یاد بدهید قبل از اجرای هر حلقهی while دو سؤال بپرسد: «این حلقه کی تمام میشود؟» و «آیا داخل حلقه چیزی هست که مرا به آن لحظه نزدیک کند؟». این دو سؤال ساده، بیشتر حلقههای بیپایان را قبل از اجرا پیدا میکنند و عادت فکر کردن پیش از کدنویسی را میسازند؛ عادتی که در درسهای هزارتو و پروژهی پایانی حیاتی است.
سوالهای پرتکرار
فرق repeat و while چیست؟
repeat تعداد معینی تکرار میکند. while تا وقتی شرط برقرار است تکرار میکند و لازم نیست تعداد را از قبل بدانیم.
onTarget چه حسگری است؟
حسگری در روبی است که میگوید ربات روی خانهی هدف ایستاده یا نه.
اگر برنامه در حلقهی بیپایان گیر کند چه میشود؟
روبی بیوقفه همان کار را تکرار میکند. کودک باید اجرا را متوقف کند، شرط و بدنهی حلقه را بررسی کند و مطمئن شود چیزی داخل حلقه روبی را به پایان نزدیک میکند.