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
fprintfformat specifier - angka analisis menjadi kalimat lewat
sprintf - figur
saveasyang 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:
| Bagian | Isi | Sumber data |
|---|---|---|
| Header | judul, periode, versi data | konfigurasi / data tetap |
| Ringkasan statistik | total, rata-rata, item terbaik | hasil analisis |
| Tabel hasil | baris per entitas, kolom rata | matriks hasil |
| Lampiran | nama berkas figur | saveas |
| Footer | penutup + asal generator | teks 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.
Menulis Laporan Teks dengan fprintf #
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:
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:
- Baris 1 (
fopen(..., 'w')): mode'w'menulis dari awal — menjalankan ulang generator tidak menumpuk laporan lama (idempoten). - Baris 3-4 (
Periode data,Versi data): identitas laporan berasal dari data yang tetap, bukan dariclockyang berubah tiap detik. - Baris 8-10 (ringkasan statistik): angka analisis (
totalSemua,mean(Q(:)), item terbaik) langsung disisipkan lewat format specifier. - 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). - Baris 20 (
fclose): berkas baru terfinalisasi setelah ditutup — lupafclosemembuat berkas tertinggal di buffer.
Output yang Dihasilkan (cuplikan laporan yang dibaca kembali oleh skrip):
--- 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:
barisRingkas = sprintf('total %d unit, terbaik %s (%d unit)', ...
totalSemua, produk{iTop}, terbaik);
fprintf('analisis: %s\n', barisRingkas);Output yang Dihasilkan:
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:
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,  untuk gambar:
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\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.