Přeskočit na obsah

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
    					
uml do diagram
    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
    					
uml while diagram
    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