* Önsöz
* Fortran'a Giriş
* Fortran'nın Temelleri
* Basit ve Formatlı Okuma/Yazma
* Temel Kütüphane Fonksiyonları
* Karşılaştırma Deyimleri
* Döngüler
* Alt Programlar I
* Alt Programlar II
* Diziler
* Dinamik Diziler
* Gösterici (Pointer) Kavramı
* Katarlar (Stringler)
* Yapısal Veri Tipleri
* Dosya Yönetimi
* Modül Kavramı
* Sayısal Tipler (KINDs)
* Bit Düzeyinde Çalışmak
* Kütüphane Fonksiyonları Listesi
* Yararlanılan Kaynaklar
* - - -
* Karmaşık Sayılar
* Tarih-Saat Fonksiyonları
* Rastgele Sayılar
* Katar - Sayı Dönüşümleri
* Komut Satırı İşlemleri
* Co-Array Fortran
* Derleme Seçenekleri
* Fortran ve C
* Sayılar Kuramı
* Analiz
* Lineer Cebir
Fortran 90/95 Derleyicileri
|
* Salford (silversoft FTN95)
* G95
* GFORTRAN
* programlama.com
* Fortran (wikipedia)
* fortran.gantep.edu.tr
* g95.org
* Hot scripts
* E-posta
|
|
Bölüm 5: Karşılaştırma Deyimleri
##################-- (%90)
|
Giriş
Program içerisinde bazen iki veya daha fazla değerin karşılaştırılması gerekebilir.
Bunun için, bütün programlama dillerinde karşılaştırma deyimleri mevcuttur.
Fortran dili, IF ve CASE deyimleri ile karşılaştırma işlemi yapmaya izin verir.
5.1 Karşılaştırma Operatörleri ve Mantıksal Operatörler
İki veya daha fazla değerin mukayese edilmesi için
karşılaştırma operatörleri ve mantıksal operatörler kullanılır. Bu operatörlerin listesi Tablo 5.1'de verilmiştir.
Tablo 5.1: Karşılaştırma Operatörleri
Operatör |
Açıklama |
Örnek |
Anlamı |
Eski |
Yeni |
.GT. |
> |
büyüktür |
x > y |
x, y den büyük mü? |
.LT. |
< |
küçüktür |
x < y |
x, y den küçük mü? |
.EQ. |
== |
eşittir |
x == y |
x, y ye eşit mi? |
.GE. |
>= |
büyük-eşittir |
x >= y |
x, y den büyük yada eşit mi? |
.LE. |
<= |
küçük-eşittir |
x <= y |
x, y den küçük yada eşit mi? |
.NE. |
/= |
eşit değil |
x /= y |
x, y den farklı mı? |
Tablo 5.1'deki Eski sütunundaki operatörler FORTRAN 77'ye kadar ki dönemde kullanılmaktaydı.
Fortran 90'dan itibaren, aynı anlama gelen Yeni sütunundaki operatörler dahil edilmiştir.
Fortran 90'da hem Eski hem de yeni operaörleri kullanmaya izin verir.
Birden çok karşılaştırma işlemi, Tablo 5.2'deki Mantıksal Operatörler'le birleştirilebilir.
Tablo 5.2: Mantıksal Operatörler
Operatör |
Açıklama |
Örnek |
Anlamı |
.AND. |
mantıksal VE |
x>2 .AND. x<y |
x, 2 den büyük VE y den küçük mü? |
.OR. |
mantıksal VEYA |
x>2 .OR. x<y |
x, 2 den büyük VEYA y den küçük mü? |
.NOT. |
mantıksal DEĞİL |
.NOT. x>2 |
x, 2 den büyük DEĞİL ise |
.EQV. |
mantıksal EŞDEĞER (veya DENK) |
x .EQV. y |
x ve y mantıksal olarak DENK mi? |
.NEQV. |
mantıksal EŞDEĞER (veya DENK) DEĞİL |
x .NEQV. y |
x ve y mantıksal olarak DENK DEĞİL mi? |
Fortran'da, bir mantıksal işlemin sonucu doğru (olumlu), .TRUE. veya yanlış (olumsuz), .FALSE. olabilir.
LOGICAL veri tipi kullanılarak, bir mantıksal işlemin sonucunu değerlendirmek mümkündür. Program 5.1'de
LOGICAL veri tipinin kullanımı gösterilmiştir.
Program 5.1: Mantıksal işlemler
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
|
PROGRAM Mantiksal
!--------------------------------------------------------
! 05prg01.f95
! Mantıksal işlemler
!--------------------------------------------------------
LOGICAL :: L1, L2, L3, L4, L5, L6, L7, L8, L9
INTEGER :: x = 1, y = 2;
L1 = .TRUE.
L2 = .FALSE.
L3 = L1 .OR. L2
L4 = 9 > 4
L5 = x < 3
L6 = x >= y .AND. y > 0
L7 = .NOT. L4
L8 = L1 .EQV. L5
L9 = L4 .NEQV. L5
PRINT *,"L1 L2 L3 : ", L1, L2, L3
PRINT *,"L4 L5 L6 : ", L4, L5, L6
PRINT *,"L7 L8 L9 : ", L7, L8, L9
END PROGRAM |
ÇIKTI
L1 L2 L3 : T F T
L4 L5 L6 : T T F
L7 L8 L9 : F T F
|
Program çıktısındaki T harfi doğru (.TRUE.), F harfi yanlış (.FALSE.) mantıksal
değerine karşılık gelir.
- 10. ve 11. satırda, L1 = .TRUE. ve L1 = .FALSE. ile mantıksal değişkenlere ilk değerler atanmıştır.
- 12. satırda, L1 VEYA L2'den birinin doğru olması aranmaktadır. Sonuç olumlu olduğu için L3 = .TRUE. olmuştur.
- 14. satırda, L4 = 9 > 4 atamasının sağ tarafı herzaman doğrudur. Bu yüzden L4 = .TRUE.'dur.
- 15. satırda, L5 = x < 3 atamasında x < 3 olduğu için L5 = .TRUE.'dur.
- 16. satırda, x >= y .AND. y > 0 işleminin sonucunun mantıksal değeri yanlışdır. Bu yüzden L6 = .FALSE. olur.
- 18. satırda, L4 mantıksal değerinin olumusuzu (veya değili) L7'ye atanmıştır. L4 = .TRUE. olduğuna göre, L7 = .FALSE. olur.
- 19. ve 20. satırda, mantıksal denklikler sorgulanmıştır.
Bu operatörler kullanılarak, bütün mantıksal operatörler için Tablo 5.3'de verilen doğruluk denklik tablosu oluşturulabilir.
Tablo 5.3: Doğruluk Değerleri
p |
q |
.NOT. p |
p .AND. q |
p .OR. q |
p .EQV. q |
p .NEQV. q |
F |
F |
T |
F |
F |
T |
F |
F |
T |
T |
F |
T |
F |
T |
T |
F |
F |
F |
T |
F |
T |
T |
T |
F |
T |
T |
T |
F |
5.2 IF, IF ... ELSE IF ... ELSE Yapıları
Bu deyimler, koşullu işlem yapan deyimlerdir. IF ve ELSE tek bir karşılaştırma
deyimi olup ELSE kullanımı isteğe bağlıdır.
* Basit IF Yapısı
IF deyiminin en basit kullanımı:
IF(koşul) deyim
şeklindedir. koşul olumlu ise IF deyiminin yanındaki deyim icra edilir.
Aksi halde bu satır atlanır. Örneğin:
IF( X > 0.0 ) Y = SQRT(X)
* Blok IF Yapısı
IF(koşul) THEN
küme
END IF
Burada küme bir veya daha fazla satırdan oluşan deyimler grubudur.
Eğer bu koşul olumlu ise THEN'den sonraki bölüm (küme) yürütülür.
Blok IF yapısı END IF ile son bulur.
Örneğin:
IF( X > 0.0 ) THEN
Y = SQRT(X)
Z = Y + 1.0/X
END IF
* IF ... ELSE Yapısı
IF(koşul) THEN
küme1
ELSE
küme2
END IF
Eğer bu koşul olumlu ise THEN'den sonraki
bölüm (küme1), olumsuz ise ELSE'den sonraki bölüm (küme2) yürütülür.
Bu yapının kullanılmasına dair bir örnek Program 5.2'de gösterilmiştir. Program, klavyeden girilen
bir tamsayının çift olup olmadığını sınar. Bilindiği gibi, çift sayılar, 2 ile kalansız bölünebilen sayılardır.
Program 5.2: Bir tamsayının çift olup olmadığını sınar
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
PROGRAM Cift_Tek
!--------------------------------------------------------
! 05prg02.f95
! Bir tamsayının çift olup olmadığını sınar
!--------------------------------------------------------
INTEGER :: X
PRINT *,"Bir sayi girin:"
READ *,X
! X/2 den kalanı sorgula
IF( MOD(X,2) == 0 ) THEN
PRINT *,"sayi cifttir"
ELSE
PRINT *,"sayi tektir"
END IF
END PROGRAM |
ÇIKTI
Bir sayi girin:
3
sayi tektir.
|
Mantıksal Operatörler kullanarak birden çok karşılaştırma birleştirilebilir. Buna iyi bir örnek Program 5.3'de gösterilmiştir.
Program, bir klavyeden girilen bir tamsayıyı yıl bilgisi olarak kabul eder ve yılın artık yıl olup olmadığını sınar.
Bir yıl içinde, Şubat ayı 29 gün olursa o yıl artık yıl olarak adlandırılır.
Artık yıl peryodik olarak 4 yılda bir gelir. Genel kanı "bir yıl 4 ile tam bölünebirse
o yıl artık yıldır" şeklindedir. Fakat 1996 artık yıl iken 1800 artık yıl değildir.
Genel sorgulama söyle olmalıdır:
Eğer bir yıl
- 4 ile tam bölünüyorsa VE 100'e tam bölünmüyorsa VEYA
- 400 'e tam bölünüryorsa
o yıl artık yıldır.
Program 5.3: Bir yılın artık olup olmadığını sınar
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
PROGRAM Artik_Yil
!--------------------------------------------------------
! 05prg03.f95
! Bir yılın artık olup olmadığını sınar
!--------------------------------------------------------
INTEGER :: Yil
PRINT *, "Bir yil girin:"
READ *, Yil
IF( MOD(Yil,4) == 0 .AND. MOD(yil, 100) .NE. 0 &
.OR. MOD(Yil, 400) == 0 ) THEN
PRINT *, Yil, " artik yil"
ELSE
PRINT *, Yil, " artik yil degil"
END IF
END |
ÇIKTI
Bir yil girin:
1996
1996 artik yil
|
* IF ... ELSE IF ... ELSE Yapısı
Eğer program içinde kullanılacak koşulların sayısı ikiden çok ise aşağıdaki yapı kullanılır:
IF(koşul_1) THEN
küme_1
ELSE IF(koşul_2) THEN
küme_2
.
.
.
ELSE IF(koşul_N) THEN
küme_N
ELSE
küme_N+1
END IF
Aşağıdaki gibi parçalı fonksiyon düşünelim:
Bu fonksiyon Fortran'da aşağıdaki gibi bir yapıya sahip olur:
IF (x <= 0) THEN
F = -x
ELSE IF(x>0 .AND. x<1) THEN
F = x**2
ELSE
F = 1.0
END IF
Program 5.4, ax2 + bx + c = 0 formundaki ikinci dereceden bir polinomun
gerçel (reel) köklerini hesaplar. Bu program
IF, ELSE IF ve ELSE yapısı göstermek için klasik bir örnektir.
Program 5.4: ax**2 + bx + c = 0 denkleminin gerçel köklerinin bulunması
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
|
PROGRAM Kuadratik
!-----------------------------------------------------------
! 05prg04.f95
! ax**2 + bx + c = 0 denkleminin gerçel köklerinin bulunması
!-----------------------------------------------------------
IMPLICIT NONE
REAL :: a, b, c, Delta, x1, x2
PRINT *, "a, b, c degerlerini girin:"
READ *, A,B,C
Delta = B**2 - 4.0*A*C
IF( Delta > 0.0 ) THEN
x1 = ( -B + SQRT(Delta) )/( 2.0*A )
x2 = ( -B - SQRT(Delta) )/( 2.0*A )
WRITE (*,*) "Gerçel kökler: ", x1, x2
ELSE IF( Delta == 0.0 ) THEN
x1 = -B /( 2.0*A )
x2 = -B /( 2.0*A )
WRITE (*,*) "Kökler eşit: ", x1, x2
ELSE
WRITE (*,*) "Kökler gerçel değil! "
END IF
END PROGRAM |
ÇIKTI
a, b, c degerlerini girin:
1 1 1
Kökler gerçel değil!
|
ÇIKTI
a, b, c degerlerini girin:
2 4 -8
Gerçel kökler: 1.236068 -3.236068
|
5.3 CASE Yapısı
Bu deyim bir değişkenin içeriğine bakarak, programın akışını bir çok
seçenekten birine yönlendirir. CASE (durum) deyiminden sonra
değişkenin durumu belirlenir ve takip eden satırlar (deyimler) işleme konur.
Bütün durumların aksi söz konu olduğunda gerçekleştirilmesi istenen deyimler
DEFAULT deyiminden sonraki kısımda bildirilir. Genel yazım biçimi:
SELECT CASE ( değişken )
CASE (durum_1)
küme_1
CASE (durum_')
küme_2
.
.
.
CASE (durum_N)
küme_N
CASE DEFAULT
hata deyimleri veya varsayılan deyimler
END SELECT
Burada:
- değişken tamsayı (INTEGER) veya karakter (CHARACTER) veri tipinde olmalıdır.
- durum_i bir değeri veya bir değer aralığını temsil eder. Şöyleki;
değer | tek bir değer |
değer1 : değer2 | değer1'den değer2'ye kadar bütün ara değerler |
değer1 : | değer1'den büyük bütün değerler |
: değer2 | değer2'den küçük bütün değerler |
Örneğin, aşağıdaki CASE yapısı ile, bilinen bir notun harf karşılığı belirlenebilir.
SELECT CASE(Not)
CASE(0:49)
Harf = "F"
CASE(50:64)
Harf = "D"
CASE(65:74)
Harf = "C"
CASE(75:84)
Harf = "B"
CASE(85:)
Harf = "A"
CASE DEFAULT
PRINT *,"Geçersiz not", Not
END SELECT
Burada, Not 0-49 arası ise Harf değişkenine "F", 50-74 arası "D", 75-84 arası "B" ve 85'den büyük
ise "A" değeri atanmaktadır. Hata durumuda, yani not 0'dan küçük olduğunda, ekrana "Geçersiz not" iletisi bastırlır.
Program 5.5'de, klavyeden girilen iki sayıyı yapılan seçime göre sayıların toplamı, farkı, çarpımı veya oranı ekrana yazdırır.
Program 5.5: CASE yapısı ile dört işlem
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
|
PROGRAM Dort_Islem
!-----------------------------------------------------------
! 05prg05.f95
! CASE yapısı ile dört işlem
!-----------------------------------------------------------
IMPLICIT NONE
REAL :: X, Y, Sonuc
INTEGER :: Secim
PRINT *, "Iki sayi girin:"
READ *, X, Y
WRITE(*,*) "*** Menu ***"
WRITE(*,*) "[1] Toplama"
WRITE(*,*) "[2] Cikarma"
WRITE(*,*) "[3] Carpma"
WRITE(*,*) "[4] Bolme"
WRITE(*,*)
WRITE(*,*) "Seciminiz ?";
READ (*,*) Secim
SELECT CASE( secim )
CASE (1)
sonuc = x + y;
PRINT *, "Toplam = ",sonuc
CASE (2)
sonuc = x-y;
PRINT *, "Fark = ",sonuc
CASE (3)
sonuc = x * y;
PRINT *, "Carpim = ",sonuc
CASE (4)
sonuc = x/y;
PRINT *, "Oran = ",sonuc
CASE DEFAULT
PRINT *,"Yanlis secim "
END SELECT
END PROGRAM |
ÇIKTI
Iki sayi girin:
5 3
*** Menu ***
[1] Toplama
[2] Cikarma
[3] Carpma
[4] Bolme
Seciminiz ?
4
Oran = 1.6666666
|
CASE yapısı IF-ELSE yapısının bir alternatifidir. Yani, Program 5.5'daki
CASE kısmı, IF-ELSE yapısı ile de aşağıdaki gibi yazılabilirdi. İnceleyiniz.
SELECT CASE( secim )
CASE (1)
sonuc = x + y
PRINT *, "Toplam = ",sonuc
CASE (2)
sonuc = x - y
PRINT *, "Fark = ",sonuc
CASE (3)
sonuc = x * y
PRINT *, "Carpim = ",sonuc
CASE (4)
sonuc = x / y
PRINT *, "Oran = ",sonuc
CASE DEFAULT
PRINT *,"Yanlis secim "
END SELECT
|
IF(secim == 1) THEN
sonuc = x + y
PRINT *, "Toplam = ",sonuc
ELSE IF(secim == 2) THEN
sonuc = x - y
PRINT *, "Fark = ",sonuc
ELSE IF(secim == 3 ) THEN
sonuc = x * y
PRINT *, "Carpim = ",sonuc
ELSE IF(secim == 4) THEN
sonuc = x / y
PRINT *, "Oran = ",sonuc
ELSE
PRINT *,"Yanlis secim "
END IF
|
5.4 İsimlendirilmiş Koşul Yapıları
Fortran 90 ile birlikte gelen yeniliklerden bir tanesi de isimlendirilmiş yapı (named construct) kavramıdır.
İsimlendirilmiş yapılar Kontrol deyimlerinde (IF, CASE) ve döngü yapılarında (DO) kullanıldığında,
programın okunurluğunu arttır. Bu yenilik sayesinde IF ve CASE yapıları bir etiket (label) kullanılarak
isimlendirilir. IF yapısı için genel kullanım biçimi
etiket: IF(koşul) THEN
.
.
.
END IF etiket
şeklindedir. Örneğin:
guncelle: IF( x > xmax ) THEN
xmax = x
ymax = y
konum = k
END IF guncelle
Benzer olarak CASE yapısı için aşağıdaki örnek verilebilir.
PRINT *,"Kaç yaşındasın?"
READ *,Yas
Mesaj: SELECT CASE(Yas)
CASE( :12); PRINT *,"Daha cocuksun"
CASE(12:19); PRINT *,"Gençlige adım atıyorsun"
CASE(20:35); PRINT *,"Genç birisin"
CASE(36:50); PRINT *,"Orta yaşlısın"
CASE(51: ); PRINT *,"Yaşlanıyorsun"
END SELECT Mesaj
Bu yapının kullanımıyla ilgili bir örnek Program 5.6'da gösterilmiştir. Program, klavyeden girilen
kenar uzunluklarına göre bir üçgenin tipini, alanını çevresini ve açılarını hesaplamaktadır.
Aşağıdaki gibi kenar uzunlukları a, b ve c olan bir üçgen düşünelim.
Verilen kenar uzunlukları ile üçgen oluşturturabilmek için, kenarlar arasında önce aşağıdaki şartın sağlanması gerekir:
Şart sağlandıktan sonra, "üçgenin tipi" şu şekilde belirlenebilir.
Bu üçgenin çevresi ve alanı aşağıdaki basit formüllerle hesaplanabilir.
burada
Son olarak, üçgenin açılarını bulmak için "kosinüs kuramı" kullanılabilir. Buna göre her bir kenar ve açı arasındaki ilişki
şeklindedir. Buradan açılar aşağıdaki formülle hesaplanabilir:
Program 5.6'da, yukarıda anlatılan bütün hesaplamalar, içi içe geçmiş iki IF-ELSE yapısı kullanılarak
kotarılmıştır. Olası her durum için dört program çıktısı da alta verilmiştir. İnceleyiniz.
Program 5.6: Kenarları bilinen bir üçgenin geometrik özellikleri
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
|
PROGRAM Ucgen
!-----------------------------------------------------------
! 05prg06.f95
! Kenarları bilinen bir üçgenin geometrik özellikleri
!-----------------------------------------------------------
IMPLICIT NONE
REAL, PARAMETER :: Pi = 3.141593
REAL :: A, B, C, U, Cevre, Alan
REAL :: Alfa, Beta, Teta
PRINT *,"Üçgenin kenarlarını girin:"
READ *,A, B, C
! Bu kenarlardan üçgen olur mu?
UcgenOlurmu: IF( A+B>C .AND. A+C>B .AND. B+C>A )THEN
! Üçgenin tipini belirle
UcgenTip: IF(A==B .AND. A==C) THEN
PRINT *, "Bu bir eşkenar üçgen."
ELSE IF(A==B .AND. A /= C .OR. &
A==C .AND. A /= B .OR. &
B==C .AND. A /= B) THEN
PRINT *, "Bu bir ikizkenar üçgen."
ELSE
PRINT *, "Bu bir çeşitkenar üçgen."
END IF UcgenTip
! Alan ve cevre hesapla
Cevre = A + B + C
U = (A + B + C)/2.0
Alan = SQRT(U*(U-A)*(U-B)*(U-C))
! açıları hesapla ve dereceye çevir
Alfa = ACOS( (B**2+C**2-A**2)/(2.0*B*C) ) * 180.0/Pi
Beta = ACOS( (A**2+C**2-B**2)/(2.0*A*C) ) * 180.0/Pi
Teta = ACOS( (A**2+B**2-C**2)/(2.0*A*B) ) * 180.0/Pi
PRINT '("Üçgenin çevresi : ", F8.2)',Cevre
PRINT '("Üçgenin alanı : ", F8.2)',Alan
PRINT '("Üçgenin açıları : ", 3F8.2)',Alfa, Beta, Teta
ELSE
PRINT *,"Bu kenarlardan üçgen oluşturulamaz..."
END IF UcgenOlurmu
END PROGRAM |
ÇIKTI
Üçgenin kenarlarını girin:
1 2 5
Bu kenarlardan üçgen oluşturulamaz...
|
ÇIKTI
Üçgenin kenarlarını girin:
4 4 4
Bu bir eşkenar üçgen.
Üçgenin çevresi : 12.00
Üçgenin alanı : 6.93
Üçgenin açıları : 60.00 60.00 60.00
|
ÇIKTI
5 5 3
Bu bir ikizkenar üçgen.
Üçgenin çevresi : 13.00
Üçgenin alanı : 7.15
Üçgenin açıları : 72.54 72.54 34.92
|
ÇIKTI
Üçgenin kenarlarını girin:
6 8 10
Bu bir çeşitkenar üçgen.
Üçgenin çevresi : 24.00
Üçgenin alanı : 24.00
Üçgenin açıları : 36.87 53.13 90.00
|
|