Setelah mempelajari while, do-while, dan for, pertanyaan yang muncul adalah: kapan kita memakai yang mana? Ketiga jenis perulangan tersebut sebetulnya setara secara semantik—apa pun yang dapat ditulis dengan for juga dapat ditulis dengan while, begitu pula sebaliknya. Namun demikian, masing-masing jenis loop memiliki kekuatan dan kelemahan dalam hal kejelasan kode. Memilih jenis loop yang tepat untuk konteks tertentu membuat kode lebih mudah dibaca, lebih sedikit bug, dan lebih lurus alurnya. Pada chapter ini kita akan menelaah kriteria pemilihan loop berdasarkan tiga pertanyaan utama: apakah jumlah iterasi sudah diketahui, apakah body perlu dieksekusi minimal satu kali, dan apakah kondisi berhenti sederhana atau rumit.
Tiga Pertanyaan Panduan #
Sebelum memutuskan jenis loop, tanyakan tiga pertanyaan berikut:
- Apakah jumlah iterasi sudah diketahui sebelum loop dimulai? Jika ya (misalnya iterasi array berukuran
n, atau iterasi10kali), gunakanfor. - Apakah body loop wajib dieksekusi minimal satu kali? Jika ya (misalnya menu interaktif, validasi input), gunakan
do-while. - Apakah kondisi berhenti bergantung pada perubahan nilai selama iterasi? Jika ya (misalnya mencari nilai, mengakumulasi sampai batas), gunakan
while.
Tabel berikut merangkum kriteria pemilihan:
| Kriteria | Loop yang Disarankan |
|---|---|
Jumlah iterasi sudah diketahui (mis. n elemen array) | for |
| Body wajib dieksekusi minimal satu kali (menu, validasi) | do-while |
| Kondisi berhenti bergantung pada perubahan nilai (pencarian) | while |
| Kondisi berhenti rumit atau multi-kriteria | while (1) + break |
| Iterasi hitung mundur dengan counter | for atau while |
for untuk Pencacahan yang Sudah Diketahui #
Loop for adalah pilihan terbaik ketika jumlah iterasi sudah diketahui sebelum loop dimulai. Idiom standar adalah mengiterasi array, matriks, atau rentang angka dengan batas yang jelas. Karena for menggabungkan inisialisasi, kondisi, dan update di satu tempat, kode menjadi ringkas dan mudah dipahami:
#include <stdio.h>
int main(void) {
int data[] = {12, 45, 7, 23, 56, 89, 34};
size_t n = sizeof(data) / sizeof(data[0]);
int maks = data[0];
/* for: cocok untuk iterasi array (jumlah iterasi sudah diketahui) */
for (size_t i = 1; i < n; i = i + 1) {
if (data[i] > maks) {
maks = data[i];
}
}
printf("Nilai maksimum: %d\n", maks);
return 0;
}Output yang Dihasilkan:
Nilai maksimum: 89Mari kita telaah baris-baris kode di atas:
- Baris 6 (
int maks = data[0];): nilai maksimum diinisialisasi dengan elemen pertama array. Asumsi: array tidak kosong. - Baris 9 (
for (size_t i = 1; i < n; i = i + 1)): loop mulai darii = 1(bukan0) karena elemen pertama sudah jadi nilai awalmaks. Counteribertipesize_tagar konsisten dengann. - Baris 10 (
if (data[i] > maks)): bandingkan elemen saat ini dengan nilai maksimum yang sudah tersimpan. - Baris 11 (
maks = data[i];): jika elemen saat ini lebih besar, perbaruimaks. Loop berhenti otomatis ketikaimencapain—jumlah iterasi pastin - 1.
Pola for di atas jauh lebih ringkas dibanding versi while yang setara. Versi while akan terlihat seperti size_t i = 1; while (i < n) { ... i = i + 1; }, yang menempatkan inisialisasi dan update di tempat terpisah dari kondisi, membuat kode lebih sulit dilacak.
while untuk Kondisi Berhenti yang Bergantung pada Nilai #
Loop while adalah pilihan terbaik ketika jumlah iterasi tidak diketahui sebelumnya, melainkan bergantung pada perubahan nilai selama iterasi. Contoh klasik adalah akumulasi sampai batas tercapai, atau pencarian sampai nilai ditemukan:
#include <stdio.h>
int main(void) {
int target = 1000;
int total = 0;
int i = 1;
/* while: cocok ketika kondisi berhenti tidak diketahui jumlah iterasinya */
while (total < target) {
total = total + i;
i = i + 1;
}
printf("Mencapai %d di iterasi ke-%d\n", total, i - 1);
return 0;
}Output yang Dihasilkan:
Mencapai 1035 di iterasi ke-45Pada contoh di atas, kita tidak tahu berapa iterasi yang dibutuhkan sampai total >= 1000. Loop while cocok karena kondisi berhenti (total < target) langsung diekspresikan di awal loop. Loop berhenti ketika total = 1035, yang terjadi pada iterasi ke-44 (saat i = 45 sebelum increment). Loop for kurang cocok di sini karena tidak ada batas atas counter yang jelas.
do-while untuk Menu dan Validasi #
Loop do-while adalah pilihan terbaik ketika body loop wajib dieksekusi minimal satu kali. Kasus paling umum adalah menu interaktif yang wajib menampilkan prompt sebelum pengguna memilih:
#include <stdio.h>
int main(void) {
int pilihan;
/* do-while: cocok untuk menu interaktif yang wajib tampil minimal sekali */
do {
printf("Pilih aksi: 1=Lanjut, 0=Berhenti: ");
if (scanf("%d", &pilihan) != 1) {
pilihan = 0;
}
printf("Aksi: %d\n", pilihan);
} while (pilihan != 0);
printf("Selesai\n");
return 0;
}Output yang Dihasilkan (input: 1, 1, 0):
Pilih aksi: 1=Lanjut, 0=Berhenti: Aksi: 1
Pilih aksi: 1=Lanjut, 0=Berhenti: Aksi: 1
Pilih aksi: 1=Lanjut, 0=Berhenti: Aksi: 0
SelesaiPada contoh di atas, prompt “Pilih aksi” wajib muncul minimal satu kali—di sinilah do-while unggul. Jika kita memakai while, kita harus menginisialisasi pilihan dengan nilai bukan 0 agar loop masuk iterasi pertama, yang terasa seperti trik kotor. do-while menyatakan niat dengan jelas: “tampilkan prompt, lalu ulang selama pengguna belum memilih keluar”.
Kapan Memakai while (1) dengan break #
Pola while (1) { ... if (...) break; ... } adalah pilihan terbaik ketika kondisi berhenti terlalu rumit untuk dinyatakan dalam satu ekspresi di atas loop. Contoh kasus:
- Kondisi berhenti bergantung pada beberapa variabel yang berubah di tengah body.
- Loop perlu keluar dari beberapa titik berbeda tergantung logika kompleks.
- Body perlu dieksekusi minimal satu kali tetapi kondisi berhenti tidak cocok untuk
do-whilekarena bergantung pada banyak variabel.
Ringkasan: Aturan Praktis #
Empat aturan praktis untuk memilih jenis loop:
- Hitung dulu: jika jumlah iterasi sudah diketahui sebelum loop dimulai, pakai
for. - Cek dulu, eksekusi kemudian: jika body loop mungkin tidak perlu dieksekusi sama sekali, pakai
while. - Eksekusi dulu, cek kemudian: jika body loop wajib dieksekusi minimal satu kali, pakai
do-while. - Kondisi rumit: jika kondisi berhenti tidak dapat ditulis ringkas di atas loop, pakai
while (1)denganbreak.