UPORABA UREJEVALNIKA IN PREVAJALNIKA MS FORTRAN POWER STATION POSTOPEK JE SLEDEČ: 1. START -> PROGRAMS -> FORTRAN POWER STATION 4.0 FORTRAN POWER STATION 4.0 -> MS DEVELOPER STUDIO 2. FILE -> NEW -> PROJECT WORKSPACE 3. V OKVIR VPIŠEMO IME PROJEKTA NPR. VAJA1310A1 4. CREATE FILE -> NEW -> TEXT FILE 5. NAPIŠEMO PROGRAM 6. FILE -> SAVE AS -> VPIŠEMO IME PROGRAMA(*.F90) 7. BUILD -> COMPILE (PREVEDI) 8. POPRAVIMO NAPAKE V PROGRAMU -> PONOVNO SHRANIMO SPREMEMBE IN PONOVIMO TOČKO 7. 9. KO NI NAPAK -> BUILD -> BUILD (POVEŽEMO PAKETE OBLIKE)(*.OBJ) 10. POŽENEMO IZVRŠILNI PROGRAM -> BUILD -> EXECUTE(*.EXE) OSNOVE PROGRAMIRANJA V FORTRANU PROGRAM JE LAHKO SESTAVLJEN IZ: - PODPROGRAM - STAVEK-UKAZ - KLJUČNE BESEDE - ZNAKI PROGRAM ime programa!fizični začetek programa Deklaracijski ukazi Izvedbeni ukazi!fizični konec programa VRSTE SPREMENLJIVK: Celoštevilske spremenljivke INTEGER*2 INTEGER *4 Realne spremenljivke REAL*4 REAL*8 Kompleksne spremenljivke COMPLEX Logične spremenljivke LOGICAL Znakovne spremenljivke CHARACTER MATEMATIČNI IZRAZI V FORTRANU. Uporabljamo naslednje oznake: Enačaj = Decimalna pika. Okrogli oklepaj in zaklepaj ( ) 1
MATEMATIČNE OPERACIJE: Seštevanje + Odštevanje - Množenje * Deljenje / Potenciranje ** Prednostni red operacije od spodaj navzgor, prednost spremenimo s poljubnim številom okroglih oklepajev ( ). TABELA NAJBOLJ POGOSTO UPORABLJANIH MATEMATIČNIH FUNKCIJ: Oznaka Ime Oblika Tip Spremenljivke SQRT(X) kvadratni koren ^ R ali C +R ali C SIN(X) sinus sin(x) R R COS(X) kosinus cos(x) R R TAN(X) tangens tg(x) R R SIND(X) sinus sin(x) R R v stopinjah COSD(X) kosinus cos(x) R R v stopinjah TAND(X) tangens tg(x) R R v stopinjah R ASIN(X) arkus sinus arcsin(x) R R ACOS(X) arkus kosinus arccos(x) R R ATAN(X) arkus tg arctg(x) R R ATAN2(Y,X) arctg(y/x) R R ALOG(X) nar. logaritem ln(x) R R LOG(X) nar. logaritem ln(x) R ali C R ali C EXP(X) eksponentna e* R R ABS(X) absolutna v. x R I,R,C IABS(X) absolutna v. x I I AIMAG(Z) Imag. del. k. st. R C CONJG(Z) konjugirano C C INT(X) R v I I R REAL(X) I v R R I ANINT(X) okrajšanje R R NINT(X) odreže decimal. R R MAX(X;Y) večja vrednost * * MIN(X;Y) manjša vrednost * * 2
KOLIČINE UVAJAMO NA VEČ NAČINOV: Običajno jih uvajamo v deklaracijskem delu programa ali kjerkoli. PARAMETER (ime = vrednost) PARAMETER (X = 7.2,1=231, IME='Janez', Z = 5*I+X) DATA ime /vrednost/ DATA PI/3.1415/ X = 7.2 READ*,X READ*,N,(X1(I),X2(I),I=1,N)!v gnezdena DO zanka IZPIS REZULTATOV PRINT*,X,A WRITE (*,*)X,A WRITE (*,*)(X1(I),X2(I),I=1,N) KRMILNE STAVKE UPORABIMO, ČE ŽELIMO RAZVEJATI PROGRAM: BREZPOGOJNI SKOK GOTO številka stavka GOTO 12 USTAVITEV PROGRAMA STOP 'komentar' STOP 'Ustavil sem se sredi programa' PAUSE 'komentar' PAUSE 'Pritisni ENTER in program se bo nadaljeval' KRETNICE Z UPORABO BREZPOGOJNEGA STAVKA Kadar zahtevamo, da se program brezpogojno nadaljuje na nekem stavku, potem ta stavek označimo s številko pred stavkom. Z ukazom GOTO in številko stavka kjer želimo nadaljevati s programom razvejimo program. Stavek GOTO uporabljamo le izjemoma, ker v nasprotnem primeru postane program nepregleden. GOTO (številke stavkov) zaporedna številka GOTO (11, 12, 20) n n je lahko 1, 2 ali 3. 1 pomeni skok na 11, 2 skok na 12 in 3 skok na 20. 3
IF STAVKI KOT KRETNICE 1. Logični IF stavek IF (logična izjava) ukaz Enostavni logični IF stavek omogoča izvedbo fortranskega ukaza, ki mu sledi v odvisnosti od vrednosti logičnega izraza. Ukaz se izvede le takrat, kadar ima logična izjava pravilna sicer se ukaz preskoči. PRINT*,"Vnesi oceno=" read*,n IF (n.le.5) PRINT*,"Negativna ocena" PRINT*,"Ocena je pozitivna" 2. Logični IF blok IF (logična izjava) THEN ukazi IF Če je logična izjava pravilna se izvedejo ukazi, ki so postavljeni med THEN in IF. Če logična izjava ni pravilna, se izvedejo ukazi, ki sledijo IFu. PRINT*,"Vnesi oceno=" read*,n IF (n.le.5) THEN PRINT*,"Negativna ocena" PRINT*,"Potreben bo bolj intenziven studij!" IF PRINT*,"Ocena je pozitivna" IF (logična izjava) THEN ELSE ukazi 1 ukazi 2 IF Včasih zahtevamo, če logična izjava ni pravilna, da se izvede niz nekih ukazov. Če je logična izjava pravilna se izvede niz ukazi 1, sicer se izvede niz ukazi 2. 4
PRINT*, " Vnesi stevilo=" READ*,N IF(N.GE.0)THEN PRINT*,N,SQRT(N) STOP ELSE PRINT*,"Ponovno zazeni program" STOP "Kvadratnega korena ni mogoce izracunati!" IF 3. Logični IF blok z več alternativami IF (logična izjava 1) THEN ukazi 1 ELSEIF(logična izjava 2) THEN ukazi 2 ELSEIF(logična izjava 3) THEN ukazi 3 ELSEIF(logična izjava n) THEN ELSE ukazi n ukazi IF Včasih zahtevamo, da se v odvisnosti od različnih logičnih izjav (logična izjava 1, 2, 3.. n) izvajajo različni nizi ukazov (ukazi 1, 2, 3.. n). V primeru, da nobena logična izjava ni ustrezna, potem se izvedejo ukazi med ELSE in IF. 5
4. Aritmetični IF stavek IF(aritmetični izraz) s1,s2,s3 s1 ukaz 1 s2 ukaz 2 s3 ukaz 3 Aritmetični if stavek uporabimo v primeru, kadar se morajo v odvisnosti od aritmetičnega izraza oziroma nekega pogoja, izvajati različne skupine stavkov. Oznake s1, s2 in s3 predstavljajo stavčne številke izvršilnih stavkov. Če je vrednost aritmetičnega izraza negativna se izvede oznaka s1 oziroma ukaz 1. Če je vrednost aritmetičnega izraza enaka nič se izvede oznaka s2 oziroma ukaz 2. Če je vrednost aritmetičnega izraza večja od nič se izvede oznaka s3 oziroma ukaz 3. Aritmetični if stavek se najpogosteje uporablja za nadzor nad vrednostmi vhodnih spremenljivk. PRINT*,"Vnesi stevilo=" READ*,N IF(N-1)5,10,15 5 N=N-1 10 N=N+0 15 N=N+1 PRINT*,N Primerjalni operatorji Primerjalne operatorje imenujemo tudi aritmetični ali relacijski primerjalni operatorji. Dovoljeno je primerjati med seboj tudi vrednosti tipa CHARACTER (znakovne spremenljivke). Vrednost teh spremenljivk se določi glede na lego znakov v ASCII tabeli in jih zaradi te lastnosti lahko primerjamo med seboj. Rezultat operacije je vedno logična vrednost. Primerjalni operatorji Alternativna oblika Pomen.LT. < manjši kot.le. <= manjši ali enak.eq. == enak.ne. /= različen.gt. > večji kot.ge. >= večji ali enak 6
Povezave v sestavljeni izraz z logičnimi operatorji:.and..or. SLIKA PRIKAZUJE PRISEKAN STOŽEC OPOMBA: ZAČETKI IN KONCI PROGRAMOV SO OBARVANI RUMENO! INTEGER R1,R2 REAL L,H,V,P PARAMETER(PI=3.14) R1=6!R=R1,r=R2 R2=8 H=5.0!H=VISINA!L=STRANSKI ROB!V=VOLUMEN L=SQRT(H**2+(R1-R2)**2) V=(PI*H*(R1**2+R2**2+R1*R2))/3 P=PI*(R1**2+R2**2+L*(R1+R2)) PRINT*,L PRINT*,V PRINT*,P INTEGER R1,R2 REAL L,H,V,P PARAMETER(PI=3.14)!R=R1,r=R2 PRINT*,'VNESI R1,R2 IN VISINO H:' READ*,R1,R2,H!H=VISINA!L=STRANSKI ROB!V=VOLUMEN L=SQRT(H**2+(R1-R2)**2) V=(PI*H*(R1**2+R2**2+R1*R2))/3 P=PI*(R1**2+R2**2+L*(R1+R2)) PRINT*,'REZULTATI:' PRINT*,L PRINT*,V PRINT*,P 7
FORMATNA DOLOČILA Pri branju vhodnih podatkov naj prosti format zapisa običajno ustreza. Pri izpisu so izpisani v prostem formatu nepregledni. Nepreglednost podatkov preprečimo z uporabo formatnih določil, ki natančno določajo obliko zapisa neke znakovne ali številke spremenljivke. Formatno določilo A je rezervirano za znakovne spremenljivke (besede), formatna določila I,F,E za številske spremenljivke. Cela števila -> I specifikacija kiw.m kjer posamezni elementi pomenijo: I - cele vrednosti w - število mest k - ponovitveni faktor formatnega določila m - število mest števila pri izpisu (če je cifer manj kot m, se spredaj dopolni z ničlami) Realna števila -> F (navadna) in E (eksponentna) specifikacija kfw.d kjer posamezni elementi pomenijo: F - realno število navadne oblike w - število mest k - ponovitveni faktor formatnega določila d - število decimalnih mest kew.d kjer posamezni elementi pomenijo: E - eksponentna oblika realnega števila w - število mest k - ponovitveni faktor formatnega določila d - število decimalnih mest Znakovne vrednosti A specifikacija kaw kjer posamezni elementi pomenijo: A - znakovna vrednost w - število mest k - ponovitveni faktor formatnega določila SINTAKSA FORMATNIH DOLOČIL: S stavkom WRITE: WRITE('formatna določila') lista spremenljivk WRITE('1X,'VNESI R1=',2X,\\') WRITE('1X,A6,F6.3,/,1X,A10,F7.2,/,lX,A11,E8.3') ROB,L,VOL,V,POV,P S stavkom FORMAT: številka FORMAT (formatna določila). Navedimo naslednji primer: 10 FORMAT(1X,'VNESI R1=',2X,\\) 40 FORMAT(1X,A4,F6.3,/,1X,A8,F7.2,/,1X,A9,E8.3) 8
INTEGER R1,R2 REAL L,H,V,P PARAMETER(PI=3.14) CHARACTER ROB*4,VOL*8,POV*9!R=Rl,r=R2 ROB='ROB=' VOL='VOLUMEN=' POV='POVRSINA='!VNOS VHODNIH PODATKOV WRITE(*,10) READ*,R1 WRITE(*,20) READ*,R2 WRITE(*,30) READ*,H!H=VISINA!L=STRANSKI ROB!V=VOLUMEN!IZRACUN L=SQRT(H**2+(R1-R2)**2) V=(PI*H*(R1**2+R2**2+R1*R2))/3 P=PI*(R1**2+R2**2+L*(R1+R2))!IZPIS PODATKOV PRINT*,'REZULTATI' WRITE(*,40)ROB,L,VOL,V,POV,P 10 FORMAT(1X,'VNESI R1=',2X,\\) 20 FORMAT(1X,'VNESI R2=',2X,\\) 30 FORMAT(1X,'VNESI VISINO H=',2X,\\) 40 FORMAT(1X,A4,F6.3,/,1X,A8,F7.2,/,1X,A9,E8.3) 9
INTEGER R1,R2 REAL L,H,V,P PARAMETER(PI=3.14) CHARACTER ROB*4,VOL*8,POV*9!R=R1,r=R2 ROB='ROB=' VOL='VOLUMEN=' POV='POVRSINA='!VNOS VHODNIH PODATKOV WRITE(*,10) READ*,R1 IF(R1)100,200,300 100 STOP'RADIJ JE NEGATIVEN!' 200 STOP'RADIJ JE ENAK NIC!' 300 CONTINUE WRITE(*,20) READ*,R2 IF(R2)100,200,350 350 CONTINUE WRITE(*,30) READ*,H IF(H)400,500,600 400 STOP'VISINA JE NEGATIVNA!' 500 STOP'VISINA JE ENAKA NIC!' 600 CONTINUE!H=VISINA!L=STRANSKI ROB!V=VOLUMEN!IZRACUN L=SQRT(H**2+(R1-R2)**2) V=(PI*H*(R1**2+R2**2+R1*R2))/3 P=PI*(R1**2+R2**2+L*(R1+R2))!IZPIS PODATKOV PRINT*,'REZULTATI:' WRITE(*,40)ROB,L,VOL,V,POV,P 10 FORMAT(1X,'VNESI R1=',2X,\\) 20 FORMAT(1X,'VNESI R2=',2X,\\) 30 FORMAT(1X,'VNESI VISINO H=',2X,\\) 40 FORMAT(1X,A4,F6.3,/,1X,A8,F7.2,/,1X,A9,E8.3) 10
INTEGER R1,R2 REAL L,H,V,P PARAMETER(PI=3.14) CHARACTER ROB*4,VOL*8,POV*9!R=R1,r=R2 ROB='ROB=' VOL='VOLUMEN=' POV='POVRSINA='!VNOS VHODNIH PODATKOV 1000 WRITE(*,10) READ*,R1 IF(R1)100,200,300 100 STOP'RADIJ JE NEGATIVEN!' 200 STOP'RADIJ JE ENAK NIC!' 300 CONTINUE WRITE(*,20) READ*,R2 IF(R2)100,200,350 350 CONTINUE WRITE(*,30) READ*,H IF(H)400,500,600 400 STOP'VISINA JE NEGATIVNA!' 500 STOP'VISINA JE ENAKA NIC!' 600 CONTINUE!H=VISINA!L=STRANSKI ROB!V=VOLUMEN!IZRACUN L=SQRT(H**2+(R1-R2)**2) V=(PI*H*(R1**2+R2**2+R1*R2))/3 P=PI*(R1**2+R2**2+L*(R1+R2))!IZPIS PODATKOV PRINT*,'REZULTATI:' WRITE(*,40)ROB,L,VOL,V,POV,P WRITE(*,50)ODG READ*,ODG IF(ODG.EQ.'D'.OR.ODG.EQ.'d') GOTO 1000 10 FORMAT(1X,'VNESI R1=',2X,\\) 20 FORMAT(1X,'VNESI R2=',2X,\\) 30 FORMAT(1X,'VNESI VISINO H=',2X,\\) 40 FORMAT(1X,A4,F6.3,/,1X,A8,F7.2,/,1X,A9,E8.3) 50 FORMAT(1X,'ALI ZELITE NADALJEVATI (D/N)?',1X,A1) 11
Blok IF -THEN - ELSE Realni spremenljivki ABSV želimo prirediti absolutno vrednost, brez uporabe vgrajene funkcije ABS, ki je na voljo v fortranu. REAL A PRINT*,'VNESI STEVILO' READ*,A IF (A.LT.0) THEN ABSV=-A ELSE ABSV=A IF PRINT*,'ABSOLUTNA VREDNOST JE',ABSV LOGIČNI IF BLOK Z VEČ MOŽNOSTMI (IF-THEN-ELSEIF) INTEGER TOCKE WRITE(*,10) READ*,TOCKE IF (TOCKE.LT.50)THEN PRINT*,"OCENA 5" ELSEIF (TOCKE.GE.50.AND.TOCKE.LE.60)THEN PRINT*,"OCENA 6" ELSEIF (TOCKE.GE.60.AND.TOCKE.LE.70)THEN PRINT*,"OCENA 7" ELSEIF (TOCKE.GE.70.AND.TOCKE.LE.80)THEN PRINT*,"OCENA 8" ELSEIF (TOCKE.GE.80.AND.TOCKE.LE.90)THEN PRINT*,"OCENA 9" ELSEIF (TOCKE.GE.90.AND.TOCKE.LE.100)THEN PRINT*,"OCENA 10" ELSE WRITE(*,30) IF 10 FORMAT(1X,"VNESI STEVILO TOCK NA IZPITU=",\) 20 FORMAT(1X,/,"OCENA IZPITA=",I3) 30 FORMAT(1X,"NEPRAVILEN VHODNI PODATEK") 12
STAVEK CASE Blok CASE je posebna oblika bloka IF-THEN z več alternativami. Izvršitev določenih stavkov je pogojena z vrednostjo predpisanega izraza. Sintaksa CASE stavka je sledeča: SELECT CASE (izraz) CASE (seznam vrednosti 1) ukazi 1 CASE (seznam vrednosti 2) ukazi 2 CASE (seznam vrednosti N) ukazi N CASE DEFAULT ukazi D SELECT Pri izvajanju bloka CASE se najprej ovrednoti izraz v stavku SELECT CASE. Za tem se preveri, če je vrednost izraza na seznamu vrednosti v prvem stavku CASE identična vrednosti izraza (seznam vrednosti 1), se izvedejo ukazi 1. V nasprotnem primeru se preveri vrednost izraza (seznam vrednosti 2) v durgem stavku CASE in tako se nadaljuje do vrednosti izraza (seznam vrednosti N). Stavek CASE DEFAULT je izbirni. Če ga izpustimo potem niti ne pišemo stavkov D. Če pa ga napišemo potem se izvedejo ukazi D, v primeru, da izraz pri stavku SELECT CASE ni enak (seznam vrednosti 1) do (seznam vrednosti N). INTEGER TOCKE,OCENA WRITE(*,10) READ*,TOCKE SELECT CASE(TOCKE) CASE(:49) OCENA=5 CASE(50:59) OCENA=6 CASE(60:69) OCENA=7 CASE(70:79) OCENA=8 CASE(80:89) OCENA=9 CASE(90:100) OCENA=10 WRITE(*,20)OCENA CASE DEFAULT PRINT*,"NEPRAVILEN VHODNI PODATEK" SELECT 10 FORMAT(1X,"VNESI STEVILO TOCK NA IZPITU=",\) 20 FORMAT(1X,/,"OCENA IZPITA=",I3) 13
Sortiranje (urejanje) treh različnih števil od najmanjšega do največjega: REAL A(3),APOM PRINT*,'VNESI TRI STEVILA:' READ*,(A(I),I=1,3) I=1 IF(A(I).GT.A(I+1))THEN APOM=A(I+1) A(I+1)=A(I) A(I)=APOM IF I=2 IF(A(I).GT.A(I+1))THEN APOM=A (I+1) A(I+1)=A(I) A(I)=APOM IF I=1 IF(A(I).GT.A(I+1))THEN APOM=A (I+1) A(I+1)=A(I) A(I)=APOM IF PRINT*,'SORTIRANA STEVILA:' WRITE (*,5) (A(I),I= 1,3) 5 FORMAT(1X,F8.3) 14
DO ZANKA Kadar želimo, da se določeno zaporedje ukazov ponovi večkrat, uporabimo DO zanko. DO spremenljivka=začetna vrednost,končna vrednost, korak ukazi DO Začetna vrednost je prva vrednost, ki se priredi spremenljivki. Naslednja vrednost je odvisna od koraka. Če je korak enak 1, lahko vejico in korak izpustimo. Končna vrednost je tista vrednost, ki se priredi spremenljivki preden izstopimo iz zanke. NESKONČNA DO ZANKA DO ukazi IF (logični izraz) EXIT DO Neskončna zanka se ne ustavi, zato je nujno v njeno zanko vnesti IF stavek. V primeru, da je logični izraz v IF stavku pravilen, potem z ukazom EXIT zapustimo zanko. Lahko pa v določenih primerih uporabimo tudi ukaz STOP. V tem primeru se bo program zaustavil znotraj zanke. POGOJNA DO ZANKA DO WHILE ( logični izraz ) ukazi DO Pogojno zanko uporabimo, kadar želimo, da se zaporedje stavkov ponavlja tako dolgo, dokler je logični izraz pravilen. Takoj, ko je logični izraz nepravilen izstopimo iz zanke. Izdelaj program, ki sešteje prvih deset naravnih števil z uporabo DO zanke. INTEGER VSOTA VSOTA=0 DO I=1,10,1 VSOTA=VSOTA+I PRINT*,I,VSOTA DO 1.) Kako bi spremenili program, da bi seštel vsoto vseh sodih števil od 2 do 10? 2.) Kako bi spremenili program, da bi seštel vsoto kvadratov vseh sodih števil od 2 do 10? 15
RAZVRŠČANJE ŠTEVIL PO METODI MEHURČKOV - "BUBBLE SORT" Sortiranje po metodi mehurčkov je zelo počasen postopek, vendar je enostaven in jasen. Števila se nahajajo v polju spremenljivke a. Urediti jih moramo po rastočem vrstnem redu. Vedno začnemo s prvim elementom polja a. Primerjamo ga z drugim elementom polja a. Če je prvi večji od drugega ga zamenjamo, drugače primerjamo drugi in tretji element. Če je drugi večji od tretjega, ju zamenjamo. Tako nadaljujemo do predzadnjega elementa. Po prvem ciklu DO zanke je na zadnjem mestu že pravilni element. Postopek nato ponovimo. Sortiranje (razvrščanje) največ 500 različnih števil od najmanjšega do največjega z uporabo dveh DO zank. Podatke beremo in izpisujemo na zaslon z uporabo vgnezdene DO zanke v sklopu ukaza READ. REAL APOM,A(500) PRINT*, 'PODAJ STEVILO ELEMENTOV N:' READ*,N PRINT*,'PODAJ ELEMENTE POLJA A:' READ *,(A (I),I=1,N) DO J=1,N-1 DO I=1,N-J IF(A(I).GT.A(I+1))THEN APOM=A (I+1) A(I+1)=A(I) A(I)=APOM IF DO DO WRITE (*,5) (A(I),I=1,N) 5 FORMAT(1X,F8.3) Iskanje največjega in najmanjšega števila med desetimi števili REAL A(10) PRINT*,'VNESI 10 REALNIH STEVIL:' READ *,(A(I),I=1,10) MIN=A(1) MAX=A(1) DO I=1,10 IF(A(I).LT.MIN) MIN=A(I) IF(A(I).GT.MAX) MAX=A(I) DO PRINT*,'NAJMANJSE STEVILO JE',MIN PRINT*,'NAJVECJE STEVILO JE',MAX 16
Izračunati je potrebno skalarni produkt dveh trirazsežnih vektorjev z uporabo DO zanke. REAL V1(3),V2(3),SKP PRINT*,'VNESI PARAMETRE VEKTORJA 1:' READ*,(V1(I),I=1,3) PRINT*,'VNESI PARAMETRE VEKTORJA 2:' READ*,(V2(I),I=1,3) SKP=0 DO I=1,3 SKP=SKP+V1(I)*V2(I) DO PRINT*,'SKALARNI PRODUKT VEKTORJEV JE',SKP Izračunati je potrebno vsoto členov vrste. Potenca N je naravno število. Program se ustavi, ko je razlika delnih vsot manjša od 0.0005 (zahtevana natančnost): REAL A,X,VSOTA,VSOTA1,CLEN A=5.0 X=0.5 VSOTA=0 VSOTA1=0 DO N=1,100,1 CLEN=(ABS((A+2)/(A-1)))*X**N VSOTA=VSOTA+CLEN IF((VSOTA-VSOTA1).LT.0.0005) GOTO 10 WRITE(*,*)VSOTA,N VSOTA1=VSOTA DO STOP 'PREMALO CLENOV' 10 WRITE(*,2)VSOTA,N 2 FORMAT(1X,'VSOTA=',F6.3,2X,'N=',i4 ) 17
Izračunati je potrebno Fibonaccijeva števila. Fibonaccijeva števila so taka števila pri katerih je novo število vsota zadnjih dveh predhodnih števil. Imamo števili X1 in X2. Naslednje število je XN. Sledi XN= X1 + X2. Formulo z obliko XN=XN-1 + XN-2 imenujemo rekurzivna formula. Začetni vrednosti sta: x1=0 in x2=1 ter glede na formulo XN= X1 + X2 sledi, da so Fibonaccijeva števila sledeča: 0,1,1,2,3,5,8,13,21,34,55,89,144... Prireditvena stavka X2 in X1: X2=X1 X1=XN sta nujno potrebna, ker dobimo tako vedno novo začetno vrednost. Zaporedje stavkov v DO WHILE zanki (pogojna DO zanka) se izvaja toliko časa, dokler je logični izraz resničen. Program se konča, ko je Fibonaccijevo število večje od 1000. INTEGER X1,X2,XN X1=0 X2=1 DO WHILE (X1.LT.1000) PRINT*,X1 XN=X1+X2 X2=X1 X1=XN DO Program izračuna zmnožek vseh naravnih števil od 1 do n z uporabo pogojne DO zanke. Pogojna DO zanka se zaključi, ko je indeks i večji od n. Takemu zmnožku pravimo n fakulteta in ga zapišemo kot n! n!=1*2*3*..*n INTEGER N REAL PRODUKT PRINT*,'VNESI STEVILO' READ*,N PRODUKT=1.0 I=1 DO WHILE(I.LE.N) PRODUKT=PRODUKT*I I=I+1 DO WRITE(*,10)N,PRODUKT 10 FORMAT(1X,'PRODUKT PRVIH',1X,I2,1X,'NARAVNIH STEVIL JE',E8.3) 18
NESKONČNA DO ZANKA Izračunajmo število π s seštevkom vrste: 1-1/3+1/5-1/7+1/9...= π /4 Uporabimo neskončno DO zanko, hkrati pa moramo obvezno uporabiti še IF stavek, ki ustavi izvajanje zanke. Neskončna DO zanka se ustavi, ko je izpolnjen pogoj v IF stavku. Zanka se ustavi, ko dosežemo zahtevano natančnost. Natančnost je določena na tri decimalna mesta, kar je definirano kot 0.0005 REAL VSOTA VSOTA=0!DOLOČIMO ZAČETNE VREDNOSTI I=1 N=1 Z=1 DO CLEN=1./I VSOTA=VSOTA+Z*CLEN I=I+2 Z=Z*(-1) N=N+1 IF (ABS(CLEN).LT.0.0005)EXIT DO WRITE(*,*)'STEVILO CLENOV JE: ',N WRITE(*,*)'VSOTA CLENOV JE: ',VSOTA WRITE(*,*)'STEVILO PI JE: ',VSOTA*4 19
Izdelaj program, ki bo izračunal produkt dveh matrik velikosti 3 x 3. Vnos in izpis podatkov mora biti v urejeni obliki. Uporabi formatna določila. INTEGER S,A(3,3),B(3,3),C(3,3) CHARACTER*2 X,Y,Z,V X='A(' Y='B(' Z=')=' V=',' PRINT*,'PODAJ ELEMENTE MATRIKE A:' PRINT*,'' DO I=1,3 DO J=1,3 WRITE(*,5)X,J,V,I,Z READ*,A(I,J) DO DO PRINT*,'' PRINT*,'PODAJ ELEMENTE MATRIKE B:' PRINT*,'' DO I=1,3 DO J=1,3 WRITE(*,5)Y,J,V,I,Z READ*,B(I,J) DO DO PRINT*,'' PRINT*,'MATRIKA A:' WRITE(*,10)((A(I,J),J=1,3),I=1,3) PRINT*,'' PRINT*,'MATRIKA B:' WRITE(*,10)((B(I,J),J=1,3),I=1,3) DO I=1,3 DO J=1,3 S=0 DO K=1,3 S=S+A(I,K)*B(K,J) DO C(I,J)=S DO DO PRINT*,'' PRINT*,'PRODUKT C=A X B:' WRITE(*,10)((C(I,J),J=1,3),I=1,3) 5 FORMAT (1X,A2,I1,A1,I1,A2,\) 10 FORMAT (3I5) 20
STAVČNA FUNKCIJA Kadar se v programu pojavlja večkrat ista formula uporabimo stavčno funkcijo. Stavčno funkcijo zapišemo z enim prireditvenim stavkom in ima natanko eno vrednost. Definicija stavčne funkcije stoji pred prvim izvršilnim stavkom. Stavčna funkcija se zapiše na sledeč način: IME FUNKCIJE (FORMALNI PARAMETRI)=MATEMATIČNI IZRAZ Primer: DOLZINA=(X1,Y1,X2,Y2)=SQRT((X2-X1)**2+(Y2-Y1)**2) Stavčno funkcijo kličemo tako, da navedemo: ime funkcije formalne parametre zamenjamo z dejanskimi Primer: A=DOLZINA(XA,YA,XB,YB) Izdelajmo program, ki bo na podlagi oglišč trikotnika izračunal ploščino trikotnika. Koordinate oglišč trikotnika so: A(xa,ya), B(xb,yb) in C(xc,yc). Dolžine stranic trikotnika so enake razdaljam med oglišči. REAL DOLZINA!DOLOCIMO STAVCNO FUNKCIJO DOLZINA(X1,Y1,X2,Y2)=SQRT((X2-X1)**2+(Y2-Y1)**2) PRINT*,'PODAJ KOORDINATE OGLISCA A:' READ*,XA,YA PRINT*,'PODAJ KOORDINATE OGLISCA B:' READ*,XB,YB PRINT*,'PODAJ KOORDINATE OGLISCA C:' READ*,XC,YC!KLICEMO STAVCNO FUNKCIJO C=DOLZINA(XA,YA,XB,YB) B=DOLZINA(XA,YA,XC,YC) A=DOLZINA(XB,YB,XC,YC) S=(A+B+C)/2!PLOSCINO IZRACUNAMO PO HORNOVEM OBRAZCU P=SQRT(S(S-A)*(S-B)*(S-C)) 21
Funkcija FUNCTION Kadar z enim samim stavkom ne moremo definirati funkcije uporabimo podprogram FUNCTION. Podprogramu FUNCTION moramo določiti tip rezultata in predpišemo formalne parametre. Rezultat podprograma FUNCTION ima natanko eno vrednost. podatkovni tip FUNCTION ime funkcije ( formalni parametri ) deklaracije ukazi RETURN Napišimo funkcijski podprogram, ki izračuna faktorielo števila: REAL FUNCTION FAKT(N) INTEGER N,I FAKT=1 DO I=2,N FAKT=FAKT*I DO RETURN Iz glavnega programa pokličemo funkcijski podprogram, ki izračuna faktorielo števila n, katerega vrednost vnesemo v glavnem programu. REAL FAKT INTEGER N PRINT*,"PODAJ STEVILO N=" READ*,N F=FAKT(N) WRITE(*,10)F 10 FORMAT(1X,"FAKTORIELA STEVILA N=",\,F16.2) Podprogram SUBROUTINE Podprogram SUBROUTINE je samostojna programska enota. Deluje podobno kot podprogram FUNCTION, razlika je le v rezultatu. Rezultat podprograma SUBROUTINE ima lahko več vrednosti ali nobene. SUBROUTINE ime podprograma ( formalni parametri ) deklaracije ukazi RETURN! Glavni program CALL ime podprograma ( argumenti ) 22
Delo z datotekami OPEN in CLOSE Pri serijskih datotekah so zapisi urejeni po vrsti, zapis za zapisom. Začne se z znakom za začetek datoteke (BOF), sledijo posamezni zapisi, ki so ločeni z ločilom za zapise (CR in LF) ter na koncu datoteke je znak za zaključek (EOF). Dostop do posameznega zapisa je možen samo zapis za zapisom. Zato serijske datoteke niso primerne za obsežne baze podatkov. Pri direktnih datotekah so zapisi označeni zaporedno, glede na začetek. Prvi zapis ima zaporedno številko 1 (REC=1), drugi zapis ima zaporedno številko 2 (REC=2) in tako dalje. To omogoča direkten dostop do posameznega zapisa v datoteki. Ker lahko pišemo v direktni datoteki v katerikoli zapis, se lahko zgodi, da posamezni deli sploh niso zasedeni. Serijske datoteke so vedno popolnoma zasedene, direktne datoteke pa lahko imajo veliko neizkoriščenega prostora. OPEN(UNIT=enota, FILE=datoteka, ACCESS=dostop, STATUS=stanje, RECL=dolžina, FORM=oblika, MODE=način, SHARE=delitev, ERR=številka stavka v primeru napake) enota - vedno celoštevilska vrednost datoteka - ime datoteke.končnica ali LPT1, če želimo izpis na tiskalnik dostop - direct, sequential ali append (kadar želimo dodajati zapise na konec serijske datoteke) stanje - unknown, new, old, scratch dolžina - dolžina zapisa v direktni datoteki oblika - formatted, unformatted, binary mode - read, write, readwrite delitev - compat, denywr, denyrd, denyone Kadar je FILE="USER" program izpisuje podatke na zaslon in bere podatke iz tipkovnice. Kadar je FILE=" " program zahteva vnos imena ustrezne datoteke iz tipkovnice med izvajanjem programa. Podrobnejša razlaga ukaza SHARE v sklopu stavka OPEN: compat - drugi uporabniki ne morejo odpreti datoteke, lahko jo odpre le prvi uporabnik denywr - za druge uporabnike zaprta za pisanje, ni je mogoče še enkrat odpreti denyrd - za druge uporabnike zaprta za branje denyone - vsk uporabnik lahko odpira datoteko Ko končamo delo z datoteko je potrebno datoteko zapreti. Uporabimo ukaz CLOSE, ki ima naslednji zapis: CLOSE(UNIT=enota, ERR=številka stavka v primeru napake, STATUS=stanje) stanje - keep,deleted S prvo vrednostjo datoteka ostane, z drugo pa se zbriše. Če je bila datoteka odprta v stavku z opcijo STATUS="SCRATCH" in ima v stavku CLOSE STATUS="KEEP" bo ta zapis povzročil napako pri izvajanju. Program izpiše besedo Pozdravljen! na tiskalnik v primeru, da imamo na računalnik neposredno priključen tiskalnik preko LPT vrat. CHARACTER B*12 B="Pozdravljen!" OPEN(2,FILE="LPT1") WRITE(2,10) B 10 FORMAT(1X,A12) 23
Program za delo z datoteko in uporabo podprogramov tipa SUBRUTINE. Kreiramo datoteko PODATKI.DAT, v katero vpisujemo IME,PRIIMEK,STAROST študenta. Program naj omogoča vpis novih študentov, dokler jih vpisujemo. Omogoča naj izpis vseh študentov v datoteki ter iskanje študenta v datoteki. Če ga najde, ga izpiše. Zadnja možnost izbire naj bo izhod iz programa. INTEGER AKCIJA OPEN(UNIT=1,FILE='PODATKI.DAT',ACCESS='SEQUENTIAL',STATUS='UNKNOWN',& POSITION='APP') AKCIJA=0 DO WHILE(AKCIJA.NE.4) PRINT*,'' PRINT*,'IZBERI ZELJENO OPERACIJO' PRINT*,' 1 - vpis novega studenta' PRINT*,' 2 - izpis vseh studentov' PRINT*,' 3 - iskanje po priimku' PRINT*,' 4 - konec' READ*,AKCIJA IF(AKCIJA.EQ.1) CALL VPIS IF(AKCIJA.EQ.2) CALL IZPIS IF (AKCIJA.EQ.3) CALL ISKANJE DO CLOSE(1)!KONEC GLAVNEGA PROGRAMA SUBROUTINE VPIS!PODPROGRAM VPIS CHARACTER IME*16,PRIIMEK*32 INTEGER STAROST PRINT*,'VNESI IME' READ 5,IME PRINT*,'VNESI PRIIMEK' READ 5,PRIIMEK PRINT*,'VNESI STAROST' READ*,STAROST 10 FORMAT(A16,A32,I3) 5 FORMAT(A) WRITE(1,10)IME,PRIIMEK,STAROST RETURN!KONEC PODPROGRAMA VPIS SUBROUTINE IZPIS!PODPROGRAM IZPIS CHARACTER IME*16,PRIIMEK*32 INTEGER STAROST REWIND(1) DO WHILE(.TRUE.) READ(1,10,=600)IME,PRIIMEK,STAROST PRINT*,IME,PRIIMEK,STAROST DO 600 CONTINUE 10 FORMAT(A16,A32,I3) RETURN!KONEC PODPROGRAMA IZPIS 24
SUBROUTINE ISKANJE!PODPROGRAM ISKANJE CHARACTER IME*16,PRIIMEK*32,PRI*32 INTEGER STAROST REWIND (1) PRINT*,'VNESI ISKANI PRIIMEK' READ 5,PRI 5 FORMAT(A) 10 FORMAT(A16,A32,I3) DO WHILE(.TRUE.) READ(1,10,=600)IME,PRIIMEK,STAROST IF(PRIIMEK.EQ.PRI) THEN PRINT*,IME,PRIIMEK,STAROST IF DO 600 CONTINUE RETURN!KONEC PODPROGRAMA ISKANJE 25