برنامه چطور تصمیم میگیرد؟
ربات باید بر اساس داده سنسورها تصمیم بگیرد. در C/C++ رایجترین ابزار برای این کار if و else است:
int distanceCm = 14;
if (distanceCm < 20) {
// مانع نزدیک است
stopMotors();
} else {
moveForward();
}
عبارت داخل پرانتز یک سوال بله/خیر است. اگر نتیجه true باشد بلوک اول و اگر false باشد بخش else اجرا میشود.
مقایسهها را درست بخوان
>بزرگتر از<کوچکتر از>=بزرگتر یا مساوی<=کوچکتر یا مساوی==مساوی بودن!=نابرابر بودن
یکی از خطاهای مشهور تازهکارها قاطی کردن = و == است. = مقدار میگذارد؛ == مقایسه میکند.
چند شرط با هم
گاهی یک شرط کافی نیست. مثلا موتور فقط وقتی حرکت کند که مانع دور باشد و باتری خیلی ضعیف نباشد:
if (distanceCm >= 20 && batteryVoltage > 6.5) {
moveForward();
}
برای OR از || استفاده میکنیم. مثلا اگر دکمه اضطراری فشرده شد یا فاصله خیلی کم شد، توقف کن:
if (emergencyPressed || distanceCm < 8) {
stopMotors();
}
مرز شرط مهم است
شرط distanceCm < 20 برای مقدار ۲۰ درست نیست. اگر میخواهی خود ۲۰ هم مانع حساب شود باید <= 20 بنویسی. همیشه سه تست انجام بده: کمی پایینتر از مرز، دقیقا روی مرز، کمی بالاتر از مرز.
شرط تو در تو یا چند شاخه
برای چند وضعیت میتوان از else if استفاده کرد:
if (distanceCm < 10) {
stopMotors();
} else if (distanceCm < 25) {
slowDown();
} else {
moveForward();
}
ترتیب شرطها مهم است. از حالت خاصتر شروع کن تا شرط عمومیتر فرصت بلعیدن آن را نداشته باشد.
تمرین
یک منطق چراغ وضعیت طراحی کن: اگر ولتاژ کمتر از ۶.۵ بود LED قرمز، اگر بین ۶.۵ و ۷.۲ بود زرد و اگر بالاتر یا مساوی ۷.۲ بود سبز. قبل از کد، نتیجه ۶.۴، ۶.۵، ۷.۱، ۷.۲ و ۸.۰ را در جدول بنویس. این جدول بهترین راه دیدن شکاف یا همپوشانی شرطهاست.
خطاهای رایج
استفاده از = به جای ==، فراموش کردن حالت مرزی، شرطهای خیلی طولانی و تست نکردن همه شاخهها. اگر شرط پیچیده شد آن را به چند متغیر bool معنیدار تقسیم کن تا خواندن و دیباگش ساده شود.