Download as pdf or txt
Download as pdf or txt
You are on page 1of 35

1

Potprogrami

Rešavanje složenog problema može da razloži na rešavanje jednostavnijih problema. U


programskom jeziku FORTRAN moguće je rešavanje parcijalnih problema isprogramirati u
posebnim programskim jedinicama koje se nazivaju potprogramima. Pri tome se jednom napisan
potprogram može koristiti u različitim programima i drugim potprogramima. U FORTRANu
postoje tri vrste potprograma: funkcijske naredbe, funkcijski potprogrami i opšti potprogrami.

Funkcijske naredbe
Dejstvo funkcijske naredbe je lokalno, to jest oznaka za funkciju definisanu funkcijskom
naredbom, važi samo u okviru programske jedinice u kome je uvedena.

Funkcijsku naredbu koja definiše aritmetičku sredinu tri realna broja, može da se definiše sa:
AS(P,Q,R)=(P+Q+R)/3
Primer upotrebe funkcijske naredbe u programu:
X=…
Y=…
Z=...
V=AS(X,Y,Z)

Funkcijski potprogrami
Funkcijski potprogrami su uvedeni u FORTRAN, da bi se ostavila mogućnost korisniku, da sam
uvede nove funkcije i koristi ih kao standardne.
Funkcijski potprogram počinje službenom reči FUNCTION iza koje sledi ime funkcijskog
potprograma i lista ulaznih argumenata, odvojenih zapetama koja se ispisuje između zagrada.
Posle toga se naredbe ispisuju prema pravilima koja važe za pisanje programa.
Naredba koja se poslednja izvršava u funkcijskom potprogramu je RETURN. Ona obaveštava
fortranski prevodilac da može da preuzme vrednost izlazne promenljive. Funkcijski potprogram
se završava naredbom END.
U toku izvršavanja funkcijskog potprograma mora se bar jednom dodeliti vrednost promenjljivoj
koja nosi isto ime kao i potprogram. To je jedina izlazna veličina iz funkcijskog programa.
Vrednost izlaznog rezultata je dostupna preko imena potprograma a vrednosti ulaznih argumenata
preko liste formalnih parametara. Na primer ako želimo da u funkcijskom potprogramu
nazvanom G koristimo tri ulazne realne promenljive, ako nema drugih ulaznih promenjljivih,
dovoljno je da ispišemo prvu naredbu potprograma
FUNCTION G(A,B,C)
i funkcijski potprogram će preuzeti njihove vrednosti kada mu to zada programska jedinica koja
ga koristi.
2

Funkcijski potprogram se u okviru drugih programskih jedinica poziva kao i funkcijska naredba -
navođenjem imena i liste stvarnih parametara. Tada stvarni parametri moraju biti u istom
redosledu i istog tipa, kao i formalni parametri u prvoj naredbi funkcijskog potprograma (ali
mogu da imaju različita imena).

Primer 1
Nacrtati algoritame i napisati glavni program i funkcijski potprogram koji od glavnog programa
preuzima niz proizvoljne dužine i određuje aritmetičku sredinu članova niza.

PROGRAM ARSREDINA
DIMENSION X(100) FUNCTION AS(M,Y)
PRINT*, 'Unesite broj clanova niza ' DIMENSION Y(*)
READ*,N SUMA=0
PRINT*, 'Unesite elemente niza ' DO 5 I=1,M
DO 10 I=1,N SUMA=SUMA+Y(I)
READ*,X(I) 5 CONTINUE
10 CONTINUE AS=SUMA/M
ARITSRED=AS(N,X) RETURN
PRINT*, ' ARITSRED = ', ARITSRED END
END
3

Opšti potprogrami

U slučajevima kada je potrebno da potprogram ima više od jedne izlazne veličine koriste se opšti
potprogrami.
Opšti potprogram počinje službenom reči SUBROUTINE iza koje sledi ime funkcijskog
potprograma i lista ulaznih i izlaznih argumenata, odvojenih zapetama koje se ispisuje između
zagrada. Posle toga se naredbe ispisuju prema pravilima koja važe za pisanje programa. Naredba
koja se poslednja izvršava u opštem potprogramu je RETURN. Ona obaveštava fortranski
prevodilac da može da preuzme vrednost izlazne promenljive. Opšti
potprogram se završava naredbom END.
Opšti potprogram se u okviru drugih programskih jedinica poziva službenom reči CALL, iza koje
se navodi njegovo ime i liste stvarnih parametara. Tada stvarni parametri moraju biti u istom
redosledu i istog tipa, kao i formalni parametri u prvoj naredbi opšteg potprograma (ali mogu
da imaju različita imena).
4

Pimer 2
Nacrtati algoritame i napisati glavni program i opšti potprogram koji od glavnog programa
preuzima niz proizvoljne dužine i sortira ga po opadajućem redosledu

PROGRAM OPADNIZ
SUBROUTINE NIZOPAD(M,Y)
DIMENSION X(100) DIMENSION Y(*)
PRINT*, 'Unesite broj clanova niza ' DO 20 I=1,M-1
READ*,N DO 30 J=I+1,M
PRINT*, 'Unesite elemente niza ' IF(Y(I).LT.Y(J))THEN
DO 10 I=1,N YP=Y(I)
READ*,X(I) Y(I)=Y(J)
10 CONTINUE Y(J)=YP
CALL NIZOPAD(N,X) ENDIF
WRITE(*,*) (X(I),I=1,N) 30 CONTINUE
END 20 CONTINUE
RETURN
5
6

Ispitni zadaci
Zadatak1. Nacrtati algoritam i napisati funkcijski potprogram koji će izračunavati razliku
izmedju zbirova elemenata niza A i niza B (N i M su dimenzije nizova, A i B). Napisati i glavni
program koji ce učitati nizove, pozvati potprogram i štampati razliku u slobodnom formatu.

PROGRAM Zadatak1
DIMENSION A(100), B(100)
PRINT*, 'UNESITE BROJ CLANOVA NIZA A'
READ*, N
PRINT*, 'UNESITE BROJ CLANOVA NIZA B'
READ*, M
PRINT*, 'UNESI CLANOVE NIZA A'
READ*, (A(I),I=1,N)
PRINT*, 'UNESI CLANOVE NIZA B'
READ*, (B(J),J=1,M)
RAZLIKA=RAZ(A,B,N,M)
PRINT*, 'RAZLIKA OVA DVA NIZA JE: ', RAZLIKA
END
7

FUNCTION RAZ(A,B,N,M)
DIMENSION A(*), B(*)
SUMA1=0
SUMA2=0
DO 1 I=1,N
SUMA1=SUMA1+A(I)
1 CONTINUE
DO 2 J=1,M
SUMA2=SUMA2+B(J)
2 CONTINUE
RAZ=SUMA1-SUMA2
RETURN
END
8

Zadatak 2. Nacrtati algoritam i napisati funkcijski potprogram koji u celobrojnom nizu


proizvoljne duzine neparnim brojevima dodeljuje vrednost 0 (nula).Glavnom programu vraća
procenat od ukupnog broja članova koji je različit od nule.

PROGRAM Zadatak2
INTEGER X(100)
PRINT*, 'UNESI BROJ CLANOVA NIZA'
READ*, N
PRINT*, 'UNESI CLANOVE NIZA'
READ*, (X(I),I=1,N)
PROCENAT=POSTO(X,N)
PRINT*, 'PROCENAT CLANOVA KOJI SU RAZLICITI OD NULE ',PROCENAT
END
9

FUNCTION POSTO(X,N)
INTEGER X(*)
BROJAC=0
DO 5 I=1,N
IF(MOD(X(I),2).NE.0)THEN
X(I)=0
BROJAC=BROJAC+1
ENDIF
5 CONTINUE
POSTO=(N - BROJAC)/N*100
RETURN
END
10

Zadatak 3. Nacrtati algoritam i napisati funkcijski potprogram koji određuje srednju vrednost
članova realnog niza A proizvoljne dimenzije N (niz se učitava u glavnom programu ) a zatim
unuli sve članove manje od izračunate srednje vrednosti.

PROGRAM Zadatak3
DIMENSION A(100)
PRINT*,'Unesite broj clanova niza, N:'
READ*,N
PRINT*,'Unesite clanove niza A:'
READ*,(A(I),I=1,N)
SRVR = SRVRED(A,N)
PRINT*,'Srednja vrednost je:',SRVR
PRINT*,(A(I),I=1,N)
END
11

FUNCTION SRVRED(A,N)
DIMENSION A(*)
SUMA=0.
DO 30 K=1,N
SUMA=SUMA+A(K)
30 CONTINUE
SRVRED = SUMA/N
DO 50 L=1,N
IF(A(L).LT.SRVRED) THEN
A(L)=0
ENDIF
50 CONTINUE
RETURN
END
12

Zadatak 4. Napisati funkcijski potprogram koji glavnom programu vraća vrednost funkcije
funk=(x1+x2+x3+...+xm)-(y1*y2*y3*...*yk) gde su x i y članovi neparnih odnosno parnih
kolona matrice proizvoljnih dimenzija koja se učitava u glavnom programu.
Na primer:
é x1 y1 x 4 y 4 x7 ù
A = ê x2 y2 x5 y5 x8 ú
ê ú
êë x3 y 3 x6 y 6 x9 úû

PROGRAM Zadatak4
DIMENSION A(100,100)
PRINT*,'UNESITE BROJ VRSTA MATRICE A'
READ*, M
PRINT*,'UNESITE BROJ KOLONA MATRICE A'
READ*, N
PRINT*,'UNESITE CLANOVE MATRICE A'
13

READ(*,*)( A(I,J), J=1,N) I=1,M)


funkcija=funk(A,M,N)
PRINT*,'Vrednost funkcije je:',funkcija
END

FUNCTION funk(X,M,N)
DIMENSION X(100,100)
SUMA=0.
PROIZVOD=1.
DO 100 I=1,M
DO 100 J=1,N
IF(MOD(J,2).NE.0) THEN
SUMA=SUMA+X(I,J)
ELSE
PROIZVOD=PROIZVOD*X(I,J)
ENDIF
100 CONTINUE
funk=SUMA-PROIZVOD
RETURN
END
14

Zadatak 5. Nacrtati algoritam i napisati opšti potprogram za određivanje člana matrice A (NxN)
na dijagonali kao razlike suma članova odgovarajuće vrste i kolone. Napisati i glavni program
koji će učitati matricu, pozvati potprogram i štampati novodobijenu matricu.

Primer:
é a11 a12 a13 a14 ù a11 = a12 - a21 + a13 - a31 + a14 - a41
êa a a23 a24 ú a22 = a21 - a12 + a23 - a32 + a24 - a42
A = ê 21 22 ú ,
ê a31 a32 a33 a34 ú a33 = a31 - a13 + a32 - a23 + a34 - a43
ê ú
ë a41 a42 a43 a44 û a44 = a41 - a14 + a42 - a24 + a43 - a44

Program Zadatak5
DIMENSION A(100,100)
PRINT*, 'Unesite broj vrsta i kolona matrice, N '
READ*, N
PRINT*, 'Unesite matricu A po vrstama '
READ*, ((A(I,J),J=1,N),I=1,N)
CALL DIAG(A,N)
PRINT*,’Matrica A je: ’, ((A(I,J),J=1,N),I=1,N)
END
15

SUBROUTINE DIAG(A,N)
DIMENSION A(100,*)
DO 20 I=1,N
S=0
DO 10 J=1,N
S=S+A(I,J)-A(J,I)
10 C0NTINUE
A(I,I)=S
20 CONTINUE
RETURN
END
16

Zadatak 6. Nacrtati algoritam i napisati opšti potprogram za određivanje srednje vrednosti


negativnih članova matrice A (MxN). Napisati i glavni program koji će učitati matricu, pozvati
potprogram i štampati srednju vrednost negativnih članova matrice.

Program Zadatak6
DIMENSION A(100,100)
PRINT*, 'Unesite broj vrsta i kolona matrice, M i N '
READ*, M,N
PRINT*, 'Unesite matricu A po vrstama '
READ*, ((A(I,J),J=1,N),I=1,M)
CALL NEGSRE(A,M,N,SV)
PRINT*,’Srednja vrednost negativnih clanova matrice je: ’, SV
END
17

SUBROUTINE NEGSRE(A,M,N,SV)
DIMENSION A(100,*)
L=0
S=0
DO 20 I=1,M
DO 10 J=1,N
IF(A(I,J).LT.0) then
L=L+1
S=S+A(I,J)
ENDIF
10 C0NTINUE
20 CONTINUE
SV=S/L
RETURN
END
18

Zadatak 7. Nacrtati algoritam i napisati funkcijski potprogram koji glavnom programu vraća
vrednost proizvoda zbira clanova (X) na glavnoj i sporednoj dijagonali kvadratne matrice A
proizvoljne dimenzije m i zbira članova (Y) uz dijagonalu matrice. (m se ucitava u glavnom
programu kao i članovi matrice A).
19

PROGRAM Zadatak7
DIMENSION A(20,20)
PRINT*, 'UNESI DIMENZIJU MATRICE'
READ*,M
PRINT*, 'UNESI CLANOVE MATRICE'
READ*,((A(I,J),J=1,M),I=1,M)
REZ=PROIZVOD(A,M)
PRINT* ,'PROIZVOD JE', REZ
END
20

FUNCTION PROIZVOD(A,M)
DIMENSION A(20,20)
ZBIRX=0
ZBIRY=0
DO 10 I=l,M
DO 10 J=1,M
IF( (I.EQ.J) .OR. ((I+J).EQ.(M+1)) ) THEN
ZBIRX=ZBIRX + A(I,J)
ENDIF
10 CONTINUE
DO 15 K=2,M-1
ZBIRY=ZBIRY+A(1,K)+A(M,K)+A(K,1)+A(K,M)
15 CONTINUE
PROIZVOD=ZBIRX*ZBIRY
RETURN
END
21

Zadatak 8. Nacrtati algoritam i napisati funkcijski potprogram, koji od glavnog programa


preuzima celobrojni niz proizvoljne dužine, prebrojava članove čija je vrednost manja od zadate
vrednosti koja se učitava u glavnom programu i dodeljuje im srednju vrednost niza. Kao rezultat,
glavnom programu se vraća broj izmenjenih članova.

PROGRAM Zadatak8
DIMENSION A(100)
INTEGER BRIZMENA
PRINT*,'Unesite broj clanova niza, N:'
READ*,N
PRINT*,'Unesite clanove niza A:'
22

READ*,(A(I),I=1,N)
PRINT*,'Unesite zadatu vrednost, ZV:'
READ*,ZV
BRIZMENA = BRIZM(A,N,ZV)
PRINT*,'Broj izmenjenih clanova je:',BRIZMENA
END

FUNCTION BRIZM(A,N,ZV)
DIMENSION A(*)
SUMA=0.
BROJAC=0
DO 30 K=1,N
SUMA=SUMA+A(K)
30 CONTINUE
SRVRED = SUMA/N
DO 50 L=1,N
IF(A(L).LT.ZV) THEN
BROJAC=BROJAC+1
A(L)=SRVRED
ENDIF
50 CONTINUE
BRIZM=BROJAC
RETURN
END
23

Zadatak 9. Nacrtati algoritam i napisati opsti potprogram, koji od glavnog programa preuzima
celobrojni niz proizvoljne dimenzije, izračunava i štampa srednju vrednost članova i dodeljuje
vrednost 0 članovima čija je vrednost manja od srednje vrednosti. Napisati i glavni program koji
će učitati niz, pozvati potprogram i štampati novodobijeni niz.

PROGRAM Zadatak9
DIMENSION NIZ(20)
PRINT * , 'UNESI DIMENZIJU NIZA'
READ*,M
PRINT*, 'UNESI CLANOVE NIZA'
24

READ*, (NIZ(I),I= 1,M)


CALL IZMENI(NIZ,M)
PRINT*, (NIZ(I),I=1,M)
END

SUBROUTINE IZMENI(NIZ,M)
DIMENSION NIZ(*)
ZBIR=0
DO 10 I=1,M
ZBIR =ZBIR+NIZ(I)
10 CONTINUE
SRVR=ZBIR/M
PRINT*, 'SREDNJA VREDNOST CLANOVA NIZA JE:', SRVR
DO 20 I=1,M
IF(NIZ(I).LT.SRVR) THEN
NIZ(I)=0
ENDIF
20 CONTINUE
RETURN
END
25

Zadatak 10. Nacrtati algoritam i napisati opšti potprogram, koji od glavnog programa preuzima
niz proizvoljne dimenzije i uređuje dati niz u rastući, a zatim napisati funkcijski potprogram koji
sumira članove niza. Napisati i glavni program koji će učitati niz, pozvati potprograme i štampati
novodobijeni niz i sumu članova.

PROGRAM Zadatak10
DIMENSION X(100)
PRINT*, 'Unesite broj clanova niza '
READ*,N
PRINT*, 'Unesite elemente niza '
DO 10 I=1,N
READ*,X(I)
10 CONTINUE
CALL RASNIZ(X,N)
ZBIR= ZCNRB(X,N)
PRINT*, ' SORTIRANI NIZ JE: ' ,(X(I),I=1,N)
PRINT*, 'ZBIR= ',ZBIR
END
26

SUBROUTINE RASNIZ(X,N)
DIMENSION X(*)
DO 20 I=1,N-1
DO 30 J=I+1,N
IF(X(I).GT.X(J))THEN
XP=X(I)
X(I)=X(J)
X(J)=XP
ENDIF
30 CONTINUE
20 CONTINUE
RETURN
END

FUNCTION ZCNRB(X,N)
DIMENSION X(*)
SUMA=0
DO 20 I=1,N
SUMA=SUMA+X(I)
20 CONTINUE
ZCNRB=SUMA
RETURN
END
27

Zadatak 11. Nacrtati algoritam i napisati funkcijski potprogram, koji od glavnog programa
preuzima niz proizvoljne dimenzije, sumira niz, određuje njegovu srednju vrednost, i prebrojava
koliko je članova manje od izračunate srednje vrednosti i taj broj vraća glavnom programu.

PROGRAM ZADATAK10
DIMENSION A(100)
PRINT*,"UNESITE DlMENZTllLNIZA:"
READ*,M
PRINT*,"UNESITE CLANOVE NIZA:"
READ * ,(A(I),I= 1,M)
SMALL=PREBROJ(A,M)
28

PRINT*,"BROJ CLANOVA MANJIH OD SREDNJE VREDNOSTI JE", SMALL


END

FUNCTION PREBROJ(A,M)
DIMENSION A(*)
SUMA=0
K=0
DO 10 I=1,M
SUMA=SUMA+A(I)
10 CONTINUE
SRVRED=SUMA/M
DO 15 J=1,M
IF(A(J).LT.SRVRED) THEN
K=K+1
ENDIF
15 CONTINUE
PREBROJ=K
RETURN
END
29

Zadatak 12. Nacrtati algoritam i napisati funkcijski potprogram koji glavnom programu vraca
vrednost 1,0 ill -1 ako je zbir clanova X kvadratne matrice A respektivno manji, jednak iIi veći
od zbira članova Y. Matrica A je proizvoljne dimenzije N i učitana je u glavnom programu.

PROGRAM ZADATAK12
DIMENSION AMAT(100,100)
PRINT*, "UNESITE DIMENZIJU MATRICE:"
READ*,N
PRINT*,"UNESITE CLANOVE MATRICE:"
READ*,((AMAT(I,J),J=1,N),I=1,N)
VRACENO=VREDNOST(AMAT,N)
PRINT*,"VRACENA VREDNOST JE",VRACENO
END

FUNCTION VREDNOST(AMAT,N)
DIMENSION AMAT(100, *)
SUMAX=0
SUMAY=0
DO 13 I=1,N/2
SUMAX=SUMAX+AMAT(1,I)+AMAT(N,I)
13 CONTINUE
DO 14 I=2,N-1
SUMAX=SUMAX +AMAT(I,1)
14 CONTINUE
IF(MOD(N,2).NE.0) THEN
M=N/2+2
ELSE
M=N/2+1
ENDIF
DO 15 I=M,N
SUMAY=SUMAY+AMAT(1,I)+AMAT(N,I)
15 CONTINUE
DO 16 I=2,N-1
SUMAY=SUMAY+AMAT(I,N)
16 CONTINUE
IF(SUMAX.GT.SUMAY)THEN
VREDNOST=1
30

ELSE IF(SUMAX.EQ.SUMAY) THEN


VREDNOST=0
ELSE
VREDNOST=-1
ENDIF
RETURN
END
31
32

Zadatak 13. Nacrtati algoritam i napisati opšti potprogram koji učitava realnu kvadratnu matricu
A dimenzije nxn, i štampa nizove X i Y koji se dobijaju od članova matrice po sledećem pravilu:

Odrediti maksimalne članove nizova.


33
34

PROGRAM Zadatak13
DIMENSION A(8,8)
PRINT * , 'UNESITE DIMENZIJU MATRICE:'
READ*,M
PRINT*,M
PRINT*, 'UNESITE CLANOVE MATRICE PO VRSTAMA'
READ*, ((A(I,J),J=1,M),I=1,M)
CALL NIZOVI(A,M)
END

SUBROUTINE NIZOVI(A,M)
DIMENSION A(8,*)
DIMENSION X(33),Y(33)
K=0
L=0
!
DO 10 I=1,M
DO 20 J=1,M
IF(MOD((I+J),2).EQ.0) THEN
K=K+1
X(K)= A(I,J)
ELSE
L=L+1
Y(L)=A(I,J)
ENDIF
20 continue
10 continue
!
KX=1
DO 50 I=2,K
IF(X(I).GT.X(KX))KX=I
50 CONTINUE
!
KY=1
DO 30 I=2,L
IF(Y(I).GT.Y(KY))KY=I
30 CONTINUE

PRINT * , 'NIZ X'


PRINT*, (X(I),I=1,K)

!
PRINT * , 'NIZ Y'
PRINT*, (Y(I),I=1,L)
PRINT*,'Najveci element niza X je', X(KX)
35

PRINT*,'Najveci element niza Y je', Y(KY)


!
RETURN
END

You might also like