Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 186

FORTRAN90

Prof. Dr. skender ksz


Ar. Gr. Alpay ahin
Ar. Gr. Hseyin ARBA

Ders kitab: FORTRAN90 for Engineers and Scientists


Larry Nyhoff ve Sanford C. Leestma
Prentice Hall 1997
1 Bilgisayar programlama:
Programlama dilleri, makine dili, yksek
dzey diller
Derleyici, source, object, link
kavramlar.
Algoritma, bir programn yaam aamalar
Makine dili
X=A* B+C
1) Hafzann A adresindeki deeri al, ALUda bir
registere ykle;
2) Hafzann B adresindeki deeri al, yukardaki
deerle arp ve sonucu ayn registerde tut.
3) Hafzann C adresindeki deeri registerdeki deere
ekle.
4) Registerdeki deeri hafzann X adresine koy.
Makine dili
X =A* B+ C
Opcode Operand
1) 00010000000000000000010000000000 (Adaki deeri reg. ykle)
Hex: 08 00 04 00
2) 00100100000000000000010000000001 (Bdeki deerle arp)
Hex: 24 00 04 01
3) 00100011000000000000010000000010 (Cdeki deeri reg. ile topla)
Hex: 23 00 04 02
4) 00010001000000000000010000000011 (Registerdeki deeri Xe ta)
Hex: 11 00 04 03

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

Ara dil (Java, C#)

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:

Derleme hatalar (Compiler error)

Balama hatalar (Falan modl bulamadm)

cra hatalar (Run time error)


Bir mhendislik problemi nasl zlr?
In ekirdek, Ver Bir Diploma da Mezun Olalm
niversitesinde ekirdek fizikisidir. Deney iin 10 mg
Polonyum alm. Sonra unutmu ve aradan 180 gn
gemi. Polonyumun yar mr 140 gn. imdi elinde
ka mg Po kaldn hesab etmek istiyor.
Girdiler kt
Balang miktar: 10 mg Kalan miktar: ?
Yar mr: 140 gn
Geen zaman: 180 gn
Bir mhendislik problemi nasl zlr?
Girdiler kt
Balang miktar: 10 mg Kalan miktar
Yar mr: 140 gn
Geen zaman: 180 gn
Biraz daha genel yazalm ve problemin verilerine isim verelim:

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

1. BaslangicMiktari, YariOmur, GecenZaman deerlerini oku


2. KalanMiktar hesapla
3. KalanMiktar deerini yaz
Algoritma
1. BaslangicMiktari, YariOmur, GecenZaman deerlerini al
2. KalanMiktar hesapla
3. KalanMiktar deerini yaz
Nasl?
GecenZaman = YariOmur ise: KalanMiktar = BaslangicMiktari X 0.5
GecenZaman = 2YariOmur ise: KalanMiktar = (BaslangicMiktari X 0.5) X 0.5
= BaslangicMiktari X (0.5)2

KalanMiktar = BaslangicMiktari X (0.5) GecenZaman/YariOmur


Fortran ile:

KalanMiktar = BaslangicMiktari * 0.5 ** (GecenZaman / YariOmur)


Algoritma
BaslangicMiktari, GecenZaman, YariOmur
deerlerini oku

KalanMiktar = BaslangicMiktari *
0.5**(GecenZaman/YariOmur) hesapla

KalanMiktar yazdr
Bala
Algoritma BaslangicMiktari
GecenZaman
YariOmur

Ak diagram deerlerini oku

(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

REAL :: BaslangicMiktari, YariOmur, GecenZaman, KalanMiktar

! BaslangicMiktari, GecenZaman, YariOmur deerlerini oku

PRINT *, Balang miktar, yar mr ve gecen zaman deerlerini giriniz:


READ *, BaslangicMiktari, YariOmur, GecenZaman
! KalanMiktar = BaslangicMiktari * 0.5**(GecenZaman/YariOmur) hesapla
KalanMiktar = BaslangicMiktari * 0.5 ** (GecenZaman / YariOmur)

! KalanMiktar deerini yaz


PRINT *, Kalan miktar =, KalanMiktar, mg
END PROGRAM Radyoaktif_Bozunma
Ak diyagramnn paralar:
Algoritmann Ak bir karara gre
ba veya sonu ikiye (veya daha fazla
yola) ayrlyor: Yol
atallanyor.
Veri girii
veya k
Dng

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

elale modeli Test ve uygulama

teratif elale modeli


Bakm (maintenance)
rendiimiz FORTRAN ifadeleri
PROGRAM program- ismi
PROGRAM Radyoaktif_bozunma
IMPLICIT NONE
Type
REAL :: deiken-isimleri-listesi
REAL :: BaslangicMiktari, GecenZaman
INTEGER :: OgrenciSayisi, OgrenciNumarasi
rendiimiz FORTRAN ifadeleri
Girdi (input) ifadesi
READ *, okunacak-deikenler-listesi
READ *, BaslangicMiktari, YariOmur, GecenZaman
kt (output) ifadeleri
PRINT *, yazlacak-deikenler-listesi
PRINT *, Kalan miktar = , KalanMiktar, mg
WRITE(*,*) yazlacak-deikenler-listesi
WRITE(*, *) Kalan miktar = , KalanMiktar, mg
rendiimiz FORTRAN ifadeleri
Atama (assignment) ifadesi
deiken = ifade
Delta = b*b 4.* a * c
KalanMiktar = BaslangicMiktari * 0.5 ** (GecenZaman / YariOmur)
DKKAT: Cebir denklemi deildir. Baz dillerde = yerine
kullanlr. A * b = c + d gibi eyler yazlamaz.

Biti: END program-ismi


END Radyoaktif_bozunma

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

(Harizm, daha nce ismin verdiimiz kitabnda ikinci derece denkleminin


zmyle uram, bir ok hal iin zm ve ilk defa iki kk bulunduunu
fark etmitir.)

In ekirdek, radyoaktif bozunma programn yazdktan sonra u


denklemle karlat:

2 x2 19 x + 35 = 0

Artk byle durumlarda tek bu problemi zmek yerine genel bir


program yazmay renmiti. Siz de genel bir program yazn,
hem bu denklemi hem de daha sonra kabilecek benzer
denklemleri zsn
2 Temel FORTRAN
FORTRAN veri tipleri, sabitler,
deikenler
Aritmetik ilemler, aritmetik fonksiyonlar
Atama komutu
Veri girii ve veri k
Program dzeni ve biimi
FORTRAN veri tipleri, sabitler,
deikenler: Veri tipleri
INTEGER Tam say
REAL Gerek say
COMPLEX Kompleks say
CHARACTER Alfa-numerik
LOGICAL .TRUE. .FALSE.
FORTRAN veri tipleri,
sabitler, deikenler: Integer sabitler

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

INTEGER :: Ogrenci_Sayisi, Iterasyon


sterseniz ilk deerleri ilan srasnda verebiliyorsunuz:
INTEGER :: Ogrenci_Sayisi = 65, Iterasyon = 2

REAL :: Kutle, Hiz


REAL :: Kutle = 12., Hiz
Character deikenler
CHARACTER (length-specifier) :: list

Character(15) :: Isim, Soyad


Character(15) :: Isim, Soyad , Sokak*20

Character :: Isim = Atila


Sadece Ay tar.
Character(10) :: Isim = Ali
Alibbbbbbbtar

Kesme de yastklama da sadan yaplyor.


IMPLICIT NONE
FORTRANda

A-H, O-Z ile balayan deikenler otomatik olarak REAL saylr

I- N ile balayan deikenler: INDEX, JALE, NANEMOLLA


INTEGER saylr.

IMPLICIT NONE bu kabul geersiz klar. IMPLICIT NONE


kullanldnda her deikenin ne olduu aka (explicit
olarak) iln edilmelidir.
PARAMETER
REAL, PARAMETER :: Pi = 3.141593

INTEGER, PARAMETER :: Ogrenci_Sayisi = 27

Bir baka ilk deer verme metodu. Fark: Bu


deer program boyunca deitirilmez.

Neden gerektiinde 3.141593 yazmyoruz?


Identifiers
Identifiers: Tanmlayclar

Program isimleri
PROGRAM Ikinci_Derece_Denklem123

Deiken, parametre isimleri


REAL NotOrtalamasi
INTEGER OgrenciSayisi

Harfle balamal. Devam alfabe, say veya alt_izgi olabilir.


Toplam 31 karakter.
FORTRAN programn paralar
Heading
Specification
Execution
Subprogram
END PROGRAM
Sorular
Veri tiplerini saynz
Karakter sabitleri . veya . arasna alnmaldr.

Tanmlayclar . ile balamal ve en ok .


karakter olmaldr.
Fortran programnn paralarn saynz

Bu deikenlerin hangileri yanltr? Neden?

Kalori A-tipi 2tipi SaatteKilometre PS.175


Saatte_Kilometre N/4 Yuz+ YzDolar
Sorular
Aadakiler doru sabitler midir? Sabitin
tipini syleyiniz. Yanlsa niin?

1234 1,234 -1.234 -1. 0.123E+04


bir bir bir Daltonun yasasi
12.34YTL 123E4 E4 +1234
12+34 12+34
Sorular
Mu kelimesini bir INTEGER olarak tanmlayn
INTEGER :: Mu

Zaman ve Uzaklik kelimelerini REAL olarak tanmlayn


REAL :: Zaman, Uzaklik

Ad1, Ad2 20 karakterlik, Ad3 10 karakterlik


CHARACTER sabitleridir. Tanmlayn
CHARACTER(20) :: Ad1, Ad2, Ad3*10
Sorular
Limit1, Limit2, Limit3, balang deerleri 10, 20, 30 olan tam saylardr.
Tanmlayn
INTEGER :: Limit1 = 10, Limit2 = 20, Limit3 = 30

Zaman ve Uzaklik, REAL deikenlerdir. Tanmlaynz.


REAL :: Zaman, Uzaklik

Bolum, Kimya balang deerine sahip CHARACTER; Enf, 102 balang


deerine sahip INTEGER deikendir. Tanmlaynz.
CHARACTER(*) :: Bolum = Kimya
INTEGER :: Enf = 102

Ad1, Ad2 en ok 20 karakter boyunda, Ad3 en ok 10 karakterlik


CHARACTER deikenleridir. Tanmlaynz.
CHARACTER(20) :: Ad1, Ad2, Ad3*10
Sorular
Blm, Kimya Muhendisligine eit karakter
deikenidir. Tanmlayn.
CHARACTER(*) :: Bolum = Kimya Muhendisligi

Merih, 1.2E12 ve Dunya 1.5E10 deerlerini tayan


sabitlerdir. Tanmlaynz.

REAL, PARAMETER :: Merih = 1.2E12, Dunya 1.5E10


Aritmetik ilemler ve fonksiyonlar
Bilin bakalm bunlar B2 4AC
hangi ilemler:
+ B**2 4 * A * C
- 9. / 4. 2.25000
/ 9/4 2
*
4./ 9. 0.444444
**
4/9 0
Aritmetik ilemler ve fonksiyonlar
Karksa ne sonu verece belli olmaz; onun
iin kartrmayn.
3.0 + 8 / 5 ile 3 + 8. / 5 ayn sonucu vermez.

Bir durumda kartrma tavsiye edilir:

2.0 ** 3 8.0 2.**3. exp(3.ln(2.)


Aritmetik ilemler ve fonksiyonlar
lem hiyerarisi
1. nce ** (sadan sola)
2. Sonra * ve / (soldan saa)
3. Sonra + ve (soldan saa)

Teredddnz varsa parantez an!


Aritmetik ilemler ve fonksiyonlar
ABS(X) FRACTION(X) NINT(X)

COS(X) LOG(X) REAL(X)

EXP(X) MAX(X1, XN) SIN(X)

INT(X) MIN(X1, XN) SQRT(X)

FLOOR(X) MOD(X, Y) TAN(X)


fonksiyonlar
X Y bl X + Y nin mutlak deerinin
logaritmasn aln
LOG(ABS((X Y) / (X + Y)))

A2 B2 2AB Cos T nin FORTRANcasn


yazn
A ** 2 B ** 2 2. * A * B * COS(T)
Ne eksik?
Hesap yapyoruz ama elde ettiimiz deerleri
bir yerlere koyamyoruz:
Atama ifadesi: Assignment statement:

=
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

u FORTRAN atama komutlarn yaznz:


Hiz ile Zaman deikenlerini arpp sonucu Mesafeye koyun.
Mesafe = Hiz * Zaman

A2+B2 nin karekkn C ye C = SQRT(A ** 2 + B **2)

Sayi adl tam say deikeninin deerini 1 arttirin Sayi = Sayi +1


Serbest d problemi
z = gt2 + v0t + h0 v = gt +v0

Z = 0.5 * g * Zaman * Zaman + Vsifir * Zaman + Hsifir

Hiz = g * Zaman + Vsifir


Z = 0.5 * g * Zaman * Zaman + Vsifir * Zaman + Hsifir
Veri giri k Hiz = g * Zaman + Vsifir

READ *, giren veri-listesi


READ (*, *) giren veri-listesi
READ *, g, zaman, vsifir, hsifir

PRINT *, kan veri-listesi


WRITE (*, *) kan veri-listesi
PRINT *, Ykseklik = , Z, m, Hz = , Hiz, m/s
Serbest d probleminin giri-kl hli
PROGRAM Serbest_Dusme
!--------------------------------------------------------------------------------------------------
! Bu program ykseklii z = gt2 + v0t + h0 ve hz v = gt +v0 denklemiyle bulur.
! Balangta kullancdan g, Zaman, Vsifir ve Hsifir deerlerini vermesi istenir
! Bu deerler girildiinde ykseklik ve hz m ve m/s cinsinden ekranda belirir
!--------------------------------------------------------------------------------------------------
IMPLICIT NONE
REAL g, Zaman, Vsifir, Hsifir
PRINT *, Yer cekimi sabiti g, zaman ve baslangic hizi ve ysekligi degerlerini giriniz
READ *, g, Zaman, Vsifir, Hsifir
Z = 0.5 * g * Zaman * Zaman + Vsifir * Zaman + Hsifir
Hiz = g * Zaman + Vsifir
PRINT *, Yukseklik = , Z, m, Hiz = , Hiz, m/s
PRINT *, Hosca kalin
END PROGRAM Serbest_Dusme
Not: END ve STOP komutlar
Eskiden END program dosyasnn sonunu gsterirdi.
Programlar
STOP
END
diye biterdi. imdi END STOP + END
anlamna geliyor. END programn sonunda
kullanlr. STOPu istediiniz yerde kullanabilirsiniz.
STOP veya STOP 15 veya STOP BITTI
Program dzeni ve biimi
Satr en ok 132 karakter uzunluktadr
Komutlar aralarna ; koyarak tek satra yazabilirsiniz
Satr altta devam edecekse sonuna & konur
CHARACTER zincirini devam ettirmek iin hem satr sonuna, hem dier
satrn bana & konur.
PRINT *, Nasilsiniz? yi misiniz? &
& Korkarim iyisiniz. :-)
Comment iin satr ! ile balatlr. Arada da kullanlr.
REAL Hiz ! Herhangi bir andaki hiz
fadelerde etiket (statement label) kullanlyorsa bu ifadeden nce gelir,
etiket ile ifade arasnda en az bir boluk braklr ve etiket 1 99999
arasnda bir say olur.
fadeler icra edilir (executable) veya icra edilmeyen (non-executable) diye
ayrlr.
Ak kontrol
READ *, A, B, C
DELTA = B*B 4.* A * C
DELTA = SQRT(DELTA)
X1 = (-B + DELTA) / (2. * A)
X2 = (-B - DELTA) / (2. * A)

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:

1 ise Pazartesi, 2 ise Sal, ve 7 ise Pazar


Gn program
PROGRAM HAFTANIN_GUNLERI
IMPLICIT NONE
INTEGER GUN
PRINT *, HAFTANIN HANGI GUNU?
READ *, GUN
IF(GUN == 1) THEN
PRINT *, PAZARTESI
STOP
ELSE IF(GUN == 2) THEN
PRINT *, SALI
STOP
ELSE IF(GUN == 3) THEN
PRINT *, CARSAMBA
STOP
Haftaya devam:
IF(GUN == 4) THEN
PRINT *, PERSEMBE
STOP
ELSE IF(GUN == 5) THEN
PRINT *, CUMA
STOP
ELSE IF(GUN == 6) THEN
PRINT *, CUMARTESI
STOP
VE HAFTANIN SONU
IF(GUN == 7) THEN
PRINT *, PAZAR
STOP
ELSE
PRINT *, GIRDIGINIZ GUNDE BIR &
&YANLISLIK OLMASIN?, GUN
END IF
END PROGRAM HAFTANIN_GUNLERI
Ayn probleme bir baka zm:
SELECT CASE (GUN)
CASE (1)
PRINT *, PAZARTESI
CASE (2)
PRINT *, SALI CASE (1)
CASE (3)
PRINT *, CARSAMBA
CASE (4)
PRINT *, PERSEMBE
CASE (5)
PRINT *, CUMA
CASE (6)
PRINT *, CUMARTESI
CASE (7)
PRINT *, PAZAR
CASE DEFAULT
PRINT *, GIRDIGINIZ SAYI 1 ILE 7 ARASINDA DEGIL: , GUN
END SELECT
END PROGRAM HAFTANIN_GUNLERI
imdi resmen grelim: IF
IF (logical expression) THEN
ifadeler
END IF
ELSE de bulunabilir:
IF (logical expression) THEN
ifadeler
ELSE
baka ifadeler
END IF
Baka?
IF (logical expression) THEN
ifadeler
ELSE
IF (logical expression) THEN
ifadeler
END IF
END IF
VE ELSE IF
IF (logical expression) THEN
ifadeler
ELSE IF(logical expression) THEN
baka ifadeler
ELSE IF(logical expression) THEN
daha da baka ifadeler
ELSE
ifadeler.. ifadeler
END IF
SELECT CASE
SELECT CASE(selector) alternatif
CASE (alternatif1) diye belirttiimiz etiketlerin
ifadeler iinde INTEGER,
CASE (alternatif2) CHARACTER veya
LOGICAL sabit veya ifade
ifadeler olabilir.
------
REAL olamyor.. Neden?
CASE DEFAULT
DEFAULT ne demek?
ifadeler
END CASE
IF ve SWITCH ifadeleri isim alabilir
sim: IF(logical expression) THEN
-----
END IF sim

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?

PRINT *, BES = , 5., GERCEK = , .TRUE., X1= , X1


Mantk operatrleri zeti:
Kyas operatrleri: Dier mantk operatrleri
.GT. > .AND.
.LT. < .OR.
.GE. >= .NOT.
.LE. <= .EQV.
.EQ. == .NEQV.
.NE. /=

Hiyerari: .NOT. .AND. .OR. .EQV. (veya .NEQV.)


Altrmalar:
P, Q ve R srasyla .TRUE.,.TRUE ve .FALSE. deerlerine sahiptir.
Buna gre aadaki ifadelerin sonucunu bulunuz:
P .AND. .NOT. Q .TRUE. .NOT. P .AND.
Q .FALSE.

P .AND. Q .OR. .NOT.R.TRUE. P .OR. Q .AND.Q.TRUE.

P .AND. .NOT. Q .OR.


R .FALSE.

P .AND. .NOT. (Q .OR.


R) .FALSE.
altrmalar
INTEGER:: NUMBER = 3, COUNT = 4, SUM = 5
Aadaki mantk ifadelerinin sonucunu bulunuz:

4.TRUE.
SUM NUMBER <= OLMAZ!
0 <= COUNT <= 5

.TRUE.
NUMBER**2 + COUNT**2 = = SUM**2

.TRUE.
NUMBER < COUNT .OR. COUNT < SUM

(NUMBER + 1 < SUM) .AND. .NOT. (COUNT + 1 <SUM)


.TRUE.
altrmalar
INTEGER:: X sfrdan farklysa .TRUE.
sonucunu veren bir mantk ifadesi yaznz:
X .NE. 0 veya X /= 0
X -10 ve +10 kapal aralndaysa .TRUE.
sonucunu veren bir mantk ifadesi yaznz
-10 < = X <= 10olmaz
(-10 <= X) .AND. (X <= 10)
altrmalar
REAL:: X, Y
X ve Ynin ya birlikte negatif, yahut birlikte
pozitif olduklarn .TRUE. Sonucunu veren bir
mantk ifadesi yaznz.

(X < 0) .EQV. (Y < 0)


altrmalar
Aadakilerden hangileri geerli IF ifadeleridir?

IF( A > B) PRINT *, A IF B < C N = N + 1 X


IF ( X <= Y) STOP IF (A = X) READ *, Y
IF(1 <= N <= 10) N = 10 X
IF (N > 1) PRINT *, *
IF ( X = = 10) INTEGER:: TAM X
altrmalar
IF(X >= Y)THEN X ve Y aadaki deerleri
PRINT*, X aldnda sonu nedir?
ELSE X = 5, Y = 6 6
PRINT*, Y 5
X = 5, Y = 5
END IF
X = 6, Y = 5 6
altrmalar
IF( X >= 0) THEN
IF(Y >= 0) THEN Aadaki deerler iin
PRINT *, X + Y sonucu bulun
ELSE
X = 5, Y = 5 10
PRINT *, X Y
END IF X = 5, Y = -5 10
ELSE X = -5, Y = 5 10
PRINT *, Y X
END IF
altrmalar
IF( N > = 90) THEN Aadaki deerler iin
PRINT *, PEKIYI sonucu bulun
ELSE IF (N >= 80) THEN
PRINT *, IYI N = 100 PEKIYI
ELSE IF (N >= 70) THEN N = 90 PEKIYI
PRINT *, ORTA
ELSE N = 89 IYI
PRINT *, KOTU N = 70 ORTA
END IF N=0 ZAYIF
altrmalar

N tam says negatif veya 100den bykse ktya


ARALIK DISI yazan bir IF ifadesi yazn:

IF( N < 0 .OR. N > 100) PRINT *, ARALIK DISI


altrmalar
REAL:: X;
INTEGER N IF (X< 1.5) THEN
IF (X
N =<11.5) N = 1
X <= 1.5 ise N = 1,
1.5 < X < 2.5 ise ELSE IFX(X.OR.
IF (1.5< < 2.5)
X <THEN
2.5) N = 2
N = 2 ve X bunlarn N = 2
IF (X >= 2.5) N = 3
dndaysa N = 3
deerini veren bir IF ELSE
yaznz. Yazarken N=3
programnzn hzl
almasna dikkat END IF
edin.
altrmalar
REAL:: NUMBER NUMBER = 99 ise
SELECT CASE(NUMBER)
CASE DEFAULT sonu nedir?
PRINT*, BOS VER 198
CASE(99)
PRINT*, NUMBER + 99 NUMBER = -1 ise?
CASE(-1)
PRINT*, NUMBER 1 -2
END SELECT
NUMBER = 50 ise?
BOS VER
altrmalar
REAL:: ORTALAMA
READ*, ORTALAMA
SELECT CASE (INT(ORTALAMA)
CASE (90:)
NOT = A
CASE (80:89)
NOT = B
CASE (70:79)
NOT = C
CASE (60:69)
NOT = D
CASE(:59)
NOT = F
END SELECT
4 Tekrarl icra
IF ve SELECT komutlar olmasa FORTRAN
programnda ifadeler yazl srasna gre yerine
getirilirdi. Programlar karar veremezdi.

Dz ak deitiren son komut tipi tekrar yaplardr.

Tekrar yaplar bir art yerine gelinceye kadar ayn


ilemler kmesinin bir daha- bir daha yaplmasn
salar.
Sayal DO dngleri
DO kontrol-deikeni = ilk-deer, son-deer, adm
ifadeler
END DO

kontrol-deikeni : Bir tam say deikenidir


ilk deer : kontrol-deikeninin
alaca ilk deerdir.
son-deer : kontrol-deikeninin alabilecei
son deerdir
adm : Dngden her geite ilk deere eklenecek
tam saydr
DO kontrol-deikeni = ilk-deer, son-deer, adm
ifadeler
END DO
!Misal,
!Misal: 1den Ne kadar
kadar saylarn
tek saylarn toplam
toplam:
INEGER:: I, N
REAL:: TOPLAM
----------
TOPLAM = 0.
DO I = 1, N , 2
TOPLAM = TOPLAM + I
END DO
DO etiket kontrol-deikeni = ilk-deer, son-deer, adm
ifadeler
etiket son-icra-edilebilir-komut
!Misal, 1den Ne kadar tek
!Misal: saylarn
saylarn toplam
toplam:
INEGER:: I, N
REAL:: TOPLAM
----------
TOPLAM = 0.
DO I = 100, 1, N , 2
100 TOPLAM = TOPLAM + I
Snf ortalamasnn bulunmas
!Snfta 54 renci var. Aldklar notlar tek tek !
girilecek ve renci says (OGRENCI) kadar !
not girildiinde ortalama hesaplanacak:

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

Ortalama probleminin mantk DOsuyla zm


TOPLAM = 0.
SAYAC
SAYAC == 10
DO
DO SAYAC = 1, OGRENCI
DO
SAYAC =NOT
PRINT*,
PRINT*, SAYAC
NOT +1
GIRINIZ
GIRINIZ
IF(SAYAC
READ*,
READ*, NOT
NOT> 53) EXIT
PRINT*, NOT
TOPLAM
TOPLAM = GIRINIZ
= TOPLAM
TOPLAM +
+ NOT
NOT
END READ*,
DO =NOT
SAYAC SAYAC +1
TOPLAM =
IF(SAYAC > TOPLAM
53) EXIT + NOT
END DO
END DO
CYCLE
Bir art yerine geldii zaman dngnn o tekrar
yaplmaz: 1den Ne kadar saylar toplama:

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?

pre-test dngsnn iindeki komutlar en az


bir kere yaplr X

post-test dngsnn iindeki komutlar en az


bir kere yaplr
hzl test
Programclar (drt) tip hata yaparlar:
1- Balangta bol gramer hatas- Bunlar derlemede
yakalanr
2- Program alrken ortaya kacak hatalar: 0a blmek,
say deikenine karakter okumak gibi. Bunlar icra
aamasnda ortaya kar.
3- Mantk hatalar bunlar ancak testlerin yanl sonu
vermesiyle anlalr
4- Link zaman hatalar: Yazlamayan dosyalar, bulunamayan alt programlar
hzl test
SQRT fonksiyonunun iine negatif bir say girmesi
..
icra zaman hatasdr

gramer
Unutulmu bir parantez veya trnak ..
derleyici
hatasdr ve ..bunu yakalar.

Bir algoritma tasarmnda bir admn ihmal edilmesi


mantk
. ????
hatasdr. ..bunu yakalar
hzl test
SAYI tam say ise aadaki program paras
nasl bir kt verir?
SAYI = 1
DO
IF(SAYI > 100) EXIT
PRINT*, SAYI
SAYI = 2 * SAYI
END DO
hzl test
SAYI ve LIMIT tam say ise aadaki program paras
4 ve -2 girdileri ile nasl bir kt verir?
READ*, LIMIT
SAYI = 0
DO
IF(SAYI > LIMIT) EXIT
PRINT*, SAYI LIMIT <= 4-2
SAYI = SAYI + 1 0/ 1/ 2/ 3/ 4
END DO
hzl test
SAYI ve LIMIT tam say ise aadaki program paras
4 ve -2 girdileri ile nasl bir kt verir?
READ*, LIMIT
SAYI = 0
DO
PRINT*, SAYI LIMIT
LIMIT <= <= 4-2
IF(SAYI > LIMIT) EXIT 0/
0 1/ 2/ 3/ 4/ 5
SAYI = SAYI + 1
END DO
Gerek problemler: 1) Seri toplam

Sin(x) deerini hesaplayan bir program yazalm


Farkl x deerleri iin farkl seriler kullanlabilir
Biz kk x deerlerinde alacak bir program
yazacaz Kimbilir? Belki byk xlerde de
alr
Sinx = Sin 0 + Cos 0 x Sin 0 x2/2! Cos 0 x3/3! + Sin 0 x4/4!..
Sin x = x x3/3! + x5/5! x7/ 7! + ...
Gerek problemler: 1) Seri toplam
Sin x = x x3/3! + x5/5! x7/ 7! + ...
PROGRAM SINUS_HESAPLA
IMPLICIT NONE
REAL:: X, SINUS, HASSASIYET, TERIM, ESKI
INTEGER :: SAY, ENFAZLA
READ *, X, HASSASIYET, ENFAZLA
SAY = 2; SINUS = X; ESKI = X;
DO
TERIM = - X*X*EKSI / (SAY*(SAY+1))
SINUS = SINUS + TERIM
ESKI = TERIM
SAY=SAY+2
Gerek problemler: 1) Seri toplam
Sin x = x x3/3! + x5/5! x7/ 7! + ...
SAY = 2; SINUS = X; ESKI = X; FKT= 1; ISARET = 1
DO
TERIM = - X*X*EKSI / (SAY*(SAY+1))
SINUS = SINUS + TERIM
ESKI = TERIM
SAY=SAY+2
IF((SAY .GT. ENFAZLA).OR.(ABS(TERIM) .LT. HASSASIYET))
&EXIT
END DO
PRINT *, X, SINUS, SIN(X)
END PROGRAM SINUS_HESAP
Gerek problemler: 2) En kk kareler metodu
Fiyat 160 180 200 220 240 260 280
Sat 126 103 82 75 82 40 20
en kk kareler

Yaplmas gereken: Kavunii paralarn toplamn


minimize etmek!
Toplamn?...
Mutlak deerlerinin toplamn veya karelerinin
toplamn.
en kk kareler

Erinin denklemi y = ax + b ise farklarn karelerinin


toplamn en kk yapacak ekilde a ve b ayarlanmal.
Her xi deeri iin fark2 = (a xi+ b yi)2

Fark karelerinin toplam = i(a xi+ b yi)2

En kk yapmak demek, a ve bye gre trev alp sfra


eitlemektir
en kk kareler
Fark karelerinin toplam = i(a xi+ b yi)2
En kk yapmak demek, a ve bye gre trev alp
sfra eitlemektir
aya gre: 2 ixi(a xi+ b yi) = 0
dzenlersek: a ixi2+ b ixi ixiyi = 0
bye gre: 2 i(a xi+ b yi) = 0
dzenlersek: a i xi+ n b iyi = 0
en kk kareler
a ixi2+ b ixi = ixiyi

a i xi+ b n = iyi

ki bilinmeyen iin iki denklem!


Toplamlara isim verelim Kolay olsun:
X2 = ixi2 X = ixi XY = ixiyi Y = iyi
D = X2 * n X*X
a = (XY * n X * Y) / D
en kk kareler
X2 = ixi2 X = ixi XY = ixiyi D = X2 * n X*X
a = (XY * n X * Y) / D b = (X2 Y X * XY) / D
_______________________________________________________________________________________________________

REAL :: X2, X, XY, Y, D, A, B, IKS, YE


INTEGER :: N, SAYAC
READ *, N
X2 = 0; X = 0; XY = 0; Y = 0
DO SAYAC = 1, N
READ *, IKS, YE
X = X + IKS
X2 = X2 + IKS * IKS
XY = XY + IKS * YE
Y = Y + YE
END DO
en kk kareler
X2 = ixi2 X = ixi XY = ixiyi D = X2 * n X*X
a = (XY * n X * Y) / D b = (X2 Y X * XY) / D
_______________________________________________________________________________________________________

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

PRINT 20, LIRA, TL, YENILIRA, YTL EDER


20 FORMAT( F12.0, 2X, A, 5X, F8.2, 2X, A)

12552000 TL 12.55 YTL EDER


---------------------------------------
DAHA IK IKTILAR
En kk kareler probleminde
PRINT *, N, A, B
12 -7.92923532E-01 2.49998734E+02
Gibi abuk ktlar verecektir
Halbuki
PRINT 55, N, A, B
55 FORMAT( 1X, I5, F12.5, 5X, F12.1)

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

PRINT 20, LIRA, TL, YENILIRA, YTL EDER


20 FORMAT( F12.0, 2X, A, 5X, F8.2, 2X, A)
yerine
PRINT ( F12.0, 2X, A, 5X, F8.2, 2X, A), LIRA, TL, &
YENILIRA, YTL EDER
yazabiliriz...
Daha k ktlar
Format ifadeleri: rnekler: 1234, 3.14159 ve 6.02 10**23
Iw I8 1234
Fw.d F12.4 3.1416
Ew.d E14.4 0.3142E+01
ESw.d ES14.4 6.0200E+23
ENw.d EN14.4 602.0000E+21
A lk karakter:
boluk: Normal tek aralk
Tc T20 0: ift aralk
nX 5X +: stne yaz
1: Sonraki sayfadan bala
Hzl snav
(Doru mu yanl m?) lk karakter 0 ise bir sonraki
sayfaya gidilir. X
(Doru mu yanl m?) 3I2 ile I2, I2, I2 ayndr.
(Doru mu yanl m?) F10.3 formatndaki 10, ondalk
iaretinin solundaki hane saysn, 3 de sandaki hane
saysn verir. X
(Doru mu yanl m?) T format kt ve girdilerin belli
bir noktada kesilmesi (truncate) iin kullanlr. X
(Doru mu yanl m?) Format PRINTdeki bilgiye gre
ksaysa, saa bakan ilk parantezden itibaren tekrarlanr.
hzl snav
(Doru mu yanl m?) F format
tanmlaycsnda, gerek deerler, virglden
sonra belirtilen rakam saysn uyacak ekilde
yuvarlanr.
/
_____ kty bir sonraki satra geirir.

N = 100 ise, PRINT (1X, 4I3), N ifadesi, 100


deerini ka defa yazdracaktr? 1 defa
REAL :: X = 234.56, Y = -1.0
INTEGER :: I = 987, J = -44

hzl snav CHARACTER(20) :: Form = (1X, I5, F10.1)

Ne kar? sorularda, u ifadelerin daha nce


Aadaki
PRINT 5, I, X kabul ediniz:
yazldn
5 FORMAT(1X, I = , I3, 2X, X =, F8.3, BITTI)
IREAL
=987 ::XX==234.560BITTI
234.56, Y = -1.0
--------------------------------------
INTEGER
PRINT Form, I, ::
X,IJ,=Y 987, J = -44
CHARACTER(20)
987 234.5 :: Form =-1.0
-44 (1X, I5, F10.1)
--------------------------------------
PRINT (1X, F10.0 / 1X, I3, T11, I5), X, I, J
234.
987 -44
--------------------------------------
CHARACTER (20) :: FORM = (2I3, F5.2, F1.0)
hzl snav ve X = 123.45, Y = 6.0, I = 99, J = 876

Bu deerlerin alnabilmesi iin veri nasl yazlmal?


READ *, I, J, X, Y
99 876 123.45 6.
READ (2I3, 2F6.0), I, J, X, Y
b99876123.45bbbbb6
-------------------------
READ (I3, F7.0, 2X, I5, T20, F5.0), I, X, J, Y
b99 123.45bb876 bbbb6
-------------------------
CHARACTER (20) :: FORM = (2I3, F5.2, F1.0)
hzl snav ve X = 123.45, Y = 6.0, I = 99, J = 876

Bu deerlerin alnabilmesi iin veri nasl yazlmal?

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

Formatl k almak isterseniz:


WRITE (6, (1X, 2F10.2)) AHMET, MEHMET
WRITE (6, FMT = (1X, 2F10.2)) AHMET, MEHMET
WRITE (6, 30) AHMET, MEHMET
30 FORMAT (1X, 2F10.2)
WRITE (UNIT = 6, FMT = 30) AHMET, MEHMET
30 FORMAT (1X, 2F10.2)
1. Birim numaras
2. Format ifadesi
WRITE 3. ADVANCE

Peki ADVANCE ne?

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.

READ (5, (2F10.2)) AHMET, MEHMET


READ (5, FMT = (2F10.2)) AHMET, MEHMET
READ (5, 30) AHMET, MEHMET
30 FORMAT (2F10.2)
READ (UNIT = 5, FMT = 30) AHMET, MEHMET
30 FORMAT (2F10.2)
Dosya ilemleri
Veri her zaman yle birka say Fiyat Sat
olmaz. Girite de, kta da
160 126
Klavyeyle yazp, ekrandan
okuyamazsnz 180 103
Dosyalara yazmak ve 200 82
dosyalardan okumak gerekir.
220 75

500 deer ifti olan bir en 240 82


kk kareler? 500 000? 260 40

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 =

ama_listesi ACTION = POSITION = IOSTAT =

birim: Dosya alrken ona bir numara verilir. Mesel


22 olsun
READ(22, 100) WRITE(22, 100)

FILE= dosyann ismidir Alrken iletim sistemi


dosyay bulur, kapanrken bu isimle saklanr (save)
FILE = ENKKVERI

STATUS = OLD veya NEW veya REPLACE


birim FILE = STATUS =

acma_listesi ACTION = POSITION = IOSTAT =

ACTION = READ veya


WRITE veya READWRITE Mesel INTEGER :: KOD
IOSTAT = KOD
POSITION = REWIND veya KOD = 0 dosya kazasz
APPEND veya ASIS belasz ald
KOD > 0 dosya alamad,
sebep verilen numaradan
IOSTAT = bir_tam_say_deiken
bulunur
Daha sonra bu deikeni okuyup KOD < 0 Verilerin sonuna
sonuta ne olduunu anlayabiliriz.
gelindi, hata yok
(IOSTAT, READ ile de
kullanlabilir.)
OPEN
Diskteki INFO.DAT isimli mevcut bir dosyay ap
iindeki deerleri okumak istiyoruz

OPEN (UNIT = 12, FILE = INFO.DAT, STATUS = OLD, &


ACTION = READ, POSITION = REWIND, IOSTAT = ACILDIMI)

Sonra, READ(12, *) gibi bir komutla info.dat


dosyasndaki bilgileri okuyabiliriz
OPEN
Dosya ismini ill programn iine yazmak gerekmez

CHARACTER(10):: DosyaIsmi
WRITE(*, (1X, A), ADVANCE = NO) &
Dosyanin ismini yaziniz:
READ*, DosyaIsmi

OPEN(UNIT = 12, FILE = DosyaIsmi, STATUS = OLD, &


ACTION = READ, POSITION = REWIND, IOSTAT = &
ACILDIMI)

IF (ACILDIMI >0) PRINT **** DOSYAYI ACAMIYORUM***


OPEN
Farkl bir uygulama: ine yazmak iin RAPOR isimli yeni bir
dosya aalm:
OPEN(UNIT = 13, FILE = RAPOR, STATUS = NEW, &
ACTION = WRITE, IOSTAT = ACILDIMI)
Sonra bu dosyaya, FIYAT ve MIKTAR verilerini yazmak iin
u ifadeyi kullanabiliriz:
WRITE(13, (1X, 2F10.3)) FIYAT, MIKTAR

imiz bitince de dosyay kapatrz:

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)

FUNCTION TLDEN_YTLYE( YTL)

REAL FUNCTION TLDEN_YTLYE( YTL)


Fahrenheit- Santigrat dnm
FUNCTION F_DEN_C_YE (FSICAKLIK)
REAL :: F_DEN_C_YE
REAL INTENT(IN) :: FSICAKLIK

F_DEN_C_YE = (FSICAKLIK 32.0)/ 1.8

END FUNCTION F_DEN_C_YE


Fahrenheit- Santigrat dnm
PROGRAM SICAKLIK_DONUSUMU
IMPLICIT NONE
REAL :: FDERECESI, CDERECESI
CHAR(1) :: CEVAP
DO
WRITE(*, (1X, A), ADVANCE = NO) F SICAKLIGI GIRINIZ
READ *, FDERECESI
CDERECESI = F_DEN_C_YE(FDERECESI)
PRINT 1X, 2(F6.2, A), FDERECESI, F , CDERECESI, C YE ESITTIR
WRITE(*, (1X, A), ADVANCE = NO) BASKA DONUSUM YAPCAN MI? &
& (E VEYA H)
READ *, CEVAP
IF (CEVAP /= H) EXIT
END DO
CONTAINS
FUNCTION F_DEN_C_YE (FSICAKLIK)
REAL :: F_DEN_C_YE
REAL INTENT(IN) :: FSICAKLIK
F_DEN_C_YE = (FSICAKLIK 32.0)/ 1.8
INTERNAL
END FUNCTION F_DEN_C_YE

END PROGRAM SICAKLIK_DONUSUMU


Fahrenheit- Santigrat dnm
PROGRAM SICAKLIK_DONUSUMU
IMPLICIT NONE
REAL :: FDERECESI, CDERECESI
CHAR(1) :: CEVAP
DO
WRITE(*, (1X, A), ADVANCE = NO) F SICAKLIGI GIRINIZ
READ *, FDERECESI
CDERECESI = F_DEN_C_YE(FDERECESI)
PRINT 1X, 2(F6.2, A), FDERECESI, F , CDERECESI, C YE ESITTIR
WRITE(*, (1X, A), ADVANCE = NO) BASKA DONUSUM YAPCAN MI? &
& (E VEYA H)
READ *, CEVAP
IF (CEVAP /= E) EXIT
END DO
END PROGRAM SICAKLIK_DONUSUMU
FUNCTION F_DEN_C_YE (FSICAKLIK)
REAL :: F_DEN_C_YE
EXTERNAL
REAL INTENT(IN) :: FSICAKLIK
F_DEN_C_YE = (FSICAKLIK 32.0)/ 1.8
END FUNCTION F_DEN_C_YE
Fonksiyonun tipi
FUNCTION F_DEN_C_YE (FSICAKLIK)
REAL :: F_DEN_C_YE
REAL INTENT(IN) :: FSICAKLIK
F_DEN_C_YE = (FSICAKLIK 32.0)/ 1.8
END FUNCTION F_DEN_C_YE

REAL FUNCTION F_DEN_C_YE (FSICAKLIK)


REAL INTENT(IN) :: FSICAKLIK
F_DEN_C_YE = (FSICAKLIK 32.0)/ 1.8
END FUNCTION F_DEN_C_YE
Deikenler
Yerel deiken- global deiken (Scope Eriim?)
Altprogramda ilan edilen deikene dardan
ulalamaz.
Ana programda iln edilen deikene o programn i
alt programlarndan ulalabilir. Eer alt programda
ayn isimde deiken varsa, o ne geer.
SAVEREAL, SAVE :: liste veya SAVE liste
INTENT (IN) REAL INTENT (IN) :: .
HIZLI SINAV
1. ki tip FORTRAN altprogram hangileridir?
FUNCTION ve SUBROUTINE
2. FUNCTION alt programnn drt parasn
sayn.
fonksiyon bal
tanmlar ksm
icra ksm
END FUNCTION ifadesi
HIZLI SINAV
3. TOPLA (A, B) de A ve B nedir?
TOPLA fonksiyonun argmanlar
4. Bir programda, bir deikenin deerine ulalabilen
program ksmlarna o deikenin nesi denir?
Scope
5. (Doru mu?) Fonksiyon alt program ve ana program
ayn deiken isimlerini kullanabilir.

HIZLI SINAV
FUNCTION NE(N)
INTEGER :: NE
INTEGER INTENT(IN) :: N
NE = (N * (N + 1) ) / 2
END FUNCTION NE
Ana programda SAYI1 = NE(SAYI2) yazyorsa SAYI2ye, actual
argman denir.
Ana programda SAYI = NE(3) yazyorsa, SAYI hangi deeri alr? 6
NE fonksiyonun iinde NE = 1 gibi bir ifade bulunabilir.
X
7 SUBROUTINE ALT
PROGRAMLARI
Function alt programndan fark
FUN(X) fonksiyon, SUB(X) subroutine olsun

1. FUNun ismi geri dnen deeri tar. SUB


herhangi bir deer tamaz.
2. (1) in sonular: FUNun tipi vardr: REAL,
INTEGER, LOGICAL gibi SUBun tipi
yoktur.
Function alt programndan fark
FUN(X) fonksiyon, SUB(X) subroutine olsun
Programda kullanl:

...
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

SUBROUTINE GSDS(GIRENSAAT,GUN,SAAT,DAKIKA, SANIYE)


REAL, INTENT(INOUT) :: GIRENSAAT
INTEGER, INTENT(OUT) :: GUN, SAAT, DAKIKA, SANIYE
INTEGER :: TAMSANIYE
..
! VE PRINT KOMUTU BU SUBROUTINEDEN CIKARILIR
..
END SUBROUTINE GSDS
Bir baka zm:
PROGRAM BIRPROGRAM
REAL :: SAATLER
PRINT *, KAC SAAT?
READ*, SAATLER
CALL GSDS(SAATLER, GUN, SAAT, DAKIKA, SANIYE)
PRINT "(1X, T10, A, T20, A, T30, A, T40, A/ 2X, 4I10)", &
GUN, SAAT, DAKIKA, SANIYE, &
GUN, SAAT, DAKIKA, SANIYE
END PROGRAM BIRPROGRAM
Hzl test
SUBROUTINE CALCULATE(ALPHA, NUMBER_1, &
NUMBER_2)
REAL, INTENT(IN) :: ALPHA
INTEGER, INTENT(OUT) :: NUMBER_1
INTEGER, INTENT(INOUT) :: NUMBER_2
.....
END SUBROUTINE CALCULATE
Ana programda da aadaki ilanlar yaplm:
INTEGER :: CODE, ID_NUMBER
REAL :: RATE
SUBROUTINE CALCULATE(ALPHA, NUMBER_1, NUMBER_2)
REAL, INTENT(IN) :: ALPHA
INTEGER, INTENT(OUT) :: NUMBER_1
INTEGER, INTENT(INOUT) :: NUMBER_2
END SUBROUTINE CALCULATE
Hzl test Ana programda da aadaki ilanlar yaplm:
INTEGER :: CODE, ID_NUMBER
Doru mu? REAL :: RATE

RATE = CALCULATE(2.45, CODE, ID_NUMBER) X


X
CALL CALCULATE(RATE + 0.5, 0, CODE 2 ID_NUMBER)
CALL CALCULATE(RATE, ID_NUMBER) X
CALL CALCULATE(RATE, CODE, ID_NUMBER)
CALL CALCULATE X
CALL CALCULATE(RATE, RATE, RATE) X
Aadaki program nasl kt verir?
program question_11
character(3) :: str1 = cat, str2 = dog, str3 = elk
call change(2, str1, str2, str3)
print*, String = , str1, str2, str3
contains
subroutine change(Number, a, b,c)
integer, intent(in) Number
character(3), intent(inout) a, b, c
character(3) :: bat = bat
if(Number < 3) then
a = bat
b= bat
else
c = bat
end if
end subroutine change
end program question_11
zmler- Cosinus
program main real function cosinusus(x)
implicit none
REAL :: x !cos x = 1 - x2/2! + x4/4!- xn/ n! + ...
INTEGER :: j REAL, INTENT(IN):: x
REAL :: cosx, terim
x = 0. INTEGER :: fkt, isaret, i
do j=0,90 cosx = 1.; fkt = 1 ; isaret = 1
do i=1,20, 2
print*, cos(x), cosinusus(x)
isaret=-isaret
x=x+0.01745 fkt = fkt * i * (i +1)
end do terim = REAL(isaret) * x**(i+1) / fkt
cosx=cosx+terim
CONTAINS end do
. cosinusus = cosx
end function cosinusus
end program main
zmler- eyrek ember
program main
Integer
integer :: i, j,function
topla icmidismi(x, y)
integer, real,
parameter :: nokta
intent(in) :: x, =y 10000
real :: sonuc
if(sqrt(1-x*x) > y) then
topla = 0 icmidismi = 1
do 100 ielse
= 0, nokta
do 100 j icmidismi
= 0, nokta = 0
100 topla = topla + icmidismi(i/real(nokta), j/real(nokta))
end if
sonuc = real(topla) / (nokta + 1) ** 2
end function icmidismi
print *, 4.*sonuc
end program main
program main logical function boltest(sayi, bolen)
implicit none integer, intent(in):: sayi, bolen
integer :: i, j if((sayi/bolen) * bolen == sayi) then
logical asalmi, boltest boltest = .true.
do 100 i = 3, 1001, 2 else
asalmi = .true. boltest = .false.
do 200 j = 3, i-1end if
if(boltest(i,
endj)) asalmiboltest
function = .false.
200 continue
100 if(asalmi) print *, i
end program main
8 Dizinler- Arrays
Problem:
50 rencili bir snfta, her rencinin notunu ve notun
ortalamann ka puan stnde veya altnda olduunu
hesaplayp bastrmak istiyoruz.
REAL NOT, ORTALAMA
ORTALAMA = 0.
DO 100 I = 1, 50
READ *, NOT
PRINT*, NOT
100 ORTALAMA = ORTALAMA + NOT
ORTALAMA = ORTALAMA / 50.
MD NAPCAZ?
50 rencili bir snfta, her
rencinin notunu ve notun
ortalamann ka puan stnde
Dizinler- Arrays veya altnda olduunu
hesaplayp bastrmak istiyoruz.
REAL DIMENSION(50)
REAL, :: NOT(50)
NOT(1:50) :: NOT
ORTALAMA = 0
DO 100 I = 1, 50
READ *, NOT(I)
100 ORTALAMA = ORTALAMA + NOT(I)

ORTALAMA = ORTALAMA / 50.

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)

ORTALAMA = ORTALAMA / 50.

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.

Peki ya renci saysn bilmiyorsak?

REAL, DIMENSION(:), ALLOCATABLE :: NOT, SAPMA


cra zaman dizinleri
REAL, DIMENSION(:), ALLOCATABLE :: NOT, SAPMA
INTEGER :: HATA
....
READ *, OSAY
ALLOCATE(NOT(1:OSAY), SAPMA(1:OSAY), STAT = HATA)
IF(HATA .NE. 0) STOP HAFIZADA YER YOK
....

DEALLOCATE(NOT, SAPMA, STAT = HATA)


IF(HATA .NE.0) PRINT *, BOYLE BIR ARRAY YOK KI...
Fortran dizin fonksiyonlar
ALLOCATED(A)
DOT_PRODUCT(A, B)
MAXVAL(A)
MAXLOC(A)
MINVAL(A)
MINLOC(A)
PRODUCT(A)
SIZE(A)
SUM(A)
Not ortalamas probleminin baka bir zm
PROGRAM NOT_ORTALAMASI
...
PRINT *, ORTALAMA(NOT, OSAYI)
...
CONTAINS

REAL FUNCTION ORTALAMA (DEGERLER, SAYI)


INTEGER :: SAYI
REAL :: DEGERLER(SAYI)
ORTALAMA = SUM(DEGERLER) /REAL(SAYI)
END FUNCTION ORTALAMA
END PROGRAM NOT_ORTALAMASI
Baka...
Dizin elemanlarna DOsuz da deer verilebilir:
REAL :: A(10)
A=0 Btn elemanlar 0 yapar
A = (/11, 22, 33, 44, 55, 66, 77, 88, 99, 110 /)
Elemanlara gsterilen deerleri verir
Bilin bakalm bu ne yapar:
REAL :: B(5)
INTEGER :: I(5)
I = (/5, 3, 3, 4, 3/)
B = A(I)

A(1:10:2) = (/(I**2, I = 1, 5)) INDEKS LS


(SUBSCRIPT TRIPLET)
WHERE
En iyisi misalle anlatmak:
integer, dimension(5) :: a = (/0, 2, 5, 0, 10/)
real dimension(5) :: b

WHERE(a > 0) b= 1.0/ a

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)

You might also like