Program latih sejauh ini berjalan dari atas ke bawah, mencetak hasil, lalu berhenti. Kalkulator matriks bekerja secara berbeda: program harus tetap hidup, menampilkan menu, membaca matriks yang diketik pengguna, dan mengulang semuanya sampai pengguna memilih keluar. Pada bagian ini kita menetapkan keputusan desain yang paling mahal diubah belakangan — bentuk input, struktur berkas, dan cara program diuji — lalu membangun kerangka yang sudah bisa dijalankan.
Yang kita bangun pada bagian ini:
- kebutuhan dan fitur program yang jelas batasnya,
- keputusan desain: berkas fungsi, parser manual, dan mode demo,
- struktur proyek beserta diagram arsitektur alur data,
- kerangka
kalkulator.m: menu, dispatch, pembacaan pilihan, dan keluar.
Kebutuhan dan Fitur #
Kalkulator ini ditujukan untuk pembelajar yang ingin memeriksa hitungan matriks dengan cepat. Dari kebutuhan itu kita turunkan fitur yang dibangun dan batas yang sengaja tidak dibangun:
| Aspek | Keputusan |
|---|---|
| Operasi | tambah, kurang, kali (dua matriks); transpose, determinan (satu matriks) |
| Bentuk input | satu baris teks per matriks, contoh 1 2; 3 4 |
| Ukuran maksimum | 10 baris x 10 kolom — cukup untuk belajar, murah untuk divalidasi |
| Penyimpanan | tidak ada; program tidak menyimpan riwayat antar operasi |
| Antarmuka | teks murni di Command Window, tanpa GUI |
Batas seperti “tanpa penyimpanan” bukan kemunduran. Proyek yang cakupannya kecil selesai dan teruji jauh lebih bernilai daripada proyek besar yang setengah jalan — daftar pengembangan lanjutan kita bahas pada Bagian 4.
Keputusan Desain Utama #
Empat keputusan berikut membentuk seluruh kode proyek. Semua diambil sebelum satu baris logika ditulis.
Pertama, program utama berupa berkas fungsi, bukan script. kalkulator.m didefinisikan sebagai function kalkulator(mode). Dengan bentuk ini program bisa menerima argumen: kalkulator berjalan interaktif, kalkulator('demo') berjalan dengan data tetap. Deteksi interaktivitas otomatis tidak kita pakai — Octave 10 tidak menyediakan isinteractive, dan dokumentasi MATLAB R2026b juga tidak memuat fungsi serupa — sedangkan argumen eksplisit bekerja sama di kedua mesin.
Kedua, program interaktif harus bisa diuji otomatis sejak hari pertama. Loop yang membaca input() tidak bisa diuji batch — runner Octave tidak punya keyboard. Karena itu setiap jalur baca input punya sepasang cabang: cabang demo memakai data tetap dan mencetaknya agar keluaran terbaca seperti sesi sungguhan, cabang interaktif memakai input(). Seluruh logika sesudahnya — validasi, operasi, pencetakan — berdiri di atas jalur yang sama sehingga mode demo sungguh menguji program, bukan menirunya.
Ketiga, teks pengguna tidak pernah dieksekusi. Cara cepat menerjemahkan '1 2; 3 4' menjadi matriks adalah eval atau str2num. Kita menolak keduanya dan menulis parser manual.
Keempat, satu tanggung jawab = satu berkas. Setiap operasi (tambahMatriks, kaliMatriks, …) dan setiap util (parserMatriks, tampilkanMatriks, …) berdiri sebagai berkas fungsi sendiri di src/, sehingga bisa dipanggil dari program utama maupun dari test tanpa saling menempel.
Diagram Arsitektur #
Alur satu putaran menu dirangkai dari fungsi-fungsi kecil di src/. Setiap kotak operasi memvalidasi dimensinya sendiri dan melempar error bila tidak layak; galat apa pun ditangkap loop utama lalu program kembali ke menu:
Data mengalir dalam tiga jenis — teks, matriks, dan skalar — sepanjang alur itu. Tabel berikut merangkum transformasi yang menjadi tanggung jawab tiap tahap:
| Tahap | Tipe data | Contoh |
|---|---|---|
| Ketikan pengguna | char | '1 2; 3 4' |
Hasil parserMatriks | matriks double | [1 2; 3 4] |
| Hasil fungsi operasi | matriks double | [6 8; 10 12] |
| Hasil determinan | skalar double | 10 |
| Pesan galat | char | 'Ukuran tidak kompatibel: ...' |
Kerangka Program #
Kerangka tahap ini sudah berupa berkas fungsi lengkap dengan menu dan dispatch, tetapi lima operasi masih berupa pesan placeholder. Simpan isi berikut sebagai src/kalkulator.m:
function kalkulator(mode)
% KALKULATOR Kerangka kalkulator matriks (tahap perancangan).
% kalkulator : mode interaktif
% kalkulator('demo') : mode demo dengan urutan pilihan tetap
if nargin < 1 || isempty(mode)
mode = 'interaktif';
end
demo = strcmp(mode, 'demo');
% Mode demo memakai urutan pilihan tetap agar bisa diuji otomatis.
urutanDemo = [1 9 0];
langkah = 1;
selesai = false;
while ~selesai
tampilkanMenu();
if demo
pilihan = urutanDemo(langkah);
fprintf('Pilihan: %d\n', pilihan);
langkah = langkah + 1;
else
pilihan = str2double(input('Pilihan: ', 's'));
if isnan(pilihan)
pilihan = -1; % teks tak dikenal pasti jatuh ke otherwise
end
end
switch pilihan
case {1 2 3 4 5}
fprintf('Operasi matriks dibangun pada Bagian 2.\n');
case 0
selesai = true;
fprintf('Terima kasih. Program selesai.\n');
otherwise
fprintf('Pilihan tidak dikenal. Masukkan angka 0 sampai 5.\n');
end
end
end
function tampilkanMenu()
% TAMPILKANMENU Mencetak menu utama kalkulator.
fprintf('=== Kalkulator Matriks ===\n');
fprintf('1. Tambah matriks\n');
fprintf('2. Kurang matriks\n');
fprintf('3. Kali matriks\n');
fprintf('4. Transpose\n');
fprintf('5. Determinan\n');
fprintf('0. Keluar\n');
endMari kita bedah baris-baris kode di atas:
- Baris 5-7 (
if nargin < 1 || isempty(mode)): pemanggilan tanpa argumen (kalkulator) memberinarginbernilai 0, sehinggamodediisi'interaktif'. Dengan begitukalkulatordankalkulator('interaktif')berperilaku sama. - Baris 8 (
demo = strcmp(mode, 'demo');): satu baris inilah sakelar mode demo.strcmpmenghasilkanlogicalyang dipakai cabang-cabang berikutnya. - Baris 11-12 (
urutanDemo = [1 9 0];): mode demo memutar urutan pilihan tetap — coba operasi, ketik pilihan tak dikenal, lalu keluar.langkahadalah penunjuk posisi urutan yang sedang berjalan. - Baris 15 (
while ~selesai): menu loop. Loop berjalan selamaselesaibernilaifalse; hanya cabang keluar yang menggantinya menjaditrue. - Baris 17-20 (
if demo ... langkah = langkah + 1;): cabang demo mengambil pilihan berikutnya lalu mencetaknya denganfprintf('Pilihan: %d\n', ...)— gema ini membuat transkrip demo terbaca persis seperti sesi interaktif. - Baris 22-25 (
pilihan = str2double(input('Pilihan: ', 's'));): pilihan dibaca sebagai teks (inputdengan argumen's'), lalu diubahstr2double. Teks yang bukan angka menjadiNaN, diganti-1agar jatuh keotherwise— program tidak pernah crash karena salah ketik. - Baris 27-35 (
switch pilihan): dispatch.case {1 2 3 4 5}mencocokkan semua angka operasi sekaligus,case 0mengakhiri program, danotherwisemenampung sisanya. - Baris 39-48 (
function tampilkanMenu()): subfunction pencetak menu. Ia didefinisikan setelah fungsi utama ditutupend— posisi standar subfunction di berkas fungsi, dan aman di MATLAB maupun Octave.
Menjalankan Kerangka #
Uji kerangka lewat mode demo. Panggil kalkulator('demo') dari Command Window pada folder src/, atau lewat berkas driver kecil berisi satu baris kalkulator('demo');:
% driver sementara: jalankan dari folder src/
kalkulator('demo');Output yang Dihasilkan:
=== Kalkulator Matriks ===
1. Tambah matriks
2. Kurang matriks
3. Kali matriks
4. Transpose
5. Determinan
0. Keluar
Pilihan: 1
Operasi matriks dibangun pada Bagian 2.
=== Kalkulator Matriks ===
1. Tambah matriks
2. Kurang matriks
3. Kali matriks
4. Transpose
5. Determinan
0. Keluar
Pilihan: 9
Pilihan tidak dikenal. Masukkan angka 0 sampai 5.
=== Kalkulator Matriks ===
1. Tambah matriks
2. Kurang matriks
3. Kali matriks
4. Transpose
5. Determinan
0. Keluar
Pilihan: 0
Terima kasih. Program selesai.Kerangka terbukti hidup: menu tercetak tiap putaran, pilihan tak dikenal ditolak tanpa menghentikan program, dan pilihan 0 menutupnya dengan rapi.
Kerangka kini berdiri dan uji otomatisnya bekerja. Bagian 2 mengisi lima operasi matriks beserta validasi dimensinya — mulai dari tambahMatriks yang paling sederhana sampai kaliMatriks yang aturan kompatibilitasnya paling ketat.