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.
[ad:] IF (mantıksal_ifade1) THEN
Blok 1
ELSE IF (mantıksal_ifade2) THEN [ad]
Blok 2
ELSE [ad]
Blok 3
END IF [ad]
[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]
Ö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 [ad] Örnek : CYCLE bir
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
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 FaktoriyelEXIT ifadesi
EXIT [ad:] Örnek : EXIT dongu1
IF (mantıksal_ifade) durum
Ö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ı
[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