Gelung for

Dalam sains komputer, **gelung ''for*** ("bagi/untuk") ialah [[kenyataan|pernyataan]] [[aliran kawalan]] untuk menentukan iteraasi yang membenarkan kod dilaksanakan berulang kali. Pelbagai kata kunci digunakan untuk menentukan pernyataan ini: bahasa keturunan [[ALGOL]] menggunakan "*for*", manakala bahasa keturunan [[Fortran]] menggunakan "*do*". Selain itu, terdapat kemungkinan lain seperti [[COBOL]] yang menggunakan "PERFORM VARYING".

Gelung *for* mempunyai dua bahagian: pengepala yang menyatakan interasi, dan badan yang dilaksanakan sekali setiap iterasi. Pengepala sering mengisytiharkan pembilang gelung atau pemboleh ubah gelung eksplisit, yang membolehkan badan mengetahui interasi yang sedang dilaksanakan. Gelung *for* biasanya digunakan apabila bilangan iterasi diketahui sebelum memasuki gelung. Gelung *for* boleh dianggap sebagai singkatan untuk gelung *while* yang menambah dan menguji pemboleh ubah gelung.

== FOR ==

Pernyataan gelung *for* tersedia dalam kebanyakan bahasa [[pengaturcaraan imperatif]]. Walaupun mengabaikan perbezaan kecil dalam [[Sintaksis|sintaks]], terdapat banyak perbezaan dalam cara penyataan ini berfungsi dan tahap ekspresi yang disokongnya. Secara amnya, gelung *for* jatuh ke dalam salah satu daripada kategori berikut:

=== Gelung *for* tradisional ===
Gelung *for* dalam bahasa seperti [[ALGOL]], [[Simula]], [[BASIC]], [[Pascal (bahasa pengaturcaraan)|Pascal]], [[Modula]], [[Oberon (bahasa pengaturcaraan)|Oberon]], [[Ada (bahasa pengaturcaraan)|Ada]], [[MATLAB|Matlab]], [[OCaml|Ocaml]], [[F Sharp (bahasa pengaturcaraan)|F#]] dan sebagainya memerlukan [[Kawal pembolehubah (pengaturcaraan)|pemboleh ubah kawalan]] dengan nilai mula dan akhir, yang kelihatan seperti ini:<syntaxhighlight lang="pascal">
for i = first to last do statement
(* or just *)
for i = first..last do statement
</syntaxhighlight>

=== Gelung *for* berasaskan iterator ===
Jenis gelung *for* ini ialah generalisasi jenis julat berangka bagi gelung *for*, kerana ia membenarkan penghitungan set item selain daripada jujukan nombor. Ia biasanya dicirikan oleh penggunaan [[iterator]] tersirat atau eksplisit, di mana pemboleh ubah gelung mengambil setiap nilai dalam urutan atau pengumpulan data lain. Contoh perwakilan dalam [[Python]] ialah:<syntaxhighlight lang="python">
for item in some_iterable_object:
  do_something()
  do_something_else()
</syntaxhighlight>Di sini,  ialah sama ada pengumpulan data yang menyokong iterasi tersirat (seperti senarai nama pekerja), atau mungkin iterator itu sendiri. Sesetengah bahasa mempunyai jenis ini sebagai tambahan kepada satu lagi sintaks gelung; terutamanya, PHP mempunyai jenis gelung ini di bawah nama , serta gelung *for* tiga ekspresi (lihat di bawah) di bawah nama .

=== Gelung *for* bervektor ===
Sesetengah bahasa menawarkan gelung untuk yang bertindak seolah-olah memproses semua lelaran [[Vektorisasi automatik|secara selari]], seperti kata kunci  dalam [[FORTRAN 95]] yang mempunyai tafsiran bahawa *semua* ungkapan [[Sisi persamaan|sebelah kanan]] dinilai sebelum *sebarang* tugasan dibuat, berbeza daripada bentuk iterasi eksplisit. Sebagai contoh, dalam pernyataan  dalam serpihan pseudokod berikut, apabila mengira nilai baharu untuk , kecuali untuk yang pertama (dengan ) rujukan kepada  akan memperoleh nilai baharu yang mempunyai telah diletakkan di sana pada langkah sebelumnya. Walau bagaimanapun, dalam  versi, setiap pengiraan hanya merujuk kepada  asal yang tidak diubah. Perbezaannya mungkin ketara.

 *'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;

=== Gelung ''for'' terkumpul ===
Diperkenalkan dalam [[ALGOL 68]] dan diikuti PL/I, gelung jenis ini membolehkan iterasi gelung digandingkan dengan ujian, sebagai contoh:
 for i := 1 : N while A(i) > 0 do ''etc.''
iaitu, nilai diberikan kepada pemboleh ubah gelung ''i'' dan hanya jika ''ungkapan sementara'' adalah **benar**, badan gelung akan dilaksanakan. Jika hasilnya **palsu**, pelaksanaan gelung ''for'' berhenti sebentar. Diberikan bahawa nilai ''pemboleh ubah'' gelung ditakrifkan selepas penamatan gelung, maka pernyataan di atas akan mencari elemen bukan positif pertama dalam tatasusunan ''A'' (dan jika tiada, nilainya ialah ''N + 1''), atau, dengan variasi yang sesuai, aksara bukan kosong pertama dalam rentetan, dan seterusnya.

== Pembilang gelung ==
Dalam [[Pengaturcaraan|pengaturcaraan komputer]], **pembilang gelung** ialah pemboleh ubah kawalan yang mengawal iterasi gelung (konstruk [[bahasa pengaturcaraan]] komputer). Ia dinamakan sedemikian kerana kebanyakan penggunaan binaan ini mengakibatkan pemboleh ubah mengambil julat nilai integer dalam beberapa jujukan teratur (contoh., bermula pada 0 dan berakhir pada 10, dengan tambahan nilai sebanyak 1 setiap kali iterasi).

Pembilang gelung berubah dengan setiap iterasi gelung, memberikan nilai unik untuk setiap lelaran individu. Pembilang gelung digunakan untuk memutuskan bila gelung patut ditamatkan dan untuk aliran atur cara meneruskan ke arahan seterusnya selepas gelung.

Tatanama penamaan pengecam lazim bagi pembilang gelung ''for'' menggunakan huruf pemboleh ubah **i**, **j**, dan **k** (dan seterusnya jika perlu), di mana **i** akan menjadi gelung paling luar, **j** bagi gelung dalaman, dsb. Urutan terbalik juga digunakan oleh sebilangan pengatur cara. Amalan ini bermula lebih awal dalam [[Tatatanda matematik|notasi matematik]], di mana [[Notasi indeks|indeks]] bagi [[hasil tambah|penjumlahah]] dan [[pendaraban]] selalunya diwakili **i**, **j**, dsb. Konvensyen alternatif ialah penggunaan huruf digandakan untuk indeks, seperti **ii**, **jj** dan **kk**, kerana ini membolehkan carian dan cari ganti yang lebih mudah daripada menggunakan satu huruf.

=== Contoh ===
Contoh kod C yang melibatkan gelung ''for'' bersarang yang menggunakan pemboleh ubah pembilang **i** dan **j*':<syntaxhighlight lang="c">
for (i = 0; i < 100; i++) {
  for (j = i; j < 10; j++) {
    some_function(i, j);
  }
}
</syntaxhighlight>Gelung *for'' dalam C juga boleh digunakan untuk mencetak satu perkataan secara terbalik. Sebagai:
```c
for (i = 0; i < 6; i++) {
  scanf("%c", &a[i]);
}
for (i = 4; i >= 0; i--) {
  printf("%c", a[i]);
}
```
Di sini, jika input ialah , outputnya ialah .

## Rujukan