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 10: Dinamik Diziler

##################-- (%90)


10.1   Giriş

Bir program içerisinde, dizilerin boyutu ve kaç elemanlı olduğu program başında belirtilirse, derleyici o dizi için gereken bellek alanını (bölgesini) program sonlanıncaya kadar saklı tutar ve bu alan başka bir amaç için kullanılamaz. Bu türden diziler statik dizi olarak isimlendirilir. Statik dizinin boyutu programın çalışması esnasında (run time) değiştirilemez.

Fakat, programın çalışırken bir dizinin boyutu ve eleman sayısı bazı yöntemler kullanılarak değiştirilebilir. Bu tür dizilere dinamik dizi denir. Dinamik diziler için gereken bellek bölgesi, derleyici tarafından işletim sisteminden istenir, kullanılır ve daha sonra (gerekirse) bu bölge boşaltırılır. Bu bölümde, Fortran 90+'da, dinamik dizi kavramı ve dinamik bellek yönetimi anlatılacaktır.


10.1   Dinamik Dizi Bildirimi

Derleme sırasında aşağıdaki gibi bir bildirim derleme hatasına sebep olmaz.

      INTEGER, PARAMETER :: N = 10
      REAL :: A(N)
Fakat, aşağıdaki gibi bir kullanıma Fortran (ve birçok dil) izin vermez:
      INTEGER :: N                     ! Değişken bildirimi

      PRINT *,"Eleman sayısını girin"  ! Program çalışırken 
      READ *,N                         ! eleman sayısı isteniyor

      REAL :: A(N)                     ! ve N elemanlı dizi oluşturuluyor.
Ancak bununla beraber, Fortran 90+ eleman sayısı programın çalışma zamanın da belirlenmesine müsaade eder. Bu türden dinamik dizi bildirimi ALLOCATABLE deyimi kullanılarak olarak şöyle yapılır.
      tip, ALLOCATABLE :: dizi
örneğin:
      INTEGER, ALLOCATABLE :: A(:)    ! dinamik vektör
      REAL, ALLOCATABLE    :: B(:,:)  ! dinamik matris
Dinamik bir dizi tanımlandıktan sonra, dizinin eleman sayısı (sınırları) ALLOCATE deyimi ile belirlenir.
      ALLOCATE(dizi(alt_indis:üst_indis),STAT=durum) 
örneğin:
      ALLOCATE(A(10))   ! 10 elemanlı bir vektör
      ALLOCATE(B(4,4))  ! 4x4 bir matris
Burada INTEGER tipindeki durum değişkenin kullanımı isteğe bağlıdır. Eğer bu değişkene 0 (sıfır) değeri atanırsa, istenilen (ayrılan) bellek bölgesinin sorunsuz kullanılabileceği anlamına gelir. Sıfırdan farklı bir değer atanırsa talep edilen bellek miktarının yetersiz olduğu anlamındadır.

Son olarak, daha önce ayrılan bellek alanı DEALLOCATE boşaltılır.

      DEALLOCATE(dizi) 
Aşağıdaki adımlar dinamik bellek kullanımını Özetlemektedir.
      ! dinamik dizi bildirimi
      INTEGER, ALLOCATABLE :: A(:)

      ! eleman saysını belirle
      READ *,N    

      ! N tane bellek bloğu isteniyor
      ALLOCATE(A(N),STAT=durum)

      ! Boş yer varmı sorgulanıyor
      IF(durum /=0 ) STOP "Yetersiz bellek alanı."

      !
      ! A dizisi burada kullanılıyor...
      !

      ! bellek bloğu boşaltılıyor
      DEALLOCATE(A)

10.2   Örnekler

ÖRNEK 1: BİR KÜMENİN ORTALAMASI ve STANDART SAPMASI

Bu hesaplama daha önce Program 9.2'de yapılmıştı. Burada sadece dinamik dizi kullanılarak aynı işlem gerçekleştirilecek.

Program 10.1: N sayının standart sapması ve ortalaması
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: 
PROGRAM Ortalama
!--------------------------------------------------------
! 10prg01.f95
! N sayının standart sapması ve ortalamasının
! dinamik dizi ile hesabı.
!--------------------------------------------------------
INTEGER :: N, D, k
REAL, ALLOCATABLE :: X(:)
REAL ::  Std_Sap, Toplam, Ort

  ! eleman saysını belirleniyor
  PRINT *,"Eleman sayısını girin:"
  READ  *,N

  ! N tane bellek bloğu isteniyor
  ALLOCATE(X(N),STAT=D)

  ! Boş yer varmı sorgulanıyor
  IF(D/=0) STOP "Yetersiz bellek Alanı."

  ! Dizi kullanılıyor
  ! Aritmetik ortalama hesaplanıyor
  PRINT *,"Dizinin elemanlarını girin:"
  Toplam = 0.0
  DO K = 1, N
   READ *,X(K)
   Toplam = Toplam + X(K)
  END DO

  Ort = Toplam/N

  ! Standart sapma hesaplanıyor
  Toplam = 0.0
  DO K = 1, N
    Toplam = (Ort - X(K))**2
  END DO

  ! bellek bloğu boşaltılıyor
  DEALLOCATE(X)

  Std_Sap = SQRT(Toplam/(N-1))

  PRINT *,"Ortalama : ",Ort
  PRINT *,"Standart sapma: ",Std_Sap

END PROGRAM Ortalama 

ÇIKTI

 Eleman sayısını girin:
5
 Dizinin elemanlarını girin:
1.1
1.4
1.3
1.6
1.2
 Ortalama :  1.32
 Standart sapma:  0.060000002


ÖRNEK 2: BİR KÜMENİN MEDYANI

Bir sayı kümesinin medyanı, sayılar küçükten büyüğe doğru sıralandığında, ortadaki sayıdır.

Örneğin:
3, 4, 4, 5, 6, 8, 8, 8, 10 kümesinin medyanı 6
5, 5, 7, 9, 11, 12, 15, 18 kümesinin medyanı (9+11)/2 = 10 dur.

Program 10.2: Dinamik dizi ile N tane sayının medyanı.
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: 
52: 
53: 
54: 
55: 
56: 
57: 
58: 
59: 
60: 
PROGRAM Medyan_Hesabi
!-----------------------------------------------------
! 10prg02.f95
! Dinamik dizi ile N tane sayının medyanı.
!
! Median(3,4,4,5,6,8,8,8,10)  = 6.0
! Median(5,5,7,9,11,12,15,18) = (9+11)/2.0 = 10.0
!-----------------------------------------------------
IMPLICIT NONE
INTEGER, ALLOCATABLE :: A(:)
INTEGER  :: N, Durum

 PRINT *,"Eleman sayısı (N)?"
 READ *,N

 ALLOCATE(A(N),STAT=Durum)

 IF(Durum /=0 ) STOP "Yetersiz bellek alanı."

 PRINT *,N , " tane sayı girin:"
 READ *,A

 PRINT *,"Bu kümenin medyanı ",Median(A)

 DEALLOCATE(A)

CONTAINS
  
  REAL FUNCTION Median(A)
  !---------------------------------------------------
  ! A dizisinin medyanını hesaplar.
  !---------------------------------------------------
  INTEGER, INTENT(INOUT) :: A(:)
  INTEGER :: K,J,N,Gec

   ! Dizinin boyutu
     N = SIZE(A)

   ! Kabarcık sıralama ile küme elemanları 
   ! küçükten büyüğe doğru sıralanıyor
     DO K=1,N
     DO J=1,N-1
        IF(A(J) < A(J+1)) THEN
            Gec = A(J)
            A(J) = A(J+1)
          A(J+1) = Gec
        END IF
     END DO
     END DO

   ! Medyanı hesapla
     IF(MOD(N,2)==1) THEN  ! tek sayılı
       Median = A((N+1)/2)
     ELSE                  ! çift sayılı elemanlar
       Median = (A(N/2)+A(N/2+1))/2.0
     END IF

  END FUNCTION Median

END PROGRAM Medyan_Hesabi 

ÇIKTI

 Eleman sayısı (N)?
9
 9  tane sayı girin:
4 5 8 10 8 4 3 8 6
 Bu kümenin medyanı  6.0



Powered by PHP