programki jezik f - tf.uns.ac.rsomorr/radovan_omorjan_003/f-compiler-1.pdf · od sad pa nadalje i...

42
1 Programki jezik F Uvod F je viši programski jezik i predstavlja podskup Fortrana 90/95. Postavlja se pitanje: Šta je uopšte programski jezik? Šta je viši programski jezik?, Šta je Fortran?. Kad sam ja prvi put čuo pojam "programski jezik" našao sam se malo zbunjen. Da to malo pokušamo da razjasnimo (i ostanemo manje-više 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 utiču na prirodni jezik ipak pokušavaju da uvedu neki red i pravila (pravopis, gramatika itd.). Formalni jezici su projektovani sa strogo definisanim pravilima i imaju specifične primene. Na primer, matematičari koriste formalni jezik da bi prikazali odnose brojeva i simbola. Hemičari koriste formalni jezik da bi opisali hemijsku strukturu molekula. Programski jezik je formalni jezik projektovan da se pomoću njega izraze proračuni. Na primer: 3+3=6 je matematičkim jezikom ispravno napisano ali 3+=6$ je matematičkim jezikom neispravno napisano. Hemijski jezikom H 2 O je ispravno napisano ime jedinjenja ali 2Z z je neispravno. Do sada nismo spominjali računar. Da bi smo nastavili osvrnimo se na dve stvari: hardver i softver. Hardver predstvlja sam računar tj. sve što u kućištu računara možete da vidite. Super-računar koji košta mnogo miliona dolara je bez softvera pametan kao toster. Softver je skup mašinskih instrukcija koje se unose u računar da bi centralna procesna jedinica mogla da radi (kaže se da računar izvršava program. Kako i zašto, drugom prilikom). Viši programski jezik predstavlja način pisanja programa. Program je niz instrukacija računaru koje izvode neko računanje. To može biti neki matematički proračun (npr. osnovne računske radnje ili pronalaženje nula polinoma itd.) ili neki simbolički proračun (npr. zamena reči u nekom tekstu itd.) ili prevođenje jednog oblika računarskih instrukcija u drugi itd. Sam način kako se to izvodi zavisi od poznavanja datog programskog jezika. Ako postoje viši programski jezici onda, verovatno, postoje i niži. Niži programski jezici zavise od konkretne mašine (centralne procesne jedinice) za koju su pisani dok su viši programski jezici bliži ljudima i nisu vezani za konkretan računar. Čak ne moraju biti uopšte pisani za računar. Jedan od najstarijih i najpoznatijih programskih jezika je Fortran (verovatno ste čuli još za BASIC, C, C++, Pascal itd.). Od samih početaka je Fortran bio i ostao programski jezik za naučno-tehničke proračune. Njegova prva verzija je nastala 50-ih godina prošlog veka. Prvi standard višeg programskog jezika je verzija Fortran-a koja se zvala Fortran 66 ili Fortran IV nastala 60-ih godina prošlog veka. Sledeća veoma popularna verzija je nastala 70-ih godina i zvala se Fortran 77. Fortran, kao najstariji viši 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

Upload: others

Post on 29-Oct-2019

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

1

Programki jezik F

Uvod F je viši programski jezik i predstavlja podskup Fortrana 90/95. Postavlja se pitanje: Šta je uopšte programski jezik? Šta je viši programski jezik?, Šta je Fortran?. Kad sam ja prvi put čuo pojam "programski jezik" našao sam se malo zbunjen. Da to malo pokušamo da razjasnimo (i ostanemo manje-više 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 utiču na prirodni jezik ipak pokušavaju da uvedu neki red i pravila (pravopis, gramatika itd.). Formalni jezici su projektovani sa strogo definisanim pravilima i imaju specifične primene. Na primer, matematičari koriste formalni jezik da bi prikazali odnose brojeva i simbola. Hemičari koriste formalni jezik da bi opisali hemijsku strukturu molekula. Programski jezik je formalni jezik projektovan da se pomoću njega izraze proračuni. Na primer: 3+3=6 je matematičkim jezikom ispravno napisano ali 3+=6$ je matematičkim jezikom neispravno napisano. Hemijski jezikom H2O je ispravno napisano ime jedinjenja ali 2Zz je neispravno. Do sada nismo spominjali računar. Da bi smo nastavili osvrnimo se na dve stvari: hardver i softver. Hardver predstvlja sam računar tj. sve što u kućištu računara možete da vidite. Super-računar koji košta mnogo miliona dolara je bez softvera pametan kao toster. Softver je skup mašinskih instrukcija koje se unose u računar da bi centralna procesna jedinica mogla da radi (kaže se da računar izvršava program. Kako i zašto, drugom prilikom). Viši programski jezik predstavlja način pisanja programa. Program je niz instrukacija računaru koje izvode neko računanje. To može biti neki matematički proračun (npr. osnovne računske radnje ili pronalaženje nula polinoma itd.) ili neki simbolički proračun (npr. zamena reči u nekom tekstu itd.) ili prevođenje jednog oblika računarskih instrukcija u drugi itd. Sam način kako se to izvodi zavisi od poznavanja datog programskog jezika. Ako postoje viši programski jezici onda, verovatno, postoje i niži. Niži programski jezici zavise od konkretne mašine (centralne procesne jedinice) za koju su pisani dok su viši programski jezici bliži ljudima i nisu vezani za konkretan računar. Čak ne moraju biti uopšte pisani za računar. Jedan od najstarijih i najpoznatijih programskih jezika je Fortran (verovatno ste čuli još za BASIC, C, C++, Pascal itd.). Od samih početaka je Fortran bio i ostao programski jezik za naučno-tehničke proračune. Njegova prva verzija je nastala 50-ih godina prošlog veka. Prvi standard višeg programskog jezika je verzija Fortran-a koja se zvala Fortran 66 ili Fortran IV nastala 60-ih godina prošlog veka. Sledeća veoma popularna verzija je nastala 70-ih godina i zvala se Fortran 77. Fortran, kao najstariji viši 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

Page 2: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

2

programskih jezika koji se i dalje razvija (ali ne sa tako korenitim izmenama) pa imamo Fortran 95, 2000, itd. Fortran 90 je zadržao mogućnost izvršavanja 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 može uraditi na mnogo načina. Samim tim i učenje Fortran-a predstavlja problem. Zbog toga su nastale verzije programskih jezika koje predstavljaju pažljivo odabrane mogućnosti F90. Tako je nastao F programski jezik koji je namenjen za edukativne svrhe i učenje novih koncepata F90. Pri tome svaki F program je istovremeno i F90 program (obrnuto ne mora da važi). Posetite web stranicu F-a http://www.fortran.com/imagine1/index.html. za više detalja. Kreatori plana i programa za srednje škole su predvideli da se kao prvi programski jezik uče BASIC ili (uglavnom) Pascal. Moje skromno mišljenje je da bi i F mogao vrlo dobro da posluži u nastavi informatike u srednjim školama. No, ne bih da širim diskusiju jer rasprava o programskim jezicima liči na raspravu "koji je auto bolji?". Elementi F (konstante, promenljive, operatori, funkcije) Iako ima mnogo programskih jezika koji se razlikuju u različitim detaljima ipak za skoro sve programske jezike, pa tako i za F, postoji nešto zajedničko a to su instrukcije za: a) ulaz unos u računar podataka pomoću tastature, iz fajla ili iz nekog drugog uređaje b) izlaz prikaz rezultata na monitor ili upis u naki fajl ili drugi uređaj c) računanje osnovne računske radnje kao što su sabiranje, oduzimanje, množenje, deljenje itd. d) uslovno izvođenje ispitivanje uslova i izvršavanje određenog seta instrukcija e) ponavljanje ponavljanje određenog seta instrukcija Verovali ili ne, ovo bi otprilike bilo to. Svaki, ma koliko kompleksan, program se sastoji od instrukcija koje se mogu, manje-više, svrstati u prethodne. Tako se programiranjem može nazvati raščlanjivanje kompleksnog problema na sve manje kompleksne potprobleme dok ne dođemo do elementarnih instrukcija tipa a)-e). Programiranje je poprilično individualna stvar, a kako se izvodi od strane ljudi, podložan je greškama. Programske greške se zovu bug (izgovara se bag). Postoje tri vrste grešaka: sintaksne greške (syntax errors), greške u toku izvođenja (runtime errors) i semantičke greške (semantic errors).

Page 3: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

3

Sintaksne greške se odnose na strukturu programa i pravila za unos programa. Na primer, u srpskom jeziku rečenica mora početi velikim slovom i završavati tačkom. ova rečenica ima sintaksnu grešku. A bogami i ova Za većinu čitalaca par sintaksnih grešaka (ovde ih zovemo štamparske) ne predstavljau neki problem. Verovatno možete da pročitate ovo moje pisanije i da ga razumete uprkos mojim sintaksnim greškama (mislio sam na tekst, ne na saržinu). Međutim F, kao i ostali programski jezici, nije tako tolerantan. Kada se pokuša pokrenuti F program (videćemo kako) računar ga neće pokrenuti i prijavitće grešku, ako postoji bar i jedna sintaksna greška. Početnici najčešće u početku puno vremena koriste na otklanjanje sintaksnih greški. Sa iskustvom se prave sve manje sintaksne greške i brže se pronalaze. Greške u toku izvođenju programa se mogu pojaviti, a ne moraju. Pojavljuju se kada se u programu izvršava nešto "loše". Na primer, ako se deli sa nulom ili ako se traži od računara da izračuna logaritam negativnog broja itd. Semantičke greške su one greške koje čine da program koji ste napisali nije onaj koji ste hteli da napišete. Semantička greška ovog teksta bi bila da vi ne razumete sadržaj ovog teksta tj. "šta je pesnik hteo da kaže" (što je najverovatnije i tako). Studenti kada pokrenu program, ubace neke podatke, program nešto izračuna i završi rad, očekuju da je posao završen. Pa, bože moj "Program radi!!!". Međutim, ako pogledaju rezultate proračuna dobijaju na primer ovako nešto: . . Izračunata 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 proračun korektni, onda nešto tu ne štima. Napravljena je semantička greška. No, ne dajte se obeshrabriti. Mora se pogledati program i videti kako se došlo do ovih rezultata. Možda je nešto sabrano a treba oduzeti itd. Retko kada program ispravno proradi "iz prve", izuzev ekstremno jednostavnih programa. Iako otklanjanje grešaka može biti frustrirajuće (pogotovo za studente početnike) ovo otklanjanje grešaka ponekad liči na detektivski posao. Imate slučaj i tragove i morate da rešite zašto se to desilo. Dobijate ideju pa probate ponovo, ali vidite da ste pogrešili. Ponavljate sa novim idejama dok ga ne rešite. Na sreću (ili na žalost) mi ćemo se baviti jednostavnim primerima gde Mister Poaro sa njegovim sivim ćelijama nije preko potreban. Pisanje programa i otklananje grešaka za neke je ista stvar. Krenete od jednostavnog programa koji ispravno radi, nešto modifikujete, vidite da ste pogrešili, otklonite grešku, opet program ispravno radi, opet nešto modifikujete itd. Jedini način da što manje grešite je pisanje, pisanje i samo pisanje programa. Nećete naučiti da programirate u F-u (ili što je još gore, nećete položiti ispit) samo čitajući ovaj tekst. Morate da budete radoznali i da koristite analizu ŠBBKBB (Šta Bi Bilo Kad Bi Bilo).

Page 4: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

4

Prvi F program Sada nešto konkretno. Seli ste ispred računara i nastavnik vam kaže da na tastaturi otkucate sledeći tekst tj. program u F-u (U prvoj koloni su brojevi linija i ne pripadaju programu tj, ne unose se). Svaka linija sadrži jednu instrukciju ili naredbu. 1 program P1 2 print*,"Zdravo svete!" 3 endprogram P1 Onda vam se kaže (i pokaže) da program sačuvate u fajl pod imenom npr. prvi.f95 i da ga zatim pokrenete tj. da ga startujete. Šta to znači "pokrenuti program". To znači da se tekst koji vidite ispred sebe (izvorni kod) "prevede" u mašinske instrukcije koje razume računar. To prevođenje vrši program koji se zove F prevodilac tj. kompajler (compiler). Na ekranu ćete dobiti rezultat izvršavanja ovog programa tj. biće prikazano: Zdravo svete! I to je sve. Da malo prodiskutujemo ovaj ekstremno jednostavan i besmislen program. Svaki F program počinje sa program imeprograma i završava sa endprogram imeprograma. Ako slučajno omašite i umesto program napišete prgram u liniji 1, računar će pri pokušaju startovanja prijaviti grešku (sintaksnu) tj. Error: prvi.f95, line 1: syntax error detected at <end-of-statement>@PRGRAM [F fatal error termination] Ispravite grešku u liniji 1 i ponovo startujete program, koji je sada ispravan. Zamislite sada sledeću situaciju. Evo ga isti taj program: 1 program P1 2 print*,''Zdravo svete!'' 3 endprogram P1 Ako pokušate da startujete ovaj program dobićete sledeću poruku. Error: p1.f95, line 2: Illegal character ''' Error: p1.f95, line 2: syntax error ***Malformed statement Error: p1.f95, line 2: Illegal character ''' [F terminated - errors found by pass 1] Znači, nešto se mnogo buni oko linije 2. Iznervirani student će ovlaš bacivši pogled na program verovatno ovako razmišljati:

- Ma šta sada nije dobro? - Sve sam uneo kako je profa rekao.

Page 5: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

5

- Eto opet sam startovao i ista greška. - Kako su ovi računari glupi! 'ajde da pozovem profu i da vidim ima li on nešto

pametno da kaže. Profa dođe i pogleda program i možda ne vidi iz prve, ali poučen ranijim iskustvom vidi de je student umesto jednog znaka za navodnike koristio dva znaka za apostrof. To F ne toleriše. Student će odgovoriti:"Ja sam misilio da je to isto". Naravoučenije – Ako odmah ne vidite grešku, nemojte se predavati. Popijte kafu, odmorite se i videćete je kasnije. Ja sam se uvek tešio time da mi nije najveća mana to što ne znam da programiram. Da nastavimo dalje diskusiju. Pogađate 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 uređaj ekran. Ostaje da vidimo šta je to imeprograma. To je naziv ili ime programa. Naziv našeg programa je P1. Da li sam ja to izmislio ili tako mora da bude? Odgovor je da sam ja izmislio ime programa. Može li ime biti proizvoljno, tj. kako nam padne na pamet? Naravno da ne može. Imena moraju biti definisana po strogim pravilima. Za naša lična imena nema nekih strogih pravila ali verujem, na primer, da bi vas matičar u Novom Sadu izbacio iz kancelarije kad bi ste hteli da svom novorođenom detetu date ime π (H2SO4)3.

Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime će biti identifikator nečega. U ovom slučaju identifikator našeg programa, tj. njegovo ime je P1. Pravila za identifikatore, odnosno imena, u F-u su sledeća:

1) Ime može 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 naših ili grčkih 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 preporučljivo mešati 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 više sviđa, mođete koristiti sve velika slova, na primer. S druge strane, dozvoljeno je identifikatore imenovati ključnim tj. rezervisanim imenima za naredbe ili funkcije od strane F-a (kao na primer program ili print). Ovo može da izazove zabunu i treba to izbegavati. Najbolje je identifikatore izabrati tako da sugerišu na šta se odnosi, na primer: pritisak, prit, temp, protok, ocena, broj, korak, G17, regulator_69, PRC8 itd.

Evo nekih neispravnih identifikatora:

regulator 69 nije dozvoljen razmak G17+ nedozvoljen karakter + A=B+C nedozvoljeni karakteri += A?B nedozvoljen karakter ?

Page 6: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

6

dolar$ nedozvoljen karakter $ 500S prvi karakter mora biti slovo _cica_ prvi karakter mora biti slovo

duuuuuuugaaaaaaackkkkkkkkkooooooooo ima više od 31 karakter Kako je naš prvi program bio besmislen sada ćemo da rešimo nešto smisleno. Evo ga jednostavan numerički problem. PRIMER: Izračunati pritisak nekog gasa, P po SRK jednačini stanja za zadatu temperaturu T i molsku zapreminu v. Pritisak se računa po izrazu

)( bvv

abv

TRP+

α−

−=

gde su: R = 0.08206 - univerzalna gasna konstanta T = 300 - temperatura v = 2.5 - molska zapremina Parametri a i b se računaju kao:

( )c

c

c

c

PTRb

PTRa 08664.0,0.42747

2

==

Parametar α se računa kao

cr

r

TTT

m

Tm

=

ω−ω+=

−+=α2

25.0

1561.05517.148508.0

)]1(1[

pri čemu je Tc = 304.2 - kritična temperatura Pc = 72.9 - kritičan pritisak ω = 0.225 - acentrični 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 izračunate pritisak. Ovakav tip proračuna je veoma čest, tj. imate neke veličine sa njihovim brojnim vrednostima (R,T,v,Tc,Pc,ω), definicije novih veličina u funkciji prethodnih (a,b,Tr,m), pa definicije novih veličina u funkciji prvih i drugih (α,P). Zapazite redosled jer morate pratiti šta od čega zavisi i šta prvo treba izračunati, a šta posle. Džepnim kalkulatorom bi ste lako izračunali pritisak. Naravno, prvo bi ste izračunali a,b,Tr,m , na osnovu zadatih R,T,v,Tc,Pc,ω i na kraju bi ste izračunali α i konačno P. Međutim, verovatno bi vam preselo da neko od vas traži da izračunate pritisak za deset različitih temperatura T i deset različitih molskih zapremina v (sto puta da ponavljam jedno te isto !!!!!?????). Ovaj problem ćemo odmah rešiti u F-u. Neće vam biti baš najjasnije pa zbog toga pažljivo čitajte dalji tekst dok vam se ne razbistri.

Page 7: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

7

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 proračun. Zapamtićete 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 kaže vam se da pritisnete bilo koju tipku za nastavak (obično razmaknica - najduža tipka na tastaturi). Ako pritisak ne dobijete "iz prve" verovatno ste pogrešili pri unosu. Otklonite greške dok ne dobijete traženi rezultat. Ako vam je za utehu, i ja sam pogrešio 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 slučaju ne bi trebalo da imati većih problema u daljem izlaganju. Za sada ćemo preskočiti linije 2-4 i krenuti od linije 5. Ovde je prva ozbiljnija stvar a to je naredba dodeljivanja. Liči na "jednako" iz matematike. Linije 5-10 su dodeljivanja brojnih vrednosti odgovarajućim veličinama. Nako bi pitao: "Šta je sa indeksom kod Tc i Pc tj. zašto se piše Tc i Pc i zašto nismo uneli grčko slovo ω nego smo uneli omega". Ova imena predstavlaju identifikatore odgovarajućih veličina (pogledajte pravila o identifikatorima). Nema indeksa ili eksponenta i nema grčkih slova (a bogami ni naših) u identifikatorima. S druge strane znaka = su brojne vrednosti i unose se onako kao što smo u matematičkom jeziku navikli (0.08206, 300, 2.5 itd.), jedino zapazite da je tačka separator decimala a ne zarez. Da malo uvedemo nove pojmove. U linijama 5-10 veličine sa leve strane znaka jednako sa nazivaju promenljive a sa desne strane su eksplicitne konstante (u ovom slučaju numeričke) pa se u opštem slučaju dodeljivanje vrednosti eksplicitne konstante promenljivoj piše kao:

Page 8: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

8

promenljiva = eksplicitna_konstanta što znači da su promenljive sa leve strane dobile vrednosti eksplicitnih konstanti sa desne strane. Što se tiče eksplicitnih konstanti to još možemo da prihvatimo, brojevi kao i svaki drugi a šta to beše promenljiva?. Verovatno nešto što može 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 veličina (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 primetićete da pored promenljivih, koje su prethodno dobile svoje vrednosti (R,Pc,Tc itd.), figurišu i eksplicitne konstante tj. brojevi (0.48508,2,0.5 itd) kao i sledeći karakteri: +,-,*,/,** i uz to sve začinjeno malim zagradama (). Šta bi to moglo biti? Pogađate, to bi bili standardni aritmetički operatori. Operator (binarni) Značenje

+ Sabiranje - Oduzimanje * Množenje / Deljenje ** Eksponent

Operator (unarni) Značenje

- 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, poštuje prioritet operatora pri čemu je prioritet isti kao u matematici. Prioritet se isključivo menja malim zagradama (nema srednjih ili velikih zagrada)

Operator Prioritet ** Najviši *,/

- unarni -,+ Najniži

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 figurišu promenljive R, Tc, Pc. Jesu li one prethodno dobile svoje vrednosti?. Jesu, u linijama 5,8 i 9. Greška bi bila prijavljena da figurišu promeljive koje prethodno nisu dobile vrednosti. Figurišu i

Page 9: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

9

numeričke eksplicitne konstante 0.42747, 2. Ovaj izraz se izračunava koristeći operatore koji tu figurišu i to sleva nadesno poštujući prioritet. Čitav izraz se izračunava u više koraka pri čemu svaki korak predstavlja jednu operaciju, i to na sledeći način (k predstavlja rezultat u koraku k): 0.42747*(R*Tc)**2/Pc prvo operator u zagradi 0.42747*1**2/Pc stepenovanje ima prioritet u odnosu na množenje 0.42747*2/Pc isti prioritet ali je množenje prvo sleva 3/Pc ostaje na kraju deljenje 4 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 pažljivije posmatrate izraze primetićete da najveću pažnju morate posvetiti zagradama i operatoru deljenja (šta je u brojioci, šta je u imeniocu). Znači korigovana naredba dodeljivanja vrednosti promenljivoj je promenljiva = izraz i kaže se da se prvo izraz sa leve strane znaka = izračuna i onda se ta vrednost dodeljuje promenljivoj sa desne strane. Uvek ćemo pod pojmom izraz podrazumevati nešto što vraća rezultat. Naravno, najjednostavniji izraz je baš eksplicitna konstanta. Ova primena karaktera jednako početnicima pravi problema. Već sam nekoliko puta pomenuo da to ne znači da je leva strana jednaka desnoj. Neki programski jezici s toga koriste drugačije 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 duža i unos podložniji greškama. Pogotovo ako niste trenirali kako se unose izrazi (može vam čak poslužiti i TV slagalica i igra Moj broj). Međutim, postoji način da se ove greške svedu na najmanju moguću 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.

)( bvva

bvTRP

+α−

−=

Izraz je isti (nadam se da se slažete) kao i prethodo naveden. Malo smo uštedeli na zagradama. Do sada se može fiktivno prihvatiti da se matematički i programski jezik ne

Page 10: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

10

razlikuju puno osim u načinu pisanja izraza. Ja sam vam rekao da to u principu nije tačno. Znak jednako (=) u matematičkom smislu znači da je leva strana jednaka desnoj a u programerskom da se izraz sa desne strane prvo izračuna pa se ta vrednost dodeljuje promenljivoj sa leve strane. Da zabuna bude veća napisaćemo dodelu vrednosti promenlivoj P u više linija. 16 P = R*T/(v-b) 17 P = P -alfa*a/(v*(v+b)) Naravno, rezultat će biti isti. Najveća zavrzlama do sada. Linija 16 bi kako tako mogla da prođe u matematici ali linija 17, nikako. P je i sa leve i sa desne strane znaka =. Da ponovimo, ovo ne znači 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 figuriše u liniji 17. Stara vrednost P se briše pa P postaje ono što smo hteli. To je moguće zbog toga što se prvo izračuna vrednost izraza pa onda se vrši dodela vrednosti promenljivoj. Ako vas to buni možete uvesti nove promenljive i napisati nešto ovako 16 Pgore1 = R*T 17 Pdole1 = v-b 18 Pgore2 = alfa*a 19 Pdole2 = v*(v+b) 20 P = Pgore1/Pdole1 - Pgore2/Pdole2 Malo smo ga preterali ali može i tako, ako vam više odgovara. Zapazite redosled naredbi, koji je vrlo bitan. Naredbe se izvršavaju u normalnom redosledu, odozgo nadole. Naravno, ne moram da spominjem da morate biti načisto sa razlomcima. Ako jeste, neće vam biti problem da prihvatite ovo izračunavanje P P = R*T/(v-b)-alfa*a/v/(v+b) Eto to vam je pojam promenljive. Može imati različite vrednosti. Kada već ima neku vrednost sledeća naredba dodeljivanja briše tu vrednost i promenljiva se promeni u skladu sa naredbom dodeljivanja. Pogledajte sledeći deo nekog programa: ... 10 cica = 1 11 cica = cica + 5 12 cica = cica + 1 13 cica = 10 14 cica = cica + 5 15 cica = cica + 1 ...

Page 11: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

11

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, zašto jeste ako nije zašto nije? cica + 5 = cica Evo različitih odgovora. -Jeste jer promenljiva cica dobija novu vrednost za 5 veću od stare. -Jeste jer promenljiva cica dobija novu vrednost za 5 manju od stare. -Nije jer je matematički neispravno, cica+5 nije jednako što i cica. -Nije jer sa leve strane znaka = ne može da bude izraz. -Nije jer sa leve strane znaka = figuriše operator sabiranja +. Koji bi ste vi izabrali kao tačan? Odgovor je: nijedan. Tačan odgovor bi bio da naredba dodeljivanja nije ispravno napisana jer sa leve strane znaka = treba da stoji ime promenljive, koje je u ovom slučaju neispravno. Nisu ispunjena pravila za imenovanje promenljive. U imenu promenljive figurišu nedozvoljeni karakteri za prazna mesta i nedozvoljen karakter +. Deklaracija promenljivih i tipovi podataka Ostaje nam da razjasnimo linije 2-4 našeg programa P2. To su linije za deklarisanje promenljivih i uvek se pišu na početku programa. Svaka promenljiva koja se koristi mora da se deklariše. Šta to znači deklarisanje? To znači da promenljive mogu biti različitog tipa pa se u F-u svaka promenljiva mora naznačiti (deklarisati) kog je tipa. U matematici spominjemo različite skupove brojeva, npr. prirodni, celi, prosti, realni, racionalni, iracionalni, kompleksni itd. Kada vršimo računske radnje nad njima ne pravimo razliku između na primer, celih i realnih brojeva. Međutim, u računaru se celi i realni brojevi različito tretiraju. Tako neki programski jezici, pa i F, zahtevaju da se naglasi kog su tipa date promenljive. Naravno, promenljive u opštem slučaju predstavljaju podatke. Za nas su osnovne vrste podataka brojke i slova pa su osnovni tipovi podataka kod programskih jazika, pa i F-a, numerički 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

Page 12: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

12

Evo primera deklaracije integer i real promenljivih: integer :: Counts, Loop_Index real :: Current, Resistance, Voltage Tipovi integer, real, complex su numerički a character i logical su nenumerički 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 može biti predstavljen na dva načina. Sa fiksnom decimalnom tačkom ili u eksponencijalnom zapisu. Zapis realne konstante sa fiksnom decimalnom tačkom je oblika +/-xxx.yyyyy gde je xxx celobrojni deo a yyyy decimalni deo, npr. realne eksplicitna konstant u zapisu sa fiksnom decimalnom tačkom 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 , i-imaginarna 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 običan tekst" "1.2345" "Ovo gore nije broj nego je niz karaktera tj. tekst"

Page 13: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

13

Promenljive tipa character služe uglavnom za imenovanje podataka i deklaracija ovih promenljivih je malo drugačija od već navedenog, na primer. character(len=20) :: ime_supstance deklariše promenljivu ime_supstance kao character sa maksimalno 20 karaktera. Ako joj dodelimo više od 20 karaktera, svi karakteri preko 20-og će biti ignorisani. Tip logical predstavlja skup od dva elementa i predstavljaju logičko tačno ili netačno (o logičkim izrazima ćemo kasnije). Promenljive i konstante ovog tipa imaju samo jednu od ove dve vrednosti. Obeležavaju se kao: .true. za tačno .false. za netačno Što se tipova tiče mi ćemo se najviše baviti integer i real tipovima. Treba biti veoma pažljiv pri korištenju različitih tipova promenljivih ili konstanti u izrazima. Navedeni aritmetički operatori mogu da imaju i celobrojne i realne operande. Pri tome se interno vrši 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 dobićete na ekranu sledeće. 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

Page 14: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

14

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 slučajevima 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 računar kao rezultat usvojio celobrojni deo tačnog rezultata. Iz ovog primera vidite da je npr. 4 celobrojna konstanta a 4.0 realna konstanta Naredba print Sada možemo da više objasnimo već spomenutu naredbu za izlaz rezultata na ekran. Jedan od oblika ove elemenatarne naredba za izlaz na ekran se piše 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 između navodnika. Drugi član je izraz koji se prethodno izračuna i rezultat izraza se prikaže na ekran. Na isti način je napisana i naredba 17 u našem programu P2. Ako u programu korigujete liniju 17 i napišete: 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 sviđa možete uticati na način prikaza na ekran. Korigujte prethodnu liniju 17 na sledeći način: 17 print "(a,f5.1,a,f8.5,a,f10.3)","Na T=",T," i v=",v," P=",P Zvezdica (*) u naredbi print kaže da se sam računar snađe i prikaže rezultate izraza kako je u F-u ugrađeno, tako da mi ne razmišljamo 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

Page 15: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

15

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 razmišljate o puno o formatu i ostavite zvezdicu kod naredbe print. Na kraju da se vratimo na našu problematiku oko toga da izračunamo pritisak za 10 različitih temperatura i 10 različitih molskih zapremina (100 proračuna) gde bi se verovatno kalkulator usijao ili završio na podu u delovima (ili bi neko bio gađan 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. Znači, imamo promenljive koje dobijaju vrednoti eksplicitnih konstanti, računamo nove promenljive na osnovu nekih izraza koristeći osnovne računske radnje, na kraju prikazujemo rezultate. Nema potrebe da dajemo neke nove primere. Vi možete još mnogo programa da napišete ako ste shvatili primer P2. Međutim, ukoliko ima mnogo promenljivih i mnogo izraza tada je mogućnost da se pogreši veća. U tom slučaju, svaka pomoć je dobrodošla. Jadna olakšavajuća mogućnost je već spomenuta kod kompleksnih izraza a to je da se kompleksan izraz podeli na manje složene. Sada ćemo korigovati naš program P2 na sledeći način: 1 program P3 2 !**** 3 !Program za proračun pritiska po SRK jednačini 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

Page 16: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

16

20 !koje se unose kada smo startovali program 21 print*,"T=" 22 read*,T 23 print*,"v=" 24 read*,v 25 26 !Izracunavanje medjurezultata 27 a = 0.42747*(R*Tc)**2/Pc 28 b = 0.08664*R*Tc/Pc 29 m = 0.48508+1.5517*omega-0.1561*omega**2 30 Tr = T/Tc 31 alfa = (1+m*(1-Tr**0.5))**2 32 33 !Proracun pritiska i prikaz rezultata na ekran 34 P = R*T/(v-b)-alfa*a/(v*(v+b)) 35 print "(a,f5.1,a,f8.5,a,f10.3)", "Na T=",T," i v=",v," P=",P 36 endprogram P3 Prazne linije i komentari Poprilično smo ukrasili dati program P3. Da krenemo u objašnjavanje šta smo mi sve tu promenili. Primetite da smo da smo ostavili prazne linije. To možete da uradite i to pomaže za razumljivije pisanje programa. Primetićete i karakter ! i neki tekst iza njega. Šta bi to bilo? To su tzv. komentari. Oni služe da bi se delovi programa komentarisali. Zašto? Pa zamislite neki malo složeniji program bez komentara. Lako bi se u njemu izgubili. Ako bi ste isti program pogledali opet posle dužeg vremena, verovatno bi ste zaboravili čemu program služi, šta predstavljaju promenljive itd. Zbog toga u programu možete uneti objašnjenja. 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 pišu komentari mada nema potrebe preterivati i komentarisati ono što je očigledno. Imenovane konstante Imenovana konstanta je deklarisana u liniji 7. Primetite da je to, u stvari, deklarisanje promenljive kojoj odmah dodeljujemo vrednost. Imenovana konstanta se deklariše na sledeći način: tip, parameter :: Lista_dodele Gde parameter tzv. jedan od atributa tipa promenljive (ima ih više) i ukazuje na to da se deklariše 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

Page 17: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

17

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 može neko zbuniti. Da li je to imenovana konstanta promenljiva ili konstanta? U kom zecu leži grm? Imenovana konstanta ima ime i vrednost, kao i promenljiva, ali za razliku od promenljive ta se vrednost dobija pri deklarisanju i ne može se kasnije menjati. Ako bi ste, slučajno ili namerno, uneli u program P3 liniju 18 na sledeći način 18 R = 8.315 ne bi ste mogli startovati program i dobili bi ste grešku da pokušavate imenovanoj konstanti da promenite vrednost. To je dobro, jer ako u svom problemu koristite veličine koje su po prirodi konstante ili neke vrednosti koje ne želite slučajno da promenite u programu, onda vam to smanjuje mogućnost greške. 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 !Ludolfov broj real :: R !Univerzalna gasna konstanta R = 8.315 ..... Na pitanje šta je R studenti odgovaraju da je to konstanta. R u programu nije konstanta, iako ona predstavlja gasnu konstantu, nego promenljiva jer može da joj se manja vrednost naredbom dodeljivanja. Konstanta je 3.14 ili 8.315 i to eksplicitna konstanta. Takođe pi nije promenljiva jer joj se vrednost ne može menjati nego je imenovana konstanta. Naredba read Ostaje da razbistrimo linije 22 i 24 gde je nova naredba read*. U komentaru piše 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 izvršava (redom počevši od prve linije pa nadalje) dođe do te linije zaustaviće svoje izvršavanje i na ekranu ćete videti ovako nešto: T= _

Page 18: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

18

Prikaz T= je zahvaljujući naredbi print* u liniji 21. Program je sada kod linije 22 i čekaće da nešto 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 očekuje da unesemo eksplicitnu konstantu. Vrednost te konstante će biti dodeljena promenljivoj T. Možemo 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 izvršiti konverziju celobrojne eksplicitne konstante u realnu vrednost i ta vrednost biti dodeljena promenljivoj T. Posle tipke ENTER na ekranu će biti v= _ Naravno pogađate, unosimo vrednost za v T= 300 v= 2.5_ i naravno posle pritiska na ENTER dobijamo konačno na ekran rezultat sledeća 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 nađete pred računarom koji čeka, a vi ne znate šta sad treba da radite. U tom slučaju studenti pitaju:"A kako se ovo zaustavlja?". Program se nasilno zaustavlja kombinacijom tipki CTRL-C. Opšti oblik naredbe read je read*,ime1,ime2,...,imen koja kazuje da će se program kod ove naredbe zaustaviti i očekivati unos n eksplicitnih konstanti razdvojene zarezima. Unos se potvrđuje sa tipkom ENTER. Posle toga će te

Page 19: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

19

vrednosti biti smeštene 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. Očekuje se unos tri eksplicitne realne (ili celobrojne) konstante, razdvojene zarezom. Unesite 1,5,8 i potvrdite tipkom ENTER. Tada se opet program zaustavlja kod sledeće read naredbe, linija 8. Očekuje dve vrednosti. Unesite 9,5 i potvrdite tipkom ENTER. Na ekranu ćete dobiti sledeće. 1,5,8 9,5 1.0000000 5.0000000 8.0000000 9 5 Press any key to continue . . . Pretpostavimo sada da ste statovali sledeći program i uneli ovako nešto 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 nešto buni. U čemu je problem? Uneli smo tri eksplicitne konstante kao što i očekuje i to su 1×108 , 10.3 i 100. Šta ne valja? Ne valja to što se eksplicitna konstanta 1×108 ne predstavlja kao 1.0*10^8 nego kao 1.0e-8 (to smo već rekli). Ponovimo unos 1.0e-8,10.8,100

Page 20: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

20

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 poprilično bliske, ali nisu iste. Nećemo se baviti tzv. preciznošću prezentacije realnog broja u računaru i prihvatićemo da je ovo dovoljno tačno. Standardne ugrađene numeričke i matematičke funkcije Neko bi postavio pitanje. Dobro, prethodni primer pokazuje da možemo izvršiti neki proračun gde figurišu osnovne računske radnje. Neko bi se i složio da je ovo, u nekim slučajevima, lakše nego koristiti kalkulator. A šta ako, pored toga, u izrazima figurišu neke matematičke funkcije kao što su trigonometrijske, logaritamske itd. To svaki kalkulator ima. Logično bi bilo da toga ima i u F-u. Naravno da ima, i to u mnogo većem obimu nego što imate na kalkulatorima. F, kao i većina programskih jezika, ima ugrađen određen broj funkcija. Kada koristite kalkulator i želite, na primer, da izračunate dekadni logaritam broja 100 onda morate da na kalkulatoru vidite gde je tipka koje baš to računa. Obično na toj tipki piše log. Onda ukucate 100 i pritisnete tipku log. Na monitoru dobijete rezultat 2. Šta vam je bilo potrebno da bi ste izveli ovaj "komplikovan" proračun. Prvo, da znate koju tipku da pritisnete. Drugo, da unesete ono što ova tipka očekuje a to je jedan broj, i na kraju dobijate rezultat. U principu, interesuje vas rezultat a ne kako je kalkulator do toga došao. Slična logika važi i kod F-a. Prvo, morate da znate ime određene funkcije koja računa ono što tražite (kod kalkulatora - tipka log). Drugo, morate da toj funkciji date ono što ona očekuje (kod kalkulatora - jedan broj npr.100) i dobijate rezultat. Naravno, ni ovde se ne zamarate kako je to računar izračunao. Tako je opšti oblik funkcije u F-u: ime_funkcije(ar1, ar2,..., arn) gde je ime_funkcije identifikator tj. ime funkcije i podleže pravilima za identifikatore a ar1,1r2,...,arn argumenti funkcije razdvojeni zarezima koji su, u opštem slučaju, izrazi.Tako bi smo u F-u mogli napisati kao: log10(100) što znači da je ime_funkcije log10 - dobićemo dekadni logaritam -, a iza imena u zagradi stoji od čega tražimo logaritam - ovde od broja 100 -. A gde bi smo mi to napisali? To ne može tako da "visi" u nekoj liniji jer funkcija vraća rezultat. Šta ćemo sa tim rezultatom? Pa ako je rečeno da funkcija vraća rezultat, setite se gde se nešto računa i vraća se rezultat. Pomenuli smo izraz kao nešto što vraća rezultat. Do sada smo rekli da u izrazu figurišu eksplicitne konstante, imenovane konstante, promenljive i operatori. Pogađate, u izrazu mogu figurisati i funkcije. Tako bi smo mogli napisati: rez = log10(100)

Page 21: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

21

ili print*,log10(100) što će u bilo kom programu prouzrokovati ovakvu grešku: Non-REAL argument to intrinsic function LOG10 Pa što sad greška? Kaže nam se da argument ugrađene (intrinsic) funkcije log10 nije tipa real. Bitna stvar je za svaku funkciju je, pored toga da znate šta vam vraća kao rezultat, broj argumanata tako i tip svakog argumanta. Funkcija log10 očekuje 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 slučaju 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 (možda sam malo dosadan sa ovim: s leve strane ovo s desne ono?). U drugom slučaju će se na ekranu prikazati vrednost izraza a to je takođe 2.0. Pogledajte sledeće 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 zaključiti da će promanljiva izraz imati vrednost log 10000.0 tj.4.0. Evo nekih numeričkih i matematičkih funkcija. Ove funkcije imaju kao argumente numeričke vrednosti i kao rezultat vraćaju numeričku vrednost. Numeričke abs(x) apsolutna vrednost int(x) celobrojni deo od x max(x1,x2,x3...) maksimalna vrednost min(x2,x2,x3...) minimalna vrednost real(x) pretvaranje x u realan

Page 22: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

22

Matematičke: acos(x) arkus kosinus (rezultat u radijanima) asin(x) arkus sinus (rezultat u radijanima) atan(x) arkus tanges (rezultat u radijanima) atan2(y,x) arkus tanges od y/x (rezultat u radijanima) cos(x) kosinus ugla (argumant u radijanima) cosh(x) kosinus hiperbolični exp(x) ex log(x) ln x (prirodni logaritam) log10(x) log x (dekadni logaritam) sin(x) sinus ugla (argumant u radijanima) sinh(x) sinus hiperbolični sqrt(x) kvadratni koren tan(x) tangens ugla (argumant u radijanima) Ako pogrešite tip argumanta ovih funkcija (realan ili celobrojan) F će vas uredno o tome opomenuti. Unesite ovaj program pa se malo pozabavite rezultatima i obnovite vaše znanje iz elemenatrnih matematičkih 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)

Page 23: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

23

29 print*,log10 (z) !log x (dekadni logaritam) 30 print*,sin(pi/2) !sinus ugla 31 print*,sinh(z) !sinus hiperbolicni 32 print*,sqrt(z) !kvadratni koren 33 print*,tan(pi/4) !tangens ugla 34 35 !Hiperbolicne funkcije su definisane preko e**x 36 !tako je 37 !sinh(x) = (exp(x) - exp(-x))/2 38 print*,(exp(z) - exp(-z))/2 39 !cosh(x) = (exp(x) + exp(-x))/2 40 print*,(exp(z) + exp(-z))/2 41 endprogram funkcije Česta greška kod studenata početnika je na primer ovako nešto ... x = 100 rez = logx ... sa namerom da se koristi funkcija za prirodni logaritam, ali se zaborave zagrade. Naravno, dobiće se poruka da promenljiva logx nije deklarisana jer to F tretira kao promenljivu. PRIMER: Potrebno je izračunati napon pare p0 tiofena na datoj temperaturi T. Napon pare se računa Cox-Antoine-ovom jednačinom po izrazu

CT

BAp−

−=0log

gde su:

b

b

bb

b

TCTR

HCTB

CTBA

⋅+−=⋅⋅

∆⋅−⋅=

−=

19.01810ln

)(05.12

2

Potrebni podacu su: R = 8.315 - univerzalna gasna konstanta Tb = 357.3 - normalna temperatura ključanja ∆Hb = 31485 - latentna toplota isparavanja Ako se pogleda ovaj primer uočava se da nam je sve zadato, osim temperature T. Temparturu ćemo uneti sa tastature i neka njena vrednost bude T = 500. Evo rešenja:

Page 24: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

24

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 dobićete na ekranu zahtev za unos temperature. Unesite 500 i pritisnite enter. Onda ćete na ekranu videti sledeće: 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 računa p0 nego log p0 studenti početnici ponekad ovo napišu ovako 25 log10(p0) = A - B/(T - C) 26 p0 = 10**log(p0) dobićete sledeće poruke o greškama pri pokušaju 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]

Page 25: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

25

Što znači da to ne može da prođe. Zašto? Kada imate više poruka o greškama, najjednostavnije je da pogledate prvu i da to korigujete jer sledeće greške su često posledica prve. Prva greška kaže da je nedozvoljena leva strana naredbe dodeljivanja. Šta bi tu bila greška? Pa napisali smo ime za funkciju dekadni logaritam kako je rečeno i u zagradi od čega tj. log10(p0). Da ponovimo još jednom. Sa leve strane znaka za dodeljivanje ne može da stoji ništa što nije korektno ime već deklarisane promenljive a pogotovo ne neka namera poziva funkcije kao u ovom slučaju. Kontrolne strukture: Struktura odlučivanja (if), Struktura ponavljanja (do) U prethodnim primerima su se programi izvršavali sekvencijalno (naredba po naredba redom odozgo nadole) i svaka naredba je izvršena samo jednom. Naredbe koje određuju koja grupa naredbi (blok naredbi) se izvršava se zovu kontrolne strukture. - if struktura dozvoljava izbor izvršavanja samo jednog bloka od više blokova naredbi. - do struktura izvršava blok naredbi određen broj puta. if struktura If struktura služi da se odlučimo samo za jedan od više blokova naredbi. To je znači pitanje izbora i odluke. Na primer, ako putujete od Beograda do Pariza mora da se da izaberete i da se odlučite za sredstvo putovanje. Vaše razmišljanje bi moglo da bude: * ako se žurite i imate para onda ◊ avionom sa Surčinskog aerodroma * inače ako ste romantični i volite vozove onda ◊ možete vozom sa Beogradske železničke stanice * inače ako imate puno vremena i mnogo živaca onda ◊ možete autobosom preko kompanije “Mićko Lapovac” * inače ◊ uvek možete pešaka (ili autostopom) Ako ovako razmišljate onda će redosled koji je naveden uslovljavati prioritet. Pretpostavimo da - se žurite i imate para - a takođe da - ste romantični i volite vozove - onda ćete na osnovu prethodnog razmišljanja putovati - avionom sa Surčinskog 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

Page 26: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

26

If na engleskom znači ako a then znači onda dok else znači inače. Primetite da je if početak ove strukture a endif završetak. I šta kaže ova if struktura. Razmatraju se izbori izbor_1, izbor_2,... redom i kada je prvi od tih izbora tačan onda se izvršava odgovarajuća 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 izvršava u zavinosti od izbora pitanje je, šta je u F-u izbor a šta odluka. U if strukturi izbor predstavlja logički izraz a odluka predstavlja niz instrukcija koje se izvršavaju ako je logički izraz tačan. Šta je to logički izraz? Ako pogledate koji su osnovni tipovi promenljivih u F-u videćete i tip logical. Taj tip ima samo dve vrednosti. Logički izraz je kombinacija logičkih konstanti, logičkih promenljivih, logičkih operatora i logičkih funkcija. Naravno, logički operatori i funkcije daju kao rezultat logičku vrednost, odnosno tačno (.true.) ili netačno (.false.). Logički relacioni operatori U Najjednostavniji oblik logičkih (relacionih) operatora je onaj koji upoređuje dve numeričke vrednosti (konstante, promenljive ili izraze), na primer: Operator Značenje < manje <= manje ili jednako > veće >= veće ili jednako == jednako /= različito U matematici bi smo rekli da ovi operatori fugurišu u nejendančinama. Obeležavaju se sa jedan ili dva karaktera i liče na ekvivalentne operatore iz matematike.Relacioni operatori se izvršavaju sleva nadesno i svi imaju isti prioritet. Logički Bulovi operatori Ovo operatori realizuju operatore Bulove algebre i u F-u postoje sledeći operatori. .not. najviši .and. .or. .eqv.,.neqv. najniži

Page 27: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

27

Pišu se sa dva do tri slova između tačaka. Prioritet je naveden u tabeli. Tabela istinitosti ovih operatora je sledeća. Tabela istinitosti x y .not.x x.and.y x.or.y x.eqv.y x.neqv.y T T F T T T F T F F F T F T F T T F T F T F F T F F T F

Primeri nekih ispravnih logičkih izraza su: (a<b) .or. (c>d) (x<=y) .and. (y<=z) .not. (a<b) .eqv. (x<y) a<b .neqv. x<y Neispravni logički 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 logičkih operatora su logičke a ne numeričke vrednosti. Mogu li se kombinovati svi navedeni operatori u logičkom izrazu? Mogu, ali treba imati u vidu njihove prioritete. Međusobne prioritete smo pominjali a ako se uzmu svi operatori u obzir, onda je redosled sledeći: aritmetički, relacioni, Bulovi. Naravno, uvek možete koristiti male zagrade za promenu prioriteta operatora. Sada pogledajte navedene primere ispravnih logičkih izraza i odredite gde su zagrade nepotrebne a kod neispravnih izraza odredite zašto su neispravni. Sada kad pogledamo F program P4 vidimo da on računa napon pare samo za tiofen za različite temperature (unosimo ih sa tastature). Šta ako nas interesuje da to računamo za različite supstance. Tada ova metoda kaže da proračun parametra C zavisi od date supstance po sledećem izrazu

≥⋅+−<⋅+−

= 125 za19.018

125 za34.03.0

bb

bb

TTTT

C

pa ćemo malo prepraviti naš program. 1 program P5 2 !Proracun napona pare po 3 !Cox-Antoine jednacini 4 5 real,parameter :: R = 8.315 6 real :: P0,T

Page 28: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

28

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 karakteristični parametri za datu supstancu. Kada startujete ovaj program dobićete na ekranu zahtev da unesete ime sustance - ponovićemo proračun baš za tiofen. Posle unosa karakterističnih parametara i temperature dobićemo na ekran sledeće: Supstanca = tiofen Tb = 357.3 dHb = 31485 T = 500 Supstanca = tiofen

Page 29: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

29

p0 = 20.8054504 Press any key to continue . . . Pogledajte kako je napisana if struktura za proračun parametra C . Primetite da su linije za 25 i 27 malo uvučene. Ovo se zove "nazubljivanje" programa. Služi povećavanju čitljivosti programa. Možete to, naravno napisati i ovako. 24 if (Tb<125) then 25 C = -0.3 + 0.34*Tb 26 else 27 C = -18 + 0.19*Tb 28 endif što i nije neki problem, ali ako imate više linija između if , elseif i else biće malo teže da se snađemo. U opštem slučaju je veoma preporučljivo nazubljivati program naročito kada su strukture u pitanju. Pogotovo je problem kada i blokovi naredbi sadrže druge if strukture što može biti veoma čest izvor grešaka. U tom smislu pogledajmo, na primer, jedno od načina za rešavanje poznate nam kvadratne jednačine Kvadratna jednačina 02 =++ cbxax gde se a,b,c koeficijenti a x nezavisno promenljiva. Ova jednačina ima sledeće rešenja, tj. korene

a

acbbx2

42 −±−=

Evo šta smo odlučili da uradimo u ovom slučaju: 1. Treba definisati da koeficijent a mora biti različit od 0 jer u protivnom se ne radi o kvadratnoj jednačini. 2. Ako je 042 >− acb onda su koreni realni i različiti 3. Ako je 042 =− acb onda su koreni realni i dvostruki tj.

abx

2−

=

4. Ako je 042 <− acb onda su koreni različiti i kompleksni Jedno od rešenja je sledeći program

Page 30: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

30

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 if (a/=0) then 12 D = b**2-4*a*c 13 if (D>0) then 14 x1 = (-b + sqrt(D))/(2*a) 15 x2 = (-b - sqrt(D))/(2*a) 16 print*,"Koreni su:" 17 print*,"x1=",x1 18 print*,"x2=",x2 19 elseif (D==0) then 20 x = -b/(2*a) 21 print*,"Koreni su realni i dvostruki:" 22 print*,"x=",x 23 else 24 print*,"Koreni su kompleksni" 25 endif 26 else 27 print*,"Nije kvadratna jednacina!" 28 endif 29 30 endprogram kv_jedn Iz ovog programa se jasno vidi, na osnovu uvlačenja delova programa, od kojeg if je njegovo elseif, else i endif jer u istoj koloni počinju odgovarajuće ključne reči date if strukture. If u liniji 11 je u vezi sa else u liniji 26 i na kraju njhovo endif je u liniji 28. Takođe, 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 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"

Page 31: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

31

10 read*,c 11 if (a/=0) then 12 D = b**2-4*a*c 13 if (D>0) then 14 x1 = (-b + sqrt(D))/(2*a) 15 x2 = (-b - sqrt(D))/(2*a) 16 print*,"Koreni su:" 17 print*,"x1=",x1 18 print*,"x2=",x2 19 elseif (D==0) then 20 x = -b/(2*a) 21 print*,"Koreni su realni i dvostruki:" 22 print*,"x=",x 23 else 24 print*,"Koreni su kompleksni" 25 endif 26 else 27 print*,"Nije kvadratna jednacina!" 28 endif 29 30 endprogram kv_jedn Ovakav program je apsolutno odbojan za gledanje i počinje da zamara posle kraćeg pokušaja da pohvatate gde tu počinje if struktura, gde se završava itd. Program je korektno napisan ali je težak za razumevanje . Ko ima živaca neka prvo pokuša da shvati šta ovaj naredni program radi. Inače, program "radi" korektno ali je takođe 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

Page 32: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

32

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 traži 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 napišemo drugačije. 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 složiti da se iz ove druge verzije mnogo jasnije vidi šta program radi. Možete to još malo učiniti čitljivijim jer F dopušta ovako nešto

Page 33: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

33

if (izbor) odluka u slučaju da je odluka samo jedna naredba. Tako bi treća 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 izvršavale samo jednom (ili nijednom ako su u if strukturi). Ako želimo neki proračun da ponovimo, možemo ga ponoviti kao što smo već rekli, tako što ćemo ponovo startovati program. Ali šta ako samo neke neradbe hoćemo da ponovimo a da ne startujemo sve od početka. Za to služi do struktura (ili petlja) čiji je najjednostavniji sledeći oblik do naredbe enddo Koja kaže de se sve naredbe između do i enddo ponavljaju. Evo jednog primera gde ćemo ovo da probamo

Page 34: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

34

1 program pranjekose 2 do 3 print*,"Nasamponiraj" 4 print*,"Isperi" 5 enddo 6 endprogram pranjekose Ako ovaj program unesete i startujete videćete da će ispred vas leteti neki tekst, naslućujete da se stalno ponavlja tekst Nasamponiraj i Isperi, tj. da se naredbe u linijama 3 i 4 stalno ponavljaju ali se program ne zaustavlja. Možete da čekate koliko god hoćete ali ovo neće da se zaustavi. Ovo se zove beskonačna petlja. Po anegdoti je rasejani programer pročitao na uputstvu za šampon (Našamponiraj, Isperi, Ponovi) i verovatno bi dobio zapaljenje pluća 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 određen broj puta, na primer da pranje kose ponovimo 3 puta korigovaćemo prethodni program na sledeći način 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 sledeće 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 opštem obliku ima izgled promanljiva = izraz1,izraz2,izraz3 i kaže 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 premaši vrednost izraz2 izlazi se iza enddo. Primetimo da su i

Page 35: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

35

promenljiva i izrazi celobrojni. Ako se ne navede izraz3 podrazumeva se korak 1 (kao u našem primeru). Zaključak je da se naredbe u petlji izvršavaju određen broj puta i da kontrolna promenljiva petlje uzima određene vrednosti. Kontrolna promenljiva takođe može da figuriše unutar petlje (kao u našem primeru pranjekose1). Deluje komplikovano dok se objašnjava ali pogledajte malo ove primere korišćenja kontrole do strukture pa pokušajte da zakjlučite kako ovo radi.

do naredba broj ponavljanja kontrolna promenljiva do i = 1,10 10 1,2,3,4,5,6,7,8,9,10 do j = 20, 50, 5 7 20,25,30,35,40,45,50 do p = 7, 19, 4 4 7,11,15,19 do q = 4, 5, 6 1 4 do r = 6, 5, 4 0 (6) do x = -20,20, 6 7 -20,-14,-8,-2,4,10,16 do n = 25, 0, -5 6 25,20,15,10,5,0 do m = 20, -20, -6 7 20,14,8,2,-4,-10,-16 Česta greška je korištenje kontrolne promenljive petlje van petlje u kojoj se koristi. Evo naše namere da nesretnom programeru i kažemo 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 sledeći 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 zašto je to tako. Kontrolna promenljiva petlje i u petlji ima vrednost 1,2,3 jer je početna vrednost 1 krajnja 3 i korak je 1. Kada vrednost i dostigne veću vrednost od 3 (u

Page 36: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

36

ovom slučaju 4) izlazimo iz petlje. Da skratimo, ovo korištenje kontrolnih promenljivih petlji izvan petlje nije preporučljivo. Standardan i vrlo čest problem je da, na primer, saberemo n brojeva koje unosimo sa tastature tj. da nađemo njihovu sumu. Prvo ćemo to da uradimo na krajnje neefikasan i neelegantan način 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 izvršava samo jednom i zaključite zašto 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 . . .

Page 37: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

37

Malo je "ograničeno" jer smo ovde sabrali samo 4 broja. Šta ako hoćemo da saberemo jednom 3 drugi put 10 a treći put 30 brojeva? Primetite da se određen broj naredbi ponavlja. Kad se ponavljaju određene naredbe, eto nama do strukture. Evo ga rešenje prethodnog problema ali sada nismo ograničeni na 4 broja nego ćemo sa tastature uneti koliko god brojeva hoćemo 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 sledeće podatke dobićemo 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 napišete program za, na primer, sumu kvadrata unetih n brojeva ili proizvod n brojeva itd.

Page 38: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

38

naredba stop Pažljiviji čitalac bi se zapitao zašto smo uopšte spomenuli beskonačnu do strukturu kad moramo program nasilno da zaustavimo (to je inače nekad neizbežno). Može li se program "mirnim putem" zaustaviti. Za zaustavljanje programa uopšte, a ne samo kada smo u beskonačnoj petlji, služi 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, kontrolišete šta je uneto sa tastature i daje vam ideju kako da to koristite u vašim programima. naredba exit Ako želimo ipak da damo šansu onom ko unosi vrednosti sa tastature da se popravi možemo korististi beskonačnu do petlju i naredbu exit koja služi za izlaz iz do petlje (beskonačne ili kontrolisane). Evo da vidimo kako to funkcioniše 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

Page 39: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

39

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 beskonačna do petlja (linije 6-19). Unutar te petlje je naredba exit koja će usloviti izlaz iz ove petlje, tj. nastavak programa iza linije 19. Međutim, do izlaska iz petlje ćemo doći 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š može koristiti i naredba cycle. Ova naredba vraća nastavljanje programa na prvu naredbu ispod početka 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

Page 40: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

40

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 izvršavanja 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 vraća na liniju 7. Ova dva primera kontrole unosa imaju za cilj da vam razjasne kako funkcionišu naredbe exit i cycle. Dobro ih proučite i pokušajte 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"

Page 41: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

41

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 Naravoučenije je da se pažljivo koriste beskonačne do petlje u kombinaciji sa exit i cycle. Ugnježdene if i do strukture Kao što je već rečeno i kako smo videli u prethodnim primerima unutar jedne if ili do strukture mogu biti druge if ili do strukture. Ovo je čest izvor grešaka . Kako smo mi to do sada lepo "nazubljivali" program vidi se gde je početak 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

Page 42: Programki jezik F - tf.uns.ac.rsomorr/radovan_omorjan_003/F-compiler-1.pdf · Od sad pa nadalje i ubuduće, sve što mora u F-u da se imenuje tj. sve čemu moramo da smislimo ime

42

F će da se buni sa sledećim 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] Pokušajte sami da otkrijete gde je greška.