Deskriptor edit format (edit descriptor) adalah kode di dalam spesifikasi format yang menentukan lebar medan, jumlah angka desimal, dan bentuk setiap nilai yang ditulis atau dibaca Fortran. Format asterisk yang dibahas pada topik IO list-directed dan namelist memang ringkas, tetapi tampilannya tidak dapat diatur, sedangkan deskriptor edit format, yang selanjutnya disebut deskriptor format, memberi kendali penuh atas susunan kolom sehingga angka dalam tabel sejajar dan laporan mudah dibaca. Topik ini membahas bentuk umum deskriptor, deskriptor bilangan bulat Iw dan Iw.m, deskriptor bilangan real Fw.d, Ew.dEe, ESw.d, dan ENw.d, deskriptor karakter dan logika, pengulangan deskriptor, beserta perilaku yang muncul saat lebar medan kurang. Satu program berisi seluruh deskriptor tersebut dijalankan dengan gfortran, dan setiap baris keluarannya diuraikan pada bagian yang sesuai.
Bentuk umum deskriptor edit format#
Spesifikasi format ditulis sebagai string yang diapit tanda kurung, misalnya "(I5)" pada pernyataan print "(I5)", kode. Setiap deskriptor terdiri atas huruf yang menyatakan jenis pengeditan dan angka yang menyatakan ukurannya, misalnya I5 untuk bilangan bulat berlebar lima karakter dan F8.3 untuk bilangan real berlebar delapan dengan tiga angka di belakang titik. Deskriptor dibaca dari kiri ke kanan dan dipasangkan dengan item pada daftar keluaran sesuai urutannya, sehingga "(I2, 2X, I2)" menulis dua bilangan bulat yang dipisah dua spasi. Deskriptor X menghasilkan spasi kosong, sedangkan pengulangan ditulis sebagai angka di depan deskriptor, misalnya 3I5 yang berarti tiga medan I5.
String format tidak harus ditulis langsung pada pernyataannya. String format juga boleh disimpan dalam variabel karakter lalu dirujuk dari pernyataannya, misalnya read (unit, format_baris), sehingga lebar medan dapat disusun saat program berjalan. Seluruh mekanisme ini hanya berlaku pada rekaman terformat (formatted), yaitu rekaman yang isinya teks, sedangkan rekaman tak terformat dibahas pada topik rekaman terformat versus tak terformat di modul ini.
Deskriptor untuk bilangan bulat#
Deskriptor Iw menulis bilangan bulat rata kanan pada medan selebar w karakter, sedangkan Iw.m mewajibkan setidaknya m angka dicetak dengan nol pengisi di depan bila perlu. Program berikut menerapkan berbagai deskriptor pada sejumlah nilai contoh, termasuk dua kasus yang medannya terlalu sempit.
program deskriptor
implicit none
integer :: kode
integer :: besar
integer(kind=8) :: raksasa
real :: pi
real :: kecil
real :: angka
logical :: lolos
character(len=7) :: kota
character(len=48) :: format_string
kode = 7
besar = 123456
raksasa = 99999999999_8
pi = 3.14159265
kecil = 0.0001234567
angka = -123.456
lolos = .true.
kota = "Bandung"
print "(I5)", kode
print "(I5.3)", kode
print "(I5)", besar
print "(I10)", raksasa
print "(F8.3)", angka
print "(F6.1)", 12345.6
print "(E15.6E3)", kecil
print "(ES15.6)", pi
print "(EN15.6)", pi
print "(A)", kota
print "(L3)", lolos
print "(3I5)", 1, 2, 3
print "(I2, 2X, I2)", 5, 9
write (format_string, "(A, I0, A)") "Nilai ke-", 9, " tercetak rapi"
print "(A)", trim(format_string)
end program deskriptor# mengompilasi program dari direktori topik
gfortran deskriptor.f90 -o deskriptor
# menjalankan program
./deskriptor 7
007
*****
**********
-123.456
******
0.123457E-003
3.141593E+00
3.141593E+00
Bandung
T
1 2 3
5 9
Nilai ke-9 tercetak rapiTiga baris pertama keluaran dihasilkan I5 dan I5.3 yang diterapkan pada kode dan besar. Nilai 7 dicetak sebagai empat spasi diikuti 7 karena rata kanan, kemudian I5.3 menghasilkan 007 karena angkanya kurang dari tiga. Baris ketiga dan keempat memperlihatkan perilaku saat nilai tidak muat pada medannya. Nilai 123456 terdiri atas enam angka sehingga melebihi medan I5, dan nilai 99999999999 yang disimpan sebagai bilangan bulat 64 bit terdiri atas sebelas angka sehingga melebihi medan I10. Kedua kasus tersebut dicetak penuh sebagai karakter asterisk, yaitu ***** dan **********.
Deskriptor untuk bilangan real#
Deskriptor Fw.d menulis bilangan real dalam notasi tetap dengan d angka di belakang titik desimal di dalam medan selebar w karakter. Keluaran -123.456 berasal dari F8.3 yang medannya pas memuat tanda negatif, tiga angka di depan titik, titik desimal, dan tiga angka di belakang titik. Sebaliknya, F6.1 hanya menyediakan enam karakter untuk nilai 12345.6 yang membutuhkan tujuh, sehingga dicetak ******. Deskriptor Ew.d menggunakan notasi eksponensial, dan tambahan Ee menyatakan jumlah angka eksponen, sehingga E15.6E3 mencetak 0.123457E-003 dengan eksponen tiga digit. Nilai 0.0001234567 juga mencontohkan pembulatan, karena mantisa 0.1234567 dibulatkan menjadi 0.123457 pada enam desimal yang diminta deskriptor.
Deskriptor ESw.d dan ENw.d mengatur posisi titik desimal pada mantisa. Deskriptor ES mengikuti gaya ilmiah (scientific) dengan satu angka di depan titik, sedangkan EN mengikuti gaya teknik (engineering) dengan eksponen kelipatan tiga. Pada nilai pi, keduanya menghasilkan 3.141593E+00 karena eksponennya nol sehingga kedua gaya bertemu pada bentuk yang sama. Perhatikan bahwa 3.14159265 dibulatkan menjadi 3.141593 karena deskriptor hanya meminta enam desimal. Pemilihan antara F dan E menentukan keterbacaan keluaran, yaitu F cocok untuk rentang nilai yang sudah diketahui, sedangkan E lebih aman untuk nilai yang sangat besar atau sangat kecil.
Karakter, logika, pengulangan, dan lebar minimum#
Deskriptor A menulis variabel karakter apa adanya, dan bila lebar tidak ditulis seluruh isi variabel dicetak sehingga Bandung muncul tanpa spasi pengisi. Deskriptor Lw menulis nilai logika sebagai T atau F rata kanan, sehingga L3 menghasilkan dua spasi diikuti T. Pengulangan 3I5 memasangkan satu deskriptor dengan tiga item sekaligus dan menghasilkan tiga medan lima karakter berurutan, sedangkan I2, 2X, I2 menghasilkan 5 9 karena 2X menyisipkan dua spasi di antara kedua medan bulat itu.
Baris terakhir keluaran mencontohkan dua hal sekaligus, yaitu format yang disimpan dalam variabel dan deskriptor I0. Pernyataan write (format_string, "(A, I0, A)") menyusun teks Nilai ke-9 tercetak rapi ke dalam variabel format_string, dengan deskriptor A pertama yang menyalin teks tetap Nilai ke-, I0 yang mencetak bilangan 9 selebar minimum yang diperlukan sehingga tidak ada spasi berlebih di depannya, dan A kedua yang menyalin sisa teksnya. Pola ini berguna ketika spesifikasi format baru dapat disusun setelah data terbaca, misalnya jumlah kolom tabel yang baru diketahui setelah masukan dibaca, sehingga string formatnya dibangun saat program berjalan dan digunakan pada pernyataan keluaran berikutnya.
Kesalahan umum#
Kesalahan pertama adalah memilih lebar w terlalu sempit. Kasusnya sudah terlihat pada keluaran ***** dan ******, dan perbaikannya adalah menghitung kebutuhan medan dari nilai terburuk, yaitu jumlah angka ditambah tanda negatif, titik desimal, dan eksponen bila deskriptornya E. Untuk data yang rentangnya tidak diketahui, deskriptor I0 atau lebar yang lebih besar lebih aman daripada lebar tanpa cadangan.
Kesalahan kedua adalah jumlah item daftar yang melebihi jumlah deskriptor pada spesifikasi format. Ketika daftar item lebih panjang, pemindaian format dimulai kembali dari pengulangan terakhir yang mengapitnya, atau dari awal spesifikasi bila tidak ada pengulangan, sehingga nilai berikutnya ditulis pada rekaman baru dengan susunan kolom yang sama. Perilaku ini bukan error, tetapi sering mengejutkan karena laporan terpecah menjadi beberapa baris, sedangkan penempatan pengulangan yang benar, misalnya "(2(1X, F10.3))", membuat susunannya tetap teratur.
Kesalahan ketiga adalah mencampur jenis, misalnya memasangkan F8.3 dengan item bertipe bilangan bulat. Pasangan semacam ini menyebabkan error saat program berjalan karena bentuk data dan deskriptornya tidak cocok. Pastikan setiap deskriptor dipasangkan dengan tipe yang sesuai, yaitu I untuk bulat, F, E, ES, dan EN untuk real, A untuk karakter, serta L untuk logika.
Ringkasan#
- Deskriptor edit format menentukan lebar medan dan bentuk nilai, dengan
IwdanIw.muntuk bilangan bulat sertaFw.d,Ew.dEe,ESw.d, danENw.duntuk bilangan real. - Medan yang terlalu sempit dicetak sebagai asterisk tanpa error, sehingga lebar harus memuat seluruh angka beserta tanda dan titiknya.
3I5mengulang deskriptor untuk tiga item,Xmenyisipkan spasi,I0mencetak lebar minimum, dan string format dapat disimpan dalam variabel karakter.ESmemakai mantisa satu angka di depan titik, sedangkanENmemakai eksponen kelipatan tiga sesuai gaya teknik.
Referensi#
- Learn: tutorial resmi Fortran — fortran-lang — Kumpulan tutorial resmi komunitas Fortran yang mencontohkan penggunaan format dan deskriptor edit pada pernyataan cetak.
- The GNU Fortran Compiler — GNU Project — Manual gfortran yang menjadi rujukan penerapan deskriptor edit format pada kompiler yang digunakan seluruh contoh jalur ini.