for menyatukan inisialisasi, kondisi, dan langkah dalam satu header — pas untuk pengulangan yang hitungannya sudah jelas. Tetapi banyak tugas yang jumlah putarannya tidak bisa kita tentukan di muka: berapa banyak angka yang akan diketik pengguna? Kapan data di file berakhir? Untuk kasus seperti ini, while memberi bentuk yang lebih jujur: “ulangi SELAMA kondisi ini benar”. Pada Chapter ini kita mempelajari cara kerja while sebagai pre-test loop, mengenal pola input sentinel yang menjadi inti dari banyak program command-line, dan merumuskan kriteria memilih antara for dan while.
Bentuk Dasar: Uji Dulu, Jalankan Kemudian #
while hanya punya satu klausa: kondisi. Sebelum setiap putaran, kondisi dievaluasi; bila true, badan dijalankan lalu evaluasi diulang; bila false, eksekusi melompat ke baris sesudah loop. Karena pemeriksaan terjadi SEBELUM badan, loop ini disebut pre-test loop — bila kondisi sejak awal false, badan tidak pernah dijalankan sama sekali. Program hitung mundur berikut memperlihatkan mekanismenya:
#include <iostream>
int main() {
int hitungan = 3;
while (hitungan > 0) {
std::cout << hitungan << "\n";
--hitungan;
}
std::cout << "Mulai!\n";
return 0;
}Output yang Dihasilkan:
3
2
1
Mulai!Mari kita telusuri putarannya:
- Baris 5 (
int hitungan = 3;): variabel kondisi disiapkan sebelum loop — padanan klausa init padafor. - Baris 7 (
while (hitungan > 0)): putaran pertama menemukan 3 > 0 benar, jadi badan masuk. Ini juga tempat putaran terakhir diuji: setelah--hitunganmenjadikan nilainya 0, kondisi gagal dan loop berhenti. - Baris 9 (
--hitungan;): baris yang menggerakkan loop mendekati berakhir. Tanpa baris ini,hitungantetap 3 selamanya dan program tidak pernah selesai — versi infinite loop dariwhile. - Baris 12: karena kondisi sudah
false, baris ini tercapai tepat satu kali, sesudah loop berakhir.
Perhatikan pembagian kerjanya: inisialisasi berada SEBELUM loop, pemeriksaan di header, dan penggerak di dalam badan. while memang lebih longgar strukturnya daripada for; kebebasan itu nyaman, tetapi juga lebih mudah membuat kita lupa menggerakkan loop. Sintaks lengkapnya tersaji di cppreference
.
Kapan while Lebih Tepat dari for #
Keduanya bisa saling menggantikan secara teknis — setiap for bisa ditulis ulang sebagai while. Perbedaannya ada pada kejelasan maksud. Gunakan for bila ada counter yang naik-turun dengan pola tetap; gunakan while bila kondisi berakhirnya bergantung pada peristiwa yang tidak bisa dihitung di muka: pengguna mengetik sesuatu, nilai mencapai toleransi tertentu, atau sumber data berakhir. Aturan sederhananya: bila klausa iterasi Anda bukan sekadar ++i melainkan “tunggu peristiwa berikutnya”, while lebih tepat.
Pola Input Sentinel dengan cin #
Pola paling terkenal dari while adalah sentinel: pengguna menyuntikkan data satu per satu, dan sebuah nilai khusus — sentinel — menjadi tanda “selesai”. Nilai -1 lazim dipilih untuk data yang semestinya positif, karena -1 mustahil merupakan data sah. Program berikut menjumlahkan deretan nilai sampai pengguna mengetik -1:
#include <iostream>
int main() {
int nilai;
int total = 0;
int banyak = 0;
std::cout << "Masukkan nilai (akhiri dengan -1): ";
std::cin >> nilai;
while (nilai != -1) {
total += nilai;
++banyak;
std::cin >> nilai;
}
std::cout << "Total: " << total << "\n";
std::cout << "Rata-rata: " << total / banyak << "\n";
return 0;
}Output yang Dihasilkan:
Masukkan nilai (akhiri dengan -1): Total: 240
Rata-rata: 80Mari kita bedah pola sentinelnya baris demi baris:
- Baris 9 (
std::cin >> nilai;): pembacaan PERTAMA dilakukan SEBELUM loop. Ini khas pola sentinel — kondisi loop butuh nilai yang sudah terisi, jadi kita mengambil data perdana di luar. - Baris 11 (
while (nilai != -1)): kondisi memeriksa data yang BARU saja dibaca. Bila pengguna langsung mengetik -1, badan tidak pernah berjalan dan program tetap aman (meski pembagian di akhir akan bermasalah — kasus tepi yang kita tangani nanti pada pembahsan validasi). - Baris 12-13: data sah diproses: ditambahkan ke
totaldan dihitung dalambanyak. - Baris 14 (
std::cin >> nilai;): pembacaan BERIKUTNYA di akhir badan — padanan klausa iterasi padafor. Perhatikan bahwa prompt tidak dicetak ulang di dalam loop, sehingga output program tampak satu baris prompt saja. - Baris 17-18: sesudah loop,
totalberisi 80 + 90 + 70 = 240 danbanyakberisi 3, sehingga rata-rata tercetak 80. Operator/pada duaintmenghasilkan bilangan bulat — pembagian pecahan dibahas pada Chapter Operator Aritmetika.
Pola ini sering kita temui di program nyata: shell membaca perintah sampai Anda mengetik exit, program pembacaan file membaca baris sampai akhir file. Sentinel -1 bekerja untuk angka; bila data bisa berupa angka apa pun termasuk negatif, sentinel harus diganti (misalnya nilai yang dijamin di luar rentang data), atau gunakan penanda akhir stream seperti std::cin >> x yang diuji keberhasilannya — teknik yang kita sentuh pada Chapter Input dengan cin dan kita perdalam di Section Input-Output dan File.
Dengan while, program kita kini bisa mengulang pekerjaan yang panjangnya tak terduga. Namun ada satu kasus yang membebani pola sentinel di atas: membaca data SEKALI pasti perlu dilakukan, apa pun kondisinya. Untuk “lakukan dulu, baru uji” seperti itu, C++ menyediakan do-while — topik Chapter berikutnya.