ОО1/К2 2023 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Нова страница: {{tocright}} '''Neki rok 20XX. godine''' održan je XX. meseca i trajao je XX. {{rešenja}} <!-- Ukoliko postoji više grupa, dodati sekcije poput == Grupa A == a sekcije zadataka promeniti sa == X. zadatak == na === X. zadatak ===. --> <!-- Ukoliko se koristi za zadatke iz RM1, na vrhu dodati odeljke == Postavka == i == Mreže == za postavku zadatka i definisanje mreža koje postoje (nije deo postavke ali pomaže pri objašnjenju rešenja). --> == 1. zadatak ==…)
 
 
(Није приказано 13 међуизмена 2 корисника)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
'''Neki rok 20XX. godine''' održan je XX. meseca i trajao je XX.
'''K2 2023. godine''' održan je 12. meseca i trajao je 20min.
{{rešenja}}
{{rešenja}}


Ред 9: Ред 9:
Koje od sledećih operatora je moguće preklopiti za klasne tipove?
Koje od sledećih operatora je moguće preklopiti za klasne tipove?
<div class="abc-list" data-solution="multiple">
<div class="abc-list" data-solution="multiple">
# <span class="solution">''()'' (operator za poziv funkcija)</span>
# <span class="solution"><code>()</code> (operator za poziv funkcija)</span>
# <span class="solution">''->'' (operator za posredan pristup članovima klase preko pokazivača)</span>
# <span class="solution"><code>-></code> (operator za posredan pristup članovima klase preko pokazivača)</span>
# ''?:'' (operator za uslovni izraz)
# <code>?:</code> (operator za uslovni izraz)
# ''::'' (operator za razrešenje dosea)
# <code>::</code> (operator za razrešenje dosega)
# ''.'' (operator za pristup članu klase)
# <code>.</code> (operator za pristup članu klase)
</div>
</div>


Ред 27: Ред 27:
class A {
class A {
public:
public:
     friend const A& operator *(const A& a) {
     friend const A &operator*(const A &a) {
         cout << "1";
         cout << "1";
         return a;
         return a;
     }
     }
     friend const A& operator*(const A &a1, const A& a2) {
     friend const A &operator*(const A &a1, const A &a2) {
         cout << "2";
         cout << "2";
         return a1;
         return a1;
Ред 41: Ред 41:
     A **z = &y;
     A **z = &y;
     *x**y***z;
     *x**y***z;
    return 0;
}
}
</syntaxhighlight>
</syntaxhighlight>
Ред 50: Ред 49:
Šta važi za operator = na jeziku C++?
Šta važi za operator = na jeziku C++?
<div class="abc-list" data-solution="multiple">
<div class="abc-list" data-solution="multiple">
# <span class="solution">Ukoliko ne postoji premeštajuća varijanta operatora dodela (suspendovana je i implicitna premeštajuća dodela) u slučaju kada je desni operand nestajuća vrednost (eng. ''expiring value''), koristiće se postojeća kopirajuća varijanta operatora dodele</span>
# <span class="solution">Ukoliko ne postoji premeštajuća varijanta operatora dodele (suspendovana je i implicitna premeštajuća dodela) u slučaju kada je desni operand nestajuća vrednost (eng. ''expiring value''), koristiće se postojeća kopirajuća varijanta operatora dodele</span>
# Ukoliko operator nije eksplicitno definisan, na mestu poziva operatora će se pozvati konstruktor kopije
# Ukoliko operator nije eksplicitno definisan, na mestu poziva operatora će se pozvati konstruktor kopije
# <span class="solution">Postoji kopirajuća i premeštajuća varijanta operatora =</span>
# <span class="solution">Postoji kopirajuća i premeštajuća varijanta operatora =</span>
Ред 108: Ред 107:
Objašnjenje: <span class="spoiler" data-solution="explanation">Kada se poziva konstruktor klase A, njemu se prosleđuje kopija vrednost kk, pa nikakvi bočni efekti nemaju uticaj na kk iz konstruktora B. Zatim se u telu konstruktora B k inicijalizuje na kk, čime se gazi bilo kakva dodela iz konstruktora A, jer k je zaštićen član pa je dostupan i u klasi A i u klasi B</span>
Objašnjenje: <span class="spoiler" data-solution="explanation">Kada se poziva konstruktor klase A, njemu se prosleđuje kopija vrednost kk, pa nikakvi bočni efekti nemaju uticaj na kk iz konstruktora B. Zatim se u telu konstruktora B k inicijalizuje na kk, čime se gazi bilo kakva dodela iz konstruktora A, jer k je zaštićen član pa je dostupan i u klasi A i u klasi B</span>


== 6. zadatak ==
== 7. zadatak ==
Za dati kod napisanna programskom jeziku C++ odrediti za koje definicije metoda m u klasi B će se navedeni program ispravno izvršavati (biti bez greške u prevođenju i izvršavanju, ignorisati curenje memorije)
Za dati kod napisanna programskom jeziku C++ odrediti za koje definicije metoda m u klasi B će se navedeni program ispravno izvršavati (biti bez greške u prevođenju i izvršavanju, ignorisati curenje memorije)
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
Ред 129: Ред 128:
Izaberite jedan ili više odgovora odgovor:
Izaberite jedan ili više odgovora odgovor:
<div class="abc-list" data-solution="multiple">
<div class="abc-list" data-solution="multiple">
# void *m(A &a) override {return new B();}
# <syntaxhighlight inline lang="cpp">void *m(A &a) override {return new B();}</syntaxhighlight>
# <span class="solution">A *m(A &a) {return new B();}</span>
# <syntaxhighlight inline lang="cpp" class="solution">A *m(A &a) {return new B();}</syntaxhighlight>
# B *m(B &b) override {return new B();}
# <syntaxhighlight inline lang="cpp">B *m(B &b) override {return new B();}</syntaxhighlight>
# <span class="solution">B *m(A &a) override {return new B();}</span>
# <syntaxhighlight inline lang="cpp" class="solution">B *m(A &a) override {return new B();}</syntaxhighlight>
# <span class="solution">A *m(B &b) {return new B();}</span>
# <syntaxhighlight inline lang="cpp" class="solution">A *m(B &b) {return new B();}</syntaxhighlight>
</div>
</div>
Objašnjenje: <span class="spoiler" data-solution="explanation">Ako se redi nadjačavanje (override) potpis metoda mora biti identilan osim povratne vrednosti, koja ako je bila pokazivаč ili referenca na osnovnu klasu u osnovnom metodu, u nadjačanom metodu može biti referenca ili pokazivač na izvedenu klasu u nadjačanoj metodi. Ako nema ključne reči override onda se radi o preklapanju imena i potpis može biti proizvoljan.</span>
Objašnjenje: <span class="spoiler" data-solution="explanation">Ako se radi nadjačavanje (override) potpis metoda mora biti identičan osim povratne vrednosti, koja ako je bila pokazivаč ili referenca na osnovnu klasu u osnovnom metodu, u nadjačanom metodu može biti referenca ili pokazivač na izvedenu klasu. Ako nema ključne reči override potpis može biti proizvoljan, jer ako nije isti (ili skoro isti, sa gorenavedenim izuzetkom) samo će se izvršiti preklapanje imena.</span>


== 2. zadatak ==
== 8. zadatak ==
Ovako izgleda zadatak sa više tačnih odgovora od više ponuđenih (odgovori 1 i 3 su označeni kao tačni).
Šta ispisuje sledeći program na programskom jeziku C++?
<div class="abc-list" data-solution="multiple">
Napomena: Ukoliko smarate da se kod ne prevodi, upisati NP. Ukoliko smatrate da se dešava greška u izvršavanju upisati G.
# <span class="solution">Odgovor 1</span>
<syntaxhighlight lang="cpp">
# Odgovor 2
#include <iostream>
# <span class="solution">Odgovor 3</span>
using namespace std;
# Odgovor 4
class B {
</div>
public:
 
    B() { cout << "B"; }
== 3. zadatak ==
    ~B() { cout << "~B"; }
Ovako izgledaju zadaci sa odgovorima ponuđenim u padajućem meniju.
};
<div class="abc-list" data-solution="select" data-options="Odgovor 1, Odgovor 2, Odgovor 3">
class C : public B {
# Ponuđeno 1 <span class="spoiler">Odgovor 2</span>
public:
# Ponuđeno 2 <span class="spoiler">Odgovor 1</span>
    C() { cout << "C"; }
# Ponuđeno 3 <span class="spoiler">Odgovor 3</span>
    ~C() { cout << "~C"; }
</div>
};
 
int main() {
== 4. zadatak ==
    B *b = new C();
Ovako izgleda zadatak gde se od korisnika očekuje da unese tačan odgovor, recimo na to šta ispisuje neki kod:
     delete b;
<syntaxhighlight lang="java">
    return 0;
class Main {
    public static void main(String[] args) {
        System.out.println("Ovako izgleda blok koda.");
     }
}
}
</syntaxhighlight>
</syntaxhighlight>
Odgovor: <span class="spoiler" data-solution="text">Odgovor na pitanje iznad ide ovde</span>
Odgovor: <span class="spoiler" data-solution="text">BC~B</span>
 
Objašnjenje: <span class="spoiler" data-solution="explanation">Da bi se pozvao destruktor podklase preko pokazivača tipa nadklase, destruktor mora biti deklarisan kao virtuelan u nadklasi</span>
Objašnjenje: <span class="spoiler" data-solution="explanation">Ovakvi zadaci gotovo obavezno moraju da imaju objašnjenje ispod.</span>
 
== 5. zadatak ==
U zadatku može da postoji napomena na postavku ili rešenje zadatka.<ref>Ovako izgleda jedna napomena.</ref>
 
== 6. zadatak ==
 
== 7. zadatak ==
 
== 8. zadatak ==


== 9. zadatak ==
== 9. zadatak ==
Šta ispisuje sledeći program na programskom jeziku C++?
<syntaxhighlight lang="cpp">
#include <iostream>
#include <typeinfo.h>
using namespace std;
class A {public: virtual void m() {}};
class B : public A {};
class C : public B {};
int main() {
    A *pa = new B();
    B *pb = new C();
    B *b = dynamic_cast<B *>(pa);
    C *c = dynamic_cast<C *>(pa);
    C *d = dynamic_cast<C *>(pb);
    if (b == nullptr) cout << 'b';
    if (c == nullptr) cout << 'c';
    if (d == nullptr) cout << 'd';
}
</syntaxhighlight>
Izaberite jedan odgovor:
<div class="abc-list" data-solution="single">
# <span class="solution">c</span>
# d
# cd
# bcd
# baca se izuzetak bad_cast
</div>
Objašnjenje: <span class="spoiler" data-solution="explanation">Dynamic_cast proverava tip pokazivanog (referenciranog) objekta, zanemarujući tip pokazivača (reference) i ne dozvoljava downcast. Ako se downcast pokuša s pokazivačem vratiće nullptr, a ako se pokuša s referencom baciće bad_cast izuzetak. Niko živi ne zna koji će im typeinfo.h</span>


== 10. zadatak ==
== 10. zadatak ==
 
Kojim redosledom se izvršavaju konstr?uktori za klasu koja je izvedena iz više osnovnih klasa od kojih su neke virtuelne osnovne klase? Redosled je određen rastućim brojevima. Prvo se izvršava 1, pa 2...
== Napomene ==
<div class="abc-list" data-solution="select" data-options=" , Konstruktori nevirtuelnih osnovnih klasa, Telo konstruktora izvedene klase, Konstruktori atributa izvedene klase, Konstruktori virtuelnih osnovnih klasa">
<!-- Izbaciti ukoliko ne postoje napomene -->
# 1 <span class="spoiler">Konstruktori virtuelnih osnovnih klasa</span>
<references />
# 2 <span class="spoiler">Konstruktori nevirtuelnih osnovnih klasa</span>
# 3 <span class="spoiler">Konstruktori atributa izvedene klase</span>
# 4 <span class="spoiler">Telo konstruktora izvedene klase</span>
</div>


[[Категорија:Рокови]]
[[Категорија:Рокови]]
[[Категорија:ОО2]]<!-- Zameniti sa nazivom predmeta -->
[[Категорија:ОО1]]

Тренутна верзија на датум 28. април 2024. у 21:28

K2 2023. godine održan je 12. meseca i trajao je 20min.

  • За питања са више одговора, тачни одговори су подебљани и уоквирени
  • За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
  • Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:


1. zadatak

Koje od sledećih operatora je moguće preklopiti za klasne tipove?

  1. () (operator za poziv funkcija)
  2. -> (operator za posredan pristup članovima klase preko pokazivača)
  3. ?: (operator za uslovni izraz)
  4. :: (operator za razrešenje dosega)
  5. . (operator za pristup članu klase)

2. zadatak

Šta ispisuje sledeći program na programskom jeziku C++?

Napomena 1: Unarna varijanta operatora * ima viši prioritet u odnosu na binarnu

Napomena 2: Ukoliko smarate da se kod ne prevodi, upisati NP. Ukoliko smatrate da se dešava greška u izvršavanju upisati G.

#include <iostream>
using namespace std;
class A {
public:
    friend const A &operator*(const A &a) {
        cout << "1";
        return a;
    }
    friend const A &operator*(const A &a1, const A &a2) {
        cout << "2";
        return a1;
    }
};
int main() {
    A x;
    A *y = &x;
    A **z = &y;
    *x**y***z;
}

Odgovor: 122 Objašnjenje: Dati izraz se evaluira kao: (*x) * (*y) * (**z). Samo u *x slučaju se poziva unarni * nad const A&, a u ostalim podizrazima imamo preklopljen binarni operator * nad dve const A&

3. zadatak

Šta važi za operator = na jeziku C++?

  1. Ukoliko ne postoji premeštajuća varijanta operatora dodele (suspendovana je i implicitna premeštajuća dodela) u slučaju kada je desni operand nestajuća vrednost (eng. expiring value), koristiće se postojeća kopirajuća varijanta operatora dodele
  2. Ukoliko operator nije eksplicitno definisan, na mestu poziva operatora će se pozvati konstruktor kopije
  3. Postoji kopirajuća i premeštajuća varijanta operatora =
  4. Operator je moguće preklopiti kao nestatički metod klase
  5. Operator je moguće preklopiti kao globalnu prijateljsku funkciju

4. zadatak

Koje od navedenih osobina su zajedničke za preklapanje operatora -> i prefiksnog ++ operatora?

  1. Preklapanjem je mouće promeniti prioritet operatora
  2. Preklapaju se kao binarni operatori
  3. Preklapaju se kao unarni operatori
  4. Moraju da se preklope kao statički metod klse
  5. Tip rezultata mora biti jednak tipu operanda

5. zadatak

Koje tvrdnje su tačne za programski jezik C++?

  1. Prilikom konstrukcije objekta jednostruko izvedene klase prvo se izvrašava telo konstruktora izvedene klase
  2. Konstruktor jednostruko izvedene klase koji nije delegirajući mora u listi inicijalizatora imati inicijalizator osnovne klase ukoliko osnovna klasa nema podrazumevani konstruktor
  3. Ukoliko osnovna klasa ima podrazumevani konstruktor, tada se nikada neće izvršavati nijedan konstruktor osnovne klase prilikom konstrukcije objekta izvedene klase.
  4. Ukoliko osnovna klasa ima dostupan podrazumevani konstruktor, tada je moguće definisati konstruktor izvedene klase sa praznom listom inicijalizatora

6. zadatak

Šta ispisuje dati program na programskom jeziku C++?

#include <iostream>
using namespace std;
class A {
protected:
    int k;
public:
    A(int kk) : k(kk++) {
        k = ++kk;
    }
};
class B : public A {
public:
    B(int kk) : A(kk) { k = kk; }
    int dohvatiK() { return k; }
};
int main() {
    B b(2);
    cout << b.dohvatiK();
}

Izaberite jedan odgovor:

  1. 2
  2. Dati program se ne prevodi
  3. 3
  4. 4

Objašnjenje: Kada se poziva konstruktor klase A, njemu se prosleđuje kopija vrednost kk, pa nikakvi bočni efekti nemaju uticaj na kk iz konstruktora B. Zatim se u telu konstruktora B k inicijalizuje na kk, čime se gazi bilo kakva dodela iz konstruktora A, jer k je zaštićen član pa je dostupan i u klasi A i u klasi B

7. zadatak

Za dati kod napisanna programskom jeziku C++ odrediti za koje definicije metoda m u klasi B će se navedeni program ispravno izvršavati (biti bez greške u prevođenju i izvršavanju, ignorisati curenje memorije)

#include <iostream>
using namespace std;
class A {
public:
    virtual A* m(A& a) {return new A();}
};
class B : public A {
public:
    // ovde nedostaje definicija metoda m
};
int main() {
    B b;
    b.m(b);
    return 0;
}

Izaberite jedan ili više odgovora odgovor:

  1. void *m(A &a) override {return new B();}
  2. A *m(A &a) {return new B();}
  3. B *m(B &b) override {return new B();}
  4. B *m(A &a) override {return new B();}
  5. A *m(B &b) {return new B();}

Objašnjenje: Ako se radi nadjačavanje (override) potpis metoda mora biti identičan osim povratne vrednosti, koja ako je bila pokazivаč ili referenca na osnovnu klasu u osnovnom metodu, u nadjačanom metodu može biti referenca ili pokazivač na izvedenu klasu. Ako nema ključne reči override potpis može biti proizvoljan, jer ako nije isti (ili skoro isti, sa gorenavedenim izuzetkom) samo će se izvršiti preklapanje imena.

8. zadatak

Šta ispisuje sledeći program na programskom jeziku C++? Napomena: Ukoliko smarate da se kod ne prevodi, upisati NP. Ukoliko smatrate da se dešava greška u izvršavanju upisati G.

#include <iostream>
using namespace std;
class B {
public:
    B() { cout << "B"; }
    ~B() { cout << "~B"; }
};
class C : public B {
public:
    C() { cout << "C"; }
    ~C() { cout << "~C"; }
};
int main() {
    B *b = new C();
    delete b;
    return 0;
}

Odgovor: BC~B Objašnjenje: Da bi se pozvao destruktor podklase preko pokazivača tipa nadklase, destruktor mora biti deklarisan kao virtuelan u nadklasi

9. zadatak

Šta ispisuje sledeći program na programskom jeziku C++?

#include <iostream>
#include <typeinfo.h>
using namespace std;
class A {public: virtual void m() {}};
class B : public A {};
class C : public B {};
int main() {
    A *pa = new B();
    B *pb = new C();
    B *b = dynamic_cast<B *>(pa);
    C *c = dynamic_cast<C *>(pa);
    C *d = dynamic_cast<C *>(pb);
    if (b == nullptr) cout << 'b';
    if (c == nullptr) cout << 'c';
    if (d == nullptr) cout << 'd';
}

Izaberite jedan odgovor:

  1. c
  2. d
  3. cd
  4. bcd
  5. baca se izuzetak bad_cast

Objašnjenje: Dynamic_cast proverava tip pokazivanog (referenciranog) objekta, zanemarujući tip pokazivača (reference) i ne dozvoljava downcast. Ako se downcast pokuša s pokazivačem vratiće nullptr, a ako se pokuša s referencom baciće bad_cast izuzetak. Niko živi ne zna koji će im typeinfo.h

10. zadatak

Kojim redosledom se izvršavaju konstr?uktori za klasu koja je izvedena iz više osnovnih klasa od kojih su neke virtuelne osnovne klase? Redosled je određen rastućim brojevima. Prvo se izvršava 1, pa 2...

  1. 1 Konstruktori virtuelnih osnovnih klasa
  2. 2 Konstruktori nevirtuelnih osnovnih klasa
  3. 3 Konstruktori atributa izvedene klase
  4. 4 Telo konstruktora izvedene klase