حلقههای Do-While چه کارکردی در برنامهنویسی رایانه دارند — از صفر تا صد
هنگامی که میخواهید شروع به یادگیری برنامهنویسی بکنید، آموختن برخی اصول اولیه مهمترین کلید موفقیت محسوب میشود. شما میتوانید موضوعات دشوارتر را بعداً نیز بیاموزید؛ ولی اگر با مسائلی مانند انواع متغیرها، حلقهها، و توابع آشنا نباشید، نمیتوانید پیشرفت چندانی داشته باشید. حلقههای do-while یکی از مهمترین انواع حلقهها در اکثر زبانهای برنامهنویسی به حساب میآیند.
غالب برنامهنویسان مبتدی عبارتهای if-else، حلقههای while و حلقههای for را بسیار قبلتر آموختهاند. اما یکی از انواع حلقهها که ممکن است برخی برنامهنویسان مبتدی ندانند حلقههای do-while هستند. در این نوشته به بررسی شیوه کارکرد این حلقهها پرداخته، مواردی که استفاده از آنها مناسب است را بیان میکنیم و سعی میکنیم با ارائه نمونههایی، بیشتر با آنها آشنا شویم.
اصول اولیه
حلقه do-while باعث میشود که یک بلوک کد دستکم یک بار اجرا شود، شرط آن بررسی میشود و در صورت صحیح بودن شرط کد درون بلوک بسته به شرط اجرا میشود.
برای مثال به نمونه شبه کد زیر توجه کنید:
do { output "The variable x equals " + x; x++; } while (x < 5); output "The loop has ended.";
در این کد خطوط درون آکولاد do هموار دستکم یک بار اجرا خواهند شد. این بدان معنی است که x در آغاز حلقه میتواند هر مقداری داشته باشد.
اگر x در زمان آغاز حلقه برابر با 1 باشد، حلقه تا زمانی که x دیگر شرط تعیین شده در بخش while را نداشته باشد، تکرار میشود. بدین ترتیب در مثال فوق حلقه 5 بار اجرا میشود. وقتی x کمتر از 5 باشد، حلقه پایان مییابد و به کد بعد از آن انتقال مییابد. خروجی آن چیزی شبیه زیر خواهد بود:
The variable x equals 1 The variable x equals 2 The variable x equals 3 The variable x equals 4 The variable x equals 5 The loop has ended.
به طور عکس اگر x در زمان آغاز حلقه برابر با 20 باشد کد درون حلقه تنها یک بار اجرا خواهد شد. بنابراین شما تنها یک عبارت خروجی را مشاهده میکنید، x به مقدار 21 میرسد و از آنجا که 21 کمتر از 5 نیست حلقه پایان میپذیرد. خروجی کد فوق به صورت زیر خواهد بود:
The variable x equals 20 The loop has ended.
تفاوت حلقه Do-while با حلقههای While و For
مهمترین وجه تمایز این حلقه آن است که در حلقههای do-while بررسی شرط پس از اجرای یک بار کد صورت میگیرد، در حالی که در اشکال دیگر حلقهها، شرط پس از اجرای کد درون حلقه بررسی میگردد.
شبه کد ساده حلقه while زیر را در نظر بگیرید:
x = 10; while (x < 5) { output "The loop has run!"; x++; }
در اینجا x برابر با 10 تعیین شده است و حلقه while بررسی میکند که آیا پیش از اجرای حلقه، x کمتر از 5 است یا نه. به همین دلیل کد درون حلقه هرگز اجرا نمیشود. با استفاده از همین منطق، حلقه do While چیزی شبیه زیر خواهد بود:
x = 10; do { output "The loop has run!"; x++; } while (x < 5)
این حلقه یک بار خروجی متنی خواهد داشت و با افزایش مقدار x به ادامه کد منتقل میشود.
توجه داشته باشید که میتوانید کارکرد do-while را با عبارتهای دیگری در ابتدای حلقه while مانند مورد زیر ایجاد کنید:
output "Hello!"; x++; while (x < 5) { output "Hello!"; x++; }
با این حال این کار بیهوده است و تا وقتی حلقه do-while وجود دارد، دلیلی برای این کار مشاهده نمیشود.
حلقههای For
حلقههای do-while وجه تمایز مشابهی با حلقههای For دارند. در حلقه For یک متغیر تعریف میشود که تعیین میکند حلقه چند بار باید اجرا شود و برای پایان تکرارها نیز شرطی تعیین میگردد.
در مثال زیر یک حلقه for ساده برای مقایسه ارائه شده است:
for (int i = 0; i < 5; i++) { output "The loop has run " + i + " times."; }
این کد تضاد بین حلقههای do-while و for را بهتر مشخص میکند. در مورد حلقههای for تعداد مراحل اجرا کاملاً مشخص است زیرا در ابتدای آغاز به کار حلقه تعیین میشود. اگر بخواهیم کد فوق را به صورت do-while بنویسیم به صورت زیر در میآید:
do { output "The loop has run " + i + " times."; i++; } while (i < 5);
البته در زمان اجرای حلقه با مشکلاتی مواجه خواهید شد. اگر از قبل در جایی متغیر i را مقداردهی اولیه نکرده باشید، نمیدانید که مقدار آن در زمان اجرای بخش do چیست و دستکم یک بار اجرا خواهد شد. اگر i در زمان آغاز حلقه برابر با 500 باشد، خروجی این کد نادرست خواهد بود.
به طور خلاصه:
- حلقه do-while زمانی مفید است که بخواهیم دستوری را دستکم یک بار اجرا کنیم و تا زمانی که شرطی نادرست باشد آن را تکرار نماییم.
- حلقه loop امکان تکرار یک قطعه کد را تا زمانی که شرط صحیح باشد، فراهم میسازد و به محض نادرست شدن شرط، حلقه متوقف میشود.
- حلقه for امکان تعیین تعداد دقیق اجرای حلقه با تعیین پارامترهای مربوطه را ایجاد میکند.
ترک یک حلقه Do-While
البته مانند هر حلقه دیگری در مورد حلقه Do-While نیز باید شرطی برای خروج، تعیین شده باشد. در غیر این صورت ممکن است با یک حلقه نامتناهی مواجه شوید. قطعه کد زیر را در نظر بگیرید:
x = 5; do { output "This never ends!"; } while (x < 10);
اگر مقدار x در هیچ جای کد افزایش نیابد در این صورت حلقه برای همیشه اجرا میشود. البته در برخی موارد حلقههای متناهی مفید هستند، چون برنامهنویس در جای دیگری تعیین کرده است که در چه حالتی برنامه از حلقه خارج شود. اما در اغلب موارد کد نویس های مبتدی به صورت تصادفی وارد حلقههای نامتناهی میشوند.
در ادامه مثالی برای یک حلقه نامتناهی مناسب آوردهایم. برای مثال تصور کنید در حال طراحی یک بازی هستید که کاربر در آن تاسی را پرتاب میکند و باید عدد شش را بیاورد تا از خانه اولیه حرکت کند. در این حالت باید به پرتاب تاس تا زمانی که عدد 6 نیامده است، ادامه دهید و بدیهی است که دستکم یک بار باید این کار انجام گیرد. بنابراین میتوان از کد زیر استفاده کرد:
do { int roll = random(1, 2, 3, 4, 5, 6); if (roll == 6) break; } while (true);
شرط while (true) به این معنی است که حلقه برای همیشه اجرا خواهد شد که مورد دلخواه ماست، زیرا کاربر باید تا زمانی عدد 5 به دست نیاورده است به پرتاب تاس ادامه دهد. بدون وجود عبارت break، برنامه در این قطعه کد گیر میافتاد. اما زمانی که کاربر عدد 6 را روی تاس به دست آورد، عبارت if صحیح میشود و توالی کد شکسته شده و از حلقه خارج میشود و به ادامه کد میپردازد.
البته اگر دوست ندارید میتوانید از دستور break استفاده نکنید. در واقع اصولاً توصیه میشود که در صورت امکان از دستورهای break اجتناب شود. این دستورها نگهداری کد را دشوارتر میکنند، چون خاتمه یافتن با یک شرط آسانتر از ردگیری مداوم آن شرط است. بدین ترتیب کد اصلاح شده زیر همان منظور را حاصل میکند:
do { int roll = random(1, 2, 3, 4, 5, 6); } while (roll!= 6);
حلقه نامتناهی بد
ممکن است حلقه نامتناهی که شما قصد دارید پیادهسازی کنید، از نوع مناسب باشد. اما در برخی موارد مانند مثال زیر، به صورت تصادفی ممکن است حلقهای نامتناهی ایجاد کنید:
int x = 7; do { x = 1; x = x + 2; output "x equals " + x; } while (x < 10);
ممکن است فکر کنید در این حلقه در هر بار تکرار x به مقدار 2 واحد افزایش یافته و تا زمانی که به 10 نرسیده است این کار تکرار میشود، اما بهتر است کمی بیشتر دقت کنید. از آنجا که حلقه x را در هر بار اجرا برابر با 1 تعیین میکند، این حلقه در واقع یک حلقه نامتناهی است. توجه داشته باشید که x = 1 و x = x + 2 به این معنی است که x همواره در انتهای بلوک، سوای این که چند بار اجرا شده باشد، برابر با 3 خواهد بود و بدین ترتیب هرگز به مقدار 10 نخواهد رسید.
بنابراین هنگام نوشتن چنین حلقههایی باید به شرایطی که درون حلقه باعث میشوند، متغیر در هر بار تکرار ناخواسته تغییر یابد، توجه داشته باشید تا از چنین موقعیتهایی احتراز کنید.
نمونههای از کاربردهای واقعی
در بخشهای بالا برخی مثالهای فرضی را مورد بررسی قرار دادیم؛ اما در ادامه چند نمونه از کاربردهای واقعی و مفید حلقههای do-while را معرفی خواهیم کرد.
اگر قصد دارید حلقهای ایجاد کنید که دادهها را تا انتهای یک فایل از آن بخواند، میتوانید از یک حلقه do-while استفاده کنید. بدیهی است که اگر میخواهید محتوای یک فایل را بخوانید دستکم باید یک حرف از آن را بخوانید. بنابراین حلقه do-while به این منظور مناسب است.
do { result = readData(buffer); } while (result!= EOF);
بدون استفاده از یک چنین حلقه do-while میبایست از نسخه زشتتری از حلقهها استفاده میکردید:
while (true) { result = readData(buffer); if (result == EOF) break; }
مثال دیگر برای استفاده عملی از حلقه do-while هنگام دریافت ورودی از کاربر است. فرض کنید در حال نوشتن برنامهای هستیم که از کاربر میخواهد تا عدد مثبتی را وارد کند. با استفاده از حلقه do-while میتوانیم مطمئن شویم که ورودی وی صحیح است:
do { output "Please enter a positive number:"; int input = getInput(); } while (input < 0);
در این حلقه کاربر اعلانی برای وارد کردن یک مقدار را میبیند و دستکم یک مقدار را وارد میکند. اگر کاربر مقداری منفی وارد کرده باشد، حلقه دوباره اجرا میشود و اعلان میکند که باید عدد مثبتی وارد کند و این کار تا زمانی که کاربر مقدار مثبتی وارد نکرده باشد، تداوم مییابد. استفاده از حلقههای دیگر برای اجرای این کد چندان مناسب نخواهند بود.
سخن پایانی
در این نوشته به بررسی حلقههای do-while پرداختیم، مفاهیم پایه آنها را معرفی کردیم و بهترین روش استفاده از آن را به شما نشان دادیم. همچنین حلقههای مختلف را با هم مقایسه نمودیم. اگر میخواهید تنها یک نکته از این مقاله را به خاطر بسپارید، بدانید که حلقههای do-while زمانی که میخواهید کدی را دستکم یک بار اجرا کنید، اما تعداد دفعات اجرا را پیش از اجرای کد نمیدانید، مناسب هستند.
اگر در مورد موقعیتهایی که میتوانید از حلقههای این چنینی در برنامههای خود استفاده کنید، کمی بیندیشید به راحتی مواردی که این حلقهها مناسب آن هستند را خواهید یافت. تقریباً همه زبانهای مناسب برای برنامهنویسهای مبتدی از حلقههای do-while پشتیبانی میکنند، بنابراین نباید در این مورد نگران باشید.
اگر این نوشته مورد توجه شما واقع شده است، موارد زیر نیز احتمالاً برای شما مفید خواهند بود:
- آموزش اصول و مبانی برنامه نویسی
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی برای دانش آموزان با اسمال بیسیک یا Small Basic
- آموزش های رایگان PHP
- گنجینه برنامه نویسی اندروید (Android)
==