Perulangan

Perulangan For..Next, For Each, While, dan Do beserta kapan masing-masing digunakan.

Daftar isi

Perulangan (loop) menjalankan sekelompok pernyataan berkali-kali selama suatu syarat terpenuhi. VB.NET menyediakan For..Next untuk jumlah pengulangan yang diketahui, For Each..Next untuk menelusuri array dan koleksi (collection), serta While..End While dan Do..Loop untuk pengulangan yang bergantung pada kondisi. Topik ini membahas seluruh bentuk tersebut, pengaturan langkah dengan Step, serta pernyataan Exit dan Continue. Tabel pemilihan bentuk di bagian akhir merangkum kapan masing-masing perulangan digunakan.

Perulangan For..Next#

For..Next mengulang blok pernyataan sebanyak jumlah yang sudah diketahui sejak awal. Variabel penghitung (counter) dinyatakan pada For dengan nilai awal dan nilai akhir, dan VB menggerakkan variabel itu setiap kali badan perulangan selesai, sampai nilai akhir tercapai. Nilai akhir bersifat inklusif, sehingga For i As Integer = 1 To 10 menjalankan badan sepuluh kali dengan i bernilai 1 sampai 10. Kata kunci As pada For membuat variabel penghitung hanya berlaku di dalam perulangan tersebut.

Langkah kenaikan diatur dengan Step. Tanpa Step, penghitung bertambah satu, sedangkan Step -1 menurunkan penghitung untuk kebutuhan hitungan mundur. Program berikut mencetak tabel perkalian 7 dengan perataan kolom, lalu mencetak hitungan mundur dari 10 sampai 1 menggunakan Step -1.

vb TabelPerkalian.vb
Module TabelPerkalian
    Sub Main()
        For i As Integer = 1 To 10
            Console.WriteLine($"7 x {i,2} = {7 * i,3}")
        Next

        Console.WriteLine()

        For mundur As Integer = 10 To 1 Step -1
            Console.Write($"{mundur} ")
        Next
        Console.WriteLine()
    End Sub
End Module
text Keluaran
7 x  1 =   7
7 x  2 =  14
7 x  3 =  21
7 x  4 =  28
7 x  5 =  35
7 x  6 =  42
7 x  7 =  49
7 x  8 =  56
7 x  9 =  63
7 x 10 =  70

10 9 8 7 6 5 4 3 2 1 

Program di atas dijalankan dengan pola yang dijelaskan pada topik Program Pertama, yaitu proyek console baru dibuat, isi Program.vb diganti dengan kode program di atas, kemudian dotnet run mengeksekusinya.

bash
# tidak-dijalankan
dotnet new console -lang VB -n TabelPerkalian
cd TabelPerkalian
# ganti isi Program.vb dengan kode program di atas
dotnet run

Perataan kolom pada contoh tersebut memanfaatkan lebar minimum di dalam interpolasi string, yaitu {i,2} untuk angka dua digit dan {7 * i,3} untuk hasil tiga digit. Hitungan mundur berhenti tepat pada 1 karena Step -1 terus menurunkan penghitung dari 10, sedangkan 0 berada di luar rentang 10 sampai 1.

Exit For dan Continue For#

Exit For menghentikan perulangan seketika dan melanjutkan eksekusi ke pernyataan setelah Next. Continue For melewati sisa badan perulangan dan langsung menuju iterasi berikutnya. Keduanya hampir selalu diletakkan di dalam If karena hanya digunakan pada keadaan tertentu. Pada perulangan bertumpuk, Exit For hanya keluar dari perulangan terdalam tempat pernyataan itu berada.

Bentuk pasangannya tersedia untuk keluarga perulangan lain, yaitu Exit While dan Continue While untuk While..End While, serta Exit Do dan Continue Do untuk Do..Loop. Pola penggunaan Exit yang paling umum adalah menghentikan penelusuran ketika target sudah ditemukan, sedangkan Continue digunakan untuk melewati elemen yang tidak relevan tanpa menghentikan seluruh perulangan. Exit juga dapat menjadi pengaman pada perulangan yang berhentinya bergantung pada kejadian di luar program, misalnya masukan pengguna yang tidak menentu.

Kedua pernyataan ini boleh muncul lebih dari satu kali di dalam perulangan yang sama, dan setiap kemunculannya berlaku untuk perulangan tempat pernyataan itu dituliskan. Bagian berikutnya menerapkan keduanya sekaligus pada penelusuran array, yaitu Exit For untuk berhenti ketika nilai ditemukan dan Continue For untuk melewati nilai yang tidak memenuhi syarat.

Perulangan For Each..Next#

For Each..Next menelusuri setiap elemen array atau koleksi tanpa melibatkan indeks. Variabel elemen mengambil nilai setiap anggota satu per satu sesuai urutan penyimpanan, sehingga jumlah elemen tidak perlu diketahui sebelumnya. Pada array, urutan penelusuran mengikuti urutan indeks dari elemen pertama sampai elemen terakhir. Bentuk ini dipilih ketika nilai awal dan akhir tidak relevan, misalnya saat menghitung atau mencari di dalam sekumpulan data.

Program berikut menelusuri sebuah array nilai ujian dua kali. Penelusuran pertama mencari sebuah nilai dan berhenti lewat Exit For begitu nilai itu ditemukan. Penelusuran kedua menghitung nilai yang memenuhi batas minimal dan melewati sisanya dengan Continue For.

vb RekapNilai.vb
Module RekapNilai
    Sub Main()
        Dim nilaiUjian() As Integer = {72, 85, 91, 68, 79, 94}

        ' Pencarian: penelusuran berhenti begitu nilai ditemukan
        Dim cari As Integer = 91
        Dim ditemukan As Boolean = False
        For Each nilai As Integer In nilaiUjian
            If nilai = cari Then
                ditemukan = True
                Exit For
            End If
        Next

        ' Rekap: nilai di bawah 75 dilewati dengan Continue For
        Dim jumlahMemenuhi As Integer = 0
        For Each nilai As Integer In nilaiUjian
            If nilai < 75 Then
                Continue For
            End If
            jumlahMemenuhi += 1
        Next

        If ditemukan Then
            Console.WriteLine($"Nilai {cari} ditemukan dalam array")
        Else
            Console.WriteLine($"Nilai {cari} tidak ada dalam array")
        End If
        Console.WriteLine($"Nilai minimal 75: {jumlahMemenuhi}")
    End Sub
End Module
text Keluaran
Nilai 91 ditemukan dalam array
Nilai minimal 75: 4

For Each juga menerima koleksi seperti List(Of T). Daftar jadwal piket berikut ditelusuri tanpa indeks sama sekali, dan penambahan anggota baru di kemudian hari tidak mengubah cara penelusurannya.

vb DaftarPiket.vb
Module DaftarPiket
    Sub Main()
        Dim jadwalPiket As New List(Of String) From {"Ali", "Budi", "Citra", "Dewi"}

        For Each nama As String In jadwalPiket
            Console.WriteLine($"Piket: {nama}")
        Next
    End Sub
End Module
text Keluaran
Piket: Ali
Piket: Budi
Piket: Citra
Piket: Dewi

Perulangan While dan Do#

While..End While dan Do..Loop mengulang badan selama sebuah kondisi bernilai True, dan jumlah pengulangannya tidak diketahui sejak awal. While selalu memeriksa kondisi sebelum badan dijalankan, sehingga kondisi yang sudah False sejak awal membuat badan tidak dijalankan sama sekali. Do While..Loop memiliki perilaku yang sama persis, sedangkan Do Until..Loop mengulang badan sampai kondisi menjadi True, yaitu kebalikan dari While.

Keluarga Do menyediakan posisi pemeriksaan kedua, yaitu pada Loop di akhir badan. Bentuk Do..Loop While dan Do..Loop Until menjalankan badan lebih dahulu, kemudian memeriksa kondisi, sehingga badan dijamin berjalan minimal satu kali meskipun kondisinya sudah tidak terpenuhi. Tabel berikut merangkum keempat bentuk Do.

BentukPosisi kondisiBadan dijalankan minimal
Do While..Loopawal badantidak berjalan bila kondisi False sejak awal
Do Until..Loopawal badantidak berjalan bila kondisi True sejak awal
Do..Loop Whileakhir badansatu kali
Do..Loop Untilakhir badansatu kali

Program berikut menjalankan keempat bentuk perulangan bergantung kondisi dengan angka yang mudah dihitung ulang. Dua perulangan pertama menghitung mundur dari 3 dan menghasilkan keluaran yang identik, sehingga kesejajaran While..End While dan Do While..Loop terlihat jelas. Perulangan ketiga menggandakan nilai 3 sampai melewati 100, sedangkan perulangan keempat menunjukkan badan yang dijalankan sekali meskipun kondisinya sudah False sejak awal.

vb BentukDo.vb
Module BentukDo
    Sub Main()
        Console.WriteLine("While..End While:")
        Dim mundur As Integer = 3
        While mundur >= 1
            Console.WriteLine(mundur)
            mundur -= 1
        End While

        Console.WriteLine("Do While..Loop:")
        mundur = 3
        Do While mundur >= 1
            Console.WriteLine(mundur)
            mundur -= 1
        Loop

        Console.WriteLine("Do Until..Loop:")
        Dim ganda As Integer = 3
        Do Until ganda > 100
            Console.WriteLine(ganda)
            ganda *= 2
        Loop

        Console.WriteLine("Do..Loop While:")
        Dim percobaan As Integer = 5
        Do
            Console.WriteLine($"percobaan ke-{percobaan}")
            percobaan += 1
        Loop While percobaan <= 3
    End Sub
End Module
text Keluaran
While..End While:
3
2
1
Do While..Loop:
3
2
1
Do Until..Loop:
3
6
12
24
48
96
Do..Loop While:
percobaan ke-5

Memilih bentuk perulangan#

Pilihan bentuk perulangan mengikuti sifat masalahnya. Jumlah iterasi yang diketahui sejak awal menunjuk ke For..Next, sedangkan penelusuran seluruh isi array atau koleksi menunjuk ke For Each..Next. Pengulangan yang bergantung pada kejadian di luar program, seperti menunggu sebuah nilai tercapai, cocok untuk While..End While atau Do..Loop. Apabila badan harus dijalankan minimal sekali, gunakan bentuk dengan kondisi pada Loop.

Tabel berikut memeringkas seluruh bentuk beserta situasi yang paling cocok untuk masing-masing.

SituasiBentuk yang tepat
Jumlah iterasi diketahui sejak awalFor..Next
Menelusuri seluruh elemen array atau koleksiFor Each..Next
Mengulang selama kondisi bernilai TrueWhile..End While atau Do While..Loop
Mengulang sampai sebuah kondisi terpenuhiDo Until..Loop
Badan wajib dijalankan minimal satu kaliDo..Loop While atau Do..Loop Until

Dua bentuk terakhir pada tabel berbeda hanya dalam arah logikanya. Do While menegaskan syarat untuk melanjutkan, sedangkan Do Until menegaskan syarat untuk berhenti. Memilih bentuk yang sesuai dengan cara masalah diformulasikan membuat kondisi perulangan mudah dibaca.

Kesalahan umum#

Kesalahan pada perulangan biasanya menyangkut batas iterasi dan kondisi yang tidak bergerak menuju berhenti. Ketiganya di bawah ini disertai penyebab dan perbaikannya.

Nilai akhir To yang dianggap eksklusif#

Pembaca yang terbiasa dengan perulangan gaya C kadang menganggap To bersifat eksklusif seperti i < 10, padahal nilai akhir ikut digunakan. Kelalaian ini muncul saat perulangan digunakan untuk mengindeks array. Array dengan enam elemen memiliki indeks 0 sampai 5, sehingga For i As Integer = 0 To 6 mencoba mengakses indeks 6 yang tidak ada dan memicu IndexOutOfRangeException. Bentuk yang aman adalah For i As Integer = 0 To nilaiUjian.Length - 1, atau menggunakan For Each apabila indeks tidak diperlukan.

Batas atas yang dievaluasi sekali#

Nilai awal, nilai akhir, dan langkah For..Next dihitung satu kali ketika perulangan dimulai. Program berikut mengubah variabel batas di dalam badan, tetapi jumlah iterasinya tetap tiga.

vb BatasPerulangan.vb
Module BatasPerulangan
    Sub Main()
        Dim batas As Integer = 3

        For i As Integer = 1 To batas
            batas = 10
            Console.WriteLine($"iterasi {i}, batas sekarang {batas}")
        Next
    End Sub
End Module
text Keluaran
iterasi 1, batas sekarang 10
iterasi 2, batas sekarang 10
iterasi 3, batas sekarang 10

Perulangan tetap berhenti pada iterasi ketiga karena nilai akhir sudah terkunci saat For dijalankan. Apabila jumlah iterasi harus mengikuti perubahan data, gunakan While atau Do yang memeriksa kondisinya pada setiap iterasi.

Langkah nol dan kondisi yang tidak berubah#

Step 0 pada For..Next membuat penghitung tidak pernah maju, sehingga perulangan berjalan tanpa henti. Pada While dan Do, kondisi yang merujuk variabel yang tidak pernah diperbarui di dalam badan menimbulkan masalah yang sama. Saat menulis perulangan, periksa adanya pernyataan yang menggerakkan kondisi menuju berhenti, dan gunakan Exit sebagai pengaman bila perhentian bergantung pada kejadian di luar program.

Ringkasan#

  • For..Next mengulang dengan jumlah yang diketahui, nilai akhir To bersifat inklusif, dan Step mengatur kenaikan maupun penurunan penghitung.
  • For Each..Next menelusuri array dan koleksi tanpa indeks, sedangkan Exit dan Continue mengatur berhenti lebih awal serta melewati iterasi.
  • While..End While dan Do While..Loop memeriksa kondisi di awal, Do Until membalik logikanya, dan bentuk dengan kondisi pada Loop menjamin badan berjalan minimal satu kali.
  • Pilihan bentuk mengikuti masalah, yaitu jumlah iterasi yang diketahui, penelusuran koleksi, atau pengulangan bergantung kondisi.

Referensi#