Analisis yang berhenti di Command Window hanya dinikmati satu orang. Kolaborator, atasan, dan “diri kita tiga bulan mendatang” membutuhkan artefak yang bisa dibuka ulang: laporan. Kabar baiknya, segala sesuatu yang kita cetak dengan fprintf ke layar bisa dialihkan ke berkas — struktur, format kolom, angka, semuanya sama. Chapter ini membangun generator laporan otomatis dari analisis penjualan: laporan teks terstruktur .txt, laporan Markdown .md, dan figur PNG yang dilampirkan. Cakupan kita:

  • anatomi laporan: header → ringkasan statistik → tabel hasil → footer
  • tabel rata kolom dengan fprintf format specifier
  • angka analisis menjadi kalimat lewat sprintf
  • figur saveas yang direferensikan di laporan
  • versi data tetap (dari data, bukan dari jam) dan pola laporan per dataset

Anatomi Laporan #

Aturannya: laporan yang dibaca orang punya kerangka tetap — pembaca tahu mencari apa dan di mana. Mekanismenya: satu fungsi fprintf menulis tiap bagian berurutan ke berkas yang sama melalui file identifier dari fopen; alur tulisnya mengikuti anatomi berikut:

BagianIsiSumber data
Headerjudul, periode, versi datakonfigurasi / data tetap
Ringkasan statistiktotal, rata-rata, item terbaikhasil analisis
Tabel hasilbaris per entitas, kolom ratamatriks hasil
Lampirannama berkas figursaveas
Footerpenutup + asal generatorteks tetap

Data contoh kita: penjualan tiga produk sepanjang empat kuartal — Q berukuran 3×4, produk di baris, kuartal di kolom. Seluruh angka berasal dari literal yang tetap, sehingga laporan yang dihasilkan identik setiap dijalankan.

Mekanisme penulisan: fopen('laporan_penjualan.txt', 'w') membuka berkas untuk ditulis ulang dari awal, fprintf(fid, ...) mengirim teks ke berkas (bukan layar), dan fclose(fid) memfinalisasi. Tabel hasil dirapikan dengan format specifier: %-10s merata-kiri nama produk selebar 10 karakter, %6d merata-kanan angka bulat, %.2f membatasi dua desimal:

matlab
fid = fopen('laporan_penjualan.txt', 'w');
fprintf(fid, '================================================\n');
fprintf(fid, 'LAPORAN PENJUALAN - Toko Contoh\n');
fprintf(fid, 'Periode data : Q1-Q4 2025\n');
fprintf(fid, 'Versi data   : penjualan-2025-final\n');
fprintf(fid, '================================================\n\n');
fprintf(fid, 'RINGKASAN STATISTIK\n');
fprintf(fid, '  total unit terjual : %d\n', totalSemua);
fprintf(fid, '  rata-rata per sel  : %.2f\n', mean(Q(:)));
fprintf(fid, '  produk terbaik     : %s (%d unit)\n\n', produk{iTop}, terbaik);
fprintf(fid, 'TABEL HASIL PER PRODUK\n');
fprintf(fid, 'produk      total  rata-rata  pertumbuhan\n');
for i = 1:numel(produk)
    fprintf(fid, '%-10s %6d %10.2f %11.2f%%\n', ...
        produk{i}, totalProduk(i), rataProduk(i), tumbuh(i));
end
fprintf(fid, '\nFigur: grafik_penjualan.png (total unit per produk)\n');
fprintf(fid, '================================================\n');
fprintf(fid, 'Laporan dihasilkan otomatis oleh MATLAB.\n');
fclose(fid);
fprintf('laporan ditulis: laporan_penjualan.txt\n');

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (fopen(..., 'w')): mode 'w' menulis dari awal — menjalankan ulang generator tidak menumpuk laporan lama (idempoten).
  2. Baris 3-4 (Periode data, Versi data): identitas laporan berasal dari data yang tetap, bukan dari clock yang berubah tiap detik.
  3. Baris 8-10 (ringkasan statistik): angka analisis (totalSemua, mean(Q(:)), item terbaik) langsung disisipkan lewat format specifier.
  4. Baris 14-17 (loop tabel): tiap produk menjadi satu baris; lebar kolom %-10s %6d %10.2f %11.2f%% menjaga kolom berbaris rapi (dua %% mencetak satu tanda persen literal).
  5. Baris 20 (fclose): berkas baru terfinalisasi setelah ditutup — lupa fclose membuat berkas tertinggal di buffer.

Output yang Dihasilkan (cuplikan laporan yang dibaca kembali oleh skrip):

text
--- cuplikan laporan_penjualan.txt ---
================================================
LAPORAN PENJUALAN - Toko Contoh
Periode data : Q1-Q4 2025
Versi data   : penjualan-2025-final
================================================

RINGKASAN STATISTIK
  total unit terjual : 1749
  rata-rata per sel  : 145.75
  produk terbaik     : Cokelat (825 unit)

TABEL HASIL PER PRODUK
produk      total  rata-rata  pertumbuhan
Kopi          575     143.75       41.67%
Teh           349      87.25       18.75%
Cokelat       825     206.25       15.00%

Figur: grafik_penjualan.png (total unit per produk)
================================================
Laporan dihasilkan otomatis oleh MATLAB.
--- akhir cuplikan ---

Angka Jadi Kalimat dengan sprintf #

Aturan pelaporan: kalimat naratif lebih mudah dibaca manusia daripada tabel mentah. Mekanismenya: sprintf memformat dengan specifier yang sama seperti fprintf tetapi mengembalikan string — hasilnya bisa disisipkan ke log, judul figur, maupun badan laporan:

matlab
barisRingkas = sprintf('total %d unit, terbaik %s (%d unit)', ...
    totalSemua, produk{iTop}, terbaik);
fprintf('analisis: %s\n', barisRingkas);

Output yang Dihasilkan:

text
analisis: total 1749 unit, terbaik Cokelat (825 unit)

Pola sprintf + variabel hasil analisis ini juga menjadi bahan judul figur: title(sprintf('Penjualan %s naik %.1f%%', produk{iTop}, tumbuh(iTop))) membuat figur berdiri sendiri tanpa perlu keterangan tambahan.

Figur dan Laporan Markdown #

Aturan figur: laporan teks merujuk nama berkas figur, keduanya dipindah bersama. Mekanisme di balik layar: figure('visible', 'off') membuat figur tanpa jendela (aman di lingkungan tanpa tampilan), saveas merender ke PNG, delete(gcf) membebaskan figur dari memori:

matlab
figure('visible', 'off');
bar(1:numel(produk), totalProduk);
title('Total Unit per Produk');
xlabel('Produk'); ylabel('Unit');
saveas(gcf, 'grafik_penjualan.png');
delete(gcf);

Laporan Markdown memakai mesin fprintf yang sama — bedanya hanya penanda struktur: # untuk heading, | untuk tabel, ![teks](berkas) untuk gambar:

matlab
fid = fopen('laporan.md', 'w');
fprintf(fid, '# Laporan Penjualan - Toko Contoh\n\n');
fprintf(fid, 'Periode data: Q1-Q4 2025, versi data: penjualan-2025-final.\n\n');
fprintf(fid, '## Ringkasan\n\n');
fprintf(fid, '- Total unit terjual: %d\n', totalSemua);
fprintf(fid, '- Produk terbaik: %s (%d unit)\n', produk{iTop}, terbaik);
fprintf(fid, '- Pertumbuhan rata-rata: %.2f%%\n\n', mean(tumbuh));
fprintf(fid, '## Tabel Hasil\n\n');
fprintf(fid, '| Produk | Total | Rata-rata | Pertumbuhan |\n');
fprintf(fid, '| --- | --- | --- | --- |\n');
for i = 1:numel(produk)
    fprintf(fid, '| %s | %d | %.2f | %.2f%% |\n', ...
        produk{i}, totalProduk(i), rataProduk(i), tumbuh(i));
end
fprintf(fid, '\n![Total unit per produk](grafik_penjualan.png)\n');
fclose(fid);
fprintf('laporan ditulis: laporan.md\n');

Karena tabel Markdown memakai pemisah |, seluruh logika loop dan specifier dari versi .txt dipakai ulang — hanya pembungkus tiap sel yang berubah. Bila laporan di-render di penampil Markdown, laporan.md tampil dengan judul bertingkat, tabel, dan gambar grafik_penjualan.png tersemat.

Versi Data dan Pola Laporan per Dataset #

Aturan identitas: baris Versi data : penjualan-2025-final diturunkan dari data yang diproses, bukan dari tanggal hari ini. Mekanismenya: label versi disimpan sebagai bagian metadata dataset (misalnya nama berkas atau field konfigurasi) lalu disalin ke header laporan — dua orang yang menjalankan generator di hari berbeda menghasilkan laporan identik, dan perbandingan isequal pada isi berkas tetap sah sebagai uji. Pola yang sama berlaku untuk dataset lain: ganti struct konfigurasi (judul, periode, versi) dan matriks data — anatomi header-ringkasan-tabel-footer tidak berubah. Skrip contoh.m menutup dengan membaca kembali laporan memakai fgetl untuk verifikasi, lalu menghapus ketiga berkas hasil.

Ringkasan #

Generator laporan kita memakai satu mesin — fprintf — dengan tiga keluaran: laporan teks dengan tabel rata kolom (%-10s %6d %10.2f), laporan Markdown ber-heading dan tabel |, serta figur PNG dari saveas yang direferensikan di kedua laporan. sprintf mengubah angka analisis menjadi kalimat; versi data tetap menjaga identitas laporan lintas waktu; mode 'w' menjaga idempotensi. Skrip contoh.m menunjukkan siklus penuh: analisis → tulis figur → tulis dua laporan → baca ulang untuk verifikasi → bersihkan.