Fungsi ringkas pada chapter sebelumnya sudah mengenal input opsional: tanpa faktorSkala, fungsi memakai default 1. Kebutuhan di dunia nyata lebih kaya lagi — diskon default 10% yang kadang diubah pemanggil, batas harga yang jarang dipakai, gaya sapaan yang hampir selalu default. Ada dua generasi solusi di MATLAB: pola nargin klasik yang bekerja di semua versi (dan bisa kita uji), serta arguments block modern sejak R2019b yang mendeklarasikan default, tipe, dan validasi sekaligus. Chapter ini membahas keduanya. Cakupannya:
- pola
narginklasik dengan nilai default, termasuk trik[] argumentsblock untuk argumen opsional (MATLAB R2019b+)- name-value pairs sederhana lewat
arguments
Pola nargin Klasik: Default untuk Argumen yang Kosong #
Aturannya: setiap argumen opsional diawasi if nargin < k — bila pemanggil tidak mengirim argumen ke-k, fungsi mengisinya dengan nilai default. Mekanisme di balik layar: argumen yang tidak dikirim membuat parameter itu tidak terisi sama sekali (bukan nol atau kosong), sehingga pengecekan nargin harus dilakukan sebelum parameter dipakai. Berkas diskon.m menerapkan dua argumen opsional berurutan:
function hargaAkhir = diskon(harga, persenDiskon, hargaBatas)
% diskon Menghitung harga akhir setelah diskon dengan argumen opsional.
% hargaAkhir = diskon(harga) memakai diskon default 10 persen.
% hargaAkhir = diskon(harga, persenDiskon) memakai diskon sesuai
% persenDiskon; kirim [] untuk tetap memakai default.
% hargaAkhir = diskon(harga, persenDiskon, hargaBatas) membatasi
% harga akhir agar tidak turun di bawah hargaBatas.
% pola nargin klasik: isi argumen yang tidak dikirim dengan nilai default
if nargin < 2 || isempty(persenDiskon)
persenDiskon = 10; % diskon default 10 persen
end
if nargin < 3
hargaBatas = 0; % tanpa batas bawah
end
hargaAkhir = harga - (harga * persenDiskon / 100);
if hargaAkhir < hargaBatas
hargaAkhir = hargaBatas;
end
endMari kita bedah baris-baris kode di atas:
- Baris 10 (
if nargin < 2 || isempty(persenDiskon)): dua kondisi digabung — argumen kedua tidak dikirim, atau dikirim sebagai[]; keduanya bermuara ke default10. - Baris 13 (
if nargin < 3): argumen ketiga opsional dengan default0, artinya tanpa batas bawah harga. - Baris 17 (
hargaAkhir = harga - ...): perhitungan inti berjalan setelah semua parameter dijamin terisi. - Baris 19-21 (
if hargaAkhir < hargaBatas): batas bawah dipakai hanya bila hasil diskon jatuh di bawahnya.
Skrip uji uji_diskon.m memanggil keempat variasi:
% tanpa argumen opsional: diskon default 10 persen
h1 = diskon(200000);
fprintf('diskon(200000) : %d\n', h1);
% satu argumen opsional: diskon 25 persen
h2 = diskon(200000, 25);
fprintf('diskon(200000, 25) : %d\n', h2);
% dua argumen opsional: batas bawah harga akhir
h3 = diskon(200000, 25, 160000);
fprintf('diskon(200000, 25, 160000) : %d\n', h3);
% kirim [] untuk memakai nilai default argumen kedua
h4 = diskon(200000, []);
fprintf('diskon(200000, []) : %d\n', h4);Output yang Dihasilkan:
diskon(200000) : 180000
diskon(200000, 25) : 150000
diskon(200000, 25, 160000) : 160000
diskon(200000, []) : 180000Baris ketiga menunjukkan batas bekerja: diskon 25% dari 200000 seharusnya 150000, tetapi hargaBatas 160000 menahan hasilnya.
arguments Block: Default dan Validasi Deklaratif (R2019b+) #
Sejak R2019b, MATLAB menyediakan arguments block — blok deklarasi khusus di awal fungsi yang menampung ukuran, tipe, validasi, dan default tiap argumen. Versi diskon yang sama dalam gaya modern:
function hargaAkhir = diskon(harga, persenDiskon, hargaBatas)
% diskon Versi arguments block (MATLAB R2019b+).
arguments
harga (1,1) double {mustBeNonnegative}
persenDiskon (1,1) double {mustBeNonnegative, ...
mustBeLessThanOrEqual(persenDiskon, 100)} = 10
hargaBatas (1,1) double {mustBeNonnegative} = 0
end
hargaAkhir = harga - (harga * persenDiskon / 100);
if hargaAkhir < hargaBatas
hargaAkhir = hargaBatas;
end
endMari kita bedah sintaksisnya:
- (
arguments ... end): blok ditulis sebelum baris executable pertama; MATLAB memperlakukannya sebagai deklarasi, bukan perintah. - (
harga (1,1) double {mustBeNonnegative}): argumen harus skalar 1×1 bertipedouble(atau jenis yang bisa dikonversi) dan lolos validatormustBeNonnegative. - (
persenDiskon ... = 10): kehadiran nilai default otomatis menjadikan argumen opsional — tidak perluif narginsama sekali. - (
mustBeLessThanOrEqual(persenDiskon, 100)): validator berparameter boleh menyebut nama argumennya sendiri untuk membandingkan nilai.
Bila validasi gagal, MATLAB menghentikan program dengan pesan yang menyebut posisi dan aturan yang dilanggar, contohnya Error using diskon / Invalid argument at position 1. Value must be nonnegative. — fungsi error() manual tidak lagi diperlukan.
Name-Value Pairs Sederhana dengan arguments #
Argumen posisional berhenti nyaman begitu opsinya banyak — yang mana yang ke-5? Solusinya name-value pairs: pemanggil menyebut nama opsi lalu nilainya. Dalam arguments block, opsi demikian dideklarasikan sebagai field dari satu parameter struct:
function sapa(nama, opsi)
% sapa Menyapa dengan gaya opsional — name-value (MATLAB R2019b+).
arguments
nama (1,1) char
opsi.Gaya (1,1) char = 'santai'
end
if strcmp(opsi.Gaya, 'formal')
fprintf('Selamat datang, Bapak/Ibu %s.\n', nama);
else
fprintf('Halo, %s!\n', nama);
end
endPemanggilan yang sah, termasuk dua gaya penulisan nama:
sapa('Budi') % semua opsi default
sapa('Siti', 'Gaya', 'formal') % pasangan nama-nilai (R2019b+)
sapa('Siti', Gaya='formal') % sintaks = yang lebih ringkas (R2021a+)Sebelum R2021a, pasangan nama-nilai ditulis sebagai teks dan koma; sejak R2021a kedua gaya sah. Mengurai pasangan 'Gaya', 'formal' secara manual tanpa arguments kita bahas tuntas di Chapter Variable Number of Arguments.
nargin vs arguments #
| Aspek | Pola nargin | arguments block |
|---|---|---|
| Tersedia sejak | semua versi MATLAB & Octave | R2019b (MATLAB saja) |
| Nilai default | if nargin < k manual | = nilaiDefault di deklarasi |
| Validasi tipe/ukuran | if + error() manual | (dimensi) kelas {validator} |
| Name-value | parsing manual (ch. berikutnya) | opsi.Nama bawaan |
| Pesan galat | kita rumuskan sendiri | otomatis, seragam |
Keduanya boleh hidup berdampingan: banyak kode produksi memakai arguments untuk API baru sambil mempertahankan nargin untuk kompatibilitas.
Ringkasan #
Argumen opsional bergantung pada dua mekanisme. Pola klasik if nargin < k mengisi parameter yang tidak dikirim dengan nilai default dan berlaku di MATLAB semua versi maupun Octave — tambahkan || isempty(...) agar [] juga berarti default. arguments block (R2019b+, MATLAB-ONLY) mendeklarasikan ukuran, kelas, validator, dan default dalam satu blok, menghasilkan pesan galat otomatis, serta mendukung name-value pairs lewat field opsi.Nama. Pilih arguments untuk kode MATLAB modern; pilih nargin bila kompatibilitas lintas lingkungan penting. Berkas diskon.m dan uji_diskon.m di bagian bawah halaman memuat versi yang teruji.