UPORABA UREJEVALNIKA IN PREVAJALNIKA MS FORTRAN POWER STATION by hcw25539

VIEWS: 13 PAGES: 25

									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

END !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"
END

2. Logični IF blok

IF (logična izjava) THEN

  ukazi

ENDIF

Če je logična izjava pravilna se izvedejo ukazi, ki so postavljeni med THEN in ENDIF.
Če logična izjava ni pravilna, se izvedejo ukazi, ki sledijo ENDIFu.

PRINT*,"Vnesi oceno="
read*,n
IF (n.LE.5) THEN
   PRINT*,"Negativna ocena"
   PRINT*,"Potreben bo bolj intenziven studij !"
ENDIF
   PRINT*,"Ocena je pozitivna"
END

IF (logična izjava) THEN

  ukazi 1

ELSE

  ukazi 2

ENDIF

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 !"
ENDIF
END

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

   ukazi n

ELSE

   ukazi

ENDIF

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




                                                   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
END

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       Alternativna
                                           Pomen
   operatorji           oblika
       .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
END

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
PRINT*,' '
!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*,' '
PRINT*,L
PRINT*,V
PRINT*,P
END




                                            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
PRINT*,' '
WRITE(*,20)
READ*,R2
PRINT*,' '
WRITE(*,30)
READ*,H
PRINT*,' '
!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'
PRINT*,' '
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)
END




                                    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
PRINT*,' '
WRITE(*,20)
READ*,R2
IF(R2)100,200,350
    350 CONTINUE
PRINT*,' '
WRITE(*,30)
READ*,H
IF(H)400,500,600
    400 STOP'VISINA JE NEGATIVNA!'
    500 STOP'VISINA JE ENAKA NIC!'
    600 CONTINUE
PRINT*,' '
!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:'
PRINT*,' '
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)
END




                                    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 PRINT*,' '
WRITE(*,10)
READ*,R1
IF(R1)100,200,300
    100 STOP'RADIJ JE NEGATIVEN!'
    200 STOP'RADIJ JE ENAK NIC!'
    300 CONTINUE
PRINT*,' '
WRITE(*,20)
READ*,R2
IF(R2)100,200,350
    350 CONTINUE
PRINT*,' '
WRITE(*,30)
READ*,H
IF(H)400,500,600
    400 STOP'VISINA JE NEGATIVNA!'
    500 STOP'VISINA JE ENAKA NIC!'
    600 CONTINUE
PRINT*,' '
!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:'
PRINT*,' '
WRITE(*,40)ROB,L,VOL,V,POV,P
PRINT*,' '
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)
END




                                    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
ENDIF
PRINT*,'ABSOLUTNA VREDNOST JE',ABSV
END

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)
ENDIF
10 FORMAT(1X,"VNESI STEVILO TOCK NA IZPITU=",\)
20 FORMAT(1X,/,"OCENA IZPITA=",I3)
30 FORMAT(1X,"NEPRAVILEN VHODNI PODATEK")
END




                                                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
ENDSELECT

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"
ENDSELECT
10 FORMAT(1X,"VNESI STEVILO TOCK NA IZPITU=",\)
20 FORMAT(1X,/,"OCENA IZPITA=",I3)
END




                                                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
ENDIF
I=2
IF(A(I).GT.A(I+1))THEN
    APOM=A (I+1)
    A(I+1)=A(I)
    A(I)=APOM
ENDIF
I=1
IF(A(I).GT.A(I+1))THEN
    APOM=A (I+1)
    A(I+1)=A(I)
    A(I)=APOM
ENDIF
PRINT*,'SORTIRANA STEVILA:'
WRITE (*,5) (A(I),I= 1,3)
5 FORMAT(1X,F8.3)
END




                                                 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

ENDDO

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
ENDDO

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

ENDDO

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
ENDDO
END

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
        ENDIF
    ENDDO
ENDDO
WRITE (*,5) (A(I),I=1,N)
5 FORMAT(1X,F8.3)
END

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)
ENDDO
PRINT*,'NAJMANJSE STEVILO JE' ,MIN
PRINT*,'NAJVECJE STEVILO JE' ,MAX
END




                                                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)
ENDDO
PRINT*,'SKALARNI PRODUKT VEKTORJEV JE',SKP
END

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
ENDDO
STOP 'PREMALO CLENOV'
10 WRITE(*,2)VSOTA,N
2 FORMAT(1X,'VSOTA=',F6.3,2X,'N=',i4 )
END




                                                 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
ENDDO
END

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
ENDDO
WRITE(*,10)N,PRODUKT
10 FORMAT(1X,'PRODUKT PRVIH',1X,I2,1X,'NARAVNIH STEVIL JE',E8.3)
END




                                                 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
ENDDO
WRITE(*,*)'STEVILO CLENOV JE: ',N
WRITE(*,*)'VSOTA CLENOV JE: ',VSOTA
WRITE(*,*)'STEVILO PI JE: ',VSOTA*4
END




                                                 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)
    ENDDO
ENDDO
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)
    ENDDO
ENDDO
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)
         ENDDO
    C(I,J)=S
    ENDDO
ENDDO
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)
END




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




                                                  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
END

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
ENDDO
RETURN
END

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

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
END

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



                                                 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='APPEND')
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
ENDDO
CLOSE(1)
END !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
END !KONEC PODPROGRAMA VPIS
SUBROUTINE IZPIS !PODPROGRAM IZPIS
CHARACTER IME*16,PRIIMEK*32
INTEGER STAROST
REWIND(1)
DO WHILE(.TRUE.)
    READ(1,10,END=600)IME,PRIIMEK,STAROST
    PRINT*,IME,PRIIMEK,STAROST
ENDDO
600 CONTINUE
10 FORMAT(A16,A32,I3)
RETURN
END !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,END=600)IME,PRIIMEK,STAROST
    IF(PRIIMEK.EQ.PRI) THEN
        PRINT*,IME,PRIIMEK,STAROST
    ENDIF
ENDDO
600 CONTINUE
RETURN !KONEC PODPROGRAMA ISKANJE
END




                                    25

								
To top