139
APRIL 2001. 1. Napisati program koji raˇ cuna frekvenciju pojavljivanja malih slova u ulaznoj datoteci. Nakon toga, izdvojiti 16 malih slova koja se najˇ ceˇ ce pojavljuju u datoteci u odred¯enu string promjenljivu s. Na standardnom izlaznom ured¯aju prikazati pojedinaˇ cne karaktere string promjenljive s, njihove ASCII vrijednosti i njihove odgovaraju´ ce frekvencije pojavljivanja u ulaznoj datoteci. 2. (a) Napisati funckiju insertword, koja ima dva argumenta, s i p, tipa string, a vra´ ca string r koji izmed¯u dvije susjedne rijeˇ ci promjenljive s ubacuje string p. (b) Date su tekstualne datoteke ulaz1, (po dvije rijeˇ ci u svakom redu) i ulaz2 (po jedna rijeˇ cu svakom redu). Napisati program koji formira datoteku izlaz tako ˇ sto u svakom redu izmed¯u dvije susjedne rijeˇ ci datoteke ulaz1 ubacuje rijeˇ c iz datoteke ulaz2. Ako nestane rijeˇ ci iz datoteke ulaz2, krenuti opet sa poˇ cetka te datoteke. Rijeˇ c u ovom kontekstu je niz bilo kakvih karaktera osim blanka, tj. rijeˇ ci su razdvojene prazninama. 3. (a) Od rijeˇ ci koje se unose sa standardnog ulaza formirati ternarno drvo, na sljede´ ci naˇ cin: rijeˇ c se nalazi u lijevom poddrvetu ako je po leksikografskom poretku ispred rijeˇ ci koja se nalazi u tom ˇ cvoru, u desnom poddrvetu ako je iza, a u srednjem ako je jednaka. (b) Izraˇ cunati visinu drveta. (c) Napisati funckiju koja raˇ cuna broj pojavljivanja odred¯ene rijeˇ ci u drvetu. (d) Odrediti koja je rijeˇ c najve´ ci broj puta unesena sa ulaza. Rjeˇ senje 1. Elementi niza a su slogovi ˇ cije je jedno polje malo slovo, a drugo broj pojavljivanja tog slova u datoteci. Niz je formiran tako da je prvi element niza vezan za slovo a, drugi za slovo b itd, sve do poslednjeg (26.) koji je vezan za slovo z. Nakon ˇ citanja karaktera iz datoteke polje broj svakog elementa niza sadrˇ zi broj pojavljivanja odred¯enog malog slova. Potom se niz sortira i string s se formira od poslednjih 14 karaktera tog niza. program p1; type slog=record slovo:char; broj:integer; end; niz=array [1..26] of slog; var a:niz; s:string; i:integer; f:text; c:char; procedure sortiraj(var a:niz); var i,j:integer; x:slog; begin for i:=2 to 26 do for j:=26 downto i do if a[j-1].broj>a[j].broj then begin x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; end end; 1

zbirka1

Embed Size (px)

Citation preview

Page 1: zbirka1

APRIL 2001.

1. Napisati program koji racuna frekvenciju pojavljivanja malih slova u ulaznoj datoteci. Nakon toga,izdvojiti 16 malih slova koja se najcesce pojavljuju u datoteci u odredenu string promjenljivu s.Na standardnom izlaznom uredaju prikazati pojedinacne karaktere string promjenljive s, njihoveASCII vrijednosti i njihove odgovarajuce frekvencije pojavljivanja u ulaznoj datoteci.

2. (a) Napisati funckiju insertword, koja ima dva argumenta, s i p, tipa string, a vraca string r kojiizmedu dvije susjedne rijeci promjenljive s ubacuje string p.

(b) Date su tekstualne datoteke ulaz1, (po dvije rijeci u svakom redu) i ulaz2 (po jedna rijec usvakom redu). Napisati program koji formira datoteku izlaz tako sto u svakom redu izmedudvije susjedne rijeci datoteke ulaz1 ubacuje rijec iz datoteke ulaz2. Ako nestane rijeci izdatoteke ulaz2, krenuti opet sa pocetka te datoteke. Rijec u ovom kontekstu je niz bilo kakvihkaraktera osim blanka, tj. rijeci su razdvojene prazninama.

3. (a) Od rijeci koje se unose sa standardnog ulaza formirati ternarno drvo, na sljedeci nacin: rijecse nalazi u lijevom poddrvetu ako je po leksikografskom poretku ispred rijeci koja se nalazi utom cvoru, u desnom poddrvetu ako je iza, a u srednjem ako je jednaka.

(b) Izracunati visinu drveta.

(c) Napisati funckiju koja racuna broj pojavljivanja odredene rijeci u drvetu.

(d) Odrediti koja je rijec najveci broj puta unesena sa ulaza.

Rjesenje

1. Elementi niza a su slogovi cije je jedno polje malo slovo, a drugo broj pojavljivanja tog slova udatoteci. Niz je formiran tako da je prvi element niza vezan za slovo a, drugi za slovo b itd, svedo poslednjeg (26.) koji je vezan za slovo z. Nakon citanja karaktera iz datoteke polje broj svakogelementa niza sadrzi broj pojavljivanja odredenog malog slova. Potom se niz sortira i string s seformira od poslednjih 14 karaktera tog niza.

program p1;type slog=record

slovo:char;broj:integer;

end;niz=array [1..26] of slog;var

a:niz;s:string;i:integer;f:text;c:char;

procedure sortiraj(var a:niz);var

i,j:integer;x:slog;

beginfor i:=2 to 26 dofor j:=26 downto i do

if a[j-1].broj>a[j].broj thenbegin

x:=a[j-1];a[j-1]:=a[j];a[j]:=x;

endend;

1

Page 2: zbirka1

beginassign(f,’ulaz.txt’);reset(f);for i:=1 to 26 dobegin

a[i].slovo:=chr(i+ord(’a’)-1);a[i].broj:=0;

end;while not eof(f) dobegin

read(f,c);if c in [’a’..’z’] thenbegin

i:=ord(c)-ord(’a’)+1;a[i].broj:=a[i].broj+1;

end;end;sortiraj(a);s:=’’;for i:=26 downto 13 do

s:=s+a[i].slovo;for i:=1 to 14 do

writeln(s[i],’ ’,ord(s[i]),’ ’,a[26-i+1].broj);close(f);

end.

2. U funkciji insertword se pomjeramo po stringu s sve dok ne dodemo do razmaka. pomocnu prom-jenljivu pom sastavljamo od prvog dijela stringa s, (dio stringa s do razmaka), potom ubacujemostring p i na kraju ostatak stringa s. Rezultat funkcije je zavrsni string pom.

program p2;var

f,g,h:text;s,p:string;

function insertword(s,p:string):string;var

i:integer;pom:string;

begini:=1;while s[i]<>’ ’ do

i:=i+1;pom:=copy(s,1,i-1);pom:=pom+p;pom:=pom+copy(s,i+1,length(s));insertword:=pom;

end;begin

assign(f,’ulaz1.txt’);reset(f);assign(g,’ulaz2.txt’);reset(g);assign(h,’izlaz.txt’);rewrite(h);while not eof(f) dobegin

if eof(g) then reset(g);

2

Page 3: zbirka1

readln(f,s);readln(g,p);writeln(h,insertword(s,p));

end;close(f);close(g);close(h);

end.

3. Standardni sistem cuvanja podataka pomocu stabla se odnosi na binarno stablo i uobicajeno jeda se podaci u njemu cuvaju tako sto se postuje princip da se ”manji” podatak smjesta u lijevidio stabla, a ”veci” u desni. Ovdje je taj princip prosiren slucajem ako postoje isti podaci (isterijeci). Iste rijeci se uvezuju u stablo pomocu pokazivaca centar . Takode, prilikom dodavanja rijeciu stablo, (procedura dodavanje) vodi se racuna i o visini cvora koji se dodaje. Visina stabla jemaksimum visina svih cvorova. Uzeto je da korijen stabla ima visinu 1.Funkcija broj pojava, koja racuna broj pojavljivanja odredene rijeci u stablu, koristi pomocnufunkciju pronadji rijec koja vraca pokazivac na najvisi element stabla koji sadrzi datu rijec. Potomse u while petlji spustamo po pokazivacima na centar sve dok ima pojava iste rijeci.Za odredivanje rijeci koja je unesena najveci broj puta koristi se procedura najvise, zajedno saglobalnim promjenljivim najvise pojava i najvise rijec u kojima se cuvaju podaci o trenutnoj naj-pogodnijoj rijeci. Procedura najvise u sustini koristi funkciju broj pojava na sve razlicite rijeci ustablu.

program p3;type

pokazivac=^element;element=record

rijec:string;lijevo,desno,centar:pokazivac;

end;var

d:pokazivac;visina,vis_cvora,najvise_pojava:integer;r,s,najvise_rijec:string;

function formiranje(s:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=s;p^.lijevo:=nil;p^.desno:=nil;p^.centar:=nil;formiranje:=p;

end;procedure dodavanje(var d:pokazivac;p:pokazivac;var vis:integer);

beginvis:=vis+1;if d=nil then d:=pelse

if p^.rijec<d^.rijec thendodavanje(d^.lijevo,p,vis)

elseif p^.rijec>d^.rijec then

dodavanje(d^.desno,p,vis)else

3

Page 4: zbirka1

dodavanje(d^.centar,p,vis);end;function pronadji_rijec(d:pokazivac;s:string):pokazivac;begin

if d^.rijec=s then pronadji_rijec:=delseif s<d^.rijec then

pronadji_rijec:=pronadji_rijec(d^.lijevo,s)else

pronadji_rijec:=pronadji_rijec(d^.desno,s);end;

function broj_pojava(d:pokazivac;s:string):integer;var

p:pokazivac;br:integer;

beginbr:=1;p:=pronadji_rijec(d,s);while p^.centar<>nil dobegin

p:=p^.centar;br:=br+1;

end;broj_pojava:=br;

end;procedure ispis(d:pokazivac);begin

if d<>nil thenbegin

ispis(d^.lijevo);ispis(d^.centar);writeln(d^.rijec);ispis(d^.desno);

end;end;procedure najvise(d:pokazivac);var

pom:integer;begin

if d<>nil thenbegin

pom:=broj_pojava(d,d^.rijec);if pom>najvise_pojava thenbegin

najvise_pojava:=pom;najvise_rijec:=d^.rijec;

end;najvise(d^.lijevo);najvise(d^.desno);

end;end;procedure oslobadjanje(d:pokazivac);begin

if d<>nil thenbegin

oslobadjanje(d^.lijevo);

4

Page 5: zbirka1

oslobadjanje(d^.desno);oslobadjanje(d^.centar);dispose(d);

endend;begin {glavni program}

d:=nil;visina:=0;while not eof dobegin

readln(s);vis_cvora:=0;dodavanje(d,formiranje(s),vis_cvora);{nakon unosa rijeci u drvo ispisujemo visinu cvora}writeln(’visina cvora: ’,vis_cvora);if visina<vis_cvora then

visina:=vis_cvora;end;ispis(d);write(’Unesi rijec: ’);readln(r);writeln(’Broj pojavljivanja: ’,broj_pojava(d,r));writeln(’visina drveta: ’,visina);najvise_pojava:=0;najvise(d);writeln(’Najveci broj puta se javlja rijec: ’,najvise_rijec);writeln(’Javlja se ’,najvise_pojava,’ puta.’);oslobadjanje(d);

end.

SEPTEMBAR I 2001.

4. (a) Napisati funkciju koja za dati troslovni string x i dati string y, nalazi broj troslovnih podrijecistringa y koje se sastoje od slova iz stringa x, bez obzira na poredatk tih slova u podrijeci.

(b) Napisati program koji redove tekstualne datoteke ulaz sortira prema rezultatima primjenefunckije pod (a) na te redove. Troslovnu rijec po kojoj se sortira unosi korisnik programasa tastature. Sortirane redove upisati u nerasucem poretku u datoteku izlaz. Datoteka ulaznema vise od 100 redova.

5. Napisati program koji ucitava 4n realnih brojeva iz datoteke ulaz i ispituje da li vace jednakostia1 = a2n+1, ...an = a3n+1, ..., a2n = a4n. U programu koristiti liste.

6. (a) Napisati funkciju koja za tri tacke date koordinatama odreduje centar i poluprecnik kruga nakom se nalaze.

(b) Napisati program koji, koristeci funkciju pod (a) za unijeti prirodan broj n, n < 20 i unijetihn tacaka provjerava da li svih n tacaka pripadaju jednom krugu.

Rjesenje

4. Potrebno je prvo realizovati funkciju koja ispituje da li se dva stringa sastoje od istih slova. Jedanod nacina da se to ispita je da se oba stringa sortiraju i onda uporede. U funkciji broj podrijeci sena osnovu prvog argumenta prave troslovni stringovi i porede sa drugim argumentom. Za svakurijec iz datoteke ulaz rezervisan je jedan element niza slogova, gdje se u polje sloga broj cuva brojpojavljivanja troslovnog stringa u rijeci. Niz se nakon citanja rijeci iz datoteke i racunanja brojapojavljivanja troslovnog stringa sortira po kriterijumu broj.

5

Page 6: zbirka1

program p4;type slog=record

rijec:string;broj:integer;end;

niz=array [1..100] of slog;var

i,broj_rijeci:integer;a:niz;x:string[3];y:string;f,g:text;

function sortiraj_string(a:string):string;var

pom:string[3];begin

pom:=’’;if a[1]<a[2] then

if a[1]<a[3] thenif a[2]<a[3] then

pom:=a[1]+a[2]+a[3]else pom:=a[1]+a[3]+a[2]

else pom:=a[3]+a[1]+a[2]else if a[1]<a[3] then

pom:=a[2]+a[1]+a[3]else if a[2]<a[3] then

pom:=a[2]+a[3]+a[1]else pom:=a[3]+a[2]+a[1];

sortiraj_string:=pom;end;function ista_slova(a,b:string):boolean;begin

if sortiraj_string(a)=sortiraj_string(b) thenista_slova:=true

else ista_slova:=false;end;function broj_podrijeci(x:string;y:string):integer;var

i,broj,duzina:integer;pom:string[3];

beginbroj:=0;duzina:=length(y);for i:=1 to (duzina-2) dobegin

pom:=copy(y,i,3);if ista_slova(x,pom) then broj:=broj+1;

end;broj_podrijeci:=broj;

end;procedure sortiraj(var a:niz;n:integer);var

i,j:integer;x:slog;

beginfor i:=2 to n dofor j:=n downto i do

6

Page 7: zbirka1

if a[j-1].broj>a[j].broj thenbegin

x:=a[j-1];a[j-1]:=a[j];a[j]:=x;

endend;begin {glavni program}

write(’Unesite troslovnu rijec: ’);readln(x);assign(f,’ulaz.txt’);assign(g,’izlaz.txt’);reset(f);rewrite(g);i:=0;while not eof(f) dobegin

i:=i+1;readln(f,y);a[i].rijec:=y;a[i].broj:=broj_podrijeci(x,y);

end;broj_rijeci:=i;sortiraj(a,broj_rijeci);for i:=broj_rijeci downto 1 dowriteln(g,a[i].rijec);close(f);close(g);

end.

5. Prilikom formiranja liste ujedno se vodi racuna i o ukupnom broju elemenata. Elementi se dodajuna kraj liste, uvijek kao sledeci element na pokazivac zadnji koji pokazuje na trenutni poslednjielement. Nakon unosa, funkcija vrati2nplus1 pomjera pokazivac na prvi element liste 2n puta i kaorezultat vraca 2n + 1. element liste.

program p5;type

pokazivac=^element;element=record

broj:integer;sledeci:pokazivac;

end;var

lista,p,q:pokazivac;duzina,i:integer;vazi:boolean;

function formiranje_elementa(b:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=b;p^.sledeci:=nil;formiranje_elementa:=p;

end;procedure citanje(var l:pokazivac;var n:integer);var

7

Page 8: zbirka1

f:text;b:integer;zadnji:pokazivac;

beginassign(f,’ulaz.txt’);reset(f);duzina:=0;while not eof(f) dobegin

readln(f,b);duzina:=duzina+1;if l=nil thenbegin

l:=formiranje_elementa(b);zadnji:=l

endelsebegin

zadnji^.sledeci:=formiranje_elementa(b);zadnji:=zadnji^.sledeci;

endend;

close(f);end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

end;end;procedure ispis(l:pokazivac);var

p:pokazivac;begin

p:=l;while p<>nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;function vrati2nplus1(l:pokazivac;d:integer):pokazivac;{vraca 2n+1 element}var

p:pokazivac;i,m:integer;

beginp:=l;m:=(d div 2);for i:=1 to m do

p:=p^.sledeci;vrati2nplus1:=p;

end;

8

Page 9: zbirka1

begin {glavni program}citanje(lista,duzina);q:=lista;p:=vrati2nplus1(lista,duzina);vazi:=true;i:=1;while (i<= (duzina div 2)) and vazi dobegin

if (q^.broj<>p^.broj) thenvazi:=false;

q:=q^.sledeci;p:=p^.sledeci;i:=i+1;

end;if vazi then

writeln(’Vazi jednakost.’)else writeln(’Ne vazi jendakost.’);oslobadjanje(lista);

end.

6. Ako su date tacke A(x1, y1), B(x2, y2) i C(x3, y3), tada se tacka O(x, y) koja je centar opisanekruznice oko trougla ABC moze odrediti pomocu sledeceg sistema jednacina:

√(x1 − x)2 + (y1 − y)2 =

√(x2 − x)2 + (y2 − y)2

√(x2 − x)2 + (y2 − y)2 =

√(x3 − x)2 + (y3 − y)2

Sredivanjem sistema dobijamo linearan sistem po x i y:

x(2x2 − 2x1) + y(2y2 − 2y1) = x22 + y2

2 − x21 − y2

1

x(2x3 − 2x2) + y(2y3 − 2y2) = x23 + y2

3 − x22 − y2

2

U zadatku je ovaj sistem rijesen u proceduri centar. Slucaj kada je determinanta sistema jednakanuli nije razmatran. (U tom slucaju tri tacke pripadaju jednoj pravoj, sto odmah znaci da ne mogupripadati istoj kruznici.) U glavnom dijelu programa se na osnovu prve tri tacke odredi centar ipoluprecnik kruznice koja sadrzi te tri tacke. Potom se za svaku novu tacku racuna njeno rastojanjeod centra, na osnovu kog se lako odreduje da li ta tacka pripada kruznici. Prvi put kada se desi daunesena tacka ne pripada kruznici unos se prekida.

program p6;type

tacka=recordx,y:real;

end;

varniz:array [1..3] of tacka;a,o:tacka;i,n:integer;pom:boolean;

procedure centar(a,b,c:tacka;var o:tacka);var

d,dx,dy:real;t:tacka;

begind:=(2*b.x-2*a.x)*(2*c.y-2*b.y)-(2*b.y-2*a.y)*(2*c.x-2*b.x);dx:=(sqr(b.x)+sqr(b.y)-sqr(a.x)-sqr(a.y))*(2*c.y-2*b.y)-

(sqr(c.x)+sqr(c.y)-sqr(b.x)-sqr(b.y))*(2*b.y-2*a.y);

9

Page 10: zbirka1

dy:=(2*b.x-2*a.x)*(sqr(c.x)+sqr(c.y)-sqr(b.x)-sqr(b.y))-(2*c.x-2*b.x)*(sqr(b.x)+sqr(b.y)-sqr(a.x)-sqr(a.y));

o.x:=dx/d;o.y:=dy/d;

end;function rastojanje(a,b:tacka):real;begin

rastojanje:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));end;begin

writeln(’Koliko tacaka: ’);readln(n);pom:=true;i:=1;for i:=1 to 3 dobegin

write(i,’-ta tacka, prva koordinata: ’);readln(niz[i].x);write(i,’-ta tacka, druga koordinata: ’);readln(niz[i].y);

end;centar(niz[1],niz[2],niz[3],o);writeln(’Odredjen je centar kruga u tacki (’,o.x:2:3,’,’,o.y:2:3,’)’);writeln(’Poluprecnik kruga je: ’,rastojanje(niz[1],o):2:3);pom:=true;i:=i+1;while (i<=n) and pom dobegin

write(i,’-ta tacka, prva koordinata: ’);readln(a.x);write(i,’-ta tacka, druga koordinata: ’);readln(a.y);if rastojanje(a,o)<>rastojanje(niz[1],o) then pom:=false;i:=i+1;

end;if pom then writeln(’Sve tacke su na krugu.’)else

writeln(’Poslednja tacka ne pripada krugu.’);end.

SEPTEMBAR II 2001.

7. Date su dvije ulazne tekstualne datoteke ulaz1 i ulaz2. Napisati program koji u izlaznu datotekuizlaz upisuje rijeci iz dvije ulazne datoteke - prvo rijec iz ulaz1, pa rijec iz ulaz2, pa opet rijec izulaz1... sve dok se ne dode do kraja jedne od tih datoteka, nakon cega se preostale rijeci iz drugedatoteke prepisu u izlaz. Rijeci su nizovi karaktera razliciti od blanka, radvojeni jednim ili viseblanko simbola.

8. (a) Napisati funkciju koja za datu godinu provjerava da li se radi prestupnoj godini ili ne.

(b) Napisati program koji za datu godinu koja se unosi sa standardnog ulaznog uredaja racunakoliko je u njioj bilo neradnih dana (subota i nedelja), i taj podatak ispisuje na standardnomizlaznom uredaju. koristiti funkciju pod (a).

9. Napisati program koji rijeci koje se unose sa standardnog ulaza sortira prema broju suglasnika kojise u njima nalaze. Ukupan broj rijeci nije unaprijed poznat - koristiti liste.

Rjesenje

10

Page 11: zbirka1

7. Funkcija citaj rijec je univerzalna funkcija za citanje rijeci iz datoteke sistemom karakter po karakteri moze se primijeniti i u drugim zadacima gdje se zahtijeva citanje rijeci iz datoteke ovim sistemom.

program p7;var

f,g,h:text;rijec:string;

function citaj_rijec(var f:text):string;var

c:char;s:string;

begins:=’’;repeat

read(f,c);s:=s+c;

until (c=’ ’) or (eoln (f));if (c=’ ’) then s:=copy(s,1,length(s)-1);if eoln(f) then readln(f);citaj_rijec:=s;

end;begin {glavni program}

assign(f,’ulaz1.txt’);reset(f);assign(g,’ulaz2.txt’);reset(g);assign(h,’izlaz.txt’);rewrite(h);while not eof(f) and not eof(g) dobegin

rijec:=citaj_rijec(f);writeln(h,rijec);rijec:=citaj_rijec(g);writeln(h,rijec);

end;if eof(f) then{ako je kraj datoteke f tada se u izlaznu datotekuprepisuju rijeci iz datoteke g}

while not eof(g) dobegin

rijec:=citaj_rijec(g);writeln(h,rijec);

endelse {ako je kraj datoteke g...}

while not eof(f) dobegin

rijec:=citaj_rijec(f);writeln(h,rijec);

end;close(f);close(g);close(h);

end.

8. Godina je prestupna ako je djeljiva sa 4 ili ako je djeljiva sa 100 onda mora biti i djeljiva sa 400.Na osnovu toga koji je dan bio prvi januar, odredujemo koji datum je prva subota u godini. Nasvakih sedam dana do kraja godine (u zavisnosti da li je godina prestupna ima 366 ili 365 dana),

11

Page 12: zbirka1

imamo dva dana vikenda.

program p8;var

g,broj_dana,prva_subota,dan,neradni:integer;s:string;

function prestupna(g:integer):boolean;begin

if (g mod 4=0) and ((not (g mod 100=0)) or (g mod 400=0)) thenprestupna:=true else prestupna:=false;

end;begin

write(’Unesite godinu ’);readln(g) ;write(’Koji je dan 1. januar, (prva tri slova):’);readln(s);if (s=’sub’) then prva_subota:=1elsecase s[1] of

’p’: prva_subota:=6;’u’: prva_subota:=5;’s’: prva_subota:=4;’c’: prva_subota:=3;’p’: prva_subota:=2;’n’: prva_subota:=7;

end;if prestupna(g) then broj_dana:=366else broj_dana:=365;if s[1]=’n’ then neradni:=1else neradni:=0;dan:=prva_subota;while dan<=broj_dana dobegin

neradni:=neradni+2;dan:=dan+7;

end;if (dan-7)=broj_dana then neradni:=neradni-1;writeln(neradni);

end.

9. Zbog jednostavnosti, funkcija koja racuna broj suglasnika u obzir uzima samo mala slova. Elementise u jednostruko povezanu listu smjestaju umetanjem, na osnovu polja elementa liste broj. Lista jeu svakom trenutku sortirana.

program p9;type

pokazivac=^element;element=record

rijec:string;broj:integer;sledeci:pokazivac;

end;var

lista,p:pokazivac;s:string;

function broj_sugl(s:string):integer; {samo mala slova}var

12

Page 13: zbirka1

br,i:integer;begin

br:=0;for i:=1 to length(s) do

if s[i] in [’b’,’c’,’d’,’f’,’g’,’h’,’j’,’k’,’l’,’m’,’n’,’p’,’q’,’r’,’s’,’t’,’v’,’w’,’x’,’z’]

then br:=br+1;broj_sugl:=br;

end;function formiranje_elementa(s:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=s;p^.broj:=broj_sugl(s);p^.sledeci:=nil;formiranje_elementa:=p;

end;procedure ubaci(var l,p:pokazivac);begin

if l=nil then l:=pelse

if p^.broj<l^.broj thenbegin

p^.sledeci:=l;l:=p;

endelse ubaci (l^.sledeci,p);

end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

end;end;procedure ispis(l:pokazivac);var

p:pokazivac;begin

p:=l;while p<>nil dobegin

writeln(p^.rijec,’ ’,p^.broj);p:=p^.sledeci;

end;end;begin {glavni program}

lista:=nil;while not eof dobegin

readln(s);

13

Page 14: zbirka1

p:=formiranje_elementa(s);ubaci(lista,p);

end;ispis(lista);oslobadjanje(lista)

end.

JANUAR 2002.

10. Napisati program koji za ulazni argument tipa string, nalazi string sastavljen od k-tog, k + r-tog,k + 2r-tog,... karaktera u ulaznom stringu. Na primjer, za nisku ABCxDycEwFGH i vrijednostik = 1, r = 3 rezultujuca niska je AxcF.

11. Tekstulna datoteka ulaz sadrzi N (N < 500) cijelih brojeva koji predstavljaju koordinate (x pa y)N div 2 tacaka. Napisati program koji cita podatke iz datoteke ulaz i smjesta ih u niz tacaka, azatim sortira taj niz u neopadajucem poretku, na osnovu rastojanja tacke od koordinatnog pocetka.Sortirani niz prikazati u datoteci izlaz.

12. Napisati program koji rijeci unesene sa standardnog ulaza sortira prema broju samoglasnika, kojise u njima nalaze. Ukupan broj rijeci nije unaprijed poznat - koristiti liste.

Rjesenje:

10. program p10;var

s1,s2:string;k,r:integer;

beginwrite(’Unesi rijec: ’);readln(s1);write(’Unesi k i r: ’);readln(k,r);s2:=’’;while k<=length(s1) dobegin

s2:=s2+s1[k];k:=k+r;

end;writeln(’Rezultat je: ’,s2);

end.

11. Tacke se cuvaju u nizu slogova koji se sastoje od tri polja: x i y koordinata i rastojanja od tacke(0,0). Rastojanje je kriterijum za sortiranje niza.

program p11;type

slog=recordx,y:integer;rast:real;

end;niz=array [1..100] of slog;

varf,g:text;i,n:integer;a:niz;

function rastojanje(x,y:integer):real;begin

rastojanje:=sqrt(sqr(x)+sqr(y));

14

Page 15: zbirka1

end;procedure sortiraj(var a:niz;n:integer);var

i,j:integer;x:slog;

beginfor i:=2 to n do

for j:=n downto i doif a[j-1].rast>a[j].rast thenbegin

x:=a[j-1];a[j-1]:=a[j];a[j]:=x;

end;end;begin {glavni program}

assign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);i:=0;

while not eof(f) dobegin

i:=i+1;read(f,a[i].x);read(f,a[i].y);a[i].rast:=rastojanje(a[i].x,a[i].y);

end;n:=i;sortiraj(a,n);for i:=1 to n do

writeln(g,a[i].x,a[i].y:3);close(f);close(g);

end.

12. Zadatak je slican 9. zadatku.

program p12;typepokazivac=^element; element=record

rijec:string;broj:integer;sledeci:pokazivac;

end;var

lista,p:pokazivac;s:string;

function broj_samog(s:string):integer;var

br,i:integer;begin

br:=0;for i:=1 to length(s) do

if s[i] in [’A’,’E’,’I’,’O’,’U’,’Y’,’a’,’e’,’i’,’o’,’u’,’y’]then br:=br+1;

broj_samog:=br;

15

Page 16: zbirka1

end;function formiranje_elementa(s:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=s;p^.broj:=broj_samog(s);p^.sledeci:=nil;formiranje_elementa:=p;

end;procedure ubaci(var l,p:pokazivac);begin

if l=nil then l:=p elseif p^.broj<l^.broj thenbegin

p^.sledeci:=l;l:=p;

endelse ubaci (l^.sledeci,p);

end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

end;end;procedure ispis(l:pokazivac);var

p:pokazivac;begin

p:=l;while p<>nil dobegin

writeln(p^.rijec,’ ’,p^.broj);p:=p^.sledeci;

end;end;begin {glavni program}

lista:=nil;while not eof dobegin

readln(s);p:=formiranje_elementa(s);ubaci(lista,p);

end;ispis(lista);oslobadjanje(lista);

end.

FEBRUAR I 2002

16

Page 17: zbirka1

13. Napisati program koji za ulazni argument tipa string, nalazi string sastavljen od k-tog, k + r-tog,k + 2r-tog,... karaktera u ulaznom stringu. Ako u dobijenom stringu ima malih slova, pretvoriti ihu velika i tako dobijeni string ispisati na ekranu.

14. U ulaznoj datoteci numbers.txt se nalaze cijeli brojevi. Napisati program koji ucitava brojeve izdatoteke i za svaki broj ispituje da li je on stepen nekog broja manjeg od 20. U izlaznu datotekustepeni.txt ispisati takve brojeve, kao i bazu i eksponent.

15. Neka je dvostruko povezana lista definisana sa

typepokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;

Napisati program koji ucitava rijeci sa ulaza i smjesta ih u dvostruko povezanu listu, a potomizbacuje sve one rijeci iz liste koje imaju vese malih nego velikih slova. Ispisati tako dobijenu listuna ekranu.

Rjesenje

13. Zadatak je slican 10. zadatku, s tim sto sadrzi i funkciju koja prebacuje malo slovo u veliko.

program p13; vars1,s2:string;k,r:integer;

function malo_u_veliko(c:char):char;begin

if c in [’a’..’z’] thenc:=chr(ord(c)-ord(’a’)+ord(’A’));

malo_u_veliko:=c;end;begin

write(’Unesi rijec: ’);readln(s1);write(’Unesi k i r: ’);readln(k,r);s2:=’’;while k<=length(s1) dobegin

s2:=s2+malo_u_veliko(s1[k]);k:=k+r;

end;writeln(’Rezultat je: ’,s2);

end.

14. U proceduri stepen se ispituje da li je n oblika pk, gdje je 2 ≤ p < 20. Ako jeste, poslednji argument(j) dobija vrijednost true. Prilikom citanja brojeva iz datoteke, u while petlji se za sve kandidatei, 2 ≤ i < 20 poziva procedura stepen. (Formalni parametar p procedure stepen dobija vrijednostpromjenljive i.)

program p14;procedure stepen(n,p:integer;var k:integer;varj:boolean); begin

k:=0;while (n mod p = 0) do

17

Page 18: zbirka1

beginn:=n div p;k:=k+1;

end;j:=(n=1);

end;var

f,g:text;i,n,p,k:integer;jeste:boolean;

beginassign(f,’numbers.txt’);reset(f);assign(g,’stepeni.txt’);rewrite(g);while not eof(f) dobegin

readln(f,n);jeste:=false;i:=2;while (i<20) and (not jeste) dobegin

stepen(n,i,k,jeste);if jeste then writeln(g,n:4,i:2,k:3);i:=i+1;

end;end;close(f);close(g);

end.

15. Ovo je prvi od nekoliko zadataka u kojima se zahtijeva formiranje dvostruko povezane liste naosnovu podataka koji se citaju ili sa tastature ili iz datoteke, a nakon formiranja, izbacivanje iz listeonih elemenata koji zadovoljavaju odredeni uslov. (U ovom zadatku se iz liste izbacuju oni elementikoji sadrze vise malih nego velikih slova.) U vecini zadataka ovog tipa je napisana logicka funkcijakoja ispituje da li odredeni element treba izbaciti ili ne, (u ovom zadatku funkcija vise malih).Najvaznija procedura je procedura izbaci, koja za argument uzima pokazivac na element liste kojise eventualno izbacuje. Drugi argument (parametar q) je pomocni i on cuva podatak o prvomelementu liste koji nije izbacen. Izbacivanje elementa ne znaci samo prebacivanje pokazivaca, takoda slog ne bude dostupan u listi, vec i eksplicitno brisanje sloga iz memorije. Ostale funkcije iprocedure zajedno cine alat za formiranje i manipulisanje listom.U glavnom dijelu programa se nakon formiranja i ispisa tek formirane liste, u while petlji pozivaprocedura izbaci onoliko puta koliko ima elemenata u listi. Pokazivac l se u okviru procedurepomjera na sledeci element.

program p15;type

pokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

lista, q:pokazivac;s:string;

function formiranje(r:string):pokazivac;var

18

Page 19: zbirka1

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbeginp^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;endelse p:=t;

end;function vise_malih(s:string):boolean;var

i,brojac:integer;begin

brojac:=0;for i:=1 to length(s) dobegin

if s[i] in [’a’..’z’] then brojac:=brojac+1;if s[i] in [’A’..’Z’] then brojac:=brojac-1;end;

vise_malih:=(brojac>0);end;procedure izbaci(var l,q:pokazivac);var

p:pokazivac;begin

if l<>nil thenbeginif vise_malih(l^.rijec) then {pocinje izbacivanje}begin

if l^.prethodni=nil then {ako izbacujemo prvi}begin

p:=l;l:=l^.sledeci; {vazan red, l pomjeramo na sledeci}dispose(p);

endelse

if l^.sledeci<>nil then {ako nije zadnji}begin

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci; {vazan red, l pomjeramo na sledeci}dispose(p);

endelsebegin

p:=l; {ako izbacujemo zadnji}if l^.prethodni<>nil then

19

Page 20: zbirka1

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endend

elsebegin {u promjenljivoj q cuvamo pokazivac na

prvi element koji nije izbacen}if q=nil thenbegin

q:=l;q^.prethodni:=nil;{q je prvi element liste}

end;l:=l^.sledeci;

end;end;

end; {od izbaci}

procedure ispis(p:pokazivac);begin

while p<>nil do beginwriteln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin {glavni program}

lista:=nil;repeat

readln(s);q:=formiranje(s);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);q:=nil;while (lista<>nil) do {izbacivanje elemenata}

izbaci(lista,q);

20

Page 21: zbirka1

if q<>nil thenbegin

lista:=q;writeln(’Ispis liste nakon izbacivanja.’);ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelse writeln(’Ostala je prazna lista’);

end.

FEBRUAR II 2002.

16. Napisati program koji ispituje da li je matrica (unesena sa tastature) simetricna po kolonama.Matrica je simetricna po kolonama ukoliko su joj iste prva i posljednja kolona, druga i pretposlednja,itd. Ako matrica ima neparan broj kolona, srednja kolona se ne racuna.

17. (a) Napiati funkciju koja za dati troslovni string x i dati string y, nalazi broja javljanja stringaxu stringu y, brz obzira na velika i mala slova.

(b) Napisati program koji redove tekstualne datoteke ulaz sortira prema rezultatima funkcije pod(a). Troslovna rijec po kojoj se se sortira unosi se sa tastature. Sortirane redove u nerastucemporetku upisati u datoteku izlaz. Ulazna datoteka sadrzi najvise 20 redova.

18. Napisati program koji rijeci unesene sa tastature sortira prema broju pojavljivanja karaktera, kojise takode unosi sa tastature. ukupan broj rijeci nije unaprijed poznat, koristiti binarno stablo.

Rjesenje

16. Procedure za unos i ispis matrice su standardne i javljaju se u vecini zadataka sa matricama.Funkcija iste kolone ispituje da li su p-ta i q-ta kolone iste, dok se ispitivanje da li za sve odgovarajuceparove kolona vazi uslov vrsi u glavnom dijelu programa.

program p16;type

matrica=array[1..10,1..10] of integer;var

i,brv,brk:integer;a:matrica;iste:boolean;

procedure unos_matrice(var a:matrica;var m,n:integer);var

i,j:integer;begin

write(’Unesi broj vrsta: ’);readln(m);write(’Unesi broj kolona: ’);readln(n);for i:=1 to m do

for j:=1 to n dobegin

write(’a[’,i,’,’,j,’]=’);readln(a[i,j]);

end;end;function iste_kolone(a:matrica;p,q,m:integer):boolean;var

21

Page 22: zbirka1

i:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=m) and pom dobegin

if a[i,p]<>a[i,q] then pom:=false;i:=i+1;

end;iste_kolone:=pom;

end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:5);

writeln;end;

end;begin {glavni program}

iste:=true;unos_matrice(a,brv,brk);ispis_matrice(a,brv,brk);i:=1;while (i<=(brk div 2)) and iste dobegin

if (not iste_kolone(a,i,brk-i+1,brv)) then iste:=false;i:=i+1;

end;if iste then writeln(’Vazi uslov’) else writeln(’Uslov ne vazi.’);

end.

17. Elementi niza a su slogovi cije je jedno polje rijec, a drugo broj pojavljivanja troslovnog stringa utoj rijeci. Taj broj se odreduje pomocu funkcije broj javljanja, u kojoj se od svaka tri uzastopnakaraktera rijeci formira pomocni string, te se on poredi sa unesenim troslovnim stringom. Postose u zadatku zanemaruje razlika izmedu malih i velikih slova, poredenje se vrsi uz pomoc funkcijesva mala koja velika slova prebacuje u mala.

program p17; typeslog=record

rijec:string;broj:integer;

end;niz=array[1..20] of slog;

varf,g:text;x,s:string;a:niz;i,k:integer;

function sva_mala(x:string):string;var

i:integer;begin

22

Page 23: zbirka1

for i:=1 to length(x) doif x[i] in [’A’..’Z’] then x[i]:=chr(ord(x[i])-ord(’A’)+ord(’a’));sva_mala:=x;

end;function broj_javljanja(x,y:string):integer;var

i,duz,b:integer;pom:string;

beginb:=0;duz:=length(y);for i:=1 to duz-2 dobegin

pom:=copy(y,i,3);if sva_mala(x)=sva_mala(pom) then b:=b+1;

end;broj_javljanja:=b;

end;procedure bubblesort(var a:niz;duz:integer);var

i,j:integer;c:slog;

beginfor i:=2 to duz do

for j:=duz downto i doif a[j-1].broj>a[j].broj then

beginc:=a[j-1];a[j-1]:=a[j];a[j]:=c;

endend;

beginwrite(’Unesi troslovnu rijec: ’);repeat

readln(x);if length(s)<>3 then writeln(’Pogresan unos. Unesi ponovo:’);

until length(x)=3;assign(f,’ulaz.txt’);assign(g,’izlaz.txt’);reset(f);rewrite(g);i:=0;while not eof(f) dobegin

i:=i+1;readln(f,s);a[i].rijec:=s;a[i].broj:=broj_javljanja(x,s);

end;bubblesort(a,i);for k:=i downto 1 do

writeln(g,a[k].rijec);close(f);close(g);

end.

23

Page 24: zbirka1

18. Da bi se moglo vrsiti sortiranje po datom kriterijumu, prvo se mora unijeti karakter, pa tek ondarijeci. Funkcija broj javljanja odreduje kriterijum za sortiranje.

program p18;type

pokazivac=^element;element=record

rijec:string;broj:integer;lijevo,desno:pokazivac;

end;var

d:pokazivac;s:string;c:char;

function broj_javljanja(s:string;c:char):integer;var

brojac,i:integer;begin

brojac:=0;for i:=1 to length(s) do

if s[i]=c then brojac:=brojac+1;broj_javljanja:=brojac;

end;function formiranje(s:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=s;p^.broj:=broj_javljanja(s,c);p^.lijevo:=nil;p^.desno:=nil;formiranje:=p;

end;procedure dodavanje(var d:pokazivac;p:pokazivac);begin

if d=nil then d:=pelse

if p^.broj<=d^.broj thendodavanje(d^.lijevo,p)elsedodavanje(d^.desno,p);

end;procedure ispis(d:pokazivac);begin

if d<>nil thenbegin

ispis(d^.lijevo);writeln(d^.rijec);ispis(d^.desno);end;

end;procedure oslobadjanje(d:pokazivac);begin

if d<>nil thenbegin

24

Page 25: zbirka1

oslobadjanje(d^.lijevo);oslobadjanje(d^.desno);dispose(d);

endend;begin {glavni program}

d:=nil;write(’Unesi karakter: ’);readln(c);repeat

readln(s);dodavanje(d,formiranje(s));

until eof;ispis(d);oslobadjanje(d);

end.

JUNI 2002.

19. Data je matrica A formata mxn ciji su svi elementi 0 ili 1 i koja u svakoj vrsti ima bar jednu jedinicu.Neka ja k ukupan broj jedinica u matrica A. Napisati program koji ucitava m, n i matricu A i namjesta jedinica u matrici rasporeduje brojeve 1, 2, ..., k tako da zbirovi elementata u svakoj vrstidobijene matrice budu medusobno razliciti. Program treba da stampa tako dobijenu matricu.

20. Ucitava se sadrzaj tekstualne datoteke. U datoteci su rijeci date u svakom redu po jedna i nemavise od 100 redova. Napisati program koji izdvaja sve rijeci iz date datoteke koje prestavljajucetvorocifrene brojeve. Izdvojene rijeci (brojeve) sortirati i stampati u izlaznu datoteku.

21. Napisati program koji ucitava elemente ulazne datoteke brojevi i smjesta ih u dvostruko povezanulistu, a potom izbacuje sve one elemente koji predstavljaju kvadrate cijelih brojeva.

Rjesenje

19. Da bi zbirovi po vrstama bili razliciti, dovoljno je uraditi sledece: Vrste matrice se sortiraju pobroju jedinica. Neka je broj jedinica po vrstama l1, l2, ..., lm, gdje je 1 ≤ l1 ≤ l2 ≤ ... ≤ lm. Uvrsti koja ima l1 jedinica te jedinice zamijenimo brojevima 1, 2, ..., l1, u vrsti sa l2 jedinica jedinicezamijenimo brojevima l1 +1, l1 +2, ...l1 + l2, itd. Da bi se vrste matrice mogle sortirati, uvodi se nizb. Elementi niza b su slogovi cije je jedno polje redni broj vrste, a drugo broj jedinica u toj vrsti.Prilikom unosa elemenata matrice vodi se racuna o dvije stvari. Jedna je postovanje uslova da seunose samo nule i jedinice (za to sluzi repeat petlja), a druga je brojanje jedinica. Broj jedinica ui-toj vrsti se cuva u polju broj i-tog elemenata niza b. Popunjavanje matrice brojevima vrsi se uglavnom dijelu programa.

program p19;type

slog=recordvrsta:integer;broj:integer;end;

matrica=array[1..10,1..10] of integer;niz=array[1..10] of slog;

procedure unos_matrice(var a:matrica;var b:niz;var m,n:integer);var

i,j:integer;begin

write(’Unesi broj vrsta’);readln(m);

25

Page 26: zbirka1

write(’Unesi broj kolona’);readln(n);for i:=1 to m dobegin

b[i].vrsta:=i;b[i].broj:=0;for j:=1 to n dobegin

repeatwrite(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);if a[i,j]=1 then b[i].broj:=b[i].broj+1;if (a[i,j]<>0) then

if (a[i,j]<>1) then writeln(’Pogresan unos’);until (a[i,j]=0) or (a[i,j]=1);

end;end;

end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:3);writeln

end;end;{racunanje ukupnog broja jedinica u matrici}function ukupno(b:niz;m:integer):integer;var

i,br:integer;begin

br:=0;for i:=1 to m do

br:=br+b[i].broj;ukupno:=br;

end;procedure sortiraj(var b:niz;m:integer);var

i,j:integer;x:slog;

beginfor i:=2 to m do

for j:=m downto i doif b[j-1].broj>b[j].broj then

beginx:=b[j-1];b[j-1]:=b[j];b[j]:=x;

endend;var

a:matrica;b:niz;i,j,m,n,k:integer;

26

Page 27: zbirka1

beginunos_matrice(a,b,m,n);ispis_matrice(a,m,n);k:=ukupno(b,m);sortiraj(b,m);{slijedi kontrola da li je niz b korektno sortiran}for i:=1 to m do writeln(b[i].vrsta,’ ’,b[i].broj);writeln(k);for i:=m downto 1 do

for j:=1 to n dobegin

if a[b[i].vrsta,j]=1 thenbegin

a[b[i].vrsta,j]:=k;k:=k-1;

end;end;

ispis_matrice(a,m,n);end.

20. Da bi string predstavljao cetvorocifren broj moraju biti ispunjeni uslovi: string mora biti duzine 4i svi karakteri stringa moraju biti cifre, s tim sto prvi karakter ne smije biti ’0’. Sve to se realizujeu funkciji samo 4 cifre. Svaki string koji zadovoljava taj uslov se pretvara u broj pomocu funkcijevrijednost i kao takav smjesta u niz a.Potom se niz a sortira i upisuje u izlaznu datoteku.

program p20; typeniz=array[1..100] of integer;

function samo_4_cifre(s:string):boolean;var

i:integer;pom:boolean;

beginif length(s)<>4 then pom:=falseelse pom:=true;i:=1;if s[1]=’0’ then pom:=false;while (i<=length(s)) and pom dobegin

if not (s[i] in [’0’..’9’]) then pom:=false;i:=i+1;

end;samo_4_cifre:=pom;

end;function vrijednost(s:string):integer;var

i,b:integer;begin

b:=0;for i:=1 to length(s) do

b:=10*b+ord(s[i])-ord(’0’);vrijednost:=b;

end;procedure sortiraj(var a:niz;n:integer);var

i,j,b:integer;begin

for i:=2 to n do

27

Page 28: zbirka1

for j:=n downto i doif a[j-1]>a[j] thenbegin

b:=a[j-1];a[j-1]:=a[j];a[j]:=b;

end;end;var

s:string;a:niz;f,g:text;i,n:integer;

beginassign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);i:=0;while not eof (f) dobegin

readln(f,s);if samo_4_cifre(s) thenbegin

i:=i+1;a[i]:=vrijednost(s);

end;end;n:=i;sortiraj(a,n);for i:=1 to n do

writeln(g,a[i]);close(f);close(g);

end.

21. Zadatak je slican 15. zadatku. Jedina razlika je funkcija koja daje kriterijum za izbacivanje eleme-nata iz liste. U ovom zadatku je to fukcija stepen.

program p21; typepokazivac=^element;element=record

broj:integer;sledeci, prethodni:pokazivac;

end;var

lista, q:pokazivac;n:integer;

function formiranje(r:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

28

Page 29: zbirka1

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;function kvadrat(n:integer):boolean;var

r:real;begin

if n>=0 thenbegin

r:=sqrt(n);if r=trunc(r) then kvadrat:=trueelsekvadrat:=false

endelsekvadrat:=false;

end;procedure izbaci(var l,q:pokazivac);var

p:pokazivac;begin

if l<>nil thenbegin

if kvadrat(l^.broj) thenbegin

if l^.prethodni=nil thenbegin

p:=l;l:=l^.sledeci;dispose(p);

endelseif l^.sledeci<>nil thenbegin

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci;dispose(p);

endelsebegin

p:=l;if l^.prethodni<>nil then

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endend

29

Page 30: zbirka1

elsebegin

if q=nil thenbegin

q:=l;q^.prethodni:=nil;

end;l:=l^.sledeci;

end;end;

end; {od izbaci}

procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin {glavni program}

lista:=nil;repeat

readln(n);q:=formiranje(n);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);q:=nil;while (lista<>nil) dobegin

izbaci(lista,q);end;if q<>nil thenbegin

lista:=(q);writeln(’Ispis liste nakon izbacivanja.’);

30

Page 31: zbirka1

ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelse writeln(’Ostala je prazna lista’);

end.

SEPTEMBAR 2002.

22. Napisati realnu funkciju povrsina koja racuna povrsinu trougla cija su tjemena (x1, y1), (x2, y2) i(x3, y3). Napisati program koji ucitava prirodan broj n, n ≤ 100, a zatim koordinate n tacaka iispisuje koordinate tri tacke koje obrazuju trougao najvece povrsine.

23. Data je ulazna datoteka za nizom od najvise 100 trocifrenih brojeva. Ispisati u izlaznu datotekusve trojke brojeva koje cine enigmatski magicnikvadrat. Npr. brojevi 135, 304 i 541 cine magicnikvadrat.

24. Napisati program koji ucitava elemente ulazne datoteke rijeci i smjesta ih u dvostruko povezanulistu, a potom izbacuje sve one elemente iz liste koji su duzine vece od pet. Ispisati tako dobijenulistu na ekranu.

Rjesenje

22. Tacke se realizuju kao slogovi sa dva polja tipa real. Za svake tri tacke se racuna povrsina, a upromjenljivoj najveca cuva se podatak o trenutnoj najvecoj povrsini.

program p22;type

slog=recordx,y:real;

end;niz=array[1..100] of slog;

function povrsina(a,b,c:slog):real;begin

povrsina:=abs(0.5*(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y)));end;var

a:niz;i,j,k,n:integer;p,q,r:slog;najveca,povr:real;

beginwrite(’Koliko tacaka? ’);readln(n);for i:=1 to n dobegin

write(’Unesi x koordinatu ’,i,’.te tacke:’);readln(a[i].x);write(’Unesi y koordinatu ’,i,’.te tacke:’);readln(a[i].y);

end;najveca:=0;for i:=1 to n-2 do

for j:=i+1 to n-1 dofor k:=j+1 to n dobegin

31

Page 32: zbirka1

povr:=povrsina(a[i],a[j],a[k]);if povr>=najveca thenbegin

najveca:=povr;p:=a[i];q:=a[j];r:=a[k];

end;end;

writeln(’Najveca povrsina je ’,najveca:2:3);write(’Tacke su: (’,p.x:2:3,’,’,p.y:2:3);writeln(’) (’,q.x:2:3,’,’,q.y:2:3,’), (’,r.x:2:3,’,’,r.y:2:3,’)’);

end.

23. Funkcija vrati cifru je univerzalna funkcija koja na osnovu argumenata n i k vraca k-tu cifru brojan, gledajuci sdesna na lijevo (za k = 1 vraca cifru jedinica, k = 2 cifru desetica itd.). Za svakutrojku brojeva je potrebno ispitati tri jednakosti, koje zajedno daju kriterijum da li ti brojevi cineenigmatski magicni kvadrat. To ispitivanje se vrsi u funkciji magicni.

program p23;function vrati_cifru(n,k:integer):integer; var

i:integer;begin

for i:=1 to (k-1) don:=n div 10;

vrati_cifru:=n mod 10;end;function magicni(a,b,c:integer):boolean;begin

magicni:=(vrati_cifru(a,2)=vrati_cifru(b,3)) and(vrati_cifru(a,1)=vrati_cifru(c,3)) and(vrati_cifru(b,1)=vrati_cifru(c,2));

end;var

f,g:text;a:array[1..100] of integer;i,j,k,n:integer;

beginassign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);i:=0;while not eof(f) dobegin

i:=i+1;readln(f,a[i]);

end;n:=i;for i:=1 to n do

for j:=1 to n dofor k:=1 to n do

if (i<>j) and (i<>k) and (j<>k) thenif magicni(a[i],a[j],a[k]) then

writeln(g,a[i],’ ’,a[j],’ ’,a[k]);close(f);close(g);

32

Page 33: zbirka1

end.

24. program p24;type pokazivac=^element; element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

lista, q:pokazivac;s:string;

function formiranje(r:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;function duzi_od_pet(s:string):boolean;begin

duzi_od_pet:=(length(s)>5);end;procedure izbaci(var l,q:pokazivac);var

p:pokazivac;begin

if l<>nil thenbegin

if duzi_od_pet(l^.rijec) thenbegin

if l^.prethodni=nil thenbegin

p:=l;l:=l^.sledeci;dispose(p);

endelseif l^.sledeci<>nil thenbegin

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci;dispose(p);

end

33

Page 34: zbirka1

elsebegin

p:=l;if l^.prethodni<>nil then

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endendelsebegin

if q=nil thenbegin

q:=l;q^.prethodni:=nil;

end;l:=l^.sledeci;

end;end;

end; {od izbaci}procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin {glavni program}

lista:=nil;repeat

readln(s);q:=formiranje(s);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);q:=nil;

34

Page 35: zbirka1

while (lista<>nil) doizbaci(lista,q);

if q<>nil thenbegin

lista:=(q);writeln(’Ispis liste nakon izbacivanja.’);ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelse writeln(’Ostala je prazna lista’);

end.

JANUAR 2003

25. Ucitati cio broj n tjemena (x, y) konveksnog n-tougla. Napisati program koji racuna povrsinu togn-tougla.

26. Data je tekstualna datoteka brojevi koja se sastoji samo od cijelih brojeva. Napisati program kojina osnovu te datoteke formira izlaznu datoteku izlaz u kojoj su smjesteni samo oni brojevi koji sustepeni brojeva 2, 3 ili 5.

27. Napisati program koji ucitava rijeci sa ulaza i smjesta ih u dvostruko povezanu listu, a potom izliste izbacuje sve one rijeci koje imaju vise suglasnika nego samoglasnika. Ispisati tako dobijenulistu na ekranu.

Rjesenje

25. Povrsina mnogougla je zbir povrsina trouglova na koje je taj mnogougao podijeljen dijagonalamakoje su povucene iz nekog tjemena. Tjemena se cuvaju u nizu slogova cija su polja koordinatetjemena.

program p25;type

slog=recordx,y:real;end;

niz=array [1..20] of slog;var

a:niz;n,i:integer;povr:real;

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

i:integer;begin

writeln(’Koliko tacaka unosite? ’);readln(n);for i:=1 to n dobegin

write(’Unesite 1. koordinatu ’,i,’.te tacke: ’);readln (a[i].x);write(’Unesite 2. koordinatu ’,i,’.te tacke: ’);readln(a[i].y);

end;end;function povrsina_trougla(m,n,p:slog):real;

35

Page 36: zbirka1

beginpovrsina_trougla:=0.5*abs(m.x*(n.y-p.y)+n.x*(p.y-m.y)+p.x*(m.y-n.y));

end;begin

unos_niza(a,n);povr:=0.0;for i:=2 to n-1 do

povr:=povr+povrsina_trougla(a[1],a[i],a[i+1]);writeln(’Povrsina je ’,povr:2:4);

end.

26. program p26;var

n:integer;f,g:text;

function stepen2(n:integer):boolean;begin

while (n mod 2=0) and (n>1) don:=n div 2;

if n=1 then stepen2:=true else stepen2:=false;end;function stepen3(n:integer):boolean;begin

while (n mod 3=0) and (n>1) don:=n div 3;

if n=1 then stepen3:=true else stepen3:=false;end;function stepen5(n:integer):boolean;begin

while (n mod 5=0) and (n>1) don:=n div 5;

if n=1 then stepen5:=true else stepen5:=false;end;begin

assign(f,’brojevi.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);while not eof(f) dobegin

readln(f,n);if stepen2(n) or stepen3(n) or stepen5(n) then

writeln(g,n);end;close(f);close(g);

end.

27. program p27;type

pokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

lista,q:pokazivac;

36

Page 37: zbirka1

s:string;function formiranje(r:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;function vise(s:string):boolean;var

i,brojac:integer;sugl,samogl:set of char;

beginbrojac:=0;samogl:=[’A’,’E’,’I’,’O’,’U’,’Y’,’a’,’e’,’i’,’o’,’u’,’y’];sugl:=([’A’..’z’]-[’0’..’9’])-samogl;for i:=1 to length(s) do

if s[i] in sugl then brojac:=brojac+1else

if s[i] in samogl then brojac:=brojac-1;vise:=(brojac>0);

end;procedure izbaci(var l,q:pokazivac);var

p:pokazivac;begin

if l<>nil thenbegin

if vise(l^.rijec) thenbegin

if l^.prethodni=nil thenbegin

p:=l;l:=l^.sledeci;dispose(p);

endelse

if l^.sledeci<>nil thenbegin

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci;dispose(p);

37

Page 38: zbirka1

endelsebegin

p:=l;if l^.prethodni<>nil then

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endendelsebegin

if q=nil thenbegin

q:=l;q^.prethodni:=nil;

end;l:=l^.sledeci;

end;end;

end; {od izbaci}procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin {glavni program}

lista:=nil;repeat

readln(s);q:=formiranje(s);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);

38

Page 39: zbirka1

q:=nil;while (lista<>nil) do

izbaci(lista,q);if q<>nil thenbegin

lista:=(q);writeln(’Ispis liste nakon izbacivanja.’);ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelsewriteln(’Ostala je prazna lista’);

end.

APRIL 2003

28. Neprazne datoteke Ulazx i Ulazy sadrze realne brojeve, x1, x2, ..., xn (datoteka Ulazx), odnosnoy1, y2, ..., yn (datoteka Ulazy), pri cemu n nije unaprijed poznato. Napisati program koji racunavrijednost izraza x1 ∗ yn + x2 ∗ yn−1 + ... + xn ∗ y1. U zadatku koristiti liste.

29. (a) Napisati rekurzivnu funkciju najmanjif koja iz argument niske x, maksimalne duzine 10,izdvaja najmanju nisku od tri uzastopna karaktera (leksikografski poredak prema vrijednostiASCII koda karaktera u niski). Pri pisanju funkcije ne koristiti globalne promjenljive.

(b) Neka neprazna tekstualna datoteka Slogovi sadrzi ne vise od 150 slogova duzine 10. Napisatiprogram koji cita datoteku slogovi, izdvaja najmanju nisku od tri uzastopna karaktera izsvakog sloga, sortira metodom binarnog umetanja slogove u opadajuci poredak prema izdvo-jenim niskama i tako soritrane slogove upisuje u datoteku Slogovi1.

30. Napisati program koji ucitava elemente ulazne datoteke rijeci i smjesta ih u dvostruko povezanulistum a potom izbacuje sve one elemente iz liste koji pocinju sa dva samoglasnika. Ispisati takodobijenu listu na ekranu.

Rjesenje

28. Podaci iz datoteke ulazx se dodaju na kraj jednostruko povezae liste lista1, a podaci iz datotekeulazy se dodaju na pocetak liste lista2. Za dodavanje na kraj liste dovoljno je pamtiti pokazivac naprvi element liste (kod jednostruko povezane liste to je uvijek obavezno) i pokazivac na poslednjielement (u zadatku je to pokazivac zadnji). Novi element se uvezuje u listu tako da on bude sledecielement od elementa na koji pokazuje pokazivac zadnji. Funkcija pomnozi odreduje vrijednosttrazenog izraza.

program p28;type

pokazivac=^element;element=record

broj:real;sledeci:pokazivac;end;

varlista1,lista2,zadnji,p:pokazivac;f,g:text;x:real;

function formiranje(r:real):pokazivac;var

p:pokazivac;

39

Page 40: zbirka1

beginnew(p);p^.broj:=r;p^.sledeci:=nil;formiranje:=p;

end;procedure dodaj_na_pocetak(var l,p:pokazivac);begin

p^.sledeci:=l;l:=p;

end;procedure ispis_liste(l:pokazivac);var

p:pokazivac;begin

p:=l;while p<>nil dobegin

writeln(p^.broj:3:2);p:=p^.sledeci;

end;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

p:=l;while l<>nil dobegin

p:=l^.sledeci;l^.sledeci:=nil;dispose(l);l:=p;

end;end;function pomnozi(l1,l2:pokazivac):real;var

s:real;p,q:pokazivac;

begins:=0;p:=l1;q:=l2;while p<>nil dobegin

s:=s+(p^.broj*q^.broj);p:=p^.sledeci;q:=q^.sledeci;

end;pomnozi:=s;

end;begin

lista1:=nil;lista2:=nil;zadnji:=nil;assign(f,’ulazx.txt’);reset(f);

40

Page 41: zbirka1

assign (g,’ulazy.txt’);reset(g);while not eof(f) dobegin

readln(f,x);if zadnji=nil thenbegin

zadnji:=formiranje(x);lista1:=zadnji;

endelsebegin

zadnji^.sledeci:=formiranje(x);zadnji:=zadnji^.sledeci;

end;readln(g,x);p:=formiranje(x);dodaj_na_pocetak(lista2,p);

end;writeln(’lista1:’);ispis_liste(lista1);readln;writeln(’lista2:’);ispis_liste(lista2);readln;writeln(’Proizvod: ’,pomnozi(lista1,lista2):5:2);oslobadjanje(lista1);oslobadjanje(lista2);close(f);close(g);

end.

29. program p29;type

pokazivac=^element;element=record

rijec:string;tris:string;lijevo,desno:pokazivac;

end;var

d:pokazivac;s:string;f,g:text;

function najmanji(s:string):string;var

s1,s2:string;begin

if length(s)=3 then najmanji:=selsebegin

s1:=copy(s,1,3);s2:=najmanji(copy(s,2,length(s)-1));if s1<s2 then

najmanji:=s1 else najmanji:=s2;end;

end;

41

Page 42: zbirka1

function formiranje(s:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=s;p^.tris:=najmanji(s);p^.lijevo:=nil;p^.desno:=nil;formiranje:=p;

end;procedure dodavanje(var d:pokazivac;p:pokazivac);begin

if d=nil then d:=pelse

if p^.tris<=d^.tris thendodavanje(d^.lijevo,p)elsedodavanje(d^.desno,p);

end;procedure ispis(d:pokazivac;var g:text);begin

if d<>nil thenbegin

ispis(d^.lijevo,g);writeln(g,d^.rijec);ispis(d^.desno,g);

end;end;procedure oslobadjanje(d:pokazivac);begin

if d<>nil thenbegin

oslobadjanje(d^.lijevo);oslobadjanje(d^.desno);dispose(d);

endend;begin {glavni program}

assign(f,’slogovi.txt’);reset(f);assign(g,’slogovi1.txt’);rewrite(g);d:=nil;while not eof(f) dobegin

readln(f,s);dodavanje(d,formiranje(s));

end;ispis(d,g);close(f);close(g);oslobadjanje(d);

end.

30. Zadatak je slican prethodnim zadacima sa izbacivanjem elemenata iz formirane dvostruko povezaneliste. Funkcija dva sam odreduje uslov za izbacivanje elemenata.

42

Page 43: zbirka1

program p30;type

pokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

f:text;lista, q:pokazivac;s:string;

function formiranje(r:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;function dva_sam(s:string):boolean;var

pom:boolean;samogl:set of char;

beginpom:=false;samogl:=[’A’,’E’,’I’,’O’,’U’,’Y’,’a’,’e’,’i’,’o’,’u’,’y’];if s[1] in samogl then

if s[2] in samogl thenpom:=true;

dva_sam:=pom;end;procedure izbaci(var l,q:pokazivac);var

p:pokazivac;begin

if l<>nil thenbegin

if dva_sam(l^.rijec) thenbegin

if l^.prethodni=nil thenbegin

p:=l;l:=l^.sledeci;dispose(p);

end

43

Page 44: zbirka1

elseif l^.sledeci<>nil thenbegin

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci;dispose(p);

endelsebegin

p:=l;if l^.prethodni<>nil then

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endendelsebegin

if q=nil thenbegin

q:=l;q^.prethodni:=nil;

end;l:=l^.sledeci;

end;end;

end; {od izbaci}procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin

assign(f,’rijeci.txt’);reset(f);

44

Page 45: zbirka1

lista:=nil;while not eof(f) dobegin

readln(f,s);q:=formiranje(s);dodavanje_na_zadnji(lista,q);

end;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);q:=nil;while (lista<>nil) do

izbaci(lista,q);if q<>nil thenbegin

lista:=(q);writeln(’Ispis liste nakon izbacivanja.’);ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelse

writeln(’Ostala je prazna lista’);close(f);

end.

Juni I 2003.

31. Napisati program koji provjerava da li je matrica (unesena sa tastature) tridijagonalna.

32. (a) Napisati funkciju koja za dati string x vraca string od dva karaktera koji se sastoji od prvog izadnjeg karaktera stringa x.

(b) Napisati program koji od tekstualne datoteke ulaz formira datoteku izlaz ciji se redovi sastojeod prvog i zadnjeg karaktera odgovarajuceg reda ulazne datoteke.

33. Napisati program koji rijeci unesene sa tastature sortira prema broju pojavljivanja karaktera kojise takode unosi sa tastature. Ukupan broj rijeci nije unaprijed poznat. Koristiti binarno stablo.

Rjesenje

31. Matrica je tridijagonalna ako su svi elementi koji nisu na glavnoj dijagonali, na dijagonali iznadglavne i na dijagonali ispod glavne jednaki nuli, {izvor: www.wolphram.com}. Napomena: Ponekim definicijama tridijagonalne matrice zahtijeva se da su svi elementi na navedenim dijagonalamaobavezno i razliciti od nule. Takode, u nekim definicijama se zahtijeva da matrica bude kvadratna.Ispitivanje da li je matrica A tridijagonalna se svodi na ispitivanje da li su elementi A[i, j], zai 6= j, i 6= j − 1 i i 6= j + 1 jednaki nuli. To ispitivanje se vrsi u funkciji tridiagonal. Procedure zaunos i ispis matrice su standardne i koriste se u vecini zadataka sa matricama.

program p31;type

matrica=array[1..10,1..10] of real;var

m,n:integer;a:matrica;

procedure unos_matrice(var a:matrica;var m,n:integer);

45

Page 46: zbirka1

vari,j:integer;

beginwrite(’Unesi broj vrsta matrice: ’);readln(m);write(’Unesi broj kolona matrice: ’);readln(n);for i:=1 to m do

for j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:5:2);

writelnend;

end;function tridiagonal(a:matrica;m,n:integer):boolean;var

i,j:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=m) and pom dobegin

j:=1;while (j<=n) and pom dobegin

if (j<>i) and (j<>i+1) and (j<>i-1) thenif a[i,j]<>0 then pom:=false;

j:=j+1;end;i:=i+1;

end;tridiagonal:=pom;

end;begin

unos_matrice(a,m,n);ispis_matrice(a,m,n);if tridiagonal(a,m,n) then

writeln(’Matrica jeste tridijagonalna’) elsewriteln(’Matrica nije tridijagonalna’);

end.

32. program p32;type

string80=string[80];string2=string[2];

46

Page 47: zbirka1

varf,g:text;s:string80;x:string2;

beginassign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);while not eof (f) dobegin

x:=’’;readln(f,s);x:=s[1]+s[length(s)];writeln(g,x);

end;close(f);close(g);

end.

33. Isto kao 18. zadatak.

JUNI II 2003.

34. (a) Neka su cijeli brojevi x i y zapisani u binarnom brojnom sistemu. Napisati funkciju kojaracuna Hammingovo rastojanje H(x, y) izmedu brojeva x i y, tj. broj razlicitih binarnih cifarakoje se nalaze na istim pozicijama.

(b) Napisati program koji sa terminala ucitava parove cijelih brojeva x i y, ispisuje ih u binarnombrojnom sistemu i ispisuje vrijednost H(x, y), dok se ne unese znak za kraj, a nakon togaispisuje par kod kojega je ustanovljeno najvece Hammingovo rastojanje.

35. Napisati program koji od tekstualne datoteke ulaz pravi datoteku izlaz ciji se redovi sastoje odsvih velikih slova odgovarajuceg reda ulazne datoteke.

36. Napisati program koji od rijeci unesenih sa tastature formira dvostruko povezanu listu. Nakon togaiz liste treba izbaciti sve rijeci u kojima se javljaju vise od tri razlicita samoglasnika i dobijenu listuispisati na ekranu.

Rjesenje

34. Funkcija binarni prebacuje broj iz decimalnog u binarni zapis. U zadatku je najvaznija funkcijarastojanje koja za argument uzima dva broja zapisana u binarnom zapisu (zato su argumentifunkcije stringovi), a kao rezultat vraca Hammingovo rastojanje. Prvo se odredi koji je stringduzi, a koji kraci. U prvoj for petlji se krece sdesna nalijevo po kracem stringu i uporedujuse poslednji karakter sa poslednjim, pretposlednji sa pretposlednjim itd. Kada se potrosi manjistring, u drugoj for petlji se gleda koji su od preostalih karaktera duzeg stringa jednaki jedinici.Napomena: Hemingovo rastojanje se uobicajeno racuna za stringove, odnosno brojeve zapisane ubinarnom sistemu, koji su iste duzine.

program p34;var

najvece,x,y,z,najx,najy:integer;function binarni(n:integer):string;var

s:string;begin

s:=’’;

47

Page 48: zbirka1

while n>0 dobegin

s:=chr(ord(n mod 2)+ ord(’0’))+s;n:=n div 2;

end;binarni:=s;

end;function rastojanje(a,b:string):integer;var

manji,veci:string;i,brojac:integer;

beginbrojac:=0;if length(a)<length(b) thenbegin

manji:=a;veci:=b;

endelsebegin

manji:=b;veci:=a;

end;for i:=length(manji) downto 1 do

if manji[i]<>veci[length(veci)+i-length(manji)]then brojac:=brojac+1;

for i:=1 to length(veci)-length(manji) doif veci[i]=’1’ then

brojac:=brojac+1;rastojanje:=brojac;

end;begin {glavni program}

najvece:=0;repeat

writeln(’Unosite parove brojeva: x i y’);read(x);read(y);z:=rastojanje(binarni(x),binarni(y));if z>najvece thenbegin

najvece:=z;najx:=x;najy:=y;

end;writeln(’Binarni zapis x: ’,binarni(x):20);writeln(’Binarni zapis y: ’,binarni(y):20);writeln(’Rastojanje x i y: ’,z);

until eof;writeln(’Najvece rastojanje je izmedju brojeva: ’,najx,’ i ’,najy);

end.

35. Iz datoteke ulaz se cita karakter po karakter, a u izlaznu datoteku se upisuju samo velika slova.

program p35;var

f,g:text;c:char;

48

Page 49: zbirka1

beginassign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);while not eof(f) dobegin

read(f,c);if eoln(f) then writeln(g);if c in [’A’..’Z’] then write(g,c);

end;close(f);close(g);

end.

36. Za ovaj zadatak je specificna funkcija vise od tri. U while petlji se vrsi ispitivanje da li je i-tikarakter stinga samoglasnik ili ne. Ako jeste, pojava samoglasnika se evidentira pomocu brojaca, ataj samoglasnik se izbaci iz skupa samoglasnika (u zadatku se trazi da samoglasnici budu razliciti,zato se svaki samoglasnik moze racunati samo jednom).

program p36;type

pokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

lista,q:pokazivac;s:string;

function formiranje(r:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;function vise_od_tri(s:string):boolean;var

i,brojac:integer;samogl:set of char;

beginbrojac:=0;samogl:=[’A’,’E’,’I’,’O’,’U’,’Y’,’a’,’e’,’i’,’o’,’u’,’y’];

49

Page 50: zbirka1

i:=1;while (i<=length(s)) and (brojac<=3) dobegin

if s[i] in samogl thenbegin

brojac:=brojac+1;if s[i] in [’A’..’Z’] then {s[i] je veliki samoglasnik}

samogl:=samogl-([s[i]]+[chr(ord(s[i])-ord(’A’)+ord(’a’))])else {s[i] je mali samoglasnik}

samogl:=samogl-([s[i]]+[chr(ord(s[i])-ord(’a’)+ord(’A’))]);end;i:=i+1;

end;vise_od_tri:=(brojac>3);

end;procedure izbaci(var l,q:pokazivac);var

p:pokazivac;begin

if l<>nil thenbegin

if vise_od_tri(l^.rijec) thenbegin

if l^.prethodni=nil thenbegin

p:=l;l:=l^.sledeci;dispose(p);

endelseif l^.sledeci<>nil thenbegin

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci;dispose(p);

endelsebegin

p:=l;if l^.prethodni<>nil then

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endendelsebegin

if q=nil thenbegin

q:=l;q^.prethodni:=nil;

end;l:=l^.sledeci;

end;end;

50

Page 51: zbirka1

end; {od izbaci}procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin

lista:=nil;repeat

readln(s);q:=formiranje(s);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);q:=nil;while (lista<>nil) do

izbaci(lista,q);if q<>nil thenbegin

lista:=(q);writeln(’Ispis liste nakon izbacivanja.’);ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelse writeln(’Ostala je prazna lista’);

end.

SEPTEMBAR I 2003.37. Napisati program koji provjerava da li je matrica gornja bidijagonalna.

38. (a) Napisati funkciju koja za dati string x vraca string u kojem je karakter koji se najcesce javljazamijenjen karakterom ’2’. Smatrati da se string sastoji samo od malih slova.

51

Page 52: zbirka1

(b) Napisati program koji od tekstualne datoteke ulaz formira datoteku izlaz ciji se redovi sastojeod odgovarajucih redova ulazne datoteke u kojima je karakter koji se najcesce javlja u tomredu zamijenjen karakterom ’2’.

39. Napisati program koji od rijeci unesenih sa tastature formira dvostruko povezanu listu. Nakon togaiz liste treba izbaciti sve rijeci koje ne sadrze bar jedno veliko slovo i tako dobijenu listu ispisati naekranu.

Rjesenje

37. Matrica A je gornja bidijagonalna ako A[i, j] = 0 za i 6= j i i 6= j − 1.

program p37;type

matrica=array[1..10,1..10] of real;var

m,n:integer;a:matrica;

procedure unos_matrice(var a:matrica;var m,n:integer);var

i,j:integer;begin

write(’Unesi broj vrsta matrice: ’);readln(m);write(’Unesi broj kolona matrice: ’);readln(n);for i:=1 to m do

for j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:5:2);

writelnend;

end;function upper_bidiagonal(a:matrica;m,n:integer):boolean;var

i,j:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=m) and pom dobegin

j:=1;while (j<=n) and pom dobegin

if (j<>i) and (j<>i+1) then

52

Page 53: zbirka1

if a[i,j]<>0 then pom:=false;j:=j+1;

end;i:=i+1;

end;upper_bidiagonal:=pom;

end;begin

unos_matrice(a,m,n);ispis_matrice(a,m,n);if upper_bidiagonal(a,m,n) then

writeln(’Matrica jeste gornja bidijagonalna.’)else

writeln(’Matrica nije gornja bidijagonalna’);end.

38. U funkciji zamijeni se u nizu a evidentira pojava svakog malog slova u stringu tako sto se vrijednostelementa koji je indeksiran tim slovom uveca za jedan. U promjenljivoj karakter se cuva trenutnoslovo koje se najcesce javlja, a potom se, u poslednjoj for petlji funkcije, taj karakter stringamijenja karakterom ’2’.

program p38;type

niz=array[’a’..’z’] of integer;var

s:string;f,g:text;

function zamijeni(s:string):string;var

a:niz;c,karakter:char;i,najvise:integer;

beginfor c:=’a’ to ’z’ do

a[c]:=0;najvise:=0;for i:=1 to length(s) do

a[s[i]]:=a[s[i]]+1;for c:=’a’ to ’z’ do

if a[c]>najvise thenbegin

najvise:=a[c];karakter:=c;

end;for i:=1 to length(s) do

if s[i]=karakter then s[i]:=’2’;zamijeni:=s;

end;begin

assign (f,’ulaz.txt’);reset(f);assign (g,’izlaz.txt’);rewrite(g);while not eof (f) dobegin

readln(f,s);writeln(g,zamijeni(s));

53

Page 54: zbirka1

end;close(f);close(g);

end.

39. U funkciji nema velikih se evidentira prva pojava velikog slova, kada pomocna promjenljiva pomdobija vrijednost false. Ukoliko string nema velikih slova, promjenljiva pom, koja je u startu true,nece mijenjati vrijednost.

program p39;type

pokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

lista, q:pokazivac;s:string;

function formiranje(r:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;function nema_velikih(s:string):boolean;var

i:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=length(s)) and pom dobegin

if s[i] in [’A’..’Z’] then pom:=false;i:=i+1;

end;nema_velikih:=pom;

end;procedure izbaci(var l,q:pokazivac);var

p:pokazivac;begin

54

Page 55: zbirka1

if l<>nil thenbegin

if nema_velikih(l^.rijec) thenbegin

if l^.prethodni=nil thenbegin

p:=l;l:=l^.sledeci;dispose(p);

endelseif l^.sledeci<>nil thenbegin

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci;dispose(p);

endelsebegin

p:=l;if l^.prethodni<>nil then

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endendelsebegin

if q=nil thenbegin

q:=l;q^.prethodni:=nil;

end;l:=l^.sledeci;

end;end;

end; {od izbaci}procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

55

Page 56: zbirka1

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin

lista:=nil;repeat

readln(s);q:=formiranje(s);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);q:=nil;while (lista<>nil) do

izbaci(lista,q);if q<>nil thenbegin

lista:=(q);writeln(’Ispis liste nakon izbacivanja.’);ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelsewriteln(’Ostala je prazna lista’);

end.

OKTOBAR I 2003.

40. Napisati program koji provjerava da li je matrica unesena sa tastature donja tridijagonalna. Akojeste i ako je kvadratna, provjeriti da li je regularna.

41. Napisati program koji u tekstualnoj datoteci ulaz ispravlja sledece greske:

(a) vise blanko karaktera jedan do drugoga se pretvaraju u jedan;

(b) recenica mora poceti velikim slovom.

Korigovan tekst ispisati u datoteku izlaz.

42. Napisati program koji od brojeva koji se unose sa tastature pravi dvostruko povezanu listu. Nakontoga iz liste treba izbaciti sve brojeve djeljive sa 3 i tako dobijenu listu ispisati na ekranu.

Rjesenje

40. Matrica je donja tridijagonalna ako se svi elementi koji su razliciti od nule nalaze ili na glavnojdijagonali, ili na dijagonali ispod glavne (dijagonala ispod glavne se zove subdijagonala), ili nadijagonali ispod subdijagonale. Kvadratna donja tridijagonalna matrica je regularna ako su svielementi na dijagonali razliciti od nule.

program p40;type

56

Page 57: zbirka1

matrica=array[1..10,1..10] of real;var

m,n:integer;a:matrica;

procedure unos_matrice(var a:matrica;var m,n:integer);var

i,j:integer;begin

write(’Unesi broj vrsta matrice: ’);readln(m);write(’Unesi broj kolona matrice: ’);readln(n);for i:=1 to m do

for j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:5:2);

writelnend;

end;function donja_tridiagonal(a:matrica;m,n:integer):boolean;var

i,j:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=m) and pom dobegin

j:=1;while (j<=n) and pom dobegin

if (j<>i) and (j<>i-1) and (j<>i-2) thenif a[i,j]<>0 then pom:=false;

j:=j+1;end;i:=i+1;

end;donja_tridiagonal:=pom;

end;function regularna(a:matrica;m,n:integer):boolean;var

i:integer;pom:boolean;

begini:=1;pom:=true;

57

Page 58: zbirka1

while (i<=m) and pom dobegin

if a[i,i]=0 then pom:=false;i:=i+1;

end;regularna:=pom;

end;begin

unos_matrice(a,m,n);ispis_matrice(a,m,n);if donja_tridiagonal(a,m,n) thenbegin

writeln(’Matrica jeste donja tridijagonalna’);if m<>n then writeln(’Matrica nije kvadratna.’)else

if regularna(a,m,n) thenwriteln(’Matrica je kvadratna i jeste regularna.’)elsewriteln(’Matrica je kvadratna ali nije regularna.’);

endelse

writeln(’Matrica nije donja tridijagonalna’);end.

41. program p41;var

f,g:text;c1,c2,c3:char;

function veliko(c:char):char;begin

if c3=’.’ thenbegin

c3:=c;veliko:=chr(ord(c)-ord(’a’)+ord(’A’));

endelseveliko:=c;

end;

beginassign (f,’ulaz.txt’);reset(f);assign (g,’izlaz.txt’);rewrite(g);while not eof (f) dobegin

read(f,c1);if ((c1<>’ ’) or (c2<>’ ’)) and (c3<>’.’) then

write(g,veliko(c1))else

if (c3=’.’) and (c1 in [’a’..’z’]) thenbegin

write(g,veliko(c1));c3:=c1;

end;c2:=c1;if c2=’.’ then

58

Page 59: zbirka1

c3:=c2;if eoln(f) then writeln(g);

end;close(f);close(g);

end.

42. Zbog jednostavnosti uslova koji odreduje koji elementi iz liste se izbacuju, izostavljena je posebnafunkcija koja ispituje taj uslov, pa se on odreduje neposredno u proceduri izbaci.

program p42;type

pokazivac=^element;element=record

broj:integer;sledeci, prethodni:pokazivac;

end;var

lista, q:pokazivac;n:integer;

function formiranje(r:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;procedure izbaci(var l,q:pokazivac);var

p:pokazivac;begin

if l<>nil thenbegin

if (l^.broj mod 3 =0) thenbegin

if l^.prethodni=nil thenbegin

p:=l;l:=l^.sledeci;dispose(p);

endelse

if l^.sledeci<>nil thenbegin

59

Page 60: zbirka1

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci;dispose(p);

endelsebegin

p:=l;if l^.prethodni<>nil then

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endendelsebegin

if q=nil thenbegin

q:=l;q^.prethodni:=nil;

end;l:=l^.sledeci;

end;end;

end; {od izbaci}procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin

lista:=nil;repeat

readln(n);q:=formiranje(n);dodavanje_na_zadnji(lista,q);

60

Page 61: zbirka1

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);q:=nil;while (lista<>nil) do

izbaci(lista,q);if q<>nil thenbegin

lista:=(q);writeln(’Ispis liste nakon izbacivanja.’);ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelse

writeln(’Ostala je prazna lista’);end.

Oktobar II 2003.

43. Dvije matrice A i B su ”skoro iste” ukoliko vazi A[i, j] = B[i, j] vise od 0.7n2 puta. Napisatiprogram koji za dvije matrice A i B, koje se unose sa tastature ispituje da li vazi AB skoro jednakoBA.

44. Napisati program koji racuna frekvenciju pojavljivanja svih karaktera u ulaznoj datoteci. Nakontoga izdvojiti 10 karaktera koji se najcesce javljaju u string promjenljivu s. Na standardnom izlazuprikazati pojedinacne karaktere promjenljive s, njihove ASCII vrijednosti i njihove frekvencije.

45. Napisati program koji od brojeva koji se unose sa tastature pravi dvostruko povezanu listu. Nakontoga iz liste treba izbaciti sve brojeve djeljive sa 5 i tako dobijenu listu ispisati na ekranu.

Rjesenje

43. Procedure unos matrice, ispis matrice i mnozenje su standardne. Funkcija skoro iste poredi sveodgovarajuce elemente matrica, a potom ukupan broj jednakosti (promjenljiva brojac) poredi sa0.7n2.

program p43;type

matrica=array[1..10,1..10] of real;var

n:integer;a,b,c,d:matrica;

procedure unos_matrice(var a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dofor j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;

61

Page 62: zbirka1

procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]:5:2);

writelnend;

end;procedure mnozenje(a,b:matrica; var c:matrica;n:integer);var

i,j,k:integer;begin

for i:=1 to n dofor j:=1 to n dobegin

c[i,j]:=0.0;for k:=1 to n do

c[i,j]:=c[i,j]+a[i,k]*b[k,j];end;

end;function skoro_iste(a,b:matrica;n:integer):boolean;var

i,j,brojac:integer;begin

for i:=1 to n dofor j:=1 to n do

if a[i,j]=b[i,j] then brojac:=brojac+1;if brojac>0.7*sqr(n) then skoro_iste:=true

elseskoro_iste:=false;

end;begin

write(’Unesi dimenziju matrica: ’);readln(n);writeln(’Unos prve matrice.’);unos_matrice(a,n);writeln(’Unos druge matrice.’);unos_matrice(b,n);mnozenje(a,b,c,n);mnozenje(b,a,d,n);ispis_matrice(a,n);writeln;ispis_matrice(b,n);writeln;ispis_matrice(c,n);writeln;ispis_matrice(d,n);writeln;if skoro_iste(c,d,n) then writeln(’Vazi uslov.’)else

writeln(’Ne vazi uslov.’);end.

44. Zadatak je veoma slican zadatku broj 1. Jedina razlika je u tome sto se zahtijeva pronalazenje 10

62

Page 63: zbirka1

najfrekventnijih karaktera.

45. Zadatak je veoma slican zadatku broj 45. Jedina razlika je u tome sto se elementi u proceduriizbacuju ako su djeljivi sa 5.

JANUAR 2004.

46. Sa standardnog ulaza se unosi n, (n < 10) parova cijelih brojeva. Neka tih n parova cini skup S.Napisati program koji dopunjuje skup S do relacije ekvivalencije. Potom ispisati na standardnomizlazu sve parove koji cine relaciju ekvivalencije, tako sto se ispisuje klasa po klasa.

47. U datoteci se nalazi spisak od n, (n < 20) naziva datoteka. Datoteke su zapisane u obliku ime.ekstenzija.Sortirati datoteke provo po ekstenziji, a potom po abecednom poretku i kao takve upisati ih u izlaznudatoteku.

48. U datoteci se nalaze cijeli brojevi. Na osnovu tih brojeva formirati uredeno binarno stablo. Sastandardnog ulaza unosi se jos jedan broj. Ispisati sve brojece iz stabla koji su djelitelji datogbroja.

Rjesenje

46. Zbog lakse realizacije zadatka pretpostavka je da su svi brojevi koji se unose izmedu 1 i 20. (Trazise unos najvise 10 parova odakle slijedi da je moguce unijeti najvise 20 razlicitih brojeva.) Za svakibroj je obezbjeden slog u kome se pored vrijednosti broja cuva podatak i kojoj klasi broj pripada.Svi brojevi se cuvaju u nizu slogova, ali tako da i-ti element niza upravo sadrzi broj i. U startu svielementi niza pripadaju klasi 0.Globalna promjenljiva br klasa oznacava trenutni ukupan broj klasa. Promjenljiva slobodna nosipodatak o slobodnoj klasi. Slobodna klasa moze da se pojavi u slucaju spajanja dvije klase. Pro-cedura spoj klase za argument uzima niz brojeva i jos dva broja, koji predstavljaju dvije razliciteklase. U proceduri svi elementi niza koji pripadaju ”vecoj” klasi postaju elementi ”manje” klase.Promjenljiva slobodna tada dobija vrijednost ”vece” klase.Prilikom unosa jednog para (x, y) vodi se racuna o nekoliko stvari:

(a) x 6= y. Postoje cetiri mogucnosti.

i. I x i y su novi elementi, tj. pripadaju klasi 0. Tada se i x i y smjestaju u zasebnu klasu.Ako nema slobodne (slobodna = 0), tada se broj klasa uvecava za jedan i x i y se smjestajuu poslednju. Ako ima slobodne, x i y se smjestaju u tu slobodnu, a promjenljiva slobodnadobija vrijednost 0.

ii. x je novi, a y je vec bio. Tada se x ubacuje u istu klasu gdje je i y.iii. x je vec bio, a y je novi. Tada se y ubacuje u istu klasu gdje je i x.iv. I x i y su vec bili. Tada se ispituje da li su vec od ranije u istim klasama. Ako jesu, ne

radi se nista, a ako nisu, poziva se procedura spoj klase.

(b) x = y Ako je x novi formira se nova klasa, slicno kao u slucaju (i) pod (a). Ako x nije novi,ne radi se nista.

Nakon unosa, ukoliko je ostala slobodna klasa, onda se elementi koji pripadaju poslednjoj ”prebace”u tu slobodnu. Sada, u nizu a, svi brojevi koji se nisu javili prilikom unosa imaju klasu 0, a ostalisu rasporedeni u svoje klase. Zbog lakseg ispisa niz a se prvo sortira po klasama, a potom seispisuju redom uredeni parovi brojeva koji pripadaju istoj klasi. Brojevi koji imaju klasu 0 seuopste preskacu.

program p46;type

slog=recordbroj:integer;klasa:integer;

end;

63

Page 64: zbirka1

niz=array[1..20] of slog;var

a:niz;br_klasa,i,k,j,l,x,y,slobodna:integer;

procedure spoj_klase(var a:niz;m,n:integer);var

manji,veci,i:integer;begin

if m>n thenbegin

manji:=n;veci:=m

endelsebegin

manji:=m;veci:=n

end;for i:=1 to 20 do

if a[i].klasa=veci then a[i].klasa:=manji;slobodna:=veci; {ostaje slobodna klasa}

end;procedure sortiraj(var b:niz;n:integer);var

i,j:integer;x:slog;

beginfor i:=2 to n dofor j:=n downto i do

if b[j-1].klasa>b[j].klasa thenbegin

x:=b[j-1];b[j-1]:=b[j];b[j]:=x;

endend;begin {glavni}

br_klasa:=0;for i:=1 to 20 dobegin

a[i].broj:=i;a[i].klasa:=0;

end;i:=0;k:=1;repeat

i:=i+1;writeln(’unosi parove brojeva’);write(i,’-ti par, prvi broj: ’);readln(x);write(i,’-ti par, drugi broj: ’);readln(y);if x<>y thenbegin

if (a[x].klasa=0) and (a[y].klasa=0) thenbegin

if slobodna=0 then

64

Page 65: zbirka1

beginbr_klasa:=br_klasa+1;a[x].klasa:=br_klasa;a[y].klasa:=br_klasa;

endelsebegin

a[x].klasa:=slobodna;a[y].klasa:=slobodna;slobodna:=0;

endend;if (a[x].klasa=0) and (a[y].klasa>0) then

a[x].klasa:=a[y].klasa;if (a[x].klasa>0) and (a[y].klasa=0) then

a[y].klasa:=a[x].klasa;if (a[x].klasa>0) and (a[y].klasa>0)

and (a[x].klasa<>a[y].klasa) thenspoj_klase(a,a[x].klasa,a[y].klasa);

endelse {x=y}if a[x].klasa=0 then {x nije bio do sada}if slobodna=0 thenbegin

br_klasa:=br_klasa+1;a[x].klasa:=br_klasa;

endelsebegin

a[x].klasa:=slobodna;slobodna:=0;

end;write(’0 za kraj ili neki drugi broj za nastavak: ’);readln(k);

until (k=0) or (i=10);if slobodna>0 then {popunimo slobodnu klasu poslednjom}begin

for i:=1 to 20 doif a[i].klasa=br_klasa then a[i].klasa:=slobodna;

br_klasa:=br_klasa-1;end;sortiraj(a,20);for i:=1 to 20 do {ispis elemenata po klasama}

if a[i].klasa>0 then writeln(a[i].broj,a[i].klasa:5);i:=1;while a[i].klasa=0 do {prelazimo po neunesenim brojevima}

i:=i+1;while i<=20 dobegin

k:=i;while (a[k].klasa=a[k+1].klasa) and (k<20) do

k:=k+1;writeln(’Klasa:’);for j:=i to k do

for l:=i to k dowrite(’(’,a[j].broj,’,’,a[l].broj,’) ’);

writeln;

65

Page 66: zbirka1

i:=k+1end;

end.

47. Ideja je da se redovi datoteke ucitaju u niz slogova koji se sastoje od dva polja, imena i ekstenzijedatoteke. Potom se niz sortira po kriterijumu ekst, (sortiranje po ekstenziji). Nakon toga se u dvijewhile petlje odreduju indeksi i i k prvog i poslednjeg elementa niza koji imaju istu ekstenziju. Zasvaku ekstenziju se poziva procedure sortiraj2 koja sortira dijelove niza (elemente od indeksa i doindeksa k).

program p47;type

slog= recordime,ekst:string;

end;niz=array[1..20] of slog;

varf,g:text;c:char;a:niz;i,k,duzina:integer;

procedure sortiraj(var b:niz;n:integer);var

i,j:integer;x:slog;

beginfor i:=2 to n dofor j:=n downto i do

if b[j-1].ekst>b[j].ekst thenbegin

x:=b[j-1];b[j-1]:=b[j];b[j]:=x;

endend;procedure sortiraj2(var b:niz;m,n:integer);var

i,j:integer;x:slog;

beginfor i:=m+1 to n do

for j:=n downto i doif b[j-1].ime>b[j].ime thenbegin

x:=b[j-1];b[j-1]:=b[j];b[j]:=x;

endend;begin {glavni program}

assign(f,’ulaz.txt’);assign(g,’izlaz.txt’);reset(f);rewrite(g);i:=0;while not eof(f) dobegin

66

Page 67: zbirka1

i:=i+1;a[i].ime:=’’;while c<>’.’ dobegin

read(f,c);a[i].ime:=a[i].ime+c;

end;a[i].ekst:=’’;while not eoln(f) dobegin

read(f,c);a[i].ekst:=a[i].ekst+c;

end;readln(f);

end;duzina:=i;sortiraj(a,duzina);i:=1;while i<=duzina dobegin

k:=i;while a[k].ekst=a[k+1].ekst do

k:=k+1;sortiraj2(a,i,k);i:=k+1;

end;for k:=1 to duzina do

writeln(g,a[k].ime,a[k].ekst);close(f) ;close(g);

end.

48. Zadatak je standardan, jedina specificnost je sto se ne ispisuju svi elementi drveta, vec samo onikoji ispunjavaju dati uslov.

program p48;type

pokazivac=^element;element=record

broj:integer;lijevo,desno:pokazivac;

end;var

f:text;d:pokazivac;n:integer;

function formiranje(s:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=s;p^.lijevo:=nil;p^.desno:=nil;formiranje:=p;

end;procedure dodavanje(var d:pokazivac;p:pokazivac);

67

Page 68: zbirka1

beginif d=nil then d:=pelseif p^.broj<=d^.broj then

dodavanje(d^.lijevo,p) elsedodavanje(d^.desno,p);

end;procedure ispis(d:pokazivac);begin

if d<>nil thenbegin

ispis(d^.lijevo);if (d^.broj mod n)= 0 then writeln(d^.broj);ispis(d^.desno);

end;end;procedure oslobadjanje(d:pokazivac);begin

if d<>nil thenbegin

oslobadjanje(d^.lijevo);oslobadjanje(d^.desno);dispose(d);

endend;begin

assign(f,’ulaz.txt’);reset(f);d:=nil;while not eof(f) dobegin

readln(f,n);dodavanje(d,formiranje(n));

end;write(’Unesi broj’);readln(n);ispis(d);close(f);

end.

FEBRUAR 2004.

49. Napisati program koji ispituje da li je matrica formata nxn oblika

0 1 ... n− 2 n− 11 2 ... n− 1 0. . . . .. . . . .

n− 1 0 ... n− 3 n− 2

50. (a) Napisati funkciju koja za dati cio broj n racuna broj pozitivnih djelilaca broja n.

(b) Napisati program koji kreira datoteku brojevi koja sa sastoji od prvih sto cijelih brojeva, apotom u datoteku izlaz upisati te brojeve sortirane prema broju djelilaca.

(c) Koristeci funkciju iz zadatka pod (a), u datoteku prosti upisati sve proste brojeve manje od100.

68

Page 69: zbirka1

51. Sa standardnog ulaza unosi se paran broj cijelih brojeva i oni se cuvaju u jednostruko povezanoj listionim redom kako se unose. Ako je unesena lista [a1, a2, ..., an, an+1, ...a2n] ispisati listu u sledecemredoslijedu [an, an+1, an−1, an+2, ..., a1, a2n]

Rjesenje

49. Zadatak je jednostavan ako se uoci da je matrica datog oblika ako vazi a[i, j] = ((i+ j− 2) mod n).Funkcija oblik ispituje da li svi elementi matrice zadovoljavaju dati uslov.

program p49;type

matrica=array[1..10,1..10] of integer;var

n:integer;a:matrica;

procedure unos_matrice(var a:matrica;var n:integer);var

i,j:integer;begin

write(’Unesi dimenziju matrice: ’);readln(n);for i:=1 to n do

for j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]);

writelnend;

end;function oblik (a:matrica):boolean;var

i,j:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=n) and pom dobegin

j:=1;while (j<=n) and pom dobegin

if a[i,j]<>((i+j-2) mod n) then pom:=false;j:=j+1;

end;i:=i+1;

end;oblik:=pom;

69

Page 70: zbirka1

end;begin

unos_matrice(a,n);ispis_matrice(a,n);if oblik(a) then writeln(’Jeste’) else writeln(’Nije’);

end.

50. Brojevi se iz datoteke brojevi prvo ucitavaju u niz, ciji su elementi slogovi koji se sastoje od dvapolja. Jedno polje je sam broj, a drugo broj djelilaca tog broja. Za racunanje broja djelilaca koristise funkcija br djelilaca. U poslednjoj for petlji u zadatku se rade dvije stvari. Sortirani niz seupisuje u izlaznu datoteku, a svaki broj koji ima tacno dva djelioca i u datoteku prosti. Broj jeprost ako je djeljiv samo sa jedinicom i samim sobom (prost broj ima tacno dva djelioca).

program p50;type

slog=recordbroj:integer;djel:integer;

end;niz=array [1..100] of slog;

function br_djelilaca(n:integer):integer;var

i,brojac:integer;begin

brojac:=0;for i:=1 to n do

if (n mod i)=0 then brojac:=brojac+1;br_djelilaca:=brojac;

end;procedure sortiraj(var b:niz);var

i,j:integer;x:slog;

beginfor i:=2 to 100 do

for j:=100 downto i doif b[j-1].djel>b[j].djel thenbegin

x:=b[j-1];b[j-1]:=b[j];b[j]:=x;

endend;var

a:niz;f,g,h:text;i:integer;

beginassign(f,’brojevi.txt’);rewrite(f);assign(g,’izlaz.txt’);rewrite(g);assign(h,’prosti.txt’);rewrite(h);for i:=1 to 100 do

writeln(f,i);reset(f);

70

Page 71: zbirka1

for i:=1 to 100 dobegin

readln(f,a[i].broj);a[i].djel:=br_djelilaca(a[i].broj);

end;sortiraj(a);for i:=1 to 100 dobegin

writeln(g,a[i].broj,’ ’,a[i].djel);if a[i].djel=2 then writeln(h,a[i].broj);

end;close(f);close(g);close(h);

end.

51. Prilikom unosa pamti se pokazivac na poslednji element liste (promjenljiva zadnji) i svi elementi(osim prvog) se dodaju kao sledeci od zadnjeg. Time se postize dodavanje na kraj. Funkcijavrati element za argument uzima pokazivac na prvi element liste i cio broj i, a kao rezultat vracai-ti element liste. U poslednjoj for petlji u zadatku se u svakom koraku ispisuje po dva elementa.Promjenljiva i krece od polovine liste ka prvom elementu, a zavisnost promjenljive m od i je dataformulom m = pola + pola− i + 1.

program p51;type

pokazivac=^ element;element=record

broj:integer;sledeci:pokazivac;

end;var

c,lista,zadnji:pokazivac;i,b,pola,m,n:integer;

function formiranje(b:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=b;p^.sledeci:=nil;formiranje:=p;

end;procedure dodaj_na_kraj(var l:pokazivac;p:pokazivac);begin

l^.sledeci:=p;end;procedure oslobadjanje(l:pokazivac);var

p,q:pokazivac;begin

p:=l;while p<> nil dobegin

q:=p^.sledeci;dispose(p);p:=q;

end;

71

Page 72: zbirka1

end;function vrati_element(l:pokazivac;i:integer):pokazivac;var

k:integer;p:pokazivac;

beginp:=l;for k:=1 to (i-1) do

p:=p^.sledeci;vrati_element:=p;

end;begin {glavni program}

lista:=nil;readln(n); {ucitamo prvi element}lista:=formiranje(n);b:=1;zadnji:=lista;while not eof do {nastavak citanja}begin

readln(n);b:=b+1;dodaj_na_kraj(zadnji,formiranje(n));zadnji:=zadnji^.sledeci;

end;pola:=b div 2;m:=0;for i:=pola downto 1 dobegin

c:=vrati_element(lista,i);writeln(c^.broj);m:=pola+pola-i+1;c:=vrati_element(lista,m);writeln(c^.broj);

end;oslobadjanje(lista);

end.

APRIL 2004.

52. Data je matrica A formata mxn ciji su svi elementi 0 ili 1 i koja u svakoj vrsti ima bar jednu jedinicu.Neka ja k ukupan broj jedinica u matrica A. Napisati program koji ucitava m, n i matricu A i namjesta jedinica u matrici rasporeduje brojeve 1, 2, ..., k tako da zbirovi elementata u svakoj vrstidobijene matrice budu medusobno razliciti. Program treba da stampa tako dobijenu matricu.

53. Data je tekstualna datoteka cijelih brojeva, u svakom redu po jedan. Pronaci trojke brojeva a, b, , cza koje vazi a + b = c.

54. Formirati dvostruko povezanu listu na osnovu brojeva koji se unose sa tastature. Potom iz listeizbaciti sve dvocifrene brojeve. Obje liste ispisati na ekranu.

Rjesenje

52. Isti kao 19. zadatak.

53. Brojevi se prvo ucitaju u niz, a potom se pomocu tri for petlje uporedi svaka (uredena) trojkabrojeva.

72

Page 73: zbirka1

program p53;type

niz=array [1..50] of integer;var

f:text;a:niz;i,j,k,n:integer;

beginassign(f,’ulaz.txt’);reset(f);i:=1;while not eof(f) dobegin

readln(f,a[i]);i:=i+1;

end;n:=i-1;for i:=1 to n do

for j:=1 to n dofor k:=1 to n do

if a[i]+a[j]=a[k] then writeln(a[i]:3,a[j]:3,a[k]:3);close(f);

end.

54. Zadatak je slican prethodnim zadacima sa izbacivanjem elemenata iz dvostruko povezane liste.Funkcija koja odreduje uslov za izbacivanje se lako realizuje.

JUNI I

55. Ispitati da li za datu realnu kvadratnu matricu vazi da je zbir elemenata u i-toj vrsti jednak zbiruelemenata u i-toj koloni.

56. (a) Napisati funkciju koja ispituje da li je dati string sastavljen samo od cifara.

(b) Napisati funkciju koja za dati string koji se sastoji samo od cifara vraca brojevnu vrijednosttog stringa. Dozvoljeni su i stringovi koji pocinju minusom.

(c) U tekstualnoj datoteci se nalaze rijeci, pri cemu broj rijeci nije unaprijed poznat. Napisatiprogram koji cita sadrzaj datoteke i stampa vrijednosti

a1 + a2 + a3 + ...

a2 + a3 + a4 + ...

a3 + a4 + a5 + ...

gdje je broj ai vrijednost i-tog procitanog stringa iz datoteke koji se sastoji samo od cifara.Stringove koji se ne sastoje samo od cifara ignorisati.

57. Sa tastature se unose rijeci i smjestaju u dvostruko povezanu listu. Sortirati listu i ispisati je nastandardnom izlazu.

Rjesenje

55. U funkciji uslov se za svaku vrstu odnosno kolonu pozivaju funkcije suma vrste i suma kolone. Akose desi da sume neke vrste i odgovarajuce kolone nisu iste, funkcija uslov vraca vrijednost false.

program p55;type

matrica=array[1..10,1..10] of real;

73

Page 74: zbirka1

varn:integer;a:matrica;

procedure unos_matrice(var a:matrica;var n:integer);var

i,j:integer;begin

writeln(’Unesi dimenziju matrice: ’);readln(n);for i:=1 to n do

for j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]:5:2);

writelnend;

end;function suma_vrste(a:matrica;i:integer):real;var

j:integer;s:real;

begins:=0.0;for j:=1 to n do

s:=s+a[i,j];suma_vrste:=s;

end;function suma_kolone(a:matrica;j:integer):real;var

i:integer;s:real;

begins:=0.0;for i:=1 to n do

s:=s+a[i,j];suma_kolone:=s;

end;function uslov(a:matrica):boolean;var

i:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=n) and pom dobegin

if suma_vrste(a,i)<>suma_kolone(a,i) then

74

Page 75: zbirka1

pom:=false;i:=i+1;

end;if (not pom) then

writeln(’U ’,i-1,’. vrsti i ’,i-1,’. koloni nisu iste sume’);uslov:=pom;

end;begin

unos_matrice(a,n);ispis_matrice(a,n);if uslov(a) then writeln(’Matrica zadovoljava uslov’) else

writeln(’Matrica ne zadovoljava uslov’);end.

56. Funkcije cifre i vrijednost su trazene funkcije iz zadatka pod (a) i (b). Posto broj rijeci u datotecinije unaprijed poznat, za cuvanje podataka koristimo dinamicku strukturu. U prvoj while petlji uglavnom dijelu programa se prvo cita rijec iz datoteke, a ako se ona sastoji samo od cifara, u listuse na kraj dodaje broj koji je vrijednost te rijeci. Neka je nakon citanja rijeci formirana cjelobrojnalista [a1, a2, ..., an]. Suma Sn = a1 + a2 + ... + an se racuna pomocu funkcije zbir. Ostale sume sujednake Sn − a1, Sn − a1 − a2 itd. Posto nakon racunanja i-te sume element ai nije vise potreban,ujedno se vrsi i oslobadanje liste.

program p56;type

pokazivac=^ element;element=record

broj:integer;sledeci:pokazivac;

end;

function formiranje(b:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=b;p^.sledeci:=nil;formiranje:=p;

end;procedure ispis (l:pokazivac);var

p:pokazivac;begin

p:=l;while p<> nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;function cifre(s:string):boolean;var

i:integer;pom:boolean;

begini:=1;pom:=true;

75

Page 76: zbirka1

if s[1]=’-’ then i:=2;while (i<=length(s)) and pom dobegin

if not (s[i] in [’0’..’9’]) then pom:=false;i:=i+1;

end;cifre:=pom;

end;function vrijednost(s:string):integer;var

i,b,broj,min:integer;begin

broj:=0;if s[1]=’-’ then min:=2 else min:=1;for i:=min to length(s) dobegin

b:=ord(s[i])-ord(’0’);broj:=broj*10;broj:=broj+b;

end;if min=2 then broj:=-broj;vrijednost:=broj;

end;function zbir(l:pokazivac):integer;var

p:pokazivac;s:integer;

beginp:=l;s:=0;while p<>nil dobegin

s:=s+p^.broj;p:=p^.sledeci;

end;zbir:=s;

end;varf:text;lista,zadnji,p:pokazivac;s:string;br,suma:integer;begin {glavni program}

lista:=nil;zadnji:=nil;assign(f,’ulaz.txt’);reset(f);while not eof (f) dobegin

readln(f,s);if cifre(s) thenbegin

br:=vrijednost(s);p:=formiranje(br);if lista=nil thenbegin

lista:=p;

76

Page 77: zbirka1

zadnji:=lista;endelsebegin

zadnji^.sledeci:=p;zadnji:=zadnji^.sledeci;

end;end;

end;writeln(’Unesena je lista:’);ispis(lista);suma:=zbir(lista);writeln(’Ispis zbirova:’);while lista<>nil dobegin

writeln(suma);suma:=suma-lista^.broj;p:=lista;lista:=lista^.sledeci;dispose(p);

end;close(f);

end.

57. U zadatku se prvo formira dvostruko povezana lista tako sto se elementi dodaju na kraj. U procedurisortiraj lista se sortira po principu bubblesort-a, s tim sto se kod zamjene ne mijenjaju kompletnielementi liste, (kako je to uobicajeno kod sortiranja niza), vec samo rijeci.

program p57;type

pokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

lista, p,zadnji:pokazivac;s:string;

function formiranje(r:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

77

Page 78: zbirka1

end;procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;procedure sortiraj(var l,zadnji:pokazivac);var

s:string;z:pokazivac;i,j:integer;

beginz:=zadnji;lista:=lista^.sledeci;while lista<>nil dobegin

zadnji:=z;while zadnji<>lista^.prethodni dobegin

if zadnji^.prethodni^.rijec>zadnji^.rijec thenbegin

s:=zadnji^.prethodni^.rijec;zadnji^.prethodni^.rijec:=zadnji^.rijec;zadnji^.rijec:=s;

end;zadnji:=zadnji^.prethodni;

end;lista:=lista^.sledeci;

end;end;begin

lista:=nil;while not eof dobegin

readln(s);p:=formiranje(s);dodavanje_na_zadnji(lista,p);

78

Page 79: zbirka1

end;zadnji:=lista;lista:=pocetak(lista);ispis(lista);lista:=pocetak(lista);sortiraj(lista,zadnji);lista:=pocetak(zadnji);writeln(’Sortirana lista:’);ispis(lista);oslobadjanje(lista);

end.

JUNI II 2004.

58. Napisati program koji ispituje da li je matrica formata nxn datog oblika

a1 a1 a1 ... a1

a1 a2 ... a2 a1

a1 ... ... a1

... a2 ... a2 ...a1 a1 a1 ... a1

59. (a) Napisati funkciju koja za dati string pronalazi karakter koji se javlja najvise puta i kao rezultatvraca izmijenjen string u kome je taj karakter napisan u zagradi.Na primjer: f(matematika) = m(a)tem(a)tik(a)

(b) Na osnovu tekstualne datoteke ulaz formirati datoteku izlaz gdje se funkcija iz zadatka pod(a) primjenjuje na svaki red ulazne datoteke.

60. Sa standardnog ulaza se unosi paran broj cijelih brojeva i na osnovu njih se formira dvostrukopovezana lista. Ako je unesena lista [a1, a2, ..., a2n], formirati dvostruko povezanu listu koja imaelemente [an, an+1, an−1, an+2, ..., a1, a2n]. Ispisati tako dobijenu listu na ekranu.

Rjesenje

58. U zadatku je najvaznije odrediti koji elementi matrice (odnosno elementi sa kojim indeksima) trebada budu jednaki. U funkciji setnja se prvo posmatra element na dijagonali a[i, i]. Potom se u cetiriwhile petlje ispituje jednakost elemenata, prvo po i-toj vrsti, potom po n− i + 1-toj koloni, potompo n − i + 1-toj vrsti i na kraju po i-toj koloni. U funkciji uslov se n div 2 puta poziva funkcijasetnja.

program p58;type

matrica=array[1..10,1..10] of integer;var

n:integer;a:matrica;

procedure unos_matrice(var a:matrica;var n:integer);var

i,j:integer;begin

write(’Unesi dimenziju matrice: ’);readln(n);for i:=1 to n do

for j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

79

Page 80: zbirka1

end;end;procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]);

writelnend;

end;function setnja(a:matrica;i,n:integer):boolean;var

k,broj:integer;pom:boolean;

beginbroj:=a[i,i];pom:=true;k:=i;while (k<=n-i+1) and pom dobegin

if a[i,k]<>broj then pom:=false;k:=k+1;

end;k:=i;while (k<=n-i+1) and pom dobegin

if a[k,n-i+1]<>broj then pom:=false;k:=k+1;

end;k:=n-i+1;while (k>=i) and pom dobegin

if a[n-i+1,k]<>broj then pom:=false;k:=k-1;

end;k:=n-i+1;while (k>=i) and pom dobegin

if a[k,i]<>broj then pom:=false;k:=k-1;

end;setnja:=pom;

end;function uslov(a:matrica;n:integer):boolean;var

k:integer;pom:boolean;

beginpom:=true;k:=1;while (k<=(n div 2)) and pom dobegin

pom:=setnja(a,k,n);k:=k+1;

80

Page 81: zbirka1

end;uslov:=pom;

end;begin

unos_matrice(a,n);ispis_matrice(a,n);if uslov(a,n) then writeln(’Vazi uslov.’)else writeln(’Ne vazi uslov.’);

end.

59. U zadatku je najvaznija funkcija obrada gdje se rade dvije stvari, jedna je odredivanje karakterakoji se najcesce javlja u rijeci, a druga je ubacivanje tog karaktera u zagradu. Prvi dio je rijesentako sto se ispituje broj javljanja svakog karaktera u stringu, a pamti trenutni najcesci. Pomocupromjenljive skup tipa set of char vodimo evidenciju koji karakteri su vec obradeni (brojani), (uskupu se u i-tom koraku nalaze svi karakteri koji su se do tog koraka javili u stringu). U drugomdijelu funkcije se u for petlji na osnovu starog stringa formira novi u kome je karakter koji senajcesce javlja stavljen u zagradu.

program p59;var

s:string;f,g:text;

function obrada(s:string):string;var

i,j,naj,brojac:integer;najc:char;r:string;skup:set of char;

beginskup:=[];naj:=0;for i:=1 to length(s) do

if not (s[i] in skup) thenbegin

skup:=skup+[s[i]];brojac:=1;for j:=i+1 to length(s) do

if s[j]=s[i] then brojac:=brojac+1;if brojac>naj thenbegin

naj:=brojac;najc:=s[i];

end;end;r:=’’;for i:=1 to length(s) do

if s[i]=najc then r:=r+’(’+s[i]+’)’else r:=r+s[i];

obrada:=r;end;begin

assign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);while not eof(f) dobegin

81

Page 82: zbirka1

readln(f,s);writeln(g,obrada(s));

end;close(f);close(g);

end.

60. Tokom formiranja liste vodi se racuna o nekoliko stvari. U promjenljivoj n pamtimo broj elemenata.U promjenljivoj srednji pamtimo pokazivac na srednji element liste. Na svaka dva unesena ele-menta promjenljivu srednji pomjeramo jednom udesno (misli se na sledeci element liste). Elementise u listu dodaju na kraj. Nakon unosa se po listi setamo u dva smjera, pocevsi od sredine. Prom-jenljivom srednji pristupamo elementima lijevo od sredine, a promjenljivom desni desno. Tako seformira druga lista.

program p60;type

pokazivac=^element;element=record

broj:integer;sledeci, prethodni:pokazivac;

end;var

lista, lista2,desni,q,p,srednji:pokazivac;k,n:integer;pom:boolean;

function formiranje(r:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

82

Page 83: zbirka1

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin

lista:=nil;n:=0;while not eof dobegin

n:=n+1;readln(k);q:=formiranje(k);dodavanje_na_zadnji(lista,q);if n=1 then srednji:=qelseif n mod 2 = 1 then srednji:=srednji^.sledeci;

end;if (n mod 2) =1 then writeln(’Unesen je neparan broj elemenata’)elsebegin

lista:=pocetak(lista);ispis(lista);desni:=srednji^.sledeci;lista2:=nil;for k:=1 to (n div 2) dobegin

p:=formiranje(srednji^.broj);q:=formiranje(desni^.broj);dodavanje_na_zadnji(lista2,p);dodavanje_na_zadnji(lista2,q);srednji:=srednji^.prethodni;desni:=desni^.sledeci;

end;lista2:=pocetak(lista2);writeln(’Druga lista: ’);ispis(lista2);

end;lista2:=pocetak(lista2);lista:=pocetak(lista);oslobadjanje(lista);oslobadjanje(lista2);

end.

SEPTEMBAR I 2004.

61. Napisati program koji za uneseni datum odreduje dan u sedmici. Pocetna referenca je cetvrtak, 9.septembar 2004. godine.

83

Page 84: zbirka1

62. U datoteku su upisane cjelobrojne matrice na sledeci nacin: Jednu matricu cine uzastopni redovidatoteke koji imaju isti broj cijelih brojeva. Ispitati koliko ima matrica i ispisati ih na standardnomizlazu. U svakom redu nema vise od 6 brojeva i u datoteci nema vise od 30 redova.

63. Sa standardnog ulaza unose se cijeli brojevi i smjestaju u jednostruko povezanu listu redom kako seunose. Na osnovu te liste formiraju se dvije liste, od kojih prva sadrzi samo one elemente pocetneliste koji su djeljivi sa 3, a druga one elemente koji su veci od 10. Ispisati nove liste i odreditinjihove zajednicke elemente.

Rjesenje

61. Godina je prestupna ako je djeljiva sa 4 i ako je djeljiva sa 100 onda nije djeljiva sa 400. Funkcijadana u godini vraca vrijednost 365 ako godina nije prestupna, a 366 ako jeste. Na osnovu godinei mjeseca, funkcija dana u mjesecu odreduje broj dana u datom mjesecu (u zavisnosti od godine,jedini problem je mjesec februar). U zadatku je najvaznija funkcija broj dana koja na osnovu dana,mjeseca i godine odreduje koliko dana je proslo od 9. septembra 2004. Tu postoji nekoliko varijanti.Prvo se racuna za koliko se punih godina razlikuju datumi (prva while petlja). Dalje postoje dvijemogucnosti. Jedna je da je zadati datum u intervalu od 9. septembra do 31. decembra, a drugi od1. januara do 8. septembra. U drugom slucaju se prvo izracuna koliko dana je preostalo u 2004.godini i na to se jos doda broj dana iz 2005, do zadatog datuma. Na osnovu ukupnog broja danase pomocu funkcije ispis dana odredi koji je dan u sedmici trazeni datum.

program p61;function prestupna(n:integer):boolean;begin

if (n mod 4=0) and ((n mod 100<>0) or (n mod 400 =0))then prestupna:=true else prestupna:=false;

end;function dana_u_godini(n:integer):integer;begin

if prestupna(n) thendana_u_godini:=366 else dana_u_godini:=365;

end;function dana_u_mjesecu(m,g:integer):integer;begin

case m of1:dana_u_mjesecu:=31;2: if prestupna(g) then dana_u_mjesecu:=29 else dana_u_mjesecu:=28;3: dana_u_mjesecu:=31;4: dana_u_mjesecu:=30;5: dana_u_mjesecu:=31;6: dana_u_mjesecu:=30;7: dana_u_mjesecu:=31;8: dana_u_mjesecu:=31;9: dana_u_mjesecu:=30;10: dana_u_mjesecu:=31;11: dana_u_mjesecu:=30;12: dana_u_mjesecu:=31;

end;end;function ispis_dana(n:integer):string;begin

n:= ((n mod 7) +4) mod 7;case n of

1: ispis_dana:=’ponedjeljak’;2:ispis_dana:=’utorak’;3:ispis_dana:=’srijeda’;

84

Page 85: zbirka1

4:ispis_dana:=’cetvrtak’;5:ispis_dana:=’petak’;6:ispis_dana:=’subota’;0: ispis_dana:=’nedjelja’;

end;end;function broj_dana(d,m,g:integer):integer;var

dana,i:integer;begin

dana:=0;{prvo brojimo godine}while (g>2005) or ((g=2005) and ((m>9) or ((m=9) and (d>=9)))) dobegin

dana:=dana+dana_u_godini(g);g:=g-1;

end;if g=2004 then {g se spustilo na 2004}begin

while (m>10) or ((m=10) and (d>=9)) dobegin

dana:=dana+dana_u_mjesecu(m-1,g);m:=m-1;

end;if m=9 then dana:=dana+d-9 else dana:=dana+d+21

endelsebegin {g se spustilo na 2005}

for i:=10 to 12 dodana:=dana+dana_u_mjesecu(i,g);

dana:=dana+21; {dani iz 2004}for i:=1 to m-1 do

dana:=dana+dana_u_mjesecu(i,g);dana:=dana+d; {dani iz 2005}

end;broj_dana:=dana;

end;var

d,m,g:integer;begin

repeatwriteln(’Unesi dan, mjesec i godinu:’);readln(d,m,g);writeln(broj_dana(d,m,g));writeln(ispis_dana(broj_dana(d,m,g)));readln;

until eof;end.

62. U glavnom dijelu programa se citanje brojeva odvija u okviru standardne while petlje. Citanjejednog reda datoteke se odvija u repeat petlji, a procitani brojevi se cuvaju u jednodimenzionalnomnizu b. Nakon procitanog reda (a to je vrsta neke matrice), vrsi se ispitivanje da li je rijec o nastavkustare matrice, ili o pocetku nove. (To zavisi od broja ucitanih elemenata u niz b.) Ako je rijec odnastavku stare matrice, matrica dobija novu, (i+1. vrstu), a program nastavlja sa radom citanjemnovog reda datoteke. Ako je rijec o pocetku nove matrice, stara matrica se ispisuje na ekranu,(poziva se procedura za ispis), ukupan broj (n) matrica se uvecava za jedan, a prva vrsta novematrice dobija vrijednosti iz niza b.

85

Page 86: zbirka1

program p62;type

matrica=array [1..30,1..6] of integer;niz=array [1..6] of integer;

varf:text;a:matrica;b:niz;dim2,n,i,j,k:integer;

procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

writeln(’Ispis nove matrice: ’);for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:4);

writeln;end;

end;begin

assign(f,’ulaz.txt’);reset(f);n:=1;i:=0;dim2:=0;while not eof(f) dobegin

k:=0;repeat

k:=k+1;read(f,b[k]);

until eoln(f);{ writeln(’Procitani red:’);for j:=1 to k do

writeln(’b[’,j,’]=’,b[j]);readln; }

if (k=dim2) or (dim2=0) thenbegin

for j:=1 to k do a[i+1,j]:=b[j];dim2:=k;i:=i+1

endelsebegin

n:=n+1;ispis_matrice(a,i,dim2);dim2:=k;i:=1;for j:=1 to k do

a[i,j]:=b[j];end;

end;ispis_matrice(a,i,dim2);writeln(’Ukupno ima ’,n,’ matrica’);

86

Page 87: zbirka1

end.

63. program p63;type

pokazivac=^ element;element=record

broj:integer;sledeci:pokazivac;

end;var

lista,zadnji,zadnji2,l1,l2,w,q:pokazivac;n:integer;

function formiranje(b:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=b;p^.sledeci:=nil;formiranje:=p;

end;procedure ispis(l:pokazivac);var

p:pokazivac;begin

p:=l;while p<>nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;procedure dodaj_na_kraj(var zadnji:pokazivac;p:pokazivac);begin

zadnji^.sledeci:=p;zadnji:=zadnji^.sledeci;

end;procedure oslobadjanje(l:pokazivac);var

p,q:pokazivac;begin

p:=l;while p<> nil dobegin

q:=p^.sledeci;dispose(p);p:=q;

end;end;begin {glavni program}

lista:=nil;while not eof dobegin

readln(n);if lista=nil then {prvi element}begin

lista:=formiranje(n);

87

Page 88: zbirka1

zadnji:=lista;endelse

dodaj_na_kraj(zadnji,formiranje(n));end;writeln(’Citava lista:’);ispis(lista);q:=lista;while q<> nil dobegin

n:=q^.broj;if (n mod 3)=0 thenbegin

w:=formiranje(n);if l1=nil thenbegin

l1:=w;zadnji:=w;

endelse

dodaj_na_kraj(zadnji,w);end;if n>10 thenbegin

w:=formiranje(n);if l2=nil thenbegin

l2:=w;zadnji2:=w;

endelse

dodaj_na_kraj(zadnji2,w);end;

q:=q^.sledeci;end;writeln(’Prva lista:’);ispis(l1);writeln(’Druga lista:’);ispis(l2);write(’Zajednicki elementi: ’);zadnji:=l1;while zadnji<>nil dobegin

if zadnji^.broj>10 then write(zadnji^.broj:5);zadnji:=zadnji^.sledeci;

end;oslobadjanje(lista);oslobadjanje(l1);oslobadjanje(l2);

end.

SEPTEMBAR II 2004.

64. Matrica je polubalansirana ako je zbir elemenata u svakoj vrsti ili u svakoj koloni jednak. Matrica jepotpuno balansirana ako je zbir elemenata u svakoj vrsti i u svakoj koloni jednak. Napisati programkoji ispituje da li je matrica koja se unosi sa standardnog ulaza polubalansirana ili balansirana.

88

Page 89: zbirka1

65. Data je ulazna datoteka u koju su upisane rijeci. Napisati program koji kreira izlaznu datoteku ukoju su upisane samo one rijeci iz ulazne datoteke koje pocinju velikim slovom.

66. Sa standardnog ulaza unose se cijeli brojevi i smjestaju u jednostruko povezanu listu redom kako seunose. Na osnovu te liste formiraju se dvije liste, od kojih prva sadrzi samo one elemente pocetneliste koji su djeljivi sa 5, a druga one elemente koji su manji od 200. Ispisati nove liste i odreditinjihove zajednicke elemente.

Rjesenje

64. U zadatku su najvaznije funkcije balans vrste i balans kolone koje ispituju polubalansiranost. Ufunkciji balans vrste se prvo izracuna zbir elemenata prve vrste (za to se koristi funkcija zbir vrste,pa se ta vrijednost poredi sa zbirovima po ostalim vrstama. Slicno je i u funkciji balans kolone.

program p64;type

matrica=array [1..10,1..10] of integer;procedure unos_matrice(var a:matrica;var m,n:integer);var

i,j:integer;begin

write(’Unesi broj vrsta: ’);readln(m);write(’Unesi broj kolona: ’);readln(n);for i:=1 to m dofor j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:3);

writelnend;

end;function zbir_vrste(a:matrica;k:integer;n:integer):integer;var

i,s:integer;begin

s:=0;for i:=1 to n do

s:=s+a[k,i];zbir_vrste:=s;

end;function zbir_kolone(a:matrica;k:integer;m:integer):integer;var

i,s:integer;begin

s:=0;

89

Page 90: zbirka1

for i:=1 to m dos:=s+a[i,k];

zbir_kolone:=s;end;function balans_vrste(a:matrica;m,n:integer):boolean;var

i,j,p:integer;pom:boolean;

beginpom:=true;p:=zbir_vrste(a,1,n);i:=2;while (i<=m) and pom dobegin

if zbir_vrste(a,i,n)<>p then pom:=false;i:=i+1;

end;balans_vrste:=pom;

end;function balans_kolone(a:matrica;m,n:integer):boolean;var

i,j,p:integer;pom:boolean;

beginpom:=true;p:=zbir_kolone(a,1,m);i:=2;while (i<=n) and pom dobegin

if zbir_kolone(a,i,m)<>p then pom:=false;i:=i+1;

end;balans_kolone:=pom;

end;var

a:matrica;m,n:integer;

beginunos_matrice(a,m,n);ispis_matrice(a,m,n);if balans_vrste(a,m,n) then

writeln(’Matrica je polubalansirana po vrstama.’);if balans_kolone(a,m,n) then

writeln(’Matrica je polubalansirana po kolonama.’);if balans_vrste(a,m,n) and balans_kolone(a,m,n) then

writeln(’Matrica je potpuno balansirana’)else

writeln(’Matrica nije balansirana’);end.

65. program p65;var

f,g:text;s:string;

beginassign(f,’ulaz.txt’);reset(f);

90

Page 91: zbirka1

assign(g,’izlaz.txt’);rewrite(g);while not eof(f) dobegin

readln(f,s);if s[1] in [’A’..’Z’] then

writeln(g,s);end;close(f);close(g);

end.

66. Zadatak je slican zadatku 63.

OKTOBAR 2004

67. Napisati program koji omogucava unos dvije matrice istog formata i jos jednog cijelog broja, aispituje da li vazi da se odgovarajuci elementi matrica razlikuju za taj broj.

68. U ulaznoj datoteci ulaz se nalaze rijeci, u svakom redu po dvije, (moze se smatrati da su rijecismjestene u dvije kolone). Za svaku rijec iz prve kolone postoji rijec iz druge (ne obavezno u istomredu) koja je sastavljena od istih slova kao i prva rijec. Napisati program koji pronalazi parove rijecikoje su sastavljene od istih slova i upisuje ih u istom redu izlazne datoteke. Ukupan broj rijeci neprelazi 50.

69. Sa standardnog ulaza se unose rijeci i smjestaju u dvostruko povezanu listu, redom kako se unose.Potom se unose jos dva broja, m i n. Iz polazne liste ukloniti m-tu, m + n-tu, m + 2n-tu... rijec inovonastalu listu ispisati na ekranu.

Rjesenje

67. U funkciji uslov se u dvije while petlje poredi razlika elemenata matrice sa unesenim brojem, poapsolutnoj vrijednosti. Ukoliko se desi da se elementi ne razlikuju za dati broj, while petlje seprekidaju, a funkcija uslov dobija vrijednost false.

program p67;type

matrica=array [1..10,1..10] of integer;procedure unos_matrice(var a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dofor j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:3);

writeln

91

Page 92: zbirka1

end;end;function uslov(a,b:matrica;m,n,br:integer):boolean;var

i,j:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=m) and pom dobegin

j:=1;while (j<=n) and pom dobegin

if abs(a[i,j]-b[i,j])<>abs(br) then pom:=false;j:=j+1;

end;i:=i+1;

end;uslov:=pom;

end;var

a,b:matrica;broj,m,n:integer;

beginwrite(’Koliko vrsta imaju matrice: ’);readln(m);write(’Koliko kolona imaju matrice: ’);readln(n);writeln(’Unesi prvu matricu.’);unos_matrice(a,m,n);writeln(’Unesi drugu matricu.’);unos_matrice(b,m,n);write(’Unesi broj: ’);readln(broj);if uslov(a,b,m,n,broj) then

writeln(’Matrice zadovoljavaju uslov.’)else

writeln(’Matrice ne zadovoljavaju uslov.’);end.

68. Ispitivanje da li se dva stringa sastoje od istih slova se u ovom zadatku vrsi u dva koraka. Prvose oba stringa sortiraju, a potom se sortirani stringovi uporede. Ako su sortirani stringovi jednaki,tada se pocetni sastoje od istih slova.Sve rijeci iz datoteke se cuvaju u dva niza, u nizu a su rijeci iz prve kolone, a u nizu b rijeci izdruge. Za pronalazenje odgovarajuceg stringa u nizu b, za svaki string iz niza a koristi se funkcijapronadji, u kojoj se u while petlji prelazi po elementima niza b, sve dok se ne naide na trazenistring.

program p68;type

niz=array [1..25] of string;function sortiraj(s:string):string;var

i,j:integer;c:char;

begin

92

Page 93: zbirka1

for i:=2 to length(s) dofor j:=length(s) downto i do

if s[j-1]>s[j] thenbegin

c:=s[j-1];s[j-1]:=s[j];s[j]:=c;

end;sortiraj:=s;

end;function ista_slova(p,q:string):boolean;begin

if sortiraj(p)=sortiraj(q) then ista_slova:=trueelse ista_slova:=false;

end;function pronadji(s:string;b:niz;n:integer):string;var

i:integer;begin

i:=1;while not ista_slova(s,b[i]) do

i:=i+1;pronadji:=b[i];

end;var

f,g:text;a,b:niz;i,n:integer;c:char;s:string;

beginassign (f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);i:=0;while not eof (f) dobegin

i:=i+1;a[i]:=’’;repeat

read(f,c);a[i]:=a[i]+c;

until c=’ ’;a[i]:=copy(a[i],1,length(a[i])-1);readln(f,b[i]);

end;n:=i;for i:=1 to n dobegin

s:=pronadji(a[i],b,n);writeln(g,a[i],’ ’,s);

end;close(f);close(g);

end.

93

Page 94: zbirka1

69. Lista se formira na uobicajen nacin. Nakon unosa brojeva m i n, u promjenljivoj q se cuva prvielement koji se ne izbacuje iz liste. Slijedi prva while petlja u kojoj se pronalazi m-ti elementliste. U sledecoj while petlji se rade dvije stvari. Prva je izbacivanje elementa na koji pokazujepromjenljiva lista, (u startu je to m-ti element), a druga je n puta pomjeranje po listi udesno(pomocu pokazivaca sledeci).

program p69;type

pokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

lista,q,w:pokazivac;i,m,n:integer;r:string;

function formiranje(r:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelsep:=t;

end;procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil do

94

Page 95: zbirka1

beginp:=l^.sledeci;dispose(l);l:=p;

endend;begin {glavni program}

lista:=nil;repeat

readln(r);q:=formiranje(r);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);write(’Unesite m i n:’);readln(m,n);i:=1;{sad pamtimo prvi koji se ne izbacuje}if m>1 then q:=lista {ako se ne izbacuje prvi}elseif n=1 then q:=nil {svi ce biti izbaceni}else

q:=lista^.sledeci; {drugi ce ostati}while (i<m) and (lista<>nil) dobegin {trazimo prvi koji izbacujemo}

i:=i+1;lista:=lista^.sledeci;

end;while lista<>nil dobegin

i:=1;lista^.sledeci^.prethodni:=lista^.prethodni;if lista^.prethodni<>nil then

lista^.prethodni^.sledeci:=lista^.sledeci;w:=lista^.sledeci;dispose(lista);lista:=w;while (i<n) and (lista<>nil) dobegin

i:=i+1;lista:=lista^.sledeci;

end;end;lista:=pocetak(q);writeln(’Ispis liste nakon izbacivanja: ’);ispis(lista);lista:=pocetak(lista);oslobadjanje(lista);

end.

Novembar 2004.

70. Broj n je savrsen ako je zbir njegovih djelilaca jednak 2n. Napisati funkciju koja ispituje da li jebroj savrsen. Data je cjelobrojna matrica A formata 7x7, takva da je A[i, j] = i ∗ j. Koji elementi

95

Page 96: zbirka1

matrice su savrseni?

71. Data je tekstualna datoteka ulaz koja sadrzi najvise 50 cijelih brojeva, u svakom redu po jedan.Pronaci one cetvorke brojeva a, b, c, d za koje vazi a + c = b + d.

72. Sa standardnog ulaza se unose rijeci i smjestaju u dvostruko povezanu listu, redom kako se unose.Po zavrsetku unosa rijeci, unosi se jos jedan karakter. Iz liste izbaciti sve one rijeci koje sadrze tajkarakter i novonastalu listu ispisati na ekranu.

Rjesenje

70. program p70;type

matrica=array [1..7,1..7] of integer;procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]:3);

writelnend;

end;function savrsen(n:integer):boolean;var

s,i:integer;begin

s:=0;for i:=1 to n doif (n mod i = 0) then s:=s+i;savrsen:=(2*n=s);

end;var

a:matrica;i,j:integer;

beginfor i:=1 to 7 do

for j:=1 to 7 doa[i,j]:=i*j;

ispis_matrice(a,7);writeln(’Elementi matrice koji su savrseni:’);for i:=1 to 7 do

for j:=1 to 7 doif savrsen(a[i,j]) then

writeln(’A[’,i,’,’,j,’]=’,a[i,j]);end.

71. Funkcija razliciti vraca vrijednost true ukoliko su sva cetiri indeksa medusobno razliciti, tako dase u obzir uzimaju samo one cetvorke brojeva gdje nema istih elemenata niza. U zadatku se to nijeizricito trazilo, tako da rjesenje ne mora da zadrzi ovaj uslov.

program p71;type

niz=array[1..50] of integer;var

f:text;

96

Page 97: zbirka1

a:niz;i,j,k,l,ukupno:integer;

function razliciti(i1,i2,i3,i4:integer):boolean;begin

if (i1=i2) or (i1=i3) or (i1=i4) or(i2=i3) or (i2=i4) or (i3=i4)then razliciti:=falseelse razliciti:=true;

end;begin

assign(f,’ulaz.txt’);reset(f);ukupno:=0;while not eof(f) dobegin

ukupno:=ukupno+1;readln(f,a[ukupno]);

end;writeln(’Cetvorke koje zadovoljaju uslov:’);for i:=1 to ukupno do

for j:=1 to ukupno dofor k:=1 to ukupno do

for l:=1 to ukupno doif razliciti(i,j,k,l) then

if a[i]+a[k]=a[j]+a[l] thenwriteln(a[i]:4,a[j]:4,a[k]:4,a[l]:4);

end.

72. program p72;type

pokazivac=^element;element=record

rijec:string;sledeci, prethodni:pokazivac;

end;var

lista,q:pokazivac;s:string;c:char;

function formiranje(r:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

end

97

Page 98: zbirka1

elsep:=t;

end;function sadrzi(s:string;c:char):boolean;var

i:integer;pom:boolean;

beginpom:=false;i:=1;while (i<=length(s)) and (not pom) dobegin

if s[i]=c then pom:=true;i:=i+1;

end;sadrzi:=pom;

end;procedure izbaci(var l,q:pokazivac;c:char);var

p:pokazivac;begin

if l<>nil thenbegin

if sadrzi(l^.rijec,c) thenbegin

if l^.prethodni=nil thenbegin

p:=l;l:=l^.sledeci;dispose(p);

endelseif l^.sledeci<>nil thenbegin

p:=l;l^.sledeci^.prethodni:=l^.prethodni;l^.prethodni^.sledeci:=l^.sledeci;l:=l^.sledeci;dispose(p);

endelsebegin

p:=l;if l^.prethodni<>nil then

l^.prethodni^.sledeci:=nil;dispose(p);l:=nil;

endendelsebegin

if q=nil thenbegin

q:=l;q^.prethodni:=nil;

end;l:=l^.sledeci;

98

Page 99: zbirka1

end;end;

end; {od izbaci}procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin {glavni program}

lista:=nil;repeat

readln(s);q:=formiranje(s);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);write(’Unesi karakter: ’);readln(c);lista:=pocetak(lista);q:=nil;while (lista<>nil) do

izbaci(lista,q,c);if q<>nil thenbegin

lista:=(q);writeln(’Ispis liste nakon izbacivanja.’);ispis(lista);readln;lista:=pocetak(lista);oslobadjanje(lista);

endelse writeln(’Ostala je prazna lista’);

end.

JANUAR I 2005.

99

Page 100: zbirka1

73. Sa standardnog ulaza unosi se rijec s koja se sastoji samo od malih slova. Generisati slucajnekaraktere (ali samo mala slova) sve dok se ne pojave svi karakteri rijeci s. Odrediti koji karakterrijeci s je generisan najveci broj puta.

74. U ulaznoj datoteci se nalazi najvise 30 brojeva. Odrediti one k-torke a1, a2, ..., ak, a1 < a2 < ... <ak, k > 2 brojeva iz ulazne datoteke koje cine aritmeticku progresiju i sve takve k-torke upisati uizlaznu datoteku, u svakom redu po jednu.

75. U ulaznoj datoteci je dat spisak studenata u zapisu Ime, Prezime, BrIndeksa. Koristeci binarnostablo sortirati spisak po prezimenima i upisati ga u izlaznu datoteku, u formi Prezime, Ime,BrIndeksa.

76. Sa standardnog ulaza unosi se matrica formata 7x7 i jos jedan broj k, 1 < k < 7. Posmatra seostatak pri dijeljenju elemenata matrice sa k2. Formirati matricu formata kxk koja se sastoji odnekih k2 elemenata pocetne matrice koji pri dijeljenju sa k2 daju razlicite ostatke. Pretpostavka jeda pocetna matrica zadovoljava uslov zadatka, tj. da postoji takvih k2 elemenata.

Rjesenje

73. Pomocna funkcija prisutan ispituje da li je karakter prisutan u rijeci. U skupovnoj promjenljivojslova se u pocetku nalaze sva slova date rijeci. Svaki put kada se desi da je generisani karakterprisutan u rijeci, taj karakter se izbaci iz skupa. Generisanje se vrsi sve dok skup ne ostane prazan(uslov za izlazak iz while petlje). Generisanje slucajnih karaktera se svodi na generisanje slucajnogbroja u intervalu [0, 26]. Sabiranjem broja iz tog intervala sa brojem ord(′a′) dobija se redni brojnekog malog slova u ASCII kodu.

program p73;type

niz =array [’a’..’z’] of integer;skup=set of char;

vara:niz;slova:skup;s:string;naj,i,n:integer;c,najc:char;

function prisutan(s:string;c:char):boolean;var

pom:boolean;i:integer;

beginpom:=false;i:=1;while (i<=length(s)) and (not pom) dobegin

if s[i]=c then pom:=true;i:=i+1;

end;prisutan:=pom;

end;begin

randomize;for c:=’a’ to ’z’ do a[c]:=0;write(’Unesi rijec: ’);readln(s);slova:=[];{u skupu su u pocetku sva slova iz rijeci}for i:=1 to length(s) do

100

Page 101: zbirka1

slova:=slova+[s[i]];while slova<>[] dobegin

n:=random(1000);c:=chr((n mod 26)+ord(’a’));if prisutan (s,c) then a[c]:=a[c]+1;if c in slova then slova:=slova-[c];

end;naj:=0;for c:=’a’ to ’z’ dobegin

if prisutan(s,c) then writeln(c,’ ’,a[c]);if a[c]>naj thenbegin

najc:=c;naj:=a[c];

end;end;writeln(’Karakter ’,najc,’ je generisan ’,naj,’ puta.’);

end.

74. Prva stvar koju treba uociti je da je svaka aritmeticka progresija sortiran niz. Zato se odmah nakoncitanja brojeva u niz a poziva procedura sortiraj. Odredivanje podnizova koji su aritmeticki se vrsiu nekoliko koraka. Za svaki ureden par (a[i], a[j]) posmatra se razlika a[j]−a[i]. U trecoj for petljise prelazi po preostalim elementima (a[k], odnosno a[l]). Ukoliko se pronade element niza a[l] kojizadovoljava uslov da bude treci clan aritmeticke progresije, tada se ta tri elementa (a[i], a[j], a[l])upisu u izlaznu datoteku. Jos je potrebno ispitati da li medu preostalim elementima ima jos kojielement progresije.

program p74;type

niz=array [1..30] of integer;var

f,g:text;i,j,n,k,l,zadnji,razlika:integer;a:niz;

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

i,j,x:integer;begin

for i:=2 to n dofor j:=n downto i do

if a[j-1]>a[j] thenbegin

x:=a[j-1];a[j-1]:=a[j];a[j]:=x;

endend;begin

assign (f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);i:=0;while not eof(f) dobegin

101

Page 102: zbirka1

i:=i+1;readln(f,a[i]);

end;n:=i;sortiraj(a,n);for i:=1 to n-2 do

for j:=i+1 to n-1 dobegin

razlika:=a[j]-a[i];for k:=j+1 to n dobegin

l:=k;if a[l]-a[j]=razlika thenbegin {pronadjen je treci}

zadnji:=a[l];write(g,a[i]:2,a[j]:3,a[l]:3);l:=l+1;while l<=n dobegin

if (a[l]-zadnji)=razlika thenbegin {ima jos elemenata u progresiji}

write(g,a[l]:3);zadnji:=a[l];

end;l:=l+1;

end;writeln(g); {kraj progresije}

end;end;

end;close(f);close(g);

end.

75. Prilikom citanja reda iz datoteke potrebno je u tri stringa sacuvati prvo ime, pa prezime, pa brojindeksa. Zato se citanje vrsi karakter po karakter. Procitani prvi zarez je pokazatelj da je procitanoime, a drugi da je procitano prezime. Podaci se cuvaju binarnom stablu, a kriterijum za sortiranjeje prezime.

program p75;type

pokazivac=^element;element=record

ime, prezime,br_indeksa:string;lijevo,desno:pokazivac;

end;var

d:pokazivac;s1,s2,s3:string;c:char;f,g:text;

function formiranje(im,pr,b:string):pokazivac;var

p:pokazivac;begin

new(p);p^.ime:=im;

102

Page 103: zbirka1

p^.prezime:=pr;p^.br_indeksa:=b;p^.lijevo:=nil;p^.desno:=nil;formiranje:=p;

end;procedure dodavanje(var d:pokazivac;p:pokazivac);begin

if d=nil then d:=pelse

if p^.prezime<=d^.prezime thendodavanje(d^.lijevo,p)

elsedodavanje(d^.desno,p);

end;procedure ispis(d:pokazivac;var g:text);begin

if d<>nil thenbegin

ispis(d^.lijevo,g);writeln(g,d^.prezime,’, ’,d^.ime,’, ’,d^.br_indeksa);ispis(d^.desno,g);

end;end;procedure oslobadjanje(d:pokazivac);begin

if d<>nil thenbegin

oslobadjanje(d^.lijevo);oslobadjanje(d^.desno);dispose(d);

endend;begin

assign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);while not eof(f) dobegin

s1:=’’;repeat

read(f,c);s1:=s1+c;

until c=’,’;read(f,c); {razmak}s1:=copy(s1,1,length(s1)-1);s2:=’’;repeat

read(f,c);s2:=s2+c;

until c=’,’;read(f,c); {razmak}s2:=copy(s2,1,length(s2)-1);readln(f,s3);dodavanje(d,formiranje(s1,s2,s3));

end;

103

Page 104: zbirka1

ispis(d,g);oslobadjanje(d);close(f);close(g);

end.

76. Prvo se na osnovu brojeva formira matrica A formata 7x7. Potom se na osnovu broja k formiraskup (promjenljiva elementi), koji sadrzi sve brojeve od 0 do k2 − 1, (to su svi ostaci pri dijeljenjusa k2. Pomocu dvije while petlje se prelazi po elementima matrice A. Kada se javi novi ostatak,(taj ostatak je jos uvijek u skupu elementi), element matrice A se upisuje u matricu B. Potom setaj ostatak izbacuje iz skupa. While petlje se zavrsavaju kada skup postane prazan, tj. kada sepokupe svi ostaci.

program p76;type

matrica=array[1..7,1..7] of integer;skup=set of 1..36;

varelementi:skup;k,i,j,p,q:integer;a,b:matrica;

procedure unos_matrice(var a:matrica);var

i,j:integer;begin

for i:=1 to 7 dofor j:=1 to 7 dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]:3);writeln

end;end;begin

writeln(’Unos matrice formata 7x7:’);unos_matrice(a);ispis_matrice(a,7);write(’Unesi k: ’);readln(k);elementi:=[];for i:=0 to sqr(k)-1 do

elementi:=elementi+[i];i:=1;p:=1;q:=0;while (i<=7) and (elementi<>[]) dobegin

104

Page 105: zbirka1

j:=1;while (j<=7) and (elementi<>[]) dobegin

if (a[i,j] mod sqr(k)) in elementi thenbegin

elementi:=elementi-[a[i,j] mod sqr(k)];if q=k then {podesavanje indeksa nove matrice}begin

q:=1;p:=p+1;

endelse

q:=q+1;b[p,q]:=a[i,j];

end;j:=j+1;

end;i:=i+1;

end;ispis_matrice(b,k);

end.

FEBRUAR 2005

77. U datoteci je u svakom redu upisan broj, razmak, znak za neku osnovnu operaciju (+,−, ∗, /) ijos jedan broj, (na primjer 110 +150, 2 *45 i sl.). Napraviti izlaznu datoteku u kojoj su izvrsenenavedene operacije.

78. U datoteci je data cjelobrojna matrica formata 6x6 gdje su elementi matrice veci od 100 a manjiod 200. Napisati program koji ispituje da li je proizvod elemenata u svakoj vrsti isti.

79. U datoteci se nalaze rijeci, u svakom redu po jedna, s tim sto je moguce da se jedna rijec javi viseputa. Napraviti izlaznu datoteku koja se sastoji od rijeci iz ulazne datoteke ali tako da se svakarijec javlja tacno jednom i rijeci su sortirane po broju pojavljivanja u ulaznoj datoteci. Ukupanbroj rijeci u datoteci ne prelazi 50.

80. Unosi se matrica formata nxn sa standardnog ulaza. Napisati program koji ispituje da li za svakoi, i = 1..n vazi da je aritmeticka sredina elemenata i-te vrste jednaka i.

84. Na osnovu rijeci koje su upisane u ulaznu datoteku formirati sortirano binarno stablo. Kriterijumza sortiranje je broj pojavljivanja karaktera ’a’ u rijeci.

Rjesenje

77. Razmak izmedu prvog broja i znaka za operaciju predstavlja olaksicu da bi se prvi broj mogaodirektno procitati kao integer. Kada razmaka ne bi bilo, broj bi se morao citati cifru po cifru, apotom bi se racunala brojevna vrijednost procitanog stringa koji se sastoji od cifara.

program p77;var

f,g:text;m,n:integer;d,c:char;

beginassign(f,’ulaz.txt’);assign(g,’izlaz.txt’);reset(f);rewrite(g);

105

Page 106: zbirka1

d:=’ ’;while not eof(f) dobegin

read(f,m);read(f,d);read(f,c);read(f,n);case c of

’+’:writeln(g,m+n);’*’:writeln(g,m*n);’/’:writeln(g,m/n);’-’:writeln(g,m-n);

end;end;close(f);close(g);

end.

78. Zadatak se ne moze rijesiti mnozenjem brojeva u vrsti, jer bi se izaslo iz domena, (u vecini verzijaPascal-a najveci cio broj je 32767 ili 65535). Procedura djelioci kao argument uzima cio broj n iniz b koji iz procedure izlazi izmijenjen, tako sto i-ti element, (pod uslovom da je i prost broj), imaonoliku vrijednost koliko puta je broj i sadrzan u broju n. Potom se u proceduri djel vrste 6 putapoziva procedura djelioci, za svaki element vrste i tako se uvecavaju vrijednosti elemenata niza b.Proizvodi i-te i j-te vrste ce biti jednaki ako su im odgovarajuci nizovi (nizovi b) jednaki.

program p78;type

matrica=array[1..6,1..6] of integer;niz=array [2..100] of integer;

varpom:boolean;f:text;b,c:niz;j:integer;a:matrica;

procedure djelioci(n:integer; var b:niz);var

i:integer;begin

for i:=2 to 100 dowhile n mod i = 0 dobegin

b[i]:=b[i]+1;n:=n div i;

endend;procedure djel_vrste(a:matrica;i:integer;var b:niz);var

j:integer;begin

for j:=1 to 6 dodjelioci(a[i,j],b)

end;function jednaki_nizovi(b,c:niz):boolean;var

i:integer;pom:boolean;

106

Page 107: zbirka1

beginpom:=true;i:=2;while (i<=100) and pom dobegin

if b[i]<>c[i] then pom:=false;i:=i+1;

end;jednaki_nizovi:=pom;

end;procedure ocisti(var c:niz);var

j:integer;begin

for j:=2 to 100 doc[j]:=0;

end;procedure unos_matrice(var a:matrica;n:integer;var f:text);var

i,j:integer;begin

for i:=1 to n dofor j:=1 to n do

read(f,a[i,j]);end;procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]:4);

writelnend;

end;begin {glavni program}

assign(f,’ulaz.txt’);reset(f);unos_matrice(a,6,f);ispis_matrice(a,6);djel_vrste(a,1,b);pom:=true;j:=2;while (j<=6) and pom dobegin

djel_vrste(a,j,c);pom:=jednaki_nizovi(b,c);ocisti(c);j:=j+1;

end;if pom then writeln(’Vazi uslov’)else writeln(’Ne vazi uslov.’);

end.

79. Rijeci se cuvaju u nizu a ciji su elementi slogovi koji se sastoje od dva polja: polja rijec u komese cuva procitana rijec i polja broj u kome se cuva broj pojavljivanja te rijeci u ulaznoj datoteci.

107

Page 108: zbirka1

U zadatku je najvaznija procedura ubaci. Za procitanu rijec (argument procedure s) postoje dvijemogucnosti: ako je takva rijec ranije procitana i ubacena u niz a, polje broj tog elementa niza ase uvecava za 1, a ako takve rijeci nema u nizu a, tada se duzina niza povecava za 1, a polje rijecposlednjeg (novog) elementa niza dobija vrijednost te rijeci. Broj pojavljivanja te rijeci je tada 1.Nakon citanja rijeci, niz se sortira i potom upisuje u izlaznu datoteku.

program p79;type

slog=recordrijec:string;broj:integer;

end;niz=array[1..50] of slog;

varf,g:text;a:niz;s:string;i,n:integer;

procedure ubaci(s:string;var a:niz;var n:integer);var

i:integer;begin

i:=1;while (s<>a[i].rijec) and (i<=n) do

i:=i+1;if i<=n then a[i].broj:=a[i].broj+1elsebegin

a[i].rijec:=s;a[i].broj:=1;n:=i;

end;end;procedure sortiraj(var a:niz;n:integer);var

i,j:integer;x:slog;

beginfor i:=2 to n do

for j:=n downto i doif a[j-1].broj>a[j].broj thenbegin

x:=a[j-1];a[j-1]:=a[j];a[j]:=x

end;end;begin

assign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);n:=0;while not eof(f) dobegin

readln(f,s);ubaci(s,a,n);

108

Page 109: zbirka1

end;sortiraj(a,n);for i:=1 to n do

writeln(g,a[i].rijec,’ ’,a[i].broj);close(f);close(g);

end.

80. U funkciji aritm se racuna aritmeticka sredina elemenata i-te vrste. U funkciji uslov se ispituje dali matrica ima trazenu osobinu.

program p80;type

matrica=array[1..10,1..10] of integer;

procedure unos_matrice(var a:matrica;var n:integer);var

i,j:integer;begin

write(’Unesi dimenziju matrice: ’);readln(n);for i:=1 to n do

for j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]:3);writeln

end;end;function aritm(a:matrica;i,n:integer):real;var

j:integer;s:real;

begins:=0.0;for j:=1 to n do

s:=s+a[i,j];s:=s/n;aritm:=s;

end;function uslov(a:matrica;n:integer):boolean;var

i:integer;pom:boolean;

beginpom:=true;i:=1;

109

Page 110: zbirka1

while (i<=n) and pom dobegin

if aritm(a,i,n)<>i then pom:=false;i:=i+1;

end;uslov:=pom;

end;var

a:matrica;n:integer;

beginunos_matrice(a,n);ispis_matrice(a,n);if uslov(a,n) then writeln(’Matrica zadovoljava uslov’)else

writeln(’Matrica ne zadovoljava uslov.’);end.

81. program p81;type

pokazivac=^element;element=record

rijec:string;broj:integer;lijevo,desno:pokazivac;

end;var

d:pokazivac;s:string;f:text;

function broj_javljanja(s:string):integer;var

brojac,i:integer;begin

brojac:=0;for i:=1 to length(s) do

if s[i]=’a’ then brojac:=brojac+1;broj_javljanja:=brojac;

end;function formiranje(s:string):pokazivac;var

p:pokazivac;begin

new(p);p^.rijec:=s;p^.broj:=broj_javljanja(s);p^.lijevo:=nil;p^.desno:=nil;formiranje:=p;

end;procedure dodavanje(var d:pokazivac;p:pokazivac);begin

if d=nil then d:=pelse

if p^.broj<=d^.broj thendodavanje(d^.lijevo,p)else

110

Page 111: zbirka1

dodavanje(d^.desno,p);end;procedure ispis(d:pokazivac);begin

if d<>nil thenbegin

ispis(d^.lijevo);writeln(d^.rijec);ispis(d^.desno);

end;end;procedure oslobadjanje(d:pokazivac);begin

if d<>nil thenbegin

oslobadjanje(d^.lijevo);oslobadjanje(d^.desno);dispose(d);

endend;begin {glavni program}

assign(f,’ulaz.txt’);reset(f);d:=nil;while not eof(f) dobegin

readln(f,s);dodavanje(d,formiranje(s));

end;ispis(d);oslobadjanje(d);close(f);

end.

APRIL 2005.

82. U datoteci je u svakom od n redova, (n ≤ 10) upisano po n malih slova koja su odvojena razmacima.Napisati program koji ispituje da li su za svako i, i = 1..n slova iz i-tog reda ista kao i slova iz i-tekolone.

83. U datoteci je napisan tekst. Rijeci su odvojene razmacima ili znakom za kraj reda. Napisatiprogram koji racuna ukupan broj rijeci u datoteci i odreduje najduzu rijec.Podatke iz datoteke citati samo jednom.

84. Napisati program koji za dvije matrice A i B ispituje da li su elementi prve matrice djelioci odgo-varajucih elemenata druge matrice. Za matrice koje imaju to svojstvo odrediti one elemente A[i, j]i B[i, j] za koje je vrijednost B[i, j]divA[i, j] najveca.

88. Sa standardnog ulaza unose se brojevi i smjestaju u dvostruko povezanu listu l, redom kako seunose. Na osnovu tih unesenih brojeva formirati dvije jednostruko povezane liste l1 i l2, tako sto seu listu l1 upisuju pozitivni brojevi iz liste l, a u listu l2 negativni. Ispisati sve tri liste na ekranu.

Rjesenje

82. Karaktere je najlakse cuvati u matrici. Na osnovu karaktera u vrsti i koloni se prvo naprave dvijerijeci sortirane po karakterima, (za to sluze funkcije vrsta u string i kolona u string), a potom se ufunkciji uslov ispituje jednakost odogovarajucih rijeci.

111

Page 112: zbirka1

program p82;type

matrica=array[1..10,1..10] of char;var

f:text;n:integer;a:matrica;

procedure unos_matrice(var a:matrica;var n:integer;var f:text);var

i,j:integer;c:char;

beginassign(f,’ulaz.txt’);reset(f);i:=1;j:=1;while not eof(f) dobegin

if eoln(f) then j:=1;read(f,c);if c in [’a’..’z’] thenbegin

a[i,j]:=c;{write(’a[’,i,’,’,j,’]=’,c);}j:=j+1;

end;if eoln(f) then i:=i+1;

end;n:=i-1;close(f);

end;procedure ispis_matrice(a:matrica;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

for j:=1 to n dowrite(a[i,j]);

writelnend;

end;function vrsta_u_string(a:matrica;k,n:integer):string;var

i,j:integer;s:string;c:char;

begins:=’’;for j:=1 to n do

s:=s+a[k,j];for i:=2 to n do

for j:=n downto i doif s[j-1]>s[j] thenbegin

c:=s[j-1];s[j-1]:=s[j];

112

Page 113: zbirka1

s[j]:=c;end;

vrsta_u_string:=s;end;function kolona_u_string(a:matrica;k,n:integer):string;var

i,j:integer;s:string;c:char;

begins:=’’;for j:=1 to n do

s:=s+a[j,k];for i:=2 to n do

for j:=n downto i doif s[j-1]>s[j] thenbegin

c:=s[j-1];s[j-1]:=s[j];s[j]:=c;

end;kolona_u_string:=s;

end;function uslov(a:matrica;n:integer):boolean;var

i,j:integer;pom:boolean;

beginpom:=true;i:=1;while (i<=n) and pom dobegin

if vrsta_u_string(a,i,n)<>kolona_u_string(a,i,n) thenpom:=false;

i:=i+1;end;uslov:=pom;

end;begin

unos_matrice(a,n,f);ispis_matrice(a,n);writeln(’Matrica je dimenzije ’,n);readln;if uslov(a,n) then writeln(’Vazi uslov’)else writeln(’Ne vazi uslov.’);

end.

83. Rijeci citamo karakter po karakter, u repeat petlji. Prelazak u novi red ili razmak je znak daje ucitana rijec, pa nakon repeat petlje se ukupan broj rijeci uvecava za jedan. U promjenljivojnajduza se cuva trenutna najduza rijec.

program p83;var

f:text;s,najduza:string;c:char;n,ukupno:integer;

113

Page 114: zbirka1

beginassign(f,’ulaz.txt’);reset(f);n:=0;ukupno:=0;while not eof(f) dobegin

s:=’’;repeat

read(f,c);if (ord(c)<>13) and (ord(c)<>10)then s:=s+c; {ne uzimamo specijalne znake}

until (c=’ ’) or eoln(f);ukupno:=ukupno+1;if c=’ ’ then s:=copy(s,1,length(s)-1);if n<length(s) thenbegin

n:=length(s);najduza:=s;

end;end;writeln(’Najduza rijec: ’,najduza,n:3);writeln(’Ukupno rijeci: ’,ukupno);close(f);

end.

84. U zadatku je najvaznija funkcija uslov. Promjenljivi parametri p i q nakon izvrsenja funkcije dobi-jaju vrijednosti indeksa onih odgovarajucih elemenata matrica za koje je trazeni kolicnik najveci.Ukoliko matrice nemaju datu osobinu, rezultat funkcije je false i tada se vrijednosti p i q uopstene razmatraju.

program p84;type

matrica=array [1..10,1..10] of integer;procedure unos_matrice(var a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dofor j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:3);

writelnend;

end;function uslov(a,b:matrica;var p,q:integer;m,n:integer):boolean;

114

Page 115: zbirka1

vari,j,najveca:integer;pom:boolean;

beginnajveca:=0;pom:=true;i:=1;while (i<=m) and pom dobegin

j:=1;while (j<=n) and pom dobegin

if (b[i,j] mod a[i,j]=0) thenbegin

if (b[i,j] div a[i,j])>najveca thenbegin

najveca:=b[i,j] div a[i,j];p:=i;q:=j;

endendelse

pom:=false;j:=j+1;

end;i:=i+1;

end;uslov:=pom;

end;var

a,b:matrica;m,n,p,q:integer;

beginwrite(’Unos dimenzija matrice:’);readln(m,n);writeln(’Unos prve matrice:’);unos_matrice(a,m,n);writeln(’Unos druge matrice:’);unos_matrice(b,m,n);ispis_matrice(a,m,n);writeln;ispis_matrice(b,m,n);writeln;if uslov (a,b,p,q,m,n) then

writeln(’Odgovarajuci elementi su’,a[p,q]:4, b[p,q]:4)else

writeln(’Matrica nema dato svojstvo.’);end.

85. Posto se u zadatku trazi formiranje i jednostruko povezane i dvostruko povezane liste, potrebno jeobezbjediti funkcije i procedure i za jednu i za drugu strukturu. Nakon citanja brojeva i formiranedvostruko povezane liste, u while petlji se prelazi po elementima liste i u zavisnosti od znakaelementi se ubacuju ili u listu jednlista1 ili u listu jednlista2.

program p85;type

pokazivac1=^ element1;

115

Page 116: zbirka1

element1=recordbroj:integer;sledeci:pokazivac1;

end;pokazivac2=^element2;element2=record

broj:integer;sledeci, prethodni:pokazivac2;

end;function formiranje2(r:integer):pokazivac2;var

p:pokazivac2;begin

new(p);p^.broj:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje2:=p;

end;procedure dodavanje_na_zadnji2(var p,t:pokazivac2);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;procedure ispis2(p:pokazivac2);begin

while p<>nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;function pocetak2(p:pokazivac2):pokazivac2;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak2:=p;end;procedure oslobadjanje2(var l:pokazivac2);var

p:pokazivac2;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;function formiranje1(b:integer):pokazivac1;var

p:pokazivac1;

116

Page 117: zbirka1

beginnew(p);p^.broj:=b;p^.sledeci:=nil;formiranje1:=p;

end;procedure dodaj_na_kraj1(var zadnji:pokazivac1;p:pokazivac1);begin

zadnji^.sledeci:=p;zadnji:=zadnji^.sledeci;

end;procedure ispis1 (l:pokazivac1);var

p:pokazivac1;begin

p:=l;while p<> nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;procedure oslobadjanje1(l:pokazivac1);var

p,q:pokazivac1;begin

p:=l;while p<> nil dobegin

q:=p^.sledeci;dispose(p);p:=q;

end;end;var {globalne}

dvlista,q:pokazivac2;jedlista1,jedlista2,w,zadnji1,zadnji2:pokazivac1;n:integer;

beginwhile not eof dobegin

readln(n);q:=formiranje2(n);dodavanje_na_zadnji2(dvlista,q);

end;q:=pocetak2(dvlista);while q<>nil dobegin

n:=q^.broj;w:=formiranje1(n);if n>0 thenbegin

if jedlista1=nil then {ako dodajemo prvi element}begin

jedlista1:=w;zadnji1:=w;

end

117

Page 118: zbirka1

else dodaj_na_kraj1(zadnji1,w);endelse

if n<0 thenif jedlista2=nil then {dodavanje prvog}begin

jedlista2:=w;zadnji2:=w;

endelse dodaj_na_kraj1(zadnji2,w);

q:=q^.sledeci;end;dvlista:=pocetak2(dvlista);writeln(’Dvostruka:’);ispis2(dvlista);dvlista:=pocetak2(dvlista);oslobadjanje2(dvlista);writeln(’Pozitivni: ’);ispis1(jedlista1);oslobadjanje1(jedlista1);writeln(’Negativni: ’);ispis1(jedlista2);oslobadjanje1(jedlista2);

end.

JUNI I 2005.

86. Napisati program koji zahtijeva unos dvije matrice istog formata i ispituje da li su elementi prvematrice stepeni odgovarajucih elemenata druge matrice, tj. da li vazi (∀i, j)(∃k ∈ N) ttako da jeA[i, j] = B[i, j]k. Ako matrice imaju tu osobinu, odrediti one elemente matrica za koje je k najvece.

87. (a) Napisati funkciju koja za argument uzima cio broj i racuna koliko taj broj ima razlicitih cifara.

(b) U ulaznoj datoteci su cijeli brojevi, u svakom redu po jedan i nema vise od 50 brojeva. Uizlaznu datoteku upisati te brojeve sortirane po kriterijumu funkcije pod (a).

88. U ulaznoj datoteci su rijeci minimalne duzine 10, u svakom redu po jedna. ukupan broj rijeci nijeunaprijed poznat. U izlaznu datoteku treba upisati samo rijeci iz ulazne datoteke koje su neparneduzine, sastoje se samo od cifara i za koje vazi da je srednja cifra jednaka zbiru prve i poslednje.

89. Sa tastature se unose brojevi koji se cuvaju u jednostruko povezanoj listi, redom kako se unose.Nakon unosa izmedu svaka dva uzastopna elementa liste ubaciti element koji sadrzi broj koji jejednak aritmetickoj sredini ta da elementa. Ispisati novu listu na ekranu.

Rjesenje

86. Procedura stepen je ista kao u 17. zadatku. Ispitivanje date osobine se vrsi u funkciji uslov. Zaodgovarajuce elemente matrica se prvo pozove procedura stepen. Ukoliko promjenljiva t dobijevrijednost true (a[i, j] jeste oblika b[i, j]k), tada se to k uporeduje sa prethodnim najvecim. Uslucaju da promjenljiva t u proceduri stepen dobije vrijednost false, ispitivanje se prekida, arezultat funkcije uslov postaje false. U promjenljivim p i q se cuvaju indeksi onih elemenata zakoje je broj k najveci.

program p86;type

matrica=array [1..10,1..10] of integer;procedure unos_matrice(var a:matrica;m,n:integer);var

118

Page 119: zbirka1

i,j:integer;begin

for i:=1 to m dofor j:=1 to n dobegin

write(’Unesi [’,i,’,’,j,’]. element matrice: ’);readln(a[i,j]);

end;end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:3);

writelnend;

end;procedure stepen(n,p:integer;var k:integer;var j:boolean);begin

k:=0;while (n mod p = 0) dobegin

n:=n div p;k:=k+1;

end;j:=(n=1);

end;function uslov(a,b:matrica;var p,q:integer;m,n:integer):boolean;var

i,j,k,najveci:integer;pom,t:boolean;

beginnajveci:=0;pom:=true;i:=1;while (i<=m) and pom dobegin

j:=1;while (j<=n) and pom dobegin

stepen(a[i,j],b[i,j],k,t);if t thenbegin

if k>najveci thenbegin

najveci:=k;p:=i;q:=j;

endendelse

pom:=false;j:=j+1;

end;

119

Page 120: zbirka1

i:=i+1;end;uslov:=pom;

end;var

a,b:matrica;m,n,p,q:integer;

beginwrite(’Unesi dimenzije matrica: ’);readln(m,n);unos_matrice(a,m,n);writeln;unos_matrice(b,m,n);writeln;if uslov(a,b,p,q,m,n) thenbegin

writeln(’Matrice zadovoljavaju uslov.’);writeln(’Odgovarajuci elementi su: ’,a[p,q]:3,b[p,q]:3);

endelse writeln(’Matrice ne zadovoljavaju uslov.’);

end.

87. U funkciji broj cifara se posmatra jedna po jedna cifra, s lijeva na desno. U skupu cifre se cuvajuone cifre koje su vec prisutne u broju. Svaki put kada se naide na novu cifru, ta cifra se ubaci uskup, a ukupan broj razlicitih cifara se poveca za jedan. U drugom dijelu zadatka se iz datotekecitaju brojevi i smjestaju u niz slogova. Jedno polje sloga je sam broj, a drugo broj razlicitih cifara,sto je i kriterijum za sortiranje. Sortiran niz se upisuje u izlaznu datoteku.

program p87;type

slog=recordbroj,cifara:integer;

end;niz=array[1..50] of slog;

function broj_cifara(n:integer):integer;var

brojac:integer;cifre:set of 0..9;

begincifre:=[];brojac:=0;while n>0 dobegin

if not ((n mod 10) in cifre) thenbegin

cifre:=cifre+[(n mod 10)];brojac:=brojac+1;

end;n:=n div 10;

end;broj_cifara:=brojac;

end;procedure sortiraj(var a:niz;n:integer);var

i,j:integer;x:slog;

begin

120

Page 121: zbirka1

for i:=2 to n dofor j:=n downto i do

if a[j-1].cifara>a[j].cifara thenbegin

x:=a[j-1];a[j-1]:=a[j];a[j]:=x

end;end;var

a:niz;i,n:integer;f,g:text;

beginassign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);i:=0;while not eof(f) dobegin

i:=i+1;readln(f,a[i].broj);a[i].cifara:=broj_cifara(a[i].broj);

end;n:=i;sortiraj(a,n);for i:=1 to n do

writeln(g,a[i].broj);close(f);close(g);

end.

88. Funkcija samo cifre vraca vrijednost true ako se rijec sastoji samo od cifara. Funkcija jednakost,kao argument uzima rijec proizvoljne (i parne i neparne) duzine, a kao rezultat vraca vrijednosttrue kod rijeci neparne duzine ako vazi da je srednja cifra jednaka zbiru prve i poslednje, .

program p88;function samo_cifre(s:string):boolean; var

pom:boolean;i:integer;

beginpom:=true;i:=1;while (i<=length(s)) and pom dobegin

if not (s[i] in [’0’..’9’]) then pom:=false;i:=i+1;

end;samo_cifre:=pom;

end;function jednakost(s:string):boolean;begin

jednakost:=(ord(s[1])-ord(’0’)+ord(s[length(s)])=ord(s[(length(s) div 2)+1]))end;var

f,g:text;

121

Page 122: zbirka1

s:string;begin

assign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);while not eof (f) dobegin

readln(f,s);if samo_cifre(s) and jednakost(s) and (length(s) mod 2 =1) then

writeln(g,s);end;close(f);close(g);

end.

89. Lista se formira na uobicajen nacin. Nakon toga slijedi setnja po listi i na osnovu svaka dvauzastopna elementa formira se novi element koji se ubacuje izmedu njih.

program p89;type

pokazivac=^ element;element=record

broj:real;sledeci:pokazivac;

end;var

lista,zadnji,w,q:pokazivac;n:real;

function formiranje(b:real):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=b;p^.sledeci:=nil;formiranje:=p;

end;procedure ispis(l:pokazivac);var

p:pokazivac;begin

p:=l;while p<>nil dobegin

writeln(p^.broj:3:2);p:=p^.sledeci;

end;end;procedure dodaj_na_kraj(var zadnji:pokazivac;p:pokazivac);begin

zadnji^.sledeci:=p;zadnji:=zadnji^.sledeci;

end;procedure oslobadjanje(l:pokazivac);varp,q:pokazivac;

122

Page 123: zbirka1

beginp:=l;while p<> nil dobegin

q:=p^.sledeci;dispose(p);p:=q;

end;end;begin {glavni program}

lista:=nil;while not eof dobegin

readln(n);if lista=nil then {prvi element}begin

lista:=formiranje(n);zadnji:=lista;

endelse {ostali elementi}

dodaj_na_kraj(zadnji,formiranje(n));end;writeln(’Ispis liste nakon formiranja:’);ispis(lista);q:=lista;while q^.sledeci<>nil dobegin

n:=(q^.broj+q^.sledeci^.broj)/2;w:=formiranje(n);w^.sledeci:=q^.sledeci;q^.sledeci:=w;q:=q^.sledeci^.sledeci;

end;writeln(’Ispis nove liste:’);ispis(lista);oslobadjanje(lista);

end.

JUNI II 2005.

90. Iz ulazne datoteke se citaju brojevi i smjestaju u dvostruko povezanu listu. Nakon toga sa tastaturese ucitava jos jedan broj k. U listu iza svakog broja ubaciti broj koji je jednak aritmetickoj sredinielemenata liste i broja k. Ispisati novu listu na ekranu.

91. (a) Napisati funkciju koja za argument uzima cio broj i ispituje da li su jedini njegovi prosti djelioci2,3 i 5.

(b) U ulaznoj datoteci su cijeli brojevi, u svakom redu po jedan. U jednostruko povezanu listuucitati te brojeve, redom kako se unose. Potom iz liste izbaciti one brojeve ciji su jedini prostidjelioci 2,3 i 5. Ispisati novu listu u izlaznu datoteku.

92. U datoteci je upisan graf koji nema vise od 20 cvorova. Ispitati da li je taj graf zvijezda. Graf odn, n ≥ 1 cvorova je zvijezda ako je jedan cvor susjedni sa svim ostalim, a medu ostalim cvorovimanema susjeda.

Rjesenje

123

Page 124: zbirka1

90. Lista se formira na uobijcajen nacin. Dodavanje elemenata u listu se odvija u while petlji u glavnomdijelu programa. Prvo se formira element koji sadrzi vrijednost aritmeticke sredine, a potom se tajelement uveze u listu.

program p90;type

pokazivac=^element;element=record

broj:real;sledeci, prethodni:pokazivac;

end;var

lista, q:pokazivac;n,k:real;

function formiranje(r:real):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse

p:=t;end;procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.broj:3:2);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);

124

Page 125: zbirka1

l:=p;end

end;begin

lista:=nil;repeat

readln(n);q:=formiranje(n);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);write(’Unesi broj k: ’);readln(k);while lista<>nil dobegin

q:=formiranje((lista^.broj+k)/2);q^.sledeci:=lista^.sledeci;q^.prethodni:=lista;lista^.sledeci:=q;if q^.sledeci<>nil then q^.sledeci^.prethodni:=q;lista:=lista^.sledeci^.sledeci;

end;writeln(’Ispis liste nakon popunjavanja:’);lista:=pocetak(q); {posto je lista=nil, koristimo promjenljivu q}ispis(lista);lista:=pocetak(lista);oslobadjanje(lista);

end.

91. Lista se formira na uobicajen nacin. Funkcija uslov odreduje kriterijum za izbacivanje elemenata.Izbacivanje se vrsi su proceduri izbaci, koja je slicna proceduri za izbacivanje elemenata iz dvostrukopovezane liste. U promjenljivoj q (u okviru procedure izbaci) pamtimo pokazivac na prvi elementnove liste, a u promjenljivoj zadnji pokazivac na poslednji element nove liste. Prvi element jepotreban zbog dostupnosti samoj listi, a poslednji zbog eventualnog dodavanja u novu listu nekogelementa iz stare. U glavnom dijelu programa se za svaki element iz pocetne liste poziva proceduraizbaci, a pomjeranje listi se vrsi unutar procedure, (pokazivac l se prebacuje na sledeci element).

program p91;type

pokazivac=^ element;element=record

broj:integer;sledeci:pokazivac;

end;var

lista,zadnji,q,w:pokazivac;n:integer;f,g:text;

function uslov(n:integer):boolean;begin

while (n mod 2=0) do n:=n div 2;while (n mod 3=0) do n:=n div 3;while (n mod 5=0) do n:=n div 5;uslov:=(n=1);

125

Page 126: zbirka1

end;function formiranje(b:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=b;p^.sledeci:=nil;formiranje:=p;

end;procedure ispis(l:pokazivac;var g:text);var

p:pokazivac;begin

p:=l;while p<>nil dobegin

writeln(g,p^.broj);p:=p^.sledeci;

end;end;procedure dodaj_na_kraj(var zadnji:pokazivac;p:pokazivac);begin

zadnji^.sledeci:=p;zadnji:=zadnji^.sledeci;

end;procedure oslobadjanje(l:pokazivac);varp,q:pokazivac;begin

p:=l;while p<> nil dobegin

q:=p^.sledeci;dispose(p);p:=q;

end;end;procedure izbaci(var l,q,zadnji:pokazivac);var

p:pokazivac;begin

if l<>nil thenbegin

if uslov(l^.broj) then {element se izbacuje}begin

if l^.sledeci<>nil then {nije poslednji}begin

p:=l;l:=l^.sledeci;dispose(p);

endelse {poslednji}begin

p:=l;l:=l^.sledeci;zadnji^.sledeci:=nil;

126

Page 127: zbirka1

dispose(p);end

endelse {element se ne izbacuje}begin

if q=nil thenbegin

q:=l; {pamtimo prvi koji nije izbacen}zadnji:=q;

endelsebegin {uvezujemo novi u listu}

zadnji^.sledeci:=l;zadnji:=zadnji^.sledeci;

end;l:=l^.sledeci;

end;end;

end; {od izbaci}begin {glavni program}

lista:=nil;assign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);while not eof(f) dobegin

readln(f,n);q:=formiranje(n);if lista=nil then {prvi element}begin

lista:=formiranje(n);zadnji:=lista;

endelse {ostali elementi}

dodaj_na_kraj(zadnji,formiranje(n));end;w:=lista;q:=nil;zadnji:=nil;while w<>nil do

izbaci(w,q,zadnji);if q<>nil then ispis(q,g)else writeln(’Ostala je prazna lista’);oslobadjanje(q);close(f);close(g);

end.

92. Svaki cvor grafa se predstavlja kao slog cije je jedno polje ime samog cvora, a drugo (promjenljivaveze) niz njegovih susjeda. Pretpostavlja se da je ime cvora tipa integer i da su kod grafa sa ncvorova imena upravo 1, 2, ..., n. Sam graf se predstavlja kao niz cvorova koji je indeksiran brojevimaod 1 do n, tako da i-ti element niza (i-ti cvor) ima ime i. Niz susjeda cvora je u stvari niz imenacvorova koji su njegovi susjedi.Kod citanja grafa potrebno je voditi racuna o nekoliko stvari. U datoteci je upisan graf na sledecinacin. Prvih nekoliko brojeva su susjedi prvog cvora (cvora 1). Zatim slijedi nula, pa ponovonekoliko brojeva koji su susjedi cvora 2. Potom opet slijedi nula itd. Susjedi su zbog preciznosti

127

Page 128: zbirka1

navedeni u rastucem redoslijedu. Citanje grafa se vrsi u proceduri unos susjeda. Graf se ispisujetako sto se za svaki cvor ispisu imena njegovih susjeda. Stepen cvora (broj njegovih susjeda) ustvari predstavlja broj elemenata niza veze koji su razliciti od nule. Odredivanje stepena cvora vrsise u funkciji stepen.Ispitivanje da li je graf sa n cvorova zvijezda se vrsi tako sto se prvo ispita da li postoji cvor koji jestepena n− 1, a potom da li su svi ostali cvorovi stepena 1.

program p92;type

cvor = recordime:integer;veze:array[1..19] of integer;

end;cvorovi=array[1..20] of cvor;

procedure ispis_grafa(g:cvorovi;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

j:=1;writeln(’Cvor ’,i,’ ima susjede:’);while g[i].veze[j]<>0 dobegin

write(g[i].veze[j],’ ’);j:=j+1;

end;writeln

end;end;procedure unos_susjeda(var c:cvorovi;var n:integer;var f:text);var

i,k,j:integer;begin

i:=1;while not eof(f) dobegin

c[i].ime:=i;k:=1;j:=1;while k<>0 dobegin

readln(f,k);c[i].veze[j]:=k;j:=j+1;

end;i:=i+1;

end;n:=i-1;writeln(’Ukupno cvorova: ’,n);

end;function stepen(c:cvor):integer;var

k:integer;begin

k:=1;while c.veze[k]<>0 do

128

Page 129: zbirka1

k:=k+1;stepen:=k-1;

end;var

g:cvorovi;n,i,j:integer;f:text;pom:boolean;

begin {glavni program}assign(f,’graf.txt’);reset(f);for i:=1 to 20 do

for j:=1 to 19 dog[i].veze[j]:=0;

unos_susjeda(g,n,f);ispis_grafa(g,n);for i:=1 to n do

writeln(’Stepen ’,i,’-tog cvora: ’,stepen(g[i]));writeln(’Trazimo prvi cvor stepena ’,n-1);i:=1;while (stepen(g[i])<>(n-1)) and (i<=n) do

i:=i+1;if i<=n then {postoji cvor susjedan sa svim ostalim}begin

writeln(’Taj cvor je cvor: ’,i);pom:=true;for j:=1 to n do

if (j<>i) thenif stepen(g[j])<>1 then

pom:=false;endelse pom:=false;if pom then writeln(’Graf jeste zvijezda’)elsewriteln(’Graf nije zvijezda.’);

end.

JULI I 2005.

93. (a) Napisati funkciju koja za argument uzima cio broj i ispituje koliko razlicitih prostih djelilacaima taj broj.

(b) Formirati matricu formata 12x12, takvu da je A[i, j] = i ∗ j + i − 1. Ispisati one elementematrice koji imaju tacno dva razlicita prosta djelioca.

94. U datoteci se nalaze nizovi cijelih brojeva. U svakom redu je dat po jedan niz maksimalne duzine6 i nema vise od 10 nizova. Za svaki niz se racuna najveci i najmanji element. Razlika izmedunajveceg i najmanjeg elementa je kriterijum za sortiranje. Sortirati skup nizova po tom kriterijumui nizove upisati u izlaznu datoteku, u svaki red po jedan.

95. Sa tastature se unose dvije rijeci iste duzine i potom jos jedan broj k. Odrediti one parove odgo-varajucih karaktera rijeci ciji se redni brojevi u ASCII kodu razlikuju za broj k.

96. Sa tastature se unose cijeli brojevi koji se cuvaju u dvostruko povezanoj listi, redom kako se unose.Potom se unosi jos broj k, k ≤ 10 koji je manji od ukupnog broja elemenata liste. Ako je unesenalista [a1, a2, ..., an], formirati matricu

(a1 ... ak

an ... an−k+1

)

129

Page 130: zbirka1

i ispisati je na ekranu.

Rjesenje

93. program p93;type

matrica=array[1..12,1..12] of integer;function broj_prostih(n:integer):integer;var

k,brojac:integer;begin

brojac:=0;k:=2;while n>1 dobegin

if n mod k=0 thenbegin

brojac:=brojac+1;while n mod k=0 do

n:=n div k;end;k:=k+1;

end;broj_prostih:=brojac;

end;procedure ispis_matrice(a:matrica;m,n:integer);var

i,j:integer;begin

for i:=1 to m dobegin

for j:=1 to n dowrite(a[i,j]:3);

writelnend;

end;var

a:matrica;i,j:integer;

beginfor i:=1 to 12 do

for j:=1 to 12 doa[i,j]:=i*j+i-1;

ispis_matrice(a,12,12);writeln(’Elementi koji imaju dacno dva razlicita djelioca:’);for i:=1 to 12 do

for j:=1 to 12 doif broj_prostih(a[i,j])=2

then writeln(’a[’,i,’,’,j,’]=’,a[i,j]);end.

94. Elementi niza a su slogovi cije je jedno polje (elementi) niz brojeva, tj. jedan red datoteke, apreostala dva duzina niza elementi i razlika izmedu najveceg i najmanjeg broja u tom nizu. Razlikaizmedu najveceg i najmanjeg broja u nizu se racuna u funkciji frazlika. Citanje brojeva iz datotekese vrsi u while petlji u glavnom dijelu programa, a u okviru nje se svaki red cita u repeat petlji.Odmah nakon procitanog reda se racuna razlika izmedu najveceg i najmanjeg broja u jednom nizu,koja je kriterijum za sortiranje niza a u proceduri sortiraj.

130

Page 131: zbirka1

program p94;type

nizic=array [1..6] of integer;slog=record

elementi:nizic;duz,razlika:integer;

end;niz=array [1..10] of slog;

function frazlika(b:nizic;n:integer):integer;var

i,j,min,max:integer;begin

min:=b[1];max:=b[1];for i:=1 to n dobegin

if b[i]<min then min:=b[i];if b[i]>max then max:=b[i];

end;frazlika:=max-min;

end;procedure sortiraj(var a:niz; n:integer);var

i,j:integer;x:slog;

beginfor i:=2 to n do

for j:=n downto i doif a[j-1].razlika>a[j].razlika thenbegin

x:=a[j-1];a[j-1]:=a[j];a[j]:=x;

endend;var

f,g:text;a:niz;i,j,duzina:integer;

beginassign(f,’ulaz.txt’);reset(f);assign(g,’izlaz.txt’);rewrite(g);i:=0;while not eof(f) dobegin

i:=i+1;j:=0;repeat

j:=j+1;read(f,a[i].elementi[j]);

until eoln(f);a[i].duz:=j;a[i].razlika:=frazlika(a[i].elementi,a[i].duz);

end;duzina:=i;

131

Page 132: zbirka1

sortiraj(a,duzina);for i:=1 to duzina dobegin

for j:=1 to a[i].duz dowrite(g,a[i].elementi[j]:3);

writeln(g);end;close(f);close(g);

end.

95. program p95;var

i,k:integer;s1,s2:string;

beginwrite(’Prvi string: ’);readln(s1);write(’Drugi string: ’);readln(s2);if length(s1)<>length(s2)

then writeln(’Pogresan unos.’)elsebegin

write(’Broj k: ’);readln(k);writeln(’Parovi karaktera su:’);for i:=1 to length(s1) do

if abs(ord(s1[i])-ord(s2[i]))=abs(k)then writeln(s1[i],’ ’,s2[i]);

end ;end.

96. Lista se unosi na uobicajen nacin. Vazno je primjetiti da nakon unosa promjenljiva q pokazujena poslednji element liste. U jednoj for petlji se setamo po listi pomocu promjenljivih lista i q,tako sto promjenljivu lista pomjeramo udesno, (na sledeci element), a promjenljivu q ulijevo, naprethodni. U svakom koraku for petlje popunjavamo obje vrste matrice a brojevima iz liste.

program p96;type

matrica=array [1..2,1..10] of integer;pokazivac=^element;element=record

broj:integer;sledeci, prethodni:pokazivac;

end;var

a:matrica;lista,q:pokazivac;j,k,n:integer;

procedure ispis_matrice(a:matrica;k:integer);var

i,j:integer;begin

for i:=1 to 2 dobegin

for j:=1 to k do

132

Page 133: zbirka1

write(a[i,j]:3);writeln;

end;end;function formiranje(r:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil thenbegin

p^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin

lista:=nil;repeat

readln(n);q:=formiranje(n);dodavanje_na_zadnji(lista,q);

until eof;lista:=pocetak(lista);

133

Page 134: zbirka1

writeln(’Ispis liste nakon formiranja.’);ispis(lista);lista:=pocetak(lista);write(’Unesi broj k: ’);readln(k);for j:=1 to k dobegin

a[1,j]:=lista^.broj;a[2,j]:=q^.broj; {q u startu pokazuje na zadnji}lista:=lista^.sledeci;q:=q^.prethodni;

end;ispis_matrice(a,k);lista:=pocetak(lista);oslobadjanje(lista);

end.

JULI II 2005.

97. Iz ulazne datoteke se citaju brojevi i smjestaju u dvostruko povezanu listu. Nakon toga sa tastaturese ucitava jos jedan broj k. Formirati dvije nove dvostruko povezane liste, tako sto se u prvusmjestaju oni brojevi pocetne liste koji su manji od k, a u drugu oni koji su veci od k. Ispisati svetri liste na ekranu.

98. Sa tastature se unose rijeci koje se cuvaju u jednostruko povezanoj listi. Nakon toga se unosi josjedan karakter. Izbaciti taj karakter iz rijeci koje ga sadrze, a ubaciti ga na prvu poziciju u sve onerijeci koje ga ne sadrze. Novu listu ispisati na ekranu.

99. U datoteci je upisan graf sa n, n ≤ 20 cvorova. Ispitati da li za svaka dva nesusjedna cvora v1 i v2

grafa vazi d(v1) + d(v2) ≥ n, gdje je d(v) broj susjeda cvora v.

Rjesenje

97. program p97;type

pokazivac=^element;element=record

broj:integer;sledeci, prethodni:pokazivac;

end;var

lista,q,w,lista2,lista3:pokazivac;k,n:integer;f:text;

function formiranje(r:integer):pokazivac;var

p:pokazivac;begin

new(p);p^.broj:=r;p^.prethodni:=nil;p^.sledeci:=nil;formiranje:=p;

end;procedure dodavanje_na_zadnji(var p,t:pokazivac);begin

if p<>nil then

134

Page 135: zbirka1

beginp^.sledeci:=t;t^.prethodni:=p;p:=p^.sledeci;

endelse p:=t;

end;procedure ispis(p:pokazivac);begin

while p<>nil dobegin

writeln(p^.broj);p:=p^.sledeci;

end;end;function pocetak(p:pokazivac):pokazivac;begin

while p^.prethodni<>nil dop:=p^.prethodni;

pocetak:=p;end;procedure oslobadjanje(var l:pokazivac);var

p:pokazivac;begin

while l<>nil dobegin

p:=l^.sledeci;dispose(l);l:=p;

endend;begin

assign(f,’ulaz.txt’);reset(f);lista:=nil;repeat

readln(f,n);q:=formiranje(n);dodavanje_na_zadnji(lista,q);

until eof(f);lista:=pocetak(lista);writeln(’Ispis liste nakon formiranja.’);ispis(lista);w:=pocetak(lista);write(’Unesi k: ’);readln(k);lista2:=nil;lista3:=nil;while w<>nil dobegin

q:=formiranje(w^.broj);if w^.broj<k then dodavanje_na_zadnji(lista2,q);if w^.broj>k then dodavanje_na_zadnji(lista3,q);w:=w^.sledeci;

end;lista:=pocetak(lista);

135

Page 136: zbirka1

writeln(’Prva lista:’);ispis(lista);if lista2<>nil then lista2:=pocetak(lista2);writeln(’Druga lista:’);ispis(lista2);if lista3<>nil then lista3:=pocetak(lista3);writeln(’Treca lista:’);ispis(lista3);if lista2<>nil then lista2:=pocetak(lista2);if lista3<>nil then lista3:=pocetak(lista3);oslobadjanje(lista);oslobadjanje(lista2);oslobadjanje(lista3);close(f);

end.

98. U zavosnosti od vrijednosti funkcije sadrzi, za svaku rijec u listi pozivaju se funkcije izbaci ili dodaj.

program p98;type

pokazivac=^ element;element=record

rijec:string;sledeci:pokazivac;

end;var

lista,zadnji,q:pokazivac;s:string;c:char;

function sadrzi(s:string;c:char):boolean;var

i:integer;pom:boolean;

beginpom:=false;for i:=1 to length(s) do

if s[i]=c then pom:=true;sadrzi:=pom;

end;function izbaci(s:string;c:char):string;var

i:integer;s1:string;

begins1:=’’;for i:=1 to length(s) do

if s[i]<>c thens1:=s1+s[i];

izbaci:=s1;end;function dodaj(s:string;c:char):string;begin

dodaj:=c+s;end;function formiranje(s:string):pokazivac;var

p:pokazivac;

136

Page 137: zbirka1

beginnew(p);p^.rijec:=s;p^.sledeci:=nil;formiranje:=p;

end;procedure ispis(l:pokazivac);var

p:pokazivac;begin

p:=l;while p<>nil dobegin

writeln(p^.rijec);p:=p^.sledeci;

end;end;procedure dodaj_na_kraj(var zadnji:pokazivac;p:pokazivac);begin

zadnji^.sledeci:=p;zadnji:=zadnji^.sledeci;

end;procedure oslobadjanje(l:pokazivac);varp,q:pokazivac;begin

p:=l;while p<> nil dobegin

q:=p^.sledeci;dispose(p);p:=q;

end;end;begin {glavni program}

lista:=nil;while not eof dobegin

readln(s);if lista=nil then {prvi element}begin

lista:=formiranje(s);zadnji:=lista;

endelse {ostali elementi}

dodaj_na_kraj(zadnji,formiranje(s));end;writeln(’Ispis liste nakon formiranja:’);ispis(lista);q:=lista;write(’Unesi karakter: ’);readln(c);while q<>nil dobegin

if sadrzi(q^.rijec,c) then q^.rijec:=izbaci(q^.rijec,c)else q^.rijec:=dodaj(q^.rijec,c);q:=q^.sledeci;

137

Page 138: zbirka1

end;ispis(lista);oslobadjanje(lista);

end.

99. Funkcija susjedi za argument uzima dva cvora, a vraca vrijednost true ako su ta dva cvora u grafususjedni, a ako nisu, vraca vrijednost false. Cvor v je susjedni sa cvorom u ukoliko se ime cvora vnalazi u nizu susjeda (niz veze) cvora u. Pomocu funkcije uslov ispituje se da li graf ima trazenuosobinu. U dvije for petlje se prelazi po svim parovima nesusjednih cvorova i ispituje trazenanejednakost.Napomena: Uslov koji se ispituje u zadatku je dovoljan uslov da graf ima Hamiltonovu konturu.

program p99;type

cvor = recordime:integer;veze:array[1..19] of integer;

end;cvorovi=array[1..20] of cvor;

procedure ispis_grafa(g:cvorovi;n:integer);var

i,j:integer;begin

for i:=1 to n dobegin

j:=1;writeln(’Cvor ’,i,’ima susjede:’);while g[i].veze[j]<>0 dobegin

write(g[i].veze[j],’ ’);j:=j+1;

end;writeln

end;end;procedure unos_susjeda(var c:cvorovi;var n:integer;var f:text);var

i,k,j:integer;begin

i:=1;while not eof(f) dobegin

c[i].ime:=i;k:=1;j:=1;while k<>0 dobegin

readln(f,k);c[i].veze[j]:=k;j:=j+1;

end;i:=i+1;

end;n:=i-1;writeln(’Ukupno cvorova: ’,n);

end;function stepen(c:cvor):integer;

138

Page 139: zbirka1

vark:integer;

begink:=1;while c.veze[k]<>0 do

k:=k+1;stepen:=k-1;

end;function susjedi(u,v:cvor):boolean;var

i:integer;begin

i:=1;while (u.veze[i]<>v.ime) and (u.veze[i]<>0) do

i:=i+1;susjedi:=(u.veze[i]<>0);

end;function uslov(g:cvorovi;n:integer):boolean;var

pom:boolean;i,j:integer;

beginpom:=true;for i:=1 to n-1 do

for j:=i+1 to n doif not susjedi(g[i],g[j]) then

if (stepen(g[i])+stepen(g[j]))<nthen pom:=false;

uslov:=pom;end;var

g:cvorovi;n,i,j:integer;f:text;pom:boolean;

begin {glavni program}assign(f,’graf.txt’);reset(f);for i:=1 to 20 do

for j:=1 to 19 dog[i].veze[j]:=0;

unos_susjeda(g,n,f);ispis_grafa(g,n);if uslov(g,n) then writeln(’Graf ispunjava uslov.’)elsewriteln(’Graf ne ispunjava uslov.’);

end.

139