SVEU Č ILIŠTE U SPLITU, GRA Đ EVINSKO-ARHITEKTONSKI FAKULTET UNIVERSITY OF SPLIT, FACULTY OF CIVIL ENGINEERING AND ARCHITECTURE MB 3149463 Matice hrvatske 15; 21000 Split Split - HRVATSKA; fax: + 385 (0)21 465 117; tel: + 385 (0)21 303 333
KRATKE OSNOVE RADA S PROGRAMSKIM JEZIKOM
FORTRAN
Interni materijali Alen Harapin, ožujak 2009.
Sveu č u Splitu, Gra đ fakultet čilište đevinsko-arhitektonski Katedra za Betonske konstrukcije i Mostove
Ovi radni materijali nastali su kao pomo ć pri jednom kratkom tečaju (radionici) za programski jezik FORTRAN. Ovi materijali nemaju pretenziju davanja uvida u potpune mogu ćnosti programskog jezika FORTRAN. U tom smislu čitatelji se upućuju u dokumentaciju: Compaq Developer Studia, kao i niz knjiga koje postoje o ovom programskom jeziku. Izrađeni primjeri i objašnjenja vrijede za Compaq Developer Studio, ver 6.6.0. Neki primjeri koji su ovdje navedeni mogu će neće raditi pod nekim drugim okruženjem. Također, u materijalima nisu spomenute neke mogućnosti koje posjeduje moderni FORTRAN. Kolege koje se misle ozbiljnije posvetiti programiranju svakako se upu ćuje na izučavanje modernih programskih rješenja. Također, u ovim materijalima navedeno je niz programskih rješenja koji su „zastarjeli“ i više se ne koriste. Ovo je isklju čivo iz razloga što Građevinski fakultet u Splitu ima dugu tradiciju programiranja u ovom jeziku s počecima sa standardom FORTRAN IV na računalima PDP i VAX. Dio kôdova s ovih računala još je prisutan u praksi, efikasan je i nema većih problema pri njihovom kompajliranju i linkanju. Autor
str. 2
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č u Splitu, Gra đ fakultet čilište đevinsko-arhitektonski Katedra za Betonske konstrukcije i Mostove
Ovi radni materijali nastali su kao pomo ć pri jednom kratkom tečaju (radionici) za programski jezik FORTRAN. Ovi materijali nemaju pretenziju davanja uvida u potpune mogu ćnosti programskog jezika FORTRAN. U tom smislu čitatelji se upućuju u dokumentaciju: Compaq Developer Studia, kao i niz knjiga koje postoje o ovom programskom jeziku. Izrađeni primjeri i objašnjenja vrijede za Compaq Developer Studio, ver 6.6.0. Neki primjeri koji su ovdje navedeni mogu će neće raditi pod nekim drugim okruženjem. Također, u materijalima nisu spomenute neke mogućnosti koje posjeduje moderni FORTRAN. Kolege koje se misle ozbiljnije posvetiti programiranju svakako se upu ćuje na izučavanje modernih programskih rješenja. Također, u ovim materijalima navedeno je niz programskih rješenja koji su „zastarjeli“ i više se ne koriste. Ovo je isklju čivo iz razloga što Građevinski fakultet u Splitu ima dugu tradiciju programiranja u ovom jeziku s počecima sa standardom FORTRAN IV na računalima PDP i VAX. Dio kôdova s ovih računala još je prisutan u praksi, efikasan je i nema većih problema pri njihovom kompajliranju i linkanju. Autor
str. 2
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č u Splitu, Gra đ fakultet čilište đevinsko-arhitektonski Katedra za Betonske konstrukcije i Mostove
Formatirani ispis podataka i rad s datotekama................................................................................25 6.1 Općenito ............................................................ ........................................................................................... ............................................................ ............................................................. ......................................................25 ......................25 6.2 Naredba FORMAT................................................ FORMAT............................................................................... ............................................................. .............................................................. ..................................................26 ..................26 6.2.1 Ispis cijelih brojeva ...................................................... ..................................................................................... ............................................................. ............................................................. ................................... 26 6.2.2 Ispis logičkih varijabli.................................................. varijabli............................................................................... ........................................................... ........................................................... .................................... .......27 27 6.2.3 Ispis niza znakova.......................... znakova ......................................................... ............................................................. ........................................................... ............................................................ ................................... 27 6.2.4 Ispis realnih varijabli......................... varijabli ..................................................... ......................................................... ............................................................ .............................................................. ................................... 27 6.2.5 Posebni znakovi pri formatiranju ispisa ................................................... ............................................................................. ............................................................ ........................................ ......28 28 6.2.6 Ostale korisne napomene pri formatiranju ispisa ........................................................ ..................................................................................... ..............................................28 .................28
Kratke osnove rada s programskim jezikom FORTRAN
str. 3
Sveu č u Splitu, Gra đ fakultet čilište đevinsko-arhitektonski Katedra za Betonske konstrukcije i Mostove
6.3 6.4 6.5 6.6
7.
Naredbe OPEN i CLOSE ........................................................... ........................................................................................... ................................................................ ..........................................................28 ..........................28 Naredbe WRITE i READ ........................................................ ....................................................................................... ................................................................ ............................................................. ..............................29 ..29 Ostale naredbe za upis i ispis ..................................................... .................................................................................. ........................................................... ............................................................30 ..............................30 Pisanje u niz znakova i čitanje iz niza znakova...................................... znakova.................................................................... ............................................................ ................................................31 ..................31
Funkcije i Subrutine............................................................................................................................32 7.1 7.2 7.3 7.4
PRIMJER – Programsko rješenje: Ravninski štapni sustavi...........................................................38 8.1 Teorijske postavke ......................................................... ...................................................................................... ............................................................ ............................................................... ..........................................38 ..........38 8.1.1 Jednadžba ravnoteže.......................................... ravnoteže....................................................................... ............................................................. ................................................................ ..........................................38 ..........38 8.1.2 Diskretizacija sustava i bazne funkcije................................................. funkcije............................................................................. ........................................................ ..........................................38 ..............38 8.1.3 Formulacija principom virtualnog rada..................................................... rada................................................................................. ............................................................ ......................................39 ......39 8.1.4 Otpuštanje veza na rubovima elemenata ........................................................ ...................................................................................... ..........................................................39 ............................39 8.1.5 Ravnoteža globalnog sustava............................................................. sustava.......................................................................................... ............................................................. ..........................................39 ..........39 8.2 Kreiranje novog projekta ........................................................... ........................................................................................ ............................................................. ............................................................ ..............................40 ..40 8.3 Tok programa................................................ programa.............................................................................. ............................................................. ............................................................... ..........................................................41 ..........................41 8.4 Osnovne (globalne) varijable............................................ varijable......................................................................... .......................................................... ............................................................. ..........................................42 ..........42 8.5 Učitavanje ulaznih podataka iz datoteke – Subroutine INPUT() ............................................................ ..........................................................................................44 ..............................44
str. 4
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
1. UVOD 1.1
O FORTRAN-u
Fortran (FORmula TRANslation) je najstariji tzv. viši programski jezik. Sintaksa je vremenom mijenjana i propisana je nizom standarda, koji su donošeni u razmacima od 10 ili više godina. Poznati standardi su: fortran II (1958.) fortran IV (1961.), fortran66 (1966.), fortran77 (1977.), fortran90 (1990.), fortran95 (1995.), … Velika razlika u sintaksi nastaje izme đu Fortrana77 i Fortrana90. Različiti standardi se obi čno razlikuju prema nastavku (eksenziji) imena datoteke, pa tako nastavke ’.f90’ imaju datoteke koje sadrže izvorni kod u Fortranu-90, a nastavke ’.for’ ili ’.f’ imaju datoteke koje sadrže izvorni kod u Fortranu-77 ili ranijim verzijama. Kako je naglašeno, osnovna razlika Fortranskih standarda je u sintaksi zapisa, pa tako Fortran 77 (i niže) koristi fiksni format zapisa programa sa sljede ćim ograničenjima: − U jednoj liniji smije biti samo jedna naredba; − Mjesta 1-5 u retku se koriste za labele; − Popunjeno 6. mjesto indicira da je linija nastavak fortranske naredbe iz prethodne linije; − Mjesta 7-72 rezervirana za pisanje fortranskih naredbi; − Preko 72 mjesta je zabranjeno pisati. Razlika od Fortrana 90 prema novijim verzijama je sljede ća: − Mjesta 1-6 nisu rezervirana; − Naredba u liniji može biti vrlo duga čka; − Nastavljanje naredbe u sljede ći red vrši se s ampersand-om (&) na kraju; − Na istoj liniji može biti više naredbi, a me đusobno su razdvojene s to čka-zarezom (;); − Posjeduje naredbe za rad s vektorima i matricama; − Dinamičko rezerviranje memorije (velike matrice i vektori). PRIMJER: FORTRAN77 c234567890123456789012345678901234567890 c komentar c234567890123456789012345678901234567890 Program hello write (*,*) ’Pozdrav i mir cijelom & svijetu’ goto 100 print *,’ovo nece biti ispisano’ 100 continue end program
PRIMJER: FORTRAN90 Program hello write (*,*) ’Pozdrav i mir cijelom & svijetu’ write (*,*) ’svim bicima’ ; write (*,*) ’u svemiru i okolici !’ End program
Fortran 90 prepoznaje kôd pisan u Fortranu 77 ili ranijim verzijama i uredno ih kompajlira i linka. Sitne nekompatibilne razlike kompajler prijavi i lako ih je ispraviti i doraditi. Obrnuti slu čaj ne vrijedi.
Kratke osnove rada s programskim jezikom FORTRAN
str. 5
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
2. Rad u integriranom okruženju: Compaq Developer Studio (ver. 6.6.0) 2.1
Kreiranje radnog okruženja
Developer studio pokreće se kao i svaka druga Windows aplikacija. Nakon pokretanja pojavljuje se inicijalni ekran. Svaka aplikacija koja se razvija putem ovoga okruženja mora biti integrirana u Radno okruženje (Workspace). Stvaranje novog okruženja vrši se izborom sa Menija: File New
Nakon pokretanja ove opcije pojavljuje se novi prozor u kojem je mogu će odabrati tip aplikacije koju mislimo razvijati. Prozor s imenom budu ćeg projekta Lokacija budućeg projekta NAPOMENA: Prilikom upisa imena projekta automatski se stvara poddirektorij s istim imenom
Prozor s izborom tipa aplikacije Tip akplikacije može biti: Konzolna aplikacija (standardni DOS program), Windows aplikacija, Stati čka biblioteka, Dinami čka biblioteka (Dynamic Link Library) i sl. Upisivanjem imena projekta (npr. Program1) i izbora lokacije gdje će se taj program nalaziti kreiramo novo Radni okruženje (Workspace).
Radno okruženje je još uvijek prazno. Sad je potrebno kreirati datoteku s izvornim kodom programa.
str. 6
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
2.2
Kreiranje datoteke s izvornim kodom programa
Kreiranje datoteke s izvornim kodom programa vrši se tako đer preko Menija, opcijama: File New Tekući projekt
NAPOMENA: Ako je check-irano: „Add to project“, datoteka se automatski dodaje projektu
Ime datoteke
NAPOMENA: Ako je izabrano: „Fortran fixed format source file“, automatske se dodaje nastavak: „.for“.
Prozor s izborom tipa datoteke Nakon izbora ove opcije, datoteka „Prog1.for“ se pojavljuje u središnjem dijelu ekrana, a s lijeve strane je vidljivo da je i dodana projektu.
Središnji dio ekrana – radni prozor – s datotekom „Prog1.for“ u kojoj se ispisuje izvorni kôd programa. NAPOMENA: Datoteke s nastavkom „.for“ ili „.f“ spremne su za fortranski fiksni zapis. To je vidljivo i po zelenoj oznaci u 6. stupcu – stupcu za nastavak.
Statusni prozor u kojem se nalaze podaci o projektu.
Prozor za poruke o greškama prilikom kompajliranja i linkanja. NAPOMENA: Prilikom kodiranja (pisanja izvornog koda) dok nije potreban, može se sakriti klikom na tipku „Esc“.
Ako je datoteka s izvornim kôdom ranije kreirana, mogu će ju je pridružiti programu desnim klikom miša dok se kursor nalazi u statusnom prozoru nad labelom „Source files“. Tada se otvara dodatni prozor u kojem je potrebno odabrati opciju: „Add files to folder…“. Odabirom ove opcije otvara se standardni prozor za izbor datoteke. Dobra praksa je sve datoteke s izvornim kôdom držati u istom direktoriju (folder-u).
Kratke osnove rada s programskim jezikom FORTRAN
str. 7
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
2.3
Kompajliranje, linkanje i izvršavanje programa
Kompajliranje (eng. Compile – prevesti), kako sama rije č kaže, predstavlja prevo đenje izvornog kôda (koji je napisan ljudima kolikotoliko razumljivim jezikom) na jezik ra čunala – strojni jezik. Linkanje (eng. Link – povezati) predstavlja povezivanje svih (kompajliranih) programskih modula (razli čitih datoteka) u jedan jedinstven program. Naime, sam projekt se može sastojati, kako će kasnije biti pokazano, od više datoteka s izvornim kôdom. Svaku je moguće kompajlirati zasebno, a linkanjem se sve one povezuju u jedinstvenu cjelinu – Izvršni program (nastavak .exe). Kompajliranje svake pojedine datoteke s izvornim kôdom može se izvesti odabirom opcije: Build Compile (Ctrl+F7). Jednostavniji način za formiranje izvršne (exe) datoteke, je izbor opcije: Build Build (F7).
Ako kompajler i linker nisu našli (sintakti čke) greške u izvornom kodu, što će biti prikazano u prozoru za poruke, program je spreman za startanje. Izvršavanje programa se provodi opcijom: Build Execute (Ctrl+F5). Rezultat izvršenja programa biti će prikazan u posebnom (DOS) prozoru.
Ako se izabere opcija: Build Execute (Ctrl+F5), prije kompajliranja i linkanja, program će se prvo prekompajlirati i linkati, a zatim i izvršiti.
2.4
Upozorenja i greške
Nakon kompajliranja i linkanja u donjem prozoru se pojavljuje izvještaj.Ako je sve u redu, tada izvještaj glasi: Program1.exe - 0 error(s), 0 warning(s)
Ako su prilikom kompajliranja ili linkanja prona đene greške, tada se u istom prozoru pojavljuje poruka o greškama. Kompajlerske greške su najčešće greške sintakse. Dvostrukim klikom na izvještaj o grešci vra ćamo se u glavni prozor, a s lijeve strane prozora se pojavljuje mala plava strelica koja upu ćuje na liniju u kojoj se greška nalazi. str. 8
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
Npr. u kôdu u nastavku greškom je u četvrtom retku umjesto nule ( DO I=1,100 ) upisano veliko slovo O ( DO I=1.10O ). PROGRAM ZBRAJANJE INTEGER ZBROJ ZBROJ=0 DO I=1,10O ZBROJ=ZBROJ+I ENDDO PRINT *,' Zbroj : ',ZBROJ END
Prilikom kompajliranja, kompajler javlja poruku o grešci. Dvostruki klik na tu poruku vra ća nas u glavni prozor to čno na četvrtu liniju.
No pogledajmo sljede ći primjer. U kôdu u nastavku, greškom je u četvrtom retku umjesto zareza ( DO I=1,100 ) upisana to čka (DO I=1.100 ). PROGRAM ZBRAJANJE INTEGER ZBROJ ZBROJ=0 DO I=1.100 ZBROJ=ZBROJ+I ENDDO PRINT *,' Zbroj : ',ZBROJ END
Greška koju kompajler generira ukazuje na 6. redak, a ne na redak gdje mi prividno smatramo da se greška dogodila. U stvarnosti kompajler, zbog to čke, nije registrirao da se pojavila ( DO) naredba, te se buni na pojavu (ENDDO) naredbe bez prethodne ( DO) ili (DO WHILE). Kod izvještaja kompajliranja/linkanja potrebno je strogo razlikovati greške (errors) od upozorenja (warnings). Kada se pojave greške kompajler/linker neće izraditi izvršnu (.exe) verziju i program se ne će moći startati. Potrebno je tada ispraviti sve greške i ponovo prekompajlirati/linkati progam. Upozorenje (warning) samo napominje programeru da je nešto sumnjivo u programu, ali će izraditi (.exe) verziju koja s može startati. Najčešće i upozorenja predstavljaju nelogičnosti u programu i potrebno im je posvetiti dužnu pažnju.
Kratke osnove rada s programskim jezikom FORTRAN
str. 9
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
2.5
Kompatibilnost
Izvršni (.exe) program nalazi se u podfolderu: Debug, foldera kojeg smo kreirali kao folder projekta. Taj izvršni program mogu će je kopirati na CD, Memory stick ili sli čno i prebaciti na drugo ra čunalo koje radi na istoj platformi (DOS-DOS, Windows XP-Windows XP…). Nije moguće (bar ne u svim slu čajevima) prijenos izvršnog programa izme đu platformi (npr. izvršni program kreiran u Windows XP okružju prebaciti na klaster ra čunalo koje radi pod Linux-om). Međutim, kako je ranije naglašeno, mogu će je prenijeti izvorni kôd programa te ga ponovno prekompajlirati. Podrazumijeva se, naravno, da postoji instaliran kompajler/linker na tom drugom ra čunalu.
2.6
Release i debug mod
Izvršni (.exe) program napravljen je u tzv. Debug modu. Ovaj mod omogu ćava olakšano debugiranje (eng.: debugging) tj. ispravljanje pogrešaka u kôdu. Kada je program u potpunosti gotov tada je mogu će prijeći na tzv. Release mod. Ovaj mod isključuje dodatne informacije u izvršnoj verziji (.exe) te stoga ima znatno manje bytova, tj. ostaje više memorije za neposredni rad. Prijelaz iz jednog u drugi mod vrši se odabirom opcija: Build Set Active Configuration… Ne preporuča se prijelaz u Release mod sve dok se program u potpunosti „o čisti“ od svih grešaka (bug-ova). Kod manjih programa ovaj prijelaz nije ni potreban. Kôd u nastavku pokazuje primjer standardne greške koju kompajler ne dojavljuje: drugi korijen iz negativnog broja. PROGRAM KORIJEN REAL A, B A=-10. B=SQRT(A) PRINT *,' Korijen iz: ',A,' je : ',B END
Kompajler/linker će uredno napraviti izvršni file, no prilikom izvršenja programa dolazi do greške (vidjeti sliku). Iako naizgled nije bitna razlika u izvještaju, razlika jest bitna. U oba slu čaja javlja se tip greške: sqrt: DOMAIN Error (Kvadratni korijen – Greška u domeni), u prvom slu čaju kompajler nam to čno javlja liniju gdje je ta greška nastala, dok u drugom slu čaju toga nemamo.
str. 10
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
Program u Debug modu:
2.7
Program u Release modu:
Traženje grešaka (debugiranje)
Ovdje pod pojmom traženja grešaka ne mislimo na greške koje prijavljuje kompajler (iako ponekad i takve greške treba debugirati), već na suštinske greške koje nastaju tokom izvršenja programa i pri kojima program uredno radi ali daje krive rezultate. U nastavku će se spomenuti samo tehnika traženja grešaka dok će više rije či o tome biti kroz primjer. Kada je program kompajliran/linkan u Debug modu (i samo u Debug modu) tada je mogu će program izvršavati liniju po liniju. Ovo se postiže odabirom opcije: Build Start Debug Go (F5). Tehnike upravljanja procesom Debugiranja sortirane su u tablici s kratkim objašnjenjem ikone. Ikona
Hint
Namjena
Restart
Prekida program, ponovno kompajlira i linka i ponovno pokreće program
Stop debugging
Prestanak debugiranja – prekida program i vraća se u glavni prozor s kodom
Run to Cursor
Ako je trenutna linija izvršenja programa poziv subrutine ili funkcije program ulazi u nju i zaustavlja se na prvoj izvršnoj naredbi unutar subrutine/funkcije. Ako je trenutna linija izvršenja programa poziv subrutine ili funkcije program je izvršava i zaustavlja se na sljedećoj liniji nakon poziva. Ako je trenutna linija izvršenja programa unutar subrutine ili funkcije program je izvršava do kraja, izlazi iz nje i zaustavlja se na sljedećoj liniji nakon poziva. Program se izvršava sve do trenutne pozicije kursora. U slučaju da naiđe na Prekidnu točku (Brek Point) zaustavlja se na njoj.
Execute Program
Startanje programa. Ovim se starta program u izvršnom modu.
Step Into Step Over Step Out
Go Remove All Breakpoints Insert/Remove Breakpoints
Startanje programa. Ovim se starta program u debug modu. Program se izvršava do prve Prekidne točke (Brek Point). Ako na nju ne naiđe onda se izvršava do kraja (isti efekt kao i opcije: Execute Program). Uklanjanje svih Prekidnih Točaka (Brekpoints). Sve točke se brišu u svim datotekama koji pripadaju trenutno aktivnom projektu. Postavljanje ili uklanjanje Prekidnih Točaka (Brekpoints). Točka se postavlja u liniji na mjestu kursora. Puni crveni krug u sivoj traci skroz lijevo u glavnom prozoru ukazuje da je u toj liniji postavljena prekidna točka . Ako u toj liniji postoji već Breakpoint tada se uklanja. Breakpoint se može postaviti samo na izvršnim linijima, ne može npr. na liniji komentara.
Nakon postavljanja Prekidnih to čaka i startanja programa naredbom Go, Prozor u dnu ekrana se mijenja. U lijevom dijelu otvara se prozor sa svim varijablama, a u desnom tzv. Watch prozor u kojem se mogu pratiti željene varijable. Klikom u Watch prozor i upisom imena pojedine varijable mogu će je dobiti njenu trenutnu vrijednost.
Prozor u kojem su nabrojane sve varijable
Kratke osnove rada s programskim jezikom FORTRAN
Watch prozor
str. 11
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
3. Tipovi podataka u FORTRANU 3.1
Pohrana podataka u računalu
Podaci se u računalu spremaju na memorijske lokacije u vidu bitova. Bit (eng. bit – komadi ć, mali dio; oznaka: b) je najmanja jedinica za pohranu podataka i može imati samo dvije vrijednosti: aktivno ili neaktivno, što se obi čno označava brojevima 0 i 1. Osam bitova sačinjavaju 1 bajt (byte, oznaka: B). Ve će jedinice su: − Kilo bajt (Kilo Byte) 1 KB = 1024 byte (2 10 B) − Mega bajt (Mega Byte) 1 MB = 1024 KB = 1 048 576 B (2 20 B) − Giga bajt (Giga Byte) 1 GB = 1024 MB = 1 048 576 KB = 1 073 741 824 B (2 30 B) − Itd.; Računalno zapisanom podatku obi čno se može pristupiti samo na nivou bajta (by), a ne na nivou bita. Dakle, prilikom pisanja ili čitanja podataka može se zapisati ili pro čitati samo puni bajt ili više njih (2, 4, 8…). Kada treba izdvojiti vrijednost nekog bita, onda se to radi tako da se izdvaja bit unutar skupine bytova koja se nalazi na toj i toj memorijskoj adresi u ra čunalu. U Fortranskom programu obi čno se definiraju imena varijabli, funkcija, procedura, programa… Imena mogu sadržavati: − Slova a-z, A-Z. Nema razlike između velikih i malih slova; − podvučenu crtu (underscore): _; − brojke: 0-9. Imena moraju po četi slovom (a-z, A-Z). Dužina imena je obi čno ograničena na 31 znak (ograničenja kompajlera). Ime varijable ne smije biti klju čna riječ, dakle ime ne smije biti: DO, IF, PROGRAM i sl. Ime varijable ne smije biti niti bibliote čna funkcija (npr. SIN). Na računalu nije moguće prikazati brojeve (cijele, realne) na na čin kako ih se u matematici definira. Realni brojevi se spremaju s ograničenom točnošću. Niti sve cijele brojeve nije mogu će prikazati, jer jako veliki cijeli brojevi tako đer traže veliki memorijski prostor. Stoga na računalima postoji i ograni čenje na veličinu brojeva.
3.2
Osnovni tipovi podataka
Osnovni tipovi varijabli u FORTRANU su, kao uostalom i u ve ćini drugih programskih jezika: − Karakterna varijabla (CHARACTER); − Cjelobrojna varijabla – cijeli broj (INTEGER); − Logička varijabla (LOGICAL); − Realna varijabla – realni broj (REAL); − Kompleksna varijabla – kompleksni broj (COMPLEX);
3.2.1
Tip CHARACTER
Varijabla tipa CHARACTER zauzima 1 byte memorije i obi čno služi za prikaz znakova (slova, brojki, specijalnih znakova i sl.). Varijabla CHARACTER vezana je za tzv. ASCII cod. ASCII: American Standard Code for Information Interchange tj. Ameri čki standardni znakovnik za razmjenu informacija, prvi put je objavljen 1967., a dora đen je 1986. U kasnijoj ina čici definira kodove za 33 većinom zastarjela kontrolna znaka koji djeluju na na čin ispisa teksta, te 95 znakova za ispis teksta (po čevši znakom razmaka) (33+95=128). Godine 1972. standard ISO-646 je definirao na čin prilagođavanja nacionalnim abecedama, pa je tako ina čica za hrvatsku abecedu danas poznata pod popularnim nazivom CROSCII. ASCII za kodiranje znakova koristi samo 7 bita (1. bit je kontrolni), ali se na njemu temelji i ve ćina modernih znakovnika koji imaju veći raspon znakova od engleske abecede kao što su 8-bitni CP437, CP852, Windows-1250 i Windows-1252, te 16-bitni i 32-bitni Unicode. ASCII tablica: 01234567890123456789 ------------------------------30 OO !"#$%&’()*+,-./01 50 23456789:;<=>? @ABCD 70 EFGHIJKLMNOPQRSTUVWX 90 YZ[\]ˆ_‘abcdefghijkl 110 mnopqrstuvwxyz{|}~OO
str. 12
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
Definiranje karakterne varijable vrši se naredbom CHARACTER. Pridjeljivanje znakovne vrijednosti karakternoj varijabli vrši se na način da se željeni znak stavi u jednostruke navodnike. PRIMJER: Program hello CHARACTER a a=’a’ print *,’ Varijabla a = ’,a end
Matrica karakternih varijabli predstavlja string. Važno je imati na umu da dužina pridijeljenog teksta ne prije đe broj rezerviranih znakovnih mjesta. O stringovima će biti rije či kasnije. Program hello CHARACTER a(20) ! Stari na čin deklaracije stringa CHARACTER (len=20) :: a ! Novi na čin deklaracije stringa
3.2.2
Tip INTEGER
Varijabla tipa INTEGER predstavlja cjelobrojnu varijablu. Deklaracija ove varijable je sljede ća: INTEGER*1 i ! Stari na čin INTEGER*2 i INTEGER*4 i ...... INTEGER (KIND=1):: i ! Novi na čin INTEGER (KIND=2):: j INTEGER (KIND=4):: k INTEGER (KIND=8):: l INTEGER :: m ! ako KIND nije specificiran ! onda je (naj češće) KIND = 4
Riječ KIND, tj. broj iza zvjezdice (kod starog na čina) određuje broj byte-ova koji se rezerviraju za varijablu. Ali taj broj ne može biti proizvoljan nego su mogu će vrijednosti zadane kompajlerom i hardware-om ra čunala. Maksimalni cijeli broj koji je mogu će pohraniti u računalu direktno je ovisan o broju rezerviranih bytova. Pa tako: INTEGER (KIND=1) : -128 do +127 INTEGER (KIND=2) : -32768 do +32767 INTEGER (KIND=4) : -2147483648 do +2147483647 INTEGER (KIND=8) : -9223372036854775808 do +9223372036854775807 Prvi bit u bajtu služi za prikaz predznaka (0: +; 1: -), a ostali za prikaz broja. Tako npr. Binarni Heksadecimalni Decimalni Binarni 00000000 00 0 00000000 00000000 01000001 41 65 00000000 10000000 01111111 7F 127 00000001 00000000 10000000 80 -128 01000000 00000000 10000001 81 -127 10000000 00000001 11111111 FF -1 11111111 11111111
Binarni Heksadec. Decimalni Binarni Heksadec. Decimalni Binarni Heksadec. Decimalni 0000 0 0 0101 5 5 1010 A 10 1 0110 6 6 1011 B 11 0001 1 1100 C 12 0010 2 2 0111 7 7 0011 3 3 1000 8 8 1101 D 13 0100 4 4 1001 9 9 1110 E 14 1111 F 15
01100111 = (+ ) 1⋅ 26 + 1⋅ 25 + 0 ⋅ 2 4 + 0 ⋅ 23 + 1⋅ 22 + 1⋅ 21 + 1⋅ 20 = (+ )1⋅ 64 + 1⋅ 32 + 0 ⋅ 16 + 0 ⋅ 8 + 1⋅ 4 + 1⋅ 2 + 1⋅ 1 = 103 Compaq Developer Studio podržava cjelobrojne vrijednosti (INTEGER) od 2 ili 4 byte-a. Eksplicitno napisani cijeli broj, string ili realni broj u programu zovemo konstantom.
Kratke osnove rada s programskim jezikom FORTRAN
str. 13
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
3.2.3
Tip REAL
Varijabla tipa REAL predstavlja realnu varijablu ili konstantu. Deklaracija ove varijable je sljede ća: REAL*4 a ! Stari na čin REAL*8 a ...... REAL (KIND=4):: a ! Novi na čin REAL (KIND=8):: a REAL (KIND=16):: a REAL :: m ! ako KIND nije specificiran ! onda je (naj češće) KIND = 4
Riječ KIND, tj. broj iza zvjezdice (kod starog na čina), kao i kod cjelobrojnih varijabli, odre đuje broj byte-ova koji se rezerviraju za varijablu. Taj broj, tako đer, ne može biti proizvoljan nego su mogu će vrijednosti zadane kompajlerom i hardware-om ra čunala. Preciznost (KIND=16 ) podržava samo mali broj prevoditelja, ne i Compaq Developer Studio. Stari način definiranja realne varijable s pove ćanom preciznošću (REAL*8 a ) je: DOUBLE PRECISION a Treba imati na umu da realni brojevi na ra čunalu nisu realni brojevi koji postoje u matematici. U matematici realni brojevi čine kontinuum. Za svaka dva, proizvoljno bliska, realna broja postoji realni broj koji se nalazi izme đu njih. Dapače, između njih se nalazi beskonačno mnogo realnih brojeva. Na računalu to nije tako. To je zbog toga što na ra čunalu prikazujemo realni broj s kona čnim brojem byte-ova. Tipično koristi se 4 ili 8 byte-ova. Između realnih brojeva na ra čunalu postoji razmak, a izme đu dva susjedna NEMA drugih realnih brojeva. Ovaj je razmak ujedno numeri čka greška koju činimo prikazujući neki pravi realni broj (u principu s beskonačnim brojem decimala) pomo ću konačnog broja byte-ova na ra čunalu. Stoga, numeričke operacije s realnim brojevima na ra čunalu pate od grešaka. Te greške se ponekad mogu akumulirati, i tako dovesti do velikih nepredvidivih grešaka u kona čnom rezultatu. Računalo realni broj sprema na sljede ći način: − Od ukupnog broja bitova, jedan bit (onaj najviši) se koristi za oznaku predznaka. Ako je on jednak ’1’, radi se o negativnom broju. − Jedan broj bitova se koristi za binarni prikaz eksponenta. − Ostatak služi za prikaz decimala. Broj bitova namjenjen za prikaz eksponenta i za broj decimala standardiziran je. Postoje ovi standardi: Jednostruka preciznost. Ukupno se koriste 32 bita (4 byte-a): − 1 bit - predznak − 24 bita - frakcija (decimale) (jedan bit je implicitan) – mogu se zapisati − 8 bita - eksponent (jedan bit za predznak eksponenta) Dvostruka preciznost. Ukupno se koriste 64 bita (8 byte-a): − 1 bit - predznak − 53 bita - frakcija (decimale) (jedan bit je implicitan) − 11 bita - eksponent (jedan bit za predznak eksponenta) Za označavanje ekponenta realne konstante u jednostrukoj preciznosti koristimo slovo E (npr. 1.0E-5). Za ozna čavanje ekponenta realne konstante u dvostrukoj preciznosti koristimo slovo D (npr. 1.0D+50). Operacije koje se mogu provoditi nad realnim brojevima su standardne matemati čke operacije: zbrajanje (+), množenje (*), oduzimanje (-), dijeljenje (/) i potenciranje (**). Tako đer je moguće provoditi i operacije pretvaranja: cijeli broj INT(a) i
3.2.4
realni broj a REAL(i)
Konverzija tipova varijabli
Kod operacija koje sadrže cijele i realne brojeve, cijeli brojevi se automatski konvertiraju u realne, a rezultat se automatski konvertira u tip podatka koji stoji na lijevoj strani znaka jednakosti. U izrazima koji sadrže samo cijele brojeve i rezultat je cijeli broj koji se potom pretvara u vrst podatka na lijevoj strani znaka jednakosti. Stoga u sljedećem primjeru dobivamo nulu: na desnoj strani izraz sadrži samo cijele brojeve i rezultat je cijeli broj (tj.
str. 14
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
nula) koja se potom konvertira u realni broj na lijevoj strani. Ako se u izraz na desnoj strani umiješa realna konstanta, onda se cijeli brojevi prvo pretvaraju u realne, a tek onda se izvode numeri čke operacije. PROGRAM konverzija REAL a a = 1/(1 + 1) PRINT *,a a = 1.0/(1 + 1) PRINT *,a END PROGRAM
3.2.5
! ispisuje: 0.0000000E+00 ! ispisuje: 0.5000000
Tip LOGICAL
Logički podaci imaju dvije vrijednosti: istinu ili laž (true or false). Deklaracija logi čke varijable vrši se naredbom: LOGICAL a,b
Operacije s logičkim tipovima podataka su: .NOT. a pretvara istinu u laž i obrnuto a .AND. b i (and) – istinito ako su i a i b istiniti a .OR. b ili (or) – istinito ako su a ili b istiniti a .XOR. b ekskluzivni ili – istina ako je samo jedan istinit a. EQV. b istinito ako su oba ista
3.2.6
Tip COMPLEX
Fortran je jedan od rijetkih jezika koji ima kompleksni broj kao standardnu varijablu (ostali imaju kao eksterne funkcije). Kompleksni brojevi na računalu se prikazuju par realnih brojeva koji se posebno tretiraju u numeri čkim operacijama. Pri tome realni brojevi mogu biti jednostruke ili dvostruke ili preciznosti. COMPLEX (KIND=4) :: c,d,e c = (1.0,-5.3) d = CMPLX(-2.0) ! (-2.0,0.0) e = CMPLX(0.0,1.0) ! (0.0,1.0) d = e*d ! (0.0,-2.0) PRINT *,d
Iz kompleksnog broja možemo izdvojiti realni dio i imaginarni dio s funkcijama REAL i AIMAG, a konjugirani kompleksni broj dobiva se funkcijom CONJG. COMPLEX (KIND=4) :: c REAL (KIND=4) :: a,b c = (1.0,-5.3) a = REAL(c) ; PRINT *,a b = AIMAG(c); PRINT *,b d = CONJG(c)
3.2.7
! 1.0 ! -5.3
Nepromjenjive konstante
Na početku programa moguće je zadati posebnu vrstu podataka koji će za cijelo vrijeme izvo đenja programa ostati konstante. Ovi konstantni podaci se zadaju kroz naredbu PARAMETER. Pokušaj promijene vrijednost parametra prevodilac će javiti kao grešku. INTEGER, PARAMETER :: single = KIND(1E0) INTEGER, PARAMETER :: double = KIND(1D0) REAL(single), PARAMETER :: spi = 3.1415927 REAL(double), PARAMETER :: dpi = 3.141592653589793 REAL(double), PARAMETER :: dpi2 = 0.5*dpi CHARACTERS(LEN=4), PARAMETER :: ime =’Pero’
Kratke osnove rada s programskim jezikom FORTRAN
str. 15
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
3.3
Izvedeni (složeni) tipovi podataka
Složeni tipovi podataka izvode se iz osnovnih tipova podataka. Postoje dva na čina definiranja složenih tipova podataka: preko naredbe STRUCTURE – END STRUCTURE i preko naredbe TYPE – END TYPE. Složeni tipovi podataka služe da bi se svi podaci o jednom objektu držali na jednom mjestu. Tako npr. možemo promatrati položaj nekog čvora u prostoru koji je odre đen s njegove tri kartezijeve koordinate. Pri tome možemo definirati tri polja koji čuvaju podatke o koordinatama ili jedno dvodimenzionalno polje. Npr. REAL COORD_X(Npoin), COORD_Y(Npoin), COORD_Z(Npoin) REAL COORDS(Npoin,3)
Umjesto ovog pristupa možemo koristiti složeni tip podataka, tzv. strukturu ili objekt: TYPE Koordinate REAL x,y,z END TYPE Koordinate TYPE(Koordinate) :: v1,v2 v1%x = 1.0 v1%y = 1.0 v1%z = 1.0 v2 = Koordinate(-1.0,0.0,5.0) PRINT *,v1 ! 1.0 1.0 1.0 PRINT *,v2 ! -1.0 0.0 5.0
U oba slučaja rezultat je identi čan. Izvedeni tipovi podataka mogu se gnijezditi jedan u drugog, pa je tako mogu će definirati npr. strukturu trokut koja sadrži strukturu koordinate: PROGRAM Linija STRUCTURE /Koordinate/ ! definira strukturu koordinate REAL x,y,z END STRUCTURE STRUCTURE /Linija/ ! definira strukturu trokut RECORD /Koordinate/ Cvor(2) ! koja u sebi sadrži strukturu Koordinate END STRUCTURE RECORD /Linija/ L1 L1.Cvor(1).x = 1.0 ! pridjeljivanje pojedina čne vrijednosti L1.Cvor(1).y = 0.0 L1.Cvor(1).z = 2.0 L1.Cvor(2) = Koordinate (4.0,5.0,3.0) PRINT *,' Linija od:',L1.Cvor(1),' do: ',L1.Cvor(2) END PROGRAM
3.4
Vektori i Matrice (nizovi podataka)
3.4.1
Općenito
Nizovi podataka, tj. Vektori (jednodimenzionalna polja) i Matrice (arrays – višedimenzionalna polja) deklariraju se ako da se nakon tipa i imena navede njihova dimenzionalnost. Npr. sljede ći dio koda rezervira 120 mjesta za spremanje cjelobrojnih varijabli, 120×130 mjesta za spremanje realnih varijabli jednostruke preciznosti i 240 mjesta za spremanje realnih varijabli dvostruke preciznosti. INTEGER a(120) REAL*4 b(120,130) REAL*8 c(240)
U starijim Fortran programima mogu će je naći funkciju DIMENSION, koja postiže isti u činak. U sljede ćem primjeru naredbom DIMENSION biti će rezervirano 120 mjesta, ali za spremanje realnih varijabli jednostruke preciznosti (Vidi dalje dio: Konvencija o imenima varijabli). Ako je zadana naredba: IMPLICIT NONE, tada će kompajler dojaviti poruku o grešci. DIMENSION a(120)
Prema novoj konvenciji pisanja Fortran programa tako đer se pri deklariranju koristi naredba DIMENSION. Sljede ća sintaksa vrijedi samo za Fortran 90 i više verzije INTEGER, PARAMETER :: n=3 REAL, DIMENSION(n,n) :: a a = 0.0 ! svi a(i,j) = 0.0 str. 16
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
a a a a a
= = = = =
a + 1 2*a SQRT(a) SIN(a) a*a
! ! ! ! !
svi a(i,j) = 1.0 svi a(i,j) = 2.0 Vadi korijen iz svih elemenata Izracunava sinus iz svih elemenata kvadrira svaki element
Dakle kada se navede samo ime niza (vektora/matrice) umeri čke operacije primjenjuju se svakom pojedinom članu niza, a rezultat se sprema u niz na lijevoj strani znaka jednakosti. U Fortranu 77 bilo je potrebno koristiti DO-petlje da bi se postigao isti rezultat. U Fortranu matrica se u memoriji ra čunala sprema po stupcima tj. po prvom indeksu. REAL, DIMENSION(3,3) :: a
U memoriju se sprema: a(1,1), a(2,1), a(3,1), a(1,2), a(2,2)…. a(3,3) U strukturi matrice ne postoji poseban podatak koji govori o obliku matrice. Ako se matrica koristi kao jedan od argumenata u pozivu nekoj funkciji ili potprogramu, onda je potrebno dodatno navesti i dimenziju matrice, odnosno njen oblik. Npr. ako je argument matrica 3x3, funkcija (potprogram) ne zna da li je to 9x1, 3x3 ili 1x9 matrica
3.4.2
Agregatne operacije
Agregatna operacija = operacija na nizu podataka koja kao rezultat ima jedan broj. Primjer: REAL, REAL, REAL, PRINT PRINT PRINT PRINT PRINT PRINT
3.4.3
DIMENSION(3) :: a = (/ (REAL(i), i=1,3) /) DIMENSION(3) :: b = (/ (i**2 , i=1,3) /) DIMENSION(6) :: c = (/ ((i-2)**2,i=1,6) /) *,’Broj elemenata = ’,SIZE(a) ! 3 *,’Najveci element = ’,MAXVAL(b) *,’Najmanji element = ’,MINVAL(c) *,’Suma elemenata = ’,SUM(a) *,’Produkt elemenata = ’,PRODUCT(b) *,’Skalarni produkt = ’,DOT_PRODUCT(a,b)
! ! ! ! !
9.0 0.0 6.0 36.0 36.0
Matrični račun
Većina kompajlera sadrži i funkcije za operacije s matricama. Pri tome valja biti oprezan (prou čiti help) kako koristiti pojedine funkcije. Funkcija MATMUL množi matricu s matricom u matemati čkom smislu, za razliku od operacije množenja (*) koja množi element s elementom. Funkcija TRANSPOSE kao rezultat ima transponiranu matricu. REAL :: fi = 0.25*3.1415927 REAL, DIMENSION(2) :: a = (/ 1.0, 0.0 /) REAL, DIMENSION(2) :: b REAL, DIMENSION(2,2) :: r r(1,1:2) = (/ COS(fi), SIN(fi) /) r(2,1:2) = (/ -SIN(fi), COS(fi) /) PRINT *,’vektor a = ’,a b = MATMUL(r,a) ! Rotacija za kut pi/4 PRINT *,’vektor R*a = ’,b b = MATMUL(r,b) ! Jos jedna rotacija PRINT *,’vektor R*b = ’,b PRINT *,’R = ’,r r = MATMUL(r,r) ! Matrica rotacije za 2*fi PRINT *,’R*R = ’,r
Ponekad nije moguće unaprijed znati to čnu dužinu niza podataka koji će se rabiti u programu, pa se obi čno rezervira naviše što se misli da će biti potrebno. S druge strane prevelika koli čina rezervirane memorije može usporiti program jer ona može nadmašiti dostupni RAM na računalu. U tim situacijama je zgodno koristiti mogu ćnost naknadne rezervacije memorijskog prostora, za trenutak kada je podatak o koli čini potrebne memorije poznat. − Nizovi za koje će se memorijski prostor rezervirati naknadno deklariraju se s naznakom ALLOCATABLE. − Memorija se rezervira s naredbom ALLOCATE a oslobađa se s naredbom DEALLOCATE
Kratke osnove rada s programskim jezikom FORTRAN
str. 17
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
− −
Matrica se ne smije rabiti prije rezervacije memorije, a to se može provjeriti naredbom ALLOCATED. Umjesto brojke u zagradama se upisuje ’:’ (dvoto čka).
Primjer programa koji čita sa standardnog unosa (inputa) podatke te izra čunava srednju vrijednost i standardnu devijaciju. PROGRAM analiza REAL, ALLOCATABLE::PODACI(:) INTEGER :: n REAL :: aver,sigma PRINT *,’Upisi broj podataka’; READ (*,*) n ALLOCATE (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 = ’,aver PRINT *,’standardna devijacija = ’,sigma DEALLOCATE (podaci) END PROGRAM
3.6
Zajedničko memorijsko područ je – COMMON blok i MODULE
Programske cjeline (glavni program, potprogrami, funkcije,) mogu imati zajedni čke podatke uskladištene u COMMON bloku. Prije Fortrana 90 to je bio jednini na čin kako je to bilo mogu će postići. U Fortranu 90 preferirani na čin čuvanja zajedni čkih podataka su moduli. Common blok se zadaje s listom (prethodno deklariranih) varijabli koja slijedi iza naredbe COMMON. Izme đu liste varijabli i naredbe COMMON može biti navedeno i ime common bloka zatvoreno izme đu dvije kose crte. Imenovanih common blokova može biti proizvoljno puno, ali samo jedan bez imena. Common blok je globalni entitet, ne postoje common blokovi koji postoje samo unutar jedne programske cjeline. Jedna varijabla se ne može pojavljivati u dva razli čita common bloka. Varijable u common bloku zauzimaju memoriju ra čunala po redu kako su izlistane. Varijable u common bloku u razli čitim programskim jedinicama mogu imati razli čita imena ali moraju biti istog tipa. Dvije ili više uzastopnih varijabli u common bloku koje su istog tipa mogu u drugoj programskoj jedinici činiti niz. INTEGER A, B, C(100) STRUCTURE /OPIS_CVORA/ INTEGER ICVOR REAL CX, CY END STRUCTURE RECORD /OPIS_CVORA/ CVOR(NNODE) COMMON /GEOM_1/ CVOR, A, B, C
Dinamički alocirana matrica ne može se nalaziti u COMMON bloku. U Fortranu 90 umjesto common bloka, preferirani na čin čuvanja zajedni čkih podataka izme đu različitih programskih cjelina su Moduli (MODULE - globalne) programske cjeline. Moduli se moraju nalaziti prije po četka programa. MODULE zajedno_smo_jaci IMPLICIT NONE INTEGER :: i,j REAL :: a REAL, DIMENSION(5) :: b END MODULE C----------------------PROGRAM zajednistvo USE zajedno_smo_jaci IMPLICIT NONE i = 1; j = 2 a = SQRT(2.0) b = 0.0 b(3) = 1.0 PRINT *,a,b a = SQRT(3.0) PRINT *,a END PROGRAM
str. 18
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
Za razliku od common bloka: −
kod modula nije potrebno ponovo deklarirati tipove varijabli i zadati im imena. Varijable se mogu odmah koristiti s imenima kakva su im zadana u modulu.
−
Upotrebu modula potrebno je odmah navesti kao prvu liniju u programskoj cjelini (USE).
−
Osim podataka, moduli mogu sadržavati i zajedni čke funkcije i/ili potprograme, te definicije novih tipova varijabli.
−
Moduli mogu sadržavati nizove nazna čene kao ALLOCATABLE koji se inače ne mogu nalaziti u common bloku.
Programske cjeline koje koriste module mogu koristiti druga imena od onih specificiranih u modulu. To se postiže dodatnim argumentima kod USE naredbe, gdje treba navesti: => . USE zajednicki_podaci, novo => b
Programske cjeline ne moraju koristiti sve raspoložive podatke iz modula, ve ć samo dio njih izlistan iza naznake ONLY. USE zajednicki_podaci, ONLY : a,b
Varijable, novi tipovi podataka, funkcije i podprogrami mogu se deklarirati javnim ili privatnim. MODULE zajednicki podaci INTEGER, PRIVATE :: i,j REAL, PUBLIC :: a REAL, DIMENSION(5) :: b ! PUBLIC ! END MODULE
Ako podaci nisu eksplicitno nazna čeni da su privatni onda su javni. Javni zna či dostupni drugim programskim cjelinama koje koriste taj modul. Ako definicija modula zapo činje s PRIVATE onda su svi podaci po pretpostavci privatni, osim onih koji su eksplicitno naznačeni da su javni. Privatni podaci dostupni su svim funkcijama i potprogramima unutar modula, pa i onima koje su nazna čeni kao javni. Uporaba privatnih podataka mogu ća je posredno kroz javno dostupne funkcije i potprograme.
Kratke osnove rada s programskim jezikom FORTRAN
str. 19
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
4. Strukturiranje programa Prilikom pisanja programa u Fortranu potrebno je poštovati neka pravila strukturiranja programa. Neka pravila su stroga i ne smije se odstupiti od njih, dok su druga opcionalna, ali ih je dobro poštivati.
4.1
Pravilo o strukturi programa
Fortranska struktura programa je strogo odre đena. Fortranska struktura zahtijeva sljede će pravilo pisanja programa: − Prva linija: Naredbe: PROGRAM, SUBROUTINE ili FUNCTION – po četak programa ili potprograma − 1. dio: deklaracija varijabli − 2. dio: samo tijelo programa ili potprograma Npr. sljedeći kôd je dobro napisan kôd: PROGRAM ZBRAJANJE INTEGER I, ZBROJ ZBROJ=0 DO I=1,100 ZBROJ=ZBROJ+I ENDDO PRINT *,' Zbroj : ',ZBROJ END
Ime programa koji slijedi, ujedno oznaka i po četka programa Deklaracija varijabli Tijelo programa
Kraj programa
Sljedeći kôd je loše napisan kôd. Grešku će javiti kompajler i program ne će biti kompajliran. PROGRAM ZBRAJANJE INTEGER ZBROJ ZBROJ=0 INTEGER I DO I=1,100 ZBROJ=ZBROJ+I ENDDO PRINT *,' Zbroj : ',ZBROJ END
4.2
Ime programa koji slijedi, ujedno oznaka i po četka programa Deklaracija varijabli u koje se umješala jedna izvršna naredba ( ZBROJ=0) Tijelo programa
Kraj programa
Konvencija o imenima varijabli
Jedno od opcionalnih pravila je, npr. pravilo o deklariranju varijabli. Fortran po default-u sve varijable koje zapo činju slovima I, J, K, L, M i N shva ća kao cjelobrojne varijable (INTEGER), dok su ostale varijable realne (REAL). Varijable ostalih tipova (CHARACTER, LOGICAL, COMPLEX) potrebno je eksplicitno deklarirati. Dobra praksa (ali ne i pravilo) je da se sve varijable deklariraju. Tako đer dobra praksa je navo đenje naredbe: IMPLICIT NONE prije samog deklariranja. Ova naredba zabranjuje upotrebu nedeklarirane varijable (kompajler javlja grešku). Npr. sljedeći dio koda: PROGRAM ZBRAJANJE IMPLICIT NONE INTEGER I, ZBROJ ZBROJ=0 DO I=1,100 ZBROJ=ZBROJ+I ENDDO PRINT *,' Zbroj : ',ZBROJ END
javiti će grešku jer varijabla ( I) nije eksplicitno deklarirana. Bez naredbe ( IMPLICIT NONE ) program bi se uredno iskompajlirao i izvršio bez greške. U ovom slu čaju (ovom jednostavnom programu) naredba ( IMPLICIT NONE ) čak nije ni potrebna. Me đutim u sljedećem slučaju: PROGRAM ZBRAJANJE INTEGER I,ZBROJ DO I=1,100 ZBROJ=ZBROJ+I ENDDO PRINT *,' Zbroj : ',ZBROJ END str. 20
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
Varijabla (ZBROJ ) nije deklarirana niti poništena. U četvrtom retku prilikom prvog korištenja uzima se vrijednost varijable ( ZBROJ ) i dodaje joj se ( I). Kompajler će prilikom izvršenja možda javiti upozorenje (warning) ali ne će prekinuti prevođenje programa. Program će se izvršiti s nepredvidivim rezultatom 1. Jedna dobra praksa je ozna čavanje imena varijabli nazivima koji opisuju svrhu te varijable. Npr. u prethodno prikazanom kôdu Varijabla ZBROJ označava zbroj svih brojeva (1-100). Potpuno funkcionalan bio bi i sljede ći kôd: PROGRAM ZBRAJANJE INTEGER I,GFCD DO I=1,100 GFCD = GFCD+I ENDDO PRINT *, GFCD END
Ali njegov izlaz (ispis - varijabla GFCD) ne bi u potpunosti bila jasna.
4.3
Komentari i aliniranje
Komentari se u fortranu pišu na na čin da se u prvom stupcu (fiksni format) upiše (tradicionalno) slovo C (comment) ili bilo koje drugo slovo. Kod slobodnog formata u tu svrhu služi uskli čnik (!). Uskličnikom se može služiti i kod fiksnog formata kada se komentar želi postaviti u nastavku izvršne linije. Sav tekst koji slijedi iza biti će ignoriran od kompajlera i služi samo kao podsjetnik programeru Iako pisanje komentara često predstavlja optere ćenje tijekom kodiranja, komentari su vrlo važni dijelovi programa. Oni pojašnjavaju sami program i olakšavaju čitanje i razumijevanje programa, posebno drugim osobama koje nisu taj program kodirale. Pri pisanju komentara valja se ipak ograni čiti na osnovne komentare, jer višak komentara može proizvesti suprotan efekt. PROGRAM analiza REAL PODACI(100) INTEGER n REAL aver, sigma PRINT *,’Upisi broj podataka’ READ (*,*) n C*** Ako je N veci od rezervirane dimenzije - prekini IF (n >= 100) GOTO 100 C*** Citanje podataka s ekrana PRINT *,’Upisi podatke’ READ (*,*) podaci(1:n) C*** Izracunaj srednju vrijednost (aver) i stand. Devijaciju (sigma) aver = SUM(podaci(1:n))/REAL(n) sigma = SQRT(SUM((podaci(1:n)-aver)**2 )/REAL(n-1)) PRINT *,’prosjecna vrijednost = ’,aver PRINT *,’standardna devijacija = ’,sigma 100 CONTINUE END PROGRAM
Također je zgodno pri programu zasebne cjeline (npr. DO petlje, deklaraciju varijabli…) uvla čenjem nastojati vizualno odvojiti od samog tijela programa. Takvi programi su vizualno pregledniji i lakše ih je čitati i analizirati
1 U
ovom slu čaju vjerojatni rezultat će biti točan jer većina kompajlera poništava sve varijable prije korištenja (izjednačava ih s nulom). Me đutim, kod velikih programa rezultat je stvarno nepredvidiv. Kratke osnove rada s programskim jezikom FORTRAN
str. 21
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
5. Kontrola toka programa 5.1
Grananje programa
Tijekom izvršavanja programa mogu se pojaviti razli čite situacije koje je potrebno rješavati na razli čite načine. To se postiže naredbama grananja. Npr. pri izra čunu kvadratnog korijena potrebno je ispitati da li je broj pozitivan ili negativan prije samog izračuna korijena, te postupiti prema trenutnoj vrijednosti. Generalno se naredbe grananja mogu podijeliti na naredbe uvjetnog grananja (IF i CASE) i naredbe bezuvjetnog grananja (GOTO).
5.1.1
Uvjetna naredba grananja: IF
5.1.1.1
Logi čk a IF naredba
U fortranskom programu postoji ve ći broj različitih vrsta IF naredbi. Logi čki IF je najjednostavnija IF-naredba, tj. naredba od samo jedne linije. IF (a.LT.0.0) PRINT *,’Imaginarni broj’
! Stari na čin
IF (a < 0.0) PRINT *,’Imaginarni broj’
! Novi na čin
Karakteristike logi čkog IF-a su sljede će: −
Iza riječi IF slijedi logički izraz zatvoren u okrugle zagrade.
−
Vrijednost logičkog izraza je to čno ili pogrešno.
−
Iza logičkog izraza slijedi naredba koja se izvršava samo ako je logi čki izraz točan.
−
IF nema direktni utjecaj na izvršavanje naredbi koje slijede iza njega.
Kao operatori usporedbe koriste se sljede ći znakovi/izrazi (logi čki operatori): Fortran 77 i niže verzije Fortran 90 i više verzije .EQ. .NE. .LT. .LE. .GT. .GE.
A.EQ.B A.NE.B A.LT.B A.LE.B A.GT.B A.GE.B
== <> < <= > >=
Zna čenje
A==B A<>B AB A>=B
A je jednako A nije jednako A je manje od A je manje ili jednako A je veće od A je veće ili jednako
B B B B B B
Primjer jednostavnog programa s logi čkom IF naredbom: PROGRAM kvadratni_korijen REAL :: a PRINT *,’Upiši neki realni broj’ READ (*,*) a IF (a < 0.0) PRINT *,’Upisan je negativan broj’ IF (a >= 0.0) PRINT *,’Kvadratni korijen je = ’,SQRT(a) END
5.1.1.2 Blok IF naredba
Umjesto logičkog IF-a, moguće se koristiti IF u kombinaciji s THEN. Primjer: IF (a < 0.0) THEN PRINT *,’Imaginarni broj’ ENDIF
IF (logički izraz) THEN zapo činje blok (skupinu) naredbi koja će se izvršavati samo ako je logi čki izraz točan, a ENDIF (ili END IF) je oznaka kraja bloka naredbi. Unutar bloka mogu će imati ili jednu ili više naredbi. U blok naredbi IF - THEN - ENDIF mogu će je ugnjezditi jedan ili više drugih IF - THEN - ENDIF blokova ili logi čkih IF-ova. Prethodni primjer bi se mogao proširiti na sljede ći način: POGRAM kvadratni_korijen REAL :: a PRINT *,’Upiši neki realni broj’ READ (*,*) a IF (a < 0.0) THEN PRINT *,’Negativni broj’ str. 22
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
END IF IF (a >= 0.0) THEN IF (INT(SQRT(a))**2 == a) THEN PRINT *,’Upisani broj je kvadrat cijelog broja = ’,INT(SQRT(a)) END IF IF (INT(SQRT(a))**2 /= a) THEN PRINT *,’Kvadratni korijen je = ’,SQRT(a) END IF END IF END
Još složenija forma IF naredbe (IF-THEN-ELSE-ENDIF) sastoji se od dva bloka. Prvi blok naredbi se izvršava ako je logi čki izraz točan, a drugi ako je logi čki izraz pogrešan. IF (a >= 0.0) THEN PRINT *,’Kvadratni korijen je = ’,SQRT(a) ELSE PRINT *,’Zadan je negativni broj’ END IF
Svaki blok naredbi (IF-dio i ELSE-dio) mogu sadržavati druge složenije i jednostavnije verzije IF-naredbe. Prethodni primjer: POGRAM kvadratni_korijen REAL :: a PRINT *,’Upiši neki realni broj’ READ (*,*) a IF (a .GE. 0.0) THEN IF (INT(SQRT(a))**2 .EQ. a) THEN PRINT *,’Upisani broj je kvadrat cijelog broja = ’,INT(SQRT(a)) ELSE PRINT *,’Kvadratni korijen je = ’,SQRT(a) END IF ELSE PRINT *,’Zadan je negativni broj’ END IF END
Postoji i vrlo složena forma IF naredbe koja može provjeravati više razli čitih logičkih izraza, te izvršavati blok (skupinu) fortranskih naredbi ako je samo jedan od njih to čan, te opcionalno ELSE grupu naredbi ako niti jedan od logi čkih izraza nije to čan. IF (a < 0.0) THEN PRINT *,’Zadan je negativni broj’ ELSE IF ((a > 0.0) .AND. (a < 100.0)) THEN PRINT *,’Kvadratni korijen broja ’,a,’ je ’,SQRT(a) ELSE PRINT *,’Ne znam vaditi korjene brojeva vecih od 100’ END IF
5.1.1.3 Arihmeti čk a IF naredba - zastarjeli oblik IF naredbe
U pojedinim Fortranskim programima može se prona ći zastarjeli oblik IF naredbe, koju nije više upitno koristiti iako je kompajleri još uvijek prepoznavaju. Ovaj oblik naredbe IF naziava se arihmeti čka IF naredba i ima oblik: IF (a) lab1,lab2,lab3
Ovisno o broju a, koji može biti manji, jednak ili ve ći od nule izvršavanje programa se nastavlja od lab1 (a<0), lab2 (a=0) ili lab3 (a>0). Prethodni primjer se može napisati u obliku: IF (a) 1,2,2 PRINT *,’Zadan je negativni broj’ GOTO 3 2 PRINT *,’Kvadratni korijen broja ’,a,’ je ’,SQRT(a) 3 CONTINUE
1
5.1.2
Uvjetna naredba grananja: CASE
CASE naredba je vrlo slična najsloženijem obliku IF naredbe, s tim da nije nužno da se izra čunavaju logički izrazi, ve ć to može biti bilo koji izraz. U pojedinim slučajevima može se navesti lista vrijednosti odvojena zarezom.
Kratke osnove rada s programskim jezikom FORTRAN
str. 23
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
Moguće je navesti podru č je vrijednosti pomo ću dvotočke. Ispred dvotočke stoji početna vrijednost, a iza dvoto čke stoji kona čna vrijednost intervala. Granice su uklju čene. Za navođenje polubeskonačnog intervala može se donja ili gornja granica ispustiti. Vrsta vrijednosti (konstanti) mora odgovarati vrsti izraza koji se navodi u po četnoj SELECT liniji CASE naredbe. Izvršava se jedna ili više naredbi koje se nalaze u bloku koji slijedi iza CASE iskaza ovisno o vrijednosti izraza. PROGRAM izbornik CHARACTER i PRINT *,’Odaberi opciju izbornika’; READ (*,*) i SELECT CASE (i) CASE (’f’,'F'); PRINT *,’Odabrao si opciju: File’ CASE (’e’,'E'); PRINT *,’Odabrao si opciju: Edit’ CASE (’i’,'I'); PRINT *,’Odabrao si opciju: Insert’ CASE (’w’,'W'); PRINT *,’Odabrao si opciju: Window’ ... CASE DEFAULT; PRINT *,’Nema takve opcije!’ END SELECT END PROGRAM
S točka-zarezom odvojene su razli čite fortranske naredbe na istoj liniji!
5.1.3
Bezuvjetna naredba grananja: GOTO
GOTO (ili GO TO) je bezuvjetna naredba grananja. Ima oblik: GOTO lab1
Nakon izvršenja ove naredbe program se nastavlja na labeli lab1. Primjer: Program hello write (*,*) ’Pozdrav i mir cijelom svijetu’ goto 100 print *,’ovo nece biti ispisano’ 100 continue end program
Nakon izvršenja naredbe GOTO program nastavlja radom na naredbi: 100 continue i tekst: ’ovo nece biti ispisano’ stvarno neće biti ispisano.
5.2
Petlje
Za višestruko ponavljanje grupe naredbi služimo se petljama. U Fortranu petlja po činje s rječ ju DO a završava s ENDDO (END DO). Postoji više verzija DO-petlje: −
Petlja s kontrolnim parametrom;
−
Petlja DO-WHILE koja se ponavlja dok je neki uvjet zadovoljen;
−
Beskonačna petlja.
5.2.1
Petlja s kontrolnim parametrom
DO petlja s kontrolnim parametrom ( I) ima oblik: DO I = poc,kraj,korak
! tijelo petlje ENDDO
Tijelo petlje se izvršava za svaku vrijednost kontrolnog parametra ( I). Vrijednost kontrolnog parametra u prvom izvršavanju je ( poc). Pri svakom sljede ćem izvršavanju pove ćava se za ( korak), sve dok je vrijednost I
ZBROJ = ZBROJ + I ENDDO PRINT *,’Zbroj=’,ZBROJ END str. 24
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
Za DO petlju vrijedi: − Ako korak nije naveden onda se podrazumijeva da je on jedan. − Ako je početna vrijednost ve ća od konačne, a korak je pozitivan petlja se ne izvodi. − Ako je početna vrijednost manja od kona čne, a korak je negativan petlja se ne izvodi. − Unutar DO petlje mogu se nalaziti druge DO petlje ali se ne smiju preplitati (svaka unutarnja DO petlja mora završiti prije vanjske). Također se DO petlju može prisiliti na sljede ći korak ili prisilno iza ći iz nje. Vrijedi: − Naredba CYCLE prisiljava izvo đenje slijede ćeg koraka DO-petlje. Podrazumijeva se da se prelazi na sljede ći korak najniže petlje ako je nekoliko DO petlji ugnježdeno. − Naredba EXIT prekida izvo đenje DO-petlje. Podrazumijeva se da se prekida najniža petlju ako je nekoliko DO petlji ugnježdeno. Naredni primjer zbrajat će brojeve samo dok je ZBROJ < 1000. Kada ZBROJ prije đe 1000 izvršiti će se IF naredba i petlja će biti nasilno prekinuta. Slijedi ispis i kraj programa. PROGRAM Zbrajanje INTEGER I, ZBROJ ZBROJ=0 DO I = 2, 256, 2
ZBROJ = ZBROJ + I IF (ZBROJ > 1000) EXIT ENDDO PRINT *,’Zbroj=’,ZBROJ END
Stari oblik DO petlje s kontrolnim parametrom ima oblik: DO 100 I = poc,kraj,korak
! tijelo petlje 100 CONTINUE
Ovaj oblik ima u potpunosti istu funkciju kao i novi oblik.
5.2.2
DO-WHILE petlja
DO WHILE-petlja nema kontrolni parametar, nego ponavljanje izvršavanja je kontrolirano logi čkim izrazom. Standardna DO petlja: DO-WHILE petlja: ZBROJ=0 DO I = 2,100,2
ZBROJ=0 I=2 DO WHILE (I <= 100)
ZBROJ = ZBROJ + I ENDDO
5.2.3
ZBROJ = ZBROJ + I I=I+2 ENDDO
Beskonačna DO petlja
Beskonačna DO nema kontrolnog parametara, niti kontrolni logi čki izraz. Prestanak izvršavanja prepušten je naredbi EXIT koja se mora nalaziti negdje unutar petlje. Standardna DO petlja: Beskonačna DO petlja: ZBROJ=0 DO I = 2,100,2
ZBROJ=0 I=2 DO IF (I > 100)
ZBROJ = ZBROJ + I ENDDO
ZBROJ = ZBROJ + I I=I+2 ENDDO
6. Formatirani ispis podataka i rad s datotekama 6.1
Općenito
Fortran sadrži cijeli niz naredbi za pisanje i čitanje, kao i za formatirani unos i ispis. Podatke ispisujemo pomo ću PRINT i WRITE naredbi. Za Razlika izme đu PRINT i WRITE je da PRINT ispisuje na standardni izlaz (ekran), dok WRITE naredba može ispisivati na razne ure đaje, te broj mogućih opcija i puno ve ći (vidjeti u nastavku). PRINT Kratke osnove rada s programskim jezikom FORTRAN
WRITE: str. 25
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
INTEGER :: a=1, b=2, c=3 PRINT *, a PRINT ’(i)’,b PRINT 100,c 100 FORMAT (i)
INTEGER :: a=1, b=2, c=3 WRITE (*,*) a WRITE (*,’(i) ’) b WRITE (*,100) c 100 FORMAT (i)
Način ispisa podatak može se ostaviti nedefiniranim, nego ostaviti sustavu (prevoditelju) da ispiše podatke na predefinirani na čin za tu vrstu podataka. To je tzv. slobodni format ispisa.
6.2
Naredba FORMAT
Ispis podataka može se zadati preko format instrukcija koje su dio PRINT/WRITE naredni ili se može zadati preko FORMAT naredbe. Nema razlike izme đu jednog ili drugog na čina. FORMAT naredbe je posebna u tome što to nije naredba koja se izvršava nego je više informacija PRINT/WRITE naredbi. FORMAT naredba može biti bilo gdje unutar programske cjeline, te ima jedinstvenu numeri čku labelu pomoću koje se naredbe PRINT/WRITE referiraju na nju. FORMAT naredba ima kao argumente listu slovnih oznaka kombiniranih opcionalno s brojkama (te još nekim dodatnim znakovima) međusobno odvojenih zarezima. Svaki član u listi odnosi se na jedan podatak u listi varijabli za ispis u PRINT/WRITE naredbi. Ove slovne oznake u FORMAT naredbi nazivamo ure đivanje (eng. editing). Svaka vrsta podataka traži svoju posebnu specifikaciju ispisa, tj. svoje posebno ure đivanje, osim slobodnog formata (ozna čen zvjezdicom - *) koji se može koristiti za ispis svih vrsta podataka.
6.2.1
Ispis cijelih brojeva
Za ispis cijelih brojeva (INTEGER-a) u decimalnom ispisu, koristi se „I“ format: INTEGER :: i
i = -1234 PRINT ’(i)’,i
! -1234
Za ispis cijelih brojeva (INTEGER-a) u binarnom ispisu, koristi se „B“ format: INTEGER :: i
i = -1234 PRINT ’(b)’,i
! 11111111111111111111101100101110
Za ispis cijelih brojeva (INTEGER-a) u heksadecimalnom ispisu, koristi se „Z“ format: INTEGER :: i
i = -1234 PRINT ’(z)’,i
! FFFFFB2E
Iza oznake ure đivanja, slova I, B i Z može stajati broj koji je širina podru č ja unutar kojeg treba ispisati cijeli broj (npr. (I10)). Ako ispis broja ne stane u nazna čenu širinu, ispisuju se zvjezdice. Ako je broj kra ći od naznačene širine, broj se ispisuje na desnom kraju s prazninom (ne ra čunajući predznak) ispred. Praznina ispred može se popuniti s nulama ako iza nazna čene širine se doda to čka i dodatna brojka. Dodatna brojka ozna čava minimalni broj znamenki u broju, ra čunajući i nule ispred. Obavezno ili opcionalno ispisivanje predznaka se posebno može regulirati s ure đivanjem. i = 1234 PRINT ’(i3)’,i PRINT ’(i5)’,i PRINT ’(i10)’,i PRINT ’(i10.7)’,i PRINT ’(i16)’,i
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
6.2.2
Ispis logičkih varijabli
Za ispis logi čkih varijabli koristi se „L“ format: LOGICAL :: lll
lll = .TRUE. PRINT ’(l)’,lll
6.2.3
! T
Ispis niza znakova
Za ispis niza znakova (stringa) koristi se „A“ format. Iza a ure đivanja može do ći opcionalno broj koji je širina podru č ja unutar kojeg se niz znakova ispisuje. Znakovi se ispisuju na lijevoj strani nazna čene širine. Ako širina podru č ja nije dovoljna za ispis, ispisuje se onoliko znakova koliko stane u nazna čenu širinu. CHARACTER(len=20) :: str str = ’9 znakova u stringu’ PRINT ’(a)',str PRINT ’(a8)’,str PRINT ’(a9)’,str PRINT ’(a11)’,str PRINT ’(a15)’,str PRINT ’(a20)’,str
! ! ! ! ! !
9 znakova u stringu 9 9 9 9 9
znakov znakova znakova u znakova u str znakova u stringu
Stari format ispisa niza znakova je „H“ format (Hollerith format). U ovom formatu se ispisuje svaki znak posebno.
6.2.4
Ispis realnih varijabli
Za ispis realnih brojeva (REAL-a) u decimalnom ispisu, koriste se F, E, G, EN i ES formati. REAL A A=0.0191881 PRINT ’(f15.5)',A PRINT ’(e15.5)’,A PRINT ’(g15.5)’,A PRINT ’(en15.5)’,A PRINT ’(en15.5)’,A
Format F je normalni ispis. Prvi broj ispred to čke označava ukupan broj mjesta rezerviran za ispis broja, a broj iza to čke označava broj mjesta rezerviran za decimale. U prvi broj se broje i predznak, decimalna to čka, eksponent i predznak eksponenta. Ako je broj koji se želi ispisati malen, biti će ispisane nule, a ako je velik ispisati će se zvjezdice. REAL A A=.123E-12 PRINT ’(f15.5)',A A=.123E+12 PRINT ’(f8.2)',A
! 123456789_123456789_ ! 0.00000 ! ********
Format E je za znanstveni (eksponencijalni) ispis.Kao i kod F formata broj ispred to čke označava ukupan broj mjesta rezerviran za ispis broja, a broj iza to čke označava broj mjesta rezerviran za decimale. G format, u slu čaju kada je broj normalne veli čine ispisuje ga u F formatu, a ako je velik ili malen u E formatu REAL A A=.123E-12 PRINT ’(e15.5)',A PRINT ’(g15.5)',A A=123.1 PRINT ’(e15.5)',A PRINT ’(g15.5)',A
Kako je vidljivo na gornjem primjeru, iako broj 123.1 zapisuje u normalnom formatu, G format ostavlja 3 mjesta rezervirana za eksponent i predznak eksponenta, pa to treba uzeti u obzir prilikom dimenzioniranja formata. Također, treba imati na umu da kod realnih varijabli dvostruke preciznosti (KIND=8), eksponent se sastoji od tri znamenke. Kod E formata neeksponencijalni dio broja je izme đu 1.0 i 0.1 (broj uvijek ima oblik: 0.xxxx-yy). ES ozna čava tz. znanstveno uređivanje, sve brojke se ispisuju tako da je neeksponencijalni dio broja manji od 10 a ve ći od 1. EN je tzv. inženjersko ure đivanje, neeksponencijalni dio broja je manji od 1000 a ve ći od 1. Opcionalno mogu će je regulirati broj znamenki u eksponentu (e20.5E3 - 3 znamenke za eksponent).
Kratke osnove rada s programskim jezikom FORTRAN
str. 27
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
6.2.5
Posebni znakovi pri formatiranju ispisa
Posebni znakovi služe nam za još bolje kontroliranje ispisa. To su: − x uređivanje - broj praznih mjesta − $ uređivanje - ne prije ći na novu liniju nakon ispisa − / uređivanje – preska če jednu liniju kod ispisa − sp - u nastavku aktivirati ispisivanje znaka + gdje je ina če opcionalan − s - deaktivirati obavezno ispisivanje opcionalnog znaka „+“ − t uređivanje služi za pozicioniranje ispisa.
6.2.6
Ostale korisne napomene pri formatiranju ispisa
Brojke ispred ure đivanja znače broj ponavljanja (npr. 5i10 zna či: 5 puta po 10 mjesta za ispis cijelih brojeva). Zagrade se mogu koristiti za ponavljanje grupe ure đivanja (npr. 2(i5,f10.5) zna či: 2 puta po 15 mjesta, od toga prvih 5 za cijeli broj a drugih 10 za realni broj). Ako se ispisuje veći broj varijabli od zadanog broja ure đivanja, ispisuje se onoliko varijabli koliko je zadano ure đivanjem, a ostatak se ispisuje ponavljanjem cijele format naredbe ali na novim linijama. Ponekad je moguće koristiti varijabilno ure đivanje (nije dio standarda).
6.3
Naredbe OPEN i CLOSE
Naredbe OPEN i CLOSE služe za otvaranje/zatvaranje komunikacije s vanjskim ure đajima. Vanjskim ure đajima se smatraju tvrdi disk, tračna jedinica, konzola (terminal) s tipkovnicom. Rad s složenim uređajima poput grafičke konzole zahtijeva uporabu biblioteka čije naredbe nisu dio Fortrana kao jezika. Ure đaji koji se automatski otvaraju kod pokretanja programa je konzola (ekran) s tipkovnicom. Konzola (ekran) se tretira kao ure đaj za standardni ispis (pisanje). Ure đaju je pridružen broj 6. Tipkovnica je ure đaj za standardni upis (unos, čitanje) i pridružen joj je broj 5. Ovo je napomenuto samo radi boljeg snalaženja u starijim programima (Fortran IV) koji su ovu konvenciju bezuvjetno poštivali. Umjesto standardnih brojeva 5 i 6 praktično se poslužiti zvjezdicom (*) koja zamjenjuje oba broja. Ovo će se u nastavku koristiti. Konzolu (ekran) i tipkovnicu ne treba posebno otvarati. Za rad s ostalim ure đajima (prvenstveno datotekama) treba ure đaju pridružiti broj uređaja koristeći naredbu OPEN. Naredba OPEN ima veliki broj argumenata, od koji je obavezan broj ure đaja. Broj uređaja je bilo koji prirodni broj, ali mora biti jedinstven u programu, tj. ne smije se ponoviti za neki drugi ure đaj. &
Argument [UNIT=] specificira broj ure đaja. Ime argumenta UNIT je opcionalno, tj. može se ispustiti, što je naznačeno stavljanjem toga argumenta u uglate zagrade – konvencija iz help-a. Argument FILE određuje ime datoteke koja se otvara. Opcionalni argument FORM ima dvije vrijednosti: − ’FORMATTED’ - Zapisi su uređeni i može ih se čitati. Ova vrijednost je pretpostavljena ako druga čije nije navedeno. − ’UNFORMATTED’ - zapisi su u binarnom obliku. Argument STATUS govori o stanju ure đaja, da li je stara ili nova datoteka. Mogu će vrijednosti su: − ’OLD’ - radi se o datoteci koja već postoji. − ’NEW’ - treba otvoriti novu datoteku. − ’REPLACE’ - staru datoteku treba zamijeniti novom. − ’SCRATCH’ - privremena datoteka koja će po zatvaranju biti izbrisana. − ’UNKNOWN’ - Ako postoji otvara se kao ’OLD’ datoteka, a ako ne postoji onda kao ’NEW’. Argument ACCESS specificira na čin pristupa zapisima u ure đaju. Postoje dvije mogu ćnosti: − ’SEQUENTIAL’ - za čitanje ili pisanje liniju po liniju, − ’DIRECT’ - za direktni pristup pojedinim zapisima uz pomo ć ID broja zapisa. U ovom slu čaju je potrebno kod otvaranja navesti i dužinu zapisa pomo ću opcionalnog argumenta RECL=dužina_zapisa .
str. 28
Kratke osnove rada s programskim jezikom FORTRAN
Sveu č ilište u Splitu, Gra đevinsko-arhitektonski fakultet Katedra za Betonske konstrukcije i Mostove
Argument ACTION navodi našu nakanu: čitanje, pisanje ili oboje. Mogu će vrijednosti su: − ’READ’ - otvaramo ure đaj samo za čitanje, − ’WRITE’ - otvaramo uređaj samo za pisanje, − ’READWRITE’ - otvaramo uređaj za čitanje i pisanje (pretpostavljena vrijednost). Argument ERR navodi broj labele u Fortranskom programu na koju treba i ći ako dođe do greške kod otvaranja ure đaja. Opcionalni argument IOSTAT= pridjeljuje vrijednost cjelobrojnoj varijabli u slu čaju greške. Iznos varijable indicira vrst greške. Ako IOSTAT ili/i ERR nisu prisutni u pozivu naredbe OPEN, greška kod otvaranja izazvat će prijevremeni završetak programa. Uređaj zatvaramo naredbom CLOSE(). Pri tome treba navesti broj ure đaja koji se zatvara. Dodatni argument je STATUS s dvije moguće vrijednosti: 'KEEP' ili 'DELETE'. PROGRAM Datoteka INTEGER :: ioerr OPEN(14, FILE=’input.dat’, STATUS=’OLD’, FORM=’FORMATTED’ , & ACCESS=’SEQUEN TIAL’, ACTION=’READ’, ERR=10, IOSTAT=ioerr ) ................ READ(14,..) .... ................ CLOSE(14, STATUS=’KEEP’) 10 IF (ioerr>0) THEN WRITE (*,*) ’G reska kod otva ranja :’,iost at STOP END IF END PROGRAM
6.4
Naredbe WRITE i READ
Opća forma naredbe WRITE je: WRITE ([UNIT= ] , [FMT=], IOSTAT=< int_var>, ERR=, ADVANCE=,...) lista_varijab li
&
Argument [UNIT=] specificira broj ure đaja (datoteke) s kojeg se čita. IOSTAT i ERR argumenti služe za rukovanje izvršavanjem programa u slu čaju pojave greške. ADVANCE= određuje prelazak ispisa na sljede ći redak po završetku.
Kod pisanja u ’UNFORMATTED’ uređaj format se ne specificira. Najčešće se kod naredbe WRITE koriste samo oznaka jedinice i oznaka formata. Opća forma naredbe READ je: READ ([UNIT=],[FMT=],ADVANCE=, IOSTAT=,ERR=,END=,EOR=