You are on page 1of 3

Praktični dio ispita iz predmeta “Tehnike programiranja” (Grupa B)

Zadatak 1 (2.5 poena)

Napišite funkciju “TransformirajMatricu” koja kao parametar prihvata matricu organiziranu kao dek
dekova realnog tipa (tipa "double") a kao rezultat vraća listu čiji su elementi tipa "bool". Funkcija treba
da transformira matricu proslijeđenu kao parametar na način da pomjeri redoslijed njenih kolona, tako
da prva kolona dođe na drugo mjesto, druga na treće mjesto, i slično do pretposljednje koja dolazi na
posljednje mjesto, a posljednja na prvo mjesto. U slučaju da parametar nema oblik matrice (tj. ukoliko
svi njegovi redovi nemaju isti broj elemenata), treba baciti izuzetak tipa “domain_error” uz prateći tekst
“Parametar nema formu matrice”. Pored obrtanja kolona, kao rezultat treba vratiti listu čiji su elementi
logičkog tipa, a čiji se elementi kreiraju na način da je -ti element liste logička vrijednost “tačno” ukoliko
je produkt elemenata -tog reda pozitivan, a netačno u suprotnom. Za realizaciju funkcije nije dozvoljeno
koristiti nikakve pomoćne kontejnerske tipove podataka.

Napišite i kratki isječak programa koji ilustrira kako se koristi napisana funkcija. Dijalog između korisnika i
programa treba izgledati ovako (za ispis elemenata matrice koristite širinu od 8 mjesta):
Unesite broj redova: 5
Unesite broj kolona: 3
Unesite elemente matrice: 1 2 -3 1.5 2.5 3.5 4 5 6 5.5 -3.5 -5.5 9 8 7
Transformirana matrica:
2 -3 1
2.5 3.5 1.5
5 6 4
-3.5 -5.5 5.5
8 7 9
Rezultujuca lista: false true true true true

Zadatak 2 (2.5 poena)

Napišite funkciju “IzdvojiElemente” čiji je parametar dek čiji su svi elementi nekog cjelobrojnog tipa,
ali koji ne mora nužno biti tip “int”. Funkcija kao rezultat vraća vektor s istim brojem elemenata kao i
ulazni dek i koji su tipa “double”, ali čiji su elementi u odnosu na ulazni dek izmijenjeni na način da je od
svakog trećeg (po redu) elementa početnog deka izračunat kvadrat, a od svih ostalih izračunat
logaritam. Ukoliko se desi da je neki element od kojeg treba računati logaritam negativan, funkcija treba
baciti izuzetak tipa “logic_error” sa pratećim tekstom “Element vektora negativan”.

Potrebno je napisati i kratki testni program u kojem ćete testirati napisanu funkciju (pri tome,
pretpostavite da dek ima elemente tipa “int”). Elemente dobijenog vektora treba ispisivati na četiri
tačne cifre. Potrebno je predvidjeti i hvatanje eventualno bačenog izuzetka. Dijalog između programa i
korisnika treba izgledati kao u sljedećim primjerima:
Unesite broj elemenata deka: 7
Unesite elemente deka: 2 64 -10 36 15 7 8
Rezultujuci vektor: 0.6931 4.159 100 3.584 2.708 49 2.079

Unesite broj elemenata deka: 6


Unesite elemente deka: 2 -64 -10 36 15 -7
Problem: Element deka negativan!
Zadatak 3 (2.5 poena)

Napišite funkciju “OgradiRijec” koja kao parametar prima neki string i prirodan broj , a koja modificira
string tako da se -ta riječ u stringu izbaci iz stringa. Recimo, ukoliko se kao ulazni string zada tekst
“ Riba ribi grize rep! “, i ako je = 3, modificirani string treba biti “ Riba ribi rep “ (briše se
samo riječ, a ne i razmaci koji su ispred i iza nje). Smatraćemo da je riječ svaki maksimalni uzastopni niz
znakova koji nisu razmaci. Pored toga, kao rezultat funkcija treba da vrati broj riječi u stringu prije
brisanja (4 za navedeni primjer). Ukoliko je manji od 1 ili veći od broja riječi u stringu, treba baciti
izuzetak tipa “range_error” uz prateći tekst “Nekorektan redni broj rijeci”. Funkcija ne smije koristiti
nikakve pomoćne stringove niti kontejnerske tipove podataka.

Napišite i kratki testni program koji testira napisanu funkciju. Dijalog između korisnika i programa treba
da izgleda kao u sljedećim primjerima:
Unesite string: Riba ribi grize rep!
Redni broj rijeci: 3
Modificirani string: Riba ribi rep!
Broj rijeci: 4

Unesite string: Bla bla...


Redni broj rijeci: 3
Nema toliko rijeci u tom stringu!

Zadatak 4 (3 poena)

Napišite funkciju “NapraviDinamickuKopiju” koja kao parametar prima vektor redova (tj. objekata tipa
“queue”) cijelih brojeva. Funkcija treba da dinamički alocira grbavu matricu koja sadrži iste elemente kao i
taj vektor redova i to istim redoslijedom (npr. ukoliko je prvi element red čiji su elementi 3, 5 i 2, a drugi
element red čiji su elementi 1, 5, 4 i 3, upravo tim redom, takva treba da bude i dinamički alocirana grbava
matrica). Alokaciju treba obaviti postupkom kontinualne alokacije. Kao rezultat, funkcija treba da vrati
dvojni pokazivač koji služi za pristup elementima kreirane grbave matrice, ili nul-pokazivač u slučaju da
alokacija ne uspije. Bitno je napomenuti da ni u kom slučaju ne smije doći do curenja memorije.

Napišite i kratki testni program koji testira napisanu funkciju (predvidjeti unos podataka, kreiranje
grbave matrice, njen ispis, te oslobađanje zauzete memorije). Dijalog između korisnika i programa treba
da izgleda kao u sljedećim primjerima (obratite pažnju da do nedostatka memorije može doći i iz drugih
razloga, a ne samo ako funkcija vrati nul-pokazivač):
Broj red: 2
Elementi 1. reda (0 za kraj): 3 14 2 0
Elementi 2. reda (0 za kraj): 251 3 44 -6 1 0
Kreirana matrica:
3 14 2
251 3 44 -6 1

Broj redova: 2000000000


Nema dovoljno memorije!
Zadatak 5 (2 poena)

Napišite kratki isječak programa koji će sa tastature unijeti 5 brojeva u neku listu cijelih brojeva (tj.
kontejner tipa “list<int>”), zatim odstraniti sve brojeve iz tog deka koji imaju sumu cifara veću od
broja koji se unosi s tastautre, i na kraju ispisati elemente tako modificirane liste (onoliko koliko ih ima
nakon obavljenog odstranjivanja) na ekran, pri čemu se svaki element ispisuje u novom redu. Za
odstranjivanje trebate koristite funkciju “remove_if” iz bibiloteke “algorithm” (ova funkcija kopira sve
elemente omeđene sa prva dva parametra u blok na koji pokazuje treći parametar, osim onih za koje
funkcija kriterija proslijeđena kao četvrti parametar da logičku vrijednost “tačno”). Kao funkciju kriterija
trebate upotrijebiti anonimnu (lambda) funkciju. Dijalog između korisnika i programa treba izgledati
kao u sljedećem primjeru:
Unesite 5 brojeva:
35214
728
111423
79923
1232

Unesite dozvoljenu sumu cifara: 16


Preostali brojevi:
35214
111423
1232

Zadatak 6 (2,5 poena)

Praktično svi funkcionalni programski jezici poznaju funkciju nazvanu “fold” koja prima dva parametra.
Prvi parametar je neki kontejner (vektor, dek, lista, skup, itd.), dok je drugi parametar neka funkcija koja
prima dva parametra, nazovimo je . Kao rezultat, ova funkcija vraća novi kontejner sa istim brojem
elemenata kao i kontejner zadan kao prvi parametar, samo u kojem su vrijednosti svih elemenata
početnog spiska, koje ćemo nazvati , , , , … zamijenjeni elementima ( , ), ( ( , ), ),
( ( ( , ), ), ), itd. pri čemu je podrazumijevana vrijednost za tip elemenata kontejnera. Na
primjer, ukoliko je prvi parametar lista čiji su elementi 3, 6, 1, 4, 2, a drugi parametar funkcija koja vraća
kao rezultat sumu svoja dva parametra, funkcija “fold” vraća kao rezultat drugu listu čiji su elementi
redom 3, 9, 10, 14 i 16. Sam kontejner koji se zadaje kao prvi parametar treba da ostane neizmijenjen.
Vaš zadatak je da napravite tu funkciju, koju ćemo nazvati “Umotaj”. Funkcija treba da bude što
univerzalnija da radi sa što više različitih vrsta kontejnera. Jedino što se za kontejner treba
podrazumijevati je da podržava iteratore sa kretanjem unaprijed, funkcije “begin” i “end” (što isključuje
recimo stek kao dozvoljeni tip kontejnera), funkciju “insert”, te mogućnost da se čitav kontejner kopira
u drugi (što podržavaju praktično svi standardn kontejnerski tipovi). Funkcija “insert” je odabrana jer
neki kontejneri, poput skupa, ne podržavaju funkciju “push_back”, koja bi vjerovtatno bila prirodnija
(srećom, “push_back” se vrlo lako može simulirati pomoću “insert”). Isto tako, kao drugi parametar se
mora moći poslati bilo klasična funkcija, bilo obična lambda funkcija, bilo lambda zatvorenje.

Napisanu funkciju demonstrirajte u programskom isječku koji će od nekog skupa sa 4 elementa koji se
unose s tastature i nekog vektora sa 4 elementa koji se unose sa tastature napraviti novi skup odnosno
vektor koristeći funkciju koja računa sumu kvadrata svojih argumenata, i ispisati elemente tako
dobijenog novog skupa odnosno vektora na ekran. Dijalog između programa i korisnika treba izgledati
ovako (obratite pažnju na autosortiranje elemenata skupa):
Unesi 4 elementa skupa: 5 6 2 1
Unesi 4 elementa vektora: 3 4 5 2
Novi skup: 1 5 30 66
Novi vektor: 9 25 50 54

You might also like