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