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