Bu Sri buru-buru membuka HP-nya untuk mengecek transferan pembeli. PIN-nya salah. Salah lagi. Baru yang ketiga benar. HP-nya gak tahu dari awal berapa kali Bu Sri bakal salah ketik. Dia cuma pegang satu aturan: selama PIN-nya belum cocok, minta lagi.
UNTUK di pelajaran tadi butuh jumlah putaran dari awal: sepuluh baris perkalian, tujuh hari tabungan. Kalau jumlahnya baru ketahuan sambil jalan, pakai SELAMA.
SELAMA ... AKHIR SELAMA
Tiap gelas es teh butuh dua es batu, dan di kotaknya tinggal lima:
esBatu ← 5
SELAMA esBatu > 0 LAKUKAN
TULIS "Sisa es batu:", esBatu
esBatu ← esBatu - 2
AKHIR SELAMA
TULIS "Es batu habis"
Sisa es batu: 5
Sisa es batu: 3
Sisa es batu: 1
Es batu habis
- Sebelum tiap putaran, kondisinya diperiksa. Selama BENAR, isinya dijalankan lagi. Begitu SALAH, program lanjut ke baris sesudah
AKHIR SELAMA. LAKUKANboleh ditulis, boleh gak.- Kalau kondisinya sudah SALAH dari awal, misalnya
esBatu ← 0, isinya gak jalan sekali pun. Yang tercetak cumaEs batu habis.
Kondisinya harus bisa berubah
Coba hapus baris esBatu ← esBatu - 2. Kondisi esBatu > 0 jadi BENAR terus, dan isinya diulang tanpa henti. Komputer kita menghentikannya setelah 10.000 langkah, dengan pesan "Perulangan di baris 2 gak pernah berhenti: esBatu gak berubah di dalamnya."
Jadi tiap kali menulis SELAMA, cari baris di dalamnya yang mengubah sesuatu di kondisinya. Kalau gak ada, perulangannya gak akan berhenti.
Membaca sampai ketemu tanda berhenti
SELAMA cocok untuk input yang jumlahnya gak tentu. Kasir Bu Sri mengetik harga barang satu per satu, lalu 0 kalau sudah selesai:
total ← 0
BACA harga
SELAMA harga ≠ 0 LAKUKAN
total ← total + harga
BACA harga
AKHIR SELAMA
TULIS "Total:", total
Dengan input 5000, 12000, 3000, lalu 0:
Total: 20000
Polanya: BACA sekali sebelum SELAMA, supaya kondisinya punya isi untuk diperiksa. Lalu BACA lagi di akhir tiap putaran, supaya harga berubah dan kondisinya bisa jadi SALAH. Kalau BACA yang di dalam lupa, harga gak pernah berubah, dan perulangannya gak berhenti.
ULANGI ... SAMPAI: jalan minimal sekali
SELAMA memeriksa di atas, sebelum putaran. ULANGI memeriksa di bawah, setelah putaran. Bedanya kelihatan kalau kondisinya sudah terpenuhi dari awal:
stok ← 0
SELAMA stok > 0 LAKUKAN
TULIS "Jual satu"
stok ← stok - 1
AKHIR SELAMA
TULIS "Selesai"
Selesai
stok ← 0
ULANGI
TULIS "Jual satu"
stok ← stok - 1
SAMPAI stok <= 0
TULIS "Selesai"
Jual satu
Selesai
ULANGI menjual satu barang padahal stoknya nol, karena isinya jalan dulu, baru diperiksa. Perhatikan juga kondisinya: SELAMA menulis kapan lanjut (stok > 0), SAMPAI menulis kapan berhenti (stok <= 0). ULANGI pas untuk hal yang memang harus terjadi minimal sekali, misalnya menanyakan PIN: belum ada yang bisa diperiksa sebelum ada yang mengetik.
Di JavaScript dan Python, SELAMA jadi while. ULANGI ... SAMPAI mirip do ... while di JavaScript, dengan kondisi yang dibalik. Python gak punya bentuk ini.
⚠️ Kenapa perulangannya gak mau berhenti?
- Target yang terlompati. Tabungan naik 10000 tiap minggu, dan programnya menunggu dengan
SELAMA tabungan ≠ 25000. Tabungannya 10000, 20000, 30000, dan gak pernah tepat 25000: "Perulangan di baris 2 gak pernah berhenti:tabungan ≠ 25000gak pernah jadi SALAH." PakaiSELAMA tabungan < 25000, yang berhenti begitu targetnya terlewati. - Kondisi diperiksa sebelum ada isinya. Kalau
BACA hargacuma ada di dalam perulangan,SELAMA harga ≠ 0berhenti dengan "Baris 2:hargadipakai sebelum diisi." Taruh satuBACAsebelumSELAMA, dan satu lagi di akhir isinya. - Input-nya habis duluan. Kalau tanda berhentinya gak pernah datang, misalnya input kasir tadi tanpa
0di akhir,BACAdi dalam perulangan kehabisan input: "Baris 5: BACA butuh input lagi, tapi input-nya cuma 3 baris dan sudah terpakai semua." MAKAdiSELAMA.SELAMA esBatu > 0 MAKAberhenti dengan "Baris 2: di pseudocode, pakai LAKUKAN, bukanMAKA."MAKAcuma untukJIKA.
TL;DR: SELAMA kondisi LAKUKAN ... AKHIR SELAMA mengulang isinya selama kondisinya BENAR. Kondisinya diperiksa sebelum tiap putaran, jadi isinya bisa jalan 0 kali. Sesuatu di dalamnya harus mengubah kondisinya, atau perulangannya gak berhenti dan komputer menghentikannya setelah 10.000 langkah. Untuk input yang jumlahnya gak tentu: BACA sekali sebelum SELAMA, lalu lagi di akhir tiap putaran. ULANGI ... SAMPAI kondisi memeriksa di bawah, jadi jalan minimal sekali, dan berhenti begitu kondisinya BENAR. Untuk menunggu angka yang naik atau turun, pakai < atau >, bukan ≠.