* Ö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
* - - -
* 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
* Sayılar Kuramı
* Analiz
* Lineer Cebir
Fortran 90/95 Derleyicileri
|
* Salford (silversoft FTN95)
* G95
* GFORTRAN
* programlama.com
* Fortran (wikipedia)
* fortran.gantep.edu.tr
* g95.org
* Hot scripts
* E-posta
|
|
Bölüm 6: Döngüler
###################- (%95)
|
Giriş
Döngü (loop) deyimleri, bir kümenin belli bir koşul altında tekrar edilmesi için kullanılır.
Fortran'da, Sayaç Kontrollü DO, DO ve DO WHILE olmak üzere üç tip döngü deyimi
vardır. Diğer programlama dillerinde olduğu gibi, bu deyimlerle istenildiği kadar
iç-içe döngü yapısı kullanılabilir.
6.1 Sayaç Kontrollü DO Döngüsü
Fortran 90'dan önce de kullanılan tekrarlama deyimidir.
Tekrarlama bir döngü sayacı kullanılarak yapılır.
Genel yazım biçimi:
DO değişken = deyim1, deyim2, deyim3
...
döngüdeki deyimler (küme)
...
END DO
burada
- döngü parametreleri değişken, deyim1, deyim2 ve deyim3, INTEGER veri tipinde
değişken veya sabit olmalıdır.
- değişken, döngü sayacı veya DO indisi olarak adlandırılır.
- deyim1, döngü sayacının başlangıç değeridir.
- deyim2, döngü sayacının son değeri veya limitidir.
- deyim3, döngü sayacının artım miktarıdır. Bu deyimin kullanılması isteğer bağlıdır. Kullanılmazsa deyim3
1 kabul edilir.
- Döngü içindeki kümenin tekrarlanma sayısı INT(|(deyim2-deyim1+deyim3)/deyim3|) formülü ile hesaplanır.
Aşağıdaki program parçasını düşünelim.
DO I = 1, 6, 1
PRINT *, I, I**2
END DO
Bu kod 1 den 6 ya kadar olan sayıları ve karelerini ekrana aşağıdaki gibi basar:
1 1
2 4
3 9
4 16
5 25
6 36
döngüdeki artım miktarı 1'in yazılmasına gerek yoktur. Yani yukarıdaki kod, aşağıdaki ile eşdeğerdir.
DO I = 1, 6
PRINT *, I, I**2
END DO
Gerçel değerle üreten döngü oluşturmak mümkündür. Örneğin aşağıdaki program parçası, 10 derecelik adımlarla,
0 dan 90 dereceye kadar olan açıların sinüs ve kosinüs değerlerini ekrana basar.
Pi = 3.141593
DO Der = 0, 90, 10
Rad = Der * Pi/180.0
PRINT *, SIN(Rad), COS(Rad)
END DO
Program 6.1, 1 den N'ye kadar olan tamsayıların toplamını hesaplar. Bu toplamın değeri N*(N+1)/2
formülü ile hesaplanır.
Program 6.1: 1 + 2 + ... + N toplamını hesaplar.
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
|
PROGRAM Toplama
!--------------------------------------------------------
! 06prg01.f95
! 1 + 2 + ... + N toplamını hesaplar
!--------------------------------------------------------
IMPLICIT NONE
INTEGER :: K, N, Top = 0
PRINT *,"N sayısını girin:"
READ *,N
DO K = 1,N
Top = Top + K
END DO
PRINT *,"Hesaplanan toplam : ", Top
PRINT *,"Kuramsal toplam : ", N*(N+1)/2
END PROGRAM |
ÇIKTI
N sayısını girin:
10
Hesaplanan toplam : 55
Kuramsal toplam : 55
|
6.2 DO Döngüsü
Bu türden döngü yapısı ile yineleme sayaç ile değil, mantıksal bir işlemle yapılır.
Genel olarak DO-EXIT ve DO-CYCLE yapıları ile mantıksal düşünce işleyişi kullanılır.
DO - EXIT Yapısı
Genel kullanım biçimi:
DO
küme 1
IF ( koşul ) EXIT
küme 2
END DO
şeklindedir. Burada döngü koşul olumlusuz olduğu sürece yinelenir.
koşul olumlu kolduğunda döngü EXIT deyimi ile sonlanır.
Aşağıdaki sayaç kontrollü döngüyü düşünelim.
DO I = 1, 6
PRINT *,I, I**2
END DO
Bu döngü aşağıdakine eşdeğerdir.
I = 1
DO
PRINT *,I, I**2
I = I + 1
IF ( I >= 6 ) EXIT
END DO
Program 6.2, klavyeden girilen sayı 0'dan büyük olduğu sürece girilen sayıyı
ve karekökünü ekrana yazar.
Program 6.2: Girilen sayının karekökü hesaplar
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:
|
PROGRAM KareKok
!--------------------------------------------------------
! 06prg02.f95
! Girilen sayının karekökü hesaplar.
!--------------------------------------------------------
IMPLICIT NONE
REAL :: X
DO
WRITE (*,FMT='(A)', ADVANCE='No') "Bir sayı girin: "
READ *,X
IF( X<0.0 ) THEN
PRINT *,"X = ",X, " < 0"
EXIT
END IF
WRITE (*,FMT='(A,F8.3)', ADVANCE='No') "Karekökü : ", SQRT(X)
PRINT *
END DO
PRINT *,"Döngü bitti."
END |
ÇIKTI
Bir sayı girin: 4
Karekökü : 2.000
Bir sayı girin: 12
Karekökü : 3.464
Bir sayı girin: 55
Karekökü : 7.416
Bir sayı girin: 0
Karekökü : 0.000
Bir sayı girin: -5
X = -5. < 0
Döngü bitti.
|
6.3 DO WHILE Döngüsü
Yinelenmesi gereken küme için koşul sınaması döngüye girilmeden yapılır.
Koşul olumlu olduğu sürece çevrim yinelenir.
DO WHILE döngüsü C/C++ programlama dilindeki while ile aynı mantıkta çalışır.
Genel yazım biçimi:
DO WHILE( koşul )
...
döngüdeki deyimler (küme)
...
END DO
Program 6.3, v0 = 10 m/s için, 0.1 saniye aralıklarla v ve y yi hesaplar.
hmax değeri ise program içinde IF ile bulunabilir. Gerçekte hmax = 100/2/9.81 = 5.09684 m dir.
Program 6.3: Serbest düşen bir topun dt zaman aralıklarıları ile hızını, konumunu ve çıkacağı en yüksek noktayı hesaplar.
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:
35:
36:
37:
|
PROGRAM Top
!---------------------------------------------------------
! 06prg03.f95
! Serbest düşen bir topun dt zaman aralıklarıları ile
! hızını, konumunu ve çıkacağı en yüksek noktayı hesaplar.
!---------------------------------------------------------
IMPLICIT NONE
REAL, PARAMETER :: g = 9.81 ! m/s2
REAL, PARAMETER :: v0 = 10.0 ! m/s
REAL, PARAMETER :: dt = 0.1 ! s
REAL :: t, v, y, Hmax
y = 0.0
Hmax = 0.0
t = 0.0
DO WHILE( y>=0.0 )
! Hareket denklemleri
v = v0 - g*t
y = v0*t - 0.5*g*t**2
! Maksimum yükseklik
IF(y > Hmax) Hmax = y
PRINT 10,t,v,y
! zamanı arttır
t = t + dt
END DO
PRINT *,"Hmax = ", Hmax, " m"
10 FORMAT (3F9.2)
END PROGRAM |
ÇIKTI
0.00 10.00 0.00
0.10 9.02 0.95
0.20 8.04 1.80
0.30 7.06 2.56
0.40 6.08 3.22
0.50 5.09 3.77
0.60 4.11 4.23
0.70 3.13 4.60
0.80 2.15 4.86
0.90 1.17 5.03
1.00 0.19 5.09
1.10 -0.79 5.06
1.20 -1.77 4.94
1.30 -2.75 4.71
1.40 -3.73 4.39
1.50 -4.72 3.96
1.60 -5.70 3.44
1.70 -6.68 2.82
1.80 -7.66 2.11
1.90 -8.64 1.29
2.00 -9.62 0.38
2.10 -10.60 -0.63
Hmax = 5.095 m
|
6.4 İç içe Geçmiş Döngüler
Bir program içinde birbiri içine geçmiş birden çok döngü de kullanılabilir.
Bu durumda (bütün programlama dillerinde olduğu gibi) önce içteki döngü, daha sonra dıştaki
döngü icra edilir. İç içe geçmiş döngülere iyi bir örnek Program 6.4 ve 6.5 de gösterilmiştir.
Program 6.4'de, iç içe geçmiş iki DO döngüsü ile basit bir çarpım tablosu oluşturulmuştur.
Program 6.4: Basit bir çarpım tablosu
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:
|
PROGRAM Carpim_Tablosu
!---------------------------------------------------------
! 06prg04.f95
! Basit bir carpim tablosu.
!---------------------------------------------------------
IMPLICIT NONE
INTEGER :: K, J, C
WRITE(*, FMT='(A)', ADVANCE='No') " x |"
DO K = 1, 10
WRITE(*, FMT='(I4)', ADVANCE='No') K
END DO
PRINT *
PRINT *,"---+-----------------------------------------"
DO K = 1, 10
WRITE(*, FMT='(I3,A)', ADVANCE='No') K," |"
DO J = 1, 10
C = K * J
WRITE(*, FMT='(I4)', ADVANCE='No') C
END DO
PRINT *
END DO
END |
ÇIKTI
x | 1 2 3 4 5 6 7 8 9 10
---+-----------------------------------------
1 | 1 2 3 4 5 6 7 8 9 10
2 | 2 4 6 8 10 12 14 16 18 20
3 | 3 6 9 12 15 18 21 24 27 30
4 | 4 8 12 16 20 24 28 32 36 40
5 | 5 10 15 20 25 30 35 40 45 50
6 | 6 12 18 24 30 36 42 48 54 60
7 | 7 14 21 28 35 42 49 56 63 70
8 | 8 16 24 32 40 48 56 64 72 80
9 | 9 18 27 36 45 54 63 72 81 90
10 | 10 20 30 40 50 60 70 80 90 100
|
Üç basamaklı, basamaklarının küpleri toplamı kendisine eşit olan tam sayılara Armstrong sayı denir.
Örneğin: 371 bir Armstrong sayıdır çünkü 33 + 73 + 13 = 371.
Program 6.5, iç içe geçmiş üç DO döngüsü ile bütün Armstrong sayıları bulup ekrana yazar. İnceleyiniz.
Program 6.5: Armstrong sayılar
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:
|
PROGRAM Aramstrong_Sayilar
!---------------------------------------------------------
! 06prg05.f95
! Üç basamaklı, basamaklarının küpleri toplamı kendisine
! eşit olan tam sayılara Armstrong sayı denir.
! Örneğin: 371 = 3**3 + 7**3 + 1**3
! Bu program İç-içe geçmiş 3 döngü ile bütün Aramstrong
! sayıları bulur.
!---------------------------------------------------------
IMPLICIT NONE
INTEGER :: a,b,c, kup, sayi, k = 1
DO a = 1, 9
DO b = 0, 9
DO c = 0, 9
sayi = 100*a + 10*b + c; ! sayi = abc (üç basamaklı)
kup = a**3 + b**3 + c**3; ! kup = a^3+b^3+c^3
IF( sayi == kup ) THEN
PRINT *, K, Sayi
K = K + 1
END IF
END DO
END DO
END DO
END |
ÇIKTI
6.5 Sonsuz Döngü
Bir döngü işlemini sonsuz kere tekrarlarsa bu döngü sonzuz döngü olarak adlandırılır.
Böyle bir döngü için, koşul çok önemlidir. Aşağıda verilen döngüler çevrimini sonsuz kez
tekrarlayarak ekrana Sonsuz döngü içindeyim... mesajını basar.
Sonsuz döngüler, CTRL + C tuş kombinasyonu ile son bulur.
! EXIT deyimi kullanışmamış
DO
PRINT *, "Sonsuz döngü içindeyim..."
END DO
! J döngü içinde değişmiyor
J = 6
DO
PRINT *, "Sonsuz döngü içindeyim..."
IF(J == 0) EXIT
END DO
! 7 her zaman 3 den büyüktür
DO WHILE(7>3)
PRINT *, "Sonsuz döngü içindeyim..."
END DO
! 7 her zaman 3 den büyüktür
DO WHILE(7>3)
PRINT *, "Sonsuz döngü içindeyim..."
END DO
6.6 İsimlendirilmiş Döngü Yapısı
Fortran 90+, IF ve CASE deyimlerinde olduğu gibi, DO deyimi için de
isimlendirilmiş yapı kullanmaya izin verir.
Genel kullanım şekli:
etiket: DO
.
.
.
END DO etiket
şeklindedir. Bu yapı, özellikle iç içe geçmiş döngülerde sık kullanılır. Örneğin:
Distaki: DO I = 1, 10
Icteki: DO J = 1, 10
PRINT *, I, J, I*J
END DO Icteki
END DO Distaki
Bir döngüye verilen etiket, EXIT ve CYCLE deyimleri
ile de birleştirilebilir. Şöyle ki:
D1: DO; x1 = x1 + 0.1
D2: DO; x2 = x2 + 0.1
IF(x1**2+x2**2>=1.0) EXIT D1 ! 1 inci döngüyü sonlandır
IF(x2 > xmax) EXIT D2 ! 2 nci döngüyü sonlandır
F = ABS(x1-x2)
PRINT *,x1,x2,F
END DO D2
END DO D1
|