حلقه فور

از ویکی‌پدیا، دانشنامهٔ آزاد

در علوم رایانه حلقهٔ فور یک دستور کنترل جریان است، به‌خصوص جریان تکرار یک کد برنامه‌نویسی که اجازه می‌دهد یک کد مکرراً تکرار شود. کلمات کلیدی بخصوصی برای مشخص کردن این دستور استفاده می‌شود. در زبان برنامه‌نویسی الگول(ALGOL)که یک زبان برنامه‌نویسی سطح بالا برای کدگذاری مسائل ریاضی و عددی است، از "for" برای این دستور استفاده می‌شد، در حالی که در زبانdo" ,Fortran" را به کار می‌بردند. احتمالات دیگری نیز وجود دارد، برای مثال درPERFORM VARYING" , COBOL" را به کار می‌برد.

یک حلقه فور دارای دو بخش است: عنوان تکرار "for"، و بدنه ای که در هر تکرار یکبار اجرا می‌شود. عنوان، معمولاً شمارنده حلقه"counter" یا متغیر حلقه را بیان می‌کند، چیزی که به بدنه اجازه می‌دهد بداند کدام تکرار درحال انجام شدن است. حلقه‌های فور زمانی استفاده می‌شوند که تعداد تکرار حلقه، قبل از ورود به حلقه مشخص باشد. حلقه‌های فور را می‌توان به عنوان دستوری کوتاه برای حلقه‌های وایل تصور کرد ب طوری که متغیر حلقه را گسترش و تست می‌کنند.

نام حلقه فور از کلمه انگلیسی for آمده‌است، که این هم به عنوان کلمه کلیدی در بسیاری از زبان‌های برنامه‌نویسی برای معرفی کردن حلقه فور به کار می‌رود. یک دوره ALGOL 58 یک زبان معروف و مشهور و دارای قدرت و نفوذ قبل از وجود ALGOL 60بوده‌است. این، ترجمه اولیه مستقیم آلمانی für است، که در Superplan (1949–1951) توسط Heinz Rutishauser استفاده شده‌است، کسی که گذشته از این، درگیر ساخت ALGOL58 و ALGOL 60 بود. بدنه حلقه داده‌های معین از متغیر حلقه را اجرا می‌کند، اگرچه این در روش ALGOL برای این دستور ساده‌تر و واضح تر است، اما در آن لیستی از مقدارهای ممکن یا توسعه یافته می‌توانند مشخص شوند.

در FORTRAN و PL/I، کلمه کلیدی DO برای همین دستور استفاده می‌شود و حلقه DO به آن می‌گویند که این خلقه با حلقه do-while متفاوت است.

FOR[ویرایش]

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

حلقه‌های فور قدیمی[ویرایش]

حلقه فور زبان‌هایی مانند ALGOL, Simula , BASIC , Pascal , Modula , Oberon , Ada , Matlab , Ocaml , F#، و … لازم است که متغیر را با مقدارهای اولیه و پایانی کنترل کنیم و چیزی مانند این دیده می‌شود:


for i = first to last do statement
(* or just *)
for i = first..last do statement

با توجه به زبان برنامه‌نویسی، علامت واگذاری (=)شاید به جای علامت مساوی (==)جایگزین شود. (و بعضی زبان‌های برنامه‌نویسی کلمه int را عدد صحیح زوج در موارد عددی می‌دانند) مقدار پله ای اختیاری (صعودی یا نزول ≠۱) باید انتخاب شود. اگرچه گرامر و ساختار درستی برای این به کار برده شده‌است، اما بین زبان‌های برنامه‌نویسی اختلاف بیت‌ها بیشتر از یک بیت است. بعضی زبان‌های برنامه‌نویسی لازم می‌دانند این دستورها را از متغیر کنترل جدا کنند و بعضی نه.

شکل و فرم دیگری با نام زبان برنامه‌نویسی C معروف و مشهور شد. این فرم ۳ قسمت ضروری داشت: فرمت و مقدار اولیه متغیر که حلقه با آن مقدار شروع می‌شود، شرط حلقه که در هر بار ورود به حلقه بررسی می‌شود و گام حلقه که در پایان هربار تکرار حلقه، متغیر تغییر می‌کند و همه این ۳ قسمت اجباری هستند.

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

اینجا یک مثال از حلقه فور قدیمی در جاوا می‌بینیم:

// Prints the numbers from 0 to 99 (and not 100), each followed by a space.
for (int i=0; i<100; i++)
{
    System.out.print(i);
    System.out.print(' ');
}
System.out.println();

همچنین این حلقه‌ها گاهی حلقه‌های عددی فور شناخته می‌شوند وقتی که با حلقه‌های foreach مقایسه می‌شوند.

Iterator-based for-loops[ویرایش]

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

یک مثال در پایتون:

for item in some_iterable_object:
    do_something()
    do_something_else()

اینجا چیزهای تکرار شدنی یا مجموعه ای از داده هاست که این تکرار را پشتیبانی می‌کنند (مانند لیستی از نام کارمندان)، یا خودش باید تکرار شود.

Vectorised for-loops[ویرایش]

حلقه فور برداری[ویرایش]

بعضی زبان‌های برنامه‌نویسی حلقه فوری را ارائه می‌کنند که اگر پردازش همه تکرارها برابر هم بود، مانند کلمه کلیدی for all در FORTRAN95، برنامه ای که تعبیر می‌کند این است که همه عبارت‌های سمت راست، قبل از هرگونه نسبت دادن ارزیابی شدند. برای مثال در عبارت for در کد زیر، وقتی که مقدار جدیدی برای A(i) تولید می‌شود، بجز برای اولین (with {{{1}}}))، با مراجعه به A(i - 1) مقدار جدیدی به دست می‌آید که در جای قبلی جایگزین می‌شود. در روش for all هرچند هر محاسبه فقط به نسخه اصلی اشاره می‌کند، اما Aتغییرناپذیر است.

for     i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3; next i;
for all i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3;

تفاوت‌ها باید معنی دار باشند. بعضی زبان‌های برنامه‌نویسی (مانند FORTRAN95,PL/I) دستور تعیین آرای را ارائه می‌دهند. این موضوع کمک می‌کند بسیاری از حلقه‌های لوپ حذف شوند و تعداد آنها کمتر شود. بدین ترتیب کدهایی مانند {{{1}}} تمام اعضای آرایه A را در ۰ قرار می‌دهد، سایز و ابعاد آن مهم نیست. این مثال این موضوع را نشان می‌دهد:

A(2 : N - 1) := [A(1 : N - 2) + A(2 : N - 1) + A(3 : N)] / 3;

ولی این را در شکلی از حلقه فور یا حلقهFOR ALL یا چیز دیگری که در کامپایلر قابل توضیح دادن نیست تحویل می‌دهد.

شمارنده حلقه[ویرایش]

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

شمارنده‌های حلقه با هربار تکرار تغییر می‌کند، مشروط براینکه یک مقدار ثابت و منحصر بفرد برای هر یک از تکرارها باشد. از شمارنده حلقه برای تصمیم‌گیری برای زمان پایان حلقه و برای گردش برنامه تا زمان رسیدن به دستور بعد از حلقه، استفاده می‌شود.

قرارداد مشترک نامگذاری شناسه برای شمارنده حلقه، برای استفاده از نام متغیرهای i , j و k (و … اگر نیاز بود) است، اینجا i می‌تواند برای حلقه بیرونی استفاده شود، j برای حلقه بعدی که داخلی تر است، و …. ترتیب مخالف این نیز توسط بعضی برنامه‌ها استفاده می‌شود. این شکل بیشتر پذیرفته شده‌است. برای داشتن شکل اصلی از برنامه‌نویسی اولیه از FORTRAN، جایی که نام گذاری این متغیرها با حروفی که با مفهوم مشخص شروع شد، به طوریکه از جنس عدد صحیح و یک انتخاب بسیار معلوم و آشکار برای شمارنده حلقه بودند که موقتاً مورد نیاز بودند. تاریخ این عمل بیشتر به نمادهای ریاضی برمیگردد که نماد و شاخص‌های جمع و ضرب، معمولاً i , jو … هستند. قرارداد متغیر A استفاده از حروف تکراری برای فهرست ii , jj , و kk است، همان‌طور که این موضوع اجازه سرچ آسان‌تر نسبت به استفاده از یک حرف می‌دهد.

مثال[ویرایش]

یک مثال از حلقه فور تو در تو در کد C، جایی که متغیر شمارنده i و j است:

for (i = 0; i <100; i++) {
    for (j = i; j <10; j++) {
        some_function(i, j);
    }
}

این نشان داد یک حلقه فور تو در تو، مانند مثال قبل، بیشتر از یکبار نسبت به حلقه فاقد آن محاسبات انجام می‌دهد و این دستگاه مستقل بهینه‌سازی معنی سریعتر تمام شدن حلقه فور را می‌دهد. این امتیاز حلقه فور تو در تو است. همچنین از حلقه‌ها در زبان C برای پرینت عکس یک کلمه استفاده می‌شود. مانند:

for (i = 0; i <6; i++) {
    scanf("%c", &a[i]);
}
for (i = 4; i>= 0; i--) {
    printf("%c", a[i]);
}

در اینجا اگر ورودی APPLE باشد خروجی آن ELPPA است.