34
Složene vrste podataka « Numeriˇ cke metode » Ivo Batisti´ c Fiziˇ cki odsjek, PMF Sveuˇ cilište u Zagrebu predavanja 2005/2006

« Numericke metode »ˇ Ivo Batistic´ - phygrdelin.phy.hr/~ivo/Nastava/Numericke_metode/predavanja/... · 2007. 11. 20. · Složene vrste podataka « Numericke metode »ˇ Ivo

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

  • Složene vrste podataka« Numeričke metode »

    Ivo Batistić

    Fizički odsjek, PMFSveučilište u Zagrebu

    predavanja 2005/2006

  • Pregled predavanjaKompleksni brojeviParameternaredba IMPLICITNiz podataka

    DeklaracijaIniciranje vrijednosti elemenataIzdvajanje pojednih elemenataRaspored niza u memoriji računalaNumeričke operacije na nizovimaAgregatne operacijeMatrične operacijeOdgod̄ena/naknadna rezervacije memorijeOblik nizaFunkcija RESHAPEO indeksima nizovaFunkcije oblika nizaVektorski indeksiWHERE naredba

    Izvedeni tipovi podatakaPokazivači i mete

  • Kompleksni brojevi

    ◮ Kompleksni brojevi na računalu se prikazuju par realnih brojevakoji se posebno tretiraju u numeričkim operacijama. Pri tomeRealni brojevi mogu biti jednostruke, dvostruke ili četverostrukepreciznosti.

    ◮ Kompleksni broj se može zadati preko para realnih brojeva uokruglim zagradama:

    COMPLEX (KIND=8) :: c,d,e !» u f77 COMPLEX*16 c !c = (1.0_8,-5.3D+2)d = CMPLX(-2.0) ! (-2.0_8,0.0_8)e = CMPLX(0.0,1.0) ! (0.0_8,1.0_8)d = e*d ! (0.0_8,-2.0_8)PRINT *,d

  • Kompleksni brojevi

    ◮ Par realnih brojeva može se konvertirati u kompleksni broj funkcijomCMPLX. Iz kompleksnog broja možemo izdvojiti realni dio i imaginarnidio s funkcijama REAL i AIMAG

    COMPLEX (KIND=8) :: cREAL (KIND=8) :: a,bc = (1.0_8,-5.3D+2)a = REAL(c) ; PRINT *,ab = AIMAG(c); PRINT *,b

    ◮ Kompleksno konjugirani broj se dobije pomoću funkcije CONJG

    COMPLEX (KIND=8) :: c,dc = (1.0_8,-5.3D+2)d = CONJG(c)PRINT *,cPRINT *,d

  • Kompleksni brojevi

    COMPLEX :: cc = 4.0 * ATAN(1.0) * (0.0,1.0)PRINT *,’Kompleksni broj = ’,cPRINT *,’Sinus = ’,SIN(c)PRINT *,’Eksponent = ’,EXP(c)PRINT *,’Kvadrat = ’,c**2PRINT *,’Korijen = ’,SQRT(c)PRINT *,’Absolutna = ’,ABS(c)

    Fortranske funkcije možemokoristiti na kompleksnimbrojevima.

    Rezultat izvod̄enja:

    Kompleksni broj = (0.0000000E+00,3.141593)Sinus = (0.0000000E+00,11.54874)Eksponent = (-1.000000,-8.7422777E-08)Kvadrat = (-9.869605,0.0000000E+00)Korijen = (1.253314,1.253314)Absolutna = 3.141593

  • Parameter

    ◮ Na početku programa moguće je zadati posebnu vrstu podatakakoji će za cijelo vrijeme izvod̄enja programa ostati konstante. Ovikonstantni podaci se zadaju kroz naredbu PARAMETER:

    INTEGER, PARAMETER :: single = KIND(1E0)INTEGER, PARAMETER :: double = KIND(1D0)REAL(single), PARAMETER :: spi = 3.1415927REAL(double), PARAMETER :: dpi = 3.141592653589793REAL(double), PARAMETER :: dpi2 = 0.5*dpiCHARACTERS(LEN=4), PARAMETER :: ime =’Pero’

    REAL(double) :: x

    X = 1.0_double

    ◮ Pokušaj promijene vrijednost parametra prevodilac će javiti kaogrešku.

  • IMPLICIT

    ◮ S naredbom IMPLICIT moguće je unaprijed zadati tip podatakaprema početnom slovu imena podatka. Tada imena podataka nijepotrebno deklarirati.

    IMPLICIT INTEGER (i-n), REAL (a), REAL(KIND=8) (d)aa = 1.4; PRINT *,aaab = 4.1; PRINT *,abi = 2 ; ii = 2 ; iii = 2PRINT *,i,ii,iii

    ◮ IMPLICIT NONE je naredba koja daje naputak prevoditelju da svakavarijabla mora biti prethodno deklarirana. Mora stajati na samompočetku programa.

    ◮ Dobro je deklarirati sve varijable, te na početku programa stavitinaredbu IMPLICIT NONE. Tako ćemo biti sigurni da nismo napravilislučajnu pravopisnu grešku u programu.

  • IMPLICIT

    ◮ S naredbom IMPLICIT moguće je unaprijed zadati tip podatakaprema početnom slovu imena podatka. Tada imena podataka nijepotrebno deklarirati.

    IMPLICIT INTEGER (i-n), REAL (a), REAL(KIND=8) (d)aa = 1.4; PRINT *,aaab = 4.1; PRINT *,abi = 2 ; ii = 2 ; iii = 2PRINT *,i,ii,iii

    ◮ IMPLICIT NONE je naredba koja daje naputak prevoditelju da svakavarijabla mora biti prethodno deklarirana. Mora stajati na samompočetku programa.

    ◮ Dobro je deklarirati sve varijable, te na početku programa stavitinaredbu IMPLICIT NONE. Tako ćemo biti sigurni da nismo napravilislučajnu pravopisnu grešku u programu.

  • Niz podataka (array)

    ◮ Često je potrebno raditi s nizom ili listom podataka iste vrste. Npr. ufizici to mogu biti koordinate jedne čestica, ili koordinate mnoštvačestica, raspodjela gustoće, itd.

    ◮ Da bi se deklarirao niz podataka potrebno je navesti dužinu niza iza to nam služi instrukcija DIMENSION.

    ◮ S naredbom DIMENSIONmože se rezervirati memoriski prostor zajednodimenzionalni ili višedimenzionalni niz.

    REAL, DIMENSION(3) :: polozaj = 0 ! niz od 3 clanaPRINT *,polozajpolozaj = (/ 1.0, -1.0, 4.3 /)PRINT *,polozajpolozaj = (/ (REAL(i**2), i=1,3) /)PRINT *,polozaj

  • Niz podataka

    ◮ Vrijednost niza mogu se inicirati u listi zatvorenoj s kombinacijomokruglih zagrada i kose crte. Okrugle zagrade dod̄u s vanjske strane,a kosa crta s unutrašnje: (/. . . /).

    ◮ Vrijednost niza mogu se zadati i petljom (tz. implied do-loop) unutarokruglih zagrada i kose crte, s tim da se petlja zatvori u dodatneokrugle zagrade: (/ (. . . ,i=p,k) /).

    ◮ Naredba DIMENSIONmože imati nekoliko argumenata za deklariranjevišedimenzionalnih nizova:

    REAL, DIMENSION(3,3) :: matmat = (/ (((i-j),i=1,3),j=1,3) /)PRINT *,matPRINT *,’Ljepsi ispis’DO i=1,3

    PRINT *,mat(i,1:3)END DO

  • Niz podataka

    ◮ Pojedini elementi niza dostupni su preko indeksa izlistanih u okruglimzagradama. U C-programu su to uglate zagrade.

    ◮ Dio niza (podniz) može se specificirati navodeći navodeći početnu ikonačnu vrijednost indeksa separirane dvotočkom.

    ◮ Ukoliko se želi uzeti svaka druga vrijednost u podnizu, ili vrijednosti snekim korakom različitim od 1, može se koristiti slijedeća sintaksapocetak : kraj : korak

    REAL, DIMENSION (3,3) :: a = 0.0REAL, DIMENSION (2,2) :: bREAL, DIMENSION (1,3) :: ca(1,1) = 3.0a(2,2) = 2.0b = a(1:2,2:3)c = a(3,1:3)

    a11 a12 a13a21 a22 a23a31 a32 a33

  • Memorijske lokacije za matricu

    ◮ U fortranu matrica se u memoriji računalasprema po stupcima tj. po prvom indeksu. UC-u matrica se sprema po retcima.

    ◮ U strukturi matrice ne postoji posebanpodatak koji govori o obliku matrice. Ako sematrica koristi kao jedan od argumenata upozivu nekoj funkciji ili podprogramu, ondaje potrebno dodatno navesti i dimenzijumatrice, odnosno njen oblik.Npr. ako je argument 3x3 matrica, funkcija(podprogram) ne zna da li je to 9x1, 3x3 ili1x9 matrica.

    Matrica 3x3 matrica

    a(1,1)a(2,1)a(3,1)a(1,2)a(2,2)a(3,2)a(1,3)a(2,3)a(3,3)

  • Operacije s numeričkim nizovima

    INTEGER, PARAMETER :: n = 3REAL, DIMENSION(n,n) :: aa = 0.0 ! svi a(i,j) = 0.0a = a + 1 ! svi a(i,j) = 1.0a = 2*a ! svi a(i,j) = 2.0a = SQRT(a) ! Vadi korijen iz svih elemenataa = SIN(a) ! Izracunava sinus iz svih elemenataa = a*a ! kvadrira svaki element

    ◮ Numeričke operacije primjenjuju se svakom pojedinom članuniza, a rezultat se sprema u niz na lijevoj strani znaka jednakosti.

    ◮ U Fortranu 77 bilo je potrebno koristiti DO-petlje da bi se postigaoisti rezulat.

  • Agregatne operacije

    Agregatna operacija = operacija na nizu podataka koja kao rezultatima jedan broj.

    REAL, DIMENSION(3) :: a = (/ (REAL(i), i=1,3) /)REAL, DIMENSION(3) :: b = (/ (i**2 , i=1,3) /)REAL, DIMENSION(6) :: c = (/ ((i-2)**2,i=1,6) /)PRINT *,’Broj elemenata = ’,SIZE(a) ! 3PRINT *,’Najveci element = ’,MAXVAL(b) ! 9.0PRINT *,’Najmanji element = ’,MINVAL(c) ! 0.0PRINT *,’Suma elemenata = ’,SUM(a) ! 6.0PRINT *,’Produkt elemenata = ’,PRODUCT(b) ! 36.0PRINT *,’Skalarni produkt = ’,DOT_PRODUCT(a,b) ! 36.0

  • Matrične operacije

    REAL :: fi = 0.25*3.1415927REAL, DIMENSION(2) :: a = (/ 1.0, 0.0 /)REAL, DIMENSION(2) :: bREAL, DIMENSION(2,2) :: rr(1,1:2) = (/ COS(fi), SIN(fi) /)r(2,1:2) = (/ -SIN(fi), COS(fi) /)PRINT *,’vec a = ’,ab = MATMUL(r,a) ! Rotacija za kut pi/4PRINT *,’vec R*a = ’,bb = MATMUL(r,b) ! Jos jedna rotacijaPRINT *,’vec R*b = ’,bPRINT *,’R = ’,rr = MATMUL(r,r) ! Matrica rotacije za 2*fiPRINT *,’R*R = ’,r

    Funkcija MATMULmnoži matricu smatricom umatematičkomsmislu, za razlikuod operacijemnoženja (*) kojamnoži element selementom.

    FunkcijaTRANSPOSEkaorezultat imatransponiranumatricu.

  • Odgod̄ena/naknadna rezervacije memorije

    Ponekad nije moguće unaprijed znati točnu dužinu niza podataka koji ćese rabiti u programu, pa se obično rezervira naviše što se misli da će bitipotrebno. S druge strane prevelika količina rezervirane memorije možeusporiti program jer ona može nadmašiti dostupni RAM na računalu. U timsituacijama je zgodno koristiti mogućnost naknadne rezervacijememorijskog prostora, za trenutak kada je podatak o količini potrebnememorije poznat.

    ◮ Nizovi za koje će se memorijski prostor rezervirati naknadnodeklariraju se s naznakom ALLOCATABLE.

    ◮ Memorija se rezervira s naredbom ALLOCATE

    ◮ a oslobad̄a se s naredbom DEALLOCATE

    ◮ Matrica se ne smije rabiti prije rezervacije memorije, a to se možeprovjeriti naredbom ALLOCATED.

    ◮ Naznaka DIMENSION umjesto brojke, dužine niza, ima ’:’(dvotočku).

  • Primjer

    Primjer programa koji čita sa standardnog unosa (inputa) podatke teizračunava srednju vrijednost i standardnu devijaciju.

    PROGRAM analizaREAL, DIMENSION(:), ALLOCATABLE :: podaciINTEGER :: nREAL :: aver,sigmaPRINT *,’Upisi broj podataka’; READ (*,*) nALLOCATE (podaci(n))PRINT *,’Upisi podatke’; READ (*,*) podaci(1:n)aver = SUM(podaci(1:n))/REAL(n)sigma = SQRT(SUM( (podaci(1:n)-aver)**2 )/REAL(n-1))PRINT *,’prosjecna vrijednost = ’,averPRINT *,’standardna devijacija = ’,sigmaDEALLOCATE (podaci)END PROGRAM

  • Primjer (neke izmjene)

    Modificirajmo program tako da čita podatke direktno iz datoteke.

    PROGRAM analizaREAL, DIMENSION(:), ALLOCATABLE :: podaciINTEGER :: n, infoREAL :: aver,sigmaCHARACTER (LEN=20) :: datoteka = ’podaci.txt’OPEN (UNIT=35, FILE=TRIM(datoteka), STATUS=’old’, &

    IOSTAT=info, ACTION=’read’)IF (info /= 0) THEN

    PRINT *,’GRESKA kod otvaranja datoteke ’,TRIM(datoteka)STOP

    END IFREAD (35,*) nALLOCATE (podaci(n))READ (35,*) podaci(1:n)CLOSE (35)aver = SUM(podaci(1:n))/REAL(n)... itd ...

  • Objašnjenja uz primjer

    ◮ S naredbom OPEN otvaramo datoteku za čitanje. Tom ured̄ajupridružujemo broj ’35’ pomoću argumenta UNIT=35. U nastavkusve operacije čitanja (ili pisanje, pregledavanja) koriste taj brojured̄aja.

    ◮ Po pretpostavci standardni ispis ima broj ured̄aja ’6’, a standardniunos broj ured̄aja ’5’. Standardni ispis i unos nije potrebnoposebno otvarati naredbom OPEN, jer se oni po poretpostavciautomatski otvore čim se program počne izvoditi.

    ◮ Ured̄aje zatvaramo naredbom CLOSE.

    ◮ Naredba OPENima niz opcionalnih argumenata, med̄u inim iprovjeru greške kod otvaranja datoteke.

    ◮ Naredbom STOP na silu teminiramo izvod̄enje programa, ali prijetoga ispisujemo razlog teminacije.

  • Oblik niza podataka

    Naredba DIMENSION(n,m,...) zadaje oblik niza podataka. To možebiti

    ◮ To može biti stupac odred̄ene dužine (eg. DIMENSION(k) ).

    ◮ Ili redak odred̄ene dužine (eg. DIMENSION(1,k) ).

    ◮ Ili matrica - tablično raspored̄eni podaci (eg. DIMENSION(k,l) ).

    ◮ Ili niz tablica podataka - prostorno kubni raspored s 3 indeksa(eg. DIMENSION(k,l,m) ).

    ◮ Ili matrica još većeg broja indeksa (eg.DIMENSION(k,l,m,n,...) ).

    Podaci se mogu preraspodjeliti iz jednog oblika u drugi koristećifunkciju RESHAPE.

  • Funkcija RESHAPE

    Funkcija RESHAPEima dva obavezna argumenta i još dva opcionalna.

    ◮ Prvi argument je niz podataka koje treba preurediti u novi oblik.

    ◮ Drugi argument je niz cijelih pozitivih brojeva kojim definiramonovi oblik za podatke iz prvog argumenta (specifikacija sličnaonoj u naredbi DIMENSION).

    ◮ Treći opcionalni argument je niz podataka iste vrste kao nizpodataka. Ovim podacima nadopunjujemo izlazne podatke akoulazni niz podataka nije dovoljno dugačak.

    ◮ Četvrti argument je niz dobiven permutiranjem niza cijelih brojeva(1,2,3,. . . ), kao npr. (3,1,2) kojim se definira kojim će se redompopunjavati pojedine dimenzije novog izlaznog niza.

  • Primjer

    INTEGER, DIMENSION(20) :: aa = (/ (i, i=1,20) /)INTEGER, DIMENSION(2,3) :: bbINTEGER, DIMENSION(5,5) :: ccbb = RESHAPE (aa, (/ 2,3 /))cc = RESHAPE (aa, (/ 5,5 /), (/ 31,32,33,34,35 /), (/ 2,1 /))

    Kao rezultat dobivaju se matrice

    bb =

    (

    1 3 52 4 6

    )

    cc =

    1 2 3 4 56 7 8 9 10

    11 12 13 14 1516 17 18 19 2031 32 33 34 35

    ◮ Matrica bb popunjava se po stupcima koji su prvi indeks, dok matricacc se popunjava po retcima, tj. drugom indeksu jer smo to naznačili uRESHAPEnaredbi s četvrtim argumentom.

    ◮ Matrica cc nadopunjena je dodatnim podacima iz trećeg argumenatakomande RESHAPE.

  • O indeksima nizova

    ◮ Indeksi niza brojeva ne moraju započinjati s jednicom.

    ◮ Početna i konačna vrijednost indeksa se specificiraju pomoćunaznake DIMENSION.

    REAL, DIMENSION(1:10) :: a ! isto sto i DIMENSION(10)REAL, DIMENSION(-10:10) :: b ! po četni indx. -10, zadnji 10REAL, DIMENSION(-5:10,5:10) :: cPRINT *,LBOUND(a), UBOUND(a) ! ispisuje 1 i 10PRINT *,LBOUND(b), UBOUND(b) ! ispisuje -10 i 10PRINT *,LBOUND(c,2),UBOUND(c,2) ! ispisuje 5 i 10PRINT *,SIZE(a) ! ispisuje 10PRINT *,SIZE(b) ! ispisuje 21PRINT *,SIZE(c) ! ispisuje 96PRINT *,SIZE(c,1) ! ispisuje 16

  • Funkcije oblika niza

    ◮ Funkcije LBOUND i UBOUND kao rezultat daju početnu i konačnuvrijednost indeksa nekog niza podataka, s tim da je mogućespecificirati na koju se to dimenziju odnosi.

    ◮ Funkcija SIZE ispisuje broj članova niza. Kao dodatni argumentmože se navesti dimenzija, pa se dobiva broj čanova niza samoza tu dimenziju.

    ◮ Funkcija SHAPE ispisuje broj članova niza za svaku dimenziju.Rezultat je niz brojeva dužine broja dimenzija niza.

    PROGRAM oblikREAL, DIMENSION(-10:10) :: bREAL, DIMENSION(-5:10,5:10) :: cPRINT *,SHAPE(b) ! ispisuje 21PRINT *,SHAPE(c) ! ispisuje 16,6END PROGRAM

  • Vektorski indeksi

    Pojedini dijelovi niza podataka mogu se izdvojiti koristeći vektorskiindekse. Vektorski indeks je 1-dim niz cijelih brojeva po iznosuunutar područja vrijednost indeksa nekog niza. Vektorski indeks nemora biti ured̄en i može sadržavati višestruke vrijednosti.

    INTEGER, DIMENSION(3,3) :: aaINTEGER, DIMENSION(2,2) :: bbINTEGER, DIMENSION(3) :: iiaa = RESHAPE ( (/ (i, i=1,9) /), (/ 3,3 /))ii = (/ 3,1,2 /)aa = aa ( ii, (/ 1,2,3 /) )bb = aa ( (/ 3,1 /), (/ 2,2 /) )

    Kao rezulat imamo:

    aa =

    3 6 91 4 72 5 8

    bb =

    (

    5 56 6

    )

  • WHERE naredba

    Pomoću naredbe WHERE, operacije koje s provode na cijelom nizupodataka, mogu se ograničiti na samo neke elemente kojizadovoljavaju zadani uvijet.

    PROGRAM test_whereREAL, DIMENSION(2,2) :: a,ba = RESHAPE( (/ 1,2,3,4 /), (/ 2,2 /) )b = RESHAPE( (/ 3,0,0,5 /), (/ 2,2 /) ) ! dijagonalnaWHERE (b .NE. 0) a = a/bPRINT *,a(1,1:2)PRINT *,a(2,1:2)END PROGRAM

  • WHERE naredba - složeni oblik

    Ako je zadovoljen uvjet operacije se izvode na nizu unutar bloka kojipočinje s WHERE a završava s ili s ENDWHERE ili s ELSEWHERE.ELSEWHERE je ujedno početak opcionalnog drugog bloka u kojem seizvode operacije na članovima niza koji ne zadovoljavaju uvijet.

    PROGRAM test_whereREAL, DIMENSION(2,2) :: a,ba = RESHAPE( (/ 1,2,3,4 /), (/ 2,2 /) )b = RESHAPE( (/ 3,0,0,5 /), (/ 2,2 /) ) ! dijagonalnaWHERE (b .NE. 0)

    a = a/bELSEWHERE

    a = 5*aENDWHEREPRINT *,a(1,1:2) ! 0.3333333 15.00000PRINT *,a(2,1:2) ! 10.00000 0.8000000END PROGRAM

  • Izvedeni tipovi podataka

    Iz osnovih podataka mogu se definirati novi tipovi podataka. Novipodaci se definiraju unutar bloka koji počinje s TYPE i imenom zanove podatke a završava s END TYPE

    TYPE brzinaREAL :: x,y,z

    END TYPE brzinaTYPE(brzina) :: v1,v2v1 %x = 1.0v1 %y = 1.0v1 %z = 1.0v2 = brzina(-1.0,0.0,5.0)PRINT *,v1 ! 1.0 1.0 1.0PRINT *,v2 ! -1.0 0.0 5.0

    Pojedinie komponente unutar složenog podatka dostupne su prekoznaka procenta (%).

  • Kombiniranje izvedenih tipova podataka u složenije tipove

    Izvedeni tip podatka može sadržavati druge izvedene tipove:

    TYPE polozajREAL :: x, y, z

    END TYPE polozajTYPE brzina

    REAL :: x, y, zEND TYPE brzinaTYPE stanje

    TYPE(polozaj) :: rTYPE(brzina) :: v

    END TYPE stanjeTYPE (stanje) :: cesticacestica%r = (polozaj)(0.0, 0.0, 0.0)cestica%v = (brzine)(1.0, 0.0, 0.0)PRINT *,cestica%r%x

  • Izvedeni tipovi podataka i nizovi

    Izvedeni tipovi podataka mogu biti dio niza ili sami mogu sadržavatiniz.

    TYPE tockaREAL :: x,y

    END TYPE tockaTYPE trokut

    TYPE (tocka), DIMENSION(3) :: vrhEND TYPE trokutTYPE (trokut) :: pravokutniTYPE (trokut), DIMENSION(2) :: trokutipravokutni%vrh(1) = tocka(0.0,0.0)pravokutni%vrh(2) = tocka(4.0,0.0)pravokutni%vrh(3) = tocka(0.0,3.0)trokuti(1) = pravokutnitrokuti(1)%vrh(3) = tocka(1.0,3.0)PRINT *,trokuti(1)

  • Izvedeni tipovi podataka i funkcije/podprogrami

    Fukcije mogu imati kao argumente izvedene tipove, te ih vraćati kao rezultat.

    TYPE tockaREAL :: x,y

    END TYPE tockaTYPE (tocka) :: t1,t2REAL :: dREAL, EXTERNAL :: udaljenostt1 = tocka(0.0,0.0) ; t2 = tocka(3.0,4.0)d = udaljenost(t1,t2)...FUNCTION udaljenost(a,b) RESULT (c)

    TYPE tockaREAL :: x,y

    END TYPE tockaTYPE (tocka) :: a,bREAL :: cc = SQRT((a%x-b%x)**2+(a%y-b%y)**2)

    END FUNCTION

  • Primjer

    TYPE tockaREAL :: x,y

    END TYPE tockaTYPE (tocka) :: t1,t2REAL :: kut = 0.25*3.14157TYPE (tocka), EXTERNAL :: rotacijat1 = tocka(3.0,3.0)t2 = rotacija(t1,kut)PRINT *,t2...FUNCTION rotacija(a,b) RESULT (c)

    TYPE tockaREAL :: x,y

    END TYPE tockaTYPE (tocka) :: a,cREAL :: bc = tocka((a%x*COS(b)+a%y*SIN(b)),(-a%x*SIN(b)+a%y*CO S(b)))

    END FUNCTION

  • Pokazivači i mete

    ◮ Kao i u drugim jezicima, fortranu postoje pokazivači (pointeri).Pravila uporabe pointera u Fortranu su puno stroža od onih kojapostoji npr. u C-u ili C++.

    ◮ Pokazivač nije vrsta podatka kao cijeli broj, realni broj ili string. Toje u stvari podatak o memorijskog lokaciji nekog drugog podatka.Taj drugi podatak zovemo metom.

    ◮ Pokazivač treba deklarirati, kao i sve ostale podatke, ali njegovadaklaracija sadrži dodatnu oznaku POINTER.

    ◮ Meta na koju može pokazivati pokazivač treba biti deklarirana soznakom TARGET.

    ◮ Meta i pokazivač trebaju biti kompatibilni, pokazivač na cijeli brojne može sadržavati adresu realnog broja, niti pokazivač realnogbroja ne može pokativati niz realnih brojeva.

  • Primjeri

    Veza izmed̄u pokazivača i mete se uspostavlja s relacijom:

    [oznaka pokazivača] => [oznaka mete]

    PROGRAM pokazivaci_i_meteREAL, TARGET :: a,bREAL, POINTER :: paa = 3.0; b= 4.0pa => a ! meta je aPRINT *,a,b,pa ! 3.0 4.0 3.0pa => b ! meta je bPRINT *,a,b,pa ! 3.0 4.0 4.0pa = a ! mijenja sadrzaj mete (b)PRINT *,a,b,pa ! 3.0 3.0 3.0END PROGRAM

    Pregled predavanjaKompleksni brojeviParameternaredba IMPLICITNiz podatakaDeklaracijaIniciranje vrijednosti elemenataIzdvajanje pojednih elemenataRaspored niza u memoriji racunalaNumericke operacije na nizovimaAgregatne operacijeMatricne operacijeOdgoena/naknadna rezervacije memorijeOblik nizaFunkcija RESHAPEO indeksima nizovaFunkcije oblika nizaVektorski indeksiWHERE naredba

    Izvedeni tipovi podatakaPokazivaci i mete