dartloopwhilePemula3 mnt baca

While & do-while

Perulangan while untuk kondisi tak tentu, dan do-while yang jalan minimal sekali.

Mengulang selama kondisi terpenuhi

for cocok saat kamu tahu jumlah pengulangannya. Tapi bagaimana kalau pengulangan harus berhenti saat sesuatu terjadi, misalnya "ulangi lempar dadu sampai dapat angka 6"? Jumlahnya tidak diketahui di awal. Di sinilah while berperan.

Analogi: for seperti "lari 5 putaran lapangan", jumlahnya pasti. while seperti "lari sampai capek", berhentinya tergantung kondisi.

Kenapa while ada?

Banyak proses dunia nyata tidak punya jumlah pasti: membaca input sampai pengguna mengetik "keluar", mencoba koneksi sampai berhasil, game loop yang jalan sampai pemain kalah. while mengecek kondisi sebelum tiap putaran dan berhenti begitu kondisi false.

Bentuk dasar while

dart
void main() {
  int angka = 1;

  while (angka <= 5) {
    print('Angka: $angka');
    angka++; // JANGAN LUPA: penghitung harus berubah!
  }

  print('Selesai, angka terakhir: $angka');
}

Jejak: angka=1 cetak, 2 cetak, 3 cetak, 4 cetak, 5 cetak, 6 → kondisi false → keluar. Baris angka++ adalah nyawa loop ini; tanpanya kondisi tidak pernah false.

Contoh kedua yang lebih "while banget", mensimulasikan lempar dadu:

dart
import 'dart:math';

void main() {
  var acak = Random();
  int dadu = 0;
  int lemparan = 0;

  while (dadu != 6) {
    dadu = acak.nextInt(6) + 1; // angka 1-6
    lemparan++;
    print('Lemparan $lemparan: $dadu');
  }

  print('Dapat 6 setelah $lemparan lemparan!');
}

Tidak ada yang tahu butuh berapa lemparan, dan itu tidak masalah. while memang dirancang untuk ketidakpastian jumlah.

do-while: cek di akhir

Ada varian di mana kondisi dicek setelah putaran, sehingga blok pasti jalan minimal sekali:

dart
void main() {
  int angka = 100;

  do {
    print('Angka: $angka');
    angka++;
  } while (angka <= 5);

  print('Tetap jalan sekali walau kondisi langsung false');
}

Walau angka sudah 100 (kondisi false sejak awal), blok tetap dieksekusi satu kali. Kegunaan klasik: menampilkan menu yang minimal tampil sekali sebelum mengecek pilihan pengguna.

Perbandingan ketiganya:

dart
void main() {
  // for: jumlah pasti
  for (int i = 0; i < 3; i++) {
    print('for: $i');
  }

  // while: cek dulu, bisa nol kali
  int a = 10;
  while (a < 3) {
    print('while: tidak pernah tercetak');
    a++;
  }

  // do-while: jalan dulu, minimal sekali
  int b = 10;
  do {
    print('do-while: tercetak sekali');
    b++;
  } while (b < 3);
}

Kesalahan umum pemula

1. Loop tak berujung karena lupa update

dart
// SALAH: angka tidak pernah berubah, macet selamanya
// int angka = 1;
// while (angka <= 5) {
//   print(angka);
// }
dart
// BENAR
void main() {
  int angka = 1;
  while (angka <= 5) {
    print(angka);
    angka++;
  }
}

Di for, update ada di header sehingga sulit lupa. Di while, update ada di badan loop dan mudah terlewat. Selalu periksa: "apakah kondisiku bisa menjadi false?"

2. Kondisi yang tidak pernah true

dart
void main() {
  int angka = 10;
  while (angka < 5) {
    print('tidak pernah jalan');
    angka++;
  }
  print('langsung ke sini');
}

Ini bukan error, tapi sering mengejutkan pemula yang mengira blok while "pasti jalan sekali". Kalau butuh jaminan sekali jalan, pakai do-while.

3. Titik koma setelah while

dart
// SALAH
void main() {
  int angka = 1;
  while (angka <= 5); // titik koma = badan loop kosong!
  {
    print(angka);
    angka++;
  }
}
dart
// BENAR
void main() {
  int angka = 1;
  while (angka <= 5) {
    print(angka);
    angka++;
  }
}

Kesimpulan

for untuk jumlah pasti, while untuk "selama kondisi", do-while untuk "minimal sekali". Aturan emas while: pastikan ada jalan menuju kondisi false, atau programmu macet selamanya.

Catatan teknis: while (true) adalah loop tak berujung yang disengaja, umum di server dan game loop. Ia aman dipakai ASALKAN ada break atau return di dalamnya sebagai pintu keluar.

Tantangan

Tebak angka menurun

Mulai dari 10, kurangi 1 tiap putaran dengan while sampai 1, cetak tiap angka. Lalu ulangi versi do-while mulai dari 3.

text
void main() {
  // TODO: while dari 10 ke 1, lalu do-while dari 3 ke 1
}