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 6: Döngüler

###################- (%95)


Giriş

Döngü (loop) deyimleri, bir kümenin belli bir koşul altında tekrar edilmesi için kullanılır. Fortran'da, Sayaç Kontrollü DO, DO ve DO WHILE olmak üzere üç tip döngü deyimi vardır. Diğer programlama dillerinde olduğu gibi, bu deyimlerle istenildiği kadar iç-içe döngü yapısı kullanılabilir.


6.1   Sayaç Kontrollü DO Döngüsü

Fortran 90'dan önce de kullanılan tekrarlama deyimidir. Tekrarlama bir döngü sayacı kullanılarak yapılır. Genel yazım biçimi:


      DO değişken = deyim1, deyim2, deyim3
       ...
        döngüdeki deyimler (küme)
       ...
      END DO
burada
  • döngü parametreleri değişken, deyim1, deyim2 ve deyim3, INTEGER veri tipinde değişken veya sabit olmalıdır.
  • değişken, döngü sayacı veya DO indisi olarak adlandırılır.
  • deyim1, döngü sayacının başlangıç değeridir.
  • deyim2, döngü sayacının son değeri veya limitidir.
  • deyim3, döngü sayacının artım miktarıdır. Bu deyimin kullanılması isteğer bağlıdır. Kullanılmazsa deyim3 1 kabul edilir.
  • Döngü içindeki kümenin tekrarlanma sayısı INT(|(deyim2-deyim1+deyim3)/deyim3|) formülü ile hesaplanır.
Aşağıdaki program parçasını düşünelim.
      DO I = 1, 6, 1
        PRINT *, I, I**2
      END DO
Bu kod 1 den 6 ya kadar olan sayıları ve karelerini ekrana aşağıdaki gibi basar:
      1      1
      2      4
      3      9
      4     16
      5     25
      6     36
döngüdeki artım miktarı 1'in yazılmasına gerek yoktur. Yani yukarıdaki kod, aşağıdaki ile eşdeğerdir.
      DO I = 1, 6
        PRINT *, I, I**2
      END DO
Gerçel değerle üreten döngü oluşturmak mümkündür. Örneğin aşağıdaki program parçası, 10 derecelik adımlarla, 0 dan 90 dereceye kadar olan açıların sinüs ve kosinüs değerlerini ekrana basar.
      Pi = 3.141593
      DO Der = 0, 90, 10
        Rad = Der * Pi/180.0 
        PRINT *, SIN(Rad), COS(Rad)
      END DO
Program 6.1, 1 den N'ye kadar olan tamsayıların toplamını hesaplar. Bu toplamın değeri N*(N+1)/2 formülü ile hesaplanır.

Program 6.1: 1 + 2 + ... + N toplamını hesaplar.
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
PROGRAM Toplama
!--------------------------------------------------------
! 06prg01.f95
! 1 + 2 + ... + N toplamını hesaplar
!--------------------------------------------------------
IMPLICIT NONE
INTEGER :: K, N, Top = 0

   PRINT *,"N sayısını girin:"
   READ *,N

   DO K = 1,N
     Top = Top + K
   END DO

   PRINT *,"Hesaplanan toplam : ", Top
   PRINT *,"Kuramsal   toplam : ", N*(N+1)/2

END PROGRAM 

ÇIKTI

 N sayısını girin:
10
 Hesaplanan toplam :  55
 Kuramsal   toplam :  55


6.2   DO Döngüsü

Bu türden döngü yapısı ile yineleme sayaç ile değil, mantıksal bir işlemle yapılır. Genel olarak DO-EXIT ve DO-CYCLE yapıları ile mantıksal düşünce işleyişi kullanılır.

DO - EXIT Yapısı

Genel kullanım biçimi:

     DO
        küme 1
        IF ( koşul ) EXIT
        küme 2
     END DO

şeklindedir. Burada döngü koşul olumlusuz olduğu sürece yinelenir. koşul olumlu kolduğunda döngü EXIT deyimi ile sonlanır.

Aşağıdaki sayaç kontrollü döngüyü düşünelim.
     DO I = 1, 6
       PRINT *,I, I**2
     END DO
Bu döngü aşağıdakine eşdeğerdir.
     I = 1
     DO
       PRINT *,I, I**2
       I = I + 1
       IF ( I >= 6 ) EXIT
     END DO
Program 6.2, klavyeden girilen sayı 0'dan büyük olduğu sürece girilen sayıyı ve karekökünü ekrana yazar.

Program 6.2: Girilen sayının karekökü hesaplar
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: 
PROGRAM KareKok
!--------------------------------------------------------
! 06prg02.f95
! Girilen sayının karekökü hesaplar.
!--------------------------------------------------------
IMPLICIT NONE
REAL :: X

   DO

      WRITE (*,FMT='(A)', ADVANCE='No') "Bir sayı girin: "
      READ *,X

      IF( X<0.0 ) THEN
        PRINT *,"X = ",X, " < 0"
        EXIT
      END IF

      WRITE (*,FMT='(A,F8.3)', ADVANCE='No') "Karekökü : ", SQRT(X)

      PRINT *

   END DO

   PRINT *,"Döngü bitti."

END 

ÇIKTI

Bir sayı girin: 4
Karekökü :    2.000
Bir sayı girin: 12
Karekökü :    3.464
Bir sayı girin: 55
Karekökü :    7.416
Bir sayı girin: 0
Karekökü :    0.000
Bir sayı girin: -5
 X =  -5.  < 0
 Döngü bitti.


6.3 DO WHILE Döngüsü

Yinelenmesi gereken küme için koşul sınaması döngüye girilmeden yapılır. Koşul olumlu olduğu sürece çevrim yinelenir. DO WHILE döngüsü C/C++ programlama dilindeki while ile aynı mantıkta çalışır. Genel yazım biçimi:


      DO WHILE( koşul )
      ...
        döngüdeki deyimler (küme)
      ...
      END DO

Hava sürtünmesinin ihmal edildiği bir ortamda, bir futbol topunun yukarıya doğru belli bir ilk hız (v0) ile atıldığını varsalım. Uygun bir koordinat seçimiyle, bu topun hızı (v), konumu (y) ve çıkabileceği en yüksek nokta (hmax) aşağıdaki denklemlere göre hesap edilir.



Program 6.3, v0 = 10 m/s için, 0.1 saniye aralıklarla v ve y yi hesaplar. hmax değeri ise program içinde IF ile bulunabilir. Gerçekte hmax = 100/2/9.81 = 5.09684 m dir.

Program 6.3: Serbest düşen bir topun dt zaman aralıklarıları ile hızını, konumunu ve çıkacağı en yüksek noktayı hesaplar.
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: 
PROGRAM Top
!---------------------------------------------------------
! 06prg03.f95
! Serbest düşen bir topun dt zaman aralıklarıları ile 
! hızını, konumunu ve çıkacağı en yüksek noktayı hesaplar.
!---------------------------------------------------------
IMPLICIT NONE
REAL, PARAMETER :: g  = 9.81 ! m/s2
REAL, PARAMETER :: v0 = 10.0 ! m/s  
REAL, PARAMETER :: dt = 0.1  ! s
REAL :: t, v, y, Hmax

      y = 0.0
   Hmax = 0.0
      t = 0.0

   DO WHILE( y>=0.0 )

      ! Hareket denklemleri
      v = v0 - g*t
      y = v0*t - 0.5*g*t**2

      ! Maksimum yükseklik
      IF(y > Hmax) Hmax = y

      PRINT 10,t,v,y

      ! zamanı arttır
      t = t + dt

   END DO

   PRINT *,"Hmax = ", Hmax, " m"

10 FORMAT (3F9.2)

END PROGRAM 

ÇIKTI

     0.00    10.00     0.00
     0.10     9.02     0.95
     0.20     8.04     1.80
     0.30     7.06     2.56
     0.40     6.08     3.22
     0.50     5.09     3.77
     0.60     4.11     4.23
     0.70     3.13     4.60
     0.80     2.15     4.86
     0.90     1.17     5.03
     1.00     0.19     5.09
     1.10    -0.79     5.06
     1.20    -1.77     4.94
     1.30    -2.75     4.71
     1.40    -3.73     4.39
     1.50    -4.72     3.96
     1.60    -5.70     3.44
     1.70    -6.68     2.82
     1.80    -7.66     2.11
     1.90    -8.64     1.29
     2.00    -9.62     0.38
     2.10   -10.60    -0.63
 Hmax =  5.095  m

6.4   İç içe Geçmiş Döngüler

Bir program içinde birbiri içine geçmiş birden çok döngü de kullanılabilir. Bu durumda (bütün programlama dillerinde olduğu gibi) önce içteki döngü, daha sonra dıştaki döngü icra edilir. İç içe geçmiş döngülere iyi bir örnek Program 6.4 ve 6.5 de gösterilmiştir.

Program 6.4'de, iç içe geçmiş iki DO döngüsü ile basit bir çarpım tablosu oluşturulmuştur.

Program 6.4: Basit bir çarpım tablosu
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: 
PROGRAM Carpim_Tablosu
!---------------------------------------------------------
! 06prg04.f95
! Basit bir carpim tablosu.
!---------------------------------------------------------
IMPLICIT NONE
INTEGER :: K, J, C

   WRITE(*, FMT='(A)', ADVANCE='No') "  x |" 

   DO K = 1, 10
      WRITE(*, FMT='(I4)', ADVANCE='No') K
   END DO
   PRINT *
   PRINT *,"---+-----------------------------------------"

   DO K = 1, 10

      WRITE(*, FMT='(I3,A)', ADVANCE='No') K," |"

      DO J = 1, 10
        C = K * J
        WRITE(*, FMT='(I4)', ADVANCE='No') C
      END DO

      PRINT *

   END DO

END 

ÇIKTI

  x |   1   2   3   4   5   6   7   8   9  10
 ---+-----------------------------------------
  1 |   1   2   3   4   5   6   7   8   9  10
  2 |   2   4   6   8  10  12  14  16  18  20
  3 |   3   6   9  12  15  18  21  24  27  30
  4 |   4   8  12  16  20  24  28  32  36  40
  5 |   5  10  15  20  25  30  35  40  45  50
  6 |   6  12  18  24  30  36  42  48  54  60
  7 |   7  14  21  28  35  42  49  56  63  70
  8 |   8  16  24  32  40  48  56  64  72  80
  9 |   9  18  27  36  45  54  63  72  81  90
 10 |  10  20  30  40  50  60  70  80  90 100


Üç basamaklı, basamaklarının küpleri toplamı kendisine eşit olan tam sayılara Armstrong sayı denir. Örneğin: 371 bir Armstrong sayıdır çünkü 33 + 73 + 13 = 371. Program 6.5, iç içe geçmiş üç DO döngüsü ile bütün Armstrong sayıları bulup ekrana yazar. İnceleyiniz.

Program 6.5: Armstrong sayılar
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: 
PROGRAM Aramstrong_Sayilar
!---------------------------------------------------------
! 06prg05.f95
! Üç basamaklı, basamaklarının küpleri toplamı kendisine 
! eşit olan tam sayılara  Armstrong sayı denir. 
!       Örneğin: 371 = 3**3 + 7**3 + 1**3
! Bu program İç-içe geçmiş 3 döngü ile bütün Aramstrong 
! sayıları bulur.
!---------------------------------------------------------
IMPLICIT NONE
INTEGER :: a,b,c, kup, sayi, k = 1

   DO a = 1, 9
   DO b = 0, 9
   DO c = 0, 9

       sayi = 100*a + 10*b + c;    ! sayi = abc (üç basamaklı) 
       kup  = a**3 + b**3 + c**3;  ! kup  = a^3+b^3+c^3

       IF( sayi == kup ) THEN
          PRINT *, K, Sayi
          K = K + 1
       END IF

   END DO
   END DO
   END DO

END 

ÇIKTI

 1  153
 2  370
 3  371
 4  407


6.5   Sonsuz Döngü

Bir döngü işlemini sonsuz kere tekrarlarsa bu döngü sonzuz döngü olarak adlandırılır. Böyle bir döngü için, koşul çok önemlidir. Aşağıda verilen döngüler çevrimini sonsuz kez tekrarlayarak ekrana Sonsuz döngü içindeyim... mesajını basar.
Sonsuz döngüler, CTRL + C tuş kombinasyonu ile son bulur.


      ! EXIT deyimi kullanışmamış
      DO 
            PRINT *, "Sonsuz döngü içindeyim..."
      END DO


      ! J döngü içinde değişmiyor
      J = 6
      DO 
            PRINT *, "Sonsuz döngü içindeyim..."
            IF(J == 0) EXIT
      END DO


      ! 7 her zaman 3 den büyüktür
      DO WHILE(7>3)
            PRINT *, "Sonsuz döngü içindeyim..."
      END DO


      ! 7 her zaman 3 den büyüktür
      DO WHILE(7>3)
            PRINT *, "Sonsuz döngü içindeyim..."
      END DO


6.6   İsimlendirilmiş Döngü Yapısı

Fortran 90+, IF ve CASE deyimlerinde olduğu gibi, DO deyimi için de isimlendirilmiş yapı kullanmaya izin verir.

Genel kullanım şekli:

      etiket: DO 
      .
      .
      .
      END DO etiket
şeklindedir. Bu yapı, özellikle iç içe geçmiş döngülerde sık kullanılır. Örneğin:
      Distaki: DO I = 1, 10
       Icteki: DO J = 1, 10

        PRINT *, I, J, I*J

      END DO Icteki
      END DO Distaki
Bir döngüye verilen etiket, EXIT ve CYCLE deyimleri ile de birleştirilebilir. Şöyle ki:
  D1: DO; x1 = x1 + 0.1
  D2: DO; x2 = x2 + 0.1

          IF(x1**2+x2**2>=1.0) EXIT D1  ! 1 inci döngüyü sonlandır
          IF(x2 > xmax) EXIT D2         ! 2 nci döngüyü sonlandır

          F = ABS(x1-x2)
          PRINT *,x1,x2,F

  END DO D2
  END DO D1


Powered by PHP