Tag Archives: حلقه for each

حلقه For each

حلقه For each چیست؟

حلقه For each (یا For-each) گونه‌ای از حلقه ها در زبان های برنامه نویسی است که برای پیمایش مجموعه ای از عناصر (نظیر عناصر موجود در یک آرایه) به کار می‌رود.

دستورات بدنه در حلقه های For each به جای اینکه به تعداد دفعات مشخصی اجرا شوند، به ازای هر عنصر موجود در مجموعه یک مرتبه تکرار می‌شوند. در این نوع حلقه ها، برخلاف حلقه های For از شمارنده خبری نیست بلکه در آن‌ها از متغیری هم نوع با عناصر مجموعه کمک گرفته می‌شود که در هر تکرار از حلقه، نمایانگر عنصر جاری در آن مجموعه خواهد بود.

در قطعه کد زیر که به زبان جاوا نوشته شده است نحوه استفاده از این نوع حلقه ها برای پیمایش عناصر موجود در یک آرایه عددی نمایش داده شده است. متغیر number در هر تکرار از حلقه معادل با یکی از عناصر آرایه numbers می‌باشد و چنانکه مشاهده می‌کنید از همان نوع عناصر آرایه (یعنی int) تعریف شده است.

حلقه For each
نمونه‌ای از یک حلقه For each در زبان جاوا – این نوع حلقه ها در زبان جاوا با نام حلقه For بهبودیافته یا Enhanced For Loop نیز شناخته می‌شوند.

مزایا و محدودیت های حلقه For each

هر چند با در نظر گرفتن تعداد اعضای موجود در مجموعه و همین طور اندیس شروع عناصر می‌توان عمل پیمایش مجموعه را با کمک یک حلقه For نیز انجام داد اما در مورد استفاده از حلقه های For each حداقل دو مزیت را می‌توان در نظر گرفت. مزیت اول اینکه به کار بردن این حلقه ها از بروز خطاهای مربوط به تعیین کران ها (که ممکن است در حلقه های For رخ دهد) جلوگیری می‌کند (به خصوص در مورد خطاهای رایجی موسوم به Off-by-one Error که در آن به اشتباه کران های حلقه یک واحد کم یا زیاد تعیین می‌شود – این نوع خطاها معمولا در اثر عواملی نظیر عدم توجه به اندیس آغازین مجموعه ها در زبان مورد استفاده و همچنین استفاده نادرست از نماد به جای < یا بالعکس اتفاق می‌افتد). علاوه بر این، حلقه های For each در مقایسه با حلقه های معادل For به بهبود خوانایی کد نهایی کمک می‌کنند.

قطعه کد زیر، پیاده سازی مثال قبلی را با کمک حلقه For استاندارد نمایش می‌دهد. متغیر i (شمارنده) در هر تکرار از حلقه به اندیس کنونی عنصر مربوطه در آرایه numbers اشاره می‌کند و در هر تکرار یک واحد به آن افزوده می‌شود. بنابراین به هنگام چاپ نتیجه در خروجی، به جای مقدار متغیر i از مقدار numbers[i] استفاده شده است. همانطور که مشاهده می‌کنید قطعه کد بالا در مقایسه با نمونه زیر نه تنها خواناتر است بلکه احتمال خطای کدنویسی را نیز کاهش می‌دهد.

حلقه For
نمونه معادل مثال فوق با کمک حلقه For معمولی

در کنار مزایایی که گفته شد لازم است تأکید کنیم حلقه های For each غالبا در مواردی مناسب هستند که قرار است تمام عناصر موجود در مجموعه مورد پیمایش قرار گیرند. به عبارت بهتر در این حلقه ها همواره طول گام همان عدد 1 رو به جلو خواهد بود. با این حال در این نوع حلقه ها هم می‌توانید از دستورات ویژه‌ای (نظیر دستور continue و break در جاوا) که برای ادامه حلقه از تکرار بعدی و خروج زودهنگام از حلقه تدارک دیده شده است استفاده کنید.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

حلقه Loop

حلقه یا Loop چیست؟

حلقه (Loop) در زبان های برنامه نویسی برای اجرای دنباله‌ای از دستورات به صورت تکراری مورد استفاده قرار می‌گیرد. بدنه حلقه (Loop Body) شامل دستوراتی است که قرار است تکرار شوند؛ این دستورات تنها یک بار نوشته می‌شوند اما ممکن است چندین بار به صورت پشت سرهم اجرا شوند. بخش دیگری از Loop که به آن هدر (header) نیز گفته می‌شود نوع Loop و ویژگی‌های آن را مشخص می‌کند.

انواع رایج حلقه ها

گونه‌های مختلفی از حلقه‌ها توسط اغلب زبان های برنامه نویسی امروزی پشتیبانی می‌شود. تعداد دفعاتی که دستورات موجود در یک لوپ اجرا می‌شود ممکن است به صورت مستقیم مشخص شود و یا به یک شرط یا تعداد عناصری که در یک مجموعه وجود دارد وابسته باشد. حتی ممکن است دستورات برای همیشه اجرا شوند و هیچ پایانی برای آن‌ها درنظر گرفته نشده باشد.

1- For Loop

حلقه‌های For از جمله رایج‌ترین حلقه‌هایی هستند که معمولا تعداد اجرای دستورات در آن‌ها به صورت مستقیم مشخص می‌شود. البته توجه داشته باشید این مفهوم بدان معنا نیست که تعداد دفعات اجرای دستورات می‌بایست به صورت ثابت هنگام برنامه نویسی مشخص شود بلکه به عنوان مثال تعداد تکرارها می‌تواند وابسته به مقدار یک متغیر باشد که هنگام اجرا از کاربر گرفته شده است و یا حاصل ارزیابی یک عبارت حسابی باشد.

در تصویر زیر می‌توانید دو نمونه For Loop را به زبان های جاوا (سمت چپ) و ویژوال بیسیک (سمت راست) مشاهده کنید. دستورات موجود در هر دو مثال 5 بار تکرار می‌شوند. متغیرهای index در این حلقه‌ها را متغیرهای شمارنده حلقه (Loop Counter) می‌نامند. در تکرار اول مقدار این متغیرها برابر با 1 می‌باشد (مقدار آغازین) و در هر تکرار یک واحد به آن‌ها افزوده می‌شود (گام شمارش در هر دو مثال برابر 1 است که در تصویر سمت چپ با i++ و در تصویر سمت راست به دلیل آنکه گام شمارش در زبان ویژوال بیسیک به صورت پیشفرض برابر با 1 است حذف شده است). در هر تکرار، مقدار کنونی متغیر شمارنده در خروجی نوشته می‌شود. زمانی که مقدار این متغیرها به 5 می‌رسد دستورات بدنه Loop برای آخرین بار اجرا می‌شوند. همانطور که مشاهده می‌کنید پایان لوپ در مثال سمت چپ با کمک شرط index <= 5 و در مثال سمت راست براساس مقداری که پس از کلمه To آمده است مشخص شده است. خروجی نهایی این دو مثال، اعداد 1 تا 5 خواهند بود.

حلقه For
نمونه‌هایی از حلقه‌های For به زبان‌های جاوا (سمت چپ) و ویژوال بیسیک (سمت راست)

2- While Loop

در حلقه‌هایی که توسط یک شرط کنترل می‌شوند معمولا دستورات تا زمانی که شرط صحیح باشد اجرا می‌شوند. بسته به نوع این حلقه‌ها، ممکن است شرط در ابتدا یا در انتهای حلقه بررسی شود؛ چنانکه شرط صحیح باشد برای بار دیگر دستورات حلقه تکرار می‌شوند. توجه داشته باشید در صورتی که این تست در انتهای ساختار Loop انجام شود حتی اگر شرط از همان ابتدا صحیح نباشد دستورات حداقل یک بار اجرا می‌شوند اما اگر شرط در همان ابتدای حلقه مورد بررسی قرار گیرد ممکن است دستورات بدنه هیچگاه اجرا نشوند.

حلقه‌های While (در اغلب زبان ها) و Do While و Do Until نمونه‌هایی از این نوع لوپ‌ها به شمار می‌روند با این تفاوت که در حلقه‌های While، شرط را تنها می‌توان در ابتدای حلقه بررسی نمود اما در حلقه‌های Do While و Do Until می‌توان شرط را در ابتدا یا انتهای حلقه بررسی کرد. به علاوه در حلقه‌های While و Do While تنها در صورتی که شرط صحیح باشد دستورات اجرا می‌شوند اما Do Until تا زمانی دستورات بدنه خود را اجرا می‌کند که شرط نادرست باشد و به محض صحیح بودن نتیجه تست شرط، حلقه متوقف می‌شود.

در تصویر زیر، از یک حلقه While برای ایجاد همان خروجی که در مثال قبل با استفاده از حلقه For به دست آمد استفاده شده است. در این نمونه شرط x <= 5 به عنوان شرط لوپ به کار رفته است و در بدنه هر تکرار یک واحد به متغیر x افزوده می‌شود (این درحالیست که در ساختار For این متغیر در هدر حلقه تغییر می‌کرد نه در بدنه آن).

حلقه While
نمونه‌ای از حلقه While به زبان جاوا

3- For each Loop

در بسیاری از زبان‌های برنامه نویسی افزون بر این حلقه‌ها از ساختارهای تکرارشونده ویژه‌ای برای مجموعه (Collection) ها پشتیبانی می‌شود. در این نوع حلقه‌ها که معمولا به حلقه‌های For each موسوم هستند دستورات برای هر عنصر از مجموعه مورد نظر تکرار می‌شود. در تصویر زیر نمونه حلقه For each را به زبان جاوا برای ایجاد خروجی مشابه با مثال‌های قبل مشاهده می‌کنید.

حلقه For each
نمونه‌ای از حلقه For each به زبان جاوا

4- Infinite Loop

حلقه های بی نهایت یا بی پایان (Infinite Loop) به حلقه‌هایی گفته می‌شود که دستورات بدنه آن‌ها تا زمان اجرای برنامه تکرار می‌شوند. این نوع از loop ها ممکن است به خاطر استفاده از شرایطی که هیچ پایانی برای تکرارها رقم نمی‌زنند به وجود بیاید (برای مثال یک While Loop که شرط آن true باشد). نمونه‌ای از کاربرد عمدی این نوع حلقه‌ها را می‌توان در مواردی دانست که لازم است برنامه به صورت مدوام وقوع رخدادی را چک کند.

ادامه حلقه و خروج زودهنگام از آن

در برخی موارد ترجیح داده می‌شود مابقی دستورات برای تکرار کنونی Loop نادیده گرفته شود و دنباله دستورات برای تکرار بعدی اجرا شوند. دستوراتی مانند continue (در اغلب زبان‌ها) و next (در زبان Perl) به همین منظور استفاده می‌شوند.

در برخی موارد نیز ممکن است موقعیتی پیش بیاید که لازم شود پیش از آنکه Loop به صورت طبیعی اتمام شود اجرای تکرارهای بعدی نادیده گرفته شود و حلقه به صورت پیش از موعد پایان یابد. به عنوان مثال هنگام جستجو در میان مجموعه‌ای از عناصر به محض اینکه عنصر موردنظر پیدا می‌شود اساسا نیازی به تکمیل فرایند جستجو در میان عناصر باقی‌مانده وجود ندارد. دستوراتی مانند break (در اغلب زبان‌ها)، last (در زبان Perl) و Exit (در زبان ویژوال بیسیک) به این منظور استفاده می‌شوند.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا