![]() |
Temel Yönleriyle Fortran 90 / 95 / 2003 | ||||||||||||||
|
* Fortran'a Giriş
* fortran.gantep.edu.tr
|
Bölüm 9: Diziler
GirişDizi, aynı tipteki verilere tek bir isimle erişmek için kullanılan bir kümedir. Bu küme matematikteki küme kavramından biraz farklıdır. Bir dizi bildirildikten sonra, dizinin bütün elemanları bellekte peşpeşe saklanır Bu yüzden dizilere tek bir isim altında çok sayıda değişken içeren bellek bölgesi de denir. Buna göre, bir diziyi dizi yapan iki temel özellik vardır:
Bu kısımda Fortran'da, dizi kavramı, diziler üzerinde işlem yapan kütüphane fonksiyonları ve dizilerin alt programlarda (function,subroutine) kullanılması konu edilecektir. 9.1 Dizilerin BildirimiBir dizi çok sayıda değişken barındırdığından, bunları birbirinden ayırdetmek için indis adı verilen bir bilgiye ihtiyaç vardır. Bir dizinin bildirim işleminin genel biçimi söyledir:
veriTipi, DIMENSION(eleman_sayısı) :: dizi_adı
veya
veriTipi :: dizi_adı(eleman_sayısı)
Örneğin, 5 elemanlı, kütle verilerini bellekte tutmak için, kutle dizisi şöyle tanımlanabilir:
REAL, DIMENSION(5) :: Kutle
veya
REAL :: Kutle(5)
Eleman sayısı aşağıdaki gibi bir değişkenle bildirilemez.
INTEGER :: N = 5
REAL :: Kutle(N)
Fakat dizi boyutu PARAMETER deyimi ile belirtilebilir.
INTEGER, PARAMETER :: N = 5
REAL :: Kutle(N)
9.2 Dizilere Başlangıç Değeri VermeBir dizinin elemanlarına bir değer atama işlemi şöyle yapılabilir:
REAL :: Kutle(5)
Kutle(1) = 8.471
Kutle(2) = 3.683
Kutle(3) = 9.107
Kutle(4) = 4.739
Kutle(5) = 3.918
veya daha kısa bir formda
Kutle = (/ 8.471, 3.683, 9.107, 4.739, 3.918 /)
şeklinde olabilir. Program içinde birden çok dizi kullanmak mümkündür.
REAL :: Kutle(5), Agirlik(5)
Tek bir eleman üzerinde atama yapılmak istendiğinde:
Agirlik(3) = Kutle(3) * 9.81
yada bir dizinin bütün elemanlarını başka bir diziye tek bir işlemle (indis belirtmeden) atamak için:
Agirlik = Kutle * 9.81
Son işlemin gerçekleşebilmesi için, her iki dizi de (Agirlik ve Kutle) aynı boyutta olmalıdır.
Burada bütün dizi ataması şu şekilde de yapılabilir:
DO I = 1, 5
Agirlik(I) = Kutle(I) * 9.81
END DO
İndis belirtmeden atama işlemi dizilere başlangıç değeri vermek için kullanılabilir. Örneğin aşağıdaki
işlemle A dizisinin bütün elemanlarına 0 değeri ve B dizisinin bütün elemanlarına 100 değeri atanır.
INTEGER :: A(10), B(20)
A = 0
B = 100
Bir diziye basit döngü kullanılarak atama yapmak mümkündür.Örneğin :
A = (/ (I*0.1, I = 1,10) /)
işlemi A dizisine aşağıdaki atamayı yapacaktır:
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
9.3 WHERE Deyimiİndis belirtmeden atama işlemi WHERE deyimi ile de yapılabilir. Örneğin V dizisine ait bütün elemanlarının karekökünü P dizisine aktarmak için:
REAL :: V(4), P(4)
V = (/ 1.0, 2.1, 0.0, 4.7 /)
WHERE ( V >= 0. ) P = SQRT(V)
Bu, aşağıdaki işlemle aynı sonucu verir:
DO I = 1, 4
IF ( V(I) >= 0. ) P(I) = SQRT(V(I))
END DO
V dizisindeki 0 dan farklı elemanların tersini P dizisine aktarmak için:
WHERE (V /= 0. ) P = 1./V
WHERE yapısı ELSEWHERE deyimi ile birlikte daha genel halde şöyle kullanılır:
WHERE ( V >= 0. )
P = SQRT(V)
ELSEWHERE
P = -1.
ENDWHERE
Bu aşağıdakine eşdeğerdir:
DO I = 1, N
IF ( V(I) /= 0. ) THEN
P(I) = SQRT(V(I))
ELSE
P(I) = -1.0
END DO
9.4 Alt DizilerBazen dizinin bütün elemanlarını kullanmak yerine, bir dizinin sadece bir parçası (alt-dizisi) üzerinde işlem yapmak gerekebilir. Örneğin
REAL :: Agirlik(5), Kutle(5)
Kutle = (/ 8.471, 3.683, 9.107, 4.739, 3.918 /)
Agirlik = Kutle * 9.81
şeklinde tanımlanan atamayı aşağıdaki gibi yazmak mümkündür.
Agirlik(1:5) = Kutle(1:5) * 9.81
1:5 gösterimi 1 den 5 e kadar olan elemanları temsil eder.
Eğer sadece 2 den 5 e kadar olan elemanlar için atama yapmak istenirse:
Agirlik(2:5) = Kutle(2:5) * 9.81
Bu aşağıdaki işlemle aynı sonucu verir:
DO I = 2, 5
Agirlik(I) = Kutle(I) * 9.81
END DO
Alt dizilere başlangıç değeri vermek mümkündür.
REAL :: A(10)
A(1:4) = 0.
A(5:10) = 1.
Bu atama şu işleme denktir:
A = (/ 0., 0., 0., 0., 1., 1., 1., 1., 1., 1. /)
Dizilerdeki üçüncü bir indis artımı gösterir. Örneğin:
A(2:10:2) = 5.0
ifadesi aşağıdakine denktir:
DO I = 2, 10, 2
A(I) = 5.0
END DO
Aşağıda 10 elemanlı bir dizinin elemanları kutucuklarla gösterilmiştir.
Sağ tarafta verilen atama işlemi, sol tarafta sembolik olarak karalanmıştır.
9.5 Dizi İndisleriBir dizi programın başında aşağıdaki gibi bildirildiğinde, dizi indisi 1 den 9 a kadar olduğu varsayılır.
REAL :: A(9)
İndislerin ilk değerleri isteğe göre 0 dan veya negatif bir sayıdan da başlatılabilir. Örneğin:
REAL :: A(0:8), B(-4:4), C(-8:0)
Burada bildirilen bütün diziler 9 elemanlıdır. Fakat A dizisinin indisleri 0 ile 8,
B dizisinin indisleri -4 ile 4 ve C dizisinin indisleri -8 ile 0 arasındadır.
9.6 Dizileri Okuma / YazmaBasit okuma / yazma bir dizinin okunması ve yazdırılması için de kullanılır. Örneğin bir A dizisinin aşağıdaki gibi bildirildiğini varsayalım:
INTEGER :: A(10)
Bu dizinin elemanlarını klavyeden okumak için bir kaç yol vardır.
READ *, A
veya
DO I = 1, 10
READ *, A(I)
END DO
yada
READ *, (A(I), I=1,10)
Aynı diziyi ekrana yazdırmak için aşağıdaki yöntemler kullanılabilir:
PRINT *,A
veya
DO I = 1, 10
PRINT *,A(I)
END DO
yada
PRINT *,(A(I), I = 1, 10)
Program 9.1, klavyeden girilen N = 10 adet sayının ortalamasını hesaplar.
Ortalama formülü ile hesaplanabilir.
Program 9.1: 10 sayının aritmetik ortalaması
ÇIKTI
Dizilerle ilgili klasik bir örnek standart sapma hesabıdır. Standart sapma bir kümedeki
sayıların, aritmetik ortalamadan olan uzaklığı ile ilgili, dağılım ölçüsüdür. n tane sayının
standart sapmaması Program 9.2: 10 sayının standart sapması ve ortalaması
ÇIKTI
|