Control Flow: Loop
Pada materi sebelumnya, kita telah mempelajari bagaimana program dapat mengambil keputusan menggunakan conditional statement.
Namun, bagaimana jika kita ingin menjalankan sebuah instruksi berulang kali?
Misalnya kita ingin mencetak teks "Hello" sebanyak lima kali.
Tanpa menggunakan loop, kita dapat menulis:
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
Cara tersebut memang dapat bekerja, tetapi akan menjadi tidak praktis jika kita ingin menjalankan instruksi yang sama puluhan, ratusan, atau bahkan ribuan kali.
Untuk mengatasi masalah tersebut, kita dapat menggunakan Loop.
Apa itu Loop?
Loop adalah sebuah control structure yang digunakan untuk menjalankan sebuah blok kode secara berulang.
Dengan loop, kita tidak perlu menulis instruksi yang sama berkali-kali.
Sebagai contoh, kode berikut:
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
dapat ditulis menggunakan sebuah loop:
for (int i = 0; i < 5; i++) {
printf("Hello\n");
}
Kedua program tersebut akan menghasilkan output yang sama:
Hello
Hello
Hello
Hello
Hello
Namun versi yang menggunakan loop lebih singkat dan lebih mudah untuk dikembangkan.
Mengapa Loop Dibutuhkan?
Loop membantu kita menghindari penulisan kode yang sama secara berulang-ulang.
Sebagai contoh, bayangkan kita ingin mencetak:
Hello
sebanyak 100 kali.
Menulis:
printf("Hello\n");
sebanyak seratus baris tentu bukan cara yang efektif.
Dengan loop, kita cukup menulis:
for (int i = 0; i < 100; i++) {
printf("Hello\n");
}
Loop membuat kode menjadi:
- Lebih singkat.
- Mengurangi pengulangan kode (code redundancy).
- Lebih mudah dibaca.
- Lebih mudah diubah dan dipelihara.
Jenis Loop pada C
Dalam bahasa C, terdapat tiga jenis loop utama yang akan kita pelajari:
| Loop | Kegunaan Umum |
|---|---|
for | Digunakan ketika jumlah perulangan sudah diketahui |
while | Digunakan ketika perulangan bergantung pada suatu kondisi |
do-while | Digunakan ketika kode harus dijalankan setidaknya satu kali |
Ketiga loop tersebut memiliki tujuan yang sama, yaitu mengulangi sebuah blok kode.
Perbedaannya terletak pada bagaimana kondisi perulangan ditulis dan kapan kondisi tersebut diperiksa.
Kita akan mempelajarinya satu per satu.
For Loop
For Loop adalah salah satu bentuk perulangan yang umum digunakan ketika kita sudah mengetahui berapa kali sebuah proses akan dilakukan.
Sintaks dasar for adalah:
for (initialization; condition; increment/decrement) {
// code to be executed
}
Perhatikan bahwa di dalam tanda kurung for terdapat tiga komponen:
initialization
condition
increment / decrement
Contoh:
for (int i = 0; i < 5; i++) {
printf("%d\n", i);
}
Mari kita pahami masing-masing bagiannya.
Syntax For Loop
Struktur dasar sebuah for loop:
for (initialization; condition; increment/decrement) {
// code
}
Jika kita menggunakan:
for (int i = 0; i < 5; i++)
maka dapat kita pecah menjadi:
int i = 0 → Initialization
i < 5 → Condition
i++ → Increment
Secara visual:
for (int i = 0; i < 5; i++)
───────── ───── ───
│ │ │
│ │ └── Increment
│ │
│ └──────── Condition
│
└───────────────── Initialization
Komponen For Loop
1. Initialization
Initialization digunakan untuk menentukan nilai awal dari variabel yang akan mengontrol loop.
Contoh:
int i = 0;
Pada:
for (int i = 0; i < 5; i++)
variabel i dimulai dari:
0
Initialization hanya dilakukan satu kali, yaitu ketika loop pertama kali dimulai.
2. Condition
Condition menentukan apakah loop masih boleh dilanjutkan.
Contoh:
i < 5
Selama kondisi tersebut bernilai benar, blok kode di dalam loop akan terus dijalankan.
Misalnya:
i = 0 → 0 < 5 → True
i = 1 → 1 < 5 → True
i = 2 → 2 < 5 → True
i = 3 → 3 < 5 → True
i = 4 → 4 < 5 → True
i = 5 → 5 < 5 → False
Ketika kondisi menjadi false, loop berhenti.
3. Increment / Decrement
Setelah satu iterasi selesai, nilai variabel loop biasanya diubah.
Contoh:
i++;
Operator tersebut menambah nilai i sebesar 1.
Sehingga:
0 → 1 → 2 → 3 → 4 → 5
Selain increment, kita juga dapat menggunakan decrement.
Contoh:
i--;
yang akan mengurangi nilai i sebesar 1.
Cara Kerja For Loop
Sekarang perhatikan kembali program berikut:
#include <stdio.h>
int main() {
for (int i = 0; i < 5; i++) {
printf("%d\n", i);
}
return 0;
}
Output di terminal:
0
1
2
3
4
Mari kita lihat prosesnya.
Nilai awal:
i = 0
Kemudian komputer memeriksa:
i < 5
Karena:
0 < 5 → True
maka:
printf("%d\n", i);
dijalankan dan menghasilkan:
0
Setelah itu:
i++;
dijalankan sehingga:
i = 1
Proses kemudian diulang:
i = 0 → kondisi true → cetak 0
i = 1 → kondisi true → cetak 1
i = 2 → kondisi true → cetak 2
i = 3 → kondisi true → cetak 3
i = 4 → kondisi true → cetak 4
i = 5 → kondisi false → loop berhenti
Secara sederhana, alurnya dapat kita bayangkan sebagai:
Initialization
↓
Condition
↓
┌── True ──────────────┐
│ │
│ Jalankan Code
│ │
│ Increment/Decrement
│ │
└──────────────────────┘
↓
False
↓
Loop Selesai
Contoh Program For Loop
Misalnya kita ingin mencetak angka dari 1 sampai 5.
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) {
printf("%d\n", i);
}
return 0;
}
Output di terminal:
1
2
3
4
5
Perhatikan bahwa kali ini initialization dimulai dari:
int i = 1;
dan kondisi yang digunakan adalah:
i <= 5;
Karena kita ingin angka 5 masih ikut dicetak.
For Loop dengan Decrement
For loop tidak harus selalu menghitung naik.
Kita juga dapat melakukan perulangan dari nilai besar menuju nilai yang lebih kecil menggunakan decrement.
Contoh:
#include <stdio.h>
int main() {
for (int i = 5; i >= 1; i--) {
printf("%d\n", i);
}
return 0;
}
Output di terminal:
5
4
3
2
1
Pada contoh tersebut:
Initialization : int i = 5
Condition : i >= 1
Decrement : i--
Sehingga nilai i berubah:
5 → 4 → 3 → 2 → 1
Kapan Menggunakan For Loop?
for loop cocok digunakan ketika jumlah perulangan sudah diketahui
sebelumnya.
Contohnya:
Mencetak angka dari 1 sampai 10.
Mencetak "Hello" sebanyak 5 kali.
Melakukan proses sebanyak 100 kali.
Melakukan perhitungan dalam batas tertentu.
Sebagai contoh:
for (int i = 1; i <= 10; i++) {
printf("%d\n", i);
}
Dari awal kita sudah mengetahui bahwa loop akan berjalan sebanyak
10 kali.
Ketika kalian sudah mengetahui berapa kali sebuah proses perlu
diulang, for loop biasanya menjadi pilihan yang paling mudah
digunakan.
While Loop
While Loop adalah bentuk perulangan yang akan terus menjalankan sebuah blok kode selama kondisi yang diberikan masih bernilai benar.
Sintaks dasarnya:
while (condition) {
// code to be executed
}
Berbeda dengan for loop, pada while loop initialization dan
perubahan nilai variabel biasanya ditulis secara terpisah.
Contoh:
int i = 0;
while (i < 5) {
printf("%d\n", i);
i++;
}
Pada contoh tersebut:
Initialization : int i = 0
Condition : i < 5
Increment : i++
Ketiga bagian tersebut tetap ada, tetapi tidak ditulis dalam satu
baris seperti pada for loop.
Syntax While Loop
Struktur dasar while loop adalah:
while (condition) {
// code
}
Sebelum blok kode dijalankan, kondisi akan diperiksa terlebih dahulu.
Jika kondisi bernilai:
True
maka blok kode di dalam while akan dijalankan.
Jika kondisi bernilai:
False
maka loop akan berhenti.
Cara Kerja While Loop
Perhatikan program berikut:
#include <stdio.h>
int main() {
int i = 0;
while (i < 5) {
printf("%d\n", i);
i++;
}
return 0;
}
Output di terminal:
0
1
2
3
4
Mari kita lihat prosesnya.
Nilai awal:
i = 0
Kemudian kondisi diperiksa:
i < 5
Iterasi pertama:
i = 0
0 < 5 → True
Cetak 0
i++ → i = 1
Iterasi berikutnya:
i = 1
1 < 5 → True
Cetak 1
i++ → i = 2
Proses tersebut terus berulang sampai:
i = 5
Kemudian:
5 < 5 → False
sehingga loop berhenti.
Secara sederhana:
Initialization
↓
Condition
↓
┌── True ──────────────┐
│ │
│ Jalankan Code
│ │
│ Update Variable
│ │
└──────────────────────┘
↓
False
↓
Loop Selesai
Pentingnya Mengubah Nilai Variabel
Perhatikan kode berikut:
int i = 0;
while (i < 5) {
printf("%d\n", i);
}
Pada kode tersebut, nilai i tidak pernah berubah.
Nilainya akan selalu:
i = 0
dan kondisi:
i < 5
akan selalu bernilai benar.
Akibatnya, program akan terus mencetak:
0
0
0
0
0
...
tanpa berhenti.
Kondisi seperti ini disebut Infinite Loop.
Kita akan membahas infinite loop lebih lanjut pada bagian Common Errors pada Loop.
Pastikan kondisi pada while loop memiliki kemungkinan untuk menjadi
false.
Jika nilai yang digunakan dalam kondisi tidak pernah berubah, loop dapat berjalan terus-menerus.
Contoh Program While Loop
Misalnya kita ingin mencetak angka dari 1 sampai 5.
#include <stdio.h>
int main() {
int angka = 1;
while (angka <= 5) {
printf("%d\n", angka);
angka++;
}
return 0;
}
Output di terminal:
1
2
3
4
5
Pada program tersebut:
Nilai awal : angka = 1
Kondisi : angka <= 5
Update : angka++
Selama:
angka <= 5
masih bernilai benar, loop akan terus berjalan.
While Loop dengan Input
while juga dapat digunakan ketika perulangan bergantung pada
suatu kondisi yang belum diketahui jumlah pengulangannya.
Sebagai contoh:
#include <stdio.h>
int main() {
int angka;
printf("Masukkan angka positif: ");
scanf("%d", &angka);
while (angka > 0) {
printf("Angka: %d\n", angka);
printf("Masukkan angka positif: ");
scanf("%d", &angka);
}
return 0;
}
Program akan terus meminta input selama nilai yang dimasukkan lebih
besar dari 0.
Jumlah perulangan tidak diketahui sejak awal karena bergantung pada input pengguna.
Kapan Menggunakan While Loop?
while loop cocok digunakan ketika jumlah perulangan belum diketahui
sebelumnya.
Loop akan terus berjalan selama sebuah kondisi masih bernilai benar.
Contohnya:
Membaca input sampai kondisi tertentu tercapai.
Menunggu input pengguna.
Melakukan pemeriksaan sampai kondisi menjadi false.
Mengulangi proses selama sebuah syarat masih terpenuhi.
Jika kalian tidak mengetahui dengan pasti berapa kali sebuah proses
akan diulang, tetapi mengetahui kondisi kapan loop harus berhenti,
while biasanya menjadi pilihan yang sesuai.
Do-While Loop
Do-While Loop adalah bentuk perulangan yang mirip dengan while,
tetapi memiliki satu perbedaan penting.
Pada do-while, blok kode akan dijalankan terlebih dahulu.
Setelah itu, kondisi baru diperiksa.
Sintaks dasarnya:
do {
// code to be executed
} while (condition);
Perhatikan bahwa setelah:
while (condition)
terdapat tanda:
;
Syntax Do-While Loop
Struktur dasar do-while:
do {
// code
} while (condition);
Berbeda dengan while:
while (condition) {
// code
}
Pada while, kondisi diperiksa sebelum blok kode dijalankan.
Sedangkan pada do-while, blok kode dijalankan terlebih dahulu,
baru kemudian kondisi diperiksa.
Cara Kerja Do-While Loop
Perhatikan program berikut:
#include <stdio.h>
int main() {
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 5);
return 0;
}
Output di terminal:
0
1
2
3
4
Nilai awal:
i = 0
Kemudian blok do langsung dijalankan:
Cetak 0
Setelah itu:
i++;
sehingga:
i = 1
Barulah kondisi diperiksa:
1 < 5 → True
Karena kondisi masih benar, program kembali menjalankan blok do.
Proses tersebut terus berjalan hingga:
i = 5
Kemudian kondisi:
5 < 5
bernilai:
False
dan loop berhenti.
Perbedaan While dan Do-While
Perbedaan utama keduanya terletak pada kapan kondisi diperiksa.
while | do-while |
|---|---|
| Kondisi diperiksa terlebih dahulu | Blok kode dijalankan terlebih dahulu |
| Bisa tidak dijalankan sama sekali | Selalu dijalankan minimal satu kali |
| Condition berada di awal | Condition berada di akhir |
Perhatikan contoh berikut.
While
int angka = 10;
while (angka < 5) {
printf("Hello\n");
}
Kondisi pertama:
10 < 5 → False
Karena langsung false, kode:
printf("Hello\n");
tidak pernah dijalankan.
Sehingga program tidak menghasilkan output dari loop tersebut.
Do-While
Sekarang gunakan kondisi yang sama:
int angka = 10;
do {
printf("Hello\n");
} while (angka < 5);
Meskipun:
10 < 5 → False
output tetap:
Hello
Mengapa?
Karena blok:
do {
...
}
dijalankan sebelum kondisi diperiksa.
Setelah mencetak "Hello", barulah kondisi:
angka < 5
diperiksa dan ternyata false.
Loop kemudian berhenti.
Contoh Program Do-While
Misalnya kita membuat program sederhana untuk meminta sebuah angka.
#include <stdio.h>
int main() {
int angka;
do {
printf("Masukkan angka positif: ");
scanf("%d", &angka);
} while (angka <= 0);
printf("Angka yang dimasukkan: %d\n", angka);
return 0;
}
Jika pengguna memasukkan:
-3
kondisi:
angka <= 0
masih benar sehingga program meminta input kembali.
Contoh proses:
Masukkan angka positif: -3
Masukkan angka positif: 0
Masukkan angka positif: 5
Angka yang dimasukkan: 5
Loop berhenti setelah pengguna memasukkan angka positif.
Kapan Menggunakan Do-While Loop?
do-while digunakan ketika sebuah blok kode harus dijalankan
setidaknya satu kali, terlepas dari kondisi awal.
Contohnya:
Menampilkan menu.
Meminta input dari pengguna.
Melakukan validasi input.
Menjalankan proses awal sebelum kondisi diperiksa.
Gunakan do-while ketika suatu proses memang harus dilakukan
setidaknya satu kali sebelum kalian menentukan apakah proses tersebut
perlu diulang.
Ringkasan For, While, dan Do-While
Sekarang kita telah mengenal tiga jenis loop utama pada bahasa C.
| Loop | Kondisi Umum Penggunaan |
|---|---|
for | Jumlah perulangan telah diketahui |
while | Jumlah perulangan belum diketahui dan bergantung pada kondisi |
do-while | Blok harus dijalankan minimal satu kali |
Contoh sederhana:
for
→ "Ulangi ini sebanyak 10 kali."
while
→ "Ulangi selama kondisi masih benar."
do-while
→ "Lakukan dulu, kemudian ulangi jika kondisi masih benar."
Ketiga loop tersebut dapat menyelesaikan banyak permasalahan yang sama.
Pemilihan jenis loop biasanya dilakukan berdasarkan bentuk masalah dan cara yang paling mudah untuk membaca serta memahami program.
Loop Control Statements
Selain mengatur perulangan menggunakan condition, kita juga dapat mengontrol jalannya loop menggunakan Loop Control Statements.
Pada bahasa C, dua control statement yang akan kita pelajari adalah:
break
continue
Keduanya digunakan untuk mengubah alur normal sebuah loop.
| Statement | Fungsi |
|---|---|
break | Menghentikan loop secara langsung |
continue | Melewati iterasi saat ini dan lanjut ke iterasi berikutnya |
Break
Statement break digunakan untuk menghentikan loop secara langsung,
meskipun condition loop sebenarnya masih bernilai benar.
Perhatikan contoh berikut:
#include <stdio.h>
int main() {
for (int i = 0; i < 10; i++) {
if (i == 5) {
break;
}
printf("%d\n", i);
}
return 0;
}
Output di terminal:
0
1
2
3
4
Loop tersebut sebenarnya memiliki condition:
i < 10
Artinya, tanpa break, nilai i seharusnya berjalan:
0 1 2 3 4 5 6 7 8 9
Namun di dalam loop terdapat:
if (i == 5) {
break;
}
Ketika:
i = 5
condition:
i == 5
menjadi:
True
sehingga statement:
break;
dijalankan.
Loop kemudian langsung berhenti.
Secara sederhana:
i = 0 → cetak 0
i = 1 → cetak 1
i = 2 → cetak 2
i = 3 → cetak 3
i = 4 → cetak 4
i = 5 → break → loop berhenti
Perhatikan bahwa angka 5 tidak ikut dicetak karena break
dijalankan sebelum:
printf("%d\n", i);
Break pada While Loop
break tidak hanya dapat digunakan pada for loop.
Statement ini juga dapat digunakan pada while dan do-while.
Contoh:
#include <stdio.h>
int main() {
int angka = 1;
while (angka <= 10) {
if (angka == 6) {
break;
}
printf("%d\n", angka);
angka++;
}
return 0;
}
Output di terminal:
1
2
3
4
5
Ketika:
angka = 6
loop langsung dihentikan.
break berguna ketika kita ingin menghentikan sebuah loop lebih awal
setelah kondisi tertentu terpenuhi.
Continue
Berbeda dengan break, statement continue tidak menghentikan
seluruh loop.
continue hanya melewati sisa kode pada iterasi saat ini,
kemudian melanjutkan ke iterasi berikutnya.
Perhatikan contoh berikut:
#include <stdio.h>
int main() {
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue;
}
printf("%d\n", i);
}
return 0;
}
Output di terminal:
0
1
3
4
Saat:
i = 2
condition berikut bernilai benar:
i == 2
sehingga:
continue;
dijalankan.
Akibatnya, kode:
printf("%d\n", i);
pada iterasi tersebut dilewati.
Namun loop tidak berhenti.
Setelah itu, loop tetap lanjut ke:
i = 3
dan:
i = 4
Perbedaan Break dan Continue
Perhatikan perbedaannya:
break
→ hentikan seluruh loop
continue
→ lewati iterasi saat ini
→ lanjut ke iterasi berikutnya
Contoh:
for (int i = 0; i < 5; i++) {
if (i == 2) {
break;
}
printf("%d\n", i);
}
menghasilkan:
0
1
Sedangkan:
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue;
}
printf("%d\n", i);
}
menghasilkan:
0
1
3
4
Jadi:
| Statement | Apa yang terjadi ketika dijalankan? |
|---|---|
break | Keluar dari loop |
continue | Lewati iterasi saat ini |
Nested Loop
Nested Loop adalah sebuah loop yang berada di dalam loop lainnya.
Artinya, kita memiliki:
Outer Loop
↓
Inner Loop
Contoh struktur sederhananya:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
printf("Hello\n");
}
}
Loop pertama:
for (int i = 0; i < 3; i++)
disebut outer loop.
Sedangkan loop di dalamnya:
for (int j = 0; j < 2; j++)
disebut inner loop.
Cara Kerja Nested Loop
Hal terpenting dalam memahami nested loop adalah:
Setiap satu iterasi outer loop, inner loop akan dijalankan sampai selesai.
Perhatikan:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
printf("Hello\n");
}
}
Outer loop berjalan:
i = 0
i = 1
i = 2
Jadi outer loop memiliki:
3 iterasi
Sedangkan inner loop berjalan:
j = 0
j = 1
atau:
2 iterasi
Untuk setiap satu iterasi outer loop, inner loop berjalan sebanyak dua kali.
Sehingga jumlah keseluruhan eksekusi:
3 × 2 = 6
Maka:
printf("Hello\n");
akan dijalankan sebanyak:
6 kali
Melihat Nilai Outer dan Inner Loop
Agar lebih mudah memahami prosesnya, kita dapat mencetak nilai i
dan j.
#include <stdio.h>
int main() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
printf("i = %d, j = %d\n", i, j);
}
}
return 0;
}
Output di terminal:
i = 0, j = 0
i = 0, j = 1
i = 1, j = 0
i = 1, j = 1
i = 2, j = 0
i = 2, j = 1
Perhatikan polanya.
Ketika:
i = 0
inner loop menyelesaikan:
j = 0
j = 1
Setelah inner loop selesai, outer loop berubah menjadi:
i = 1
Kemudian inner loop kembali dimulai dari:
j = 0
dan proses tersebut terus berulang.
Secara visual:
i = 0
│
├── j = 0
└── j = 1
i = 1
│
├── j = 0
└── j = 1
i = 2
│
├── j = 0
└── j = 1
Contoh Nested Loop
Nested loop sering digunakan ketika sebuah masalah mempunyai struktur baris dan kolom.
Misalnya kita ingin mencetak:
***
***
***
Kita dapat menggunakan:
#include <stdio.h>
int main() {
for (int baris = 0; baris < 3; baris++) {
for (int kolom = 0; kolom < 3; kolom++) {
printf("*");
}
printf("\n");
}
return 0;
}
Output di terminal:
***
***
***
Pada program tersebut:
Outer Loop → menentukan jumlah baris
Inner Loop → menentukan jumlah bintang pada setiap baris
Outer loop:
for (int baris = 0; baris < 3; baris++)
berjalan sebanyak:
3 kali
Sedangkan inner loop:
for (int kolom = 0; kolom < 3; kolom++)
mencetak:
***
untuk setiap baris.
Setelah inner loop selesai, kita menjalankan:
printf("\n");
untuk berpindah ke baris berikutnya.
Ketika ingin membuat pola yang terdiri dari baris dan kolom, coba pikirkan:
Outer Loop → Baris
Inner Loop → Isi setiap baris
Konsep ini akan digunakan kembali pada bagian Practice.
Common Errors pada Loop
Loop memang dapat membuat program menjadi lebih singkat, tetapi kesalahan kecil pada condition atau perubahan variabel dapat membuat program menghasilkan perilaku yang tidak diinginkan.
Dua kesalahan yang umum terjadi adalah:
Infinite Loop
Off-by-One Error
Infinite Loop
Infinite Loop adalah kondisi ketika sebuah loop terus berjalan tanpa pernah berhenti.
Salah satu penyebabnya adalah lupa mengubah nilai variabel yang digunakan pada condition.
Contoh:
#include <stdio.h>
int main() {
int i = 0;
while (i < 5) {
printf("%d\n", i);
}
return 0;
}
Perhatikan bahwa di dalam loop tidak terdapat:
i++;
Akibatnya:
i = 0
tidak pernah berubah.
Condition:
i < 5
selalu menjadi:
0 < 5 → True
Sehingga program terus menghasilkan:
0
0
0
0
0
0
...
dan tidak pernah berhenti dengan sendirinya.
Versi yang benar:
int i = 0;
while (i < 5) {
printf("%d\n", i);
i++;
}
Sekarang nilai i berubah:
0 → 1 → 2 → 3 → 4 → 5
dan ketika:
i = 5
condition menjadi:
5 < 5 → False
sehingga loop berhenti.
Jika program tiba-tiba terus mencetak output tanpa berhenti, periksa terlebih dahulu:
- Condition loop.
- Perubahan variabel loop.
- Apakah condition memiliki kemungkinan untuk menjadi
false.
Off-by-One Error
Off-by-One Error terjadi ketika batas sebuah loop tidak sesuai dengan jumlah iterasi yang kita inginkan.
Misalnya kita ingin mencetak:
Hello
sebanyak 5 kali.
Kita menulis:
for (int i = 0; i <= 5; i++) {
printf("Hello\n");
}
Sekilas mungkin terlihat benar.
Namun coba perhatikan nilai i:
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
Jumlahnya adalah:
6 iterasi
Karena nilai 0 juga ikut dihitung.
Akibatnya "Hello" dicetak sebanyak:
6 kali
Jika kita ingin tepat 5 iterasi dengan nilai awal 0, condition yang
sesuai adalah:
i < 5
Sehingga:
for (int i = 0; i < 5; i++) {
printf("Hello\n");
}
nilai i hanya:
0
1
2
3
4
yaitu tepat:
5 iterasi
< dan <=
Salah satu sumber off-by-one error yang paling umum adalah tertukar antara:
<
dan:
<=
Bandingkan:
for (int i = 0; i < 5; i++)
Nilai i:
0 1 2 3 4
Jumlah iterasi:
5
Sedangkan:
for (int i = 0; i <= 5; i++)
Nilai i:
0 1 2 3 4 5
Jumlah iterasi:
6
Tidak ada yang selalu salah antara < dan <=.
Yang penting adalah batas loop harus sesuai dengan hasil yang ingin kita capai.
Ketika ragu dengan jumlah iterasi sebuah loop, tuliskan beberapa nilai awal variabel loop secara manual.
Contoh:
i = 0
i = 1
i = 2
...
Cara sederhana ini sering membantu menemukan off-by-one error.
Practice
Sekarang kalian telah mempelajari:
for
while
do-while
break
continue
nested loop
Pada bagian ini, kita akan mencoba menggunakan konsep-konsep tersebut untuk menyelesaikan beberapa permasalahan sederhana.
Cobalah memahami pola yang diminta terlebih dahulu sebelum mulai menulis kode.
Untuk soal pola bintang, perhatikan hubungan antara:
baris
dan
jumlah bintang pada setiap baris
Practice 1 — Persegi Bintang
Buatlah program yang menerima sebuah bilangan bulat n.
Nilai n menentukan jumlah baris sekaligus jumlah bintang pada setiap
baris.
Jika input yang diberikan adalah:
5
maka output yang dihasilkan:
*****
*****
*****
*****
*****
Contoh tampilan program:
Enter how many line of stars : 5
*****
*****
*****
*****
*****
Petunjuk
Perhatikan bahwa:
Jumlah baris = 5
Jumlah bintang per baris = 5
Permasalahan ini dapat dipandang sebagai:
Outer Loop
→ mengatur jumlah baris
Inner Loop
→ mencetak bintang pada setiap baris
Secara sederhana:
Baris 1 → *****
Baris 2 → *****
Baris 3 → *****
Baris 4 → *****
Baris 5 → *****
Practice 2 — Segitiga Bintang Naik
Buatlah program yang menerima sebuah bilangan bulat n.
Program kemudian mencetak pola bintang yang jumlahnya bertambah pada setiap baris.
Jika input:
5
maka output:
*
**
***
****
*****
Contoh tampilan program:
Enter how many line of stars : 5
*
**
***
****
*****
Petunjuk
Perhatikan hubungan antara nomor baris dengan jumlah bintang:
Baris 1 → 1 bintang
Baris 2 → 2 bintang
Baris 3 → 3 bintang
Baris 4 → 4 bintang
Baris 5 → 5 bintang
Sehingga jumlah iterasi pada inner loop tidak selalu sama.
Jumlah bintang mengikuti nomor baris.
Secara konsep:
Outer Loop
→ menentukan baris
Inner Loop
→ mencetak bintang sebanyak nomor baris
Practice 3 — Segitiga Bintang Turun
Buatlah program yang menerima sebuah bilangan bulat n.
Program kemudian mencetak pola bintang yang jumlahnya berkurang pada setiap baris.
Jika input:
5
maka output:
*****
****
***
**
*
Contoh tampilan program:
Enter how many line of stars : 5
*****
****
***
**
*
Petunjuk
Perhatikan polanya:
Baris 1 → 5 bintang
Baris 2 → 4 bintang
Baris 3 → 3 bintang
Baris 4 → 2 bintang
Baris 5 → 1 bintang
Berbeda dengan Practice 2, jumlah bintang pada soal ini justru berkurang pada setiap baris.
Kalian dapat memikirkan hubungan:
Jumlah bintang
=
jumlah baris - posisi baris
atau menggunakan loop yang berjalan menurun.
Practice 4 — Faktorial
Buatlah sebuah program untuk menghitung faktorial dari sebuah bilangan.
Faktorial sebuah bilangan positif n merupakan hasil perkalian:
n × (n - 1) × (n - 2) × ... × 1
Sebagai contoh:
5!
berarti:
5 × 4 × 3 × 2 × 1
dan menghasilkan:
120
Jika input:
5
maka contoh output:
Enter number: 5
Factorial from 5 = 120
Petunjuk
Untuk menghitung faktorial, kita membutuhkan sebuah variabel untuk menyimpan hasil perkalian sementara.
Misalnya:
hasil = 1
Kemudian nilai tersebut terus dikalikan selama loop berjalan:
hasil = hasil × 1
hasil = hasil × 2
hasil = hasil × 3
hasil = hasil × 4
hasil = hasil × 5
Perubahannya:
Awal : hasil = 1
× 1 : hasil = 1
× 2 : hasil = 2
× 3 : hasil = 6
× 4 : hasil = 24
× 5 : hasil = 120
Sehingga:
5! = 120
Pada soal faktorial, pikirkan dua hal:
- Variabel apa yang digunakan untuk menyimpan hasil?
- Berapa kali proses perkalian harus dilakukan?
Ringkasan
Pada materi ini kita telah mempelajari bagaimana sebuah blok program dapat dijalankan berulang kali menggunakan loop.
Tiga jenis loop utama pada bahasa C adalah:
for
while
do-while
Kita juga telah mempelajari:
break
continue
nested loop
serta beberapa kesalahan yang sering terjadi:
infinite loop
off-by-one error
Secara umum:
for
→ cocok ketika jumlah iterasi sudah diketahui
while
→ cocok ketika perulangan bergantung pada kondisi
do-while
→ cocok ketika kode harus dijalankan minimal satu kali
Pemahaman mengenai loop akan sangat membantu ketika program mulai membutuhkan proses yang dilakukan berulang kali tanpa harus menulis kode yang sama secara terus-menerus.