Fortran Programlama (Fortran90/95)

previous next

DALLANMA ve TEKRARLAMA İFADELERİ

Fortran da tipik dallanma komutu IF-ELSE IF-ELSE-END IF yapısıdır. İç içe birçok IF deyimi kullanılabilir. İkinci bir dallanma çeşidi de CASE yapısıdır. Bu yapıda aynı anda birden çok dallanma yapılabilir. Fortran iki değişik tekrarlama yapısı vardır. Bu yapılar iken (while) ve öteleme (veya sayaç) (DO) döngüleridir. Ne kadar tekrarlama yapılacağını biliyorsanız DO döngüsünü kullanmak daha önemlidir. Eğer tekrarlama işleminin sayısı konusunda bilginiz yoksa bunu bir koşula bağlayarak yapabilirsiniz. Bir döngü içinden her zaman EXIT komutu ile çıkabilirsiniz. Bazen döngünün başına CYCLE deyimi ile dönebilirsiniz.

Programlama öğütleri-2 

 1. IF, DO ve CASE yapılarını oluştururken daha kolay okunabilmesi
    açısından döngü içindeki komut ve işlem satırlarını biraz içerden 
	yazınız.

 2. IF yapısında eşitlik durumlarında (özellikle gerçel) sayıların yuvarlanmasına 
    dikkat ediniz. Bu durumla karşılaşırsanız (yaklaşık eşit koşulunu kullanarak)
	satırlarınızı test ediniz. 

 3. Tekrarlanmanın ne kadar yapılacağını bilmiyorsanız iken (while) 
    döngü yapılarını kullanınız.

 4. Tekrarlanma sayısını biliyorsanız DO döngüsünü kullanınız.
 
 5. DO döngüsü içinde iken sayaç değişkenini kesinlikle değiştirmeyiniz.
 
 6. Çok büyük sayıda döngülerde veya IF yapılarında atama deyimlerine isimler veriniz.
 
 7. CYCLE ve EXIT deyimlerini kullanacaksanız döngü isimleri ile birlikte kullanınız.
 

Blok IF yapısı

[ad:] IF (mantıksal_ifade1) THEN
           Blok 1
		ELSE IF (mantıksal_ifade2) THEN [ad]
		   Blok 2
		ELSE [ad]
		   Blok 3
		END IF [ad]

Blok IF yapısı ile birden fazla koşul kontrol edilebilir. mantıksal_ifade1 doğru ise Blok 1 deki komutlar veya satırlar işlem görür. mantıksal_ifade1 yanlış ise mantıksal_ifade2 deki koşul kontrol edilir ve bu ifade doğru ise Blok 2 deki işlemler yapılır, aksi durumda Blok 3 deki ifadeler yapılır. IF bloğu içindeki (veya blok içine girilmesde) işlemler yapıldıktan sonra IF in bittiği satırın altından işlemlere devam edilir. Eğer tek koşula dikkat ediyorsanız bir tane THEN kullanmak yeterli olur. Birden fazla koşul var ise THEN in sayısı artabilir.

CASE yapısı

[ad:] SELECT CASE (case_ifadesi)
      CASE (case_seçimi_1) [ad]
		   Blok 1
      CASE (case_seçimi_2) [ad]
		   Blok 2
      CASE DEFAULT [ad]
		   Blok n
      END SELECT [ad]

CASE yapısı özel blok durumlarından case_ifadesi ne göre oluşturulur. Bu koşul tamsayı, karakter veya mantıksal bir değer(ler) olabilir. Her case seçiminde bir veya birden fazla değerler içerebilir. case_ifadesi koşulu sağlanınca bloklardaki ifadeler işleme konulur ve başka koşula sapma olmaz.
Örnek:
------
PROGRAM Case01
IMPLICIT NONE
!
! case deyiminin kullanilisina basit bir ornek
!
INTEGER :: I,J,K
CHARACTER :: Islem
	DO
		PRINT *,' Iki tamsayi deger giriniz   '
		READ *, I,J
		PRINT *,' Islemciyi giriniz'
		READ '(A)', Islem
		Hesap : &
		SELECT CASE (Islem)
			CASE ('+') Hesap
				K=I+J
				PRINT *,' Sayilarin toplami   ',K
			CASE ('-') Hesap
				K=I-J
				PRINT *,' Sayilarin farki     ',K
			CASE ('/') Hesap
				K=I/J
				PRINT *,' Sayilarin bolunmesi ',K
			CASE ('*') Hesap
			K=I*J
			PRINT *,' Sayilarin carpimi       ',K
		CASE DEFAULT Hesap
			EXIT
		END SELECT Hesap
	END DO
END PROGRAM Case01

Örnek:
------
PROGRAM Case02
IMPLICIT NONE
!
! sesli, sessiz, sayi, bosluk ve diger kararketler
! sayilir
!
INTEGER :: Sesli=0 , Sessiz=0, Rakam=0
INTEGER :: Bosluk=0, Diger=0, I
CHARACTER :: Karakter
CHARACTER (LEN=80) :: Satir
	READ '(A)', Satir
	DO I=1,80
		Karakter=Satir(I:I) 
! yukarida bir karakter secilir
		SELECT CASE (Karakter)
			CASE ('A','E','I','O','U', &
			     'a','e','i','o','u')
				Sesli=Sesli + 1
			CASE ('B','C','D','F','G','H', &
			      'J','K','L','M','N','P', &
			      'Q','R','S','T','V','W', &
			      'X','Y','Z',           &
			      'b','c','d','f','g','h', &
			      'j','k','l','m','n','p', &
			      'q','r','s','t','v','w', &
			      'x','y','z')
				Sessiz=Sessiz + 1
			CASE ('1','2','3','4','5','6','7','8','9','0')
				Rakam=Rakam + 1
			CASE (' ')
				Bosluk=Bosluk + 1
			CASE DEFAULT
				Diger=Diger+1
		END SELECT
	END DO
	PRINT *, ' Sesli  harfler     = ', Sesli
	PRINT *, ' Sessiz harfler     = ', Sessiz 
	PRINT *, ' Digits             = ', Rakam
	PRINT *, ' Blanks             = ', Bosluk
	PRINT *, ' Diger karakterler  = ', Diger 
END PROGRAM Case02

CYCLE

CYCLE [ad]

Örnek : 

CYCLE bir


CYCLE komutu herhangi bir DO döngüsünün içinde olabilir. Bu satırla karşılaşıldığında altta kalan bütün satırla atlanır ve kontrol ile döngünün başına dönülür. İken döngüsünde ise döngü başında kalınır. Sayaçlı döngülede ise döngü indisi adım kadar artırılır. Eğer sayaç hala üst limitin altında ise döngü işlemine devam edilir. İsimsiz CYCLE komutu iç döngülere geçilmesine neden olur. İsimlendirilmiş CYCLE komutu belirtilen ad satırına gidilir.

DO döngüsü (öteleme veya döngüyü sayma)

[ad:] DO indis = başlangıç, son, artım
 ...
END DO [ad]

Örnek : 
dongu : DO indis = 1, ison, 3
 ...
END DO dongu


Ötelemeli DO döngüsü belirtilen sayı kadar yapılır. Döngü başlangıcında sayaçın ilk değeri başlangıç değeridir ve son değere kadar artım miktarı ile gidilir. Döngüden çıktıktan sonra indisin değeri yine artırılır ve son değer ile karşılaştırılır eğer indis son değerden büyük ise DO döngüsü içindeki satırlarla ilgili işlemler yapılmaz.

DO WHILE yapısı


Koşullu DO döngüsü koşulllar sağlanana kadar devam eder. DO WHILE döngüsüne girmeden önce koşulu oluşturan değerlere ilk atamalar yapılmalıdır. Koşul sağlanana kadar işlem yapılır.

[ad:] DO WHILE (mantıksal_ifade)
 ...
END DO [ad]

Örnek : 

dongu : DO WHILE (x >= 0)
 ...
 ...
 ...
END DO dongu

Örnek :
--------
PROGRAM FaktoriyelHesabi
IMPLICIT NONE
INTEGER :: I, F, Faktoriyel
	PRINT *,' Tamsayi deger giriniz '
	READ *,I
	DO WHILE(I< 0)
		PRINT *,' Faktoriyel hesabi icin sadece '
		PRINT *,' pozitif tamsayilar girilmelidir : Yeniden giriniz'
		READ *,I
	END DO
	F=Faktoriyel(I)
	PRINT *,' Yanit ', F
END PROGRAM FaktoriyelHesabi
RECURSIVE INTEGER FUNCTION Faktoriyel(I) RESULT(Yanit)
IMPLICIT NONE
INTEGER , INTENT(IN):: I
	IF (I==0) THEN
		Yanit=1
	ELSE
		Yanit=I*Faktoriyel(I-1)
	END IF
END FUNCTION Faktoriyel
EXIT ifadesi

EXIT [ad:]

Örnek : 

EXIT dongu1

EXIT komut bir DO döngüsünün içinde herhangi bir yerinde olabilir. Eğer EXIT satırı ile karşılaşılırsa DO döngüsüne devam edilmez ve END DO döngüsü dışına çıkılır. İsimsiz EXIT döngüsü içteki döngünün dışına çıkılmasını sağlar.

Mantıksal IF Durumu
IF (mantıksal_ifade) durum

Mantıksal IF deyimi IF yapısının özel bir şeklidir. Eğer mantıksal_ifade doğru ise aynı satırdaki ifade işlem görür. Bu işlemden sonra IF satırından sonraki satırlara devam edilir. Bu ifade satırı işinizi görüyorsa bloklanmış IF in kullanılması gereksizdir.
Örnek:
------
PROGRAM YumurtaBayrami
IMPLICIT NONE
INTEGER :: Yil, Metcyc, Yuzyil, Hata1, Hata2, Gun
INTEGER :: Epact, Luna, GeciciDeger
! Yumurta bayraminin yilin hangi gunune geldigi hesaplanir
	PRINT *,' Yumurta bayraminin yilin hangi gunune'
	PRINT *,' rasladigini hesaplamak icin  yili    ' 
	PRINT *,' giriniz, ornegin 1987                '
	READ *,Yil
! Atina li astronom (m.s. 400) meton tarafindan bulunan
! ayin 19 yilda bir tekrar ayni sekilde goruldugunu
! gosteren konuma geldigini gösteren bir periyot
! Metcyc - metonic dongusu 
	Metcyc = MOD(Yil,19)+1 
	IF(Yil <= 1582)THEN
		Gun = (5*Yil)/4 
		Epact = MOD(11*Metcyc-4,30)+1
	ELSE
!       Yuzyil-Yuzyil in hesaplanmasi
		Yuzyil = (Yil/100)+1
!        matematiksel hatalarin dikkate alinmasi
!        eksik yil dikkate alinmaz
		Hata1 = (3*Yuzyil/4)-12 
		Hata2 = ((8*Yuzyil+5)/25)-5 
!        locating pazar gununun hesplanmasi
		Gun = (5*Yil/4)-Hata1-10 
!        locating the epact(full moon)
		GeciciDeger = 11 * Metcyc + 20 + Hata2 - Hata1
		Epact = MOD(GeciciDeger,30) 
		IF(Epact <= 0) THEN
			Epact = 30 + Epact
		ENDIF
		IF((Epact == 25 .AND. Metcyc > 11) &
		.or. Epact == 24)THEN
			Epact = Epact+1 
		ENDIF
	ENDIF 
!     dolunayin hesaplanmasi
	Luna= 44 - epact 
	IF (Luna < 21) THEN
		Luna = Luna+30 
	ENDIF 
!     Pazar gunune raslayan Yumurta bayrami 
	Luna = Luna+7-(MOD(Gun+Luna,7)) 
!     dogru ay in hesaplanmasi
	IF(Luna > 31)THEN
		Luna = Luna - 31
		PRINT *,' Girilen ',Yil, ' yili icin '
		PRINT *,' Yumurta bayrami Nisan ay i icinde ',Luna
	ELSE
		PRINT *,' Girilen ',Yil
		PRINT *,' Yumurta bayrami Mart ay i icinde  ',Luna
	ENDIF
END PROGRAM YumurtaBayrami
İken (while) döngü yapısı

İken döngüsü mantıksal ifade sağlanana (doğru olana) kadar devam eder. Bu satırın altındaki işlemlere devam edilmez. Bu döngü sayaçlı döngüden farklı bir yapıya sahiptir. Çünkü tekrarlama miktarı belli değildir. Döngü isminin verilmesine gerek yoktur ama verilirse daha iyi olur.
[ad:] DO 
 ...
 IF (mantıksal_ifade) EXIT [ad]
 ...
END DO [ad]

Örnek : 

dongu1 : DO 
 ...
 IF (idurum/=0) EXIT dongu1
 ...
END DO dongu1

Örnek:
-------
INTEGER FUNCTION GCD(A,B)
IMPLICIT NONE
INTEGER , INTENT(IN) :: A,B
INTEGER :: GeciciDeger
	IF (A < B) THEN
		GeciciDeger=A
	ELSE
		GeciciDeger=B
	ENDIF
	DO WHILE ((MOD(A,GeciciDeger) /= 0) .OR. (MOD(B,GeciciDeger) /=0))
		GeciciDeger=GeciciDeger-1
	END DO
	GCD=GeciciDeger
END FUNCTION GCD
PROGRAM GCDExample
IMPLICIT NONE
INTEGER :: I,J,Sonuc
INTEGER :: GCD
	PRINT *,' Iki tane tamsayi deger giriniz '
	READ *,I,J
	Sonuc=GCD(I,J)
	PRINT *,' GCD ',Sonuc, ' dir'
END PROGRAM GCDExample

Alıştırma 3. Test 3.
© Copyright Mehmet Kabak. 2003. Tüm hakları saklıdır.
previous next
Hosted by www.Geocities.ws

1