Professional Documents
Culture Documents
Fortran 90
Fortran 90
ki tabanndaki saylar : 0, 1
Ondalk saylar : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Onaltlk (hex) saylar : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Biraz daha hex
Ondalk Hex Hex Ondalk
1=1
10 = A
36 = 24 A5 = 165
147 = 93 DD = 221
255 = FF
Makine dili - Assembler
X=A*B+C
08 00 04 00 MOV A, ACC
24 00 04 01 MUL B, ACC
23 00 04 02 ADD C, ACC
11 00 04 03 STO ACC, X
Peki FORTRAN?
X=A*B+C
X=A*B+C
st seviye dili
FORTRAN
C st seviye dili
Pascal
Basic
C++ Derleyici (compiler)
(Javada ve scriptlerde yok)
Java
C#
Makine dili
Derleme (Compilation)
Kaynak kod X =A* B + C
(Source code) st seviye dili
Source module
Derleyici (compiler)
(Javada ve scriptlerde yok)
08 00 04 00
24 00 04 01
Object code
Makine dili 23 00 04 02
Object module 11 00 04 03
Bitti mi?
Okuma Balama- link
program
Object
cra edilebilir
program
program:
Ekrana yazma Executable
program program
arp_Topla.exe
program dll :
dynamic link library
Hatalar:
Girdiler kt
Balang miktar: BaslangicMiktari Kalan miktar: KalanMiktar
Yar mr: YariOmur
Geen zaman: GecenZaman
Hesaplama algoritmas kuralm
Girdiler kt
Balang miktar: BaslangicMiktari Kalan miktar: KalanMiktar
Yar mr: YariOmur
Geen zaman: GecenZaman
KalanMiktar = BaslangicMiktari *
0.5**(GecenZaman/YariOmur) hesapla
KalanMiktar yazdr
Bala
Algoritma BaslangicMiktari
GecenZaman
YariOmur
(Flowchart) KalanMiktar =
BaslangicMiktari *
0.5**(GecenZaman/YariOmur)
hesapla
KalanMiktar
deerini
yaz
Dur
Ara: Algoritma ~ El Harezm
Eb Cafer Muhammed bin Mus el- Harizm
(lm: 847)
lk cebir kitabnn yazar:
Kitab muhtasar fi hisabil- cebr vel
mukabele
lk algoritma fikri de onun; o yzden adn
tayor Ltinceye evirirken H ile Gyi
kartrmlar: H: G:
Artk program yazabiliriz:
PROGRAM Radyoaktif_Bozunma
!--------------------------------------------------------------------------------------------------------
! Bu program, yar mr ve balang miktar verildiinde, belli bir sre sonunda kalan
! radyoaktif madde miktarn hesaplar. Kullanlan deikenler unlardr:
! BaslangicMiktari : Radyoaktif maddenin mg cinsinden balang miktar
! YarOmur : Radyoaktif maddenin gn cinsinden yar mr
! GecenZaman : Gn cinsinden geen zaman
! KalanMiktar : GecenZaman gn sonra geriye kalan miktar (mg olarak)
!
! Girdiler : BaslangicMiktari, YariOmur, GecenZaman
! kt : KalanMiktar
!--------------------------------------------------------------------------------------------------------
Radyoaktif bozunma program devam
IMPLICIT NONE
lem
Bir alt
Ak baka bir yerde yordam- alt
7 devam ediyor- oraya git
algoritma
Yazlm gelitirme aamalar
zmleme
Veri dzeni ve
algoritma tasarm
Kodlama
Tanmlayclar
Program isimleri, deiken isimleri gibi tanmlayclar bir harfle
balar, harften sonra 30 veya daha az harf, say veya alt izgi (_)
bulunabilir.
KalanMiktar, YariOmur, A28, Radyoaktif_Bozunma
dev:
Harizmnin ansna
2 x2 19 x + 35 = 0
Integer sabitler
Doru:
0 137 -2516 +17745
Yanl
9,999 16.0 --5 7- 3.
FORTRAN veri tipleri,
sabitler, deikenler: Real sabitler
Real sabitler
Doru:
1.234 -0.01536 -1.536E-2 6.02E23 +5.
Yanl
5 1,234
FORTRAN veri tipleri,
sabitler, deikenler: Character sabitler
PDQ123-A In ekirdek
In ekirdek Inn
Yanl
Inn
PDQ123-A
deikenler
nce ilan gerekiyor (decleration)
type-specifier :: list
Program isimleri
PROGRAM Ikinci_Derece_Denklem123
=
Variable = expression
Atama ifadesi
lanlar, aslnda hafzada (RAMda) yer ayrr.
REAL :: XKoord, YKoord
INTEGER :: Sayi, Terim
XKoord ?
YKoord ?
Sayi ?
Terim ?
Atama ifadesi
XKoord = 5.23
YKoord = SQRT(25.0)
Sayi = 17
Terim = Sayi / 3 + 2
XKoord = 2.0 * XKoord
XKoord ?
10.46
5.23
Ykoord ?
5.0
Sayi ?
17
Terim ?7
Atama ifadesi
A = B ne demek? A 122.45
-18.567
A = B icra edildii
anda
B -18.567
A ile Byi yer
deitirmek istersek?
C=A
A -18.567
122.45
A= B
B = C icra edilir B -18.567
122.45
C ?
122.45
Atama ifadesi
A = A +B ne A 103.883
122.45
demek?
Byle bir ifade acemi B -18.567
programcy
artabilir.
A = A + B icra
edildii anda
Hzl snav
INTEGER :: M, N Aadakilerin geerli atama ifadeleri
REAL :: Pi, Alfa olup olmadn, geersizse sebebini
Pi = 3.141593 3 syleyin
=N N . = N+ 1
N+1=N Alfa = 1 Alfa = 1
Alfa = Alfa M=N=1
PRINT *, X1, X2
Ak kontrol devam
READ *, A, B, C
DELTA = B*B 4.* A * C
IF(DELTA > 0) THEN
DELTA = SQRT(DELTA)
X1 = (-B + DELTA) / (2. * A)
X2 = (-B - DELTA) / (2. * A)
PRINT *, Kokler gercek: , X1, X2
END IF
Ak kontrol devam
READ *, A, B, C
DELTA = B*B 4.* A * C
IF(DELTA > 0) THEN
DELTA = SQRT(DELTA)
X1 = (- B + DELTA) / (2. * A)
X2 = (- B DELTA) / (2. * A)
PRINT *, Kokler gercek: , X1, X2
ELSE
DELTA = SQRT(-DELTA)
X1R = -2.* B
X2R = X1R
X1IM = DELTA / (2. * A)
X2IM = -X1I
PRINT *, Kokler kompleks: X1 = , X1R, XIIM, ve X2 =, X2R, X2IM
END IF
READ *, A, B, C
DELTA = B*B 4.* A * C
IF(DELTA > 0) THEN
DELTA = SQRT(DELTA)
X1 = (- B + DELTA) / (2. * A)
X2 = (- B DELTA) / (2. * A)
PRINT *, Kokler gercek: , X1, X2
ELSE IF (DELTA < 0) THEN
DELTA = SQRT(-DELTA)
X1R = -B / (2. * A)
X2R = X1R
X1IM = DELTA / (2. * A)
X2IM = -X1I
PRINT *, Kokler kompleks: X1 = , X1R, XIIM, ve X2 =, &
X2R, X2IM
ELSE
X1 = -B / (2. * A)
X2 = X1
PRINT*, Kokler esit, X1 = X2 = , X1
END IF
dev:
kinci derece denklem zen program yazp
altrn ama sra yle olsun: nce diskriminant
>0, sonra 0, sonra pozitif.
0- 100 arasndaki renci notunu okuyup,
0- 20 ye F
20- 40 a D
40- 60 a C
60- 80 e B
80- 100 e A
veren bir program yaznz.
Bir baka problem:
Bir program yaznz:
Haftann gnlerini say olarak okusun.
Gnn adn yazsn:
sim: SELECT(selector)
------
END SELECT sim
Sabitler ve deikenler
Sabitler ve deikenleri kartrdnz gryorum.
Yzne baknca tipini anlyorsanz sabittir:
5 5. BES 6.02E23 .TRUE. (3.57, 2,85)
Anlayamyorsanz deikendir:
(Deiken tiplerini o yzde ilan etmek zorunda kalyoruz.)
BES DEGISKEN SABIT KARAKTER
Bu PRINT komutunda kimler sabit, kimler deiken?
4.TRUE.
SUM NUMBER <= OLMAZ!
0 <= COUNT <= 5
.TRUE.
NUMBER**2 + COUNT**2 = = SUM**2
.TRUE.
NUMBER < COUNT .OR. COUNT < SUM
PROGRAM ORTALAMA_AL
IMPLICIT NONE
INTEGER:: OGRENCI, SAYAC
REAL:: TOPLAM, ORTALAMA, NOT
Snf ortalamasnn bulunmas
TOPLAM = 0.
DO SAYAC = 1, OGRENCI
PRINT*, NOT GIRINIZ
READ*, NOT
TOPLAM = TOPLAM + NOT
END DO
ORTALAMA = TOPLAM / REAL(OGRENCI)
PRINT*, OGRENCI, OGRENCININ ORTALAMA &
&NOTU = , ORTALAMA
END PROGRAM ORTALAMA_AL
Ayn problemin bir baka zm
TOPLAM = 0.
DO SAYAC = OGRENCI, 1, -1
PRINT*, NOT GIRINIZ
READ*, NOT
TOPLAM = TOPLAM + NOT
END DO
ORTALAMA = TOPLAM / REAL(OGRENCI)
PRINT*, OGRENCI, OGRENCININ ORTALAMA &
&NOTU = , ORTALAMA
END PROGRAM ORTALAMA_AL
Hzl snav
kt nedir: MERHABA
MERHABA
DO I = 1, 5 MERHABA
PRINT*, MERHABA MERHABA
END DO MERHABA
DO I = 1, 5, 2
PRINT*, MERHABA MERHABA
END DO MERHABA
MERHABA
DO I = 1, 6
PRINT*, I, I+1
END DO 1 2 / 2 3/ 3 4/ 4 5/ 5 6/ 6 7
hzl snav
kt nedir:
DO I = 6, 1, -1 6 5
PRINT*, I
PRINT* 36 25
PRINT*, I**2
END DO
DO I = 6, 6
PRINT*, MERHABA MERHABA
END DO
DO I = 6, 5
PRINT*, MERHABA
END DO
ki kural: 1
DO parametreleri dngnn iinde
deitirilemez:
DO I = 1, 10
PRINT*, I
OLMAZ
I = I +1
END DO
ki kural: 2
DO dngleri iie geebilir:
DO I = 1, 5
PRINT*, I
DO J = 1, 4
PRINT*, I + J
END DO
END DO
Mantk kl DOlar
DO
ifadeler
IF(mantk-ifadesi) EXIT
daha-daha-ifadeler
END DO
DO
ifadeler
IF(mantk-ifadesi) EXIT
daha-daha-ifadeler
END DO
DO
DO I = 1, N
I = I +1
TOPLAM = TOPLAM + I
IF(I>N) EXIT
END IF(I/2*2
DO
TOPLAM .EQ.
= TOPLAM
2) CYCLE
+ !ISADECE TEK SAYILAR
END TOPLAM
DO = TOPLAM + I
END DO
Hzl test
pre-test ve post-test dnglerinin fark
nedir?
gramer
Unutulmu bir parantez veya trnak ..
derleyici
hatasdr ve ..bunu yakalar.
a i xi+ b n = iyi
DO SAYAC = 1, N
READ IKS, YE
X = X + IKS
X2 = X2 + IKS * IKS
XY = XY + IKS * YE
Y = Y + YE
END DO
D = X2 * REAL(N) X * X
A = (XY * REAL(N) X * Y) / D
B = (X2* Y X * XY) / D
PRINT *, N, A, B
en kk kareler
5 GRD- IKTI
I/O
DAHA IK IKTILAR
ktlar cannz skt
PRINT *, LIRA, TL, YENILIRA, YTL EDER
1.2000000 E +07TL12.00000000YTL EDER
7 -0.79294 249.9
----------------------------------
daha k ktlar
PRINT 55, N, A, B
55 FORMAT( 1X, I5, F12.5, 5X, F12.1)
yerine
PRINT ( 1X, I5, F12.5, 5X, F12.1), N, A, B
READ FORM, I, J, X, Y
b99876123456
-------------------------
READ 9, I, X, J, Y
9 FORMAT(I2, F5.2 / I3, F2.1)
9912345
-------------------------
87660
-------------------------
WRITE
WRITE(kontrol_listesi) kt_listesi
Kontrol_listesinde neler bulunabilir?
1. Birim numaras, ktnn alnaca birim olabilir. (Bir tam
say)
UNIT = 6 veya sadece 6
2. Format belirten bir ifade veya say
FMT = format_belirtici veya sadece format_belirtici.
UNIT ve FMT kullanlmayacaksa birim ilk, format ikinci
unsur olmaldr.
3. ADVANCE= yes_veya_no
Eitliin sa ya YES yahut NOdur.
1. Birim numaras
2. Format ifadesi
WRITE 3. ADVANCE
INTEGER :: CIKIS = 6
WRITE (6, *) AHMET, MEHMET
WRITE (6, FMT = *) AHMET, MEHMET
WRITE (UNIT = 6, FMT = *) AHMET, MEHMET
WRITE ( CIKIS, *) AHMET, MEHMET
WRITE (UNIT = CIKIS, FMT = *) AHMET, MEHMET
WRITE (*, *) AHMET, MEHMET
PRINT *, AHMET, MEHMET
1. Birim numaras
2. Format ifadesi
WRITE 3. ADVANCE
ADVANCE = NO
ADVANCE = YES
READ
READ (kontrol_listesi) girdi_listesi
Kontrol_listesinde neler bulunabilir?
1. Birim numaras, girdinin okunaca birim olabilir. (Bir tam
say)
UNIT = 5 veya sadece 5
2. Format belirten bir ifade veya say
FMT = format_belirtici veya sadece format_belirtici.
UNIT ve FMT kullanlmayacaksa birim ilk, format ikinci
unsur olmaldr.
3. ADVANCE= yes_veya_no
Eitliin sa ya YES yahut NOdur.
4. IOSTAT = ifade veya END = ifade
1. Birim numaras
2. Format ifadesi
READ 3.
4.
ADVANCE
IOSTAT veya END
INTEGER :: GIRIS = 5 5. Dosya maniplasyon
ifadeleri
READ (5, *) AHMET, MEHMET
READ (5, FMT = *) AHMET, MEHMET
READ (UNIT = 5, FMT = *) AHMET, MEHMET
READ ( GIRIS, *) AHMET, MEHMET
READ (UNIT = CIKIS, FMT = *) AHMET, MEHMET
READ (*, *) AHMET, MEHMET
READ *, AHMET, MEHMET
1. Birim numaras
2. Format ifadesi
READ 3.
4.
ADVANCE
IOSTAT veya END
Formatl okuma isterseniz: Dosya maniplasyon ifadeleri
5.
280 20
nce?
nce?
Dosyay amak gerek: OPEN (ama_listesi)
1. Birim (INTEGER) Dosyaya bu sayyla atf yaplr.
2. FILE= dosya_ismi (dosyann iletim sistemindeki
ismi)
3. STATUS = dosyann_durumu
4. ACTION = ne_yaplacak (okunacak? yazlacak=? her
ikisi?)
5. POSITION = dosyann_neresinde_yaplacak
6. IOSTAT = dosya_baaryla_ alm_m?
birim FILE = STATUS =
CHARACTER(10):: DosyaIsmi
WRITE(*, (1X, A), ADVANCE = NO) &
Dosyanin ismini yaziniz:
READ*, DosyaIsmi
CLOSE(13)
IOSTAT uygulama rnei
DO
!Bir sonraki veriyi oku
READ (12, *, IOSTAT = GIRDI_DURUMU) KOD, &
SICAKLIK, BASINC
IF(GIRDI_DURUMU > 0) STOP GIRDI HATASI
IF(GIRDI_DURUMU < 0) EXIT !Veri bitti
! Veriyi ilemeye devam et
SAY = SAY +1
..
TOPLAMBASINC = TOPLAMBASINC + BASINC
END DO
END uygulama rnei
DO
!Bir sonraki veriyi oku
READ (12, *, END = 20) KOD, SICAKLIK, BASINC
!IF(GIRDI_DURUMU < 0) EXIT YERNE
! Veriyi ilemeye devam et
SAY = SAY +1
..
TOPLAMBASINC = TOPLAMBASINC + BASINC
END DO
20 CONTINUE
REWIND ve BACKSPACE
Genel ifade:
REWIND birim BACKSPACE birim
REWIND 12
BACKSPACE 12
Hzl snav
WRITE (10, 20) X, Y ifadesinde 10 ve 20 nedir?
10 yazlacak birim (cihaz veya dosya), 20 bir FORMAT
ifadesidir.
PRINT *, CEVAP ifadesine edeer bir WRITE ifadesi
yaznz.
WRITE (*, *) CEVAP
(Doru mu yanl m?) OPEN komutundaki FILE =
NEW bu dosyann mevcut olmadn, bu program
tarafndan yaratlacan gsterir.
X
Hzl snav
SINAV isimli ve diskte mevcut bir dosyay 15 birim nunarasyla
okumak ve yazmak iin aacak bir OPEN yaznz:
OPEN (15, STATUS = OLD, ACTION = READWRITE, )
Bu dosyadan 6-8 pozisyonundan NOT adl tam sayy okuyacak
bir komut yaznz.
REWIND 15
READ (15, (5x, I3)) NOT
(Doru mu yanl m?) IOSTAT = VAR ise ve hata meydana
gelmemekle birlikte dosyann sonuna varlmsa, VAR eksi deer
alacaktr.
(Doru mu yanl m?) READ(5, 10, END = 15) NOT komutunda,
okunacak veri kalmaynca program, 15 numaral komuttan devam
edecektir.
Hzl snav
(Doru mu, yanl m) BACKSPACE komutu,
mevcut konumun soluna bir deer yazmak iin
kullanlr. X
REWIND
_________ komutu, dosyay balangcna
ekmek iin kullanlr.
6 FONKSYON ALT
PROGRAMLARI
FORTRANn FONKSYONLARI
Kitapta 324. sayfadaki 6.1 tablosuna bakn
Bu fonksiyonlar programlarda serbeste kullanlr.
LOG10 kullandnz
Mesel:
INTEGER :: Sayi_1, Sayi_2, Kucuk
REAL :: Alfa, Beta, X
PRINT *, ABS(X)
Alfa = ANINT(100.0 * Beta) / 100.0
Small = MIN(0, Sayi_1, Sayi_2)
FORTRANn FONKSYONLARI
Kendimiz fonksiyon yazabilir ve sonra tpk FORTRAN
fonksiyonlar gibi onlar da kullanabiliriz.
fonksiyon bal
tanmlar ksm
icra ksm
END FUNCTION ifadesi
fonksiyon bal
FUNCTION fonksiyon-ismi(resm-argman-listesi)
veya
tip-belirleyici FUNCTION fonksiyon-ismi(resm-argman-listesi)
FORTRANn FONKSYONLARI
fonksiyon bal
FUNCTION fonksiyon-ismi (resm-argman-listesi)
veya
tip-belirleyici FUNCTION fonksiyon-ismi (resm-argman-listesi)
...
SONUC = ALFA/FUN(X)
.....
.......
CALL SUB(X)
SONUC = ALFA / X
...
SUBROUTINEden deer dnecekse bu deer(ler) argmanlar
vastasyla tanr.
rnek: 132.23456 gibi bir saat deeri verildiinde bunu
gn, saat, dakika, saniyeye evirip sonucu basan bir
subroutine
!Bu subroutine yukarda anlatlan ii yapar
SUBROUTINE GSDS(GIRENSAAT)
REAL, INTENT(IN) :: GIRENSAAT
INTEGER :: TAMSANIYE, GUN, SAAT, DAKIKA, SANIYE
TAMSANIYE = GIRENSAAT * 3600. + 0.5
GUN = 0
DO
IF(TAMSANIYE .LT. 86400) EXIT
TAMSANIYE = TAMSANIYE 86400
GUN = GUN +1
END DO
REAL, INTENT(IN) :: GIRENSAAT
INTEGER :: TAMSANIYE, GUN, SAAT, DAKIKA, SANIYE
GUN = 0
DO
IF(TAMSANIYE .LT. 86400) EXIT
TAMSANIYE = TAMSANIYE 86400
GUN = GUN +1
END DO
SAAT = 0
DO
IF(TAMSANIYE .LT. 3600) EXIT
TAMSANIYE = TAMSANIYE 3600
SAAT = SAAT +1
END DO
REAL, INTENT(IN) :: GIRENSAAT
INTEGER :: TAMSANIYE, GUN, SAAT, DAKIKA, SANIYE
SAAT = 0
DO
IF(TAMSANIYE .LT. 3600) EXIT
TAMSANIYE = TAMSANIYE 3600
SAAT = SAAT +1
END DO
DAKIKA = 0
DO
IF(TAMSANIYE .LT.60) EXIT
TAMSANIYE = TAMSANIYE 60
DAKIKA = DAKIKA +1
END DO
SANIYE = TAMSANIYE
PRINT "(1X, T10, A, T20, A, T30, A, T40, A/ 2X, 4I10)", GUN, &
SAAT, DAKIKA, SANIYE, GUN, SAAT, DAKIKA, SANIYE
END SUBROUTINE GSDS
Kullanl
PROGRAM BIRPROGRAM
REAL :: SAATLER
PRINT *, KAC SAAT?
READ*, SAATLER
CALL GSDS(SAATLER)
END PROGRAM BIRPROGRAM
Bir baka zm
DO 200 I = 1, 50
200 PRINT*, NOT(I), ORTALAMA NOT(I)
Baka bir zm
REAL :: NOT(50), SAPMA(50)
ORTALAMA = 0
DO 100 I = 1, 50
READ *, NOT(I)
100 ORTALAMA = ORTALAMA + NOT(I)
DO 200 I = 1, 50
200 SAPMA(I) = ORTALAMA NOT(I)
DO 300 I = 1, 50
300 PRINT*, NOT(I), SAPMA(I)
Edeer ifadeler
DO 100 I = 1, 50
100 READ *. NOT(I) yerine
READ *, (NOT(I), I = 1, 100)
veya
READ *, NOT
PRINT iin de ayn eyler geerli...
im edilen do = implied do
Mesel:
DO 300 I = 1, 50
300 PRINT *, NOT(I), SAPMA(I) yerine
PRINT *, (NOT, SAPMA, I = 1, 50)
Hafzada yer ne zaman ayrlyor?
REAL :: NOT(1:50) veya
REAL, DIMENSION(1:50) :: NOT
Bunlar icra edilebilen (executable) ifadeler deil... Btn iln
ifadeleri gibi (tip, implicit, v.s.) derleme zamannda yerine
getiriliyor.
WHERE(a>0)
b = 1.0/a
ELSEWHERE
b = -1.0
END WHERE
renci programnn devam...
renci numaralar, notlar okunacak, ortalamdan sapmalaryla
birlikte yazlacak.
real :: ogrenci(50, 3), topla
integer :: i
read 20, (ogrenci(I, 1), ogrenci(I, 2), I = 1, 50)
20 format(2f10.0)
topla = 0.
do 100 i = 1, 50
100 topla = topla + ogrenci(i, 2)
topla = topla / real(50)
do 200 i = 1, 50
200 ogrenci(i, 3) = topla - ogrenci(i, 2)