Proměnné
Co jsou
Program si můžeme prozdělit na dvě části: data a algoritmy, které s nimi pracují. Data ukádáme do proměnných, které deklarujeme na začátku programu (za implicit none
). Proměných je několik typů a liší se typem dat v nich uložených.
integer
- celé číslo -112
,-659
,9057
real
- desetiné číslo -15.
,42.567
,6.022e23
,-98.003
complex
- komplexní číslo -(1.0,0.0)
,(-98.,15.1)
,(0.0,-1.0)
character
- řetězec -"Tohle je text"
,"pi je priblizne 3.14"
,"123.9"
logical
- logická proměnná - nabývá pouze dvou hodnot.true.
nebo.false.
Deklarace proměnných
program priklad_2
implicit none
real, parameter :: pi = 3.1415926535
integer :: n = 5, m = 4
integer i,j
real a,b,c
complex z
character g
!sem budu psat svuj kod
end program
- Proměnné deklarujeme na začátku programu za
implicit none
. Později v programu již nemůžeme typ proměnné změnit. Tím že vybíráme typ proměnné, říkáme kolik paměti si má program zabrat a jak má s proměnnou zacházet. Základní deklarace vypadá takto:
integer i,j
real a,b,c
complex z
character g
- Pokud chceme proměnné při deklaraci nastavit počáteční hodnotu, musíme použít mezi typem a názvem proměnné operátor
::
.
integer :: n = 5
- Pokud chceme aby hodnota proměnné byla neměnná, tj. aby byla konstantou, můžeme ji přiřadit specifikaci
,parameter ::
.
real, parameter :: pi = 3.1415926535
Deklarace proměnné typu character
program priklad_3
implicit none
character :: t1 = "?"
character(len=15) :: t2 = "answer is 42!"
write(*,*) t1! Vypíše proměnnou t1
write(*,*) t2! Vypíše proměnnou t2
end program
Pokud deklarujeme proměnnou typu character jako v programu priklad_1, získáme proměnnou g
, která může obsahovat pouze 1 znak (“a”, “b”, “c”, …, “1”, “2”, …, ”)”, ”!”, ”*”, …). Pokud potřebujeme delší řetězce, postupujeme takto:
character(len=15) g
Nyní bychom dostaly proměnnou typu character o délce 15.
Deklarace číselných proměnných podrobněji
program priklad_4
implicit none
integer(4) i
real(4) a
complex(4) z
integer(8) i2
real(8) a2
write(*,*) huge(a) ! Vypíše nejveší možné číslo které lze uložit do proměnné a tj. real(4)
write(*,*) huge(a2) ! Vypíše nejveší možné číslo které lze uložit do proměnné a2 tj. real(8)
write(*,*) tiny(a) ! Vypíše nejmenší možné kladné, nenulové číslo které lze uložit do proměnné a tj. real(4)
write(*,*) tiny(a2) ! Vypíše nejmenší možné kladné, nenulové číslo které lze uložit do proměnné a tj. real(8)
write(*,*) huge(i) ! Vypíše nejveší možné číslo které lze uložit do proměnné i tj. integer(4)
write(*,*) huge(i2) ! Vypíše nejveší možné číslo které lze uložit do proměnné i2 tj. integer(8)
end program
Říkal jsem, že proměnná si zabere místo v paměti. Otázkou je: kolik paměti? a jak velké číslo se do té paměti vejde? nebo kolik desetiných míst?
Deklaraci z programu priklad_2 můžeme přepsat také do této podoby:
integer(4) i,j
real(4) a,b,c
complex(4) z
(tj. real
= real(4)
apod. integer
a complex
)
Kde (4)
je množství paměti v bajtech, kterou si proměnná zabere. Pro velikost proměnné se používají násobky dvou tj. 1,2,4,8,16,32,… Volbu (4)
je běžně nazýváno jako jednoduchá přesnost a (8)
jako dvoujtá přesnot. Používání dvojité přesnosti je doporučeno.
Dvojitá přesnost
program priklad_5
implicit none
real(4) :: a4 = 1.234567890123456789
real(8) :: a8 = 1.234567890123456789
real(8) :: a8_d = 1.234567890123456789d0
write(*,*) a4 ! Vypíše 1.23456788
write(*,*) a8 ! Vypíše 1.23456788 a dalsích 8 cisel ktere byla zadana
write(*,*) a8_d ! Vypíse 1.2345678901234567
end program
- Používání dvojité přesnosti má svá specifika. např. když udáváme hodnotu v exponenciálním tvaru nepoužíváme
e
, aled
:
real(4) :: a = 6.022e23
real(8) :: b = 6.022d23
- U čísla které je
real(8)
musí být vždy alespoňd0
. V příkladu 5 můžeme vidět, že proměnnáa8
je sice inicializována jakoreal(8)
, ale ukládáme do ni číslo zapsané ve formátureal(4)
tedy bezd0
na konci. - V případě že nepotřebujeme desetiná místa zapisujeme číslo
real(8)
například takto:123.d0
.
Aritmetické operace s proměnnými
program priklad_6
implicit none
integer :: i = 3
real a,b
a = 5.
b = 3.5
write(*,*) a+b ! Sečte a a b a výsledek vypíše
write(*,*) a-b ! Odečte a a b a výsledek vypíše
write(*,*) a*i ! vynásobí a*i a vysledek vypíše
write(*,*) a/b ! vydědí b a a vysledek vypíše
write(*,*) b**i ! umocní b na i a vysledek vypíše
end program
Pro číselné proměnné můžeme pužít základní operátory pro sčítání, odčítání, násobení, dělení (+ - * /
) a navíc operátor pro mocninu (**
).
Převod datových typů
iteger na real
Převod iteger
na real
se provádi většinou automaticky, např.
integer :: i = 5
real a
a = 1
a = 1.0*i
V tomto kódu se do a uloží 1.0 i když by bylo vhodnější napsat alespň a=1.
. V dalším řádku se do a uloží 5.0.
V některých případech je ovšem nutné převod provést explicitně. To uděláme pomocí příkazů real()
pro jednoduchou přesnost a dble()
pro dvojitou přesnost.
program priklad_7
implicit none
integer :: i=2
real(4) :: a
real(8) :: b
a = sin(real(i))
write(*,*) a ! vypíše 0.909297407
a = sin(1.0*i)
write(*,*) a! vypíše 0.909297407
b = sin(dble(i))
write(*,*) b! vypíše 0.90929742682568171
b = sin(1d0*i)
write(*,*) b! vypíše 0.90929742682568171
end program
V tomto případě používáme funkci sin()
, která vrací sinus argumentu, kde argument musí být real (popř. complex).
real na integer
program priklad_8
implicit none
real :: a = 5.49, b = 5.51
write(*,*) int(a)! vypíše 5
write(*,*) int(b)! vypíše 5
write(*,*) nint(a)! vypíše 5
write(*,*) nint(b)! vypíše 6
write(*,*) ceiling(a)! vypíše 6
write(*,*) ceiling(b)! vypíše 6
write(*,*) floor(a)! vypíše 5
write(*,*) floor(b)! vypíše 5
end program
Pokud potřebujeme získat z realu integer musíme jej zaokrouhlit. K tomuto účelů má fortran několik funkcí: int()
- odřízne desetinou část, nint()
- zaokrouhlí na nejbližší celé číslo, ceiling()
- zakokrouhlí nahoru, floor()
- zaokrouhlí dolů.
complex na real, real na complex
Ze dvou raálných čísel lze získat komplexní číslo pomocí funkce cmplx()
:
real a,b
complex c
c = cmplx(a,b)
Zde budeme mít v proměnné c uloženo komplexní číslo, jehož reálná část bude rovna a a imaginární část bude b
Z komplexního čísla můžeme zítskat reálnou část pomocí funkce real()
a imaginární část pomocí aimag()
.
Logické výrazy
program priklad_9
implicit none
logical a, b
a = 5 > 1
b = 5 < 1
write(*,*) a! vypíše T jako true, protze plati ze 5 je vetsi nez 1
write(*,*) b! vypíše F jako false, protze NEplati ze 5 je vetsi nez 1
write(*,*) a .and. b! vypíše F, protoze a=.false. a b=.true.
write(*,*) b .and. b! vypíše F, protoze na obou stranách výrazu je .false.
write(*,*) a .and. a! vypíše T, protoze na obou stranách výrazu je .true., tedy nalevo "a zaroven" napravo
write(*,*) a .or. b! vypíše T, protoze alespon jeden z vrazu je .true. tj. a "nebo" b je .true.
write(*,*) .not. a! vypise F protoze a=.true.
write(*,*) a .eqv. b! vypise F protoze vyrazy nejsou ekvivalentni
end program
Jak již bylo řečeno proměnná typu logical
může nábývat pouze hodnot .true.
(pravda) nebo .false.
(nepravda).
Logický výraz můžeme získat pomocí logických operátorů ==
, >=
, <=
, <
, >
, /=
(není rovno). Tyto operátory aplikujeme na číselné proměnné.
Proměnné typu logical můžeme porovnávat pomocí operátorů .and.
- a zároveň, .or.
- nebo, .not.
- negace, .eqv.
- je ekvivalentní, .neqv.
- není ekvivalentní.