BAB 1 PENDAHULUAN
1.1 Tujuan Pemrograman Komputer: 1. Melakukan perhitungan-perhitungan dalam jumlah yang banyak dan sistem yang kompleks. 2. Mempermudah seseorang untuk mengekspresikan ide-ide (tulisan, gambar dll) ataupun hasil perhitungan (grafik, kontour dll).
1.2 Sejarah Komputer 1. Komputer generasi pertama menggunakan tabung vakum dan relay. Pada komputer-komputer generasi ini perhitungan-perhitungan dilakukan dengan rewiring. ENIAC (Electronic Numerical Integrator and Computer) yang dikembangkan oleh Atanosoff dan Berry pada tahun 1946.
ENIAC
UNIVAC I
UNIVAC (Universal Automatic Computer) yang dikembangkan oleh Eckert dan Mauchly pada tahun 1951. Komputer ini mempunyai 18000 tabung vakum dan 1500 relays dengan ukuran 2040 feet2. 2. Komputer generasi kedua menggunakan transistor sebagai pengganti tabung vakum sehingga mempunyai keunggulan ukuran lebih kecil, lebih murah, daya rendah, panas rendah dan tentu saja lebih andal. IBM 7090 (19591965) merupakan komputer
Dr. Tri Agung Rohmat
generasi ini.
IBM 7090
IBM 360
3. Komputer generasi ketiga (mis. IBM 360 pada tahun 1964) mulai menggunakan IC (integrated circuit) dan mampu melakukan multiprogramming. 4. Komputer generasi keempat pada tahun 80'an menggunakan VLSI (very large-scale integrated-circuit) yang terbuat dari silikon dan peralatan mikroelektronik sehingga didapatkan komputer dengan ukuran kecil.
1.3 Bahasa Komputer 1. Bahasa mesin (machine language) merupakan satu-satunya bahasa yang dapat dipahami oleh komputer secara langsung. Bahasa ini berbasis biner (berbasis dua) yaitu 1 (ada tegangan listrik) dan 0 (tidak ada tegangan). 2. Bahasa tingkat tinggi (high-level language) merupakan bahasa yang menjadi
jembatan antara bahasa yang dipahami user (manusia) dan komputer. Bahasa ini akan menterjemahkan komando-komando dalam bahas manusia menjadi bahasa mesin. Misal FORTRAN (FORmula TRANslation), BASIC, Pascal, COBOL, C dan lain-lain.
Sistem Computing 1. CPU (central processing unit) merupakan "otak"nya komputer dan mempunyai bagian-bagian ALU (arithmetic-logic unit) yang melakukan perhitungan aritmetik dan kontrol logic high-speed memory atau cache memory yang berfungsi untuk menyimpan data dan instruksi sementara control unit yang mengontrol keseluruhan sistem 2. Input devices yang dipakai untuk menerima atau memasukkan data. Dapat berupa keyboard, mouse, atau interface. 3. Output devices yang dipakai untuk mengeluarkan hasil proses. Printer, plotter, dan interface merupakan contoh-contohnya. 4. External memory yang dipakai untuk menyimpan data-data, program dan lain-lain. Dapat berupa SDRAM, DDRAM, RDRAM untuk penyimpanan berupa hard disk, floppy disk, CD-ROM untuk penyimpanan tetap. sementara, dan
1.4 Internal Representation Seperti tersebut di atas, komputer hanya mengerti bahasa berbasis biner. Satu buah data (berupa 1 atau O) disebut bit dan kumpulan bit (biasanya 8 bit) disebut sebagai byte. Memori sebesar 512K berarti mampu menyimpan data sebanyak 219 byte=524.288 byte=222 bit. Pengelompokan yang lebih besar disebut word dimana kemampuan komputer bervariasi 8, 16, 32, atau 64 bits. Ini artinya untuk komputer dengan kemampuan word sebesar 16 bits maka bilangan asli terbesar yang dapat dicapai adalah 215-1=32,767. Sedangkan untuk 32 bits adalah 231-1=2,147,483,647.
Dr. Tri Agung Rohmat
Bilangan yang dikenal dalam kehidupan sehari-hari-hari adalah bilangan desimal (berbasis sepuluh). Oleh komputer bilangan ini akan diterjemahkan menjadi bilangan biner. Misalnya 510=1012. Sebaliknya 1110102 berarti (125)+ (124)+ (123)+ (022)+ (121)+ (020)=58 Bilangan nyata biner 110.101 bila dinyatakan dalam bilangan nyata desimal akan menjadi (122)+ (121)+ (020)+ (12-1)+ (02-2)+ (12-3) = 6.625 Di dalam memori komputer bilangan ini akan disimpan dalam bentuk, 0.1101012 23 dimana suku pertama (0.110101) disebut mantissa dan suku kedua (23) disebut exponent. Dalam sebuah komputer 16 bits maka apabila 11 bits pertama dipakai untuk mantissa dan sisanya untuk exponent maka 0.1101012 23 dituliskan sebagai,
0110101000 0 00011 14 4 244 3 1 2 3
mantissa exponent
Sebagai konsekuensi dari hal ini maka misalnya bilangan 0.710 dalam bilangan biner dinyatakan, 0.101100110011001102 dengan pengulangan blok 0110 tanpa batas. Sehingga apabila mantissa dinyatakan dalam 11 bits maka representasi dari 0.7 adalah 0.10110011002 yang mempunyai nilai desimal 0.69921875 yang tidak sama persis dengan 0.7. Perbedaan ini disebut round-off error (error pembulatan).
PROBLEM: Bagaimana mengetahui jumlah tersisa dari suatu zat radioaktif selang waktu tertentu. 2.1. Analisa Problem dan Spesifikasi Diketahui bahwa suatu zat radioaktif mempunyai waktu paruh yaitu waktu yang dibutuhkan untuk massanya menjadi separuh. POLONIUM: 100 mg 50 mg 25 mg 12.5 mg
Di mana 100 mg adalah massa awal dan 140 hari adalah waktu paruh untuk unsur Polonium yang kedua-duanya menentukan massa akhir pada selang waktu tertentu. Dari sini untuk mendapatkan massa akhir (OUTPUT) diperlukan INPUT yang berupa massa awal, waktu paruh, dan selang waktu. Untuk dapat menghitungnya diperlukan suatu persamaan umum dan di sini persamaan dapat ditunjukkan oleh
di atas algoritma bisa dituliskan sebagai berikut, 1. Masukkan (inputkan) massa awal, waktu paruh, dan selang waktu 2. Hitung massa sisa dengan persamaaan di atas 3. Tunjukkan massa lewat monitor atau di-save dalam disket/harddisk Dalam pembuatan program, seorang programmer lebih suka menerjemahkan algoritma dalam sebuah flowchart yang merupakan bagan alir dari algoritma dengan menggunakan tanda-tanda sebagai berikut:
Display RESID
END
2.3. Pembuatan Program Di sini penulisan program harus mengikuti kaidah-kaidah dalam bahasa yang akan digunakan (dalam hal ini FORTRAN). nama variabel (mis. INIT, RESID) dimulai dengan suatu huruf dan dapat diikuti oleh huruf atau angka. Total digit yang diperbolehkan adalah 6. Di sini yang perlu diperhatikan bahwa nama variabel sebaiknya mencerminkan sifat variabel. R12345, RESIDU, R1T2D3 R-1234, 1ABCDE, T123456 dibolehkan tidak dibolehkan
FORTRAN membedakan dua jenis data numerik yaitu tipe integer (tanpa pecahan) dan tipe real (bilangan nyata). Di mana tipe suatu variabel harus dideklarasikan secara eksplisit atau implisit. Secara eksplisit dapat dinyatakan dalam bentuk umum: INTEGER list1 REAL list2
Lambang-lambang operasi aritmetik dinyatakan: Penambahan Pengurangan Perkalian Pembagian Pangkat Contoh: RESID = INIT (.5) (TIME / HFLIFE) Persamaan ini memberikan harga INIT 0,5 TIME / HFLIFE pada variabel RESID. + /
Untuk meng-inputkan data digunakan komando READ, untuk meng-outputkan data digunakan komando PRINT atau WRITE. Secara umum dapat dituliskan: READ , list PRINT , list WRITE , list
Untuk memberikan informasi pada program maka dapat dituliskan informasi dengan menuliskan huruf c atau karakter (asterik).
Dengan kaidah-kaidah di atas maka program penghitungan massa sisa dapat dituliskan sebagai berikut: This program calculates the amount of a radioactive substance that remains after a specified time INIT : initial amount of substance .............................. REAL INIT, HFLIFE, TIME, RESID PRINT , ' Enter the initial amount, half-life, and time' READ , INIT, HFLIFE, TIME RESID = INIT (.5) (TIME / HFLIFE) PRINT , 'Amount remaining =', RESID END Program di atas kalau dijalankan atau dirun maka didapatkan: Enter the initial amount, half-life, and time 10, 140, 700 Amount remaining = 0.312500
10
2.4. Eksekusi Program dan Pengetesan Langkah keempat penggunaan komputer dalam menyelesaikan problem adalah dengan mengeksekusi dan mencobanya. Di sini yang perlu diperhatikan adalah pelaksanaannya berbeda antara satu software dengan software yang lainnya. Posisi pada suatu baris disebut kolom (column) dan diberi nomor 1, 2, 3, , 80. Semua pernyataan dalam FORTRAN harus ditempatkan pada kolom 7 sampai 72. Apabila sebuah pernyataan membutuhkan label (semacam nomor baris) maka harus diposisikan pada kolom 1 sampai 5. Label harus dalam bentuk integer dan dalam rentang 1 sampai 99999. Untuk penulisan pernyataan yang sangat panjang sehingga tidak cukup dituliskan pada kolom 772, maka dapat dituliskan di kolom berikutnya (maksimal 19 kolom) dengan cara menuliskan tanda penerusan yang dapat berupa huruf atau angka, selain 0 (nol) atau kolom kosong, pada kolom ke 6. Dengan kata lain 0 (nol) atau kolom kosong pada baris ke 6 menunjukkan bahwa baris tersebut merupakan terusan dari kolom sebelumnya. Suatu baris yang kosong atau baris yang dimulai dengan huruf C atau asterik (*) pada kolom pertama menunjukkan sebagai baris komentar. Baris komentar tidak dieksekusi, biasanya dituliskan sebagai keterangan tentang program itu sendiri. Umumnya programmer pemula akan membuat berbagai error (kesalahan) dalam pembuatan algoritma program, pengetikan program dan pengesekusian program. Error dapat dideteksi pada berbagai tingkat dari program sehingga mengakibatkan compiling (kompilasi) eksekusi program terhenti. Syntax error atau compiled error yaitu kesalahan dalam penulisan tata bahasa. Sebagai contoh apabila pernyataan output dalam contoh di atas tertulis PRINT *, 'AMOUNT REMAINING =, RESID
Dr. Tri Agung Rohmat
11
yaitu tidak adanya tanda petik penutup maka kompilasi program akan terhenti. Untuk kesalahan yang tidak terlalu fatal maka kompilasi tidak terhenti tetapi akan keluar peringatan. Error lain, seperti pembagian dengan nol, tidak akan terdeteksi sampai programnya dieksekusi. Error ini disebut run-time error. Yang paling perlu diperhatikan adalah apa yang disebut sebagai logical error. Error ini timbul akibat akibat kesalahan algoritma atau dalam pembuatan program. Sebagai contoh, RESID = INIT (.5) (TIME / HFLIFE) dituliskan salah sebagai berikut, RESID = INIT (.5) (TIME / HFLIFE) maka pernyataan terakhir akan menghasilkan nilai RESID yang sama sekali berbeda dengan yang diinginkan. Error jenis ini sangat perlu diwaspadai karena tidak akan menghentikan kompilasi atau eksekusi program.
12
Contoh konstanta integer yang tidak valid: 5,280 16.0 -- 5 7(ada komanya) (mengandung titik desimal) (tanda minusnya dobel) (tanda harus didepan)
13
Deretan angka yang mengandung titik desimal; dapat dituliskan seperti bilangan desimal biasa atau secara pangkat. Tidak diperbolehkan menggunakan tanda koma sebagai pengganti titik. Contoh: 1.234 Contoh kontanta riil yang tidak valid: 12,345 63 (koma tidak diijinkan) (konstanta harus mengandung titik desimal) -.01536 +564.73
Penulisan dengan cara pangkat dilakukan dengan menulis bagian mantisa dan diikuti oleh huruf E dan konstanta integer. Sebagai contoh konstanta riil 337.456 dapat dituliskan: 3.37456E2 yang artinya 3.37456 x 102, atau dapat dituliskan juga sebagai: .337456E3 Konstanta Karakter Deretan simbol yang diambil dari kumpulan karakter yang ditetapkan dalam FORTRAN. Variabel Dalam matematika simbol sering dipakai untuk menunjukkan sebuah jumlah. A=lw Persamaan ini digunakan untuk menghitung luas (A) sebuah persegi panjang dengan panjang (l) dan lebar (w) tertentu. Simbol-simbol inilah yang disebut variabel. Dalam sebuah komputer harga suatu variabel akan ditempatkan dalam suatu alamat memori. Nama variabel dalam FORTRAN terdiri huruf dan atau angka yang panjangnya maksimal 6 digit dimana huruf pertama harus huruf. Contoh: 337.456E0 33745.6E-2 317156E-3
14 VELOC AB1
MASS
RATE
Contoh nama variabel yang tidak valid: TOOLONG R2-D2 6FEET (lebih dari 6 digit) (mengandung selain angka dan huruf) (dimulai dengan angka)
Untuk menentukan variabel bertipe apa digunakan, REAL list INTEGER list dimana list adalah deretan nama variabel yang dipisahkan dengan koma. REAL mendefinisikan variabel bertipe riil, INTEGER mendefinisikan variabel bertipe integer. Contoh REAL MASS, VELOC INTEGER COUNT, FACTOR, SUM mendefinisikan MASS dan VELOC sebagai tipe riil, sedangkan COUNT, FACTOR, dan SUM sebagai tipe integer. Apabila tidak didefinisikan secara eksplisit, FORTRAN akan mendefiniskan secara implisit secara konvensi, yaitu variabel yang dimulai dengan I, J, K, L, M, atau N adalah variabel integer, sedangkan yang dimulai dengan huruf lain adalah variabel riil. Di sini yang sangat penting diperhatikan bahwa definisi tipe variabel sangat penting. Hal ini dapat dilihat dari contoh-contoh di belakang.
3.2 Operasi Aritmetik dan Fungsi Suatu persamaan yang mengandung operasi arimetik (+, -, *, /, **) akan dieksekusi sesuai
Dr. Tri Agung Rohmat
15
dengan aturan prioritas. 1. Semua pangkat dieksekusi terlebih dahulu; dimana yang sebelah kanan lebih dahulu. 2. Semua perkalian atau pembagian dieksekusi berikutnya dengan urutan dari yang lebih kiri 3. Penambahan dan pengurangan dieksekusi paling akhir dengan urutan dari yang lebih kiri. Contoh: 2 3 2 = 2 9 = 512 10 8 2 = 2 2 = 0 2 + 4 2 / 2 = 2 + 16 / 2 = 2 + 8 = 10 Untuk menghindari kesalahan penulisan maka dapat digunakan tanda kurung dimana yang ada dalam kurung dieksekusi terlebih dahulu. (5 (11 5) 2) 4 + 9 = (5 6 2) 4 + 9 = 180 4 + 9 = 720 + 9 = 729 Dalam FORTRAN tidak diijinkan menggunakan tanda operasi aritmetik berurutan. Misal N 2 tidak diijinkan, tetapi harus ditulis N (-2). Apabila dua konstanta atau variabel yang tipenya sama dikombinasikan untuk melakukan operasi aritmetik maka tipe hasilnya mengikuti tipe awalnya. Misal penjumlahan 3 integer and 4 integer menghasilkan 7 integer, sedangkan penjumlahan 3.0 riil and 4.0 riil adalah 7 riil. Hal ini kelihatannya tidak begitu penting, tetapi sangat perlu diperhatikan pada operasi pembagian. Misal, 9.0 / 4.0 = 2.25 dimana
Dr. Tri Agung Rohmat
16
9/4=2 Dengan cara yang sama, apabila N mempunyai harga 2 dan X adalah 2.0 maka 1.0 / X = 0.5 1/N=0 Apabila dalam operasi aritmetik apabila terdapat konstanta atau variabel yang berlainan tipenya maka yang bertipe integer mengikuti yang bertipe riil. 1. / 4 1. / 4. = .25 3. + 3 8 / 5 3. + 1 3. + 1. 4. + 8. / 5. 3 + 1.6 3. + 1.6 = 4.6
+ 8. / 5 3
Perbedaan ini juga mempengaruhi pemangkatan. Apabila pangkat dalam angka integer maka pemangkatan dilakukan dengan perkalian berulang. Misal, 2 3 222=8
(-4.0) 2 (-4.0) (-4.0) = 16.0 1.5 2 1.5 1.5 = 2.25 Tetapi apabila pangkatnya adala angka riil maka pemangkatan dilakukan dengan menggunakan algoritma. Misal 2.0 3.0 akan dieksekusi sebagai e2.0 ln(3.0) yang hasilnya tidak tepat sama dengan 8.0 karena terjadinya roundoff errors (error pembulatan) yang timbul akibat fungsi pangkat dan algoritma dinyatakan dalam sebuah deret. Konsekuesi lain yang timbul adalah tidak terdefinisikannya (-4.0) 2.0 karena tidak adanya fungsi logaritma untuk angka negatif (walaupun (-4.0) (-4.0) = 16.0). Dari contoh ini pangkat riil tidak boleh digunakan sebagai pengganti pangkat integer.
Dr. Tri Agung Rohmat
17
Tetapi tentu saja pada perhitungan-perhitungan tertentu dibutuhkan pangkat dengan angka riil. Misal untuk menghitung akar 7 dapat dituliskan 7 .5, 7 (1. / 2.) atau 7 (1. /
2) (perhatikan 7 (1 / 2) menghasilkan 7 0 = 1). Secara umum akar pangkat N dari suatu angka positif X dapat dituliskan: X (1.0 / N) Selain dengan cara di atas, dalam FORTRAN tentu saja tersedia fungsi untuk menghitung akar yang dilambangkan dengan SQRT dan dituliskan dengan SQRT(arguments) dimana where arguments adalah konstanta, variabel, atau sebuah persamaan aritmetik. Misal, SQRT (7. 0) tetapi bukan SQRT(7).
Fungsi-fungsi dalam FORTRAN Fungsi ABS(x) COS(x) EXP(x) INT(x) LOG(x) MAX(x1, xn) MIN(x1, xn) MOD(x,y) Penjelasan Absolute value of x Cosine of x radians Exponential function ex Integer part of x Natural logarithm of x Maximum of x1, xn Maximum of x1, xn x INT(x/y) y Tipe Argument(s)* Integer/real Real Real Real Real Integer/real Integer/real Integer/real Tipe Hasil Tidak berubah Real Real Integer Real Tidak berubah Tidak berubah Tidak berubah
3.3. Pemberian Nilai Pada Sebuah Variabel Secara umum dapat dinyatakan, variabel = expression dimana expression adalah konstanta atau variabel yang sebelumnya sudah didefinisikan sebelumnya atau diformulasikan. Misal, XCOORD = 5.23 YCOORD = SQRT(25.0) NUMBER = 17 TERM = NUMBER / 3 + 2 XCOORD = 2.0 XCOORD Di sini yang perlu diperhatikan bahwa apabila sebuah variabel integer diberi nilai dengan angka riil maka pecahannya dipotong tinggal bagian integernya. Misal variabel riil X berharga 5.75, sedangkan I, KAPPA, dan MU adalah variabel integer maka, I = 3. 14159 KAPPA = X / 2.0 MU = 1. / X akan memberikan harga kontanta masing-masing 3, 2, dan 0 kepada variabel I, KAPPA, dan MU. Pada kasus dimana pemberian nilai integer pada variabel riil, maka nilainya diubah
Dr. Tri Agung Rohmat
19
menjadi riil dan diberikan pada variabel. Misal variabel integer N berharga 9, sedangkan variabel ALPHA dan BETA adalah variabel riil maka ALPHA = 3 BETA = (N + 3) / 5 memberikan nilai 3.0 pada ALPHA dan nilai 2.0 to BETA.
3.4 Latihan Soal 1. Hitunglah rata-rata tinggi badan dari mahasiswa Kelas Pemrograman Komputer yang masuk pada hari ini dimana jumlah mahasiswa tidak diketahui dengan pasti. 2. Perusahaan air menetapkan harga langganan air per bulan sebagai berikut: Air terpakai 70 meter kubik pertama 100 meter kubik berikut 230 meter kubik berikut Di atas 400 meter kubik Tarif Rp. 50.000 Rp. 500 per meter kubik Rp. 250 per meter kubik Rp. 150 per meter kubik
Tulislah program untuk menghitung berapa tarif yang harus dibayarkan. Sebagai input ditetapkan pembacaan meteran pada bulan sebelumnya, dan pembacaan meteran pada saat akhir bulan ini dengan empat digit. Perhatikan bahwa pembacaan pada bulan ini dapat lebih kecil dibandingkan dengan bulan sebelumnya (karena meterannya terbatas digitnya). 3. Tulislah program yang membaca sejumlah data, menghitung jumlah data, dan menghitung berapa rata-rata, varian, dan standar deviasi dari data-data yang didapatkan.
1 n Rata-rata = x i n i =1
Dr. Tri Agung Rohmat
n 1 n 2 1 x x Varian = i i 2 n i =1 n i =1
20
1 k = 0 k!
akan konvergen ke bilangan natural e untuk bilangan positif integer k. Jumlah sampai suku ke-4 dapat dinyatakan:
1 1 1 1 + + + 0! 1 ! 2! 3!
Tulis program yang menghitung dan mendisplaikan deret sampai suku ke-n. 5. Kecepatan turun parasut dapat didekati dengan persamaan:
V (t ) =
gm (1 e( c / m )t ) c
dimana g adalah percepatan gravitasi (9.8m2/s), c adalah koefisien drag (12.4 kg/sec), m adalah massa orang (81.5kg). Tuliskan program untuk menghitung jarak yang ditempuh dari t=A ke t=B. Ingat jarak adalah integral dari kecepatan. 6. Tuliskan sebuah program untuk membaca data dari 2 sisi tegak lurus dari sebuah segitiga siku-siku, dan menghitung dan men-display-kan luasan segitiga dan panjang sisi miringnya. 7. Sebuah segitiga siku-siku dapat mempunyai kombinasi panjang sisi-sisinya (3, 4,, dan 5 atau 5, 12, dan 13 dll). Secara umum panjang sisi-sisi dapat dinyatakan: sisi tegak lurus 1 = m2 - n2 sisi tegak lurus 2 = 2mn sisi miring = m2 + n2 dimana m dan n adalah integer positif dan m > n. Buat program untuk membaca m dan
Dr. Tri Agung Rohmat
21
n dan kemudian menghitung panjang sisi-sisi segitiga ini. 8. Buatlah program untuk mengkonversi hasil pengukuran panjang dalam feet ke (a) yard, (b) inch, (c) centimeter, (d) meter. (1 foot =12 inches, 1 yard = 3 feet, 1 inch = 2.54cm, 1 meter = 100 centimeters)
22
pernyataan-1
pernyataan-2
pernyataan-n
Struktur seleksi Struktur seleksi memungkinkan seleksi dan eksekusi dari blok alternatif dari suatu pernyataan (rumus). Hal ini membuat programmer dapat menentukan titik penentuan untuk melakukan suatu perhitungan selama program berlangsung. Struktur pengulangan Struktur ini memungkinkan pembuatan sebuah loop yaitu blok pernyataan (rumus) yang dieksekusi berulang-ulang. Loop ini dapat diulang-ulang sesuai dengan yang diinginkan.
Dr. Tri Agung Rohmat
23
Pernyataan Logika Suatu pernyataan tidak harus berupa numerik yang menggunakan tanda aritmetik ( +, , , / , ) atau fungsi (SQRT, SIN, dsb) tapi juga dapat berupa logika. Pernyataan logika dapat dituliskan secara sederhana atau gabungan. Bentuk umumnya adalah: expression-1 relational operator expression-2 dimana expression-1 dan expression-2 adalah pernyataan numerik, dan relational-operator adalah salah satu dari yang berikut, Symbol .LT. .GT. .EQ. .LE. .GE. .NE. Meaning lebih kecil dari lebih besar dari sama dengan lebih kecil sama dengan lebih besar sama dengan tidak sama dengan
Titik harus dituliskan di depan dan di belakang simbol-simbol di atas sebagai bagian dari simbol. Contoh, X.LT. 5.2 B 2.GE. 4 A C NUMBER.EQ. 500 Apabila X berharga 4.5 maka pernyataan logika X. LT. 5.2 adalah true (benar). Apabila NUMBER berharga 400, maka pernyataan logika NUMBER . EQ . 500 is false (salah). Ketika menggunakan operator hubungan .EQ. dan .NE., perlu diperhatikan bahwa hampir semua bilangan riil tidak disimpan secara eksak. Sebagai konsekuensinya penggunaan .EQ.
Dr. Tri Agung Rohmat
24
sebagai operator hubungan selalu menghasilkan pernyataan false. Pernyataan logika dapat digabung dengan pernyatan logika lain dengan menggunakan operator logika, .NOT. .AND. .OR. .EQV. .NEQV.
.NOT. P adalah true jika P adalah false .AND. P. AND. Q P. AND. Q adalah true jika P dan Q kedua-duanya adalah true; selain itu false .OR. P. OR. Q P. OR. Q adalah true jika P atau Q atau kedua-duanya adalah true; selain itu false .EQV. P. EQV. Q P. EQV. Q adalah true jika P dan Q keduanya adalah true atau false semuanya; selain itu false .NEQV. P. NEQV. Q P. NEQV. Q adalah kebalikan dari P. EQV. Q
P T T F F
Dr. Tri Agung Rohmat
Q T F T F
P. AND. Q T F F F
P. OR. Q T T T F
P. EQV. Q T F F T
P. NEQV. Q F T T F
25
Pernyataan logika boleh mengandung lebih dari satu operator hubungan atau logika. Misal, apabila X berharga 1.5 maka pernyataan logika X + 1.1. GT. 1.0. AND. . NOT. X. LT. 0.5 atau dengan tambahan kurung untuk memudahkan pembacaan, (X + 1.1. GT. 1.0). AND. . NOT. (X. LT. 0.5) adalah true. Perhatikan bahwa operator logika .NOT., .AND., .OR., .EQV. and .NEQV. beroperasi hanya pada pernyataan logika. Sehingga apabila NUMBER adalah bilangan integer NUMBER.EQ. 1. OR. NUMBER. EQ. 2 adalah valid, tetapi NUMBER. EQ. 1.OR. 2 adalah tidak valid karena 2 bukan suatu pernyataan logika.
Urutan-urutan eksekusi operator 1. Operator hubungan (.GT., .GE., .EQ., .NE., .LT., .LE.) 2. .NOT. 3. .AND. 4. .OR. 5. .EQV. and .NEQV. Tanda kurung dapat dipakai untuk memudahkan pembacaan. Misal, (A. AND. B). OR. C
26
maka yang ada dalam kurung dieksekusi terlebih dahulu. Sehingga pernyataan ini adalah true apabila C adalah true, dan A dan B kedua-duanya adalah true. Pernyataan ini ekuivalen dengan A. AND. B. OR. C sesuai dengan aturan urutan seperti di atas. Dalam pernyataan A. AND. (B.OR. C) maka yang ada dalam kurung dievaluasi terlebih dahulu.
4.2 Struktur Seleksi: Statement Logika IF Struktur seleksi memungkinkan seleksi dari beberapa aksi alternatif tergantung kepada nilai dari suatu pernyataan logika. Struktur seleksi yang paling sederhana ditunjukkan dengan gambar di bawah. Dalam struktur ini statement tunggal dieksekusi atau dilewati tergantung pada pernyataan logika true atau false.
true
logical expression
false
statement
27
Struktur seleksi ini dalam FORTRAN diimplementasikan dengan statement logika IF dalam bentuk IF (logical-expression) statement Apabila ungkapan logika adalah true maka statement di belakangnya akan dieksekusi, kalau flase maka akan dilewati. Statement di belakangnya harus statement yang bisa dieksekusi, tidak boleh statement logika IF yang lain, statement DO atau pernyataan lain yang merupakan bagian struktur blok IF. Yang perlu diperhatikan bahwa pernyataan logika dalam pernyataan logika IF harus masuk dalam kurung.
Sebagai contoh, perhatikan contoh berikut di mana N adalah variabel integer, DISC dan X adalah variabel riil. IF (DISC. GE. 0) DISC = SQRT(DISC) IF (1.5. LE. X. AND. X. LT. 2.5) PRINT *, X
Dalama contoh pertama, nilai DISC dibandingkan dengan 0 untuk menentukan kebenaran dan kesalahan dari pernyataan logika DISC. GE. 0. Apabila pernyataan logikanya benar, pernyataan DISC = SQRT(DISC) dieksekusi; kalau tidak diabaikan (di-bypass). Dalam contoh kedua, apabila 1.5 X < 2.5, nilai dari X ditampilkan; kalau tidak pernyataan
PRINT diabaikan. Untuk setiap pernyataan logika IF, eksekusi berlanjut dengan pernyataan berikutnya tanpa tergantung apakah pernyataan logikanya benar atau salah.
28
true Pernyataan Blok IF lebih fleksibel karena dapat mengeksekusi beberapa pernyataan
statement
logical expression
false
untuk suatu pernyataan logika yang benar. Secara umum dapat dinyatakan sebagai berikut, IF (pernyataan logika) THEN pernyataan -1 pernyataan -2
statement
block
statement
pernyataan -n END IF Apabila pernyataan logika benar, maka seluruh pernyataan antara THEN dan END IF akan dieksekusi. Kalau tidak maka diabaikan.
Pernyataan tipe ini juga dapat untuk mengesekusi beberapa pernyataan lain apabila pernyataan logikanya salah. Bentuk umumnya adalah, IF (pernyataan logika) THEN pernyataan -1 pernyataan -2 blok-1
blok-2
29
pernyataan -m END IF
true
logical expression
false
statement
statement
block-1
statement
statement
block-2
statement
statement
Pada gambar di atas, apabila pernyataan logika benar maka pernyataan-pernyataan pada blok-1 dieksekusi dan kalau tidak maka blok-1 diabaikan dan pernyataan di blok-2 dieksekusi. Contoh, IF ((0. LE. X). AND. (X. LE. 10.0)) THEN Y = SQRT(X) PRINT *, X, Y END IF Dan IF ((0.LE. X). AND. (X. LE. 10.0)) THEN
Dr. Tri Agung Rohmat
30
Y = SQRT(X) PRINT , X, Y ELSE PRINT , 'VALUE', X, ' IS OUT OF RANGE' END IF Contoh ilustrasi lain pernyataan blok IF adalah pada persoalan mencari akar-akar persamaan kuadrat,
Ax 2 + Bx + C = 0
B B 2 4 AC 2A
Akar-akar persamaan riil bisa dicari apabila nilai dalam tanda akar adalah tidak negatif. Algoritma yang harus dibuat adalah, 1. Masukkan A, B, and C. 2. Hitung DISC = B2 4AC 3. Apabila DISC < 0 lakukan yang berikut a. Tampilkan DISC b. Tampilkan pesan apabila tidak ada akar riil. Kalau tidak lakukan yang berikut a. Hitung DISC = SQRT(DISC) b. Hitung ROOT1 = (-B + DISC)/(2 A) c. Hitung ROOT2 = (-B - DISC)/(2A) d. Tampilkan ROOT 1 dan ROOT2 Blok-blok di dalam pernyataan blok IF dapat berisi blok IF yang lain. Pada kasus ini satu
Dr. Tri Agung Rohmat
31
buah blok IF harus sempurna dalam sebuah blok IF yang lain. Sebagai contoh program di atas dapat dikembangkan untuk menunjukkan akar riilnya tunggal atau dua. 1. Masukkan A, B, and C. 2. Hitung DISC = B2 - 4AC 3. Apabila DISC < 0 lakukan berikut: (a) (b) Tampilkan DISC Tampilkan pesan bahwa tidak ada akar-akar riil.
Kalau tidak lakukan beirikut: Apabila DISC = 0 lakukan beirikut: a. Hitung ROOT = -B / (2A) b. Tampilkan ROOT Kalau tidak lakukan berikut a b c d Hitung DISC = SQRT(DISC) Hitung ROOT1 = (-B + DISC)/(2A) Hitung ROOT2 = (-B - DISC)/(2A) Tampilkan ROOT 1 and ROOT2
4.4 Struktur Seleksi Alternatif Banyak: Konstruksi IF-ELSE-IF Pada sub bab sebelumnya hanya dibahas struktur yang memilih satu dari dua alternatif. Untuk menyediakan lebih dari 2 alternatif digunakan konstruksi IF-ELSE IF. Sebagai contoh bayangkan fungsi berikut,
x if x 0 f ( x ) = x 2 if 0 < x < 1 1 if x 1
Bentuk umum dari IF-ELSE-IF adalah sebagai berikut, IF (logical-expression-1) THEN
Dr. Tri Agung Rohmat
32
ELSE block-n END IF Apabila pernyataan logika benar maka blok yang bersangkutan (dibatasi oleh ELSE IF) akan dijalankan. Kalau salah maka pernyataan logika berikutnya akan dinilai salah atau benar. Hal ini terus dilakukan sampai pada komando END IF. Apabila tidak ada satupun pernyataan logika yang benar maka blok yang dijalankan adalah yang setelah komando ELSE. Sehingga untuk menyatakan fungsi seperti di atas maka dibuat program sebagai berikut, IF (X.LE. 0) THEN FVAL = -X ELSE IF (X.LT. 1.0) THEN FVAL = X 2 ELSE FVAL = 1.0 END IF
33
4.5 Struktur Pengulangan: Pernyataan DO dan CONTINUE Struktur pengulangan atau biasa disebut loop memungkinkan pernyataan diulang beberapa kali. Jumlah pengulangan harus dibatasi dalam jumlah tertentu. Bentuk dasar dari struktur pengulangan ada dua, 1. Loop yang dikontrol dengan jumlah tertentu menggunakan pernyataan DO dan CONTINUE. 2. Loop yang dikontrol dengan pernyataan logika menggunakan pernyataan WHILE. Pernyataan DO dan CONTINUE mempunyai bentuk umum sebagai berikut, DO n, variabel kontrol = nilai awal, batas (,selang) statements-1 body statements-k n CONTINUE
Di sini n adalah nomor/alamat baris pernyataan yang membatasi apa yang akan diulang. Nomor ini ditulis pada kolom 25. Nilai awal, batas dan selang adalah bilangan integer atau riil. Yang ada dalam kurung adalah sebuah opsi saja.
Contoh sebuah DO loop dengan selang positif ditunjukkan flow chart di bawah. Di sini variabel kontrol dimulai dengan harga sama dan dilakukan eksekusi terhadap pernyataan-pernyataan yang diapit oleh komando DO dan CONTINUE (loop). Kemudian, variabel kontrol bertambah sebesar selang dan loop dieksekusi lagi. Hal ini dilakukan berulang-ulang sampai variabel kontrol mencapai harga batas. Perhatikan apabila nilai awal lebih besar dari batas maka loop tidak akan dieksekusi. Sebagai contoh,
Dr. Tri Agung Rohmat
34
Apabila selang adalah negatif maka variabel kontrolnya berkurang sampai batas. Contoh, DO 10 NUMBER = 8, 1, -1 PRINT , NUMBER, NUMBER 2 10 CONTINUE
Sebuah DO loop dapat mengandung beberapa DO loop lain. Contoh, DO 20 M = 1, LASTM DO 10 N = 1, LASTN PROD = M N PRINT , M, N, PROD 10 20 CONTINUE CONTINUE
Perhatikan pada contoh di atas bahwa DO loop yang satu dengan yang lain harus
Dr. Tri Agung Rohmat
35
Komando CONTINUE dapat digunakan untuk menutup beberapa DO loop dalam waktu bersamaan. DO 10 M = 1, LASTM DO 10 N = 1, LASTN PROD = M N PRINT , M, N, PROD 10 CONTINUE
Atau, pernyataan terakhir dalam DO loop dapat dipakai untuk menutup DO loop. DO 10 NUMBER = 1, 10 10 PRINT , NUMBER, NUMBER 2
4.6 Struktur Pengulangan WHILE Pada kasus di mana jumlah pengulangan tidak diketahui maka digunakan komando WHILE struktur pengulangannya disebut WHILE loop. Secara umumnya dinyatakan sebagai berikut, WHILE (logical-expression) DO statement-1 statement-2 END WHILE Contohnya, WHILE (SUM . LE . LIMIT) DO NUMBER = NUMBER + 1
Dr. Tri Agung Rohmat
36
SUM = SUM + NUMBER END WHILE Di sini yang perlu diperhatikan bahwa pernyaaan WHILE tidak disediakan oleh compiler FORTRAN standar. Untuk itu digunakan pernyataan GO TO GO TO adalah pernyataan bercabang dengan bentuk umum, GO TO nomor-pernyataan dimana nomor-pernyataan adalah nomor/alamat dari suatu pernyataan. Contoh, n IF (pernyataan-logika) THEN pernyataan-1 pernyataan-2 pernyataan-n GO TO n END IF dalam blok IF. Pernyataan
e x + e x cosh( x) = 2
dengan syarat sebagai berikut, (a) bilangan natural e dihitung dalam sebuah subprogram di mana
x 2 x3 xn e 1+ x + + +L = 2! 3! n =0 n! x
(b) bandingkan nilainya dengan fungsi cosh(x) yang terdapat dalam Fortran!
37
BAB 5 INPUT/OUTPUT
Perintah input atau output mempunyai dua bentuk yaitu bentuk: 1. List seperti pada bab-bab sebelumnya format penulisan ditentukan oleh compiler, dengan konsekuensi user bisa menentukan format. 2. Format tertentu format penulisan bisa lebih fleksibel, pada penggunaan data dengan jumlah besar dapat membaca dari sebuah file. 5.1. Output Dengan Format Tertentu Perintah output dalam FORTRAN dapat dinyatakan dengan menggunakan PRINT atau WRITE. Perintah PRINT adalah lebih simpel dan mempunyai bentuk umum: PRINT format-identifier, output-list Output-list berisi urutan data atau pernyataan yang dipisahkan dengan koma. Format identifier menentukan format penulisan dari output list. Format identifier dapat berupa: 1. Asterik () 2. Nomor label dari suatu baris yang berisi format penulisan Tipe format identifier yang kedua harus dilengkapi dengan perintah FORMAT yang diletakkan pada baris dengan label yang disebutkan pada format identifier. Bentuk umumnya adalah: FORMAT (list of format descriptors) Sebagai contoh untuk mendisplaikan NUMBER yang mempunyai harga 17, dan TEMP yang mempunyai harga 10.25 dengan perintah-perintah: PRINT , NUMBER, TEMP PRINT 20, NUMBER, TEMP
Dr. Tri Agung Rohmat
38
dimana angka 20 menunjuk label, misalnya sebagai berikut: 20 FORMAT (1X, I5, F8.2)
17
10 . 2 5 0 0
17
10 . 2 5
Tabel berikut memberikan beberapa pilihan dalam penentuan format. Yang paling sering digunakan adalah I, F, E, character strings, T, X, and slash (/). Format Descriptor Iw Fw.d Ew.d Dw.d A 'x' Lw nX / Aw nHxx Ew.dEe Iw.m Data integer Data riil untuk notasi desimal Data riil untuk notasi perpangkatan Data presisi dobel Data karakter Strings karakter Data logic Spasi horisontal Spasi vertikal Use
w: konstanta integer positif untuk menentukan jumlah digit yang akan digunakan m: konstanta integer non-negatif untuk menentukan jumlah digit yang akan ditampilkan d: konstanta integer non-negatif untuk menentukan jumlah digit di sebelah kanan tanda desimal e: konstanta integer non-negatif untuk menentukan jumlah digit dalam pangkat x: karakter
Dr. Tri Agung Rohmat
39
Output Integer Notasi I rIw or rIw.m dimana r adalah konstanta untuk pengulangan. Sebagai contoh 3I3 adalah sama dengan I3, I3, I3 Harga integer akan diletakkan dengan digit terakhir pada ujung paling kanan. Sebagai contoh variabel NUM, L, dan KAPPA mempunyai harga-harga: NUM = 3 L = 5378 KAPPA = -12345 maka pernyataan PRINT 30, NUM, NUM-3, L, KAPPA 30 FORMAT (1X, 2I5, I7, I10)
5378
-1 2 3 4 5
dan penyataan: PRINT 31, NUM, NUM-3, L, KAPPA PRINT 32, NUM, NUM-3, L, KAPPA 31 32 FORMAT (1X, 2I5.2, I7, I10.7) FORMAT (1X, 2I5.0, I7, I10)
menghasilkan
40
03 3
00
5378 5378
- 0 01 2 3 4 5 -1 2 3 4 5
Apabila harga integer membutuhkan tempat yang lebih banyak dari yang ditentukan dalam FORMAT maka akan keluar sebagai asterik.
PRINT 40, NUM, NUM-3, L, KAPPA 40 FORMAT(lX, 4I3)
menghasilkan
0 ******
Harga riil dituliskan dengan dipojokkan ke kanan. Dengan penunjukkan Fw.d, apabila harga riil mempunyai digit desimal lebih besar dari d maka desimalnya dibulatkan ke digit
d. Kalau lebih kecil dibanding d digit maka posisi sisanya diisi dengan nol. Secara umum,
angka kurang dari 1 maka akan ditampilkan dengan nol (misalnya 0.123 dari pada .123). Sebagai contoh, untuk menampilkan. Sebagai contoh untuk menampilkan variabel-variabel dengan nilai seperti di bawah,
IN = 625 OUT = -19 A = 7.5 B = .182 C = 625.327
41
6 2 5 - 1 9 7 . 5 0 0 0 .1 8 2 6 2 5 . 3 2 7
Untuk menyediakan spasi lebih di antara angka-angka dan untuk membulatkan ke nilai sebenarnya digunakan,
50 FORMAT(1X, 2I10, 3F10.2)
Hal ini akan menampilkan tiap angka ditempatkan pada pojok kanan tempat yang telah disediakan,
625
-19
7.5 0
0 .1 8
6 2 5.33
Sebagaimana pada notasi I, maka apabila angka yang akan ditampilkan membutuhkan tempat yang lebih banyak dari yang disediakan maka akan ditampilkan dengan asteriks. Sebagai pedoman untuk notasi Fw.d, harus dipenuhi syarat
w d +3
Data riil dapat ditampilkan dengan notasi pangkat dengan bentuk umum:
rEw.d
atau
rEw.dEe
Di sini nilai real biasanya ditampilkan dengan urutan tanda negatif (kosong kalau positif), angka nol, titik, angka desimal sebanyak d digit, huruf E untuk tanda pangkat, tanda positif/negatif, dan pangkat. Sebagai contoh apabila variabel-variabel mempunyai nilai seperti di bawah,
42
pernyataan
PRINT 60, A, B, C, D 60 FORMAT (1X, 2E15.5, 2E15.4)
0 .1 2 3 4 5 E + 0 8
0 . 2 3 7 0 0 E - 01
0 . 4 6 0 0 E - 11
- 0 . 7 617 E + 1 4
Output Karakter Konstanta karakter dapat didisplaikan dalam format identifier. Misalnya
menghasilkan output
X =
0.30 Y =
7.9 0
Data karakter dapat ditampilkan dengan menggunakan notasi A dengan bentuk umum
rA
atau
rAw
43
Untuk bentuk pertama, jumlah digit yang akan dipakai ditentukan oleh jumlah karakter yang akan ditampilkan. Untuk bentuk kedua, apabila jumlah digit yang akan dipakai melebihi jumlah karakter yang akan ditampilkan maka data karakter akan ditampilkan mulai pojok kanan. Tetapi apabila lebih sedikit maka akan ditampilkan mulai pojok kiri. Sebagai contoh, output seprti diatas juga dapat dihasilkan dari,
PRINT 71, 'X =', X, 'Y =', Y 71 FORMAT (1X, A, F6.2, A, F6.2)
Penentu Posisi - X X berfungsi untuk menyediakan spasi pada sebuah baris dan mempunyai bentuk umum, nX
Sebagai ilustrasi, anggap NUMBER adalah variabel integer dan pikirkan pernyataan di bawah,
PRINT 75, 'JOHN Q.DOE', 'CPSC', NUMBER
atau
75 FORMAT (1X, A11, T16, A4, 2X, I3)
Apabila NUMBER mempunyai nilai 141, maka output yang dihasilkan adalah
J O H N Q.D O E
Notasi Slash (/).
CPSC
1 41
Output dapat dinyatakan dalam beberapa baris dengan menggunakan tanda slash (/). Tanda / membuat pergantian baris dan dapat diulang beberapa kali. Tidak diperlukan koma
Dr. Tri Agung Rohmat
44
(Perhatikan tanda 1X yang mengikuti / mengindikasikan karakter pengontrol untuk tiap baris baru.). Apabila nilai dari N, A, M. B, C, dan D adalah
N = 5173 A = 617.2 M = 7623 B = 29.25 C = 37.555 D = 5.2813
51 7 3
617 . 2 0
7623
29.25
0.37 555 0 0 E + 0 2
Dr. Tri Agung Rohmat
0 . 5 2 813 0 0 E + 01
45
Pada bagian sebelumnya bahwa input dapat dihasilkan dengan menggunakan pernyataan
READ. Pernyataan READ mempunyai dua bentuk dimana bentuk paling sederhana adalah READ format-identifier, input-list Input-list adalah variabel tunggal atau deretan variabel yang dipisahkan dengan koma. Format-identifier menentukan format nilai untuk setiap input. Seperti halnya pada kasus
untuk output maka format identifier dapat berupa: 1. Asterik () 2. Nomor label dari suatu baris yang berisi format penulisan. 3. Notasi END = Di sini format identifier yang paling sering digunakan untuk input adalah asterik () karena merupakan memberikan keleluasaan untuk memberikan format pada yang akan diinputkan. Penggunaan format identifier yang kedua sama persis dengan yang digunakan pada output yaitu kemudian menambahkan pernyataan FORMAT dengan label sesuai format
identifier. 5.3 Pernyataan WRITE dan Pernyataan READ Umum
Perintah output (PRINT) dan perintah (READ) yang digunakan di atas adalah dalam bentuk paling sederhana yang hanya dapat digunakan menampilkan data di monitor atau membaca data dari keyboard. Untuk menyimpan data digunakan pernyataan WRITE dan untuk membaca data dari disket atau hard disk digunakan READ juga tetapi dengan bentuk yang lebih kompleks.
Pernyataan WRITE
46
di mana output-list mempunyai bentuk yang sama dengan yang digunakan pada PRINT, sedangkan control-list bisa mengandung hal-hal berikut, 1. 2. 3.
Unit-specifier (nomor unit) yang menunjukkan nomor peralatan output. Format specifier seperti pada bagian sebelumnya.
Nomor unit adalah angka integer atau asterik yang mempunyai bentuk umum,
UNIT = unit-specifier.
atau singkatnya
format-identifier
dimana format-identifier adalah sama bentuknya dengan yang dipakai pada pernyataan
PRINT.
Sebagai contoh, nilai dari variabel GRAV dan WEIGHT akan ditampilkan pada peralatan output yang bernomor 6. Pernyataan,
WRITE (6, ) GRAV, WEIGHT
47
WRITE (NOUT, ) GRAV, WEIGHT WRITE (UNIT = NOUT, FMT = ) GRAV, WEIGHT
dimana NOUT adalah variabel integer yang sebelumnya telah didefiniskan sebagai 6. Apabila nomor 6 adalah peralatan standar dari sistem FORTRAN (biasanya adalah monitor) maka angka 6 dapat digantikan dengan asterik.
WRITE (, ) GRAV, WEIGHT
Output berformat dari nilai-nilai ini dapat dihasilkan sari pernyataan sebagai berikut,
WRITE (6, 30) GRAV, WEIGHT 30 FORMAT (1X, 2F10.2) WRITE (UNIT = 6, FMT = 30) GRAV, WEIGHT 30 FORMAT (1X, 2F10.2)
48
Informasi disimpan dalam disket/hardisk dalam bentuk file. Data pada setiap baris dalam sebuah file yang akan dipanggil (diinputkan) harus mempunyai format yang sama dengan apa yang dikehendaki dalam pernyataan READ. Sebagai contoh, apabila nilai dalam file akan dipanggil dengan format:
10 FORMAT (I3, F5.1, F5.2)
maka data yang tertulis dalam file harus berbentuk, 37 22 1 78 77.5 85.3 100.0 99.5 30.39 30.72 29.95 29.01
cocok untuk data yang tertulis sebagai berikut, 37 22 1 78 7753039 8533072 10002995 9952901
Pembukaan File.
Sebelum pembacaan data atau penulisan data dilakukan maka file yang berisi data harus dibuka terlebih dahulu dengan menggunakan pernyataan OPEN dengan bentuk umum,
OPEN (open-list)
49
dimana open-list mengandung, 1. Notasi UNIT= yang diikuti nomor unit peralatan input/output yang akan dibuka yang nilainya sama dengan apa yang ada pada pernyataan READ atau WRITE. Notasi UNIT= dapat dihilangkan dengan hanya menuliskan nomor unit. 2. Notasi FILE = yang diikuti oleh nama file mana yang akan dibuka. 3. Notasi STATUS baru atau lama.
OLD berarti file yang akan dibuka sudah ada. NEW berarti file yang akan dibuka belum
ada dan akan dibuat dengan eksekusi pernyataan OPEN. Setelah penulisan data atau pembacaan data selesai maka file perlu ditutup dengan menggunakan pernyataan CLOSE. Bentuk umumnya adalah,
CLOSE (close-list)
dimana close-list adalah nomor unit peralatan input/output. Secara umum penutupan file ini diperlukan apabila file yang bersangkutan akan dibuka lagi dengan menggunakan nomor unit peralatan yang sama. Kalau tidak maka file akan ditutup dengan sendirinya oleh pernyataan STOP atau END. Apabila file tidak ditutup di tengah-tengah program maka pernyataan READ atau WRITE yang menggunakan file yang sama tidak perlu menggunakan pernyataan OPEN lagi dan penulisan/pemanggilan data akan diteruskan pada baris setelah baris terakhir yang ditulisi/dibaca oleh pernyataan READ atau WRITE yang sebelumnya. Sebagai contoh untuk memberikan nilai pada variabel CODE, TEMP, dan PRESS dengan membaca data pada file yang bernama INFO, pernyataan
50
akan membaca data CODE, TEMP, dan PRESS pada file INFO. Dengan cara yang mirip maka nilai dari variabel CODE, TEMP, dan PRESS dapat dituliskan pada file bernama REPORT dengan cara,
OPEN (UNIT = 13, FILE = 'REPORT', STATUS = 'NEW') WRITE (13, 30), CODE, TEMP, PRESS 30 FORMAT(1X, I3, F7.0, F10.2) Notasi END =
Notasi ini digunakan pada pernyataan READ untuk mengontrol apabila data yang akan dibaca sudah habis. Bentuk umumnya adalah,
END = statement-number
dimana statement-number adalah label/nomor alamat baris yang akan dieksekusi berikutnya apabila datanya telah habis terbaca. Sebagai contoh,
READ (12, , END = 50) CODE, TEMP, PRESS
dapat dipakai untuk membaca data CODE, TEMP, and PRESS dari sebuah file. Apabila datanya sudah habis terbaca maka kemudian lompat ke baris yang mempunyai label 50 yang mungkin untuk menghitung temperatur rata-rata:
50 TMEAN = TSUM / COUNT
51
Variabel array adalah sekumpulan data bertipe sama dengan jumlah tertentu yang disusun secara berurutan sehingga dapat diakses secara langsung pada suatu operasi dengan menunjuk posisi urutannya. Posisi urutan ini selanjutnya disebut sebagai subscript atau indeks. Sehingga apabila X adalah variabel array, variabel berindeks X(3) menunjuk kepada elemen ketiga dari array X. Sebagai contoh, apabila akan diproses 12 nilai polutan, kita dapat menggunakan array untuk menyimpan data ini. Komputer harus diinstruksikan untuk memesan lokasi untuk 12 nilai tersebut dengan menggunakan komando DIMENSION. Contoh,
DIMENSION POLLUT(12) INTEGER POLLUT
komando-komando di atas mendefinisikan array dengan nama POLLUT yang mempunyai 12 tempat di memori dan berjenis integer. Array ini bersesuaian dengan variabel berindeks sebagai berikut
POLLUT(1) POLLUT(2)
M
Dr. Tri Agung Rohmat
52
POLLUT(12)
Setiap variabel berindeks POLLUT(1), POLLUT(2), , POLLUT(12) mempunyai lokasi memori sendiri-sendiri sehingga dapat diakses sebagaimana variabel sederhana. Misalnya penunjukkan
POLLUT(4) = 57
akan menimpan nilai 57 pada lokasi keempat dari array POLLUT. Komando output
PRINT , POLLUT(10)
akan menampilkan nilai yang disimpan pada lokasi kesepuluh dari array POLLUT. Untuk menunjukkan lokasi memori keberapa dari suatu array dapat digunakan konstanta, variabel, pernyataan (rumus) yang berjenis integer. Contoh,
IF (POLLUT(N).GT. 90) PRINT , POLLUT(N), 'HAZARDOUS'
akan mengambil nilai ke N dari array POLLUT, dibandingkan dengan 90, dan kemudian ditampilkan pesan HAZARDOUS apabila nilainya lebih besar dari 90. Blok IF
IF (POLLUT(I).GT. POLLUT(I + 1)) THEN TEMP = POLLUT(I) POLLUT(I) = POLLUT(I + 1) POLLUT(I + 1) = TEMP END IF
menukar nilai POLLUT(I) dengan POLLUT(I+1) dan sebaliknya apabila yang pertama lebih besar dari yang kedua.
53
Menggunakan array yang indeksnya adalah variabel dalam sebuah DO-loop dan indeks tersebut berubah sesuai dengan jalannya DO-loop sangat praktis mengolah setiap komponen array. Contoh,
DO 10 I = 1, 12 IF (POLLUT(I).GE. 90) PRINT , POLLUT(I), 'HAZARDOUS' 10 CONTINUE
memanggil setiap komponen array POLLUT secara berurutan, dimulai dari POLLUT(1) yang dibandingkan dengan 90 dan menampilkan HAZARDOUS apabila sama atau lebih besar. Hasilnya adalah sama dengan menulis 12 pernyataan yang membandingkan setiap komponen array POLLUT dengan 90:
IF (POLLUT(1). GE. 90) PRINT , POLLUT(1), 'HAZARDOUS' IF (POLLUT(2). GE. 90) PRINT , POLLUT(2), 'HAZARDOUS' IF (POLLUT(3). GE. 90) PRINT , POLLUT(3), 'HAZARDOUS'
M
IF (POLLUT(12). GE. 90) PRINT , POLLUT(12), ' HAZARDOUS' Array POLLUT seperti di atas disebut sebagai array satu dimensi. Di bab berikutnya
dibahas array dengan multi dimensi. Nama dan panjang dari suatu dimensi (dalam hal ini dimensi satu) dapat dideklarasikan dalam pernyataan DIMENSION
DIMENSION list
di mana u adalah panjang dari dimensi dengan indeks paling kecil adalah satu.
Dr. Tri Agung Rohmat
54
Pernyataan DIMENSION dapay digunakan untuk mendeklarasikan array lebih dari satu.
DIMENSION POLLUT(12), POINT(20) INTEGER POLLUT REAL POINT
Deklarasi array langsung dapat dilakukan dengan menggunakan komando INTEGER atau
REAL INTEGER GAMMA(3), DELTA(5) REAL KAPPA(10)
Ada tiga cara untuk membaca atau menampilkan array: 1. Menggunakan DO-loop yang mengandung pernyataan input/output. 2. Menggunakan nama array dalam pernyataan input/output. 3. Menggunakan implied DO-loop dalam pernyataan input/output.
Seperti pada sub bab sebelumnya, untuk memproses setiap komponen dari sebuah array dapat menggunakan DO-loop di mana indeks array berubah sesuai dengan jalannya
DO-loop. Untuk membaca atau menampilkan komponen array seseorang dapat dengan
55
dapat digunakan.
REAL VELOC(10) INTEGER I DO 10 I = 1,10 READ , VELOC(I) 10 CONTINUE
Ingat komando READ di sini membutuhkan pembacaan data perbaris. Panjang dimensi dari suatu array dapat lebih panjang dari yang digunakan. Contoh
REAL VELOC(50) INTEGER NUMVEL, I PRINT , 'ENTER NUMBER OF VELOCITIES' READ , NUMVEL
Untuk output.
DO 10 I = 1, NUMVEL READ , VELOC(I) 10 CONTINUE
yang mengandung nama array tanpa indeks. Hasilnya sama dengan kalau mencantumkan semua komponen array dalam pernyataan input/ouput. Contoh,
REAL VELOC(10) READ , VELOC
56
Di sini pembacaan data tidak harus dilakukan perbaris, yaitu dapat dilakukan secara bebas asal jumlahnya mencukupi sesuai dengan panjang dimensi array. Perkecualian apabila pembacaan data dilakukan dengan menggunakan suatu format tertentu misal FORMAT
(5F6.1). Menggunakan Implied DO-loop. Metode ini merupakan metode yang paling fleksibel
(i/o-list, control-variable = initial value, limit) or (i/o-list, control-variable = initial value, limit, step-size) Hasil dari sebuah implied DO-loop adalah sama persis dengan DO-loop biasa apabila kurung sebelah kiri diganti dengan dengan DO dan control-variable seperti tertulis setelah daftar input/output. Implied DO-loop dapat digunakan bersama-sama dengan pernyataan
READ, PRINT, or WRITE. Contoh, apabila array VELOC dideklarasikan dengan REAL VELOC(50)
atau apabila kita ingin membaca data sebanyak NUMVEL komponen maka digunakan
57
Sebelum membahas pernyataan PARAMETER dan DATA, perlu ditekankan bahwa di dalam pembuatan program sangat dianjurkan untuk menghindari magic number seperti pada pernyataan berikut,
CHANGE = (.1758 - .1257) POPUL
Pernyataan di atas mengandung konstanta yang tidak ada penjelasannya sehingga sulit untuk dimengerti dan terbatas penggunaannya. Lebih baik menggunakan pernyataan sebagai berikut,
CHANGE = (BIRTH - DEATH) POPUL
yang jauh lebih fleksibel dalam pembacaan parameter. Pernyataan PARAMETER digunakan untuk mendefinisikan parameter, yaitu konstanta yang mempunyai nama yang berfungsi sama seperti konstanta biasa. Pernyataan
PARAMETER merupakakan pernyataan yang tidak dieksekusi, tetapi hanya bersifat
di mana p1, , pn adalah nama parameter dan c1, , cn adalah konstanta atau pernyataan yang hanya berisi konstanta atau parameter yang telah didefinisikan sebelumnya. Contoh,
REAL PI PARAMETER (PI = 3.1416)
58
Penggunaan PARAMETER yang paling sering adalah pada pendefinisian dimensi suatu
array. Contoh, PARAMETER (NI = 100) REAL TEMP(NI)
Pernyataan DATA digunakan untuk menghubungkan sebuah nama dengan sebuah nilai. Tetapi berbeda dengan PARAMETER, maka pernyataan DATA merepresentasikan sebuah variabel daripada konstanta bernama. DATA mempunyai bentuk umum,
DATA list1/data1/, list1/data1/, , listk/datak/
di mana setiap listi adalah daftar nama variabel yang dibatasi dengan koma, dan setiap
datai adalah daftar konstanta yang dihubungkan dengan daftar nama variabel listi. Sebagai
contoh untuk menetapkan variabel W, X, Y, dan Z masing-masing sebagai 1,0, 2.5, 7.73, dan -2.956, maka digunakan pernyataan berikut,
REAL W, X, Y, Z DATA W, X, Y, Z / 1.0, 2.5, 7.73, -2.956/
Variabel sebanyak n buah dapat diberi nilai dengan nilai yang sama dengan menuliskan n* di depan nilai yang akan diberikan. Di sini n adalah konstanta integer atau parameter. Sebagai contoh, untuk memberikan nilai 1,2 pada ZETA, 3 pada M dan N, 3,14 pada A, B, C, dan D maka digunakan pernyataan berikut,
Dr. Tri Agung Rohmat
59
program.
Implied DO-loop dapat digunakan dalam pernyataan DATA. Sebagai contoh untuk
memberikan nilai 10 kepada N, dan 0.0 pada lima komponen pertama dari array ALPHA, maka dapat digunakan,
INTEGER N, I REAL ALPHA(10) DATA N, (ALPHA(I), I = 1, 5) /10, 50.0/
2. File dengan nama nilai.txt berisi 1.34 3.37 5.61 7.86 8.98 167.56 110.25 63.04 25.92 1.15
dimana kolom pertama menunjukkan harga x dan kolom kedua menunjukkan harga f(x). Buatlah program untuk menginterpolasi secara linear nilai f(x) pada suatu x sesuai dengan data di atas dengan syarat-syarat sebagai berikut, (a) harga xi dan f(xi) dalam nilai.txt di atas dibaca dengan perintah READ (b) harga x dimana harga f(x) akan dicari di-inputkan (c) diketahui interpolasi linear:
Dr. Tri Agung Rohmat
60
f ( x ) = f ( xi ) +
f ( xi +1 ) f ( xi ) ( x xi ) xi +1 xi
61
Banyak kasus di mana data dapat disusun sebagai table. Sebagai contoh, temperature air yang diukur 4 kali sehari masing-masing pada 3 lokasi keluaran system pendingin pada suatu reactor nuklir. Data seperti ini kalau disusun dengan waktu sebagai baris, dan lokasi sebagai kolom, maka didapatkan tabulasi seperti berikut.
Time Location 1 2 3
1 2 3 4
Di tabel ini data 68.7 adalah data yang tercatat pada waktu 1 di lokasi 2. Ke 12 data ini dapat dimasukkan ke array dua dimensi dengan mendeklarasikan sebagai berikut,
DIMENSION TEMTAB(4,3) REAL TEMTAB
Pernyataan di atas memesan 12 (hasil dari 4 kali 3) tempat di memori yang akan dipakai oleh array TEMTAB. Cara lain adalah seperti berikut,
REAL TEMTAB(4,3)
62
akan menyatakan data pada baris kedua kolom ketiga, yaitu 64.5 yang merupakan temperatur pada waktu 2 dan lokasi 3. Perhatikan secara konvensi, angka yang di depan menunjukkan baris dan yang di belakang menunjukkan kolom, atau secara umum dapat dinyatakan,
TEMTAB(I,J)
di mana I adalah baris, dan J adalah kolom. Apabila data temperatur yang diambil selama seminggu maka di sini timbul dimensi minggu. Oleh karena itu array perlu dibuat menjadi tiga dimensi dengan mendeklarasikan seperti berikut,
DIMENSION TEMP(4,3,7) REAL TEMP
atau
REAL TEMP(4,3,7)
Pada kasus ini maka array TEMP membutuhkan memori sebanyak 84 (4x3x7). Variabel dengan 3 indeks,
TEMP(1,3,2)
adalah data temperatur pada waktu 1, lokasi 3, dan hari 2. Secara umum,
TEMP(I,J,K)
adalah temperatur dengan baris ke I, kolom ke J, dan rank ke K. Sebagaimana halnya deklarasi variabel biasa maka deklarasi beberapa array dapat
63
atau
REAL GAMMA(2, 3), BETA(2, 3, 2) INTEGER KAPPA(7) 7.2 Pemrosesan Array Multi Dimensi
Seperti telah dijelaskan pada isub bab berikutnya, dengan menunjuk komponen array (dengan menentukan indeks dari masing-masing dimensi) maka dimungkinkan akses langsung. Pemrosesan array multi dimensi pada dasarnya adalah sama dengan array satu dimensi yaitu dari komponen paling awal sampai komponen paling akhir (atau sebaliknya). Perbedaannya adalah pada array multi dimensi harus ditentukan pada dimensi mana akan dimulai pemrosesan. Pemrosesan array multi dimensi dapat dilakukan secara rowwise atau columnwise. Proses secara rowwise adalah proses baris per baris, sedang proses secara columnwise adalah proses kolom per kolom. Dalam FORTRAN, apabila tidak didefinisikan maka akan
dilakukan proses secara columnwise. Secara prakteknya, pemilihan proses dilakukan
dengan mengontrol indeks array. Sebagai ilustrasi, kita ambil contoh data temperatur seperti tersebut di atas.
64
Time
Location 1 2 3
1 2 3 4
Andaikan kedua belas data di atas akan dibaca dan disimpan sebagai array dua dimensi dengan panjang 4x3 yang dideklarasikan sebagai,
REAL TEMTAB(4,3)
Apabila ke dua belas data akan dimasukkan dengan urutan 65.5, 68.7, 62.0, 68.8, 68.9, 64.5, 70.4, 69.4, 66.3, 68.5, 69.1, 65.8, maka dibutuhkan proses rowwise. Pertama-tama kita harus membaca 3 data pada waktu 1, atau dengan kata lain membaca data pada baris pertama dan disimpan pada baris pertama TEMTAB. Baris 1 TEMTAB: 65.5 68.7 62. 0
Setelah ketiga data ini dibaca, maka harus dimasukkan 3 data berikutnya pada waktu 2 dan disimpan pada baris kedua TEMTAB. Baris 2 TEMTAB: 68.8 68.9 64.5
Selanjutnya kita memasukkan 3 data berikutnya pada waktu 3 dan disimpan pada baris ketiga TEMTAB. Baris 3 TEMTAB: 70.4 69.4 66.3
65
Dan akhirnya kita memasukkan 3 data berikutnya pada waktu 4 dan disimpan pada baris keempat TEMTAB. Baris 3 TEMTAB: 68.5
65.5 68.8 70.4 68.5
Di lain pihak, apabila data temperatur ingin dimasukkan dengan urutan 65.5, 68.8 70.4, 68.5, 68.7, 68.9, 69.4, 69.1, 62.0, 64.5, 66.3, 65.8, maka dibutuhkan proses columnwise. Pertama-tama kita harus membaca 4 data pada lokasi 1, atau dengan kata lain membaca data pada kolom pertama dan disimpan pada kolom pertama TEMTAB. Kolom 1 TEMTAB: 65.5 68.8 70.4 68.5 Setelah keempat data ini dibaca, maka harus dimasukkan 4 data berikutnya pada lokasi 2 dan disimpan pada kolom kedua TEMTAB. Kolom 2 TEMTAB: 68.7 68.9 69.4 69.1 Dan akhirnya kita memasukkan 4 data berikutnya pada lokasi 3 dan disimpan pada kolom ketiga TEMTAB.
Dr. Tri Agung Rohmat
66
Kolom 3 TEMTAB: 62.0 64.5 66.3 65.8 Dari hal-hal di atas kita ketahui, (a) dalam proses rowwise, indeks pertama berubah terlebih dahulu dan diikuti indeks kedua, atau dengan kata lain indeks kedua bervariasi pada suatu indeks pertama tertentu. (b) dalam proses columnwise, indeks kedua berubah terlebih dahulu dan diikuti indeks pertama, atau dengan kata lain indeks pertama bervariasi pada suatu indeks kedua tertentu. Untuk array tiga dimensi maka pada prinsipnya adalah sama, yaitu suatu indeks bervariasi pada kondisi indeks-indeks yang lain tetap. Proses input atau output data array multi dimensi dilakukan sama persis seperti satu dimensi menggunakan, 1. Menggunakan DO-loop yang mengandung pernyataan input/output. 2. Menggunakan nama array dalam pernyataan input/output. 3. Menggunakan implied DO-loop dalam pernyataan input/output. Yang perlu diperhatikan adalah menentukan urutan perubahan indeks yang kita inginkan.
Input/Output Menggunakan DO-loop.
Dengan metode ini pernyataan input/output diletakkan dalam suatu satuan DO-loop, di mana masing-masing DO-loop mengontrol perubahan suatu indeks. Sebagai contoh, array TEMTAB(4,3) mempunyai nilai,
Dr. Tri Agung Rohmat
Di sini, pada waktu DO-loop luar menset TIME sama dengan 1, maka DO-loop dalam akan memvariasikan LOC dari 1 sampai 3. Hasilnya akan sama dengan
pernyataan-pernyataan berikut,
DO 10 LOC = 1, 3 READ , TEMTAB(1,LOC) 10 CONTINUE
sehingga 3 nilai pada kolom pertama harus dimasukkan dan dilakukan baris per baris (nilai
nilai nilai ).
68
Setelah selesai membaca ketiga data di atas, maka DO-loop luar menset TIME sama dengan 2, yang diikuti DO-loop dalam akan memvariasikan LOC dari 1 sampai 3. Hasilnya akan sama dengan pernyataan-pernyataan berikut,
DO 10 LOC = 1, 3 READ , TEMTAB(2,LOC) 11 CONTINUE
Hal ini akan berlangsung sampai indeks dari DO-loop luar selesai berputar. Input secara columnwise dapat dilakukan dengan menukar urutan DO-loopnya.
DO 20 LOC = 1, 3 DO 10 TIME = 1, 4 READ , TEMTAB(TIME,LOC) 10 CONTINUE
20 CONTINUE
69
READ , TEMTAB(2,2) READ , TEMTAB(3,2) READ , TEMTAB(4,2) READ , TEMTAB(1,3) READ , TEMTAB(2,3) READ , TEMTAB(3,3) READ , TEMTAB(4,3)
Karena READ dieksekusi sebanyak 12 kali maka data harus dimasukkan sebanyak 12 kali pula atau baris per baris (segera setelah menuliskan nilai kemudian langsung . 65.5 68.8 70.4 68.5 68.7 68.9 69.4 69.1 62.0 64.5 66.3 65.8 Hal-hal di atas juga akan timbul untuk suatu proses output. Di sini yang perlu diperhatikan kalau panjang dari dimensi suatu array cukup panjang maka akan mempersulit input/output sehingga dapat menimbulkan kesalahan terutama dalam pemasukan data.
70
Seperti telah dibahas pada sub bab sebelumnya, metode ini tidak dapat melakukan input atau output dari sebagian komponen suatu array. Kelemahan lain dari metode ini adalah kita tidak dapat menentukan urutan pemasukan/penampilan data karena secara otomatis akan diproses secara columnwise. Sebagai contoh,
INTEGER MAT(3,4) READ , MAT
apabil dimasukkan data sebagai berikut 77, 56, 32, 25, 99, 10 100, 46, 48, 89, 77, 33 maka nilai dari MAT adalah
77 25 100 99 56 99 46 77 32 10 48 33 Kalau ingin membuat matriks seperti di atas maka TIDAK BOLEH memasukkan data seperti berikut, 77, 25, 100, 99, 56, 99 46, 77, 32, 10, 48, 33
Input/Output Menggunakan Implied DO-loop
Seperti pada sub bab berikutnya, implied DO-loop mempunyai bentuk umum (i/o-list, control-variable = initial-value, limit) atau (i/o-list, control-variable = initial-value, limit, step-size) Metode ini merupakan metode yang paling praktis dalam input atau output array multi
Dr. Tri Agung Rohmat
71
sehingga akan membaca input secara rowwise. Perhatikan karena pernyataan READ hanya timbul satu kali maka data yang akan dibaca bisa dimasukkan semuanya pada satu baris, atau 4 data perbaris sebanyak 3 baris, dan lainnya asal jumlahnya tidak kurang. Dengan menukar informasi counter DO-loop maka memasukkan data secara columnwise juga memungkinkan. Sehingga
READ , ((MAT(ROW,COL), ROW = 1, 3), COL = 1, 4)
or
READ , MAT(1,1), MAT(2,1), MAT(3,1), + + + MAT(1,2), MAT(2,2), MAT(3,2), MAT(1,3), MAT(2,3), MAT(3,3), MAT(1,4), MAT(2,4), MAT(3,4)
Dengan cara yang sama kita juga melakukan input atau output untuk array tiga dimensi.
Dr. Tri Agung Rohmat
72
Seperti
READ , (((B(I,J,K), I = 1, 2), J = 1, 4), K = 1, 3)
Perhatikan penggunaan dari tanda kurung dan koma. Mereka harus digunakan persis seperti yang ditunjukkan. Setiap implied DO-loop harus dalam tanda kurung, dan koma memisahkan informasi counter dari masing-masing DO-loop. Keuntungan dari metode implied DO-loop adalah kita dapat memasukkan data atau menampilkan hasil sesuai dengan baris dan kolomnya sehingga menghindarkan dari kesalahan urutan pemasukan data atau interpretasi data.
1. Buatlah program untuk menginput 2 buah matriks dan melakukan perkalian antara keduanya dengan syarat sebagai berikut, (a) dilakukan pengecekan apakah kedua matriks dapat dilakukan perkalian (b) tampilkan kedua matriks asalnya dan matriks hasil perkalian. 2. Pada sebuah pabrik elektronik, pembuatan barang-barang membutuhkan komponen-komponen sebagai berikut: Jenis A B C D Jumlah Komponen 1 10 7 4 3 2 4 0 9 2 3 5 12 5 1 4 6 1 0 5 5 7 3 8 6
Harga Komponen 1 =Rp. 100.000, Komponen 2 =Rp. 75.000, Komponen 3 =Rp. 150.000, Komponen 4 =Rp. 120.000, Komponen 5 =Rp. 50.000.
73
3. Sebuah perusahaan otomotif memproduksi model kendaraan sebanyak 6. Masing-masing model mempunyai karakteristik kebisingan yang berbeda-beda tergantung kepada kecepatan seperti berikut:
74
Model A B C D E F
Kecepatan (mph) 20 88 75 80 68 77 81 30 90 77 83 71 84 85 40 94 80 85 76 91 90 50 102 86 94 85 98 96 60 111 94 100 96 105 102 70 122 103 111 110 112 109 80 134 113 121 125 119 120
Tulislah program yang menampilkan tabel di atas dengan format yang bagus, hitung dan tampilkan (a) level kebisingan rata-rata untuk setiap model kendaraan, (b) level kebisingan rata-rata untuk setiap kecepatan, (c) level kebisingan rata-rata untuk semua kondisi.
75
kemudian digabung menjadi satu sehingga menghasilkan penyelesaian yang komprehensif. Dalam FORTRAN subprogram ini berbentuk sebuah fungsi atau sbuah subrouotine. Keuntungan lain dari penggunaan sebuah subprogram adalah ketidakterikatannya dengan
subprogram yang lain sehingga dapat dites secara sendiri-sendiri tanpa khawatir
mempengaruhi atau dipengaruhi oleh subprogram yang lain. Hal lain adalah dapat dengan mudah menentukan logical-error yang terjadi. Sebuah program besar yang dibagi menjadi beberapa subprogram akan menjadi lebih mudah untuk dipahami karena setiap
subprogram berdiri sendiri.
Dalam FORTRAN ada fungsi-fungsi standar yang tersedia dalam librarynya. Tabel berikut menunjukkan fungsi-fungsi standar tersebut.
Fungsi
ABS(x) ACOS(x) AINT(x) ANINT(x) ASIN(x) Harga absolut x Arccosine x (dalam radians) Hasil dari pemotongan fraksi desimal dr x x dibulatkan ke integer terdekat Arcsine (dalam radian) dari x
Arti
Jenis Argumen
I, R, DP, (C) R, DP R, DP R. DP R. DP
Hasil Fungsi
Sama dg argumen (R) Sama dg argumen Sama dg argumen Sama dg argumen Sama dg argumen
76
R, DP R, DP R, DP, C R, DP I, R, DP, C I, R, DP R, DP, C I, R, DP, C R, DP, C R, DP I, R, DP I, R, DP I, R, DP R, DP I, R, DP, C R, DP, C R, DP R, DP, C R, DP R, DP Sama dg argumen Sama dg argumen Sama dg argumen Sama dg argumen DP Sama dg argumen Sama dg argumen I Sama dg argumen Sama dg argumen Sama dg argumen Sama dg argumen Sama dg argumen I R Sama dg argumen Sama dg argumen Sama dg argumen Sama dg argumen Sama dg argumen
ATAN(x) ATAN2(x,y) COS(x) COSH(x) DBLE(x) DIM(x,y) EXP(x) INT(x) LOG(x) LOG10(x)
Arctangent (dalam radian) dari x Arctangent (dalam radian) dari x/y Cosinus x (dalam radian) Hyperbolic cosine x (dlm radian) Konversi x ke dobel presisi x y if x y, 0 if x< y Fungsi eksponensial ex Konversi x ke integer Logaritma natural x Logaritma basis 10 x
MAX(x1xn) Nilai maksimum dari x1xn MIN(x1xn) MOD(x,y) NINT(x) REAL(x) SIN(x) SINH(x) SQRT(X) TAN(x) TANH(x) Nilai minimum dari x1xn x INT(x/y)y x dibulatkan ke integer terdekat Konversi x ke riil Sine dari x (dalam radian) Hyperbolic sine dari x (dalam radian) Akar kuadrat x Tangent x (dalam radian) Hyperbolic tangent x (dlm radian)
Seperti pernah kita lihat, untuk menggunakan fungsi-fungsi ini dituliskan nama fungsi yang diikuti oleh argument yang ditulis dalam tanda kurung. Sebagai contoh, apabila ALPHA, NUM1, NUM2, SMALL, BETA, dan X dideklarasikan oleh
INTEGER ALPHA, NUM1, NUM2, SMALL
Dr. Tri Agung Rohmat
77
REAL BETA, X
maka pernyataan
PRINT , ABS(X) ALPHA = NINT(BETA) SMALL = MIN(0, NUM1, NUM2)
akan menampilkan harga absolut X, membuat harga ALPHA sama dengan BETA dibulatkan ke integer terdekat, dan membuat harga SMALL sama dengan nilai minimum dari integer 0, NUM1, and NUM2.
8.2 User-defined Function
Fungsi standar yang ada dalam FORTRAN cukup banyak dan lengkap. Tetapi pada beberapa program sangat menguntungkan kalau kita bisa mendefinisikan fungsi sendiri. Fungsi ini disebut user-defined function. Fungsi ini sekali didefinisikan dapat digunakan sama persis dengan fungsi standar. User-defined functions ada dua jenis yaitu yang berbentuk sederhana dan berbentuk subprogram. Fungsi sederhana dapat didefinisikan dengan pernyataan sederhana
name(argument-list) = expression
di mana argument-list adalah daftar (dapat juga kosong) variabel yang dipisahkan dengan koma. Expression dapat berisi konstanta, variabel, persamaan, atau pernyataan fungsi standar dan user-defined function. Pernyataan-pernyataan ini harus muncul dalam unit program yang sama dengan fungsi sederhana ini dipanggil.
78
Dalam pendefinisian sebuah fungsi, nama fungsi harus berbeda dari nama variabel dan fungsi yang telah ada. Tipe dari nilai fungsi ditentukan dari tipe namanya. Variabel-variabel dalam argumen menunjukkan jumlah, urutan, dan tipe argumen. Sebagai contoh,
REAL A, B, HYPO HYPO(A, B) = SQRT(A 2 + B 2)
mendefiniskan fungsi riil dari dua argumen riil. Ketika sebuah fungsi dipanggil, maka argumen yang ada dalam fungsi ini mengikuti yang telah didefinisikan sebelumnya. Sebagai contoh, apabila X, Y, dan Z dedeklarasikan sebagai variabel riil dan nilai X dan Y masing-masing adalah 3.0 dan 4.0, maka dalam pernyataan
Z = HYPO(X, Y)
nilai X dan Y masing-masing menyesuaikan dengan nilai A dan B. Sehingga nilai dari fungsi
mendefinisikan fungsi ineteger dengan tiga variabel, yang dua pertama bertipe integer dan yang ketiga bertipe riil. Sehingga,
Dr. Tri Agung Rohmat
79
tidak diperbolehkan. Hal ini karena yang pertama mempunyai jumlah argumen yang salah, dan kedua argumen 2.5 bertipe salah. Nama-nama variabel yang dipakai sebagai argumen dalam pendefinisian fungsi dapat dipakai dimanapun oleh pernyataan yang lain. Sebagai contoh, apabila fungsi POLY didefinisikan oelh pernyataan,
REAL X, Y, POLY, A, B INTEGER K, M POLY(X, Y, K) = X K + 3.5 Y K
maka pernyataan
X = POLY(A, B, 3) - A 4 Y = .5 * POLY(1.0, X + 4, M - 3)
adalah benar. Pernyataan yang dipakai untuk mendefiniskan sebuah fungsi dapat mengandung variabel yang tidak keluar dalam daftar argumen. Sebagai contoh apabila fungsi F didefinisikan oleh
REAL X, A, F, BETA F(X) = X 2 + A
80
Juga dimungkinkan untuk mendefinisikan fungsi yang mempunyai argumen dan/atau nilai logika atau bertipe karakter. Sebagai contoh,
CHARACTER10 STRA, STRB, JOIN21 LOGICAL XOR, P, Q JOIN(STRA, STRB) = STRA // ' ' // STRB XOR(P, Q) = (P.OR.Q).AND. NOT. (P. AND. Q)
mendefinisikan fungsi JOIN sebagai tipe karakter yang mempunyai string dengan panjang 21 dan argumen bertipe karakter dengan panjang 10, dan juga mendefinisikan fungsi logika XOR yang mempunyai argumen bertipe logika.
8.3 Subprogram Fungsi
Fungsi sederhana seperti di atas berisi hanya sebuah pernyataan, atau dengan kata lain fungsi sederhana hanya dapat dipakai untuk mendefinisikan satu persamaan/rumus saja. Juga fungsi sederhana hanya dapat dipanggil pada satu unit program yang sama di mana fungsi sederhana itu didefinisikan. Di lain pihak, subprogram fungsi merupakan sebuah
user-defined function yang dapat berisi beberapa pernyataan sehingga dapat dipakai untuk
mendefinisikan fungsi yang membutuhkan beberapa pernyataan. Juga sebuah subprogram merupakan unit program tersendiri sehingga dapat dipanggil dari unit program yang lain atau di-link dengan program lain. Aturan penulisannya sama dengan penulisan main
program. FUNCTION statement Declaration part Subprogram statement
Dr. Tri Agung Rohmat
81
END
Di sini name adalah nama fungsi dan tipe nama fungsi menentukan tipe nilai fungsi; sedangkan argument-list adalah daftar (bisa kosong) variabel yang dibatasi dengan koma. Variabel-variabel ini menunjukkan jumlah, urutan, dan tipe argumen fungsi. Seperti pada sebuah program utama, sebuah subprogram perlu berisi bagian deklarasi yang dituliskan sebelum pernyataan-pernyataan yang dieksekusi. Pernyataan terakhir dari sebuah subprogram adalah
END
Setelah pernyataan END, nilai dari fungsi akan dikembalikan unit progra yang memanggilnya. END dapat diganti RETURN (untuk beberapa versi FORTRAN perlu dituliskan RETURN yang diikuti dengan END. Sebagai contoh, akan didefinisikan fungsi sebagai berikut, x + 1 if x < y f ( x, y ) = n n x + y if x maka dibuat subprogram sebagai berikut.
FUNCTION F(X, Y) REAL F, X, Y INTEGER N IF (X. LT. Y) THEN F=X+1 ELSE
82
di mana pernyataan-pernyataan ini berisi argumen yang jumlah dan tipenya sama dengan yang ada pada subprogram. Contoh fungsi yang tidak dapat didefinisikan menggunakan fungsi sederhana adalah fungsi faktorial. Faktorial dari bilangan integer non-negatif didefinisikan sebagai berikut, 1 if n = 0 n!= 1 2 3 ...n if n > 0 Fungsi ini dapat didefinisikan dengan menggunakan subprogram fungsi:
FUNCTION FACTOR (N) INTEGER FACTOR, N, I FACTOR = 1 IF (N.GT. 0) THEN DO 10 1 = 2, N FACTOR = FACTOR I 10 END IF CONTINUE
83
END
84
8.4 Subroutine Subprogram Subroutine subprogram, seperti halnya subprogram, adalah unit program yang digunakan
untuk melakukan suatu tugas tertentu. Perbedaan dengan subprogram fungsi adalah sebagai berikut, 1. Subprogram fungsi digunakan untuk mengembalikan suatu nilai tunggal ke unit program yang memanggilnya, sedangkan subroutine subprogram mengembalikan beberapa nilai atau hanya sekedar melakukan suatu tugas seperti menampilkan hasil perhitungan. 2. Fungsi mengembalikan nilai melalui nama fungsi; sedangkan
subroutine
mengembalikan nilai melalui argumen. 3. Fungsi dipanggil dengan menggunakan namanya, sedangkan subroutine dipanggil dengan perintah CALL. Penulisan subroutine subprogram mirip dengan subprogram fungsi sehingga sama dengan program utama.
SUBROUTINE statement Declaration part Subprogram statements END Subroutine subprograms harus dimulai dengan pernyataan SUBROUTINE dengan bentuk: SUBROUTINE name(argument-list)
di sini name merepresentasikan nama subroutine; argument-list adalah daftar (atau kosong) variabel yang dipisahkan dengan koma. Sebuah subroutine dipanggil dangan pernyataan CALL dengan bentuk
Dr. Tri Agung Rohmat
85
CALL name(argument-list)
Di sini name merepresentasikan nama subroutine; argument-list adalah daftar (atau kosong) variabel yang dipisahkan dengan koma. Sebagai ilustrasi sederhana, akan dikembangkan subroutine yang menerima dari program utama angka bulan, angka tanggal, dan angka tahun, dan menampilkan ini semua dalam bentuk
mm/dd/yy
merepresentasikan angka bulan, tanggal, dan tahun. Subroutine yang pas adalah
SUBROUTINE DATE(MONTH, DAY, YEAR)
di mana MONTH, DAY, dan YEAR harus dideklarasikan sebagai integer pada bagian deklarasi subroutine. Hanya dua digit terakhir dari angka tahun yang akan ditampilkan. Hal ini dapat dilakukan dengan menggunakan fungsi MOD.
YEAR = MOD(YEAR, 100)
Sebagai contoh apabila nilai yang diserahkan adalah 1941 maka pernyataan ini akan menyimpan 41 pada YEAR. Apabila nilai yang diserahkan adalah 1905 maka pernyataan ini akan menyimpan 5 pada YEAR dan akan ditampilkan sebagai 05. Oleh karena itu perlu ditampilkan dengan pernyataan sebagai berikut,
PRINT 10, MONTH, DAY, YEAR
86
10
Pernyataan
ini
menyebabkan
nilai
argumen
BMONTH,
BDAY,
dan
BYEAR
masing-masing diserahkan ke MONTH, DAY, dan YEAR. Ketika bagian akhir subroutine dicapai maka pernyataan setelah pernyataan CALL akan dieksekusi. Pada contoh di atas subroutine DATE tidak mengembalikan informasi ke program utama, tetapi hanya menampilkan informasi yang diterimanya. Sebagai ilustrasi sebuah subroutine yang mengembalikan informasi ke program utamanya, akan dibahas problem yang mengkonversikan koordinat polar (r,) dari suatu titik P ke koordinat kartesian, di mana koordinat polar yang kedua adalah sudut dari sumbu x positif. Rumus yang menghubungkan koordinat polar dan koordinat kartesian adalah,
x = r cos y = r sin
Karena subprogram yang melakukan tugas konversi harus mengembalikan dua nilai, maka perlu digunakan subroutine subprogram seperti di bawah,
SUBROUTINE CONVER(R, THETA, X, Y)
Dr. Tri Agung Rohmat
87
REAL R, THETA, X, Y X = R COS(THETA) Y = R SIN(THETA) END Subroutine ini dapa dipanggil dengan pernyataan CALL CALL CONVER(RCOORD, TCOORD, XCOORD, YCOORD)
di mana RCOORD, TCOORD, XCOORD, dan YCOORD adalah variabel riil. Ketika pernyataan CALL ini dieksekusi, argumen RCOORD, TCOORD, XCOORD, dan YCOORD masing-masing dipasangkan dengan argumen R, THETA, X, dan Y, sehingga masing-masing argumen yang berpasangan mempunyai nilai yang sama.
Pernyataan COMMON
Program yang besar biasanya terdiri dari beberapa unit program, di mana setiap unit program didesain untuk melakukan suatu tugas khusus yang merupakan bagian dari keseluruhan tugas. Umumnya setiap unit program mengakses data umum yang dipakai bersama. Pemakaian bersama dapat dilakukan dengan menggunakan daftar argumen, atau dapat juga dengan menentukan suatu daerah memori yang dipakai bersama. Hal dilakukan dengan menggunakan pernyataan COMMON.
Blank Common. Bentuk pernyataan COMMON yang paling sederhana disebut blank atau unnamed COMMON. Pernyataan ini membuat suatu daerah memori dengan tanpa
di mana list adalah daftar variabel atau array yang dibatasi dengan koma. Dengan pernyataan ini maka variabel dan array yang dituliskan di belakang COMMON akan
Dr. Tri Agung Rohmat
88
disimpan dalam satu paket memori dengan urutan sesuai penulisannya. Pernyataan
COMMON dituliskan pada bagian deklarasi.
Apabila pernyataan blank COMMON ditulis pada beberapa unit program maka hal ini menunjukkan variabel atau array yang dituliskan di belakang pernyataan COMMON pada satu unit saling dipasangkan dengan yang ada di unit yang lain. Hal-hal yang harus terpenuhi adalah: 1. Item yang dipasangkan harus bertipe sama. 2. Apabila bertipe karakter harus mempunyai panjang yang sama. 3. Tidak boleh diberi nilai dengan pernyataan DATA, tetapi dapat digunakan BLOCK
DATA.
4. Tidak boleh digunakan sebagai argumen dari sebuah subprogram. Sebagai contoh, ada sebuah unit program yang mengandung pernyataan,
REAL A, B INTEGER M, N COMMON A, B, M, N
A B M N
#1 #2 #3 #4
89
maka W, X, I, dan J juga ditempatkan pada empat tempat pertama pada daerah common.
Variabel Lokasi Blank Common
W X I J
#1 #2 #3 #4
A B M N
#1 #2 #3 #4
W X I J
Sebagai ilustrasi penggunaan array pada pernyataan COMMON, bayangkan pernyataan berikut pada suatu unit program
REAL A(3,3) COMMON A
Maka pernyataan COMMON ini akan menempatkan 9 tempat pertama di memori untuk
array A dan ALPHA dengan urutan columnwise. Array Lokasi Blank Common Array
#1 #2 #3 #4
Pada contoh di atas jelas bahwa memungkinkan penggunaan nama variabel atau array yang berbeda pada unit program lain yang berbeda. Akan tetapi lebih menguntungkan kalau menggunakan nama yang sama, terutama pada suatu program dengan ukuran besar.
Named Common. Pada kondisi tertentu, muncul kebutuhan untuk sharing beberapa paket
variabel atau array. Hal ini dimungkinkan dengan menggunakan pernyataan COMMON yang diberi nama atau disebut sebagai named common. Bentuk umumnya adalah,
COMMON /name1/list1/name2/list2
di mana setiap name1, name2, masing-masing adalah nama dari daftar variabel dan
array dari list1, list2, Yang harus diperhatikan adalah hubungan antar item dari suatu
daerah COMMON harus hubungan satu-satu. Sebagai contoh, variabel A, B, L, dan M akan di-sharing antara program utama dan
subroutine GAMMA, dan variabel A, B, N1, N2, N3 di-sharing antara program utama dan subroutine BETA, maka dapat dibuat sebagai berikut, REAL A, B INTEGER L, M, N1, N2, N3 COMMON /FIRST/ A, B /SECOND/ L, M /THIRD/ N1, N2, N3 END
SUBROUTINE GAMMA
Dr. Tri Agung Rohmat
91
SUBROUTINE BETA REAL A, B INTEGER N1, N2, N3 COMMON /FIRST/ A, B, /THIRD/ N1, N2, N3 END
SUBROUTINE BETA
Dr. Tri Agung Rohmat
92
REAL A, B INTEGER N1, N2, N3 COMMON // A,B /THIRD/ N1, N2, N3 END Contoh penggunaan function REAL F,A,B,X,DELX,SUM INTEGER N,I C F(X)=X**2 + 1 C PRINT *,'MASUKKAN BATAS BAWAH, ATAS, & JUMLAH SEGMEN' READ *, A,B,N DELX = (B-A)/N C SUM = 0 X = A + DELX/2 C DO 10 I=1,N SUM = SUM + F(X) X = X + DELX 10 CONTINUE SUM = SUM * DELX PRINT 20,'NILAI PENDEKATAN DG',N,' SEGMEN ADALAH',SUM 20 FORMAT(1X,A,I3,A,F10.5) END Contoh penggunaan function subprogram (1) REAL ITEM(50), MEAN INTEGER NUM,I C PRINT *,'MASUKKAN JUMLAH ITEM DAN ITEMNYA' READ *,NUM,(ITEM(I),I=1,NUM)
Dr. Tri Agung Rohmat
93
PRINT 10,NUM, MEAN(ITEM,NUM) 10 FORMAT(1X,'MEAN OF THE',I3,'NUMBER IS',F6.2) END C FUNCTION MEAN(X,N) C INTEGER N,I REAL MEAN, X(N), SUM C SUM = 0 DO 10 I=1,N SUM = SUM + X(I) 10 CONTINUE MEAN = SUM/N END Contoh penggunaan function subprogram (2) C C C C C REAL F,A,B,X,DELX,SUM INTEGER N,I C PRINT *,'MASUKKAN BATAS BAWAH, ATAS, & JUMLAH SEGMEN' READ *, A,B,N DELX = (B-A)/N C SUM = 0 X = A + DELX/2 C DO 10 I=1,N SUM = SUM + F(X)
Dr. Tri Agung Rohmat
PROGRAM INI DIPAKAI UNTUK MENGHITUNG NILAI PENDEKATAN INTEGRAL DARI FUNGSI F(X)= 1 IF X < 0 = 1-X^2 IF 0<=X<=1 = LN X IF X > 1
94
X = X + DELX 10 CONTINUE SUM = SUM * DELX PRINT *,'NILAI PENDEKATAN DG',N,'SEGMEN ADALAH',SUM END C FUNCTION F(X) REAL X,F C IF(X.LT.0) THEN F = 1 ELSE IF (X.LE.1.0) THEN F = 1 - X**2 ELSE F = LOG(X) END IF RETURN END Contoh penggunaan subroutine subprogram INTEGER LIMIT,ROWS1,COLS1,ROWS2,COLS2,I,J,K PARAMETER (LIMIT=10) REAL MAT1(LIMIT,LIMIT),MAT2(LIMIT,LIMIT),PROD(LIMIT,LIMIT), + SUM
CHARACTER*15 FORM DATA FORM /'(1X, ##F8.2)'/ C 10 PRINT *,'MASUKKAN DIMENSI MAT1' READ *, ROWS1, COLS1 PRINT * PRINT *,'MASUKKAN DIMENSI MAT2' READ *, ROWS2, COLS2 IF(COLS1.NE.ROWS2) THEN PRINT *,'KOLOM MAT1 HARUS SAMA DG BARIS MAT2'
Dr. Tri Agung Rohmat
95
GOTO 10 END IF C PRINT * PRINT *,'MASUKKAN KOMPONEN MAT1 (PERBARIS)' DO 20 I=1,ROWS1 READ *, (MAT1(I,J),J=1,COLS1) 20 C PRINT * PRINT *,'MASUKKAN KOMPONEN MAT2 (PERBARIS)' DO 30 I=1,ROWS2 READ *, (MAT2(I,J),J=1,COLS2) 30 C CALL MATMUL(MAT1,MAT2,PROD,LIMIT,ROWS1,COLS1,ROWS2,COLS2) PRINT * PRINT *, 'PRODUCT MATRIKS ADALAH' DO 70 I=1,ROWS1 PRINT FORM, (PROD(I,J),J=1,COLS2) 70 CONTINUE END C SUBROUTINE MATMUL(MAT1,MAT2,PROD,LIMIT,M,N,P,Q) INTEGER M,N,P,Q,LIMIT,I,J,K REAL MAT1(LIMIT,LIMIT),MAT2(LIMIT,LIMIT),PROD(LIMIT,LIMIT), + C DO 10 I =1,M DO 20 J=1,Q SUM = 0 DO 30 K=1,N SUM = SUM + MAT1(I,K)*MAT2(K,J) SUM CONTINUE CONTINUE
96
30
CONTINUE PROD(I,J)=SUM
20 10 C
CONTINUE CONTINUE
RETURN END
97
Daftar Pustaka
Chapra, S.T. and Canale, R.P., Numerical Methods for Engineers With Personal Computer Applications (Intl Student Ed.), 1985, McGraw-Hill, Singapore Mayo, W.E., Schaum's Outline of Programming With Fortran 77, 1995, Schaum, New York McCormick, J.M. and Salvadori, M.G., Numerical Methods in FORTRAN, 1987, Prentice Hall of India Private Ltd., New Delhi Nyhoff, N. and Leestma, S., FORTRAN 77 for Engineers and Scientists, 2nd Ed., 1988, Macmillan Pub. Co., New York