You are on page 1of 2

Dr.

Željko Jurić: Tehnike programiranja /kroz programski jezik C++/ Akademska godina 2021/22
Primjer ispita (prema istinitom događaju, u nekim boljim vremenima) I parcijalni ispit

I parcijalni ispit iz predmeta “Tehnike programiranja”


(Primjer ispita, zasnovan na istinitom događaju)
Zadatak 1 (5 poena)
Prikažite tačan izgled ekrana na kraju izvršavanja ovog C++ programa, uz kratko obrazloženje zbog
čega su rezultati onakvi kakvi jesu (obrazloženja ne trebaju biti detaljna, potrebno je samo da se vidi
da rješenje nije prepisano, odnosno da ste na neki način došli do rezultata). Pretpostavite da su
uključene sve biblioteke koje su potrebne da bi se ovaj kod kompajlirao. Oprez: bitan je svaki razmak,
kao i prelasci u nove redove. Radi jasnoće, razmake prikažite kao kvadratiće.
std::function<int(int)> f(std::function<int(int, int)> g, int n) {
return [g, n](int x) { return g(g(x, n + 1), n - 1); };
}
template <typename T>
void g(T f, int &x, int y, int &z) {
f(x); f(y); f(z);
}
int main() {
int a = 3, b = 4, c = 5, d = 6;
g([&c](int x) { x++; c++; return x + c; }, a, a, a);
std::cout << a << " " << c << std::endl;
g([&d](int &x) { x++; d++; return x + d; }, b, b, b);
std::cout << b << " " << d << std::endl;
std::unique_ptr<int> p(new int[5]{3, 4, 2, 7, 1});
auto p1 = p.get() + 3;
for(int i = -2; i <= 1; i++) std::cout << p1[i] << " ";
std::cout << std::endl;
std::priority_queue<int> q;
q.push(3); q.push(5); q.push(2); q.push(8);
while(!q.empty()) { std::cout << q.top() << " "; q.pop(); }
std::cout << std::endl;
std::vector<int> v{3, 5, 2, 7, 6};
std::set<int> s{4, 8, 1, 6, 3, 4, 2, 8};
std::copy(s.rbegin(), s.rend(), std::inserter(v, v.begin() + 3));
for(auto x : v) std::cout << x << " ";
std::cout << std::endl;
std::cout << f([](double x, double y) { return 2 * x + 3 * y; }, 3)(2);
return 0;
}

Zadatak 2 (2,5 poena)


Neka je “v” neki vektor čiji su elementi liste cijelih brojeva (tj. tipa “std::vector<std::list<int>>”).
Napišite isječak programa u kojima ćete pozivom bibliotečke funkcije “sort” uz odgovarajuću funkciju
kriterija implementiranu kao lambda funkciju sortirati ovaj vektor u rastući poredak po sumi
elemenata u listama, tj. tako da u njemu liste sa manjom sumom elemenata dolaze prije listi sa većom
sumom elemenata (elementi unutar svake od listi ostaju u istom redoslijedu u kakvom su bili i prije
sotriranja). Po obavljenom sortiranju, treba ispisati sortirani vektor tako da se svaka lista ispisuje u
posebnom redu, pri čemu se elementi unutar jedne liste međusobno razdvajaju jednim razmakom.

Zadatak 3 (2,5 poena)


Napišite funkciju koja prihvata vektor cijelih brojeva (tipa "int"), a koja kao rezultat vraća vektor
logičkih vrijednosti iste dimenzije, pri čemu je 𝑖-ti element vektora koji se vraća kao rezultat logička
vrijednost “tačno” ukoliko se 𝑖-ti element ulaznog vektora moža prikazati kao kub nekog prirodnog
broja (recimo 216 = 6 ), a “netačno” u suprotnom. U slučaju da je neki od elemenata vektora
negativan, treba baciti izuzetak tipa "domain_error" sa proizvoljnim tekstom. Napišite i kratki isječak
programa u kojem ćete testirati napisanu funkciju sa fiksnim vektorom od 10 proizvoljnih elemenata
tipa "int", pri čemu ćete ispisati elemente vraćenog vektora odvojene razmakom. Obavezno predvidite
hvatanje eventualno bačenih izuzetaka.
Dr. Željko Jurić: Tehnike programiranja /kroz programski jezik C++/ Akademska godina 2021/22
Primjer ispita (prema istinitom događaju, u nekim boljim vremenima) I parcijalni ispit

Zadatak 4 (2,5 poena)


Napišite generičku funkciju “PopuniPoKriteriju” koja prihvata pet parametara , , , i 𝑓.
Parametri i omeđuju jedan blok podataka i mogu biti pokazivači ili iteratori, ali oba su istog
tipa, dok parametar (također pokazivač ili iterator) pokazuje na početak nekog odredišnog bloka.
Tip ne mora biti isti kao tip odnosno . Funkcija “PopuniPoKriteriju” treba da na svaki
element prvog bloka primijeni transformacionu funkciju 𝑓 (koja prima jedan argument) i da rezultate
transformacije upiše u drugi blok (pri čemu se pretpostavlja da u njemu ima dovoljno mjesta da
primi sve rezultate). U parametar treba smjestiti pokazivač odnosno iterator koji pokazuje tačno
iza posljednjeg elementa odredišnog bloka. Sama funkcija treba da kao rezultat vrati sumu svih
elemenata u izvornom bloku. Za iteratore se podrazumijeva da podržavaju samo osnovni skup operacija
koje moraju podržavati svi iteratori. Napisanu funkciju demonstrirajte u kratkom isječku programa
gdje se sa tastature unosi neki vektor cijelih brojeva, a zatim se pozivom napisane funkcije popunjava
neki dek kvadratima elemenata tog vektora, ali u obrnutom poretku elemenata. Na primjer, za
elemente vektora 1, 2 i 3, kreirani dek treba redom da sadrži 9, 4 i 1 (kao rezultat funkcije vraća se 6).
Korištenje umetača je dozvoljeno i poželjno.

Zadatak 5 (2,5 poena)


Predmetni nastavnik vodi evidenciju o svim studentima koji pohađaju kurs “Tehnike programiranja”.
Radi efikasnije manipulacije sa studentima, imena svih studenata se čuvaju u dinamički alociranim
objektima tipa “string” (svaki student u posebnom objektu), a adrese tih dinamički alociranih objekata
čuvaju se u nizu pokazivača koji je također dinamički alociran. Neki od tih pokazivača su neiskorišteni,
tj. postavljeni su na nul-pokazivač (to obično nastaje kada se neki od studenata ispiše). Napišite
funkciju za dodavanje novog studenta u evidenciju. Prvi parametar je pokazivač koji pokazuje na
opisani niz pokazivača, drugi parametar je ukupan broj pokazivača u tom nizu, dok je treći parametar
string koji predstavlja ime koje se dodaje. Dodavanje se obavlja ovako. Dinamički se alocira novi string,
koji je kopija stringa proslijeđenog kao parametar. Ukoliko u nizu postoji neki nul-pokazivač, njemu se
dodjeljuje adresa novokreiranog stringa, i dodavanje je gotovo. Ukoliko ne postoji niti jedan nul-
pokazivač, dinamički se alocira novi niz pokazivača čija je veličina za 10 elemenata veća od trenutnog
broja pokazivača, svi pokazivači iz starog niza se kopiraju u novi, “višak” pokazivača se postavlja na nul-
pokazivače, prvom nul-pokazivaču dodjeljuje adresa novokreiranog stringa, nakon čega se stari niz
pokazivača briše a prvi parametar funkcije se ažurira da pokazuje na novi niz pokazivača. Ukoliko neka
od alokacija ne uspije, treba baciti izuzetak tipa “logic_error” uz prateći tekst “Nedovoljno memorije”,
pazeći da ni u kom slučaju ne dođe do cirenja memorije, niti da budu izgubljeni podaci koji već postoje.

Zadatak 6 (2,5 poena)


Pod brojem unutar nekog stringa smatramo svaki njegov podstring koji se u cijelosti sastoji od cifara,
pri čemu se prije prvog znaka tog podstringa nalazi razmak, a iza posljednjeg znaka razmak ili
interpunkcijski znak (tj. nešto što nije ni slovo ni cifra), osim eventualno ako se taj podstring nalazi
na samom početku odnosno kraju stringa (u tom slučaju ne mora biti razmaka ispred odnosno
razmaka ili interpunkcijskog znaka iza). Na primjer, u stringu “120 hrabrih studenata izašlo na ispit,
35 ih je odustalo, ostalo ih 85...” nalaze se 3 broja, dok se u stringu “2PAC i U2 imaju koncert” ne
nalazi niti jedan broj. Napišite funkciju koja kao parametar prima neki string (tj. koji je tipa “string”),
a koja kao rezultat vraća vektor cijelih brojeva, čiji su elementi svi brojevi nađeni u datom stringu,
redom slijeva nadesno. Recimo, za prvi gore navedeni primjer, rezultirajući vektor treba da sadrži
redom elemente 120, 35 i 85.

Zadatak 7 (2,5 poena)


Napišite funkciju koja kao parametar prihvata matricu organiziranu kao vektor vektōrâ realnog tipa
(tipa "double") a kao rezultat vraća dek čiji su elementi također tipa "double". Funkcija treba da
transformira matricu proslijeđenu kao parametar na način da obrne elemente po redovima, tako da
prvi element svakog reda postane posljednji, drugi pretposljednji, itd. 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”. Osim obrtanja redova, koje se odvija
putem transformacije odgovarajućeg parametra, funkcija kao rezultat treba vratiti dek čiji je 𝑖-ti
element suma 𝑖-te kolone matrice. 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 (uključujući i hvatanje eventualno bačenog izuzetka).

You might also like