Menu

Perulangan while dan do while di C#: Sintaks, Loop Input, dan Jebakan

Cara kerja perulangan while dan do-while di C#: kondisi yang diperiksa sebelum atau sesudah isi loop, membaca input sampai kata penanda atau sampai input habis, while (true) dengan break, dan kesalahan infinite loop yang sering menjebak.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Perulangan while mengulang isinya selama sebuah kondisi tetap bernilai true. Pakai perulangan ini saat kamu tidak tahu sejak awal berapa iterasi yang dibutuhkan: terus jalan sampai saldo mencapai target, antrean kosong, atau input habis.

Output:

Year 1: 1070.00
Year 2: 1144.90
Year 3: 1225.04
Year 4: 1310.80
Year 5: 1402.55
Year 6: 1500.73
Goal reached after 6 years

Kondisinya diperiksa sebelum setiap iterasi, termasuk iterasi pertama. Kalau savings sudah mencapai target sejak awal, isi loop tidak akan pernah dijalankan dan program akan mencetak "after 0 years". Loop ini bergantung pada isi loop yang mengubah sesuatu yang dibaca kondisi; di sini savings bertambah setiap tahun sampai savings < goal menjadi false.

do while: dijalankan minimal sekali

Perulangan do while memindahkan pemeriksaan ke akhir, jadi isinya selalu dijalankan minimal sekali:

Output:

Attempt 1: got 7
Attempt 2: got 4
Attempt 3: got 1
Done after 3 attempts

Nilai pertama code baru ada setelah isi loop dijalankan sekali, dan di situlah do while cocok dipakai. Ada dua detail sintaks yang sering menjebak:

  • Titik koma setelah while (code != 1) wajib ada. Melupakannya adalah error kompilasi.
  • Variabel yang dipakai di kondisi harus dideklarasikan sebelum do. Variabel yang dideklarasikan di dalam kurung kurawal sudah berada di luar scope saat kondisi dijalankan, jadi do { int code = ...; } while (code != 1); tidak bisa dikompilasi.

Loop yang sama yang ditulis dengan while butuh pemanggilan pertama yang diduplikasi sebelum loop atau nilai awal palsu yang memaksa putaran pertama terjadi. do while langsung menyatakan "coba dulu, lalu putuskan apakah perlu mencoba lagi".

Membaca input sampai kata penanda

Membaca baris sampai ada kata penghenti, atau sampai input habis, adalah contoh klasik perulangan while. Console.ReadLine() mengembalikan null saat tidak ada input lagi, jadi uji keduanya:

Output:

skipping "abc": not a number
3 amounts, total 49.50

(line = Console.ReadLine()) != null mengisi baris berikutnya dan mengujinya dalam satu ekspresi; tanda kurung di sekitar assignment wajib ada karena != mengikat lebih kuat daripada =. Loop berhenti di done, jadi 99 setelahnya tidak pernah dibaca. decimal.TryParse menolak abc tanpa melempar exception, dan continue melompat ke baris berikutnya. Tanpa pemeriksaan null, saat input habis, null akan dikirim ke TryParse selamanya, karena ReadLine terus mengembalikan null.

do while cocok untuk pola minta-lalu-validasi, saat permintaan input harus muncul minimal sekali:

Output:

Enter your age:
"-4" is not a valid age
Enter your age:
"fifteen" is not a valid age
Enter your age:
Age accepted: 15

Permintaan input ada di dalam loop, jadi muncul lagi setelah setiap jawaban yang ditolak, dan age dideklarasikan sebelum do agar kode setelah loop bisa memakainya. Kalau ada pengguna di depan keyboard, setiap jawaban muncul di console setelah permintaannya; dengan input yang dialihkan, seperti di sini, hanya output program sendiri yang ditampilkan.

while (true) dengan break

Kadang titik keluar yang wajar ada di tengah isi loop, setelah sebagian pekerjaan dan sebelum sisanya. Tulis loop sebagai while (true) dan keluar dengan break:

Output:

processing: resize photo
processing: send email
stop signal received
1 job(s) left in the queue

Dequeue mengambil job berikutnya dari depan queue, dan loop keluar begitu melihat penanda berhenti, jadi job terakhir tetap ada di antrean. while (true) bukan tanda kode yang buruk selama jalan keluarnya jelas dan dekat dengan bagian atas isi loop. Bentuk ini baru menjadi masalah saat ada beberapa break yang tersebar di isi loop yang panjang; dalam kasus itu, kondisi bool yang diberi nama atau method dengan return lebih mudah diikuti. Halaman break dan continue membahas cara keluar dari loop bersarang.

Loop yang tidak pernah berhenti

Infinite loop yang tidak disengaja punya salah satu dari tiga penyebab ini.

Isi loop tidak pernah mengubah kondisi. Counter-nya tidak pernah dinaikkan, atau variabel yang dinaikkan salah:

int i = 0;
while (i < 5)
{
    Console.WriteLine(i);   // i++ forgotten: prints 0 forever
}

Titik koma setelah kondisi. Titik koma itu adalah seluruh isi loop, dan blok di bawahnya baru dijalankan setelah loop (yang tidak pernah selesai):

while (retries < 3);        // warning CS0642: Possible mistaken empty statement
{
    retries++;
}

Kondisi yang melompati targetnya. Menguji dengan != saat variabel bergerak dengan langkah tertentu bisa melompati nilai berhentinya. while (x != 10) x += 3; berjalan 0, 3, 6, 9, 12 dan langsung melewati 10 (loop itu baru mengenai 10 secara kebetulan, setelah int mengalami overflow dan berputar balik miliaran langkah kemudian). Uji dengan < atau > alih-alih != setiap kali langkahnya bukan 1. Hal yang sama berlaku untuk nilai double, yang jarang tepat mengenai target: while (x != 1.0) x += 0.1; tidak pernah berhenti.

Memilih antara while, do while, dan for

SituasiLoop
Jumlah iterasi sudah diketahui, atau ada indeksfor
Setiap elemen sebuah collectionforeach
Ulangi selama kondisi terpenuhi, mungkin nol kaliwhile
Isi loop harus dijalankan sekali sebelum kondisinya masuk akaldo while
Pemeriksaan keluar ada di tengah isi loopwhile (true) dengan break

Setiap perulangan for bisa ditulis ulang sebagai perulangan while dan sebaliknya; pilihannya soal mana yang meletakkan logika loop di tempat yang diharapkan pembaca. Saat counter, pengujian, dan langkahnya semuanya ada, for menyatukannya dalam satu baris. Saat loop digerakkan oleh state yang berubah di dalam isi loop, while menyatakannya dengan jelas.

Pertanyaan yang sering diajukan

Apa bedanya while dan do while di C#?

Perulangan while memeriksa kondisinya sebelum setiap iterasi, jadi isinya bisa tidak dijalankan sama sekali. Perulangan do { } while (condition); memeriksa kondisi setelah setiap iterasi, jadi isinya selalu dijalankan minimal sekali. Pakai do while saat putaran pertama yang menghasilkan nilai yang diuji kondisi, misalnya membaca input lalu memvalidasinya.

Bagaimana sintaks perulangan do while di C#?

do { body } while (condition);. Perhatikan titik koma setelah tanda kurung penutup: titik koma itu wajib, dan melupakannya adalah error kompilasi. Kondisinya boleh memakai variabel yang diisi di dalam isi loop, tetapi variabel itu harus dideklarasikan sebelum do, karena kurung kurawal isi loop adalah scope tersendiri.

Bagaimana cara menulis while (true) di C#?

while (true) { ... } berulang terus sampai ada sesuatu di dalamnya yang keluar dengan break, return atau exception. Ini bentuk yang wajar saat pemeriksaan untuk keluar ada di tengah isi loop, misalnya membaca sebuah baris lalu berhenti saat baris itu kosong.

Bagaimana cara membaca input sampai pengguna mengetik sebuah kata atau input habis di C#?

Buat loop dengan Console.ReadLine(), yang mengembalikan null di akhir input: string line; while ((line = Console.ReadLine()) != null && line != "done") { ... }. Assignment di dalam kondisi membaca baris berikutnya dan mengujinya dalam satu langkah.

Kenapa perulangan while saya di C# tidak pernah berhenti?

Biasanya isi loop tidak pernah mengubah apa yang diuji kondisi (lupa i++), atau ada titik koma tepat setelah kondisi: while (count < 10); adalah loop dengan isi kosong yang berputar selamanya. Compiler memberi peringatan untuk kasus kedua dengan CS0642, Possible mistaken empty statement.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai