Perulangan menjalankan sekelompok pernyataan berulang kali tanpa menyalin pernyataan itu berkali-kali. Topik ini membahas perulangan for yang mengiterasi rentang bilangan dan kolom array, termasuk rentang berlangkah dengan operator titik dua. Perulangan while yang berjalan selama kondisi bernilai benar dibahas bersama pernyataan break dan continue yang menghentikan atau melompati iterasi lebih awal. Setelah menguasai materi ini, pekerjaan seperti menjumlahkan deret, memproses setiap kolom data, dan menyusutkan nilai bertahap dapat ditulis dalam beberapa baris yang hasilnya dapat diperiksa.
Perulangan for atas rentang#
Pernyataan for menjalankan badan perulangan sekali untuk setiap nilai pada sebuah rentang. Bentuknya for k = 1:5 diikuti badan perulangan lalu end, dan operator titik dua membentuk rentang itu sebagai vektor baris berisi lima bilangan. Variabel perulangan k menerima satu nilai rentang pada tiap iterasi, dimulai dari 1 dan berakhir di 5. Jumlah iterasi ditetapkan sekali sebelum iterasi pertama sehingga panjang rentang menentukan banyaknya pengulangan.
Contoh berikut menjumlahkan deret bilangan asli 1 sampai 5 sambil mencetak kemajuan pada tiap iterasi.
% jumlah_deret.m: menjumlahkan deret bilangan asli 1 sampai 5
total = 0;
for k = 1:5
total = total + k;
fprintf('iterasi %d, total sementara %d\n', k, total);
end
fprintf('total akhir: %d\n', total);iterasi 1, total sementara 1
iterasi 2, total sementara 3
iterasi 3, total sementara 6
iterasi 4, total sementara 10
iterasi 5, total sementara 15
total akhir: 15Penugasan total = total + k membaca nilai total yang lama, menambahkan k, lalu menyimpan hasilnya kembali, sehingga total bertambah satu bilangan pada setiap iterasi. Lima baris kemajuan memperlihatkan pertumbuhan itu dari 1 sampai 15. Setelah end, variabel total dan k tetap hidup di workspace karena skrip berbagi ruang kerja dengan Command Window.
Rentang berlangkah dan rentang kosong#
Rentang a:b berlangkah satu secara bawaan, sedangkan bentuk tiga bagian a:langkah:b menetapkan langkahnya sendiri. Rentang 1:2:9 menghasilkan 1, 3, 5, 7, dan 9 karena nilainya bertambah dua dari bilangan sebelumnya. Langkah negatif menghitung mundur, misalnya 5:-1:1 menghasilkan lima bilangan dari 5 sampai 1. Rentang berhenti pada nilai terakhir yang tidak melewati batas, sehingga 1:2:8 berhenti di 7 karena nilai berikutnya 9 melampaui 8.
for k = 1:2:9
fprintf('kuadrat %d = %d\n', k, k^2);
endkuadrat 1 = 1
kuadrat 3 = 9
kuadrat 5 = 25
kuadrat 7 = 49
kuadrat 9 = 81Keluaran memuat lima baris karena rentang ganjil 1 sampai 9 berisi tepat lima bilangan. Langkah yang besar membuat iterasi lebih sedikit, dan langkah dua pada contoh ini memilih bilangan ganjil saja dari barisan 1 sampai 9. Rentang yang tidak memuat satu pun nilai menghasilkan perulangan yang badannya tidak pernah dijalankan, misalnya 1:0 maupun 10:1. Sifat ini berguna ketika batas rentang dihitung dari data. Kasus tanpa data menghasilkan rentang kosong, sehingga perulangan tidak memerlukan perlakuan khusus.
for mengiterasi kolom array#
Perulangan for juga menerima array langsung sebagai sumber iterasi, dan variabel perulangan menerima satu kolom array pada tiap iterasi. Vektor baris berisi tiga elemen menghasilkan tiga iterasi dengan satu elemen per iterasi, sedangkan matriks berisi dua kolom menghasilkan dua iterasi dengan satu vektor kolom per iterasi. Jumlah iterasi selalu mengikuti jumlah kolom, bukan jumlah elemen.
for x = [10 20 30]
fprintf('x sekarang %d\n', x);
end
M = [1 2; 3 4; 5 6];
for v = M
fprintf('satu kolom M: %d, %d, %d\n', v);
endx sekarang 10
x sekarang 20
x sekarang 30
satu kolom M: 1, 3, 5
satu kolom M: 2, 4, 6Vektor baris [10 20 30] berisi tiga kolom sehingga tiga iterasi berjalan dan x menerima satu bilangan pada tiap iterasi. Matriks M berukuran tiga kali dua sehingga dua iterasi berjalan, dan v menerima seluruh kolom sebagai vektor tiga elemen. Panggilan fprintf mengulang formatnya sampai argumennya habis, sehingga satu kolom tercetak utuh pada satu baris keluaran. Bentuk ini adalah idiom dasar pemrosesan data per kolom pada MATLAB.
Perulangan while berjalan selama kondisi benar#
Perulangan for cocok ketika jumlah pengulangan diketahui lebih dahulu, sedangkan while cocok ketika yang diketahui adalah syarat berhenti. Pernyataan while memeriksa kondisi sebelum setiap iterasi dan menjalankan badan perulangan hanya bila kondisi bernilai benar. Bila kondisi bernilai salah sejak pemeriksaan pertama, badan perulangan tidak pernah dijalankan. Badan perulangan wajib menggerakkan kondisi ke arah salah agar perulangan mencapai akhirnya.
Contoh berikut menyusutkan sebuah nilai dengan pembagian dua berulang sampai turun di bawah ambang.
nilai = 1000;
langkah = 0;
while nilai > 10
nilai = nilai / 2;
langkah = langkah + 1;
end
fprintf('nilai akhir %.2f setelah %d langkah\n', nilai, langkah);nilai akhir 7.81 setelah 7 langkahTujuh pembagian diperlukan karena 1000 dibagi dua tujuh kali menghasilkan 7.8125, dan nilai itu sudah berada di bawah ambang 10. Pencacah langkah ikut diperbarui pada badan yang sama sehingga keluaran melaporkan kedua hasilnya sekaligus. Perulangan ini pasti berhenti karena setiap pembagian memperkecil nilai ke arah kondisi berhenti.
Bahaya while tanpa kemajuan#
Kesalahan yang paling sering terjadi pada while adalah badan perulangan yang tidak mengubah variabel yang dibaca kondisinya. Kondisi bernilai benar selamanya, perulangan tidak pernah mencapai end, dan program tidak lagi merespons. Satu-satunya jalan keluar pada sesi interaktif adalah menghentikan eksekusi manual dengan Ctrl+C, lalu memperbaiki badan perulangan sebelum menjalankan ulang.
Blok berikut adalah versi yang salah dari contoh pembagian pada bagian sebelumnya. Baris pembagiannya hilang sehingga nilai tetap 1000 dan kondisi tidak pernah berubah.
% tidak-dijalankan
% Baris pembagian hilang sehingga nilai tidak pernah berubah.
% Kondisi bernilai benar selamanya dan program harus dihentikan dengan Ctrl+C.
nilai = 1000;
langkah = 0;
while nilai > 10
langkah = langkah + 1;
endKontras dengan versi yang benar memperlihatkan pola umumnya: setiap badan while memuat paling tidak satu pernyataan yang menggerakkan kondisi. Pemeriksaan ulang setelah menulis while sepatutnya membaca kondisinya lalu mencari pernyataan di badan yang mengubah variabel pada kondisi itu.
break dan continue#
Pernyataan break menghentikan seluruh perulangan lebih awal dan melanjutkan eksekusi pada pernyataan setelah end. Pernyataan continue menghentikan iterasi yang sedang berjalan lalu melompat ke iterasi berikutnya tanpa menjalankan sisa badan. Keduanya mengubah titik berhenti tanpa mengubah kondisi maupun rentang perulangannya.
Contoh berikut mencari nilai pertama yang melewati ambang 25. Pemeriksaan berjalan dari elemen ke elemen dan pencarian berhenti begitu nilai itu ditemukan.
data = [12 7 30 9 41];
for x = data
if x > 25
fprintf('nilai %d melewati 25, pencarian berhenti\n', x);
break;
end
fprintf('memeriksa %d\n', x);
endmemeriksa 12
memeriksa 7
nilai 30 melewati 25, pencarian berhentiElemen 30 memenuhi cabang if pada iterasi ketiga sehingga break berjalan dan dua elemen terakhir tidak pernah diperiksa. Tanpa break, keluaran akan memuat pemeriksaan untuk kelima elemen, termasuk 41 yang juga melewati ambang.
Pernyataan continue pada contoh berikut melewatkan bilangan ganjil sehingga hanya bilangan genap yang dicetak.
for k = 1:6
if mod(k, 2) == 1
continue;
end
fprintf('%d genap\n', k);
end2 genap
4 genap
6 genapIterasi ganjil berhenti di continue sebelum mencapai fprintf, sedangkan iterasi genap menjalankan seluruh badan. Perulangan tetap menyelesaikan keenam iterasinya, berbeda dari break yang memotongnya di tengah. Perulangan penuh atas array dengan badan sesederhana contoh-contoh di atas sering dapat digantikan oleh operasi tervektorisasi yang menghitung seluruh elemen sekaligus, misalnya menjumlahkan rentang tanpa perulangan sama sekali. Materi vektorisasi dibahas pada modul tersendiri di jalur ini.
Kesalahan umum#
- While tanpa kemajuan. Badan yang tidak mengubah variabel kondisi membuat perulangan berjalan tanpa henti. Pastikan paling tidak satu pernyataan di badan menggerakkan kondisi ke arah salah.
- Mengubah variabel perulangan di dalam badan for. Rentang ditetapkan sekali sebelum iterasi pertama sehingga penugasan baru pada k tidak menambah ataupun mengurangi jumlah iterasi. Nilai k selalu ditimpa dengan nilai rentang berikutnya pada awal iterasi.
- Mengira batas rentang ikut diiterasi. Rentang 1:2:8 berhenti di 7 karena 9 melampaui batas. Periksa isi rentang dengan mencetaknya lebih dahulu bila ragu.
- Lupa end penutup. Badan for dan while ditutup end seperti blok if. Kelalaian ini melaporkan error sintaks sebelum program berjalan.
Ringkasan#
- for mengiterasi rentang
a:langkah:bdan kolom-kolom array, dengan jumlah iterasi yang ditetapkan sebelum iterasi pertama. - Rentang kosong menghasilkan nol iterasi, dan langkah negatif menghitung mundur.
- while berjalan selama kondisi bernilai benar dan menghendaki badan yang menggerakkan kondisi ke arah salah.
- break menghentikan seluruh perulangan lebih awal, sedangkan continue melompat ke iterasi berikutnya.
Referensi#
- for — MathWorks — Rujukan resmi perulangan for beserta semantik iterasi per kolom.
- while — MathWorks — Rujukan resmi perulangan while beserta syarat kondisinya.
- break — MathWorks — Rujukan resmi pernyataan break untuk menghentikan perulangan lebih awal.
- continue — MathWorks — Rujukan resmi pernyataan continue untuk melompati iterasi.