Bayangkan ingin mencetak angka 1 sampai 1000. Tanpa perulangan, kita harus menulis printf sebanyak 1000 baris. Dengan perulangan, cukup beberapa baris kode — dan komputer akan mengulanginya sendiri.
Perulangan (loop) adalah struktur kendali yang membuat serangkaian pernyataan dieksekusi berulang kali selama suatu kondisi bernilai benar. Begitu kondisi menjadi salah, perulangan berhenti dan program melanjutkan ke baris berikutnya.
Bahasa C menyediakan tiga struktur perulangan: while, do-while, dan for. Ketiganya mengerjakan hal yang sama pada dasarnya — bedanya pada kapan kondisi diperiksa dan bagaimana variabel kontrol dikelola.
whilePerulangan while memeriksa kondisi sebelum badan perulangan dieksekusi. Jika kondisi sudah salah sejak awal, badan perulangan tidak akan pernah dijalankan sama sekali.
/* inisialisasi variabel kontrol dilakukan di LUAR */ int i = 1; while (kondisi) { pernyataan_1; pernyataan_n; update variabel kontrol; // WAJIB! atau infinite loop }
#include <stdio.h> int main() { int i = 1; // ① inisialisasi variabel kontrol while (i <= 5) { // ② kondisi diperiksa SEBELUM badan printf("%d\n", i); i++; // ③ update — tanpa ini: infinite loop! } return 0; } /* Output: 1 2 3 4 5 */
do-whilePerulangan do-while memeriksa kondisi setelah badan perulangan dieksekusi. Artinya badan perulangan selalu dijalankan minimal satu kali — tidak peduli apapun nilai kondisinya.
do { pernyataan_1; pernyataan_n; update variabel kontrol; } while (kondisi); // ← kondisi diperiksa SETELAH badan // jangan lupa titik koma di sini!
Inilah kasus yang paling jelas menunjukkan perbedaan keduanya. Kita set kondisi yang langsung salah sejak awal: i = 10 dengan kondisi i < 5.
int i = 10; while (i < 5) { printf("Baris ke-%d\n", i); i++; } printf("Selesai.\n");
int i = 10; do { printf("Baris ke-%d\n", i); i++; } while (i < 5); printf("Selesai.\n");
Infinite loop terjadi ketika kondisi perulangan tidak pernah menjadi salah, sehingga program terjebak mengulang selamanya dan tidak pernah berlanjut. Program menjadi tidak responsif (hang/freeze) dan harus dihentikan paksa.
Penyebab paling umum:
/* ❌ Kasus 1: Lupa update variabel kontrol */ int i = 1; while (i <= 5) { printf("%d\n", i); // i++ terlupa! → i selalu 1, kondisi selalu benar } /* ❌ Kasus 2: Kondisi selalu benar */ while (1) { // angka 1 = selalu benar printf("Tidak akan berhenti\n"); } /* ❌ Kasus 3: Update salah arah */ int j = 1; while (j > 0) { printf("%d\n", j); j++; // j bertambah terus, padahal kondisi j > 0 // seharusnya j-- agar akhirnya j = 0 }
break atau flag untuk mengontrol kapan keluar.
Salah satu penggunaan paling umum do-while adalah menu interaktif. Menu harus ditampilkan dulu sebelum user bisa memilih, sehingga do-while lebih tepat daripada while.
#include <stdio.h> int main() { int pilihan; char keluar; do { /* Tampilkan menu — dijalankan DULU sebelum cek kondisi */ printf("\n===== MENU UTAMA =====\n"); printf("1. Hitung Luas Persegi Panjang\n"); printf("2. Hitung Keliling Lingkaran\n"); printf("3. Tampilkan Tabel Perkalian\n"); printf("======================\n"); printf("Pilih menu (1-3): "); scanf("%d", &pilihan); switch (pilihan) { case 1: { float p, l; printf("Panjang: "); scanf("%f", &p); printf("Lebar : "); scanf("%f", &l); printf("Luas = %.2f\n", p * l); break; } case 2: { float r; printf("Jari-jari: "); scanf("%f", &r); printf("Keliling = %.2f\n", 2 * 3.14 * r); break; } case 3: { int n; printf("Angka: "); scanf("%d", &n); for (int i = 1; i <= 10; i++) { printf("%d x %d = %d\n", n, i, n*i); } break; } default: printf("Pilihan tidak valid.\n"); } /* Tanya apakah ingin keluar */ printf("\nApakah Anda ingin keluar? (Y/T): "); scanf(" %c", &keluar); // spasi sebelum %c: abaikan newline } while (keluar != 'Y' && keluar != 'y'); // Loop terus jika user TIDAK mengetik Y atau y printf("Terima kasih. Program selesai.\n"); return 0; }
while, kita perlu menginisialisasi variabel keluar dengan nilai awal tertentu sebelum loop — yang tidak alami. Dengan do-while, menu langsung tampil dan kondisi baru diperiksa setelah user memberi respons.
forPerulangan for adalah pilihan terbaik ketika jumlah iterasi diketahui sejak awal. Keunggulannya: inisialisasi, kondisi, dan update variabel kontrol semuanya ditulis dalam satu baris — sehingga lebih ringkas dan mudah dibaca.
i = 0i <= 10i++for (i=1; i<=5; i++) { printf("%d\n", i); } /* Urutan eksekusi: ① i=1 → inisialisasi (hanya sekali) ② 1 <= 5? Ya → cek kondisi → masuk badan printf(1) ③ i++ → update: i=2 ② 2 <= 5? Ya → cek kondisi → masuk badan printf(2) ③ i++ → update: i=3 ... (berlanjut) ② 6 <= 5? Tidak → kondisi salah → keluar loop */
Variabel kontrol adalah variabel yang nilainya berubah setiap iterasi dan menentukan kapan loop berhenti. Pada perulangan for, ketiga elemen variabel kontrol ditulis eksplisit dalam satu baris — ini justru membuat pengelolaan lebih aman dan mudah dibaca.
i <= 10, maka update harus i++ (naik menuju 11), bukan i-- yang justru menjauh.
/* Hitung mundur: 10 ke 1 */ for (int i = 10; i >= 1; i--) { printf("%d ", i); // 10 9 8 7 6 5 4 3 2 1 } /* Loncat 2: 0, 2, 4, 6, 8, 10 */ for (int i = 0; i <= 10; i += 2) { printf("%d ", i); } /* Menggunakan dua variabel kontrol */ for (int a=1, b=10; a<=5; a++, b--) { printf("a=%d b=%d\n", a, b); }
Sebuah perulangan dapat diletakkan di dalam perulangan lain. Loop di dalam disebut inner loop dan loop luar disebut outer loop. Setiap kali outer loop menjalankan satu iterasi, inner loop menyelesaikan seluruh iterasinya dari awal sampai selesai.
#include <stdio.h> int main() { int n = 5; for (int i = 1; i <= n; i++) { // outer: baris for (int j = 1; j <= i; j++) { // inner: bintang per baris printf("* "); } printf("\n"); } return 0; } /* Output: * * * * * * * * * * * * * * * */
for (int i = 1; i <= 3; i++) { for (int j = 1; j <= 3; j++) { printf("%3d", i * j); } printf("\n"); } /* 1 2 3 2 4 6 3 6 9 */
break dan continue| Kata kunci | Fungsi | Kapan digunakan |
|---|---|---|
break |
Keluar sepenuhnya dari loop saat ini | Ketika kondisi tertentu terpenuhi dan perulangan harus langsung dihentikan — misal: data ditemukan |
continue |
Lewati sisa badan iterasi ini, lanjut ke iterasi berikutnya | Ketika ingin melewati data tertentu tanpa menghentikan keseluruhan loop — misal: lewati angka genap |
/* break: henti loop saat menemukan angka 4 */ for (int i = 1; i <= 10; i++) { if (i == 4) break; printf("%d ", i); // Output: 1 2 3 } /* continue: lewati angka ganjil */ for (int i = 1; i <= 10; i++) { if (i % 2 != 0) continue; printf("%d ", i); // Output: 2 4 6 8 10 }
break hanya keluar dari loop terdalam tempat ia berada — bukan dari semua loop sekaligus. Untuk keluar dari semua level nested loop, gunakan variabel flag atau goto (dengan hati-hati).
| Aspek | for | while | do-while |
|---|---|---|---|
| Jumlah iterasi | Diketahui sebelumnya | Tidak diketahui | Tidak diketahui |
| Pemeriksaan kondisi | Sebelum badan | Sebelum badan | Setelah badan |
| Minimum eksekusi badan | 0 kali (bisa tidak jalan) | 0 kali (bisa tidak jalan) | 1 kali selalu |
| Variabel kontrol | Terkelola dalam satu baris | Dideklarasikan di luar | Dideklarasikan di luar |
| Gunakan untuk | Iterasi array, cetak pola, hitung 1 s.d. N | Baca hingga kondisi, cari data | Menu program, validasi input |
for(int i=1; i<=5; i++) { printf("%d\n",i); }
int i=1; while(i<=5){ printf("%d\n",i); i++; }
int i=1; do { printf("%d\n",i); i++; }while(i<=5);
i=1, i<=5) sudah benar. Perbedaan baru terasa ketika kondisi awal bisa salah, atau ketika badan harus dijalankan minimal sekali.
Program ini menggabungkan do-while untuk validasi input, for untuk iterasi sejumlah N data, dan while untuk menu utama.
#include <stdio.h> int main() { char lanjut = 'T'; /* while: menu utama — ulangi program */ while (lanjut != 'Y' && lanjut != 'y') { int n; /* do-while: validasi jumlah data (harus 1-100) */ do { printf("Berapa data yang akan diinput (1-100)? "); scanf("%d", &n); if (n < 1 || n > 100) printf("Tidak valid! Masukkan antara 1-100.\n"); } while (n < 1 || n > 100); float total = 0, nilai; /* for: iterasi sejumlah n yang sudah diketahui */ for (int i = 1; i <= n; i++) { printf("Nilai ke-%d: ", i); scanf("%f", &nilai); total += nilai; } printf("\nRata-rata dari %d data = %.2f\n", n, total / n); printf("Keluar? (Y/T): "); scanf(" %c", &lanjut); } printf("Program selesai.\n"); return 0; }
while — kondisi diperiksa sebelum badan; bisa tidak pernah jalando-while — kondisi diperiksa setelah badan; selalu minimal sekalifor — inisialisasi, kondisi, update dalam satu baris; terbaik untuk jumlah iterasi yang diketahuibreak keluar dari loop; continue lanjut ke iterasi berikutnyafor yang baru dipelajari akan menjadi pasangan utama array — iterasi elemen satu per satu adalah pola yang akan terus digunakan.