Přeskočit na obsah

Podmínky

Podmínky jsou jednou ze základních řídících struktur a neodlučitelná součást strukturovaného programování. Jako podmínku označujeme příkaz který nám “rozvětví” program na “větve” příkazů, které se vykonají pouze pokud bude splněna (nebo nebude) nějaká podmínka (či podmínky). Přičemž to co označujeme podmínkou je logický výraz (např. x <= y).

příkaz if

V nejjednodušším případě tvoří podmínku pouze příkaz if. Vše co je umístěno mezi then a end if se vykoná pouze pokud je podmínka splněna.

Příkazy then a end if lze vynezachat pokud za if následuje pouze jeden příkaz.

    if( ...podmínka... ) then
    
    	...kód zde se vykoná pouze pokud je podmínka splněna...
    
    end if
    					
uml if diagram
    program priklad_13
	implicit none
	
		real :: a
	
		write(*,*) "Zadej a:"
		read(*,*) a
	
		if(a <= 0.0) then !pokud je a<= 0.0 provede se kód uvnitř
			write(*,*) "a musí být > 0.0!"
			stop		! zastaví beh programu
		endif
	
		write(*,*) "ln(a) = ",log(a)
	
	end program
						
    program priklad_14
    implicit none
    
    	real :: a
    
    	write(*,*) "Zadej a:"
    	read(*,*) a
    
    	if(a <= 0.0) then !pokud je a<= 0.0 provede se kód uvnitř
    		write(*,*) "a musí být > 0.0!"
    		stop		! zastaví beh programu
    	endif
    
    	write(*,*) "ln(a) = ",log(a)
    
    end program
    					

příkaz else

Příkaz if můžeme obohatit o příkaz else. Potom vše co je mezi then a else se vykoná pokud je podmínka splněna a vše mezi else a end if pokud podmínka splněna není.

    if( ...podmínka... ) then
    
    	...kód zde se vykoná pouze pokud podmínka JE SPLNĚNA...
    
    else
    
    	...kód zde se vykoná pouze pokud podmínka NENÍ SPLNĚNA...
    
    end if
    					
uml if else diagram
    program priklad_15
    implicit none
    
    	real :: a
    	complex :: b
    
    	write(*,*) "Zadej a:"
    	read(*,*) a
    
    	if(a <= 0.0) then !pokud je a<= 0.0 provede se kód uvnitř
    		if(a == 0.0) stop "a nesmí být rovno 0.0" !pokud je a=0.0 zastavime beh programu a vypise hlaseni
    		b = cmplx(a , 0.0) ! vytvoříme complexni cislo b s realnou casti rovnou a a imaginarni rovnou nule
    		write(*,*) "ln(a) = ",log(b)
    	else
    		write(*,*) "ln(a) = ",log(a)
    	endif
    
    end program
    					

Za else můžeme napsat další if () then. Takto můžeme kód rozdělit na více částí.

    if( ...podmínka1... ) then
    
    	...kód zde se vykoná pouze pokud podmínka1 JE SPLNĚNA...
    
    else if( ...podmínka2... ) then
    
    	...kód zde se vykoná pouze pokud podmínka1 NENÍ SPLNĚNA a podmínka2 JE SPLNĚNA...
    
    	...
    else
    
    	...kód zde se vykoná pouze pokud podmínka NENÍ SPLNĚNA ani jedna z podmínek...
    
    end if
    					
uml if else if diagram
    program priklad_16
    implicit none
    
    	real :: a
    	complex :: b
    
    	write(*,*) "Zadej a:"
    	read(*,*) a
    
    	if(a == 0.0) then !pokud je a<= 0.0 provede se kód uvnitř
    
    	write(*,*) "a nesmí být rovno 0.0" !pokud je a=0.0 zastavime beh programu a vypise hlaseni
    
    	else if(a < 0.0) then
    		b = cmplx(a , 0.0) ! vytvoříme complexni cislo b s realnou casti rovnou a a imaginarni rovnou nule
    		write(*,*) "ln(a) = ",log(b)
    	else
    		write(*,*) "ln(a) = ",log(a)
    	endif
    
    end program
    					

příkaz select case

Speciálním případem konstrukce if - else if - else if - ... je select case(). Tento příkaz příjímá jako argument výraz, tj. proměnnou nebo funkci, které jsou buď integer nebo character (popř. i logical, ale v takovém případě to nemá význam). Příkaz select case() lze přepsat do konstrukce zahrnující if, else if() then, ale oproti ní by měl být select case() rychlejší a také přehlednější.

    select case( ...výraz... )
    	case (hodnota1)
    
    		... kód zde se provede pokud výraz == hodnota1 ...
    
    	case (hodnota2)
    
    		... kód zde se provede pokud výraz == hodnota2 ...
    
    		...
    	case default
    
    		... kód zde se provede pokud se výraz nerovná žádné hodnotě ...
    
    end select 
    					
    program priklad_17
    implicit none
    
    	integer :: s
    	real :: a,b
    
    	write(*,*) "Zadej a:"
    	read(*,*) a
    
    	write(*,*) "Zadej b:"
    	read(*,*) b
    
    	write(*,*) "Zvolte 1 pro a+b, 2 pro a-b, 3 pro a*b, 4 pro a/b"
    	read(*,*) s
    
    	select case(s)
    		case(1) ! Pokud s=1 tak sčítáme
    			write(*,*) "a+b = ",a+b
    
    		case(2) ! Pokud s=2 tak odcitame
    			write(*,*) "a+b = ",a-b
    
    		case(3) ! Pokud s=3 tak násobíme
    			write(*,*) "a+b = ",a*b
    
    		case(4) ! Pokud s=4 tak delime
    			if(b == 0.0) stop "nulou nelze delit"
    			write(*,*) "a+b = ",a/b
    
    		case default
    			write(*,*) "neplatna volba"
    
    	end select
    
    end program