Cykly
Dálší důležitou řídící kontrukcí je cyklus. Cyklus nám “zapouzdřuje” kód který chceme aby se vykonával opakovaně.
příkaz do
Příkaz do
je cyklus, který můžeme znát z jiných jazyků spíše jako “for”. Za příkazem do
se inicializuje iterační proměnná (“iterátor” nebo “index”), kterou nejčastěji pojmenováváme: “i”, “j”, “k”, apod. Což je proměnná typu integer
. Iterátor se inicializuje na počáteční hodnotu “start” a v každém cyklu se k němu připočte “krok”. Cyklus se opakuje dokud iterátor není větší nebo roven “konec”.
Pokud nezadáme “krok” automaticky se připočte k iterátoru v každém cyklu 1. Volba kroku 1 je nejčastější a proto se s příkazem do
nejčastěji setkáte bez něj.
Také je možné vynechat inicializaci iterátoru a použít jen samostatné do
a end do
. V takovém případě dostanete tzv. nekonečný cyklus. O nekonečném cyklu bude ještě řeč na konci této čási.
do i = start, konec, krok
...kód zde se bude vykonávat "několikrát"...
end do
program priklad_17
implicit none
integer :: i
! vypise: 1 2 3 4 5 6 7 8 9 10
do i=1,10
write(*,*) i
end do
write(*,*) ! vypise prazdny radek pro prehlednost
! vypise: 10 9 8 7 6 5 4 3 2 1
do i=10,1,-1
write(*,*) i
end do
write(*,*) ! vypise prazdny radek pro prehlednost
! vypise: 1 3 5 7 9
do i=1,10,2
write(*,*) i
end do
write(*,*) ! vypise prazdny radek pro prehlednost
! vypise: 0.5 0.4 0.3 0.2 0.1 0.0
do i=5,0,-1
write(*,*) i * 0.1
end do
write(*,*) ! vypise prazdny radek pro prehlednost
! vypise: 1 2 3 4 5 6 7 8 9 10
i = 1
do
write(*,*) i
i = i + 1
if(i > 10) exit ! pokud je i vetsi nez 10 ukonci cyklus
end do
end program
program priklad_18
implicit none
integer :: i,j
real :: a(5)
! vypise: 1 3 5 7 9
do i=1,10,2
write(*,*) i
end do
write(*,*) ! vypise prazdny radek pro prehlednost
! vypise: 0.5 0.4 0.3 0.2 0.1 0.0
do i=5,0,-1
write(*,*) i * 0.1
end do
write(*,*) ! vypise prazdny radek pro prehlednost
! vypise prvnich 5 clenu geometricke posloupnosti
a(1)=1.0
do i=2,5
a(i) = a(i-1) * 1.1
end do
write(*,*) a
write(*,*) ! vypise prazdny radek pro prehlednost
! vypise malou nasobilku
do i=1,10
write(*,*) "---",i,"---"
do j=1,10
write(*,*) i," * ",j ," = ", i * j
end do
end do
end program
implicitní do
S implicitním do
jsme se setkali při inicializaci pole. V to tkví jeho největší užitek a v praxi se s ním příliš nesetkáte.
proměnná" , iterátor = od, do, krok )
příkaz do while
Tento příkaz je spojení do
+ if
. Cyklus se vykonává dokud je splněna podmínka.
do while (...podmínka...)
...kód zde se bude vykonávat dokud bude podmínka splněna...
end do
program priklad_19
implicit none
real :: a = 1.0
do while(a >= 0.0) ! bude se opakovat dokud a bude vetsi nebo rovno 0.0
write(*,*) "Zadej a:"
read(*,*) a
write(*,*) "odmocnina z ",a," je: ",sqrt(a)
end do
end program
příkazy cycle
a exit
Uvnitř cyklu lze použít příkazy cycle
a exit
. Ty slouží k jeho řízení. Příkaz cycle
ukončí aktuální průchod cyklem a začne nový za příkazem do
. Příkaz exit
ukončí cyklus a program pokračuje za end do
.
program priklad_20
implicit none
real :: a
do ! nekonecny cyklus - musime jej ukoncit zevnitr
write(*,*) "Zadej a:"
read(*,*) a
if(a == 0.0) exit ! pokud zadame 0, cyklus se ukonci
if(a < 0.0) cycle ! pokud zadame mensi cislo nez 0.0 preskocime cyklus
write(*,*) "odmocnina z ",a," je: ",sqrt(a)
end do
end program