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 9: Diziler

###########--------- (%55)


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:

  • dizi elemanların bellekte (program çalıştığı sürece) sürekli biçimde bulunması
  • dizi elemanların aynı türden değişkenler olması

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 Bildirimi

Bir 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 Verme

Bir 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 Diziler

Bazen 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 İndisleri

Bir 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 / Yazma

Basit 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ı
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
PROGRAM Ortalama
!--------------------------------------------------------
! 09prg01.f95
! 10 sayının aritmetik ortalaması
!--------------------------------------------------------
INTEGER, PARAMETER :: N = 10
REAL :: X(N), Toplam = 0.0, Ort
INTEGER :: k

  PRINT *,"Ortalaması hesaplanacak ",N," sayı girin"

  DO K = 1, N

   READ *,X(K)
   Toplam = Toplam + X(K)

  END DO

  Ort = Toplam/N

  PRINT *,"Sayıların ortalaması: ",Ort

END 

ÇIKTI

 Ortalaması hesaplanacak  10  sayı girin
2.2
2.3
2.1
1.9
2.5
2.4
2.3
2.0
2.1
2.6
 Sayıların ortalaması:  2.24

Bu programda, ortalaması alınacak sayılar adı X olan 10 elemanlı gerçel tipteki bir dizide saklanmıştır. Bu şekilde saklanan sayıların hepsi program çalıştığı sürece bellekte kalacaktır. Bu sayede, program içinde daha sonra (gerektiğinde) aynı sayılar tekrar kullanılabilir.

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ı
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: 
PROGRAM Ortalama
!--------------------------------------------------------
! 09prg02.f95
! 10 sayının standart sapması ve ortalaması
!--------------------------------------------------------
INTEGER, PARAMETER :: N = 10
REAL :: X(N), Std_Sap, Toplam, Ort
INTEGER :: k

  PRINT *,N," adet sayı girin"

  ! önce aritmetik ortalama hesaplanıyor
  Toplam = 0.0
  DO K = 1, N

   READ *,X(K)
   Toplam = Toplam + X(K)

  END DO

  Ort = Toplam/N

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

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

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

END 

ÇIKTI

 10  adet sayı girin
2.2
2.3
2.1
1.9
2.5
2.4
2.3
2.0
2.1
2.6
 Ortalama :  2.24
 Standart sapma:  0.119999886



Powered by PHP