Přeskočit na obsah

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