Percabangan if

Mengarahkan alur program dengan if, elseif, else serta operator logika && dan ||.

Daftar isi

Percabangan if mengarahkan program memilih salah satu jalur eksekusi berdasarkan kondisi yang bernilai benar atau salah. Topik ini membahas struktur if, elseif, dan else, kemudian operator perbandingan beserta hasil logikanya. Operator logika && dan || dibahas bersama perilaku hubung singkat, serta syarat bahwa kondisi harus berupa satu nilai skalar. Setelah menguasai materi ini, program dapat menggolongkan data, memeriksa validitas indeks sebelum array disentuh, dan menggabungkan beberapa pemeriksaan menjadi satu keputusan.

Struktur if, elseif, else#

Pernyataan if mengevaluasi satu kondisi lalu menjalankan sekelompok pernyataan hanya bila kondisi itu bernilai benar. Bentuk lengkapnya memuat cabang elseif untuk kondisi lanjutan, cabang else sebagai penampung sisa kasus, dan kata kunci end yang menutup seluruh struktur. Pemeriksaan berlangsung dari atas ke bawah. Kondisi pertama yang bernilai benar menentukan cabang yang dijalankan, sedangkan kondisi sesudahnya tidak diperiksa lagi. Bila tidak ada kondisi yang bernilai benar, else yang dieksekusi, sehingga paling banyak satu cabang berjalan untuk satu kali evaluasi.

Contoh berikut menggolongkan satu nilai ujian ke dalam empat kategori. Nilai 78 membuat kondisi pertama gagal dan kondisi kedua terpenuhi, sehingga dua cabang sisanya dilewati tanpa diperiksa.

matlab kategori_nilai.m
% kategori_nilai.m: menggolongkan satu nilai ujian ke dalam empat kategori

nilai = 78;
if nilai >= 90
  kategori = 'sangat baik';
elseif nilai >= 70
  kategori = 'baik';
elseif nilai >= 55
  kategori = 'cukup';
else
  kategori = 'perlu belajar lagi';
end
fprintf('nilai %d masuk kategori %s\n', nilai, kategori);
text Keluaran
nilai 78 masuk kategori baik

Berkas ini dijalankan dari terminal dengan perintah berikut, dan keluarannya sama dengan hasil tombol Run pada editor karena urutan pernyataannya tidak berubah. Pengalihan aliran kesalahan membuang peringatan konfigurasi grafik pada lingkungan verifikasi sehingga hanya laporan yang tampil.

bash
# jalankan skrip dari terminal
octave --quiet kategori_nilai.m 2>/dev/null
text Keluaran
nilai 78 masuk kategori baik

Urutan cabang menentukan hasil karena pemeriksaan berhenti pada kondisi pertama yang bernilai benar. Ambang tersusun dari yang paling tinggi ke yang paling rendah sehingga setiap cabang menampung rentangnya sendiri. Pertukaran urutan mengubah hasil penggolongan tanpa mengubah satu pun ambangnya.

Operator perbandingan menghasilkan nilai logika#

Kondisi dibangun dari operator perbandingan yang membandingkan dua nilai dan menghasilkan nilai logika, yakni 1 untuk benar dan 0 untuk salah. MATLAB menyediakan enam operator berikut.

OperatorMakna
a == bsama dengan
a ~= btidak sama dengan
a < bkurang dari
a <= bkurang dari atau sama dengan
a > blebih dari
a >= blebih dari atau sama dengan

Operator ketaksamaan ditulis ~=, bukan != seperti pada banyak bahasa pemrograman lain, sehingga kebiasaan dari bahasa lain perlu disesuaikan. Pada array, perbandingan bekerja per elemen dan menghasilkan array logika dengan bentuk yang sama dengan operannya. Perbandingan berikut memeriksa vektor catatan suhu terhadap dua ambang yang berbeda.

matlab Perbandingan pada vektor menghasilkan vektor logika
suhu = [21 24 19 27];
suhu >= 25
suhu == 24
text Keluaran
ans =

  0  0  0  1

ans =

  0  1  0  0

Hasil pertama menandakan hanya elemen keempat yang mencapai 25 ke atas, sedangkan hasil kedua menandakan hanya elemen kedua yang tepat bernilai 24. Kedua hasil berupa vektor logika, bukan satu nilai. Sifat inilah yang membuat hasil perbandingan perlu direduksi menjadi satu nilai sebelum dipakai sebagai kondisi if. Pembahasan reduksi tersebut menutup topik ini.

Operator logika && dan || dengan hubung singkat#

Operator && menyatakan bahwa dua kondisi harus benar sekaligus, operator || menyatakan bahwa salah satu sudah cukup, dan operator ~ membalik nilai kebenaran sebuah kondisi. Operator penghubung && dan || bekerja dengan hubung singkat (short-circuit), yakni operand kedua hanya dievaluasi bila hasil keseluruhan masih mungkin berubah. Pada &&, operand kedua dievaluasi hanya bila operand pertama bernilai benar, sedangkan pada || hanya bila operand pertama bernilai salah. Karena perilaku ini, pemeriksaan yang berisiko error aman bila diletakkan sebagai operand kedua.

Contoh berikut memeriksa tiga syarat sebelum menyentuh elemen array, dan indeks 5 sengaja dipilih di luar array berisi tiga elemen.

matlab Hubung singkat menjaga pengaksesan indeks
data = [10 20 30];
i = 5;
if i >= 1 && i <= numel(data) && data(i) > 15
  fprintf('data(%d) bernilai %d\n', i, data(i));
else
  fprintf('indeks %d tidak valid, data tidak disentuh\n', i);
end
text Keluaran
indeks 5 tidak valid, data tidak disentuh

Pemeriksaan i <= numel(data) bernilai salah sehingga hasil gabungan sudah pasti salah dan operand data(i) > 15 tidak pernah dievaluasi. Tanpa hubung singkat, pengaksesan data(5) menghentikan program dengan error indeks. Bila ketiga pemeriksaan itu digabung dengan operator & yang mengevaluasi seluruh operandnya, pengaksesan di luar jangkauan tetap terjadi meskipun hasil akhirnya salah.

Operator & dan | bekerja per elemen#

Operator & dan | memproses array logika secara per elemen (element-wise): elemen yang sejajar dioperasikan satu sama lain dan hasilnya berupa array dengan bentuk yang sama. Operator ~ juga membalik tiap elemen satu per satu, bukan keseluruhan array. Ketiganya tepat dipakai untuk menandai atau menyaring data array, dan bedanya dengan && serta || terletak pada syarat bentuk operand.

matlab Operator & dan | pada array logika
a = [true false true];
b = [true true false];
a & b
a | b
~a
text Keluaran
ans =

  1  0  0

ans =

  1  1  1

ans =

  0  1  0

Hasil a & b bernilai benar hanya pada posisi yang benar di kedua operand, sedangkan a | b bernilai benar bila salah satunya benar pada posisi itu. Operator & dan && tampak serupa tetapi tidak saling menggantikan karena syarat bentuk operandnya berbeda. Pemakaian yang melanggar syarat itu langsung memicu error pada MATLAB.

Blok berikut memperlihatkan kasus tersebut. Pesan error MATLAB dikutip sebagai komentar karena contoh pada jalur ini diverifikasi dengan Octave yang berperilaku berbeda.

matlab
% tidak-dijalankan
% Operand && harus skalar. MATLAB menghentikan eksekusi dengan pesan:
% Operands to the || and && operators must be convertible to logical scalar values.
a = [1 2];
if a > 0 && a < 10
  disp('seluruh elemen berada di antara 0 dan 10');
end

GNU Octave menerima operand array pada && dan memperlakukannya seperti all(a > 0) && all(a < 10). Hasil pada Octave tidak mewakili perilaku MATLAB, sehingga blok di atas tidak diberi blok Keluaran. Bentuk yang berjalan di kedua implementasi mereduksi array menjadi skalar lebih dahulu dengan fungsi all.

matlab Reduksi eksplisit dengan all pada tiap operand
a = [1 2];
if all(a > 0) && all(a < 10)
  disp('seluruh elemen berada di antara 0 dan 10');
end
text Keluaran
seluruh elemen berada di antara 0 dan 10

Kondisi if harus berupa skalar#

Keputusan percabangan hanya memiliki dua arah sehingga kondisi if harus berupa satu nilai logika skalar. Perbandingan pada array menghasilkan array logika, dan bentuk itu tidak langsung layak menjadi kondisi. MATLAB menolak kondisi berupa array dan menghentikan program. Reduksi menjadi skalar dilakukan secara eksplisit dengan dua fungsi bawaan. Fungsi any menghasilkan benar bila ada elemen yang bernilai benar, sedangkan fungsi all menghasilkan benar bila seluruh elemen bernilai benar.

Blok berikut memperlihatkan bentuk yang ditolak MATLAB.

matlab
% tidak-dijalankan
% Kondisi berupa vektor logika ditolak MATLAB dengan error.
nilai = [78 85 90];
if nilai > 80
  disp('ada nilai di atas 80');
end

GNU Octave yang dipakai untuk memverifikasi contoh pada jalur ini masih menerima kondisi tak-skalar dan menjalankannya seolah ditulis all(nilai > 80). Semantik itu adalah perilaku MATLAB versi lama yang dipertahankan Octave, dan blok di atas karenanya tidak membawa blok Keluaran. Reduksi eksplisit menghilangkan keraguan makna sekaligus membuat kode berjalan di kedua implementasi.

matlab Reduksi vektor logika menjadi satu keputusan
nilai = [78 85 90];
if any(nilai > 80)
  disp('ada nilai di atas 80');
end
if all(nilai > 80)
  disp('seluruh nilai di atas 80');
end
text Keluaran
ada nilai di atas 80

Cabang any berjalan karena 85 dan 90 melewati ambang 80. Cabang all tidak berjalan karena nilai 78 membatalkan keseluruhan, meskipun dua nilai lainnya lolos. Perbedaan makna kedua fungsi itu menentukan hasil program sehingga pilihan di antara keduanya mengikuti maksud keputusan yang ingin diambil.

Kesalahan umum#

  • Tanda sama dengan tunggal pada kondisi. Operator = adalah penugasan sehingga penulisan if nilai = 90 ditolak sebagai error sintaks. Gunakan == untuk perbandingan.
  • Penulisan != untuk ketaksamaan. Bentuk ketaksamaan pada MATLAB adalah ~=. Operator ! tidak dikenal sehingga != langsung dilaporkan sebagai error sintaks.
  • Lupa menutup struktur dengan end. Setiap if membuka blok yang wajib ditutup end. Tanpa end, pernyataan setelahnya ikut menjadi bagian cabang atau penerjemah melaporkan error sintaks.
  • Operand array pada penghubung. Gunakan any atau all untuk mereduksi array menjadi skalar sebelum menggabungkannya lewat && atau || agar kode berjalan di MATLAB maupun Octave.

Ringkasan#

  • Struktur if, elseif, else mengeksekusi paling banyak satu cabang, yakni cabang dengan kondisi pertama yang bernilai benar, dan seluruh struktur ditutup end.
  • Operator perbandingan menghasilkan nilai logika dan bekerja per elemen pada array.
  • Operator && dan || menghubung singkat serta mensyaratkan operand skalar, sedangkan & dan | memproses array per elemen.
  • Kondisi if harus skalar sehingga array logika direduksi dengan any atau all sebelum dipakai sebagai kondisi.

Referensi#