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) :: Kutleveya 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.918veya 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.81yada bir dizinin bütün elemanlarını başka bir diziye tek bir işlemle (indis belirtmeden) atamak için: Agirlik = Kutle * 9.81Son 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 = 100Bir 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 DOV dizisindeki 0 dan farklı elemanların tersini P dizisine aktarmak için: WHERE (V /= 0. ) P = 1./VWHERE yapısı ELSEWHERE deyimi ile birlikte daha genel halde şöyle kullanılır: WHERE ( V >= 0. ) P = SQRT(V) ELSEWHERE P = -1. ENDWHEREBu 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.811: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.81Bu aşağıdaki işlemle aynı sonucu verir: DO I = 2, 5 Agirlik(I) = Kutle(I) * 9.81 END DOAlt 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.0ifadesi aşağıdakine denktir: DO I = 2, 10, 2 A(I) = 5.0 END DOAş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 *, Aveya DO I = 1, 10 READ *, A(I) END DOyada READ *, (A(I), I=1,10)Aynı diziyi ekrana yazdırmak için aşağıdaki yöntemler kullanılabilir: PRINT *,Aveya DO I = 1, 10 PRINT *,A(I) END DOyada 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ı ile tanımlıdır. Burada ortalama şeklindedir. Program 9.2, klavyeden girilen N = 10 adet sayının ortalamasını ve standart sapmasını hesaplar.Program 9.2: 10 sayının standart sapması ve ortalaması
ÇIKTI
|