You are on page 1of 42

Programki jezik F

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).

Sintaksne greke se odnose na strukturu programa i pravila za unos programa. Na


primer, u srpskom jeziku reenica mora poeti velikim slovom i zavravati takom. ova
reenica ima sintaksnu greku. A bogami i ova Za veinu italaca par sintaksnih greaka
(ovde ih zovemo tamparske) ne predstavljau neki problem. Verovatno moete da
proitate ovo moje pisanije i da ga razumete uprkos mojim sintaksnim grekama (mislio
sam na tekst, ne na sarinu). Meutim F, kao i ostali programski jezici, nije tako
tolerantan. Kada se pokua pokrenuti F program (videemo kako) raunar ga nee
pokrenuti i prijavite greku, ako postoji bar i jedna sintaksna greka. Poetnici najee
u poetku puno vremena koriste na otklanjanje sintaksnih greki. Sa iskustvom se prave
sve manje sintaksne greke i bre se pronalaze.
Greke u toku izvoenju programa se mogu pojaviti, a ne moraju. Pojavljuju se
kada se u programu izvrava neto "loe". Na primer, ako se deli sa nulom ili ako se trai
od raunara da izrauna logaritam negativnog broja itd.
Semantike greke su one greke koje ine da program koji ste napisali nije onaj
koji ste hteli da napiete. Semantika greka ovog teksta bi bila da vi ne razumete sadraj
ovog teksta tj. "ta je pesnik hteo da kae" (to je najverovatnije i tako). Studenti kada
pokrenu program, ubace neke podatke, program neto izrauna i zavri rad, oekuju da je
posao zavren. Pa, boe moj "Program radi!!!". Meutim, ako pogledaju rezultate
prorauna dobijaju na primer ovako neto:
.
.
Izraunata temperatura je: -5000 K
Brzina kugle za bilijar je: 10 250 000 km/s
.
.
to bi rekao Marfi:"Ne radujte se ako program radi, ionako rezultati nisu
ispravni". Verovatno niko pri zdravoj pameti se ne bi raspravljao da li su ovo korektni
rezultati ili ne. Ako su ulazni podaci za proraun korektni, onda neto tu ne tima.
Napravljena je semantika greka. No, ne dajte se obeshrabriti. Mora se pogledati
program i videti kako se dolo do ovih rezultata. Moda je neto sabrano a treba oduzeti
itd.
Retko kada program ispravno proradi "iz prve", izuzev ekstremno jednostavnih
programa. Iako otklanjanje greaka moe biti frustrirajue (pogotovo za studente
poetnike) ovo otklanjanje greaka ponekad lii na detektivski posao. Imate sluaj i
tragove i morate da reite zato se to desilo. Dobijate ideju pa probate ponovo, ali vidite
da ste pogreili. Ponavljate sa novim idejama dok ga ne reite. Na sreu (ili na alost) mi
emo se baviti jednostavnim primerima gde Mister Poaro sa njegovim sivim elijama nije
preko potreban. Pisanje programa i otklananje greaka za neke je ista stvar. Krenete od
jednostavnog programa koji ispravno radi, neto modifikujete, vidite da ste pogreili,
otklonite greku, opet program ispravno radi, opet neto modifikujete itd. Jedini nain da
to manje greite je pisanje, pisanje i samo pisanje programa. Neete nauiti da
programirate u F-u (ili to je jo gore, neete poloiti ispit) samo itajui ovaj tekst.
Morate da budete radoznali i da koristite analizu BBKBB (ta Bi Bilo Kad Bi Bilo).

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

Illegal character '''


syntax error
Illegal character '''
found by pass 1]

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.

Eto opet sam startovao i ista greka.


Kako su ovi raunari glupi! 'ajde da pozovem profu i da vidim ima li on neto
pametno da kae.
Profa doe i pogleda program i moda ne vidi iz prve, ali pouen ranijim iskustvom vidi
de je student umesto jednog znaka za navodnike koristio dva znaka za apostrof. To F ne
tolerie. Student e odgovoriti:"Ja sam misilio da je to isto". Naravouenije Ako odmah
ne vidite greku, nemojte se predavati. Popijte kafu, odmorite se i videete je kasnije. Ja
sam se uvek teio time da mi nije najvea mana to to ne znam da programiram.
Da nastavimo dalje diskusiju. Pogaate da naredba u liniji 2 (print*) prikazuje
tekst iza zareza, koji je pod navodnicima, na ekran. Ovo je ve spomenuta elementarna
instrukcija b) izlaz gde je izlazni ureaj ekran. Ostaje da vidimo ta je to imeprograma.
To je naziv ili ime programa. Naziv naeg programa je P1. Da li sam ja to izmislio ili
tako mora da bude? Odgovor je da sam ja izmislio ime programa. Moe li ime biti
proizvoljno, tj. kako nam padne na pamet? Naravno da ne moe. Imena moraju biti
definisana po strogim pravilima. Za naa lina imena nema nekih strogih pravila ali
verujem, na primer, da bi vas matiar u Novom Sadu izbacio iz kancelarije kad bi ste
hteli da svom novoroenom detetu date ime (H2SO4)3.
Od sad pa nadalje i ubudue, sve to mora u F-u da se imenuje tj. sve emu
moramo da smislimo ime e biti identifikator neega. U ovom sluaju identifikator naeg
programa, tj. njegovo ime je P1. Pravila za identifikatore, odnosno imena, u F-u su
sledea:
1) Ime moe imati do 31 karaktera (slova engleske abecede (a-z, A-Z), cifre (0-9),
ili donja crta (_))
2) Prvi karakter mora biti slovo
3) Nisu dozvoljena prazna mesta izmedju karaktera
Nema naih ili grkih slova na primer. Pri tome se mala i velika slova abecede ne
razlikuju tj. Ana, ANA, AnA, ana predstavljaju ne etiri nego samo jedan
identifikator. Nije preporuljivo meati proizvoljno mala i velika slova tj. koristiti negde
Ana a negde ANA . Treba biti konzistentan i uvek koristiti samo jedan oblik. Primetili ste
da sam ja uglavnom koristio mala slova. Mislim da je tako itljivije. Vi, ako vam se vie
svia, moete koristiti sve velika slova, na primer. S druge strane, dozvoljeno je
identifikatore imenovati kljunim tj. rezervisanim imenima za naredbe ili funkcije od
strane F-a (kao na primer program ili print). Ovo moe da izazove zabunu i treba to
izbegavati. Najbolje je identifikatore izabrati tako da sugeriu na ta se odnosi, na primer:
pritisak, prit, temp, protok, ocena, broj, korak, G17, regulator_69,
PRC8 itd.
Evo nekih neispravnih identifikatora:
regulator 69
G17+
A=B+C
A?B

nije dozvoljen razmak


nedozvoljen karakter +
nedozvoljeni karakteri +=
nedozvoljen karakter ?

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

m = 0.48508 + 1.5517 0.1561 2


T
Tr =
Tc
pri emu je
Tc = 304.2
- kritina temperatura
- kritian pritisak
Pc = 72.9
= 0.225
- acentrini faktor
Merne jedinice nismo koristili da se ne bi zbunili. Primetite da je ovaj problem
potpuno definisan, tj. treba samo "da zamenite brojne vrednosti" i da izraunate pritisak.
Ovakav tip prorauna je veoma est, tj. imate neke veliine sa njihovim brojnim
vrednostima (R,T,v,Tc,Pc,), definicije novih veliina u funkciji prethodnih (a,b,Tr,m), pa
definicije novih veliina u funkciji prvih i drugih (,P). Zapazite redosled jer morate
pratiti ta od ega zavisi i ta prvo treba izraunati, a ta posle. Depnim kalkulatorom bi
ste lako izraunali pritisak. Naravno, prvo bi ste izraunali a,b,Tr,m , na osnovu zadatih
R,T,v,Tc,Pc, i na kraju bi ste izraunali i konano P. Meutim, verovatno bi vam
preselo da neko od vas trai da izraunate pritisak za deset razliitih temperatura T i deset
razliitih molskih zapremina v (sto puta da ponavljam jedno te isto !!!!!?????). Ovaj
problem emo odmah reiti u F-u. Nee vam biti ba najjasnije pa zbog toga paljivo
itajte dalji tekst dok vam se ne razbistri.

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

to znai da su promenljive sa leve strane dobile vrednosti eksplicitnih konstanti sa desne


strane. to se tie eksplicitnih konstanti to jo moemo da prihvatimo, brojevi kao i svaki
drugi a ta to bee promenljiva?. Verovatno neto to moe da menja svoju vrednost
(itajte dalje). Da ponovimo. S leve strane znaka = je identifikator ili ime promenljive a
sa desne strane je eksplicitna konstanta.
U linijama 11-14 su definicije novih veliina (promenljivih) na osnovu
prethodnih. Isto se koristimo znakom za dodeljivanje vrednosti promenljivoj. Sa leve
strane je, naravno, ime novih promenljivih. ta bi bilo to sa desne strane? Sa desne strane
je izraz. Kada pogledate taj tzv. izraz primetiete da pored promenljivih, koje su
prethodno dobile svoje vrednosti (R,Pc,Tc itd.), figuriu i eksplicitne konstante tj.
brojevi (0.48508,2,0.5 itd) kao i sledei karakteri: +,-,*,/,** i uz to sve zainjeno
malim zagradama (). ta bi to moglo biti? Pogaate, to bi bili standardni aritmetiki
operatori.
Operator (binarni)
+
*
/
**

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

Postavlja se pitanje ta se tu ustvari desilo. Tu figuriu promenljive R, Tc, Pc.


Jesu li one prethodno dobile svoje vrednosti?. Jesu, u linijama 5,8 i 9. Greka bi bila
prijavljena da figuriu promeljive koje prethodno nisu dobile vrednosti. Figuriu i

numerike eksplicitne konstante 0.42747, 2. Ovaj izraz se izraunava koristei


operatore koji tu figuriu i to sleva nadesno potujui prioritet. itav izraz se izraunava
u vie koraka pri emu svaki korak predstavlja jednu operaciju, i to na sledei nain (k
predstavlja rezultat u koraku k):
0.42747*(R*Tc)**2/Pc
0.42747*1**2/Pc
0.42747*2/Pc
3/Pc
4

prvo operator u zagradi


stepenovanje ima prioritet u odnosu na mnoenje
isti prioritet ali je mnoenje prvo sleva
ostaje na kraju deljenje
rezultat izraza

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))

Da budemo precizniji. Prethodni izraz bi se u matematici napisao ovako.

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

Evo razliitih odgovora.


-Jeste jer promenljiva cica dobija novu vrednost za 5 veu od stare.
-Jeste jer promenljiva cica dobija novu vrednost za 5 manju od stare.
-Nije jer je matematiki neispravno, cica+5 nije jednako to i cica.
-Nije jer sa leve strane znaka = ne moe da bude izraz.
-Nije jer sa leve strane znaka = figurie operator sabiranja +.
Koji bi ste vi izabrali kao taan? Odgovor je: nijedan. Taan odgovor bi bio da naredba
dodeljivanja nije ispravno napisana jer sa leve strane znaka = treba da stoji ime
promenljive, koje je u ovom sluaju neispravno. Nisu ispunjena pravila za imenovanje
promenljive. U imenu promenljive figuriu nedozvoljeni karakteri za prazna mesta i
nedozvoljen karakter +.
Deklaracija promenljivih i tipovi podataka

Ostaje nam da razjasnimo linije 2-4 naeg programa P2. To su linije za


deklarisanje promenljivih i uvek se piu na poetku programa. Svaka promenljiva koja
se koristi mora da se deklarie. ta to znai deklarisanje? To znai da promenljive mogu
biti razliitog tipa pa se u F-u svaka promenljiva mora naznaiti (deklarisati) kog je tipa.
U matematici spominjemo razliite skupove brojeva, npr. prirodni, celi, prosti, realni,
racionalni, iracionalni, kompleksni itd. Kada vrimo raunske radnje nad njima ne
pravimo razliku izmeu na primer, celih i realnih brojeva. Meutim, u raunaru se celi i
realni brojevi razliito tretiraju. Tako neki programski jezici, pa i F, zahtevaju da se
naglasi kog su tipa date promenljive. Naravno, promenljive u optem sluaju
predstavljaju podatke. Za nas su osnovne vrste podataka brojke i slova pa su osnovni
tipovi podataka kod programskih jazika, pa i F-a, numeriki podaci i niz karaktera.
Deklaracija tipa promenljive datog tipa je:
Tip :: Lista_dodele

gde je Tip jedan od tipova podataka a Lista_dodele su imena promenljivih


razdvojena zarezima. Osnovni tipovi podataka u F-u su
integer
real
complex
character
logical

11

Evo primera deklaracije integer i real promenljivih:


integer :: Counts, Loop_Index
real :: Current, Resistance, Voltage

Tipovi integer, real, complex su numeriki a character i logical su


nenumeriki tipovi. Kao i promenljive tako i eksplicitne konstante pripadaju jednom od
navedenih tipova.
Tip integer predstavlja cele brojeve (negativni/nula/pozitivni), npr. celobrojne
eksplicitne konstante su:
2
15
-1678

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

Eksponencijalni zapis je oblika +/-xxx.yyyyyezzz gde eksponent ezzz predstavlja


x 10zzz, na primer:
-92.3456e-23 je -92.3456 x 10-23

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)

Tip character se predstavlja nizom karaktera pod navodnicima, na primer eksplicitne


konstante ovog tipa se unose kao:
"Ovo je jedan obian tekst"
"1.2345"
"Ovo gore nije broj nego je niz karaktera tj. tekst"

12

Promenljive tipa character slue uglavnom za imenovanje podataka i deklaracija ovih


promenljivih je malo drugaija od ve navedenog, na primer.
character(len=20) :: ime_supstance

deklarie promenljivu ime_supstance kao character sa maksimalno 20 karaktera.


Ako joj dodelimo vie od 20 karaktera, svi karakteri preko 20-og e biti ignorisani.
Tip logical predstavlja skup od dva elementa i predstavljaju logiko tano ili netano
(o logikim izrazima emo kasnije). Promenljive i konstante ovog tipa imaju samo jednu
od ove dve vrednosti. Obeleavaju se kao:
.true.
.false.

za tano
za netano

to se tipova tie mi emo se najvie baviti integer i real tipovima. Treba


biti veoma paljiv pri koritenju razliitih tipova promenljivih ili konstanti u izrazima.
Navedeni aritmetiki operatori mogu da imaju i celobrojne i realne operande. Pri tome se
interno vri konverzija tj. rezultat je ili celobrojan ili realan ako su oba operanda istog
tipa dok je rezultat realan ako je bar jedan operand realan. Probajte da unesete ovaj
program:
1 program tipovi
2 print*, "2+2=",2+2
3 print*, "2.0+2.0=",2.0+2.0
4 print*, "2+2.0=",2+2.0
5 print*, "1-3.0=",1-3.0
6 print*, "-1.0+3=",-1.0+3
7 print*, "4*3=",4*3
8 print*, "4.0*3=",4.0*3
9 print*, "2**8=",2**8
10 print*, "2.0**8=",2.0**8
11 print*, "2**8.0=",2**8.0
12 print*, "3/2=",3/2
13 print*, "3.0/2=",3.0/2
14 print*, "3/2.0=",3/2.0
15 endprogram tipovi

Kada ovaj program startujete dobiete na ekranu sledee.


2+2= 4
2.0+2.0=
4.0000000
2+2.0=
4.0000000
1-3.0= -2.0000000
-1.0+3=
2.0000000
4*3= 12

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

Sada moemo da vie objasnimo ve spomenutu naredbu za izlaz rezultata na ekran.


Jedan od oblika ove elemenatarne naredba za izlaz na ekran se pie kao
print*,izraz1,izraz2,....

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

Ovom naredbom se prikazuju rezultati 6 izraza. Posle startovanja programa na ekranu e


biti:
Na T= 3.0000000E+02 i v= 2.5000000 pritisag gasa je P= 9.3810558
Press any key to continue . . .

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

a - izraz je character tipa


im - koristiti za tip integer m karaktera
fm.n - koristiti za tip real m karaktera od kojih je n decimala
esm.n - eksponencijalni zapis koji zauzima m karaktera a n decimalnih mesta

Posle date naredbe na ekranu e biti.


Na T=300.0 i v= 2.50000 P=
9.381
Press any key to continue . . .

Sa sada je najbolje da ne razmiljate o puno o formatu i ostavite zvezdicu kod naredbe


print.
Na kraju da se vratimo na nau problematiku oko toga da izraunamo pritisak za
10 razliitih temperatura i 10 razliitih molskih zapremina (100 prorauna) gde bi se
verovatno kalkulator usijao ili zavrio na podu u delovima (ili bi neko bio gaan istim).
ta bi smo mogli da uradimo u tom smisli? Prva ideja je da menjamo program P2 i
vrednosti za T i v u linijamo 6 i 7 i da ponovo startujemo program. To brzi ide i eto,
obavili smo posao.
Ovakav tip problema je dosta est. Znai, imamo promenljive koje dobijaju
vrednoti eksplicitnih konstanti, raunamo nove promenljive na osnovu nekih izraza
koristei osnovne raunske radnje, na kraju prikazujemo rezultate. Nema potrebe da
dajemo neke nove primere. Vi moete jo mnogo programa da napiete ako ste shvatili
primer P2. Meutim, ukoliko ima mnogo promenljivih i mnogo izraza tada je mogunost
da se pogrei vea. U tom sluaju, svaka pomo je dobrodola. Jadna olakavajua
mogunost je ve spomenuta kod kompleksnih izraza a to je da se kompleksan izraz
podeli na manje sloene.
Sada emo korigovati na program P2 na sledei nain:
1 program P3
2 !****
3 !Program za proraun pritiska po SRK jednaini stanja
4 !****
5
6 !Deklaracija promenljivih
7 real,parameter :: R=0.08206
!Univerzalna gasna konstanta
8 real
:: T,v
!Temperatura i molska zapremina
9 real
:: Tc,Pc,omega
!Kriticni parametri
10 real
:: a,b,m,Tr,alfa !Medjurezultati
11 real
:: P
!Pritisak
12
13 !Dodela vrednosti promenljivama
14 !koje necemo menjati u toku izvrsavanja programa
15 Tc = 304.2
16 Pc = 72.9
17 omega = 0.225
18
19 !Dodela vrednosti promenljivama sa tastature

15

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

!koje se unose kada smo startovali program


print*,"T="
read*,T
print*,"v="
read*,v
!Izracunavanje medjurezultata
a = 0.42747*(R*Tc)**2/Pc
b = 0.08664*R*Tc/Pc
m = 0.48508+1.5517*omega-0.1561*omega**2
Tr = T/Tc
alfa = (1+m*(1-Tr**0.5))**2
!Proracun pritiska i prikaz rezultata na ekran
P = R*T/(v-b)-alfa*a/(v*(v+b))
print "(a,f5.1,a,f8.5,a,f10.3)", "Na T=",T," i v=",v," P=",P
endprogram P3

Prazne linije i komentari

Poprilino smo ukrasili dati program P3. Da krenemo u objanjavanje ta smo mi


sve tu promenili. Primetite da smo da smo ostavili prazne linije. To moete da uradite i to
pomae za razumljivije pisanje programa. Primetiete i karakter ! i neki tekst iza njega.
ta bi to bilo? To su tzv. komentari. Oni slue da bi se delovi programa komentarisali.
Zato? Pa zamislite neki malo sloeniji program bez komentara. Lako bi se u njemu
izgubili. Ako bi ste isti program pogledali opet posle dueg vremena, verovatno bi ste
zaboravili emu program slui, ta predstavljaju promenljive itd. Zbog toga u programu
moete uneti objanjenja. Komentari mogu biti pisani u posebnim linijama (linije 2,3,4,6
itd) ili u nastavku naredbi (linije 7-11). Preporuka je da se uvek piu komentari mada
nema potrebe preterivati i komentarisati ono to je oigledno.
Imenovane konstante

Imenovana konstanta je deklarisana u liniji 7. Primetite da je to, u stvari,


deklarisanje promenljive kojoj odmah dodeljujemo vrednost. Imenovana konstanta se
deklarie na sledei nain:
tip, parameter :: Lista_dodele

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

real, parameter :: PLANK=6.6260755e-34, PI=3.141593


integer, parameter :: A=20, HIGH=30, NEON=67

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

ne bi ste mogli startovati program i dobili bi ste greku da pokuavate imenovanoj


konstanti da promenite vrednost. To je dobro, jer ako u svom problemu koristite veliine
koje su po prirodi konstante ili neke vrednosti koje ne elite sluajno da promenite u
programu, onda vam to smanjuje mogunost greke. Bolje je koristiti imenovane
konstante nego eksplicitne konstante. Studenti se esto bune kod ovih pojmova, ta je
konstanta a ta promenljiva. Pogledajmo primer:
.....
real, parameter :: pi = 3.14
real :: R
R = 8.315
.....

!Ludolfov broj
!Univerzalna gasna konstanta

Na pitanje ta je R studenti odgovaraju da je to konstanta. R u programu nije konstanta,


iako ona predstavlja gasnu konstantu, nego promenljiva jer moe da joj se manja vrednost
naredbom dodeljivanja. Konstanta je 3.14 ili 8.315 i to eksplicitna konstanta. Takoe
pi nije promenljiva jer joj se vrednost ne moe menjati nego je imenovana konstanta.
Naredba read

Ostaje da razbistrimo linije 22 i 24 gde je nova naredba read*. U komentaru


pie da se unose vrednosti promenljivih sa tastature. Ovo je jo jedna naredba za dodelu
vrednosti promenljivoj, pored ve spomenutea naredbe jednako (=), ali vrednost
promenljive se unosi sa tasature. Kako? Ako pogledate liniju 22
22 read*,T

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=
_

Naravno pogaate, unosimo vrednost za v


T=
300

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

vrednosti biti smetene u promenljive sa imenima ime1,ime2,...,imen redom. Na


primer ovaj program
1 program unos
2 !Deklaracija
3 real :: a,b,c
4 integer :: d,e
5
6 !Unos
7 read*,a,b,c
8 read*,d,e
9
10 !Prikaz
11 print*,a,b,c,d,e
12 endprogram unos

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

i potvrdite tipkom ENTER. Na ekranu ete dobiti sledee.


1,5,8
9,5
1.0000000
5.0000000
8.0000000 9 5
Press any key to continue . . .

Pretpostavimo sada da ste statovali sledei program i uneli ovako neto


1.0*10^8,10.3,100
Invalid input for real editing
Program terminated by fatal I/O error
Press any key to continue . . .

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

Neko bi postavio pitanje. Dobro, prethodni primer pokazuje da moemo izvriti


neki proraun gde figuriu osnovne raunske radnje. Neko bi se i sloio da je ovo, u
nekim sluajevima, lake nego koristiti kalkulator. A ta ako, pored toga, u izrazima
figuriu neke matematike funkcije kao to su trigonometrijske, logaritamske itd. To
svaki kalkulator ima. Logino bi bilo da toga ima i u F-u. Naravno da ima, i to u mnogo
veem obimu nego to imate na kalkulatorima. F, kao i veina programskih jezika, ima
ugraen odreen broj funkcija. Kada koristite kalkulator i elite, na primer, da izraunate
dekadni logaritam broja 100 onda morate da na kalkulatoru vidite gde je tipka koje ba to
rauna. Obino na toj tipki pie log. Onda ukucate 100 i pritisnete tipku log. Na monitoru
dobijete rezultat 2. ta vam je bilo potrebno da bi ste izveli ovaj "komplikovan" proraun.
Prvo, da znate koju tipku da pritisnete. Drugo, da unesete ono to ova tipka oekuje a to
je jedan broj, i na kraju dobijate rezultat. U principu, interesuje vas rezultat a ne kako je
kalkulator do toga doao. Slina logika vai i kod F-a. Prvo, morate da znate ime
odreene funkcije koja rauna ono to traite (kod kalkulatora - tipka log). Drugo,
morate da toj funkciji date ono to ona oekuje (kod kalkulatora - jedan broj npr.100) i
dobijate rezultat. Naravno, ni ovde se ne zamarate kako je to raunar izraunao. Tako je
opti oblik funkcije u F-u:
ime_funkcije(ar1, ar2,..., arn)

gde je ime_funkcije identifikator tj. ime funkcije i podlee pravilima za


identifikatore a ar1,1r2,...,arn argumenti funkcije razdvojeni zarezima koji su, u
optem sluaju, izrazi.Tako bi smo u F-u mogli napisati kao:
log10(100)

to znai da je ime_funkcije log10 - dobiemo dekadni logaritam -, a iza imena u


zagradi stoji od ega traimo logaritam - ovde od broja 100 -. A gde bi smo mi to
napisali? To ne moe tako da "visi" u nekoj liniji jer funkcija vraa rezultat. ta emo sa
tim rezultatom? Pa ako je reeno da funkcija vraa rezultat, setite se gde se neto rauna i
vraa se rezultat. Pomenuli smo izraz kao neto to vraa rezultat. Do sada smo rekli da u
izrazu figuriu eksplicitne konstante, imenovane konstante, promenljive i operatori.
Pogaate, u izrazu mogu figurisati i funkcije. Tako bi smo mogli napisati:
rez = log10(100)

20

ili
print*,log10(100)

to e u bilo kom programu prouzrokovati ovakvu greku:


Non-REAL argument to intrinsic function LOG10

Pa to sad greka? Kae nam se da argument ugraene (intrinsic) funkcije log10


nije tipa real. Bitna stvar je za svaku funkciju je, pored toga da znate ta vam vraa kao
rezultat, broj argumanata tako i tip svakog argumanta. Funkcija log10 oekuje
argument tipa real a mi smo joj ponudili eksplicitnu konstantu tipa integer. Kada to
korigujemo, na primer:
rez = log10(100.0)

i
print*,log10(100.0)

to e u prvom sluaju promenljiva rez sa leve strane naredbe dodeljivanje (znak


jednako) dobiti vrednost izraza sa desne strane tj. rez e imati vrednost tipa real tj. 2.0
(moda sam malo dosadan sa ovim: s leve strane ovo s desne ono?). U drugom sluaju e
se na ekranu prikazati vrednost izraza a to je takoe 2.0. Pogledajte sledee naredbe
...
broj = 100.0
izraz = log10(broj**2)
...

i odredite koju e vrednost da ima promenljiva izraz. Ako znate ta je logaritamska


funkcija lako ete zakljuiti da e promanljiva izraz imati vrednost log 10000.0 tj.4.0.
Evo nekih numerikih i matematikih funkcija. Ove funkcije imaju kao argumente
numerike vrednosti i kao rezultat vraaju numeriku vrednost.
Numerike
abs(x)
int(x)
max(x1,x2,x3...)
min(x2,x2,x3...)
real(x)

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)

arkus kosinus (rezultat u radijanima)


arkus sinus (rezultat u radijanima)
arkus tanges (rezultat u radijanima)
arkus tanges od y/x (rezultat u radijanima)
kosinus ugla (argumant u radijanima)
kosinus hiperbolini
ex
ln x (prirodni logaritam)
log x (dekadni logaritam)
sinus ugla (argumant u radijanima)
sinus hiperbolini
kvadratni koren
tangens ugla (argumant u radijanima)

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 x (dekadni logaritam)


!sinus ugla
!sinus hiperbolicni
!kvadratni koren
!tangens ugla

!Hiperbolicne funkcije su definisane preko e**x


!tako je
!sinh(x) = (exp(x) - exp(-x))/2
print*,(exp(z) - exp(-z))/2
!cosh(x) = (exp(x) + exp(-x))/2
print*,(exp(z) + exp(-z))/2
endprogram funkcije

esta greka kod studenata poetnika je na primer ovako neto


...
x = 100
rez = logx
...

sa namerom da se koristi funkcija za prirodni logaritam, ali se zaborave zagrade.


Naravno, dobie se poruka da promenljiva logx nije deklarisana jer to F tretira kao
promenljivu.
PRIMER: Potrebno je izraunati napon pare p0 tiofena na datoj temperaturi T. Napon pare se
rauna Cox-Antoine-ovom jednainom po izrazu

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)

dobiete sledee poruke o grekama pri pokuaju startovanja ovakvog programa


Error: cetvrti.f95, line 25: Illegal left hand side of assignment
statement detected at )@=
Error: cetvrti.f95, line 26: Implicit type for LOG10
detected at **@LOG10
Error: cetvrti.f95, line 26: Inconsistent usage of LOG10
detected at )@<end-of-statement>
[F terminated - errors found by pass 1]

24

to znai da to ne moe da proe. Zato? Kada imate vie poruka o grekama,


najjednostavnije je da pogledate prvu i da to korigujete jer sledee greke su esto
posledica prve. Prva greka kae da je nedozvoljena leva strana naredbe dodeljivanja. ta
bi tu bila greka? Pa napisali smo ime za funkciju dekadni logaritam kako je reeno i u
zagradi od ega tj. log10(p0). Da ponovimo jo jednom. Sa leve strane znaka za
dodeljivanje ne moe da stoji nita to nije korektno ime ve deklarisane promenljive a
pogotovo ne neka namera poziva funkcije kao u ovom sluaju.
Kontrolne strukture: Struktura odluivanja (if), Struktura ponavljanja (do)

U prethodnim primerima su se programi izvravali sekvencijalno (naredba po


naredba redom odozgo nadole) i svaka naredba je izvrena samo jednom. Naredbe koje
odreuju koja grupa naredbi (blok naredbi) se izvrava se zovu kontrolne strukture.
- if struktura dozvoljava izbor izvravanja samo jednog bloka od vie blokova naredbi.
- do struktura izvrava blok naredbi odreen broj puta.
if struktura

If struktura slui da se odluimo samo za jedan od vie blokova naredbi. To je znai


pitanje izbora i odluke. Na primer, ako putujete od Beograda do Pariza mora da se da
izaberete i da se odluite za sredstvo putovanje. Vae razmiljanje bi moglo da bude:
* ako se urite i imate para onda
avionom sa Surinskog aerodroma
* inae ako ste romantini i volite vozove onda
moete vozom sa Beogradske eleznike stanice
* inae ako imate puno vremena i mnogo ivaca onda
moete autobosom preko kompanije Miko Lapovac
* inae
uvek moete peaka (ili autostopom)
Ako ovako razmiljate onda e redosled koji je naveden uslovljavati prioritet.
Pretpostavimo da - se urite i imate para - a takoe da - ste romantini i volite vozove onda ete na osnovu prethodnog razmiljanja putovati - avionom sa Surinskog
aerodroma- jer ste tako definisali prioritete. Na osnovu prethodne dileme o putovanju,
standardna if struktura u F-u bi izgledala ovako
if (izbor_1) then
odluka_1
elseif (izbor_2) then
odluka_2
elseif (izbor_3) then
odluka_3
else
odluka_4
endif

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

U Najjednostavniji oblik logikih (relacionih) operatora je onaj koji uporeuje


dve numerike vrednosti (konstante, promenljive ili izraze), na primer:
Operator
<
<=
>
>=
==
/=

Znaenje
manje
manje ili jednako
vee
vee ili jednako
jednako
razliito

U matematici bi smo rekli da ovi operatori fuguriu u nejendaninama. Obeleavaju se sa


jedan ili dva karaktera i lie na ekvivalentne operatore iz matematike.Relacioni operatori
se izvravaju sleva nadesno i svi imaju isti prioritet.
Logiki Bulovi operatori

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

Primeri nekih ispravnih logikih izraza su:


(a<b) .or. (c>d)
(x<=y) .and. (y<=z)
.not. (a<b) .eqv. (x<y)
a<b .neqv. x<y

Neispravni logiki izrazi


I == 1.or.2
(A.and.B)/=0.0
x>0.0.and.>1.0
0.0 < x < 1.0

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

Primetite da se sada sa tastature unose jo i ime supstance i karakteristini parametri za


datu supstancu. Kada startujete ovaj program dobiete na ekranu zahtev da unesete ime
sustance - ponoviemo proraun ba za tiofen. Posle unosa karakteristinih parametara i
temperature dobiemo na ekran sledee:
Supstanca =
tiofen
Tb =
357.3
dHb =
31485
T =
500
Supstanca = tiofen

28

p0 = 20.8054504
Press any key to continue . . .

Pogledajte kako je napisana if struktura za proraun parametra C . Primetite da su linije


za 25 i 27 malo uvuene. Ovo se zove "nazubljivanje" programa. Slui poveavanju
itljivosti programa. Moete to, naravno napisati i ovako.
24
25
26
27
28

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=

Jedno od reenja je sledei program

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

Iz ovog programa se jasno vidi, na osnovu uvlaenja delova programa, od kojeg if je


njegovo elseif, else i endif jer u istoj koloni poinju odgovarajue kljune rei
date if strukture. If u liniji 11 je u vezi sa else u liniji 26 i na kraju njhovo endif je u
liniji 28. Takoe, if i linij 13 je u vezi sa elseif u liniji 19, sa else u linij 23 i na
kraju njihovo endif je u liniji 28. Sada pogleajte ovaj program napisan ovako
1
2
3
4
5
6
7
8
9

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

Ovakav program je apsolutno odbojan za gledanje i poinje da zamara posle kraeg


pokuaja da pohvatate gde tu poinje if struktura, gde se zavrava itd. Program je
korektno napisan ali je teak za razumevanje . Ko ima ivaca neka prvo pokua da shvati
ta ovaj naredni program radi. Inae, program "radi" korektno ali je takoe napisan u
takvom stilu da se pitamo kakvi su motivi autora ovakvog programa.
program egzibicije_1
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

31

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_1

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

Primetite da smo do sada pisali programe gde su se naredbe izvravale samo


jednom (ili nijednom ako su u if strukturi). Ako elimo neki proraun da ponovimo,
moemo ga ponoviti kao to smo ve rekli, tako to emo ponovo startovati program. Ali
ta ako samo neke neradbe hoemo da ponovimo a da ne startujemo sve od poetka. Za to
slui do struktura (ili petlja) iji je najjednostavniji sledei oblik
do

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

Kada startujete ovaj program na ekranu ete dobiti sledee


Nasamponiraj 1
Isperi 1
Nasamponiraj 2
Isperi 2
Nasamponiraj 3
Isperi 3
Gotovo, uzmi fen i osusi kosu
Press any key to continue . . .

Primetite razliku jer smo iza do dodali i=1,3. Ovo je kontrola petlje i u optem obliku ima
izgled
promanljiva = izraz1,izraz2,izraz3

i kae da celobrojna kontrolna promenljiva promenljiva uzima vrednosti od


celobrojnog izraza izraz1 do celobrojnog izraza izraz2 sa korakom izraz3. Dok
se ne dostigne vrednost izraz2 naredbe izmedju do i enddo se ponavljaju. Kada se
dostigne ili premai vrednost izraz2 izlazi se iza enddo. Primetimo da su i

34

promenljiva i izrazi celobrojni. Ako se ne navede izraz3 podrazumeva se korak 1 (kao


u naem primeru). Zakljuak je da se naredbe u petlji izvravaju odreen broj puta i da
kontrolna promenljiva petlje uzima odreene vrednosti. Kontrolna promenljiva takoe
moe da figurie unutar petlje (kao u naem primeru pranjekose1). Deluje
komplikovano dok se objanjava ali pogledajte malo ove primere korienja kontrole do
strukture pa pokuajte da zakjluite kako ovo radi.

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

I posle startovanja dobili sledei rezultat


Nasamponiraj 1
Isperi 1
Nasamponiraj 2
Isperi 2
Nasamponiraj 3
Isperi 3
Oprao si kosu 4 puta
Gotovo, uzmi fen i osusi kosu
Press any key to continue . . .

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

ovom sluaju 4) izlazimo iz petlje. Da skratimo, ovo koritenje kontrolnih promenljivih


petlji izvan petlje nije preporuljivo.
Standardan i vrlo est problem je da, na primer, saberemo n brojeva koje unosimo
sa tastature tj. da naemo njihovu sumu. Prvo emo to da uradimo na krajnje neefikasan i
neelegantan nain
1 program suma_4
2 integer :: i
3 real :: broj,s
4
5 s = 0.0
6
7 i = 1
8 print*,"Unesi broj ",i
9 read*,broj
10 s = s + broj
11
12 i = 2
13 print*,"Unesi broj ",i
14 read*,broj
15 s = s + broj
16
17 i = 3
18 print*,"Unesi broj ",i
19 read*,broj
20 s = s + broj
21
22 i = 4
23 print*,"Unesi broj ",i
24 read*,broj
25 s = s + broj
26
27 print*,"Suma s=",s
28 endprogram suma_4

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

Ako startujemo program i unesemo sledee podatke dobiemo na ekran


Koliko cemo brojeva uneti n=
4
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 . . .

Nadam se da bi ste na osnovu prethodne diskusije mogli da napiete program za, na


primer, sumu kvadrata unetih n brojeva ili proizvod n brojeva itd.

37

naredba stop

Paljiviji italac bi se zapitao zato smo uopte spomenuli beskonanu do


strukturu kad moramo program nasilno da zaustavimo (to je inae nekad neizbeno).
Moe li se program "mirnim putem" zaustaviti. Za zaustavljanje programa uopte, a ne
samo kada smo u beskonanoj petlji, slui naredba stop. Evo kratkog primera programa
gde se zahteva unos dva cela broja a i b pri emu mora biti a<b. U protivnom program
zaustavljamo.
1 program kontrola_unosa
2 integer :: a,b
3
4 print*,"Unesite a i b, a<b"
5 print*,"a="
6 read*,a
7 print*,"b="
8 read*,b
9
10 if (a>=b) then
11
print*,"Pogresan unos"
12
stop
13 endif
14
15 print*,"Dobro je, idemo dalje"
16
16 endprogram kontrola_unosa

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

U do petljama se jo moe koristiti i naredba cycle. Ova naredba vraa nastavljanje


programa na prvu naredbu ispod poetka do strukture. Najbolje je da to vidimo na nekom
primeru. Opet emo kontrolisati unos promenljivih kao u prethodnom primeru ali sada
koristimo naredbu cycle
1 program kontrola_unosa_2
2 integer :: a,b
3
4 print*,"Unesite a i b, a<b"
5

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

Evo rezultata izvravanja ovog programa


Unesite a i b, a<b
Pocetak petlje
a=
3
b=
2
Pogresan unos, ponovite
Pocetak petlje
a=
2
b=
3
Kraj petlje
Dobro je, idemo dalje
Press any key to continue . . .

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

Naravouenije je da se paljivo koriste beskonane do petlje u kombinaciji sa exit i cycle.


Ugnjedene if i do strukture

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

F e da se buni sa sledeim porukama


Error: stru2.f95, line 15: Overlapping DO/IF
detected at END DO@<end-of-statement>
Error: stru2.f95, line 17: Overlapping DO/IF
detected at END DO@<end-of-statement>
Error: stru2.f95, line 19: Missing ENDIF statement
detected at STRUKTURE_NEISPRAVNO@<end-of-statement>
[F terminated - errors found by pass 1]

Pokuajte sami da otkrijete gde je greka.

42

You might also like