Fortran Programlamaya Giriş (Fortran90/95)

next

GİRİŞ

Bilgisayar, bilgilerin depolandığı ve bu bilgiler üzerinde matematiksel işlemleri insanın yapabileceği hızın çok üzerinde yapabildiği bir makinedir. Bilgisayara, bir problemin çözüm işlemlerini hangi sırada ve nasıl yapacağını belirten komutlar veya ifadeler zincirine ise bilgisayar programı denir. Bir programın tasarlanması, yazılması ve test verileri ile çalıştırılmasına programlama denir. Program yazan kişilere programcı denir. Bilgisayarlar insanların düşünce yapısında düşünemez, kavrama kabiliyetine sahip değildirler. Sadece bilgisayara verilen bilgiler programcı tarafından yazılan program tarafından değerlendirilerek bir sonuca ulaşılmasını sağlar.

Bilgisayarın en önemli elemanları merkezi işlemci birimi (CPU), ana bellek, ikincil bellek (harddisk, disket, CDROM vd.) ve giriş-çıkış birimleridir. CPU, bilgisayarın hesaplama ve kontrol işlemlerini gerçekleştirir. Ana bellek ikincil belleklere göre daha hızlıdır. Fakat buradaki bilgiler geçicidir. Yani elektrik kesilince ana bellekteki bilgiler yok olur. İkincil bellekte ise bilgiler kalıcıdır. Harddisk ve disket ençok kullanılan ikincil belleklerdir. Giriş ve çıkış birimleri bilgilerin bilgisayara veya bilgisayardan aktarılmasını sağlar. En yaygın giriş aygıtları klavye, ekran ve yazıcılardır. Tipik bir bilgisayarın blok diyagramı aşağıdaki şekilde verilmektedir:

Şekil 1.1 Tipik bir bilgisayarın blok diyagramı.

Bilgisayar bellekleri milyonlarca anahtardan oluşur. Bu anahtarlar açık (0-OFF) veya kapalı (1-ON) konumlardan birinde bulunurlar. Bu anahtarların (0 veya 1) herbirine bit diyebiliriz.

1 bit 2 li sayı tabanına göre 0 veya 1 değerlerinden biridir. Bu bitler birleştirilerek byte lar oluşur.
İkili sayı sisteminde (genel olarak) en küçük digit grubu 8 bit ten oluşur ve 8 bit 1 byte tır.
Bitlerin oluşturduğu byte tan daha büyük gruplara word denir.

On tabanına ve ikili sayı tabanına göre sayıların karşılaştırılması:

(122)10=2*100+2*101+1*102=2*1+2*10+1*100=(1111010)2

Bilgisayarlar on tabanına göre sayıları kabul eder ve ikili sayı sistemine bu sayıları çevirirler ve daha sonra
işlem yaptıktan sonra tekrar onlu sayı sistemine dönüşüm yapılır. Bilgisayar bellekleri, karakter, tamsayı veya gerçel sayıları kayıtlarında tutarlar.

Pozitif ve negatif tam sayılar bellekte 1, 2, 4 veya 8 byte kadar yer işgal ederler.
n bit sayısı olmak üzere,
Enküçük tamsayı =-2n-1
Enbüyük tamsayı =2n-1-1
4 byte lık (n=32 bit) tamsayı için,
enküçük tamsayı -2.147.483.648
ve
enbüyük tamsayı 2.147.483.647 dir.

Tamsayıların yanlış kullanımı bilgisayarın veya programın hatalı bir şekilde durmasına neden olur
(overflow error).

Tamsayıların kullanılamadığı yerlerde yani 0.25, 1.4 veya -3.2 gibi sayılar için gerçel sayılar
(floating-point data type) tanımlanır.

Pozitif ve negatif gerçel değerler bellekte 4 byte (32 bit) yer işgal ederler.

4 byte lık gerçel sayılar (32 bit) taban ve kuvvetinden/üstel terimden (mantissa and exponent) oluşur.
32 bit lik bir gerçel sayıda 24 bit (3 byte) taban (mantissa) ve 8 bit (1 byte) üstel kısıma ayrılır.

4 byte lık gerçel sayı = 3 byte lık taban x 1 byte lık üstel terim =m x 2e

Gerçel sayılar ikili sayı sistemine çevrilirken veya tersi durumunda yuvarlama hataları olmaktadır
(Round off error). Örneğin 1.99999 bazen 2.00000 olarak karşımıza çıkabilir.

1 karakter bellekte 1 byte yer işgal eder.
Karakterler şunlardır:
A dan Z ye,
a dan z ye,
0 dan 9 a,
",(){}[]!~@#%$%^&*€
çöşğüı

Karakterler ASCII (American standard Code for Information Interchange) veya EBCDIC (IBM) standartlarına göre sınıflandırılır. Japon ve Çin dillerinde 4000 civarında karakter vardır.

256 değişik değer 256 byte değerini oluşturur. Her karakter Unicode da, bellekte 2 byte yer işgal eder. Bu da, (2562)=65536 olası karakter kodunun yazılmasını sağlar.

Sayıların duyarlılığı, alt ve üstel kısımlardaki değerlerin alabileceği bit sayısına bağlıdır. İlk bilgisayarlar makine dilinde programlanıyordu, yani işlemcilerin doğrudan programlanması yapılıyordu. Bu işlem çok yavaş, hataya açık ve hazırlanan programın başka makinaya aktarılması açısından çok zordu. Yüksek seviyeli diller 1954 yılından itibaren görülmeye başlandı. Makine dili (Assembly language) yerine, bu yüksek seviyeli diller kullanılmaya başlandı. FORTRAN (FORmula TRANslator) yüksek seviyeli dillerden biridir hatta ilkidir. Yüksek dillere örnek olarak Ada, Basic, C, COBOL, Fortran ve Pascal örnek verilebilir.
 

Orijinal FORTRAN I programlama dili ve derleyicisi 1954 ile 1957 yılları arasında geliştirilmiştir. ilk başlarda
askeri amaçlar için (atış hareketlerinde hedefin belirlenmesi) böyle bir programın yazılması düşünülmüştür. Daha
sonra kullanımının kolaylığından dolayı popüler hale gelmiştir. 1957 yılındaki yeni sürüme FORTRAN II adı
verildi. 1962 yılında ise yeni eklemelerle FORTRAN IV olarak adlandırılımıştır. 1966 yılında ise yeni düzenleme ve standartlarla (alt programlar) FORTRAN 66 ismiyle piyasaya sürüldü. 1977 yılında
FORTRAN programlama diline çeşitli standartlar getirilmiştir. Yani bazı deyimler standart kabul edilmiş ve
firmalar bu standartların üzerinde eklemeler veya geliştirmeler yapmışlardır. Daha sonra piyasaya çıkan Fortran
derleyicilerinde sadece baş harf büyük yazılarak diğerleri küçük yazılmıştır. Fortran 90, Fortran 95, Visual
Fortran, Digital Fortran v6.0 gibir kod yorumlayıcıları 1990 yılından sonra geliştirilmişlerdir. Yeni Fortran
sürümleri daima geride kalan sürümlerde yazılmış programları desteklemekte ve yapısal bir programlama dili
haline gelmiştir.
 

FORTRANDA VERİ TİPLERİ

Tamsayı - Integer
     INTEGER*1 A   A değişkeni/sabiti bellekte 1 byte lık yer işgal eder
     -128 <= A <= 127 değerlerini alır. Aşağıdaki şekil 1 byte lık integer
     tanımını göstermektedir.
home
Şekil 1.2 Tamsayı gösterimi.
INTEGER*2 A A değişkeni/sabiti bellekte 2 byte lık yer işgal eder -32768 <= A <= 32767 değerlerini alır. Aşağıdaki şekil 2 byte lık integer tanımını göstermektedir.
home
Şekil 1.3 Tamsayı gösterimi.
     INTEGER*4 A   A değişkeni/sabiti bellekte 1 byte lık yer işgal eder
     -2,147,483,648 <= A <= 2,147,483,647 değerlerini alır. Aşağıdaki şekil 
     4 byte lık integer tanımını göstermektedir.
home
 Şekil 1.4 Tamsayı gösterimi.
İŞLEMCİLER   FORTRAN da İFADELERİN SIRASI

Şekil 1.9 FORTRAN I de yazılmış ikinci dereceden bir polinomun köklerinin bulunması.

C     IKINCI DERECEDEN BIR POLINOMUN KOKLERININ BULUNMASI

c     FORTRAN I

      READ 100,A,B,C

100   FORMAT(3F12.4)

      DISCR = B**2-4*A*C

      IF (DISCR) 10,20,30

10    X1=(-B)/2.*A

      X2=SQRTF(ABSF(DISCR))/2.*A

      PRINT 110,X1,X2

110   FORMAT(5H X = ,F12.3,4H +i ,F12.3)

      PRINT 120,X1,X2

120   FORMAT(5H X = ,F12.3,4H -i ,F12.3)

      GOTO 40

20    X1=(-B)/2.*A

      PRINT 130,X1

130   FORMAT(11H X1 = X2 = ,F12.3)

      GOTO 40

30    X1=((-B)+SQRTF(ABSF(DISCR)))/(2.*A)

      X2=((-B)-SQRTF(ABSF(DISCR)))/(2.*A)

      PRINT 140,X1

140   FORMAT(6H X1 = ,F12.3)

      PRINT 150,X2

150   FORMAT(6H X2 = ,F12.3)

40    CONTINUE

      STOP 25252

Şekil 1.10 FORTRAN 77 de yazılmış ikinci dereceden bir polinomun köklerinin bulunması.

      PROGRAM QUAD4

C

C     Bu program asagidaki formdaki gibi

C     ikinci dereceden bir polinomun katsayilarini okur

C           A * X**2 + B * X + C = 0,

C     ve koklerini hesaplar (FORTRAN 77 sitili).

C

C     ikinci dereceden polinomin katsayilarinin girilmesi

C

      WRITE (*,*) 'A, B ve C katsayilarini giriniz: '

      READ (*,*) A, B, C

C

C     katsayilarin girildigi ekrana yansitilir

C

      WRITE (*,100) 'Katsayilar : ', A, B, C

100   FORMAT (1X,A,3F10.4)

C

C     diskirminantin kontrol edilmesi ve koklerin hesaplanmasi.

C

      DISCR = B**2 - 4*A*C

      IF ( DISCR .LT. 0) THEN

         WRITE (*,*) ' polinom sanal koklere sahiptir :'

         WRITE (*,*) ' X = ', -B/2*A, ' +i ', SQRT(ABS(DISCR))/2*A

         WRITE (*,*) ' X = ', -B/2*A, ' -i ', SQRT(ABS(DISCR))/2*A

      ELSE IF ( (B**2 - 4.*A*C) .EQ. 0) THEN

         WRITE (*,*) ' polinomum gercel kokleri aynidir :'

         WRITE (*,*) ' X = ', -B/2*A

      ELSE

         WRITE (*,*) ' polinomun iki farkli koku vardir:'

         WRITE (*,*) ' X = ', (-B + SQRT(ABS(DISCR)))/2*A

         WRITE (*,*) ' X = ', (-B - SQRT(ABS(DISCR)))/2*A

      END IF

C

      END

Şekil 1.11 Fortran 90 da yazılmış ikinci dereceden bir polinomun köklerinin bulunması.

PROGRAM roots

 

!  Amac :

!    Bu program A * X**2 + B * X + C = 0 seklindeki birpolinomun

!    koklerini hesaplar (Fortran 90 sitili).

!

IMPLICIT NONE

 

!  programin kullanacagi degiskenler

 

REAL :: a              ! X**2 terimini katsayisi

REAL :: b              ! X teriminin katsayisi

REAL :: c              ! polinomdaki sabit deger

REAL :: discriminant   ! Diskriminant

REAL :: imag_part      ! Sanal kokun sanal kismi

REAL :: real_part      ! Sanal kokun gercel kismi

REAL :: x1             ! Gercel kok

REAL :: x2             ! Gercel kok

 

!  Prompt the user for the coefficients of the equation

WRITE (*,*) 'This program solves for the roots of a quadratic '

WRITE (*,*) 'equation of the form A * X**2 + B * X + C = 0. '

WRITE (*,*) 'Enter the coefficients A, B, and C:'

READ  (*,*) a, b, c

 

!  Echo back coefficients

WRITE (*,*) 'The coefficients A, B, and C are: ', a, b, c

 

!  Calculate discriminant

discriminant = b**2 - 4. * a * c     

 

!  Solve for the roots, depending upon the value of the discriminant

 

IF ( discriminant > 0. ) THEN ! there are two real roots, so...

 

   X1 = ( -b + sqrt(discriminant) ) / ( 2. * a )

   X2 = ( -b - sqrt(discriminant) ) / ( 2. * a )

   WRITE (*,*) 'This equation has two real roots:'

   WRITE (*,*) 'X1 = ', x1

   WRITE (*,*) 'X2 = ', x2

 

ELSE IF ( discriminant == 0. ) THEN ! there is one repeated root, so...

 

   x1 = ( -b ) / ( 2. * a )

   WRITE (*,*) 'This equation has two identical real roots:'

   WRITE (*,*) 'X1 = X2 = ', x1

 

ELSE ! kokler sanaldir,...

 

   real_part = ( -b ) / ( 2. * a )

   imag_part = sqrt ( abs ( discriminant ) ) / ( 2. * a )

   WRITE (*,*) 'Esitligin kokleri sanaldir:'

   WRITE (*,*) 'X1 = ', real_part, ' +i ', imag_part

   WRITE (*,*) 'X2 = ', real_part, ' -i ', imag_part

 

END IF

 

END PROGRAM

 


©Copyright Mehmet Kabak 2003. Bütün hakları saklıdır.
next

Hosted by www.Geocities.ws

1