You are on page 1of 58

Programski jezik Pascal

1
UVOD – RAD SA OSNOVNIM TIPOVIMA PODATAKA

Primer 24. (Zbirka) Napisati program na programskom jeziku


PASKAL kojim se vrsi prevododjenje kolicine tecnosti iz galona u litre, P o č e ta k
ako je 1 galon = 4.54 litra.
program IzGalonaULitre; g
uses WinCrt;
var l= g * 4 .5 4
g, l : real;
begin
write('Unesite kolicinu tecnosti u galonima: '); l
readln(g);
l := g*4.54;
writeln('Odgovarajuca kolicina u litrima je: ', l:8:2 );
K raj
end.

Primer 25. (Zbirka) Napisati program na programskom jeziku PASKAL kojim se vrsi
preracunavanje americkih dolara u Euro, ako su poznate dinarske vrednosti ovih valuta.
program Konverzija;
P o č e ta k
uses WinCrt;
var D , K u rsE u ra,
D, KursDolara, KursEura : real; K u rsD o la ra ,
begin
write('Koliko dolara treba konvertovati u Eure: '); D * K u rs D o la r a /
readln(D); K u rsE u ra
write('Uneti kurs dolara izrazen u dinarima: ');
readln(KursDolara); K ra j
write('Uneti kurs Eura izrazen u dinarima: ');
readln(KursEura);
writeln(D:10:2, ' $ =', D*KursDolara/KursEura:8:2, ' Eura');
end.

Primer 26. (Zbirka) Sa punim automobilskim rezervoarom kapaciteta V litara predjen je


put od S kilometara. Napisati program kojim se racuna potrosnja automobila u litrima
na 100 km.
program PotrosnjaGoriva;
P o č e ta k
uses WinCrt;
var
V, S
V, S, potrosnja : real;
p o tro s n ja = V * 1 0 0 /S
begin
write('Unesite kapacitet rezervoara: ');
readln(V); p o tro s n ja
write('Unesite predjeni put: ');
readln(S); K ra j
potrosnja:=V*100/S;
writeln('Potrosnja na 100 km je: ', potrosnja:6:2, ' l');
end.

2
Primer 27. (Zbirka) Napisati program na programskom jeziku PASKAL kojim se
izracunava hipotenuza pravouglog trougla na osnovu zadatih kateta.
program Hipotenuza;
uses WinCrt; P o č e ta k
var x,y
a, b, c : real;
2 2
begin re z u lta t= (a 2 + b )
write('Unesite duzinu kateta: ');
readln(a, b); re z u lta t
c:=sqrt(sqr(a)+sqr(b));
writeln('Duzina hipotenuze je: ', c:6:2); K raj
end.

Primer 3.9. (knjiga) Napisati program koji resava sledeci matematicki izraz:  x 2  y 2 
2

program razlomak1;
uses WinCrt; P o č e ta k
var
x, y, resenje : real; a, b, c
begin 2 2
r e s e n je = ( a 2 + b )
write('Unesite vrednosti promenljivih x i y: ');
readln(x, y);
resenje := sqr((sqr(x)+sqr(y))); r e s e n je
writeln('Resenje razlomka je: ', resenje:6:2);
K raj
end.

 b  b 2  4ac
Primer 8. (Zbirka) Napisati program koji izgacunava izraz:
2a
program razlomak1;
uses WinCrt; P o č e ta k
var a, b, c
a, b, c, resenje : real;
2
begin re s e n je = -b - b -4 a c
write('Unesite vrednosti parametara a, b i c: '); 2a
readln(a, b, c); re s e n je
resenje := (-b-sqrt(sqr(b)-4*a*c))/ (2*a);
writeln('Resenje zadatog razlomka je: ', resenje:8:2 ); K raj
end.

Primer 3.10. (knjiga) Napisati program kojim se prevodi temperatura iz skale Celzijusa
u skalu Farenhajta, ako je odgovarajuca formula oblika:
Temperatura po Farenhajtu = (temperatura po Celzijusu)*1.80 + 32
program CelzijusFar;
uses WinCrt;
var
tempC,tempF : real;

3
P o č e ta k
begin
write('Unesite temperaturu u stepenima Celzijusa: '); te m p C
readln(tempC);
tempF := tempC*1.8+32; te m p F = te m p C * 1 ,8 + 3 2
writeln('Temperatura po Farenhajtu je: ', tempF:8:2 );
end. te m p F

Primer 3.9. (knjiga) Za ucenike koji su zaposleni preko K raj


omladinske zadruge izracunati bruto i neto dohodak, ako je
poznat broj radnih sati, cena po satu i procenat odbijanja na osnovu odredjenog
doprinosa.
Izmedju poznatih i nepoznatih velicina postoje sledeci odnosi:
bruto = sati*cena
neto = bruto-bruto*procenat/100
program dohodak;
uses WinCrt;
var P o č e ta k
sati, cena, procenat, bruto : integer;
neto : real; s a ti, c e n a , p r o c e n a t
begin
b r u to = s a ti* c e n a
write('Unesite broj radnih sati: '); n e to = b ru to -b ru to * p ro c e n a t/1 0 0
readln(sati);
write('Unesite cenu po satu: '); b ru to , n e to
readln(cena);
write('Unesite procenat za odbijanje: '); K raj
readln(procenat);
bruto := sati*cena;
neto := bruto - bruto*(procenat/100);
writeln('Bruto dohodak je: ', bruto );
writeln('Neto dohodak je: ', neto:8:2 );
end.

USLOVNI IZRAZI

Jednostavni uslovni izraz: IF-THEN

IF-THEN izraz ima opšti oblik:


IF uslov THEN
izraz;

IF Age < 18 THEN


WRITELN('Ovo je maloletnik.');

IF-THEN-ELSE izraz

Opsti oblik ovog izraza je:

4
IF uslov THEN
izraz1
ELSE
izraz2;

ELSE-IF
Ukoliko postoji višestruko granjanje pored koristi se sledeđi izraz:
IF uslov1 THEN
izraz1
ELSE IF uslov2 THEN
izraz2
ELSE IF uslov3 THEN
izraz3
...
ELSE
izraz n;

Primer 3.13 (Zbirka) Napisati program na programskom jeziku PASCAL kojim se


promenljivoj max dodeljuje vrednost veceg izmedju brojeva a i b.
program Max2;
uses WinCrt;
var
P o č e ta k
a, b, max : integer;
begin a, b
write('Unesite dva cela broja: ');
D a
readln(a, b); a>b
if a>b N e
m ax= b m ax=a
then max:=a
else max:=b; m ax
writeln('Veci broj je: ', max);
end. K raj

Primer 3.16 (Zbirka) Napisati program na programskom jeziku P o č e ta k


PASCAL kojim se promenljivoj max dodeljuje najveca vrednost
od tri zadata cela broja. a, b, c
program Max3;
uses WinCrt; m ax=a
var m ax<b D a
a, b, c, max : integer; N e m ax=c
begin
write('Unesite tri cela broja: '); D a
m ax<c
readln(a, b, c); N e m ax=c
max:=a;
if max<b then max:=b; m ax
if max<c then max:=c;
writeln('Najveci broj je: ', max); K raj
end.

5
Primer 3.14 (Zbirka) Napisati naredbu uslovnog prelaska kojom se za zadate realne
brojeve x i y izracunava z po formuli
 min( x, y ), y  0
z
max( x , y ), y  0
2 2

program ZpoFormuli;
uses WinCrt; P o č e ta k
var x, y
x, y, z : real;
begin D a
y<0
write('Unesite vrednosti za x i y: '); D a
N e x 2< y 2
readln(x, y); D a
x<y N e
if y<0 N e z = x2 z=y2
then z=x z=y
if sqr(x)<sqr(y)
then z:=sqr(y) z
else z:=sqr(x)
K ra j
else
if x<y then z:=x
else z:=y;
writeln('Vrednost z je: ', z:8:2);
end.

Primer 3.15 (Zbirka) Napisati program kojom se za zadate realne brojeve x i y


izracunava z po formuli:
min( x, y )  0.5
z
1  max 2 ( x, y )
program ZpoFormuli;
uses WinCrt;
var
x, y, z : real; P o č e ta k
begin x, y
write('Unesite vrednosti za x i y: ');
D a
readln(x, y); x<y
if x<y N e
then z:=(x+0.5)/(1+sqr(y)) z = ( x + 0 ,5 ) /( 1 + x 2) z = ( x + 0 ,5 )/( 1 + y 2)
else z:=(y+0.5)/(1+sqr(x));
writeln('Vrednost z je: ', z:8:2); z
end.
K raj
Primer 3.15 (Zbirka) Napisati program kojom se resava jednacina: ax+b=0
program LinearnaJednacina;
uses WinCrt;
var
a, b : real;
begin

6
write('Unesite koeficijente a i b: ');
P o č e ta k
readln(a, b);
if a<>0 a, b
then writeln('x= ', -b/a:10:3) D a
else a= 0
if b<>0 N e x = -b /a
then writeln('Jednacina nema resenja')
else writeln('Jednacina ima beskonacno resenja'); b=0 D a
end.
N e J e d n a c in a n e m a
re se n je

Primer 3.23 (Zbirka) Napisati program kojim se ispituje


da li se seku prave y=a1*x+b1 i y=a2*x+b2. Ako se seku J e d n a c in a im a
b e s k o n a c n o re s e n ja
odrediti koordinate preseka.
program PresekPravih; K ra j
uses WinCrt;
var a1, b1, a2, b2, x, y : real; P o č e ta k
begin
a1, b1, a2, b2
write('Unesite koeficijente a1 i b1: ');
D a
readln(a1, b1); a1= a2
write('Unesite koeficijente a2 i b2: '); N e D a
readln(a2, b2); b1=b2
if a1=a2 then x = (b 2 -b 1 )/(a 1 -a 2 ) N e P ra v e s u
p o d u d a rn e
if b1=b2 y=a1*x+ b1 P ra v e su
then writeln('Prave su podudarne') p a ra le ln e

else writeln('Prave su paralelne')


else x, y
begin
x:=(b2-b1)/(a1-a2); K raj
y:=a1*x+b1;
writeln('Koordinate preseka pravih su: x=', x:5:2, ', y=', y:5:2)
end
end.

CASE-ELSE izraz
Opsti oblik CASE izraza je:
CASE izraz OF
label-1 : izraz-1;
label-2 : izraz-2;
...
label-n : izraz-n;
ELSE
izraz
END

7
Primer 3.26 (Zbirka) Napisati program kojim se na osnovu
P o č e ta k
unetih brojnih ocena 5, 4, 3, 2, 1 ispisuju opisne ocene
'odlican', 'vrlo dobar', 'dobar', dovoljan' i 'nedovoljan. ocena
program Ocene;
uses WinCrt; ocena
5 4 3 2 1
var
ocena : integer; 'o d l i c a n '
begin
write('Unesite ocenu: '); 'v r l o d o b a r '
readln(ocena);
case ocena of 'd o b a r '
5 : writeln('odlican');
4 : writeln('vrlo dobar'); 'd o v o l j a n '
3 : writeln('dobar');
2 : writeln('dovoljan');
1 : writeln('nedovoljan'); 'n e d o v o l j a n '
end
end. K ra j

Primer 3.29 (Zbirka) Napisati program koji za uneti broj meseca (na primer, 1=januar,
2=februar, itd) ispisuje njegov broj dana. U slucaju unete vrednosti 2 pitati korisnika da
li je godina prestupna.
program DaniUMesecu; P o č e ta k
uses WinCrt; m esec
var m e s e c < 0 || m e s e c > 1 2
D a
mesec : integer; prestupna : char; begin 1 ,3 ,5 ,7 ,8 ,1 0 ,1 2 4 ,6 ,9 ,1 1 2

write('Unesite broj meseca od 1 do 12: '); ' M e s e


31 dan'
c i m a ' M e s e
30 dana'
c i m a 'D a li je g o d in a
p r e s tu p n a D /N '
'B r o j m e s e c a
je n e k o re k ta n '
readln(mesec);
p re stu p n a
if (mesec<1) or (mesec>12)
D
then writeln('Broj meseca je nekorektan') p re s tu p n a
else N
'M e s e c im a 'M e s e c im a
case mesec of 28 dana' 29 dana'

1,3,5,7,8,10,12 : writeln('Mesec ima 31


dan'); K ra j
4,6,9,11 : writeln('Mesec ima 30 dana');
2 : begin
write('Da li je godina prestupna (D/N)?');
readln(prestupna);
if (prestupna='D') or (prestupna='d')
then writeln('Mesec ima 29 dana')
else writeln('Mesec ima 28 dana');
end
end
end.

Primer 3.33 (Zbirka) Napisati program kojim se ucitava znak za operaciju (+,-,*,/) i dva
realna operanda, a zatim stampa rezultat.

8
program MiniKalkulator;
uses WinCrt;
var
x, y, rezultat : real;
operacija : char;
def : boolean;
begin
write('Unesite vrednost za x: ');
readln(x);
write('Unesite operaciju: '); P o č e ta k
readln(operacija);
write('Unesite vrednost za y: '); x , o p e ra c ija , y
readln(y);
d e f= tru e
def:=true;
case operacija of o p e ra c ija
'+' : rezultat:=x+y; + - * /
'-' : rezultat:=x-y; y=0 N e
re z u lta t= x + y
'*' : rezultat:=x*y; D a
'/' : if y=0 then re z u lta t= x -y d e f= fa lse re z u lta t= x /y
begin
def:=false; re z u lta t= x * y
'R e z u l t a t j e
n e d e fin is a n '
write('Rezultat je
nedefinisan')
end N e
d e f= tru e
else rezultat:=x/y
end; D a
if def then writeln('Rezultat je ', re z u lta t
rezultat:10:3)
end. K ra j

PETLJE (CIKLUSI)

FOR petlja

FOR petlja se koristi kada izraz ili brok izraza treba ponoviti određeni broj puta. U okviru
petlje se nalazi početni uslov, krajnji uslov i brojač. Opšti oblik ove petlje je:
FOR kontrolna promenljiva := izraz-1 TO izraz-2 DO izraz;
gde je:
kontrolna promenljiva brojač u petlji,
izraz-1 početna vrednost,
izraz-2 krajnja vrednost.
Sve tri promenljive moraju biti istog tipa (nikad realne).
Ukoliko je početna vrednost brojača veca od krajnje, ona se umesto inkrementiranja koristi
dekrementiranje, jer se petlja nikad nece izvrsiti. Za dekrementiranje se umesto To koristi
DOWNTO:
FOR kontrolna promenljiva := izraz-1 DOWNTO izraz-2 DO
izraz;

9
U ovoj petlji brojač počinje od veće vrednosti i umanjuje se sve dok ne dostigne kranju
vrednost.

Primer 4.6. (Zbirka) Napisati program za ucitavanje, sumiranje i stampanje brojeva od


1 do 100.
program Suma100; P o č e ta k
uses WinCrt; s= 0
var
s : integer; i= 0 , 1 0 0
i : integer; s= s+ i
begin
s:=0;
for i:=1 to 100 do s
s:=s+i;
writeln('Suma je: ', s); K raj
end.

Primer 4.9. (Zbirka) Napisati program kojim se za zadato n izracunava faktorijal broja
n (faktorijal=n!=1*2*3*...n).
program Suma100;
uses WinCrt;
var P o č e ta k
fakt : integer;
i, n : integer; n
begin
write('Upisati broj n: '); fa k t= 1
readln(n);
i= 1 , n
fakt:=1;
for i:=1 to n do fa k t= fa k t* i
fakt:=fakt*i;
writeln('Faktorijal zadatog broja je: ', fakt);
end. fak t
K raj
Primer 4.14. (Zbirka) Napisati program kojim se za dati ceo broj n i realan broj x,
izracunava izraz: S  sin( x)  sin 2 ( x) +...+ sin n ( x)
program SumaSinus;
uses WinCrt;
var P o č e ta k
i, n : integer;
s, p, x : real; n, x
begin
s= 0 p = 1
write('Upisati broj n: ');
readln(n); i= 1 , n
write('Upisati broj x: ');
readln(x); p = p * s in (x )
s= s+ p

10 s
K raj
s:=0;
p:=1;
for i:=1 to n do
begin
p:=p*sin(x);
s:=s+p
end;
writeln('Suma izraza je ', s:8:2);
end.
P o č e ta k
Primer 4.22. (Zbirka) Napisati program za izracunavanje i xp, xk, h
stampanje vrednosti realne funkcije:
x 2  2x  2 n = tru n c ((x k -x p )/h )+ 1
y x=xp
x 2 1
ako se x menja od xp do xk sa korakom h. i= 1 , n
program razlomak;
uses WinCrt; y = ( x * x -2 .0 * x + 2 .0 )/( s q r ( x ) + 1 .0 )
var x, y
i, n : integer;
x=x+h
xp, xk, h, x, y : real;
begin
write('Upisati vrednosti za xp, xk i korak h: '); K raj
readln(xp, xk, h);
n:=trunc((xk-xp)/h)+1;
x:=xp;
for i:=1 to n do
begin
y:=(x*x-2.0*x+2.0)/(sqr(x)+1.0);
writeln(x:10:2, y:10:2);
x:=x+h
end;
end.

WHILE petlja

WHILE petlja se sastoji od uslova koji treba da bude zadovoljen da bi se završila petlja, pri
čemu ne postoji nikakav brojač. Opsti oblik ove petlje je:
WHILE uslov DO
izraz;
Izraz se izvršava sve dok je uslov ispunjen.

Primer 5.9. (Zbirka) Napisati program kojim se izracunava suma neparnih brojeva od 1
do 99.
program sumaNeparnih;
uses WinCrt;
var

11
i, s : integer;
begin
s:=0;
P o č e ta k
i:=1;
while i<99 do s = 0 i= 1
begin
s:=s+i; i< 9 9
i:=i+2;
end; s= s+ i
i= i+ 2
writeln('Suma neparnih brojeva je: ', s);
end.

Primer 5.21. (Zbirka) Napisati program za izracunavanje n-tog stepena s


celog broja a K raj
program NtiStepen;
uses WinCrt;
var
P o č e ta k
a, n, i, stepen : integer;
begin n, a
write('Unesite brojeve a i n: ');
readln(a, n); s te p e n = 1 i= 1
stepen:=1;
i< = n
i:=1;
while i<=n do s te p e n = s te p e n * a
begin i= i+ 1
stepen:=stepen*a;
i:=i+1
end; s te p e n
writeln('Stepen broja ', a, ' je ', stepen);
end. K raj

Primer 5.32 (Zbirka) Napisati program kojim se u tekstu cije je obelezje kraja '*'
odredjuje broj samoglasnika, suglasnika i praznina.
program BrojacSimbola;
uses WinCrt;
var
simbol : char;
brSamoglasnika, brSuglasnika, brPraznina : integer;
begin
brSamoglasnika := 0;
brSuglasnika := 0;
brPraznina := 0;
writeln('Unesite tekst koji se zavrsava simbolom *: ');
read(simbol);
while simbol <> '*' do
begin

12
case simbol of
'A','E','I','O','U' : brSamoglasnika := brSamoglasnika + 1;
'B','C','D','F','G','H','J','K','L','M','N','P','Q',
'R','S','T','V','W','X','Y','Z' : brSuglasnika := brSuglasnika + 1;
' ' : brPraznina := brPraznina + 1;
end;
read(simbol)
end;
writeln('Broj samoglasnika je: ', brSamoglasnika);
writeln('Broj suglasnika je: ', brSuglasnika);
writeln('Broj praznina je: ', brPraznina);
end.
P o č e ta k
Primer 5.33 (Zbirka) Napisati program kojim se u p ra z n in a = 0
standardnoj ulaznoj (input) tekstualnoj datoteci ta c k a = 0
odredjuje broj praznina, tacaka i interpukcijskih z n a k In t= 0
znakova tipa: zapeta, dvotacka, tacka-zapeta, ako se u N e
datoteci nalaze samo nabrojani znaci. eof
D a
program Znakovi; e o ln
N e
uses WinCrt; D a
var znak
znak : char; znak
praznina, tacka, znakInt : integer; '' '. ' ': ', '; ', ', '
p r a z n in a = p r a z n in a + 1
begin
praznina := 0; ta c k a = ta c k a + 1
tacka := 0;
znakInt := 0; z n a k In t= z n a k In t+ 1
while not eof do
begin
p ra z n in a , ta c k a , z n a k In t
while not eoln do
begin K raj
read(znak);
case znak of
' ' : praznina := praznina + 1;
'.' : tacka := tacka + 1;
',',':',';' : znakInt := znakInt + 1;
end {case}
end; {eoln}
readln {prelazak na sledecu liniju}
end; {eof}
writeln('Praznine: ', praznina);
writeln('Tacke ', tacka);
writeln('Broj znakova interpukcije (,:;) je: ', znakInt);
end.

13
REPEAT petlja
Ova petlja se koristi za izvrsavanje veceg broja izraza sve dok se ne postigne određeni uslov.
Opsti oblik ove petlje:
REPEAT
izraz-1;
izraz-2;
...
izraz-n;
UNTIL uslov;

Primer 6.14 (Zbirka) Napisati program kojim se odredjuje broj jedinica u binarnom
zapisu prirodnog broja n.

program BrojJedinica; P o č e ta k
uses WinCrt;
var n,s : integer; n
begin
write('Unesite broj n: '); s= 0
readln(n);
s:=0; s= s+ n m o d 2
repeat n = n d iv 2
s:=s+n mod 2; {n mod 2 izdvaja cifru 0 ili 1}
N e
n:=n div 2 n=0
until (n=0); D a
writeln('U binarnom zapisu broja ima: ',s,' jedinica'); s
end.
K raj

14
FUNKCIJE

Funkcije predstavljaju podprograme koji vraćaju jednu vrednost. Funkcije su deo nekog izraza
koji se koristi u glavnom programu. Označavaju se sa rezervisanom reči FUNCTION iza koje
sledi ime funkcije i formalni parametri. Razlikuje se od procedure jer se mora odrediti tip
funkcije, odnosno tip rezultata. Ukoliko funkcija ne vraca vrednost kao tip rezultata navodi se
void. Sintaksa funkcije ima sledeci oblik:

FUNCTION Ime_funkcije(VAR formalni_parametri : tip; parametri : tip):tip_funkcije;

Funkcija se može pozivati tako što se dodeli nekoj promenljivoj funkcija sa parametrima, npr:
D := Avg(A, B, C);(*Avg je naziv funkcije, a u zagradi su parametri*)
Parametri funkcije mogu biti slova, izrazi ili promenljive.

Primer 7.1 (Zbirka) Napisati funkciju pod imenom max koja vraca veci od dva zadata
cela broja.
m a x 2 (b ro j1 , b ro j2 )
program FunkcijaMax2;
uses WinCrt; b ro j1 > b ro j2 D a
function max2(broj1, broj2 : integer) : integer; N e
begin m a x 2 = b ro j1 m a x 2 = b ro j1
if broj1 > broj2
then max2 := broj1 K raj
else max2 := broj2
end;
P o č e ta k
var
a, b, rezultat : integer; a, b
begin
writeln('Unesite dva cela broja: '); r e z u lta t= m a x 2 (a ,b )
readln(a,b);
rezultat := max2(a,b); re z u lta t
writeln('Veci broj je: ', rezultat); K raj
end.

Primer 7.7 (Zbirka) Pretpostavljajuci da funkcije abs i odd nisu standardne, sastaviti
njihov zapis.
a b s(a )
function abs(a:real):real; a>0 D a
begin N e
if a>=0 ab s= -a abs= a
then abs:=a
else abs:=-a K raj
end;

function odd(a:integer):boolean;
begin
odd:=a mod 2=1
end;

15
Primer 7.10 (Zbirka) Napisati funkciju za izracunavanje n-tog stepena s te p e n (n ,a )
celog broja a.
function stepen(a, n : integer) : integer; an=1
var an, i : integer;
begin i= 1 , n
an :=1;
an=an*a
for i:=1 to n do
an:=an*a;
stepen :=an s te p e n = a n
end;
K raj
Primer Funkcija (Knjiga) suma kvadrata. Napisati funkciju kojom se s u m a k v ( m ,n )
izracunava suma kvadrata celih brojeva od m do n.
function sumakv(m, n : integer): integer; s= 0
var
s, i : integer; i= m , n
begin s = s + i* i
s:=0;
for i:=m to n do
s:=s+sqr(i); su m ak v = s
sumakv:=s
end; K raj

Primer Funkcija (Knjiga) suma kubova. Napisati funkciju kojom se s u m a k u b ( m ,n )


izracunava suma kubova celih brojeva od m do n.
function sumakub(m, n : integer): integer; s= 0
var
s, i : integer; i= m , n
begin s = s + i* i* i
s:=0;
for i:=m to n do
s:=s+i*i*i; su m ak u b = s
sumakub:=s
end; K raj

PROCEDURE

Procedura se definiše slično kao program, i sastoji je od zaglavlja, dela za deklaraciju i izraza.
Procedura počinje rezervisanom reči PROCEDURE. Parametri koji su rezervisani za izlaz
moraju biti deklarisani kao promenljivi parametri. Oni moraju imati rezervisanu reč VAR u svojoj
deklaraciji. S druge strane neki parametri služe samo kao ulazni; oni predaju vrednosti
proceduri i obično su deklarisani kao parametri vrednosti. Ako parametar služi za oboje, ulaz i
izlaz, onda mora biti deklarisan kao promenljivi parametar.

procedure ime_procedure(var formalni_parametri : tip);

16
begin
... naredbe
end;

Formalni parametri se nazivaju još i varednosni parametri. Procedura se poziva na sledeći


način:
procedure ime;
ili
procedure ime(lista parametara);

Primer Procedure (Knjiga) Napisati program koji koristi proceduru kvkub cije su ulazne
vrednosti dva cela broja m i n, a izlazne vrednosti su celi brojevi p i q. Rezultat p treba
da bude zbir kvadrata brojeva od m do n, a rezultat q zbir kubova brojeva od m do n.
Umesto pisanja dve funkcije za izracunavanje zbira kvadrata i zbira kubova pisemo
jednu proceduru koja izracunava ove dve vrednosti.
program PrimerProcedura; k v k u b ( m ,n ,k v ,k u b )
{Ilustruje koriscenje procedure}
uses WinCrt; kv=0 kub=0
var
i= m , n
broj1, broj2, m, n, k, p, q : integer;
procedure kvkub(m, n:integer; var kv, kub : integer); k v = k v + i* i
{Izracunava sumu kvadrata i sumu kubova brojeva od m do n} k u b = k u b + i* i* i
var
i : integer;
begin
kv:=0; K raj
kub:=0;
for i:=m to n do
begin
kv:=kv+i*i;
kub:=kub+i*i*i; P o č e ta k
end
end; b1, b2
begin
k v k u b ( b 1 ,b 2 ,p ,q )
write('Upisati vrednosti za broj1 i broj2 (broj1<broj2): ');
readln(broj1, broj2);
p, q
kvkub(broj1, broj2, p, q);
writeln(p:6, q:6); K ra j
end.

Primer 6.6 (Knjiga) Napisati proceduru kojom se izracunava minimum i maksimum na


osnovu dva zadata cela broja.
procedure minmax(aa, bb:integer; var min, max : integer);
begin
if aa>bb
then
begin

17
min:=bb;
max:=aa; m in m a x (a a ,b b ,m in ,m a x )
end
else aa> bb D a
begin N e
min:=aa; m in = a a m in = b b
max:=bb; m ax=bb m ax=aa
end
end; K ra j

Primer 6.8 (Knjiga) Napisati program koji tri broja x, y i z uredjuje u neopadajuci
poredak (rastuci). U programu koristiti proceduru pod imenom razmeni, kojom se
razmenjuju vrednosti dve promenljive.

Resenje programa se sastoji u tome da se prvo porede x i P o č e ta k


y, zatim x i z, i na kraju y i z. Ako su dva broja
rasporedjena na zeljeni nacin ide se na sledece x ,y ,z
poredjenje, a ukoliko nisu procedurom razmeni menjaju D a
mesta. x>y
program Poredak; N e r a z m e n i( x ,y )
{Ilustruje koriscenje procedure} D a
uses WinCrt; x>z
N e r a z m e n i( x ,z )
var
x, y, z : integer; D a
procedure razmeni(var a, b : integer); y>z
N e r a z m e n i( y ,z )
{Izracunava sumu kvadrata i sumu kubova brojeva od m
do n} x ,y ,z
var
tmp : integer;
K raj
begin
tmp:=a;
a:=b; r a z m e n i( a ,b )
b:=tmp
end; tm p = a
begin a= b
write('Upisati vrednosti za x, y i z: '); b = tm p
readln(x, y, z);
if x>y then razmeni(x, y); K raj
if x>z then razmeni(x, z);
if y>z then razmeni(y, z);
writeln('Raspored brojeva u neopadajucem (rastucem) poredku je: ', x:6, y:6, z:6);
end.

REKURZIJA

Funkcije ili procedure se mogu pozivati unutar funkcije ili procedure i to svojstvo se naziva rekurzija.

18
Primer Rekurzivna funkcija (Knjiga). Napisati rekurzivnu funkciju za izracunavanje
faktorijala broja n.

fakt(n) = 1 za n=1,
fakt (n) = n*fakt(n-1)
fa k t(n )
function fakt(n : integer): integer; D a
begin n=1
if n=1 N e
fa k t= n * fa k t(n -1 ) fa k t= 1
then fakt:=1
else fakt:=n*fakt(n-1)
end; K raj

{Primer 6.12 (Knjiga) Banka na pocetku svake godine ulagacima obracunava kamatu od
p procenata na novcanu sumu koja je orocena u toku prethodne godine. Napisati
program kojim se izracunava novcani iznos kojim ceraspolagati ulagac posle n godina,
ako je pocetno ulaganje S.

Problem se moze resiti rekurzivno:


Ako je an novcani iznos akumuliran nakon n godina, tada je:

a0=s - pocetno ulaganje


a1=s+s*p/100 - iznos posle prve godine
a2=a1+a1*p/100 - iznos posle druge godine

Vidi se da je akumulirani iznos nakon i-te godine:

ai=a(i-1)+a(i-1)*p/100

ili ai=(1+p/100)*a(i-1)

pa se konacno dobija rekurzivna formula:

a0=S
ai=(1+p/100)*a(i-1)

Ova formula se lako transformise u funkciju:

function iznos(n:integer):real; iz n o s (n )
begin D a
if n=0 n=0
then iznos:=s N e
else iznos:=(1+p/100)*iznos(n-1) iz n o s := (1 + p /1 0 0 ) * iz n o s (n - 1 ) iz n o s = s
end;
K raj
program Banka;

19
uses WinCrt;
var
n, p, s : integer;
function iznos(n:integer):real;
begin
if n=0 P o č e ta k
then iznos:=s
else iznos:=(1+p/100)*iznos(n-1) s ,p ,n
end; n ,iz n o s (n )
begin
write('Unesite pocetni iznos novca, kamatu i broj godina: ');
K raj
readln(s, p, n);
writeln('Iznos novca posle ', n, ' godina je ', iznos(n):10:2)
end.

Primer 6.10 Rekurzivna procedura (Knjiga) Ako se sa ulaza ucitava niz znakova cija
duzina nije poznata, a obelezje kraja niza je *. Napisati program koji obezbedjuje ispis
niza u inverznom poretku.
Na primer, ako su ulazni podaci:
abcde*
racunar na izlazu treba da ispise: in v e rz
*edcba x
program inverzno(input,output);
D a
uses WinCrt; x = '* '
procedure inverz; N e
var in v e rz
x:char;
begin x
read(x);
if x<>'*' then inverz; K raj
write(x)
end;

begin P o č e ta k
write('Upisati niz karaktera koji se zavrsavaju znakom *: ');
inverz in v e rz
end.
K raj

RESAVANJE PROBLEMA METODOM ODOZGO NADOLE

Korisnik unosi brojcane vrednosti dana, meseca i godine. Napisati program koji ispisuje
dan u mesecu (brojcano), naziv datog meseca godinu i broj zadatog dana u godini. Na
primer ako je zadato “15 3 1988”, ispisuje se ”15 mart 1988 dan 75”.

program kalendar(input,output);
uses WinCrt;

20
{*program numericku prezentaciju dana, meseca i godine
prevodi u dan, naziv meseca, godinu i dan u godini*}
var
dan,mesec,godina,danaugodini,i:integer;
prestupna :boolean;

procedure testprest(godina:integer;var prestupna:boolean);


{*procedura promenljivoj prestupna dodeljuje true ako je
godina prestupna u protivnom false*}
begin
prestupna:=(godina mod 100<>0) and (godina mod 4 = 0) or
(godina mod 400=0)
end;

{****g1avni program****}
begin

{*Modul 1: unos dana, meseca i godine*}


readln(dan,mesec,godina);

{*Modu1 2: ispis dana i meseca*}


write(dan);

case mesec of

1 : write('januar');

2 : write(' februar');

3 : write(' mart');

4 : write(' april');

5 : write(' maj');

6 : write(' jun');

7 : write(' jul');

8 : write(' avgust');

9 : write(' septembar');

10 : write(' oktobar');

11 : write(' novembar');

21
12 : write(' decembar')
end;

{*Modul 3:Izracunavanje broja dana u godini*}


danaugodini:=dan;

for i:=1 to mesec-1 do


case i of

1,3,5,7,8,10: danaugodini:=danaugodini+31;

2: danaugodini:=danaugodini+28;

4,6,9,11: danaugodini:=danaugodini+30
end;

{*Provera da li je godina prestupna*}


testprest(godina,prestupna);

if prestupna and (mesec>2)

then danaugodini:=danaugodini+1;

{*Modul 4:ispis godine i dana u godini*}


writeln(godina:5,' dan ',danaugodini)
end.

22
RAD SA MODULIMA TURBO PASCAL-a
Kreirati unit pod imenom bibl1 sa funkcijama tangens zbir i
faktorijal.
Da bi se mogao koristiti unit snimiti pod imenom bibl1.pas i
obavezno kompajlirati (prevesti na masinski jezik). Zatim u
programu koji koristi funkcije iz ovog unita prikljuciti bibl1 u uses
delu.
Ime unita mora biti isto kao ime fajla koji sadr`i izvorni PASCAL
kod. Nakon kompajliranja stvara se fajl Bibl1.TPU

unit bibl1;

interface
{u interface delu se navode samo zaglavlja funkcija i procedura bez tela funkcije}
function tangens(broj : real) : real;
function zbir(broj1, broj2 : real) : real;
function faktorijal(k : integer) : integer;

implementation
{U delu za implementaciju kompletne funkcije i procedure (sa telom funkcija i
procedura) koje su deklarisane u interface delu unit-a}
function tangens;
begin
tangens := sin(broj)/cos(broj);
end;

function zbir;
begin
zbir := broj1+broj2;
end;

function faktorijal;
var
p, i : integer;
begin
p := 1;
for i:=1 to k do
p:=p*i;
faktorijal:=p;
end;
end.

Primer 7.8a (Zbirka) Napisati program koji poziva funkciju tangens iz primera 7.8 i sve
ostale funkcije iz unit-a bibl1.TPU )koji sam ja napravio)

program TangensBroja;

23
uses WinCrt, bibl1;

var
x, a, b, rezultat : real;
rez, n, m : integer;

begin
writeln('Unesite ugao u radijanima cisi se tangens racuna: ');
readln(x);
rezultat := tangens(x);
writeln('Tangens unetog broja je: ', rezultat:8:2);

writeln('Unesite dva realna broja: ');


readln(a, b);
rezultat := zbir(a, b);
writeln('Zbir zadatih brojeva je: ', rezultat:8:2);

writeln('Unesite ceo broj ciji se faktorijal racuna: ');


readln(n);
rez := faktorijal(n);
writeln('Faktorijal zadatog broja je: ', rez);

{Izracunava vrednost izraza c=n!/(m!(n-m)!)}


writeln('Unesite dva cela broj ciji se faktorijal racuna: n>m');
readln(n, m);
rezultat := faktorijal(n) div (faktorijal(m) div faktorijal(n-m);
writeln('Resenje zadatog izraza je: ', rezultat:6:2);

end.

24
NESTANDARDNI TIPOVI PODATAKA

Osim standardnih tipova podataka u Pascal-u postoje i nestandardni prosti tipovi


podataka. To su nabrojivi i intervalni tipovi koje definise korisnik. Primena ovih tipova
poboljsava citljivost programa i njegovo lakse razumevanje.

NABROJIVI TIP

Definise se kao uredjen skup nabrojanih imena, koja predstavljaju konstante tipa.
Na primer

type
dani=(nedelja, ponedeljak, utorak, sreda, cetvrtak, petak, subota);
i promenljiva:
dan : dani;

koja je tipa nabrojive promenljive.


Vrednost promenljive dan moze biti bilo koja (ali samo jedna u jednom trenutku)
od nabrojanih vrednosti.

Primer 7.1 (Knjiga) Napisati program kojim se ispisuju pravila saobracajnog kretanja.

program pravilaKretanja;
uses WinCrt;

type
semafor=(crveno, zuto, zeleno);
var
signal : semafor;

begin
for signal:=crveno to zeleno do
case signal of
crveno : writeln('Crveno svetlo zabranjuje kretanje ');
zuto : writeln('Zuto svetlo upozorava o prekidu kretanja ');
zeleno : writeln('Zeleno svetlo dozvoljava nastavak kretanja ');
end
end.

25
NIZOVI

Nizovi su skupovi podataka istog tipa. Nizovi su indeksne promenljive. Svaki član niza
zauzima određenu memorijsku lokaciju. Ovakvi nizovi se nazivaju jednodimenzionalni nizovi
podataka. Korisni su za predstavljanje npr. imena ljudi, rezultata ispita ili nekih sličnih
podataka. Opšti oblik predstavljanja nekog niza:
N[1]
N[2]
N[3]
...
N[m]
N-ime niza; brojevi u zagradama predstavljaju indekse niza;
Pored jednodimenzionalnih nizova postoje i dvodimenzionalni nizovi (matrice) koji se koriste
za složenije strukture. Dvodimenzionalni nizovi se sastoje od redova (vrsta) i kolona.
Primer dvodimenzionalnog niza:
Aij
A-ime matrice
i-indeks vrste matrice
j-indeks kolone matrice

Deklaracija nizova je sledeća:


VAR
Ime niza: ARRAY[veličina indeksa] OF tip podatka;

ili najčešće:

TYPE
niz = ARRAY[1..6] OF INTEGER;
VAR
mojniz :niz;

Primer 11.5 (Zbirka) Zadat je celobrojni niz x. Napisati program kojim se izracunava
srednja vrednost clanova zadatog niza.
program ProsecnaVrednostClanovaNiza;
uses WinCrt;
{Maksimalni dozvoljeni broj elemenata-clanova niza je 100}
const k=100;
{Deklarisemo novi tip podataka - niz od 100 realnih brojeva}
type
niz=array[1..k] of real; u c ita j( n ,a )
var
n, broj, i : integer; i= 1 , n
s : real; a [i]
x : niz;

procedure ucitaj(n:integer; var a:niz); K raj


{Procedura ucitava clanove niza}

26
var
i : integer;
begin
for i:=1 to n do
read(a[i])
end;
P ro s e c n a V re d n o s t(n ,a ,s )
procedure ProsecnaVrednost(n:integer; a:niz; var s:real);
{Procedura koja izracunava prosecnu vrednost clanova niza} s= 0
var
i= 1 , n
i : integer;
begin s = s + a [i]
s:=0;
for i:=1 to n do
s:=s+a[i]; s = s /n
s:=s/n
K raj
end;
P o č e ta k
begin
write('Unesite broj clanova niza: '); n
readln(n);
writeln('Unesite clanove niza: '); u c ita j( n ,x )
ucitaj(n, x);
ProsecnaVrednost(n,x,s); P r o s e c n a V r e d n o s t( n ,x ,s )
writeln('Prosecan vrednost clanova niza je: ', s:8:2);
end. s

K raj
Primer 11.6 (Zbirka) Zadat je celobrojni niz x. Napisati program kojim se izracunava
maksimalna vrednost zadatog niza.

program MaksimalnaVrednostClanovaNiza;
uses WinCrt;
{Maksimalni dozvoljeni broj elemenata-clanova niza je 100}
const k=100;
{Deklarisemo novi tip podataka - niz od 100 realnih brojeva}
type
niz=array[1..k] of real;
var u c ita j( n ,a )
n, broj, i : integer; i= 1 , n
amax : real;
x : niz; a [i]

procedure ucitaj(n:integer; var a:niz);


{Procedura ucitava clanove niza} K raj
var
i : integer;

27
begin
for i:=1 to n do
read(a[i])
M a k s im a ln a V r e d n o s t(n ,a ,a m a x )
end;
a m a x = a [1 ]
procedure MaksimalnaVrednost(n:integer; a:niz; var
amax:real); i= 2 , n
{Procedura koja izracunava prosecnu vrednost D a
clanova niza} a [i]> a m a x
begin N e a m a x = a [i]
amax:=a[1];
for i:=1 to n do K raj
if a[i]>amax then amax:=a[i];
end;
P o č e ta k
begin n
write('Unesite broj clanova niza: ');
readln(n); u c ita j( n ,x )
writeln('Unesite clanove niza: ');
{Unosi se jedan rezultat pa se sa Enter prelazi u sledeci M a k s im a ln a V r e d n o s t( n ,x ,a m a x )
red, pa se unosi sledeci pa Enter itd}
ucitaj(n, x); am ax
MaksimalnaVrednost(n,x,amax);
writeln('Maksimalna vrednost u nizu je: ', amax:8:2); K raj
end.

Primer 11.9 (Zbirka) Zadat je celobrojni niz x. Napisati program kojim se izracunava
suma pozitivnih elemenata zadatog niza.
P o č e ta k
program SumaPozitivnih;
uses WinCrt; n
{Maksimalni dozvoljeni broj elemenata-clanova
niza je 30} u c ita j( n ,x )
const k=30;
r e z u lta t= S u m a P o z itiv n ih C la n o v a ( n ,x )
{Deklarisemo novi tip podataka - niz od 100
realnih brojeva}
type re z u lta t
niz=array[1..k] of real;
var K raj
n, i : integer;
rezultat : real; u c ita j( n ,a )
x : niz;
i= 1 , n
procedure ucitaj(n:integer; var a:niz); a [i]
{Procedura ucitava clanove niza - u jednoj liniji}
var
i : integer; K raj

28
begin
for i:=1 to n do
read(a[i])
end; S u m a P o z iti v n i h C la n o v a ( n ,a )
function SumaPozitivnihClanova(n:integer; a:niz):real; s= 0
{Funkcija koja izracunava zbir pozitivnih clanova
niza} i= 1 , n
var D a
a [i]> 0
i:integer;
s:real; N e s = s + a [i]
begin
s:=0; S u m a P o z itiv n ih C la n o v a = s
for i:=1 to n do
if a[i]>0 then s:=s+a[i]; K raj
SumaPozitivnihClanova:=s
end;

begin
write('Unesite broj elemenata niza: ');
readln(n);
writeln('Unesite clanove niza: ');
ucitaj(n, x);
rezultat := SumaPozitivnihClanova(n,x);
writeln('Suma pozitivnih elemenata niza je: ', rezultat:8:2);
end.

Primer 8.4 (Knjiga) Napisati program kojim se odredjuje koliko je ucesnika takmicenja
iz programiranja imalo natprosecne rezultate.

Problem se moze razloziti na sledece module:

1. Ucitavanje vrednosti elemenata niza.


Ovaj modul se realizuje procedurom ucitaj.
2. Izracunavanje prosecnog rezultata:
Realizuje se procedurom prosek.
3. Prebrojavanje natprosecnog rezultata.
Realizuje se u samom programu.
4. Ispisivanje izvestaja (izlazni podaci)
Realizuje se ispisom rezultata u samom programu.

program Natprosecni;
uses WinCrt;

const k=100;
type
niz=array[1..k] of real;

29
var
n, broj, i : integer;
s : real;
x : niz;

procedure ucitaj(n:integer; var a:niz); u c ita j( n ,a )


{Procedura ucitava rezultate takmicara - elemente niza}
var i= 1 , n
i : integer; a [i]
begin
for i:=1 to n do
readln(a[i]) K raj
end;
p r o s e k ( n ,a ,s )
procedure prosek(n:integer; a:niz; var s:real);
{Procedura koja izracunava prosecan rezultat} s= 0
var
i : integer; i= 1 , n
begin
s = s + a [i]
s:=0;
for i:=1 to n do
s:=s+a[i]; s = s/n
s:=s/n
end; K raj

begin P o č e ta k
write('Unesite broj takmicara: ');
readln(n); n
writeln('Unesite rezultate: ');
{Unosi se jedan rezultat pa se sa Enter prelazi u sledeci red, pa u c ita j( n ,x )
se unosi sledeci rezultat, pa Enter itd}
p r o s e k ( n ,x ,s )
ucitaj(n, x);
prosek(n,x,s); b r o j= 0
broj:=0; {prebrojavanje prosecnih rezultata} i= 1 , n
for i:=1 to n do D a
if x[i]>s then broj:=broj+1; x [i]> s
writeln('Prosecan rezultat je: ', s); N e b r o j= b ro j+ 1
writeln('Natprosecne rezultate je imalo: ', broj, ' ucesnika')
end. b ro j

K raj
SORTIRANJE

Primer 8.11 (Knjiga) Zadat je celobrojni niz a. Napisati program koji koristi proceduru
sort1 za sortiranje niza u monotono neopadajuci poredak.

Prvi algoritam sortiranja radi na sledeci nacin:

30
Pri prvom prolasku kroz niz (i=1) razmenjuju se vrednosti clana a[1] sa clanovima ostatka
niza a[2], a[3], ... a[n] koji su manji od njega. Zatim (za i=2) istim postupkom komponenta
a[2] dobija najmanju vrednost od ostatka niza. Procedura sort1 koristi proceduru razmeni
da razmeni vrednosti promenljivih.

program Sortiranje;
uses WinCrt;
{Maksimalni dozvoljeni broj elemenata-clanova niza je 100}
const k=100;
{Deklarisemo novi tip podataka - niz od 100 realnih brojeva}
type
niz=array[1..k] of real;
var
n : integer;
a : niz;

procedure ucitaj(n:integer; var a:niz); u c ita j( n ,a )


{Procedura ucitava clanove niza}
var i= 1 , n
i : integer; a [i]
begin
for i:=1 to n do
read(a[i]) K raj
end;

procedure razmeni(var a,b : real);


var r a z m e n i( a ,b )
tmp : real;
te m p = a
begin
a=b
tmp:=a;
b = te m p
a:=b;
b:=tmp K raj
end;

procedure sort1(n:integer; var a:niz); s o r t1 ( n ,a )


{Procedura koja sortira clanove niza u neopadajucem i= 1 ,n -1
poredku}
var j= i+ 1 , n
i, j : integer; a [i]> a [j] D a
begin r a z m e n i( a [ i] ,a [ j] )
N e
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then razmeni(a[i], a[j]); K ra j
end;

procedure pisi(n:integer; var a:niz);


{Procedura koja ispisuje clanove niza u neopadajucem poredku}

31
var is p is (n ,a )
i: integer;
begin i= 1 , n
for i:=1 to n do a [i]
begin
write(a[i]:6:2);
if i mod 10 = 0 then writeln K raj
end
end; P o č e ta k

begin n
write('Unesite broj elemenata niza: ');
readln(n); u c ita j(n ,a )
writeln('Unesite elemente niza: '); s o r t1 (n ,a )
ucitaj(n, a);
sort1(n, a); is p is (n ,a )
writeln('Sortirani niz je: ');
pisi(n, a); K raj
end.

Primer 8.11 (Knjiga) Zadat je celobrojni niz a. Napisati program koji koristi proceduru
sort2 za sortiranje niza u monotono neopadajuci poredak.

Drugi algoritam sortiranja (buble sort - metod mehurica) radi na sledeci nacin:
Ovom metodom se porede susedni elementi niza i ako su nepravilno uredjeni razmenjuju
mesta. Posle poredjenja svih parova susednih elemenata najveci ce isplivati na kraj niza i
zato se ovaj metod naziva metod mehurica. Postupak se ponavlja n-1 puta dok se ne izvrsi
sortiranje celog niza.

program Sortiranje;
uses WinCrt;
{Maksimalni dozvoljeni broj elemenata-clanova niza je 100}
const k=100;
{Deklarisemo novi tip podataka - niz od 100 realnih brojeva}
type
niz=array[1..k] of real;
var
n : integer;
a : niz;

procedure ucitaj(n:integer; var a:niz); u c ita j( n ,a )


{Procedura ucitava clanove niza}
var i= 1 , n
i : integer; a [i]
begin
for i:=1 to n do
read(a[i]) K raj

32
end;

procedure razmeni(var a,b : real);


var r a z m e n i( a ,b )
tmp : real;
begin te m p = a
tmp:=a; a=b
a:=b; b = te m p
b:=tmp K raj
end;
s o rt2 (n ,a )
procedure sort2(n:integer; var a:niz);
{Procedura koja sortira clanove niza u neopadajucem g r a n ic a = n - 1 ,1 ,- 1
poredku - metod mehurica} i= 1 , g ra n ic a
var
i, granica : integer; a [i]> a [i+ 1 ] D a
begin N e r a z m e n i( a [i] ,a [i+ 1 ] )
for granica:=n-1 downto 1 do
for i:=1 to granica do K raj
if a[i]>a[i+1] then razmeni(a[i], a[i+1]);
end; is p is (n ,a )
i= 1 , n
procedure pisi(n:integer; var a:niz);
{Procedura koja ispisuje clanove niza u neopadajucem poredku} a [i]
var
i: integer;
begin K raj
for i:=1 to n do P o č e ta k
begin
n
write(a[i]:6:2);
if i mod 10 = 0 then writeln u c ita j(n ,a )
end
end; s o r t2 (n ,a )

begin is p is (n ,a )
write('Unesite broj elemenata niza: ');
readln(n); K raj
writeln('Unesite elemente niza: ');
ucitaj(n, a);
sort2(n, a);
writeln('Sortirani niz je: ');
pisi(n, a);
end.

BINARNO PRETRAZIVANJE SORTIRANOG NIZA

33
Primer 11.43 (Zbirka) Zadat je celobrojni niz a. Napisati program koji koristi proceduru
sort2 za sortiranje niza u monotono neopadajuci poredak i funkciju BinPret za nalazenje
indeksa zadatog clana niza i prikazivanje vrednosti clana na tom indeksu.

program SortiranjeIBinarnoPretrazivanjeNiza;
uses WinCrt;
{Maksimalni dozvoljeni broj elemenata-clanova niza je 100}
const k=100;
{Deklarisemo novi tip podataka - niz od 100 realnih brojeva}
type
niz=array[1..k] of real;
var
n, IndeksPronadjenogElementa : integer;
b : real;
a : niz;

procedure ucitaj(n:integer; var a:niz);


{Procedura ucitava clanove niza}
var
i : integer;
begin
for i:=1 to n do
read(a[i])
end;

procedure razmeni(var a,b : real);


var
tmp : real;
begin
tmp:=a;
a:=b;
b:=tmp
end;

procedure sort2(n:integer; var a:niz);


{Procedura koja sortira clanove niza u neopadajucem poredku - metod mehurica}
var
i, granica : integer;
begin
for granica:=n-1 downto 1 do
for i:=1 to granica do
if a[i]>a[i+1] then razmeni(a[i], a[i+1]);
end;

function BinPret(n:integer; b:real; a:niz) : integer;


{Rezultat binarnog pretrazivanja je indeks onog elementa, uredjenog niza A
koji je jednak vrednosti od b, ili nula ako takvog elementa nema}

34
var
gornja, donja, sredina : integer;
nadjen : boolean;
begin
donja:=1;
gornja:=n;
nadjen:=false;
while (donja<=gornja) and not nadjen do
begin
sredina:=(donja+gornja) div 2; {sredina intervala}
if (b=a[sredina]) {ako je element pronadjen}
then nadjen:=true
else {element nije pronadjen}
if b<a[sredina]
then gornja:=sredina-1 {nova gornja granica}
else donja:=sredina+1 {nova donja granica}
end;
if not nadjen
then BinPret:=0 {element nije nadjen}
else BinPret:=sredina {element je pronadjen}
end;

procedure pisi(n:integer; var a:niz);


{Procedura koja ispisuje clanove niza u neopadajucem poredku}
var
i: integer;
begin
for i:=1 to n do
begin
write(a[i]:6:2);
if i mod 10 = 0 then writeln
end
end;

begin
write('Unesite broj elemenata niza: ');
readln(n);
writeln('Unesite elemente niza: ');
ucitaj(n, a);
sort2(n, a);
writeln('Sortirani niz je: ');
pisi(n, a);
writeln;
writeln('Upisati element niza koji se trazi: ');
readln(b);
IndeksPronadjenogElementa:=BinPret(n, b, a);

35
writeln('Element se nalazi na indeksu (poziciji u sortiranom nizu) ',
IndeksPronadjenogElementa);
writeln;
writeln('Vrednost elementa na poziciji ', IndeksPronadjenogElementa,' je: ',
a[IndeksPronadjenogElementa]:8:2);
end.

UNIT BIBL2 U KOME SU ZAPISANE FUNKCIJE ZA UCITAVANJE I ISPISIVANJE


NIZA NA EKRAN, ZATIM FUNKCIJE I PROCEDURE ZA SORTIRANJE I
BINARNO PRETRAZIVANJE NIZA

unit bibl2;

interface
const
k=100;
type
niz=array[1..k] of real;
procedure ucitaj(n:integer; var a:niz);
{Procedura ucitava clanove niza}
procedure pisi(n:integer; var a:niz);
{Procedura koja ispisuje clanove niza u neopadajucem poredku}
procedure razmeni(var a,b : real);
{Procedura koja razmenjuje vrednosti dva realna broja}
procedure sort1(n:integer; var a:niz);
{Procedura koja sortira clanove niza u neopadajucem poredku}
procedure sort2(n:integer; var a:niz);
{Procedura koja sortira clanove niza u neopadajucem poredku - metod mehurica}
function BinPret(n:integer; b:real; a:niz) : integer;
{Rezultat binarnog pretrazivanja je indeks onog elementa, uredjenog niza A koji je jednak
vrednosti od b, ili nula ako takvog elementa nema}

implementation

procedure ucitaj;
{Procedura ucitava clanove niza}
var
i : integer;
begin
for i:=1 to n do
read(a[i])
end;

procedure razmeni;
{Procedura koja razmenjuje vrednosti dva realna broja}

36
var
tmp : real;
begin
tmp:=a;
a:=b;
b:=tmp
end;

procedure sort1;
{Procedura koja sortira clanove niza u neopadajucem poredku}
var
i, j : integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then razmeni(a[i], a[j]);
end;

procedure sort2;
{Procedura koja sortira clanove niza u neopadajucem poredku - metod mehurica}
var
i, granica : integer;
begin
for granica:=n-1 downto 1 do
for i:=1 to granica do
if a[i]>a[i+1] then razmeni(a[i], a[i+1]);
end;

procedure pisi;
{Procedura koja ispisuje clanove niza u neopadajucem poredku}
var
i: integer;
begin
for i:=1 to n do
begin
write(a[i]:6:2);
if i mod 10 = 0 then writeln
end
end;

function BinPret;
{Rezultat binarnog pretrazivanja je indeks onog elementa, uredjenog niza A koji je jednak
vrednosti od b, ili nula ako takvog elementa nema}
var
gornja, donja, sredina : integer;
nadjen : boolean;
begin

37
donja:=1;
gornja:=n;
nadjen:=false;
while (donja<=gornja) and not nadjen do
begin
sredina:=(donja+gornja) div 2; {sredina intervala}
if (b=a[sredina]) {ako je element pronadjen}
then nadjen:=true
else {element nije pronadjen}
if b<a[sredina]
then gornja:=sredina-1 {nova gornja granica}
else donja:=sredina+1 {nova donja granica}
end;
if not nadjen
then BinPret:=0 {element nije nadjen}
else BinPret:=sredina {element je pronadjen}
end;
end.

38
MATRICE

Dvodimenzionalni nizovi se sastoje od redova (vrsta) i kolona.


Primer dvodimenzionalnog niza (matrice):
Aij
A-ime matrice
i-indeks vrste matrice
j-indeks kolone matrice
Deklaracija matrice:
type ili const m=10;
dim=1..max; type niz=array[1..m] of real;
mat=array[dim,dim] of tip; mat=array[1..m] of niz;
var var
A:mat; a:mat;

Primer 6.12a (Zbirka) Napisati program (funkciju) kojom se za realnu matricu A (NxN)
izracunava suma svih elemenata (clanova) matrice.

program SumaClanovaMatrice; u c ita j( n ,A )


uses WinCrt; P o č e ta k
i= 1 , n
n
const k=10; j= 1 , n
type u c ita j( n ,A )
niz=array[1..k] of real; A [i][j]
matrica=array[1..k] of niz; is p is (n ,A )
K raj r e z u lta t= S u m a E le m e n a ta ( n ,A )
var
A : matrica;
re z u lta t
rezultat : real;
i, j, n : integer; K raj
procedure ucitajMatricu(n:integer;var A:matrica);
var
i, j : integer; S u m a E le m e n a ta (n ,A )
begin
for i:=1 to n do s= 0
for j:=1 to n do
read(A[i][j]) j= 1 , n
end; i= 1 , n
s = s + A [i][j]
function SumaElemenata(n:integer; A:matrica) : real;
var
s : real; S u m a E le m a n a ta = s
i, j : integer;
begin K raj
s:=0;

39
for i:=1 to n do
for j:=1 to n do
s:=s+A[i,j];
SumaElemenata:=s
end;

begin is p is (n ,A )
write('Upisati dimenzije matrice (n):');
readln(n); i= 1 , n
write('Unesite elemente matrice (3x3): '); j= 1 , n
ucitajMatricu(n, A);
writeln('Elementi matrice su: '); A [i][j]
for i:=1 to n do
for j:=1 to n do
writeln(A[i][j]:8:2); K raj
writeln;
rezultat:=SumaElemenata(n, A);
write('Suma elemenata matrice je: ', rezultat:8:2);

end.

Primer 6.12b (Zbirka) Napisati program (funkciju) kojom se za realnu matricu A (NxN)
izracunava suma svih elemenata (clanova) matrice na glavnoj dijagonali.

function SumaDijagonalnihElemenata(n:integer; A:matrica) : real;


var S u m a D ija g o n a ln ih E le m e n a ta ( n ,A )
s : real;
s= 0
i, j : integer;
begin j= 1 , n
s:=0; i= 1 , n
for i:=1 to n do i= j N e
for j:=1 to n do D a
if i=j then s= s + A [i][j]
s:=s+A[i,j];
SumaDijagonalnihElemenata:=s S u m a D ija g o n a ln ih E le m a n a ta = s
end;
K raj

Primer 6.12e (Zbirka) Napisati program (funkciju) kojom se za realnu matricu A (NxN)
izracunava suma svih negativnih elemenata (clanova) matrice.

function SumaNegativnihElemenata(n:integer; A:matrica) : real;


var
s : real;
i, j : integer;
begin
s:=0;
for i:=1 to n do

40
for j:=1 to n do
if A[i,j]<0 then S u m a N e g a tiv n ih E le m e n a ta ( n ,A )
s:=s+A[i,j];
SumaNegativnihElemenata:=s s= 0
end;
j= 1 , n
Unit u kome se nalaze funkcije za rad sa i= 1 , n
matricama.
A [i][j]< 0 N e
D a
unit bibl3;
s = s + A [i][j]
interface
const k=10; S u m a N e g a tiv n ih E le m a n a ta = s
type
niz=array[1..k] of real; K ra j
matrica=array[1..k] of niz;
procedure ucitajMatricu(n:integer;var A:matrica);
function SumaElemenata(n:integer; A:matrica) : real;
function SumaDijagonalnihElemenata(n:integer; A:matrica) : real;
function SumaNegativnihElemenata(n:integer; A:matrica) : real;

implementation

procedure ucitajMatricu;
var
i, j : integer;
begin
for i:=1 to n do
for j:=1 to n do
read(A[i][j])
end;

function SumaElemenata;
var
s : real;
i, j : integer;
begin
s:=0;
for i:=1 to n do
for j:=1 to n do
s:=s+A[i,j];
SumaElemenata:=s
end;

function SumaDijagonalnihElemenata;
var
s : real;

41
i, j : integer;
begin
s:=0;
for i:=1 to n do
for j:=1 to n do
if i=j then
s:=s+A[i,j];
SumaDijagonalnihElemenata:=s
end;

function SumaNegativnihElemenata;
var
s : real;
i, j : integer;
begin
s:=0;
for i:=1 to n do
for j:=1 to n do
if A[i,j]<0 then
s:=s+A[i,j];
SumaNegativnihElemenata:=s
end;

end.

42
STRINGOVI
Funkcije i procedure kod strinogova su sledeće:
Funkcije:
LENGTH(str) -vraća broj karaktera u stringu str.
CONCAT(str1, str2,...) –vraća string koji se dobija spajanjem strinogova str1, str2,...
COPY(str, pos, len) –vraća podstring iz stringa str, koji počinje od pozicije pos, sa dužinom
len.
POS(str1, str2)-vraća pozicju prvog pojavljivanje karaktera str1 u str2. Ako se str1 ne sadrži u
str2 vraća se nula.
Procedure:
INSERT(str1, str2, pos) -ubacuje string str1 u string str2, od mesta pos.
DELETE(str, pos, len) -briše podstring iz stringa str počevši od pozicije pos dužine len.

EOLN je logička funkcija se koristi za utvrđivanje kraja linije pri čitanju ulaznog fajla.
Funkcija ima vrednost false sve dok se ne dostigne kraj reda kada postaje true. Ova funkcija je
korisna kada se ne zna koliko karaktera ima u redu. Za ovu funkciju se može koristiti petlja:
WHILE NOT EOLN DO
BEGIN
READ(Ch);
...
END;

Druga Bulova funkcija je EOF koja se koristi za određivanje kraja datoteke. Funkcija daje
vrednost FALSE sve dok se ne dođe do kraja datoteke kada dobija vrednost TRUE. Obično se
koriste funkcije EOF i EOL u kombinaciji kako bi se analiziralo više redova teksta.
WHILE NOT EOF DO
BEGIN
WHILE NOT EOLN DO
BEGIN
READ(Ch);
... { obrada podataka }
END; { Kraj linije }
READLN { pozicioniranje na početak novog reda }
END; { kraj fajla }

Primer 13.3 (Zbirka) Napisati program kojim se ucitavaju prezimena studenata iz jedne
grupe, a zatim se ispisuju u alfabetskom poretku.

program Alfabet; r a z m e n i( s 1 ,s 2 )
uses WinCrt;
te m p = s 1
const k=50; s1 = s2
type maxstring=string[30]; {maksimalni broj slova u prezimenu} s 2 = te m p
var i, j, n : integer; K raj
prezime : array[1..k] of maxstring;

43
procedure razmeni(var s1,s2 : maxstring);
var
tmp : string[30]; P o č e ta k
begin n
tmp:=s1;
s1:=s2; i= 1 , n
s2:=tmp;
p re z im e [i]
end;

begin i= 1 , n -1
write('Unesite broj studenata: ');
readln(n); j= i+ 1 , n
writeln('Unesite prezimena: '); p re z im e [i]> p re z im e [j]
for i:=1 to n do
readln(prezime[i]); r a z m e n i( p re z im e [ i],p re z im e [j])
for i:=1 to n-1 do
for j:=i+1 to n do
if prezime[i]>prezime[j] i= 1 , n
then razmeni(prezime[i], prezime[j]); p re z im e [i]
writeln('Prezimena studenata uredjena po
alfabetskom redosledu su: ');
for i:=1 to n do K raj
writeln(prezime[i]);
end.

Primer 13.4 (Zbirka) Napisati program kojim se u zadatom stringu s broji pojavljivanje
datog znaka x.

program BrojZnakova;
uses WinCrt;

var i, brojac : integer;


s : string;
x : char; P o č e ta k
begin s, x
write('Unesite tekst: ');
readln(s); b ro ja c = 0
writeln('Unesite znak x: ');
readln(x); i= 1 , le n g th (s )
brojac:=0;
b r o ja c = b r o ja c + o r d (s [ i] = x )
for i:=1 to length(s) do
brojac:=brojac+ord(s[i]=x);
writeln(x, ' se pojavljuje ', brojac, ' puta. '); b ro ja c
end.
K ra j

44
Primer 13.18 (Zbirka) Napisati program kojim se u zadatom stringu s zamenjuje svako
pojavljivanje stringa s1 sa s2.
P o č e ta k
program Zamena;
uses WinCrt; s, s1 , s2
var
pozicija : integer; p o s ( s 1 ,s 2 ) = 0 N e
s, s1, s2 : string; D a
begin p o z ic ija = p o s (s 1 ,s )
write('Unesite tekst: '); d e le te ( s ,p o z ic ija ,le n g th ( s 1 ) )
readln(s); in s e rt( s 2 ,s ,p o z ic ija )
writeln('Zameniti string (s1): ');
readln(s1);
writeln('Sa stringom (s2): '); s
readln(s2);
while pos(s1,s)<>0 do K raj
begin
pozicija:=pos(s1,s);
delete(s,pozicija,length(s1));
insert(s2,s,pozicija)
end;
writeln(s)
end.

Primer 13.26a (Zbirka) Napisati program koji broji reci u zadatom stringu.
Rec je niz znakova izmedju praznina (razmaka).
P o č e ta k
program BrojReci;
uses WinCrt; s
var i, brojac, k : integer;
s : string; b ro ja c = 0
begin k=0
write('Unesite string: '); s= s+ ' '
readln(s); i= 1 , le n g th (s )
brojac:=0; D a
k:=0; s[i]= ' '
s:=s+' '; N e k=k+1
for i:=1 to length(s) do D a
k>0
if s[i]<>' '
N e
then k:=k+1 k=0 b ro ja c = b ro ja c + 1
else
begin
if k>0 then brojac:=brojac+1; b ro ja c
k:=0;
end; K raj
writeln('Broj reci u stringu je: ', brojac);
end.

45
SLOGOVI

Slogovi su skupovi podataka međusobno povezanih koji mogu biti različitog tipa. Svaki
element zapisa naziva se polje. Deklaracija slogova se sastoji u sledećem:
type
identifikator = RECORD
lista polja
END;
Npr. zapis o zaposlenima:
TYPE
Zaposleni = RECORD
Ime :STRING[25];
Adresa :STRING[40];
tel :STRING[12];
Plata :REAL;
END;
Pristup poljima podataka se vrši tako što se ime sloga i identifikator polja odvajaju tačkom. Na
primer:
Zaposleni.Ime := 'Pero Peric';
Zaposleni.Plata := 22500;
Ako treba da se odštampa npr. podatak o imenu:
WRITELN('Ime zaposlenog: ', Zaposleni.Ime);

WITH izraz
WITH izraz omogućava da se pristupi poljima sloga bez korišćenja promenljivih polja. Efekat
upotrebe with izraza je da se pripoji svako ime polja imenu sloga. Ako neka od promenljivih u
bloku nije identifikator polja, neće se promeniti sa with izrazom. Ako iza with ima samo jedan
izraz, nema potrebe da se koristi BEGIN-END blok. With se može koristiti pri pozivanju
procedure npr:
WITH ZaposleniRec DO
PrikaziRezultat(Ime, Plata);
Ovo je ekvivalentno sa:
PrikaziRezultat(ZaposleniRec.Ime, ZaposleniRec.Plata);
WITH izraz ima opšti oblik:
WITH identifikaktor-sloga DO izraz;

Primer 10.1 (Knjiga) Deklarisati slog osoba sa sledecim podacima: Ime, adresa, starost,
zanimanje(ponuditi sledeca zanimanja - student, inzenjer, menadzer, ekonomista).
Napisati program za citanje slogova kojim se opisuju dve osobe i ispisuju informacije o
starijoj osobi.

program Stariji;
uses WinCrt;
{Program cita podatke o dve osobe i ispisuje podatke o starijoj osobi}
type
licnost=record
ime:string;

46
adresa:string;
starost:integer; c ita n je S lo g a (o s o b a )
zanimanje:
(student,inzenjer,menadzer,ekonomista) o s o b a .im e ,
end; o s o b a .a d r e s a
var o s o b a .s ta ro s t
starija, osoba1,osoba2:licnost;
p ra v iln o = (s ta ro s t> = 0 )
procedure citanjeSloga(var osoba:licnost); & & ( s ta r o s t< = 1 2 0 )
{Procedura koja cita slog} D a
p ra v iln o
var
N e
simbol:char;
pravilno : boolean; G resk a
begin
with osoba do s im b o l
begin
write('Unesite ime i prezime osobe: '); s im b o l
readln(ime); S I M E
write('Unesite adresu osobe: '); z a n im a n je = s tu d e n t
readln(adresa);
repeat z a n im a n je = in z e n je r
write('Unesite starost osobe: ');
readln(starost); z a n im a n je = m e n a d z e r
pravilno:=(starost>=0) and (starost<=120);
if not pravilno then writeln('Greska u unosenju z a n im a n je = e k o n o m is ta
godina!');
until pravilno; K ra j
writeln('Unesite S, ako je osoba student');
writeln('Unesite I, ako je osoba inzenjer');
writeln('Unesite M, ako je osoba menadzer');
writeln('Unesite E, ako je osoba ekonomista');
readln(simbol);
case simbol of P o č e ta k
'S' : zanimanje:=student;
'I' : zanimanje:=inzenjer; c ita n je S lo g a (o so b a 1 )
'M' : zanimanje:=menadzer;
'E' : zanimanje:=ekonomista; c ita n je S lo g a (o s o b a 2 )
end; D a
writeln o s o b a 1 .s ta r o s t> o s o b a 2 .s ta r o s t
end N e
s ta rija = o s o b a 2 s ta rija = o s o b a 1
end;

begin s ta rija .im e ,


citanjeSloga(osoba1); s ta rija .a d re s a ,
citanjeSloga(osoba2); s ta rija .z a n im a n je
if osoba1.starost>osoba2.starost K raj
then starija:=osoba1

47
else starija:=osoba2;
with starija do
begin
writeln('Starija osoba je: ');
writeln(ime);
writeln(adresa);
case zanimanje of
student : writeln('Student');
inzenjer : writeln('Inzenjer');
menadzer : writeln('Menadzer');
ekonomista : writeln('Ekonomista');
end
end
end.

Primer 10.2 (Knjiga) Napisati program kojim se citaju slogovi koji sadrze prezime,
adresu i broj telefona, a zatim ih ispisuju u afabetskom poretku.

Zadatak se moze razbiti na tri modula:


1. Citanje slogova
2. Sortiranje slogova
3. Ispisivanje sortiranih slogova

Da bi program bio jednostavniji citanje, ispisivanje i sortiranje slogova pisemo u obliku


procedura.

program Imenik;
uses WinCrt;
{Program ispisuje alfabetski uredjen imenik}
const
maks=50; {Maksimalan broj imena u imeniku}

type
licnost=record
prezime:string;
adresa:string;
telefon:string; c ita n je S lo g a (te k u c is lo g )
end;
niz=array[1..maks] of licnost; te k u c is lo g .p r e z im e ,
var te k u c is lo g .a d r e s a ,
i, brojac : integer; te k u c is lo g .te le f o n
spisak : niz;
simbol : char; K raj

procedure citanjeSloga(var tekuciSlog:licnost);


{Procedura za ucitavanje sloga}

48
begin
with tekucislog do
begin
write('Unesite prezime osobe: ');
readln(prezime);
write('Unesite adresu osobe: ');
readln(adresa);
write('Unesite telefon: ');
readln(telefon);
end
end;

procedure ispisSloga(var tekuciSlog:licnost);


{Procedura za ispisivanje sloga na ekranu} is p is S lo g a (te k u c is lo g )
begin
writeln(''); te k u c is lo g .p r e z im e ,
with tekuciSlog do te k u c is lo g .a d r e s a ,
begin te k u c is lo g .te le f o n
writeln(prezime);
writeln(adresa); K raj
write('Tel. ', telefon);
end
end;

procedure sortiranje(n:integer; var spisak:niz); s o r tir a n je ( n ,s p is a k )


{Procedura sortira slogove po prezimenu}
var i= 1 , n -1
i, j : integer; j= i+ 1 , n
pomocni : licnost;
begin s p is a k [i] .p re z im e > s p is a k [ j].p r e z im e
N e
for i:=1 to n-1 do D a
for j:=i+1 to n do p o m o c n i= s p is a k [i]
if spisak[i].prezime>spisak[j].prezime s p is a k [i]= s p is a k [j]
then s p is a k [j]= p o m o c n i
begin
pomocni:=spisak[i]; K raj
spisak[i]:=spisak[j];
spisak[j]:=pomocni
end
end;

begin
brojac:=0;
repeat
brojac:=brojac+1;
citanjeSloga(spisak[brojac]);
writeln('Ima li jos slogova (D/N): ');

49
readln(simbol);
until (simbol<>'D') or (brojac>=maks); P o č e ta k
sortiranje(brojac, spisak);
b ro ja c = 0
for i:=1 to brojac do
begin b ro ja c = b ro ja c + 1
write('Pritisnite <ENTER> za ispis sledeceg
sloga'); c ita n je S lo g a (sp is a k [b ro ja c ])
read(simbol);
ispisSloga(spisak[i]) s im b o l
end; D a
( s i m b o l < > 'D ') o r ( b r o j a c > = m a k s )
writeln('Ispisani su svi slogovi.');
N e
end.
s o r tir a n je ( b r o ja c ,s p is a k )
i= 1 , n

is p is S lo g a (s p is a k [ i] )

K raj

50
DATOTEKE

FILE ili datoteka se definiše kao skup povezanih celina koji se nalaze na disku ili drugom
medijumu. Nad datotekom se mogu izavoditi sledeće operacije:
1. čitanje iz fajla
2. upisivanje u fajl.
Datoteke mogu biti tekstualne ili binarne. Tekstualne datoteke su skupovi struktura i svih
njegovih karaktera tipa char. Tekstualne datoteke se sastoje od linija karaktera razdvojenih sa
krajem linije (EOLN). Fajl na disku izgleda isto kao i tekst na ekranu koji se unosi preko
tastature.
Pristup tekstualnoj datoteci
Da bi pristupili tekstualnoj datoteci, moramo deklarisati promenljivu file sa tipom text. Npr.:
var
f:text;
Otvaranje datoteke
Da bi čitali podatke iz datoteke, moramo je prvo otvoriti sa standardnom procedurom reset:
reset(f);
Da bi povezali promenljivu f sa datotekom koja se nalazi na disku koristimo proceduru
assign. Ukoliko znamo ime datoteke navodimo u ovom proceduri:
assign(f,c: \config.sys);
reset(f);
Važno je naglasiti da kada se navodim ime fajla, ukoliko nije u istom direktorijumu u kome se
program izvršava, potrebno je navesti putanju datoteke.
Zatvaranje datoteke vrši se procedurom close, kada završimo sa otvaranjem i manipulacijom
sa podacima u datoteci.
close(f);
Opšta formula za pripremu tekstualne datoteke je sledeća:
Zaglavlje programa
PROGRAM Ime;
Deklaracija promenljivih
f :TEXT;
Povezivanje imena datoteke sa imenima promenljivih file
ASSIGN(f, ime-file);
Otvaranje datoteke
RESET(f);
Zatvaranje datoteke
CLOSE(f);
Čitanje podataka iz datoteke vrši se pomoću procedura read i readln.
READLN(f, lista podataka);
READ(f, lista podataka);
Funkcije za određivanje kraja linije i kraja datoteke su:
EOLN(f)
EOF(f)
Ispisivanje sadržaja tekstualne datoteke vrši se pomođu write, ali prethodno se podaci moraju
pročitati iz datoteke_
READLN(f,Ch);

51
WRITE(Ch);
Da bi se razdvojile linije u datoteci pri ispisu na ekranu nepohodno je koristiti naredbu writeln,
kada se utvrdi kraj jednog reda.
Kreiranje datoteke vrši se sa rewrite:
REWRITE(f);
Upisivanje u datoteku vrši se sa procedurom write ili writeln:
WRITELN(f, lista promenljivih);
or
WRITE(f, lista promenljivih);
Definisanje tipa datoteke:
type
identifikator=file of tip-podatka;
Tip podataka može biti integer, array (strukturni tip) ili slog.
Dodavanje podataka u datoteku
Za dodavanje podataka u datoteci koristi se sledeći oblik:
APPEND(promenljive u datoteci);
Sa append se pozicioniramo na kraj datoteke pa se novi podaci dodaju na kraju.
Brisanje sdadržaja datoteke se vrši uz pomć procedure ERASE, koja ima oblik:
ERASE(promenljive);

1. Napisati program koji upisuje niz celih brojeva u binarnu datoteku, a zatim ocitava
vrednosti iz te datoteke i ispisuje ih na ekran.

procedura Assign dodeljuje ime spoljasnje datoteke datotecnoj promenljivoj


(datotecnom pokazivacu). ( Dodeljuje ime spalja{njeg fajla promenljivoj
tipa fajl.)
procedura Reset otvara postojecu datoteku.
procedura Rewrite kreira i otvara novu datoteku.
procedura Close zatvara prethodno otvoreni fajl.

program upisivanjeBrojevaUDatoteku; P o č e ta k
uses WinCrt;
var f , 'c : \ i z l a z . d a t '
f: file of Integer; i= 1 , 6
i,j: Integer;
begin f, i
Assign(f,'c:\izlaz.dat');
Rewrite(f);
for i := 1 to 6 do D a
E o f(f)
Write(f,i); N e
Writeln('U fajlu su upisani brojevi:'); f, i
Reset(f);
while not Eof(f) do i
begin
Read(f,i);
Writeln(i); K raj
end;

52
Close(f);
end.

2. Napisati program koji upisuje niz celih brojeva u binarnu datoteku, a zatim ocitava
vrednosti iz te datoteke i ispisuje ih na ekran.

program citanjeBrojevaizDatoteke; P o č e ta k
uses WinCrt; im e d a t1
type f u la z ,im e d a t1
intdat = file of Integer; D a
E o f(fu la z )
var N e
fulaz : intdat; fu la z , x
x : integer;
imedat1 : string[30]; 2*x
begin
write('Upisati ime datoteke: ');
K raj
readln(imedat1);
assign(fulaz, imedat1);
reset(fulaz);
while not Eof(fulaz) do
begin
Read(fulaz,x);
{x:=x*2;}
Writeln(2*x);
end;
close(fulaz)
end.

3. Napisati program koji cita broj sa ekrana, mnozi ga sa dva i upisuje rezultat u
tekstualnu datoteku.
program upisBrojevaUDatoteku;
uses WinCrt; P o č e ta k
var
fizlaz : text; x ,im e d a t1
x : integer; f iz la z ,im e d a t1
imedat1 : string[30];
begin x=2*x
write('Upisati broj: ');
fiz la z , x
readln(x);
write('Upisati ime datoteke: '); K raj
readln(imedat1);
assign(fizlaz, imedat1);
reset(fizlaz);
rewrite(fizlaz);
x:=2*x;

53
write(fizlaz, x);
close(fizlaz)
end.

4. Napisati program koji kopira sadrzaj zadate datoteke u datoteku c:\nova.txt.

program kopidatoteke;
uses WinCrt;

var
ch:char;
x,y:text;
imedat1, imedat2:string[20];

begin P o č e ta k
write('Upisati ime datoteke (celu putanju): ');
readln(imedat1); im e d a t1
assign(x, imedat1);
assign(y, 'c:\nova.txt'); x ,im e d a t1
reset(x); y , 'c : \ n o v a . t x t '
rewrite(y);
while not eof(x) do N e
e o f(x )
begin D a
while not eoln(x) do N e
e o ln (x )
begin D a
read(x,ch); x, ch
write(y,ch);
if ch=' ' then y, ch
begin N e
ch=' '
while(ch=' ') and not eoln(x) do D a
read(x, ch); N e
( c h = ' ') a n d n o t e o l n ( x )
if not eoln(x) then write(y, ch) D a
end x, ch
end;
readln(x); N e
writeln(y) e o ln (x )
end; D a y, ch
close(x);
close(y); x , ln
writeln('Datoteka je iskopirana');
end. y , ln

K raj

54
Napisati program za unos podataka o automobilima. Na početku definisati broj
automobila n i podatke o vrsti, godini proizvodnje, ceni i registarskom broju smestititi u
datoteku auto.txt.

program UnosAuta; P o č e ta k
uses wincrt;
type f ,'a u t o . t x t'
auto = record
n
vrsta :string[18];
godproiz :integer; i= 1 , n
cena :integer;
registar :string[10]; a [ i] .v rs ta ,a [ i] .g o d p r o iz ,
end; a [ i].c e n a ,a [ i].re g is ta r
type
niz=array[1..20] of auto; f ,a [ i].v r s ta , f ,a [ i] .g o d p r o iz ,
var f ,a [ i] .c e n a , f ,a [ i] .r e g is ta r
a:niz;
f :text;
n,i:integer;
K raj
begin
assign(f, 'auto.txt');
rewrite(f);
writeln('Uneti broj automobila: ');
readln(n);
for i:=1 to n do
begin
write('Uneti vrstu automobila: '); readln(a[i].vrsta);
write('Godina proizvodnje: '); readln(a[i].godproiz);
write('Cena automobila: '); readln(a[i].cena);
write('Registarski broj: '); readln(a[i].registar);
{ Smestanje informacija u fajl }
writeln(f, a[i].vrsta);
writeln(f, a[i].godproiz);
writeln(f, a[i].cena);
writeln(f, a[i].registar);
end;
close(f)
end.

Napisati program za dodavanje n automobila u datoteku auto.txt.

program DodavanjeAuta;
uses wincrt;
type
auto = record
vrsta :string[18];
godproiz :integer;

55
cena :integer;
registar :string[10]; P o č e ta k
end;
type f , 'a u t o . t x t '
niz=array[1..20] of auto; n
var
a:niz; ap p en d (f)
f :text;
n,i:integer; i= 1 , n
ime:string;
begin a [ i] .v r s ta ,a [ i] .g o d p r o iz ,
a [ i].c e n a ,a [ i].re g is ta r
writeln('Koliko automobila dodajete u datoteku');
readln(n);
writeln('Uneti podatke'); f ,a [ i] .v r s ta , f ,a [ i] .g o d p r o iz ,
writeln; f ,a [ i] .c e n a , f ,a [ i] .r e g is ta r
assign(f, 'auto.txt');
append(f);
for i:=1 to n do K raj
begin
write('Uneti vrstu automobila: '); readln(a[i].vrsta); writeln(f,a[i].vrsta);
write('Uneti godinu proizvodnje: '); readln(a[i].godproiz); writeln(f,a[i].godproiz);
write('Uneti cenu: '); readln(a[i].cena); writeln(f,a[i].cena);
write('Uneti registarski broj: '); readln(a[i].registar); writeln(f,a[i].registar);
writeln;
end;
close(f);
end.

Iz formirane datoteke auto.txt procitati podatke o automobilima i izracunati ukupnu


vrednost svih automobila zadate vrste automobila. Ispisati na ekranu vrstu, godinu
proizvodnje i cenu automobila koji su proizvedeni posle zadate godine.

program Automobil;
uses wincrt;
type
auto = record
vrsta :string[18];
godproiz :integer;
cena :integer;
registar :string[10];
end;
type
niz=array[1..20] of auto;
var
a:niz;
f :text;
n,i,godina,zbir:integer;

56
ime:string;
begin
writeln('Uneti vrstu automobila ciju ukupnu vrednost trazite');
readln(ime);
writeln('Uneti godinu proizvodnje od koje ce se ispistati vrsta i cena automobila');
readln(godina);
assign(f, 'auto.txt'); P o č e ta k
reset(f);
zbir:=0; f ,'a u t o . t x t '
n:=1;
writeln; im e , g o d in a
writeln('Automobli proizvodeni
posle ',godina,' su: '); z b ir= 0 , n = 1
while not eof(f) do D a
e o f(f)
begin N e
readln(f,a[n].vrsta);
readln(f,a[n].godproiz); a [ n ] .v r s ta ,a [ n ] .g o d p ro iz ,
readln(f,a[n].cena); a [ n ] .c e n a ,a [ n ] .r e g i s t a r
readln(f,a[n].registar); D a
if a[n].vrsta=ime then a [ n ] .v r s ta = im e
zbir:=zbir+a[n].cena; N e z b ir= z b ir+ a [n ].c e n a
if a[n].godproiz>godina then
writeln(a[n].vrsta, ': D a
a [ n ] .g o d p r o iz > g o d in a
',a[n].godproiz, ' god. ', a[n].cena,' N e
din'); a [ n ] .v r s ta ,
n:=n+1; a [ n ] . g o d p ro iz , a [n ].c e n a
end;
writeln; n=n+1
writeln('Ukupna vrednost svih
automobila tipa ',ime, ' je ',zbir);
K raj
close(f)
end.

Iz formirane datoteke auto.txt sortirati podatke o automobilima prema ceni kostanja i


ispisati podatke na ekranu.

program SortiranjeAutomobila;
uses wincrt;
type
auto = record
vrsta :string[18];
godproiz :integer;
cena :integer;
registar :string[10];
end;
type
niz=array[1..20] of auto;

57
var
a:niz;
f:text;
n,i,j,pomc, pomg:integer;
pomv,pomr:string;
begin
assign(f, 'auto.txt');
reset(f); P o č e ta k
n:=1;
while not eof(f) do f ,'a u t o . t x t '
begin n=1
readln(f,a[n].vrsta);
readln(f,a[n].godproiz); D a
e o f(f)
readln(f,a[n].cena); N e
readln(f,a[n].registar);
a [ n ] .v r s ta ,a [ n ] .g o d p r o iz ,
n:=n+1;
a [ n ] .c e n a ,a [ n ] .r e g is ta r
end;
for i:=1 to n-1 do n=n+1
for j:=i+1 to n do
begin
if (a[i].cena)>(a[j].cena) then i= 1 , n -1
begin j= i+ 1 , n
pomc:=a[i].cena;
a [ i].c e n a > a [ j] .c e n a N e
a[i].cena:=a[j].cena;
a[j].cena:=pomc; D a
pomv:=a[i].vrsta; p o m c = a [i] .c e n a
a[i].vrsta:=a[j].vrsta; a [ i].c e n a = a [ j] .c e n a
a[j].vrsta:=pomv; a [ j].c e n a = p o m c
pomg:=a[i].godproiz; p o m v = a [ i] .v r s ta
a[i].godproiz:=a[j].godproiz; a [ i].v r s ta = a [ j] .v r s ta
a[j].godproiz:=pomg; a [j].v rs ta = p o m v
pomr:=a[i].registar; p o m g = a [ i] .g o d p r o iz
a[i].registar:=a[j].registar; a [ i] .g o d p r o iz = a [ j] .g o d p r o iz
a[j].registar:=pomr; a [j].g o d p r o iz = p o m g
end;
end; p o m r = a [ i].r e g is ta r
writeln(n); a [ i] .r e g is ta r = a [ j] .r e g is ta r
a [j].re g is ta r = p o m r
for i:=1 to n do
begin
writeln; i= 1 , n
write(a[i].vrsta,' ');
write(a[i].godproiz,' '); a [ i] .v r s ta , a [ i] .g o d p r o iz ,
write(a[i].cena,' '); a [ i] .c e n a , a [i] .r e g is ta r
write(a[i].registar,' ');
end;
close(f) K raj
end.

58

You might also like