Perulangan for
Mengulang kode dengan for klasik dan for-in untuk koleksi.
Melakukan hal berulang tanpa menulis berulang
Bayangkan disuruh menulis "Aku tidak akan mencontek" 100 kali di papan tulis. Menulis manual 100 baris itu gila. Perulangan for adalah cara menyuruh komputer mengulang pekerjaan: tulis instruksinya sekali, tentukan berapa kali diulang.
Analogi: for itu seperti resep "uleni adonan, diamkan 10 menit" yang diulang 3 kali. Kamu tidak menulis ulang resepnya 3 kali, kamu menulis "ulangi langkah ini 3 kali".
Kenapa perulangan ada?
Karena komputer unggul dalam pekerjaan repetitif yang membosankan bagi manusia: memproses 1000 data, mencetak tabel, mengecek tiap item dalam daftar. Tanpa perulangan, program modern tidak mungkin ditulis.
Anatomi for
void main() {
for (int i = 0; i < 5; i++) {
print('Putaran ke-$i');
}
}Tiga bagian di dalam kurung, dipisah titik koma:
- Inisialisasi
int i = 0: dijalankan sekali di awal. Biasanya membuat variabel penghitung. - Kondisi
i < 5: dicek sebelum tiap putaran. Kalau true, lanjut; kalau false, berhenti. - Update
i++: dijalankan di akhir tiap putaran. Biasanya menaikkan penghitung.
Jejak eksekusinya: i=0 cetak, i=1 cetak, i=2 cetak, i=3 cetak, i=4 cetak, i=5 → kondisi false → berhenti. Total 5 putaran.
Contoh kedua, menghitung jumlah:
void main() {
int total = 0;
for (int i = 1; i <= 10; i++) {
total += i; // tambahkan i ke total tiap putaran
print('i=$i, total sementara=$total');
}
print('Total 1 sampai 10 = $total'); // 55
}Pola ini sangat umum: variabel akumulator (total) di luar loop, diakumulasi di dalam loop. Kamu akan memakainya terus-menerus.
for-in: mengulang isi koleksi
Kalau yang diulang adalah isi daftar (akan dibahas detail di modul List), ada bentuk lebih sederhana:
void main() {
var buah = ['apel', 'mangga', 'pisang'];
for (var b in buah) {
print('Aku suka $b');
}
}Tidak perlu penghitung manual. Variabel b otomatis berisi tiap item, satu per satu. Untuk sekarang cukup tahu bentuknya; detail koleksi menyusul.
Kesalahan umum pemula
1. Off-by-one: salah batas
// SALAH (niatnya 5 putaran, dapat 6)
void main() {
for (int i = 0; i <= 5; i++) {
print(i); // 0,1,2,3,4,5
}
}// BENAR: 5 putaran
void main() {
for (int i = 0; i < 5; i++) {
print(i); // 0,1,2,3,4
}
}Aturan jempol: mulai dari 0 pakai < n, mulai dari 1 pakai <= n. Keduanya menghasilkan n putaran.
2. Lupa update sehingga loop tak berujung
// SALAH: i tidak pernah berubah, program macet selamanya
// for (int i = 0; i < 5;) {
// print(i);
// }// BENAR
void main() {
for (int i = 0; i < 5; i++) {
print(i);
}
}Kalau program tiba-tiba tidak berhenti, curigai loop yang penghitungnya tidak berubah.
3. Mendeklarasikan penghitung di luar tanpa perlu
// Kurang rapi
void main() {
int i;
for (i = 0; i < 5; i++) {
print(i);
}
}// BENAR: deklarasikan di dalam for
void main() {
for (int i = 0; i < 5; i++) {
print(i);
}
// i tidak bisa diakses di sini, dan itu bagus
}Variabel i yang dideklarasikan di dalam for hanya hidup di dalam loop (scope terbatas), mencegah kekacauan nama variabel.
Kesimpulan
for klasik untuk pengulangan berbasis hitungan dengan pola inisialisasi-kondisi-update, for-in untuk menjelajahi isi koleksi. Waspadai off-by-one dan loop tak berujung. Di modul berikutnya kamu akan bertemu while, saudara for yang lebih fleksibel.
Catatan teknis: Variabel yang dideklarasikan di bagian inisialisasi for memiliki scope hanya di dalam loop. Ini berbeda dengan JavaScript lama (var) yang bocor ke luar, dan merupakan perilaku yang lebih aman.
Tantangan
Tabel perkalian
Cetak tabel perkalian 7 dari 7x1 sampai 7x10 dengan format "7 x 3 = 21". Pakai for.
void main() {
// TODO: tabel perkalian 7
}