• Tidak ada hasil yang ditemukan

MODUL IV Formatting dan Input/Output (I/O)

N/A
N/A
Protected

Academic year: 2022

Membagikan "MODUL IV Formatting dan Input/Output (I/O)"

Copied!
14
0
0

Teks penuh

(1)

1

MODUL IV

Formatting dan Input/Output (I/O)

1. Tujuan Praktikum

• Mahasiswa memahami formatting dan Input/Output (I/O) dalam pemrograman Fortran.

• Mahasiswa dapat mengaplikasikan formatting dalam pemrograman Fortran.

• Mahasiswa memahami aplikasi operasi I/O dalam format biner pada Fortran.

2. Pendahuluan 2.1 Formatting

Format digunakan untuk mengatur tampilan output (luaran) program, seperti mengatur tata letak, tipe panjang data yang dimasukkan lewat input atau ditampilkan pada output. Berikut adalah contoh dari statement format:

Format Fungsi

Iw[.m] Untuk nilai integer

Zw Untuk nilai heksadesimal

Fw.d Untuk nilai real

Ew.d Untuk nilai real dengan eksponen berawalan selain nol.aa x 10^y

ESw.d Untuk nilai real dengan eksponen berawalan 0.aa x 10^y

Gw.d Untuk nilai real dengan rangeextended Dw.d Untuk nilai real dengan rangedouble

Lw Untuk nilai logika

A[w] Untuk nilai karakter

nX Untuk spasi horizontal

/ Untuk baris baru (enter)

Tc,TLc,TRc Untuk tabulasi

Keterangan,

• w: banyak digit yang dibutuhkan (tipe integer)

• m: jumlah digit minimum untuk ditampilkan

• d: banyak angka di belakang koma (tipe integer)

• n: banyak spasi

• c: posisi tab

Script 4.1

PROGRAM format_integer IMPLICIT NONE

INTEGER :: index = -12, junk = 4, number = -12345

! Output bilangan Integer, default WRITE (*,100) index, junk, number 100 FORMAT (I0,1X,I0,1X,I0)

(2)

2

! Output bilangan Integer untuk tampilan kolom 200 FORMAT (' ', 2I5, I6, I10 )

210 FORMAT (' ', 2I5.0, I6, I10.8 ) 220 FORMAT (' ', 2I5.3, I6, I5 )

WRITE (*,200) index, index+12, junk, number WRITE (*,210) index, index+12, junk, number WRITE (*,220) index, index+12, junk, number

END PROGRAM format_integer

Script 4.2

PROGRAM format_real IMPLICIT NONE

REAL :: af = -12.3, bf = .123, cf = 123.456

REAL :: ae = 1.2346E6, be = 0.001, ce = -77.7E10 , de = -77.7E10

! Output bilangan real, deskriptor F 200 FORMAT (2F6.3, F8.3 )

210 FORMAT (3F10.2 ) WRITE (*,200) af, bf, cf WRITE (*,210) af, bf, cf

! Output bilangan real, deskriptor E 250 FORMAT (2E14.4, E13.6, E11.6 ) WRITE (*,250) ae, be, ce, de

END PROGRAM format_real

Script 4.3

PROGRAM format_character IMPLICIT NONE

CHARACTER(len=19) :: string = 'Ini adalah kalimat.'

10 FORMAT (' ', A) 11 FORMAT (' ', A20)

(3)

3 12 FORMAT (' ', A6)

! Output karakter WRITE (*,10) string WRITE (*,11) string WRITE (*,12) string

END PROGRAM format_character

Script 4.4

PROGRAM format_display IMPLICIT NONE

CHARACTER(len=10) :: nomor = 'No'

CHARACTER(len=12) :: nama = 'Nama Lengkap' CHARACTER(len=3) :: nim = 'NIM'

CHARACTER(len=6) :: kode_kelas = 'ME2103'

CHARACTER(len=21) :: nama_kelas = 'Komputasi Meteorologi' INTEGER,DIMENSION(5) :: urutan

DATA urutan/1,2,3,4,5/

! Penggunaan spasi [ nX ] dan tab [ Tc ]

98 FORMAT ('|----|----|----|----|----|----|----|----|----|----|') 99 FORMAT ('1 5 10 15 20 25 30 35 40 45 50') 100 FORMAT (A6, 1X, '-', 1X, A21)

101 FORMAT (2X, A2, 2X, A12, T31, A3) WRITE (*,100) kode_kelas, nama_kelas WRITE (*,98)

WRITE (*,101) nomor, nama, nim WRITE (*,98)

WRITE (*,99)

! Mengulang format yang sama pada grup data. Cth: (FORMAT ( n( ....

! Berpindah ke baris baru (deskiptor slash '/' ) 102 FORMAT(1X, 3 ('| ', I2, 1X, '|',/))

WRITE(*,*)

(4)

4 WRITE(*,102) urutan

END PROGRAM format_display

2.2 Operasi Input/Output

Sebuah program mungkin memerlukan data yang dibaca dari, misal, sebuah file atau keyboard. Sebuah program mungkin juga perlu menuliskan data pada misal, layar monitor ataupun sebuah file.

Perintah I/O:

Perintah Fungsi

BACKSPACE Menempatkan posisi pembacaan penulisan ke awal rekaman dari arsip eksternal yang sedang diproses.

CLOSE Memutuskan hubungan antara arsip eksternal dengan peralatan input/output yang sedang dihubungkan dengannya.

ENDFILE Menulis end of file.

OPEN Menghubungkan arsip ke suatu peralatan input/output.

READ Mentranster data dari arsip eksternal ke memori utama atau dari suatu daerah memori utama ke daerah memori utama yang lain.

REWIND Menempatkan posisi awal rekaman pertama dari arsip eksternal yang sedang diproses.

WRITE Mentransfer data dari array (memori utama) ke arsip eksternal atau dari arsip internal ke arsip eksternal atau dari memori utama ke daerah memori utama yang lain.

PRINT Mentransfer data dari memori utama ke eksternal device.

Bentuk umum operasi I/O:

• Membuka file ( Open )

OPEN([UNIT=]<integer>, FILE=<filename>, ERR=<label>, STATUS=<status>, &

ACCESS=<method>, FORM=<form>, ACTION=<mode>, RECL=<int-expr>)

• Membaca data pada file ( Read )

READ([UNIT=]<integer>, [FMT=]<format>, IOSTAT=<int-variable>, ERR=<label>, &

END=<label>, EOR=<label>, ADVANCE=<advance-mode>, REC=<int-expr>, &

SIZE=<num-chars>) <input-list>

• Menyimpan data kedalam file ( Write )

WRITE([UNIT=]<integer>, [FMT=]<format>, IOSTAT=<int-variable>, ERR=<label>, &

ADVANCE=<advance-mode>, REC=<int-expr>) <output-list>

(5)

5

Penjelasan :

UNIT=<integer> Referensi numerik untuk menyebut suatu file FILE=<filename> Nama file yang berasosiasi dengan UNIT

ERR=<label> Memindahkan control kesuatu label jika terjadi error dalam membuka file

STATUS=<status>

Status dari suatu file, dapat berupa : - 'OLD', file sudah ada sebelumnya - 'NEW', file belum dibuat sebelumnya

- 'REPLACE', isi file sebelumnya akan ditimpa dengan yang baru - 'SCRATCH', file bersifat sementara dan akan dihapus begitu file

ditutup

- 'UNKNOWN', status file tidak diketahui

ACCESS=<method>

Merujuk pada metode untuk mengakses file:

- 'DIRECT', metode yang digunakan untuk membuka file berformat binary (cth: .dat, .bin). File akan diakses sesuai dengan ID pada record. Disini panjang record (RECL) juga harus dinyatakan pada saat pembukaan file

- 'SEQUENTIAL', metode akses yang biasa dilakukan untuk file yang berformat ascii ataupun binary. Dengan metode ini file diakses berurutan untuk tiap eksekusi READ atau WRITE FORM=<form>

Menunjukkan status format file, dapat berupa:

- 'FORMATTED', bila file berada dalam format tertentu - 'UNFORMATTED', bila file tidak terformat

ACTION=<mode>

Merujuk pada apa saja yang dapat dilakukan terhadap suatu file, dapat berupa:

- 'READ', hanya membaca isi file - 'WRITE', hanya menulis isi file

- 'READWRITE', dapat membaca atau pun menulis isi file RECL=<i> Panjang record untuk file binary, dinyatakan dalam bilangan bulat

integer

[FMT=]<format> Merujuk pada format penulisan IOSTAT=<int-

variable>

Merujuk pada variabel integer yang menyimpan kode pengembalian, contohnya nol yang berarti tidak mengandung error

END=<label> Memindahkan kontrol ke suatu label jika pembacaan telah sampai pada akhir file. Hanya terdapat pada statement READ.

EOR=<label>

Memindahkan kontrol ke suatu label jika pembacaan telah sampai pada akhir record. Hanya dapat digunakan ketika ADVANCE = 'NO'. Hanya terdapat pada statement READ.

(6)

6 ADVANCE=<advance-

mode>

Merujuk pada apakah pada setiap melakukan READ sebaiknya membuat suatu record baru atau tidak. Pilihan default-nya adalah 'YES'. Jika dipilih'NO', maka file harus terhubung secara 'SEQUENTIAL' (berurutan) dan formatnya harus ditulis secara jelas.

REC=<int-expr> Nomor record untuk direct access

SIZE=<num-chars>

Digunakan sebagai konjungsi dengan suatu variable integer. Variabel tersebut menyimpan banyaknya karakter yang dibaca. Hanya dapat digunakan ketika ADVANC = 'NO'.Hanya terdapat pada statement READ.

Apabila terdapat sebuah file bernama data.txt yang berisi, 3 4 5

6 7 8

File tersebut dapat dibaca dalam Fortran seperti yang ditunjukkan pada script 4.5. Perintah READ berperan untuk membaca satu baris data pada file data.txt (UNIT=10). Compile lalu eksekusi script 4.5, perhatikan output yang ditampilkan program, apakah terdapat perbedaan antara file data.txt dengan data yang ditampilkan program? Mengapa bisa terjadi? Apa yang perlu dilakukan agar program dapat menghasilkan output sama seperti pada file asli?

Script 4.5

PROGRAM baca_filetxt IMPLICIT NONE

INTEGER, DIMENSION(2) :: A, B

OPEN (10,FILE='data.txt', STATUS='OLD', ACCESS='SEQUENTIAL') READ (10,*) A

READ (10,*) B WRITE(*,*) 'A :', A WRITE(*,*) 'B :', B CLOSE(10)

END PROGRAM baca_filetxt

Program untuk menulis file berformat (pada kasus ini txt) ditunjukkan pada script 4.6. Perintah WRITE berperan untuk menulis data di tiap baris pada file output data_tulis.txt (Unit = 20). Data ditulis sesuai dengan format yang ditentukan (Format/ FMT = 103). Compile lalu eksekusi script 4.6, kemudian cek file output program tersebut! Apakah file output (data_tulis.txt) menampilkan nilai yang sama seperti pada script 4.6?

Script 4.6

PROGRAM tulis_filetxt IMPLICIT NONE

INTEGER, DIMENSION(3) :: A, B A=[3,6,9]

(7)

7 B=[5,10,15]

OPEN (20,FILE='data_tulis.txt',STATUS='NEW') 103 FORMAT (T3, I2, 1X, I2, 1X, I2)

WRITE(20,103) A WRITE(20,103) B CLOSE(20)

END PROGRAM tulis_filetxt

Selanjutnya modifikasi variabel A pada script 4.6 agar bernilai A**2 (A=A**2), lalu ekseskusi kembali program ini, bagaimana hasil file data_tulis.txt? Ubah status dari ‘NEW’ menjadi

‘REPLACE’ kemudian eksekusi kembali script 4.6, lakukan hal yang sama untuk status ‘UNKNOWN’.

Apa yang bisa dipahami dari perbedaan perintah status ini? Perintah status mana yang dapat digunakan agar file data_tulis.txt menampilkan nilai terbaru?

Kasus selanjutnya adalah membaca data berformat binary, misalkan terdapat sebuah file databin.dat yang berisi,

-17.0 30.001 1.0 12000.

-0.012

File ini dapat dibaca pada Fortran menggunakan script 4.7. Dalam perintah OPEN, terlihat bahwa format untuk membuka file ini adalah UNFORMATTED dan diakses dengan cara STREAM. Data dalam file databin.dat dibaca dengan perintah READ, kemudian disimpan dalam variabel A.

Pada perintah READ terdapat IOSTAT yang menunjukkan status data yang sedang dibaca untuk satu baris, apabila data file sesuai dengan tipe variabel yang dideklarasikan maka IOSTAT akan memberikan nilai variabel (/ status) = 0.

Pada script 4.7 terlihat proses iterasi (Do Loop) yang sedang membaca dan menampilkan data variabel A di tiap baris untuk langkah yang tidak terbatas. Perintah iterasi ini akan berhenti jika nilai status tidak sama dengan nol, yang berarti tipe data yang dibaca pada variabel A berbeda dengan tipe data yang dideklarasikan pada script 4.7. Compile lalu eksekusi script 4.7, bagaimana hasilnya?

Script 4.7

PROGRAM baca_filedat IMPLICIT NONE

REAL :: A

(8)

8 INTEGER :: i

INTEGER :: ierror ! I/O status

OPEN (10,FILE='databin.dat',FORM='UNFORMATTED',ACCESS='STREAM')

DO

READ (10,IOSTAT=ierror) A IF (ierror/= 0 ) EXIT 100 FORMAT (F10.2 )

WRITE(*,100) A END DO

CLOSE(10)

END PROGRAM baca_filedat

Cara menyimpan data dalam bentuk file binary ditunjukkan pada script 4.8. Di sini terdapat dua cara yaitu menyimpan data dari variabel array (cara 1) dan menyimpan data menggunakan proses iterasi (cara 2). Perintah WRITE pada keduanya digunakan untuk menulis data. Untuk menulis file binary ini tidak diperlukan formatting data, sehingga perintah WRITE hanya mencantumkan Unit tempat file akan disimpan (Unit=10, 20). Perintah CLOSE digunakan untuk menutup program penulisan data.

Compile dan eksekusi script 4.8, bandingkan output file dengan cara dibuka langsung (misalkan dengan notepad++) dan dibuka menggunakan Fortran (gunakan script 4.7). Bagaimana hasilnya?

Script 4.8

PROGRAM tulis_filedat IMPLICIT NONE

INTEGER :: i

REAL,DIMENSION(20):: A1=[ (REAL(i/2.), i=1,20)]

REAL :: A2 = 20

! Tulis file dat - cara 1

OPEN (10,FILE='databin_new.dat',STATUS='UNKNOWN', &

FORM='UNFORMATTED',ACCESS='STREAM') WRITE (10) A1

(9)

9 WRITE (*,*) A1

CLOSE(10)

! Tulis file dat - cara 2

OPEN (20,FILE='databin_new2.dat',STATUS='UNKNOWN', &

FORM='UNFORMATTED',ACCESS='STREAM') DO i=1,20

WRITE (20) A2 WRITE (*,*) A2 A2=A2/2

END DO CLOSE(20)

END PROGRAM tulis_filedat

2.3 Operasi Input/Output untuk Data Tabel dan Array 2 Dimensi

Apabila terdapat sebuah file weekly_temp.txt yang berisi data temperatur rata-rata, temperatur maksimum dan temperatur minimum untuk tiap minggu seperti di bawah ini,

MEAN WEEK TEMP HIGH LOW

--- 01 21.8 29.3 17.6 02 23.9 31.6 19.6 03 25.7 32.4 16.4 04 22.9 30.0 18.6 ---

File tersebut dapat dibaca dalam program Fortran dengan menggunakan script 4.9. Pada tiga baris pertama file weekly_temp.txt data disimpan dalam variabel dummy, karena tiga baris ini tidak digunakan untuk pengolahan data. Proses membaca file dilakukan pada baris selanjutnya, yaitu baris ke-4.

(10)

10

Perintah READ digunakan untuk membaca data (Unit=10) dengan format yang diketahui (FMT=101). Proses iterasi (Do Loop) digunakan untuk membaca data secara berulang sampai data terakhir tidak memiliki format yang sama (FMT≠101). Dalam proses iterasi ini masing – masing variabel yang selesai dibaca disimpan dalam bentuk array, seperti variabel temperatur rata-rata (Tave), temperatur maksimum (Tmax) dan temperatur minimum (Tmin).

Selanjutnya variabel array tersebut ditampilkan dalam output program dengan format yang ditentukan (FMT=102). Compile lalu eksekusi script 4.9, bagaimana hasilnya?

Script 4.9

PROGRAM baca_filetxt2 IMPLICIT NONE

INTEGER :: num,i REAL :: B,C,D

REAL,DIMENSION(4) :: Tave,Tmax,Tmin

CHARACTER(len=60) :: dummy ! variabel tidak terpakai INTEGER :: ierror ! I/O status

OPEN (10,FILE='weekly_temp.txt', STATUS='OLD', ACCESS='sequential')

! Membaca data pada baris ke-1 sampai ke-3 READ (10,*) dummy

READ (10,*) dummy READ (10,*) dummy

! Membaca data pada baris ke-4 sampai ke-n,

! dengan n+1 tidak sesuai format/ tipe data i=1

101 FORMAT (I2, T7, F5.2, T14, F5.2, T21, F5.2) WRITE (*,*) 'Baca data :'

DO

READ (10,101,IOSTAT=ierror) num,B,C,D IF (ierror /= 0 ) EXIT

WRITE (*,101) num,B,C,D Tave(i)=B

Tmax(i)=C Tmin(i)=D

(11)

11 i=i+1

END DO

102 FORMAT (3X,4(F5.2, 2X)) WRITE (*,*)

WRITE (*,*) 'Nilai Temp. rata-rata mingguan :' WRITE (*,102) Tave

WRITE (*,*)

WRITE (*,*) 'Nilai Temp. maksimum mingguan :' WRITE (*,102) Tmax

WRITE (*,*)

WRITE (*,*) 'Nilai Temp. minimum mingguan :' WRITE (*,102) Tmin

END PROGRAM baca_filetxt2

Jika terdapat sebuah file binary data_2D.dat dengan dimensi 4x5 seperti di bawah ini, 11.1736 11.0061 -7.4230 7.4808 -14.0227

-10.8906 15.4421 -10.6158 -1.9242 -14.2238 0.3256 0.8593 23.5046 8.8861 4.8819 5.5253 -14.9159 -6.1560 -7.6485 -1.7738

Maka file tersebut dapat dibaca menggunakan script 4.10. Berbeda saat membaca data binary 1D pada script 4.7, ukuran dimensi untuk file binary yang memiliki data 2 dimensi dan diatasnya harus diketahui sebelum membaca program. Pada kasus ini, terdapat 20 data dalam bentuk 2D dengan ukuran 4x5. Proses iterasi digunakan untuk membaca data variabel A, agar lebih sederhana data yang baru dibaca disimpan terlebih dahulu dalam array 1D (A1). Setelah proses iterasi selesai, array data A1 kemudian diubah dalam bentuk 2D (A2).

Langkah selanjutnya adalah menampilkan data_2D.dat dalam program. Script 4.10 menunjukkan beberapa hal yang perlu diperhatikan pada saat menampilkan data 2D jika menggunakan formatting. Compile lalu eksekusi script 4.10, bagaimana hasilnya?

Script 4.10

PROGRAM baca_filedat2D IMPLICIT NONE

REAL :: A

REAL,DIMENSION(4*5):: A1 REAL,DIMENSION(4,5):: A2

(12)

12 INTEGER :: i,j

INTEGER :: ierror ! I/O status i=1

! Membaca file

OPEN (10,FILE='data_2D.dat',FORM='unformatted',ACCESS='stream') WRITE (*,*) 'Display data yang baru dibaca'

WRITE (*,*) 'Data = ' DO

READ (10,IOSTAT=ierror) A IF (ierror /= 0 ) EXIT 100 FORMAT (F10.2)

WRITE (*,100) A A1(i) = A

i = i+1 END DO CLOSE(10)

! Menampilkan data A2 = RESHAPE(A1,[4,5])

101 FORMAT (F10.2,1X,F10.2,1X,F10.2,1X,F10.2,F10.2,1X,/ )

WRITE (*,*) 'Display array 2D tanpa formatting output' WRITE (*,*) 'Data = '

DO i=1,4

WRITE(*,*) (A2(i,j),j=1,5) ENDDO

WRITE (*,*)

WRITE (*,*) 'Display array 2D tanpa format tampilan array 2D' WRITE (*,*) 'Data = '

WRITE (*,101) A2 WRITE (*,*)

WRITE (*,*) 'Display Array 2D dengan format 2D dan formatting output' WRITE (*,*) 'Data = '

(13)

13 DO i=1,4

WRITE(*,101) (A2(i,j),j=1,5) ENDDO

END PROGRAM baca_filedat2D

3. Latihan Soal

1. a) Buatlah script Fortran untuk menulis kembali file berformat ASCII (.txt) pada script 4.9

b) Buat script Fortran untuk menulis file ke format binary (.dat) pada script 4.10 dengan ouput variabel baru A2_b (A2_b=-A2). Cek apakah program ini telah menyimpan data dengan benar menggunakan bantuan script 4.10!

2. Buatlah program untuk membuat tabel yang menghitung sin dan cos dari θ pada nilai 0o hingga 90o tiap 1o. Tampilkan hasil perhitungan dalam bentuk tabel terdiri dari tiga kolom.

Kolom pertama nilai θ, kedua nilai sin θ, dan ketiga nilai cos θ.

3. File daily_temp.txt berisi data temperatur harian dalam Celcius (oC) pada file tersebut terdapat data hari pengamatan (DAY), temperatur rata-rata (MEAN TEMP), temperatur maksimum (HIGH), dan temperatur minimum (LOW).

MEAN DAY TEMP HIGH LOW

--- 01 23.9 29.3 18.6 02 22.9 28.6 17.6 03 22.6 28.9 16.4 04 22.9 28.9 16.6 05 22.9 29.7 15.9 06 24.0 30.2 18.3 07 24.7 30.1 19.8 08 24.5 30.6 20.0 09 23.9 28.5 20.1 10 23.4 28.1 19.1 11 24.8 30.4 20.4 12 25.1 31.1 22.1 13 24.9 31.1 19.9 14 24.8 30.1 21.5 15 24.6 29.9 19.3 16 24.7 31.3 17.9 17 25.1 31.6 19.7 18 25.1 31.5 21.0 19 24.8 32.4 20.2 20 24.7 32.1 17.8 21 23.8 31.4 18.1 22 23.5 30.2 18.3 23 23.3 29.4 17.8 24 24.1 31.9 17.2 25 24.7 33.7 18.1 26 24.9 32.3 20.6

(14)

14 27 24.8 31.9 19.5

28 24.6 30.0 19.2 29 24.9 31.9 18.4 30 23.8 30.6 16.7 31 24.6 31.2 18.1 ---

Buatlah script untuk membaca file tersebut dalam Fortran, selanjutnya hitung nilai rata- rata, standar deviasi, nilai maksimum dan minimum untuk tiap variabel. Buat subroutine untuk masing-masing proses tersebut. Selanjutnya simpan hasil perhitungan dalam bentuk file .txt dengan tampilan yang informatif!

Referensi

Dokumen terkait

Bentuk apresiasi tersebut salah satunya dapat diwujudkan dengan tetap menjaga eksistensi batik Indonesia, menciptakan motif-motif baru yang sebelumnya belum pernah dibuat dan

Hasil penelitian tidak adanya perbedaan yang bermakna pada peningkatan skor sikap antara kelompok perlakuan dan kelompok kontrol, hal ini dikarenakan media komik yang

Tujuan pembangunan untuk memenuhi kebutuhan masyarakat berpenghasilan rendah yang belum memiliki tempat tinggal tetap (Peraturan Bupati Sleman No 43 Tahun 2013

Dari pernyataan semua informan di atas dapat di lihat bahwa segmentasi demografik yang dilakukan oleh UD Mebel Aneka sesuai dengan pernyataan dari Kotler dan Amstrong (1997), yang

political of global media” menyatakan bahwa political of global media” menyatakan bahwa dalam proses globalisasi media yang dominan dalam proses globalisasi media yang dominan

1) Berdasarkan hasil pengujian terhadap sistem kriptografi menggunakan AES- 128 bit dapat berjalan dengan baik mulai dari plainteks dienkripsi dan menghasilkan teks yang

Pemberian pelayanan bagi penderita diare (yang mengalami dehidrasi ringan- sedang), diobservasi di Layanan Rehidrasi Oral Aktif paling sedikit selama 3 jam; orang

Kondisi Perairan Dermaga akibat Tinggi Gelombang Arah Timur Laut.. Pemodelan Akibat Adanya Breakwater