Odvozený datový typ
Odvozený datový typ slouží ke zvýšení abstrakce proměnných. Představme si, že v programu budeme pracovat např. s částicemi. Každá částice má velikost, hmotnost, polohu (x,y,z) atd. Pro každou veličinu bychom potřebovali nejspíš pole velikostí, pole hmotností a pole pozic. Pomocí odvozeného typu můžeme vytvořit proměnnou typu částice, která obsahuje jako “pod-proměnnou” velikost, hmotnost a polohu.
Odvozený typ (type _jmenoTypu_ _..._ end type
) definujeme na začátku programu ideálně před deklarací proměnných. Následně již můžeme deklarovat proměnné (či pole) našeho typu pomocí type(_jmenoTypu_) _seznamPromennych_
.
K jednotlivým vnořeným proměnným přistupujeme pomocí operátoru %
.
program priklad_38
implicit none
type prvek
integer :: protonoveCislo
integer :: pocet
real :: hmotnost
character(len=2) :: jmeno
end type
integer :: i
type(prvek) h2so4(3) ! pole prvku
! prvni prvek
h2so4(1)%jmeno = "H "
h2so4(1)%protonoveCislo = 1
h2so4(1)%pocet = 2
h2so4(1)%hmotnost = 1.0079
! druhy prvek
h2so4(2)%jmeno = "S "
h2so4(2)%protonoveCislo = 16
h2so4(2)%pocet = 1
h2so4(2)%hmotnost = 32.06
! treti prvek
h2so4(3)%jmeno = "O "
h2so4(3)%protonoveCislo = 8
h2so4(3)%pocet = 4
h2so4(3)%hmotnost = 16.0
write(*,'(a)',advance='no') "Kyselina sýrová je sloučenina "
do i=1,size(h2so4)
write(*,'(a,i1,x)',advance='no') trim(h2so4(i)%jmeno), h2so4(i)%pocet
enddo
write(*,*)
write(*,*) "Její relativní atomová hmotnost je ",sum(h2so4%hmotnost * h2so4%pocet)
end program
Stejný příklad v trochu jiném kabátě:
program priklad_39
implicit none
type prvek
integer :: protonoveCislo
real :: hmotnost
character(len=2) :: jmeno
end type
type sloucenina
type(prvek),allocatable :: prvky(:)
integer,allocatable :: pocet(:)
end type
integer :: i
type(sloucenina) h2so4
allocate(h2so4%prvky(3), h2so4%pocet(3))
h2so4%prvky(1) = pridej_prvek("H ", 1, 1.0079)
h2so4%prvky(2) = pridej_prvek("S ", 16, 32.06 )
h2so4%prvky(3) = pridej_prvek("O ", 8, 16.0 )
h2so4%pocet = (/ 2, 1, 4/)
write(*,'(a)',advance='no') "Kyselina sýrová je sloučenina "
do i=1,size(h2so4%prvky)
write(*,'(a,i1,x)',advance='no') trim(h2so4%prvky(i)%jmeno), h2so4%pocet(i)
enddo
write(*,*)
write(*,*) "Její relativní atomová hmotnost je ",sum(h2so4%prvky%hmotnost * h2so4%pocet)
contains
!---------------------------------------------
function pridej_prvek(jm,pc,hm) result(a)
type(prvek) :: a
integer :: pc
real :: hm
character(len=2) :: jm
a%jmeno = jm
a%protonoveCislo = pc
a%hmotnost = hm
end function
end program