Professional Documents
Culture Documents
Uvod
F je vii programski jezik i predstavlja podskup Fortrana 90/95. Postavlja se
pitanje: ta je uopte programski jezik? ta je vii programski jezik?, ta je Fortran?. Kad
sam ja prvi put uo pojam "programski jezik" naao sam se malo zbunjen. Da to malo
pokuamo da razjasnimo (i ostanemo manje-vie zbunjeni). Prirodni jezici su jezici
kojim ljudi komuniciraju (Srpski, Enleski, Svahili itd.) i niko ih nije napravio nego se
razvijaju prirodno tokom ljudske istorije. Iako ljudi malo mogu direktno da utiu na
prirodni jezik ipak pokuavaju da uvedu neki red i pravila (pravopis, gramatika itd.).
Formalni jezici su projektovani sa strogo definisanim pravilima i imaju specifine
primene. Na primer, matematiari koriste formalni jezik da bi prikazali odnose brojeva i
simbola. Hemiari koriste formalni jezik da bi opisali hemijsku strukturu molekula.
Programski jezik je formalni jezik projektovan da se pomou njega izraze
prorauni. Na primer: 3+3=6 je matematikim jezikom ispravno napisano ali 3+=6$ je
matematikim jezikom neispravno napisano. Hemijski jezikom H2O je ispravno napisano
ime jedinjenja ali 2Zz je neispravno.
Do sada nismo spominjali raunar. Da bi smo nastavili osvrnimo se na dve stvari:
hardver i softver. Hardver predstvlja sam raunar tj. sve to u kuitu raunara moete da
vidite. Super-raunar koji kota mnogo miliona dolara je bez softvera pametan kao toster.
Softver je skup mainskih instrukcija koje se unose u raunar da bi centralna procesna
jedinica mogla da radi (kae se da raunar izvrava program. Kako i zato, drugom
prilikom).
Vii programski jezik predstavlja nain pisanja programa. Program je niz
instrukacija raunaru koje izvode neko raunanje. To moe biti neki matematiki
proraun (npr. osnovne raunske radnje ili pronalaenje nula polinoma itd.) ili neki
simboliki proraun (npr. zamena rei u nekom tekstu itd.) ili prevoenje jednog oblika
raunarskih instrukcija u drugi itd. Sam nain kako se to izvodi zavisi od poznavanja
datog programskog jezika. Ako postoje vii programski jezici onda, verovatno, postoje i
nii. Nii programski jezici zavise od konkretne maine (centralne procesne jedinice) za
koju su pisani dok su vii programski jezici blii ljudima i nisu vezani za konkretan
raunar. ak ne moraju biti uopte pisani za raunar.
Jedan od najstarijih i najpoznatijih programskih jezika je Fortran (verovatno ste
uli jo za BASIC, C, C++, Pascal itd.). Od samih poetaka je Fortran bio i ostao
programski jezik za nauno-tehnike proraune. Njegova prva verzija je nastala 50-ih
godina prolog veka. Prvi standard vieg programskog jezika je verzija Fortran-a koja se
zvala Fortran 66 ili Fortran IV nastala 60-ih godina prolog veka. Sledea veoma
popularna verzija je nastala 70-ih godina i zvala se Fortran 77. Fortran, kao najstariji vii
programski jezik, je imao balast zasterelih koncepata pa je 90-ih godina nastala
najkorenitija promana u tzv. Fortran 90. Fortran 90 je poprimio oblik modernih
1
programskih jezika koji se i dalje razvija (ali ne sa tako korenitim izmenama) pa imamo
Fortran 95, 2000, itd. Fortran 90 je zadrao mogunost izvravanja Fortran 77 programa.
Kako bi se reklo, Fortran 90 je nadskup fortrana 77. U daljem tekstu emo sve novije
verzije nazvati jednim imenom, tj. F90.
ta bi sada F bio kao "podskup Fortrana 90/95"?. F90 je postao veoma
kompleksan pri emu se jedna te ista stvar moe uraditi na mnogo naina. Samim tim i
uenje Fortran-a predstavlja problem. Zbog toga su nastale verzije programskih jezika
koje predstavljaju paljivo odabrane mogunosti F90. Tako je nastao F programski jezik
koji je namenjen za edukativne svrhe i uenje novih koncepata F90. Pri tome svaki F
program je istovremeno i F90 program (obrnuto ne mora da vai). Posetite web stranicu
F-a http://www.fortran.com/imagine1/index.html. za vie detalja.
Kreatori plana i programa za srednje kole su predvideli da se kao prvi
programski jezik ue BASIC ili (uglavnom) Pascal. Moje skromno miljenje je da bi i F
mogao vrlo dobro da poslui u nastavi informatike u srednjim kolama. No, ne bih da
irim diskusiju jer rasprava o programskim jezicima lii na raspravu "koji je auto bolji?".
Elementi F (konstante, promenljive, operatori, funkcije)
Iako ima mnogo programskih jezika koji se razlikuju u razliitim detaljima ipak
za skoro sve programske jezike, pa tako i za F, postoji neto zajedniko a to su instrukcije
za:
a) ulaz
unos u raunar podataka pomou tastature, iz fajla ili iz nekog drugog ureaje
b) izlaz
prikaz rezultata na monitor ili upis u naki fajl ili drugi ureaj
c) raunanje
osnovne raunske radnje kao to su sabiranje, oduzimanje, mnoenje, deljenje itd.
d) uslovno izvoenje
ispitivanje uslova i izvravanje odreenog seta instrukcija
e) ponavljanje
ponavljanje odreenog seta instrukcija
Verovali ili ne, ovo bi otprilike bilo to. Svaki, ma koliko kompleksan, program se
sastoji od instrukcija koje se mogu, manje-vie, svrstati u prethodne. Tako se
programiranjem moe nazvati ralanjivanje kompleksnog problema na sve manje
kompleksne potprobleme dok ne doemo do elementarnih instrukcija tipa a)-e).
Programiranje je poprilino individualna stvar, a kako se izvodi od strane ljudi, podloan
je grekama. Programske greke se zovu bug (izgovara se bag). Postoje tri vrste greaka:
sintaksne greke (syntax errors), greke u toku izvoenja (runtime errors) i semantike
greke (semantic errors).
Prvi F program
Sada neto konkretno. Seli ste ispred raunara i nastavnik vam kae da na tastaturi
otkucate sledei tekst tj. program u F-u (U prvoj koloni su brojevi linija i ne pripadaju
programu tj, ne unose se). Svaka linija sadri jednu instrukciju ili naredbu.
1 program P1
2 print*,"Zdravo svete!"
3 endprogram P1
Onda vam se kae (i pokae) da program sauvate u fajl pod imenom npr. prvi.f95 i
da ga zatim pokrenete tj. da ga startujete. ta to znai "pokrenuti program". To znai da
se tekst koji vidite ispred sebe (izvorni kod) "prevede" u mainske instrukcije koje
razume raunar. To prevoenje vri program koji se zove F prevodilac tj. kompajler
(compiler). Na ekranu ete dobiti rezultat izvravanja ovog programa tj. bie prikazano:
Zdravo svete!
I to je sve. Da malo prodiskutujemo ovaj ekstremno jednostavan i besmislen program.
Svaki F program poinje sa program imeprograma i zavrava sa endprogram
imeprograma. Ako sluajno omaite i umesto program napiete prgram u liniji 1,
raunar e pri pokuaju startovanja prijaviti greku (sintaksnu) tj.
Error: prvi.f95, line 1: syntax error
detected at <end-of-statement>@PRGRAM
[F fatal error termination]
Ispravite greku u liniji 1 i ponovo startujete program, koji je sada ispravan. Zamislite
sada sledeu situaciju. Evo ga isti taj program:
1 program P1
2 print*,''Zdravo svete!''
3 endprogram P1
Ako pokuate da startujete ovaj program dobiete sledeu poruku.
Error: p1.f95, line 2:
Error: p1.f95, line 2:
***Malformed statement
Error: p1.f95, line 2:
[F terminated - errors
Znai, neto se mnogo buni oko linije 2. Iznervirani student e ovla bacivi pogled na
program verovatno ovako razmiljati:
- Ma ta sada nije dobro?
- Sve sam uneo kako je profa rekao.
dolar$
nedozvoljen karakter $
500S
prvi karakter mora biti slovo
_cica_
prvi karakter mora biti slovo
duuuuuuugaaaaaaackkkkkkkkkooooooooo ima vie od 31 karakter
Kako je na prvi program bio besmislen sada emo da reimo neto smisleno. Evo ga
jednostavan numeriki problem.
PRIMER: Izraunati pritisak nekog gasa, P po SRK jednaini stanja za zadatu
temperaturu T i molsku zapreminu v. Pritisak se rauna po izrazu
RT
a
P=
v b v (v + b)
gde su:
R = 0.08206 - univerzalna gasna konstanta
T = 300
- temperatura
v = 2.5 - molska zapremina
Parametri a i b se raunaju kao:
(R Tc )2 , b = 0.08664 R Tc
a = 0.42747
Pc
Pc
Parametar se rauna kao
0.5
= [1 + m (1 Tr )]2
1 program P2
2 real :: R,T,v
3 real :: Tc,Pc,omega
4 real :: a,b,m,Tr,alfa,P
5 R = 0.08206
6 T = 300
7 v = 2.5
8 Tc = 304.2
9 Pc = 72.9
10 omega = 0.225
11 a = 0.42747*(R*Tc)**2/Pc
12 b = 0.08664*R*Tc/Pc
13 m = 0.48508+1.5517*omega-0.1561*omega**2
14 Tr = T/Tc
15 alfa = (1+m*(1-Tr**0.5))**2
16 P = R*T/(v-b)-alfa*a/(v*(v+b))
17 print*, "P=",P
18 endprogram P2
Deluje komplikovano ali uzmite u obzir da ete ovo jednom ukucati (kasnije samo malo
korigovati) i setite se koliko bi ste bockali u kalkulator da morate sto puta ponoviti
proraun. Zapamtiete ovaj fajl pod imanom npr. drugi.f95. Ako ste korektno uneli
prethodni tekst, pri startovanju emo dobiti na ekran:
P= 9.3810558
Press any key to continue . . .
to daje vrednost pritiska od 9.3810558 i kae vam se da pritisnete bilo koju tipku za
nastavak (obino razmaknica - najdua tipka na tastaturi). Ako pritisak ne dobijete "iz
prve" verovatno ste pogreili pri unosu. Otklonite greke dok ne dobijete traeni rezultat.
Ako vam je za utehu, i ja sam pogreio nekoliko puta pri unosu teksta programa.
Da razjasnimo ovaj program pod imenom P2. Sada emo objasniti osnovne
koncepte. Probajte ovo da usvojite jer u tom sluaju ne bi trebalo da imati veih problema
u daljem izlaganju. Za sada emo preskoiti linije 2-4 i krenuti od linije 5. Ovde je prva
ozbiljnija stvar a to je naredba dodeljivanja. Lii na "jednako" iz matematike. Linije 5-10
su dodeljivanja brojnih vrednosti odgovarajuim veliinama. Nako bi pitao: "ta je sa
indeksom kod Tc i Pc tj. zato se pie Tc i Pc i zato nismo uneli grko slovo nego
smo uneli omega". Ova imena predstavlaju identifikatore odgovarajuih veliina
(pogledajte pravila o identifikatorima). Nema indeksa ili eksponenta i nema grkih slova
(a bogami ni naih) u identifikatorima. S druge strane znaka = su brojne vrednosti i unose
se onako kao to smo u matematikom jeziku navikli (0.08206, 300, 2.5 itd.), jedino
zapazite da je taka separator decimala a ne zarez.
Da malo uvedemo nove pojmove. U linijama 5-10 veliine sa leve strane znaka
jednako sa nazivaju promenljive a sa desne strane su eksplicitne konstante (u ovom
sluaju numerike) pa se u optem sluaju dodeljivanje vrednosti eksplicitne konstante
promenljivoj pie kao:
promenljiva = eksplicitna_konstanta
Znaenje
Sabiranje
Oduzimanje
Mnoenje
Deljenje
Eksponent
Operator (unarni)
-
Znaenje
Promana znaka
Binarnom operatoru treba dva operanda (sa leve i desne strane) dok unarnom
operandu treba jedan operand (sa desna strane). Kada su operatori zadati uzastopno onda
se, kao i u matematici, potuje prioritet operatora pri emu je prioritet isti kao u
matematici. Prioritet se iskljuivo menja malim zagradama (nema srednjih ili velikih
zagrada)
Operator
**
*,/
- unarni
-,+
Prioritet
Najvii
Najnii
Ako pogledate na primer, izraz sa desne strane naredbe dodeljivanja (linija 11)
0.42747*(R*Tc)**2/Pc
Da li je to ono to smo i hteli? Jeste. Na kraju se rezultat ovog izraza (pogledati liniju 11)
dodeljuje promenljivoj a. Ako paljivije posmatrate izraze primetiete da najveu panju
morate posvetiti zagradama i operatoru deljenja (ta je u brojioci, ta je u imeniocu).
Znai korigovana naredba dodeljivanja vrednosti promenljivoj je
promenljiva = izraz
i kae se da se prvo izraz sa leve strane znaka = izrauna i onda se ta vrednost dodeljuje
promenljivoj sa desne strane. Uvek emo pod pojmom izraz podrazumevati neto to
vraa rezultat. Naravno, najjednostavniji izraz je ba eksplicitna konstanta. Ova primena
karaktera jednako poetnicima pravi problema. Ve sam nekoliko puta pomenuo da to ne
znai da je leva strana jednaka desnoj. Neki programski jezici s toga koriste drugaije
karaktere, ili operatore za dodelu vrednosti promenljivoj. Na primer, := ili <- ili ak :
itd.
promenljiva := izraz
promenljiva <- izraz
promenljiva : izraz
Ako je izraz malo komplikovaniji to je linija sve dua i unos podloniji grekama.
Pogotovo ako niste trenirali kako se unose izrazi (moe vam ak posluiti i TV slagalica i
igra Moj broj). Meutim, postoji nain da se ove greke svedu na najmanju moguu
meru. Pogledajte na primer liniju 16 za dodeljivanje promenljivoj P vredosti izraza sa
desne strane znaka =.
P = R*T/(v-b)-alfa*a/(v*(v+b))
P=R
T
a
vb
v (v + b)
Izraz je isti (nadam se da se slaete) kao i prethodo naveden. Malo smo utedeli na
zagradama. Do sada se moe fiktivno prihvatiti da se matematiki i programski jezik ne
razlikuju puno osim u nainu pisanja izraza. Ja sam vam rekao da to u principu nije tano.
Znak jednako (=) u matematikom smislu znai da je leva strana jednaka desnoj a u
programerskom da se izraz sa desne strane prvo izrauna pa se ta vrednost dodeljuje
promenljivoj sa leve strane. Da zabuna bude vea napisaemo dodelu vrednosti
promenlivoj P u vie linija.
16 P = R*T/(v-b)
17 P = P -alfa*a/(v*(v+b))
Naravno, rezultat e biti isti. Najvea zavrzlama do sada. Linija 16 bi kako tako mogla da
proe u matematici ali linija 17, nikako. P je i sa leve i sa desne strane znaka =. Da
ponovimo, ovo ne znai da je leva strana jednaka desnoj nego smo izraz podelili na dva
dela. Prvo je promenljiva P dobila vrednost dela izraza (linija 16). Posle toga ta vrednost
figurie u liniji 17. Stara vrednost P se brie pa P postaje ono to smo hteli. To je mogue
zbog toga to se prvo izrauna vrednost izraza pa onda se vri dodela vrednosti
promenljivoj. Ako vas to buni moete uvesti nove promenljive i napisati neto ovako
16
17
18
19
20
Pgore1 = R*T
Pdole1 = v-b
Pgore2 = alfa*a
Pdole2 = v*(v+b)
P = Pgore1/Pdole1 - Pgore2/Pdole2
Malo smo ga preterali ali moe i tako, ako vam vie odgovara. Zapazite redosled naredbi,
koji je vrlo bitan. Naredbe se izvravaju u normalnom redosledu, odozgo nadole.
Naravno, ne moram da spominjem da morate biti naisto sa razlomcima. Ako jeste, nee
vam biti problem da prihvatite ovo izraunavanje P
P = R*T/(v-b)-alfa*a/v/(v+b)
Eto to vam je pojam promenljive. Moe imati razliite vrednosti. Kada ve ima neku
vrednost sledea naredba dodeljivanja brie tu vrednost i promenljiva se promeni u
skladu sa naredbom dodeljivanja. Pogledajte sledei deo nekog programa:
...
10
11
12
13
14
15
...
cica
cica
cica
cica
cica
cica
=
=
=
=
=
=
1
cica
cica
10
cica
cica
+ 5
+ 1
+ 5
+ 1
10
Koju vrednost promenljiva cica ima posle linije 15? Odgovor je 16. Evo jednog pitanja
koje esto postavim studetima. Da li je u F-u ova naredba ispravna? Ako jeste, zato jeste
ako nije zato nije?
cica + 5 = cica
11
Tip real predstavlja realne brojeve i moe biti predstavljen na dva naina. Sa fiksnom
decimalnom takom ili u eksponencijalnom zapisu. Zapis realne konstante sa fiksnom
decimalnom takom je oblika +/-xxx.yyyyy gde je xxx celobrojni deo a yyyy
decimalni deo, npr. realne eksplicitna konstant u zapisu sa fiksnom decimalnom takom
su:
3.789
-167.22
0.0056
Tip complex predstavlja prikaz kompleksnih brojeva a+bi gde su a,b- realni brojevi , iimaginarna jedinica. U F-u se kompleksan broj prikazuje u obliku para realnih brojeva
(a,b) na primer
(2.4,1.0e-3)
(-5.3,3.8)
12
za tano
za netano
13
4.0*3= 12.0000000
2**8= 256
2.0**8=
2.5600000E+02
2**8.0=
2.5600000E+02
3/2= 1
3.0/2=
1.5000000
3/2.0=
1.5000000
Press any key to continue . . .
Primetite veoma bitnu stvar. Rezultati su korektni u svim sluajevima osim kod deljenja.
Deljenje nije definisano na celim brojevima pa ete kao rezultat 3/2 dobiti 1. To nije
korektan rezultat jer su oba operanda celobrojna pa i rezultat mora biti celobrojan, tako
da je raunar kao rezultat usvojio celobrojni deo tanog rezultata. Iz ovog primera vidite
da je npr. 4 celobrojna konstanta a 4.0 realna konstanta
Naredba print
gde naredba prikazuje rezultate izraza na ekran. Izrazi naravno mogu biti samo konstante
ili samo promenljive. Pogledajte program tipovi. Svaka print naredba ima dva izraza.
Prvi lan je izraz je tekstualna konstanta. Njen rezultat je niz karaktera izmeu
navodnika. Drugi lan je izraz koji se prethodno izrauna i rezultat izraza se prikae na
ekran. Na isti nain je napisana i naredba 17 u naem programu P2. Ako u programu
korigujete liniju 17 i napiete:
17 print*, "Na T=",T," i v=",v," pritisag gasa je P=",P
Ako vam se ne svia moete uticati na nain prikaza na ekran. Korigujte prethodnu liniju
17 na sledei nain:
17 print "(a,f5.1,a,f8.5,a,f10.3)","Na T=",T," i v=",v," P=",P
Zvezdica (*) u naredbi print kae da se sam raunar snae i prikae rezultate izraza
kako je u F-u ugraeno, tako da mi ne razmiljamo puno o formatu izlaza. Ako umesto
zvezdice pod navodnicima stavimo tzv. niz karaktera koji predstavljaju format izlaza
onda e se izrazi prikazati u tom formatu. To su oznake za format razdvojene zarezima.
Oznake za format mogu biti
14
15
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Gde parameter tzv. jedan od atributa tipa promenljive (ima ih vie) i ukazuje na to da
se deklarie imanovana konstanta a Lista_dodele ima oblik
Ime1 = vrednost1, Ime2 = vrednost2 , Ime3 = vrednost3
Pri tome je vrednost definisana kao eksplicitna konstanta. Evo jo nekih konkretnih
primera:
integer, parameter :: LENGTH=12
16
Dobra preporuka je da, na primer, imena svih imenovanih konstanti budu od velikih
slova. Sada se moe neko zbuniti. Da li je to imenovana konstanta promenljiva ili
konstanta? U kom zecu lei grm? Imenovana konstanta ima ime i vrednost, kao i
promenljiva, ali za razliku od promenljive ta se vrednost dobija pri deklarisanju i ne moe
se kasnije menjati. Ako bi ste, sluajno ili namerno, uneli u program P3 liniju 18 na
sledei nain
18 R = 8.315
!Ludolfov broj
!Univerzalna gasna konstanta
kada program koji se izvrava (redom poevi od prve linije pa nadalje) doe do te linije
zaustavie svoje izvravanje i na ekranu ete videti ovako neto:
T=
_
17
Prikaz T= je zahvaljujui naredbi print* u liniji 21. Program je sada kod linije 22 i
ekae da neto unesete sa tastature. ta sad da unesemo? Pa to znamo iz linije 22
programa. Iza zareza je ime promenljive tj. T koje je deklarisana kao realna promenljiva.
Tako da se sada oekuje da unesemo eksplicitnu konstantu. Vrednost te konstante e biti
dodeljena promenljivoj T. Moemo uneti, na primer
T=
300_
i posle toga potvrditi unos tipkom ENTER. Zapazite da nismo uneli 300.0 iako je T
realna promenljiva. To nije problem jer e F izvriti konverziju celobrojne eksplicitne
konstante u realnu vrednost i ta vrednost biti dodeljena promenljivoj T. Posle tipke
ENTER na ekranu e biti
v=
_
v=
2.5_
i naravno posle pritiska na ENTER dobijamo konano na ekran rezultat sledea naredbe
print a to je linija 35.
T=
300
v=
2.5
Na T=300.0 i v= 2.50000 P=
9.381
Press any key to continue . . .
Dobra je praksa (usvojite to kao ablon) da pre svake naredbe read naredbom print,
koja prikazuje samo tekstualnu konstantu, objasnite ta treba da unesete. Da se ne naete
pred raunarom koji eka, a vi ne znate ta sad treba da radite. U tom sluaju studenti
pitaju:"A kako se ovo zaustavlja?". Program se nasilno zaustavlja kombinacijom tipki
CTRL-C.
Opti oblik naredbe read je
read*,ime1,ime2,...,imen
koja kazuje da e se program kod ove naredbe zaustaviti i oekivati unos n eksplicitnih
konstanti razdvojene zarezima. Unos se potvruje sa tipkom ENTER. Posle toga e te
18
kada se startuje, program se zaustavlja kod linije 7. Oekuje se unos tri eksplicitne realne
(ili celobrojne) konstante, razdvojene zarezom. Unesite
1,5,8
i potvrdite tipkom ENTER. Tada se opet program zaustavlja kod sledee read naredbe,
linija 8. Oekuje dve vrednosti. Unesite
9,5
Program se neto buni. U emu je problem? Uneli smo tri eksplicitne konstante kao to i
oekuje i to su 1108 , 10.3 i 100. ta ne valja? Ne valja to to se eksplicitna konstanta
1108 ne predstavlja kao 1.0*10^8 nego kao 1.0e-8 (to smo ve rekli). Ponovimo
unos
1.0e-8,10.8,100
19
10,20
9.9999999E-09 10.8000002
1.0000000E+02 10 20
Press any key to continue . . .
ta se to sad desilo? Vrednosti koje smo uneli i njihov prikaz na ekran bi trebalo da su
isti. Jeste da su poprilino bliske, ali nisu iste. Neemo se baviti tzv. preciznou
prezentacije realnog broja u raunaru i prihvatiemo da je ovo dovoljno tano.
Standardne ugraene numerike i matematike funkcije
20
ili
print*,log10(100)
i
print*,log10(100.0)
apsolutna vrednost
celobrojni deo od x
maksimalna vrednost
minimalna vrednost
pretvaranje x u realan
21
Matematike:
acos(x)
asin(x)
atan(x)
atan2(y,x)
cos(x)
cosh(x)
exp(x)
log(x)
log10(x)
sin(x)
sinh(x)
sqrt(x)
tan(x)
Ako pogreite tip argumanta ovih funkcija (realan ili celobrojan) F e vas uredno o tome
opomenuti. Unesite ovaj program pa se malo pozabavite rezultatima i obnovite vae
znanje iz elemenatrnih matematikih funkcija. Slobodno korigujte tj. igrajte se ovim
programom.
1 program funkcije
2 real,parameter :: pi=3.14
3 real :: x,x1,x2,x3,z
4 integer :: y
5
6 x = 10.6
7 y = 5
8 z = 1.0
9 x1 = 10.2
10 x2 = 20.8
11 x3 = 30.1
12
13 !Numericke funkcije
14 print*,abs(x)
!apsolutna vrednost
15 print*,int(x)
!celobrojni deo
16 print*,max(x1,x2,x3)
!maksimalna vrednost
17 print*,min(x2,x2,x3)
!minimalna vrednost
18 print*,real(y)
!pretvaranje u realan broj
19
20 !Matematicke funkcije
21 print*,acos(z)
!arkus kosinus
22 print*,asin(z)
!arkus sinus
23 print*,atan(z)
!arkus tanges
24 print*,atan2(z,1.0)
!arkus tanges od y/x
25 print*,cos(0.0)
!kosinus ugla
26 print*,cosh(z)
!kosinus hiperbolicni
27 print*,exp(z)
!e**x
28 print*,log(z)
!ln x (prirodni logaritam)
22
29
30
31
32
33
34
35
36
37
38
39
40
41
print*,log10 (z)
print*,sin(pi/2)
print*,sinh(z)
print*,sqrt(z)
print*,tan(pi/4)
log p 0 = A
B
T C
gde su:
A=
B
Tb C
1.05 (Tb C ) 2 H b
B=
2
R Tb ln 10
C = 18 + 0.19 Tb
Potrebni podacu su:
R = 8.315
- univerzalna gasna konstanta
- normalna temperatura kljuanja
Tb = 357.3
Hb = 31485 - latentna toplota isparavanja
Ako se pogleda ovaj primer uoava se da nam je sve zadato, osim temperature T.
Temparturu emo uneti sa tastature i neka njena vrednost bude T = 500. Evo reenja:
23
1 program P4
2 !Proracun napona pare tiofena po
3 !Cox-Antoine jednacini
4
5 real,parameter :: R = 8.315
6 real
:: P0,T
7 real
:: Tb,deltaH
8 real
:: A,B,C
9
10 !Zadati podaci za tiofen
11 Tb = 357.3
12 deltaH = 31485
13
14 !Unos temperature T
15 print*,"T = "
16 read*,T
17
18 !Parametri A,B,C
19 C = -18 + 0.19*Tb
20 B = 1.05*(Tb - C)**2*deltaH
21 B = B/(R*Tb**2*log(10.0))
22 A = B/(Tb - C)
23
24 !Napon pare p0
25 p0 = A - B/(T - C)
26 p0 = 10**p0
27 print*,"p0 = ",p0
28 endprogram P4
Kada startujete program dobiete na ekranu zahtev za unos temperature. Unesite 500 i
pritisnite enter. Onda ete na ekranu videti sledee:
T =
500
p0 = 20.8054504
Press any key to continue . . .
Pogledajte linije 25 i 26. Kako nam u izrazu za napon pare nije dato eksplicitno kako se
rauna p0 nego log p0 studenti poetnici ponekad ovo napiu ovako
25 log10(p0) = A - B/(T - C)
26 p0 = 10**log(p0)
24
25
If na engleskom znai ako a then znai onda dok else znai inae. Primetite da je if
poetak ove strukture a endif zavretak. I ta kae ova if struktura. Razmatraju se izbori
izbor_1, izbor_2,... redom i kada je prvi od tih izbora taan onda se izvrava
odgovarajua odluka. Najjednostavnija if struktura je ona koja ima samo if i endif
odnosno.
if (izbor) then
odluka
endif
Sada kada smo shvatili da se samo jedna odluka izvrava u zavinosti od izbora pitanje je,
ta je u F-u izbor a ta odluka. U if strukturi izbor predstavlja logiki izraz a
odluka predstavlja niz instrukcija koje se izvravaju ako je logiki izraz taan. ta
je to logiki izraz? Ako pogledate koji su osnovni tipovi promenljivih u F-u videete i tip
logical. Taj tip ima samo dve vrednosti. Logiki izraz je kombinacija logikih
konstanti, logikih promenljivih, logikih operatora i logikih funkcija. Naravno, logiki
operatori i funkcije daju kao rezultat logiku vrednost, odnosno tano (.true.) ili
netano (.false.).
Logiki relacioni operatori
Znaenje
manje
manje ili jednako
vee
vee ili jednako
jednako
razliito
Ovo operatori realizuju operatore Bulove algebre i u F-u postoje sledei operatori.
.not.
.and.
.or.
.eqv.,.neqv.
najvii
najnii
26
Piu se sa dva do tri slova izmeu taaka. Prioritet je naveden u tabeli. Tabela istinitosti
ovih operatora je sledea.
Tabela istinitosti
x
y
.not.x
T
T
F
T
F
F
F
T
T
F
F
T
x.and.y
T
F
F
F
x.or.y
T
T
T
F
x.eqv.y
T
F
F
T
x.neqv.y
F
T
T
F
Treba biti obazriv jer operandi logikih operatora su logike a ne numerike vrednosti.
Mogu li se kombinovati svi navedeni operatori u logikom izrazu? Mogu, ali treba imati
u vidu njihove prioritete. Meusobne prioritete smo pominjali a ako se uzmu svi operatori
u obzir, onda je redosled sledei: aritmetiki, relacioni, Bulovi. Naravno, uvek moete
koristiti male zagrade za promenu prioriteta operatora. Sada pogledajte navedene primere
ispravnih logikih izraza i odredite gde su zagrade nepotrebne a kod neispravnih izraza
odredite zato su neispravni.
Sada kad pogledamo F program P4 vidimo da on rauna napon pare samo za
tiofen za razliite temperature (unosimo ih sa tastature). ta ako nas interesuje da to
raunamo za razliite supstance. Tada ova metoda kae da proraun parametra C zavisi
od date supstance po sledeem izrazu
0.3 + 0.34 Tb za Tb < 125
C=
18 + 0.19 Tb za Tb 125
pa emo malo prepraviti na program.
1
2
3
4
5
6
program P5
!Proracun napona pare po
!Cox-Antoine jednacini
real,parameter
real
:: R = 8.315
:: P0,T
27
7 real
:: Tb,deltaH
8 real
:: A,B,C
9 character(len=30) :: ime_supstance
10
11 !Karakteristicni podaci za supstancu
12 print*,"Supstanca = "
13 read*,ime_supstance
14 print*,"Tb = "
15 read*,Tb
16 print*,"dHb = "
17 read*,deltaH
18
19 !Unos temperature T
20 print*,"T = "
21 read*,T
22
23 !Parametri A,B,C
24 if (Tb<125) then
25
C = -0.3 + 0.34*Tb
26 else
27
C = -18 + 0.19*Tb
28 endif
29 B = 1.05*(Tb - C)**2*deltaH
30 B = B/(R*Tb**2*log(10.0))
31 A = B/(Tb - C)
32
33 !Napon pare p0
34 p0 = A - B/(T - C)
35 p0 = 10**p0
36 print*,"Supstanca = ",ime_supstance
37 print*,"p0 = ",p0
38 endprogram P5
28
p0 = 20.8054504
Press any key to continue . . .
if (Tb<125) then
C = -0.3 + 0.34*Tb
else
C = -18 + 0.19*Tb
endif
to i nije neki problem, ali ako imate vie linija izmeu if , elseif i else bie malo
tee da se snaemo. U optem sluaju je veoma preporuljivo nazubljivati program
naroito kada su strukture u pitanju. Pogotovo je problem kada i blokovi naredbi sadre
druge if strukture to moe biti veoma est izvor greaka. U tom smislu pogledajmo, na
primer, jedno od naina za reavanje poznate nam kvadratne jednaine
Kvadratna jednaina
ax 2 + bx + c = 0
gde se a,b,c koeficijenti a x nezavisno promenljiva. Ova jednaina ima sledee
reenja, tj. korene
b b 2 4ac
2a
Evo ta smo odluili da uradimo u ovom sluaju:
1. Treba definisati da koeficijent a mora biti razliit od 0 jer u protivnom se ne radi o
kvadratnoj jednaini.
2. Ako je
b 2 4ac > 0
onda su koreni realni i razliiti
3. Ako je
b 2 4ac = 0
onda su koreni realni i dvostruki tj.
b
x=
2a
4. Ako je
b 2 4ac < 0
onda su koreni razliiti i kompleksni
x=
29
1 program kv_jedn
2 real :: a,b,c,D
3 real :: x,x1,x2
4
5 print*, "Uneti a uz x**2"
6 read*,a
7 print*, "Uneti b uz x"
8 read*,b
9 print*, "Uneti c"
10 read*,c
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
if (a/=0) then
D = b**2-4*a*c
if (D>0) then
x1 = (-b + sqrt(D))/(2*a)
x2 = (-b - sqrt(D))/(2*a)
print*,"Koreni su:"
print*,"x1=",x1
print*,"x2=",x2
elseif (D==0) then
x = -b/(2*a)
print*,"Koreni su realni i dvostruki:"
print*,"x=",x
else
print*,"Koreni su kompleksni"
endif
else
print*,"Nije kvadratna jednacina!"
endif
endprogram kv_jedn
program kv_jedn
real :: a,b,c,D
real :: x,x1,x2
print*, "Uneti a uz x**2"
read*,a
print*, "Uneti b uz x"
read*,b
print*, "Uneti c"
30
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
read*,c
if (a/=0) then
D = b**2-4*a*c
if (D>0) then
x1 = (-b + sqrt(D))/(2*a)
x2 = (-b - sqrt(D))/(2*a)
print*,"Koreni su:"
print*,"x1=",x1
print*,"x2=",x2
elseif (D==0) then
x = -b/(2*a)
print*,"Koreni su realni i dvostruki:"
print*,"x=",x
else
print*,"Koreni su kompleksni"
endif
else
print*,"Nije kvadratna jednacina!"
endif
endprogram kv_jedn
31
Ovaj program trai unos tri cela broja:broj, donja, gornja i ispituje da li je broj isti kao i
donja, da li je broj isti kao i gornja, da li je broj u intervalu [donja,gornja] ili je van
intervala. Hajdemo sada da to isto malo popravimo i napiemo drugaije.
program egzibicije_2
integer :: broj, donja, gornja
print*,"broj = "
read*,broj
print*,"donja = "
read*,donja
print*,"gornja = "
read*,gornja
if (donja >= gornja) then
print*,"Ne valjaju granice"
else
if(broj == donja) then
print*,"Broj je na donjoj granici"
endif
if (broj == gornja) then
print*,"Broj je na gornjoj granici"
endif
if (broj < donja) then
print*,"Broj je ispod donje granice"
elseif (broj > gornja) then
print*,"Broj je iznad gornje granice"
else
print*,"Broj je u zadatom intervalu [donja,gornja]"
endif
endif
endprogram egzibicije_2
Morate se sloiti da se iz ove druge verzije mnogo jasnije vidi ta program radi. Moete
to jo malo uiniti itljivijim jer F doputa ovako neto
32
if (izbor) odluka
u sluaju da je odluka samo jedna naredba. Tako bi trea verzija ovog programa mogla
biti ovakva.
program egzibicije_3
integer :: broj, donja, gornja
print*,"broj = "
read*,broj
print*,"donja = "
read*,donja
print*,"gornja = "
read*,gornja
if (donja >= gornja) then
print*,"Ne valjaju granice"
else
if (broj == donja) print*,"Broj je na donjoj granici"
if (broj == gornja) print*,"Broj je na gornjoj granici"
if (broj < donja) then
print*,"Broj je ispod donje granice"
elseif (broj > gornja) then
print*,"Broj je iznad gornje granice"
else
print*,"Broj je u zadatom intervalu [donja,gornja]"
endif
endif
endprogram egzibicije_3
do struktura
naredbe
enddo
Koja kae de se sve naredbe izmeu do i enddo ponavljaju. Evo jednog primera gde
emo ovo da probamo
33
1 program pranjekose
2
do
3
print*,"Nasamponiraj"
4
print*,"Isperi"
5
enddo
6 endprogram pranjekose
Ako ovaj program unesete i startujete videete da e ispred vas leteti neki tekst,
nasluujete da se stalno ponavlja tekst Nasamponiraj i Isperi, tj. da se naredbe u
linijama 3 i 4 stalno ponavljaju ali se program ne zaustavlja. Moete da ekate koliko god
hoete ali ovo nee da se zaustavi. Ovo se zove beskonana petlja. Po anegdoti je rasejani
programer proitao na uputstvu za ampon (Naamponiraj, Isperi, Ponovi) i verovatno bi
dobio zapaljenje plua dok ga prijatelj nije izvukao iz kupatila. ta mi tu sad da radimo.
Moramo "nasilno" da zaustavimo program, a to se radi kombinacijom tipki CTRL+C.
Ako elimo da neke naredbe ponovimo odreen broj puta, na primer da pranje kose
ponovimo 3 puta korigovaemo prethodni program na sledei nain
1 program pranjekose1
2 integer :: i
3
do i=1,3
4
print*,"Nasamponiraj ",i
5
print*,"Isperi ",i
6
enddo
7
print*," Gotovo, uzmi fen i osusi kosu"
8 endprogram pranjekose1
Primetite razliku jer smo iza do dodali i=1,3. Ovo je kontrola petlje i u optem obliku ima
izgled
promanljiva = izraz1,izraz2,izraz3
34
do
do
do
do
do
do
do
do
do naredba
i = 1,10
j = 20, 50, 5
p = 7, 19, 4
q = 4, 5, 6
r = 6, 5, 4
x = -20,20, 6
n = 25, 0, -5
m = 20, -20, -6
broj ponavljanja
10
7
4
1
0
7
6
7
kontrolna promenljiva
1,2,3,4,5,6,7,8,9,10
20,25,30,35,40,45,50
7,11,15,19
4
(6)
-20,-14,-8,-2,4,10,16
25,20,15,10,5,0
20,14,8,2,-4,-10,-16
esta greka je koritenje kontrolne promenljive petlje van petlje u kojoj se koristi. Evo
nae namere da nesretnom programeru i kaemo koliko je puta oprao kosu
1 program pranjekose2
2 integer :: i
3
do i=1,3
4
print*,"Nasamponiraj ",i
5
print*,"Isperi ",i
6
enddo
7
print*,"Oprao si kosu ",i," puta"
8
print*," Gotovo, uzmi fen i osusi kosu"
9 endprogram pranjekose2
Pa zato je to tako. Kontrolna promenljiva petlje i u petlji ima vrednost 1,2,3 jer je
poetna vrednost 1 krajnja 3 i korak je 1. Kada vrednost i dostigne veu vrednost od 3 (u
35
Svaka naredba se izvrava samo jednom i zakljuite zato je izlaz na ekran ba ovakav
Unesi broj 1
7
Unesi broj 2
-1
Unesi broj 3
3
Unesi broj 4
-4
Suma s=
5.0000000
Press any key to continue . . .
36
Malo je "ogranieno" jer smo ovde sabrali samo 4 broja. ta ako hoemo da
saberemo jednom 3 drugi put 10 a trei put 30 brojeva? Primetite da se odreen broj
naredbi ponavlja. Kad se ponavljaju odreene naredbe, eto nama do strukture. Evo ga
reenje prethodnog problema ali sada nismo ogranieni na 4 broja nego emo sa tastature
uneti koliko god brojeva hoemo da saberemo (promenljiva n).
1 program suma
2 integer :: i,n
3 real :: broj,s
4
5 print*,"Koliko cemo brojeva uneti n="
6 read*,n
7
8 s = 0.0
!Sumi dodeljujemo vrednost 0.0
9
10 do i=1,n
11
print*,"Unesi broj ",i
12
read*,broj
13
s = s + broj
14 enddo
15
16 print*,"Suma s=",s
17 endprogram suma
37
naredba stop
Program nema neku svrhu jedino vam ukazuje kako da, na primer, kontroliete ta je
uneto sa tastature i daje vam ideju kako da to koristite u vaim programima.
naredba exit
Ako elimo ipak da damo ansu onom ko unosi vrednosti sa tastature da se popravi
moemo korististi beskonanu do petlju i naredbu exit koja slui za izlaz iz do petlje
(beskonane ili kontrolisane). Evo da vidimo kako to funkcionie
1 program kontrola_unosa_1
2 integer :: a,b
3
4 print*,"Unesite a i b, a<b"
5
6 do
7 print*,"Pocetak petlje"
8
print*,"a="
9
read*,a
10
print*,"b="
11
read*,b
38
12
13
if (a<b) then
14
exit
15
endif
16
17
print*,"Pogresan unos, ponovite"
18
print *,"Kraj petlje"
19 enddo
20
21 print*,"Dobro je, idemo dalje"
22
23 endprogram kontrola_unosa_1
U ovom programu postoji beskonana do petlja (linije 6-19). Unutar te petlje je naredba
exit koja e usloviti izlaz iz ove petlje, tj. nastavak programa iza linije 19. Meutim, do
izlaska iz petlje emo doi samo ako je uslov u liniji 13 zadovoljen, u protivnom e se
program nastaviti od linije 17. To smo i hteli zar ne? Evo rezultata kada smo startovali
ovaj program:
Unesite a i b, a<b
Pocetak petlje
a=
3
b=
2
Pogresan unos, ponovite
Kraj petlje
Pocetak petlje
a=
2
b=
3
Dobro je, idemo dalje
Press any key to continue . . .
naredba cycle
39
6 do
7 print*,"Pocetak petlje"
8
print*,"a="
9
read*,a
10
print*,"b="
11
read*,b
12
13
if (a>=b) then
14
print*,"Pogresan unos, ponovite"
15
cycle
16
endif
17
18
print *,"Kraj petlje"
19
exit
20 enddo
21
22 print*,"Dobro je, idemo dalje"
23
24 endprogram kontrola_unosa_2
Primetite da dok god je uslov u liniji 13 zadovoljen program se vraa na liniju 7. Ova dva
primera kontrole unosa imaju za cilj da vam razjasne kako funkcioniu naredbe exit i
cycle. Dobro ih prouite i pokuajte da odgovorite na pitanje ta e se desiti ako startujete
ovaj program koji predstavlja "malko" korigovan prethodni program.
1 program kontrola_unosa_3
2 integer :: a,b
3
4 print*,"Unesite a i b, a<b"
40
5
6 do
7 print*,"Pocetak petlje"
8
print*,"a="
9
read*,a
10
print*,"b="
11
read*,b
12
13
if (a>=b) then
14
print*,"Pogresan unos, ponovite"
15
endif
16
cycle
17 print *,"Kraj petlje"
18 enddo
19
20 print*,"Dobro je, idemo dalje"
21
22 endprogram kontrola_unosa_3
Kao to je ve reeno i kako smo videli u prethodnim primerima unutar jedne if ili do
strukture mogu biti druge if ili do strukture. Ovo je est izvor greaka . Kako smo mi to
do sada lepo "nazubljivali" program vidi se gde je poetak a gde kraj strukture. Ako
unesete, na primer, ovaj program
1 program strukture_neispravno
2 integer :: i,j
3 real :: a,b
4
5 do i=1,3
6
print*, "a="
7
read*,a
8
do j=1,4
9
print*, "b="
10
read*,b
11
if (a<b) then
12
print*,a+b
13
else
14
print*,a-b
15
enddo
17 enddo
18
19 endprogram strukture_neispravno
41
42