Temel Yönleriyle Fortran 90 / 95 / 2003

  Temel Konular
* Ö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

  İleri Uygulamalar
* - - -
* 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

  Seçilmiş Örnekler
* Sayılar Kuramı
* Analiz
* Lineer Cebir

  Fortran 90/95 Derleyicileri
* Salford (silversoft FTN95)
* G95
* GFORTRAN

  Dış Bağlantılar
* programlama.com
* Fortran (wikipedia)

* fortran.gantep.edu.tr
* g95.org
* Hot scripts

  İletişim
* 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



Powered by PHP