1.09k likes | 1.42k Views
FORTRAN. NASTAVAK. Zašto FORTRAN ?. Najrašireniji zn. programski jezik u svijetu Fortran 90 pogodan za rješavanje numeričkih problema Velika baza dobrog i dostupnog Fortran koda Dostupan na skoro svim platformama Lagan za učenje !. Od problema do programa.
E N D
FORTRAN NASTAVAK
Zašto FORTRAN ? • Najrašireniji zn. programski jezik u svijetu • Fortran 90 pogodan za rješavanje numeričkih problema • Velika baza dobrog i dostupnog Fortran koda • Dostupan na skoro svim platformama • Lagan za učenje !
Od problema do programa Opći pristup programiranju poznat kao Top Down Design ….ukratko 1.Jasna specifikacija problema 2.Analiza problema i prekida, rastavljanje u osnovne elemente 3.Kodiranje programa prema 2 4.Iscrpljujuće testiranje i ponavljanje 2 i 3 kolikogod je potrebno
Od problema do programa 1. Razumjevanje što program treba raditi 2. Jasan ulaz i izlaz 3. Znati koje metode će se koristiti za rješavanje 4. Razmatranje korištenja postojeće biblioteke 5. Korištenje modularnog dizajniranja ( 50 linija po modulu) 6. Korištenje opisnih imena varijabli 7. Biti jasan sa komentarima 8. Provjeravanje greške svih ulaza 9. Iscrpljujuće testiranje
FORTRAN • April 1957 IBM pokrenuo IBM Mathematical FORmulaTRANslation system, FORTRAN, prvi programski jezik visokog nivoa. • 1963 postoji preko 40 različitih compiler-a. • 1966 the American National Standards Institute, ANSI, Potpisan prvi standard za FORTRAN (Fortran66). • 1978 FORTRAN V – FORTRAN 77,ANSI 1980 zamijenjen novim standardom FORTRAN 77. • sredinom 1980 FORTRAN 77 postaje univerzalni dijalekt. • 1991 ,pojavljuje se standard i compiler Fortran 90 (ISO).Podržava FORTRAN 77, • 1997 FORTRAN 95 (ISO) • rujan 2002 FORTRAN 2000
FORTRAN 77 i Fortran 90 • Programi ili procedure u FORTRAN 77 valjani su i u Fortran 90, ponašaju se identično • F90 koristi slobodanu formu • Praznina razdvaja ime varijabli, ključne riječi i sl. • Slijed karaktera iza ! označen je kao komentar • Linija može imati 132 znaka • Linija može sadržavati više od jedne naredbe, ; se koristi za odvajanje naredbi na liniji (39 linija)
Ispis teksta • Sintaksa – ispis na zaslon monitora PRINT*,’tekst string’ PROGRAM ispis PRINT*,Ovo je lako’ END PROGRAM ispis Ovo je lako. Može biti, broj, znak, simbol…. Fortran znakovi 26 velikih i malih slova 0-9 brojeva Podcrta Specijalni znakovi: = + -* / ( ) , : ! ” % & ; < > ?
Varijable • Za predstavljanje podataka čija se vrijednost može mijenjati unutar programa koristimo varijable • Fortran 90 ..ime varijable …do 31 znak, koristeći i podcrtu , ’_’. PREPORUKA • Koristiti mala slova za varijable i relativno kratka imena • Ne koristiti podcrtu kao znak imena – konflikt copiler …gen.imena
Pridruživanje • Izrazi koriste znak ’=‘ za pridruživanje vrijednosti pojedinoj varijabli • Nepoznata varijabla je na lijevoj strani jednakosti ukupno=asum+bsum PRINT*,’Masa je ’,ukupno,’ kilograma’ Masa je 6.000 kilograma
Matematički operatori • + zbrajanje • - oduzimanje • * množenje • / dijeljenje • ** potenciranje • PRIORITET 1. ** 2. * i / 3. + i -
PRIMJER ... a=2.3+3.2*4.0 PRINT*,a a=a+3. PRINT*,a ... Rezultat: 15.1000 22.0000 sa zagradom a=(2.3+3.2)*4.0
Inicijalizacija podataka • FORTRAN 77 podržava tri načina na koje vrijednost može biti pridružena varijabli (Fortran 90 podržava 4 načina,i više metoda inicijalizacije) • Dodjeljivanje (viđeno) • Inicijalizacija • parametar
Inicijalizacija podataka • Inicijalizacija varijabli REAL::a=0.0,b=5.0,c Deklariramo varijable a b i c kao realne i inicijaliziramo njihove vrijednosti Dok REAL,PARAMETER::pi=3.14159 Nije samo inicijalizirana realna varijabla pi sa vrijednošću 3,14159 nego je dana sa PARAMETAR atributom koji znači da može biti modificirana unutar programa .. Ovu sintaksu nemožete koristiti sa FORTRAN 77 compiler Bilo koji pokušaj promjene vrijednosti varijable sa PARAMETAR atributom rezultira kompilacijsku grešku, drugačije ponaša se poput bilo koje varijable
Tipovi podataka • Cjelobrojni (-2147483648 i +2147483647) • Realni Realan broj pisan u znanstvenoj notaciji 1234.56 = 1.23456 x 103 Broj se sastoji od tri dijela: • mantisa: 1.23456. 6 znamenki • eksponent: 3. eksponent je cjelobrojan • baze: 10. Ako ju fiksiramo , nemoramo ju prikazivati
GREŠKE ZAOKRUŽIVANJA Ograničena točnost realnog broja PROGRAM greška IMPLICIT NONE REAL :: veliki=1.0E9,mali=1.0E-9,sum sum=veliki+mali PRINT*,’Suma je ’,sum END PROGRAM greška rezultat Suma je +1.00000E+09 !!! Kako su brojevi prikazani u znanstvenoj notaciji u FORTRANu
Cjelobrojne i realne varijable PROGRAM brojevi INTEGER :: i,j REAL :: v1, v2 i=5; j=3; v1=1.3; v2=6.3 PRINT*,’i=’,i,j,v1,v2 END PROGRAM brojevi
Implicit tipovi varijabli • Fortran ima implicit tipove podataka. Variable koje počinju sa : • a-h, o-z: su implicitno REAL • i-n: su implicitno INTEGER • Dobra je praksa eksplicitno deklatrirati varijable . Fortran 90 • Uključiti IMPLICIT NONE na početak svakog programskog modula.
PRIMJER • Kratki program PROGRAM tippodatka IMPLICIT NONE REAL :: masa=52.5, gustoća=1.7 volumen=masa/gustoća PRINT*,’Volumen je ’,volumen,’ m3’ END PROGRAM tippodatka • Rezultat …kompilacijska greška budući da varijabla volumen nije deklarirana
Tipovi konverzije • Ako je izraz u obliku cjelobrojna varijabla=cjelobrojni izraz Ili realna variajabla=realan izraz Znamo točno što se događa, međutim Fortran obično koristi miješane izraze
PRIMJER REAL :: a INTEGER :: i=2,j=3 a=i+j Slijedi: Vrijednost i+j je ocijenjena kao INTEGER (u slučaju 2+3=5) INTEGER je konvertiran u REAL i pridružen varijabli a (5 je konvertiran u 5.0 i pridružen a)
Primjer ... REAL :: a=3.3,b=2.6 INTEGER i i=a+b ... Slijedi: ˛ a+b je REAL (3.3+2.6=5.9) Decimalni dio je odsječen i vrijednost je pridružena varijabli i je 5 ..
Više • Što se događa ako su INTEGER i REAL vrijednosti na desnoj strani Strana pridruživanja? • Uvjeti su : • Prioritet operatora. • kada su oba operatora istog prioriteta …s lijeva na desno. • INTEGER će prvi biti konvertiran u REAL Ako prolazi kroz aritmetičku operaciju sa REAL. • Pažljivo!!
Primjer Pretvaranje temperature iz Celsius stupnjeva u Fahrenheit. PROGRAM pretvorba IMPLICIT NONE REAL :: Cstupanj, faren_1, faren_2 PRINT*,’Unesi temperaturu u stupnjevima Celsius : ’ READ*, Cstupanj faren_1=Cstupanj*9/5+32 faren_2=9/5*Cstupanj+32 PRINT*,faren_1,faren_2 END PROGRAM pretvorba Da li će vrijednosti faren_1 i faren_2 biti iste ?
Nastavak_primjer Postavimo li vrijednost Cstupanj 37.5. U oba izraza pridruživanja * i / su visokog prioriteta . Budući su prioriteti isti računa se od lijeva na desno • Za faren_1 Cstupanj se množi sa 9. 9 postaje 9.0, prije računanja produkta , koji iznosi 337.5. Ovo se sada dijeli sa 5 , koji se prvi pretvara u 5.0, i dobijemo rezultat 67.5. • 32 se dodaje ,nakon konverzije u REAL, te daje 99.5. • Za faren_2 prvo se izračunava 9/5. Ovo je INTEGER arithmetika sa rezultatom 1.Dovoljno !
Savjet • Dobra je ideja izbjegavati aritmetiku različitih tipova podataka. • Kada dodijelimo vrijednosti podaci ili parametri moraju koristiti korektne tipove podataka .SveREAL vrijednostiimaju decimalnu točku , sve INTEGERnemaju dec. točku PROGRAM primjer IMPLICIT NONE REAL :: a=2.0,b=3.0 INTEGER :: i=2, j=3 .....
READ • READ naredba se koristi za učitavanje vrijednosti iz ulaznih uređaja. default - ulazni uređaj je tastatura Primjer PROGRAM ucitaj IMPLICIT NONE REAL :: a,b READ*,a b=a*25.0 PRINT*,’Rezultat je ‘,b END PROGRAM ucitaj • Učitavanje je REAL vrijednost sa tastature pomnožena sa 25 i ispisan rezultat
Moduli • U realnom svijetu programi su složeniji od nekoliko linija • Programe obično piše tim programera • ZATO realne programe pišemo kao skupove manjih cjelina (module) .Na svakom modulu se može raditi nezavisno i svi trebaju znati: • Što radi svaki modul? • Gdje je njegovo mjesto spajanja (interface) ?
JEDNOSTAVNI PRIMJER • Uzmite u obzir program koji : • Ispisuje pozdravnu poruku • Izvodi zbrajanje • Ispisuje odlazni pozdrav Mogli bi to napisati PROGRAM dddd CALL pozdrav CALL zbroj CALL doviđenja END PROGRAM dddd
SUBROUTINE • Pozdrav, zbroj i doviđenja su primjeri potprograma. Svaki potprogram je nezavisan modul. Kada se potprogram pozove: • Kontrola se prenosi na potprogram • Naredbe u pp se izvršavaju do naredbe END • Kontrola se vraća modulu koji ga je pozvao Napomena: Vidjet ćemo kasnije da se izvršavanje ne odvija prije vraćanja kontrole pozivnom modulu
SUBROUTINE • PP izgleda poput glavnog programa s tim da očekuje prvu naredbu SUBROUTINE te deklaracija imena pp. • PP bi se mogao kreirati kako slijedi: SUBROUTINE pozdrav PRINT*,’Dobro došli’ END SUBROUTINE pozdrav Pravila koja se primjenjuju na imena pp. Ista su kao i za imena varijabli s razlikom što prvi znak nema značenje tipa varijable
SUBROUTINE • Pp.zbrojkoji je glavni dio programa mogao bi se kodirati : SUBROUTINE zbroj IMPLICIT NONE REAL :: a,b,c PRINT*,’Unesi 2 broja za zbrajanje: ’ READ*,a,b c=a+b PRINT*,a,’+’,b,’=’,c END SUBROUTINE zbroj -načinite sami pp za subroutine doviđenja.
SUBROUTINE • Potprogrami su poput modula glavnih programa i treba: • uključiti IMPLICIT NONE naredbu • deklarirati sve varijable • zabilježiti lokalna imena varijabli, varijabla u pp nije ista varijabla kao u gl programu, služi za izbjegavanje problema kada kod piše više od jednog programera
ARGUMENTI Najčešće pp nisu jednostavni kao prethodni i trebamo povezati podatke između pp i gl programskog modula. Podaci se povezuju argument-ima, Npr. ...... a=3.2 b=4.7 CALL zbroj(a,b,c) ...... SUBROUTINE zbroj(x,y,z) IMPLICIT NONE REAL :: x,y,z z=x+y END SUBROUTINE zbroj
PROLAZNI PODACI • Varijable x,y i z su dummy varijable. Koriste se kao privremene vrijednosti između modula • Dummy varijable u biti ne postoje tj. One se zamjenjuju sa pravim imenima varijabli kada se pozove pp. Primjer • Varijabla a u modulu iz kojeg pozivamo se zamjenjuje sa x • Varijabla b sa y • Varijabla c sa z
PRIMJER Pogledajmo primjer pronalaženja promjera kruga koji je upisan u trokut. PROGRAM krug IMPLICIT NONE REAL :: a,b,c,r PRINT*,’Upisani krug’ PRINT*,’Unesi stranice trokuta’ READ*,a,b,c CALL prutrok(a,b,c,r) PRINT*,’Promjer je : ’,r END PROGRAM krug
SUBROUTINE SUBROUTINE prutrok x,y,z,rad) IMPLICIT NONE REAL :: x,y,z,rad,s s=(x+y+z)/2.0 rad=(((s-x)*(s-y)*(s-z))**0.5)/s END SUBROUTINE prutrok
SAŽETAK • Pozivajuća sekvenca je : CALL subroutine_ime( imena_varijabli) I prva linija u pp ima slijedeći oblik: SUBROUTINE subroutine_ime(dummy varijable) • PP može zvati drugi pp, F77 ne dopušta rekurziju (poziv samog sebe). F90 dopušta rekurziju. • U većini priručnika vidjet ćete RETURN naredbu prije END u svim pp. Ovo nije potrebno u F90. (kasnije ćemo vidjeti kada se može koristiti RETURN) • Potrebno je osigurati pridruživanje (broj, tip podatka i poredak) između argumenata u pozivu pp i dummy varijabli. Imena varijabli ne trebaju biti ista i bolje je ako nisu. • Koristite pp slobodno (ali pametno) oni se koriste za dobro strukturiranje programa. • Jednostavni programi uključuju glavni program i sve pp u istu datoteku
FUNCTION • Vidjeli smo da pp dopušta prijenos više različitih vrijednosti podataka • FUNCTION potprogram se koristi za povratak jedne vrijednosti u glavni program. • FUNCTION potprogram može biti: • Složen koliko želite • Mora imati barem jedan argument
FUNCTION • Poput subroutine function potprogram je programski modul koji završava naredbom END .Prva naredba je u slijedećem obliku: FUNCTION function_ime(dummy_varijable) Budući da vraća jednu vrijednost to je ujedno i tip podatka određene vrijednosti Vrijede pravila za izbor imena , prvi znak označava tip funkcije, trebali bi koristiti IMPLICIT NONE naredbu Zato treba deklarirati tip funkcije npr. REAL FUNCTION prosjek(x,y,z) Tip funkcije mora biti isti kao i u gl.programu, negdje u programu (obično zadnja naredba prije END) mora se dodijeliti vrijednost funkciji
FUNCTION Zato treba deklarirati tip funkcije npr. REAL FUNCTION prosjek(x,y,z) Tip funkcije mora biti isti kao i u gl.programu, negdje u programu (obično zadnja naredba prije END) mora se dodijeliti vrijednost funkciji
PRIMJER FUNCTION potprogram koji izračunava prosjek tri realna broja: REAL FUNCTION prosjek(x,y,z) IMPLICIT NONE REAL :: x,y,z prosjek=(x+y+z)/3.0 END FUNCTION prosjek Glavni program koristi funkciju prosjek: PROGRAM primjer IMPLICIT NONE REAL :: vr1,vr2,vr3,prosjek PRINT*,’Unesi 3 realne vrijednosti’ READ*,vr1,vr2,vr3 PRINT*,’Prosjek iznosi: ’ PRINT*,prosjek(vr1,vr2,vr3) END PROGRAM primjer
NEKA PRAVILA • Function argumenti u pozivnom modulu moraju odgovarati po tipu,broju i poretku dummy varijabli u deklaraciji funkcije • Vrijednost vraćena pozivnom modulu spremljena je u ime funkcije • Poput SUBROUTINE FUNCTION potprogram može biti deklariran u istoj datoteci glavnog programa ili kao odvojena datoteka • Imena varijabli su lokalna • Tip funkcije se deklarira eksplicitno i isti mora biti u gl.p.
Funkciji mogu pristupiti i drugi programski moduli • VAŽNO: Ne pokušavaj mijenjati vrijednosti dummy varijabli unutar funkcije. Rezultat je nepredvidiv (promijenjena vrijednost može ali ne mora vraćati pozivnom modulu očekivanu vrijednost za kompajliranje. Ako želite mijenjati vrijednosti treba koristiti SUBROUTINE)
ATRIBUTI • INTENT(IN) atribut dodijeljen dummy varijablama x,y,z u funkcijskom potprogramu informira procesor da su ovo dummy varijable i zato modul neće dopustiti promjenu vrijednosti • EXTERNAL atribut dodijeljen imenu funkcije u glavnom modulu označava da je to ime vanjske funkcije a ne varijable • Atributi nisu obavezni ali njihovo korištenje se preporučuje radi reduciranja grešaka
PRIMJER PROGRAM primjer IMPLICIT NONE REAL vr1,vr2,vr3 REAL,EXTERNAL :: prosjek PRINT*,’Unesi 3 broja’ READ*,vr1,vr2,vr3 PRINT*,’Prosjek iznosi: ’ PRINT*,prosjek(vr1,vr2,vr3) END PROGRAM primjer REAL FUNCTION prosjek(x,y,z) IMPLICIT NONE REAL,INTENT(IN) :: x,y,z prosjek=(x+y+z)/3.0 END FUNCTION prosjek
...... a=3.2 b=4.7 CALL zbroj(a,b,c) ...... SUBROUTINE zbroj(x,y,z) IMPLICIT NONE REAL,INTENT(IN) :: x,y REAL,INTENT(OUT) :: z z=x+y END SUBROUTINE zbroj
Specificira namjeru korištenja dummy varijabli unutar procedure. Primjer pokazuje alternativno korištenje atributa INTENT(IN) i INTENT(OUT) • Ako koristimo transfer informacije u oba smjera koristimo atribut INTENT(INOUT)
Interne procedure • SUBROUTINE i FUNCTION su integralni dijelovi Fortran 90, kao moduli koji omogućuju pozive svih drugih modula u program. • Fortran 90 posjeduje varijante potprograma i funkcija koje su moguće samo unutar modula gdje su deklarirani. To su interne procedure
Intrinsic functions Preko 100 Fortran funkcija (trigonometrijske f.-radijani) • Možete pisati i vlastite funkcije
• Često koristimo vrijednost ( konverzija kuta u radijane i obrnuto . Kod konverzije postavljamo činjenicu da je : • tan(/4) = 1 • Dakle za vrijednost uključena je kodna forma: • pi=4.0*ATAN(1.0) • Nakon deklaracije pi je realan.