ОО1/Фебруар 2021 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Februarski rok (po sećanju `<@127345521789501440>`))
 
 
(Нису приказане 4 међуизмене 2 корисника)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
* Za pitanja sa više odgovora, tačni odgovori su <span class="solution-example">podebljani i uokvireni</span>.
{{rešenja}}
* Za pitanja za koje se odgovori unose, tačni odgovori su podvučeni i sakriveni: <span class="spoiler-example">ovako</span>.
* Pritisnite na sledeće dugme kako biste ih sakrili ili otkrili: <span class="unhide-spoilers unhide-solutions"></span>


== 1. zadatak ==
== 1. zadatak ==
Šta najbolje opisuje pojam "apstrakcija":
Koja od navedenih definicija najbolje odgovara ''apstrakciji'' kao elementnu objektno orijentisanog stila programiranja?
<div class="abc-list">
<div class="abc-list" data-solution="single">
# Odvajanje ugovora od implementacije
# Odvajanje interfejsa klase od njene implementacije koja se sakriva od korisnika.
# <span class="solution">Izdvajanje i grupisanje zajedničkih osobina</span>
# <span class="solution">Prepoznavanje bitnih svojstava skupova sličnih objekata i opisivanje zajedničkom klasom.</span>
# Kreiranje apstraktnih klasa i metoda
# Mogućnost kreiranja apstraktnih klasa i funkcija članica.
# ...
# Pristupačnost određenim članovima klase navođenjem prava pristupa.
</div>
</div>


== 2. zadatak ==
== 2. zadatak ==
U sledećem programu na programskom jeziku C++, koji je tip promenljive <code>p</code>?
Koji je tip promenljive <code>i</code> u sledećem isečku koda napisanom na jeziku C++?
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
const int k = 1;
const int j = 1;
const auto j = k;
const auto k = j;
auto p = new int + k;
auto i = new int + k;
</syntaxhighlight>
</syntaxhighlight>
<div class="abc-list">
<div class="abc-list" data-solution="single">
# <span class="solution"><syntaxhighlight lang="cpp" inline>int*</syntaxhighlight></span>
# <syntaxhighlight lang="cpp" inline>const int*</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>const int*</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline class="solution">int*</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>int</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>int</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>const int* const</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>const int</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>const int</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>const int* const</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>int *const</syntaxhighlight>
</div>
</div>
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Tip promenljive <code>k</code> će biti <code>const int</code>, jer joj se samo dodeljuje <code>j</code>, ali će tip <code>i</code> biti <code>int*</code> jer operator <code>new</code> vraća pokazivač koji nije konstantan i na njega se samo dodaje pomeraj <code>k</code>.</span>


== 3. zadatak ==
== 3. zadatak ==
U metodi <code>m</code> koji je tip pokazivača <code>this</code>?
U klasi <code>X</code> je definisan metod <code>m</code>.
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
class X
class X {
{
public:
void m() const {};
void m(X *x) const {}
};
};
</syntaxhighlight>
</syntaxhighlight>
<div class="abc-list">
Kog tipa je pokazivač <code>this</code> u metodu <code>m</code>?
<div class="abc-list" data-solution="single">
# <syntaxhighlight lang="cpp" inline class="solution">const X * const</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>X*</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>X*</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>const X*</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>X * const</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>X*const</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>X</syntaxhighlight>
# <span class="solution"><syntaxhighlight lang="cpp" inline>const X*const</syntaxhighlight></span>
# <syntaxhighlight lang="cpp" inline>const X *</syntaxhighlight>
</div>
</div>
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Pokazivač <code>this</code> ne može da se menja, pa je podrazumevano tipa <code>X* const</code>. Kada se doda <code>const</code> modifikator na metodu <code>m</code>, to znači da polja objekta ne mogu da se menjaju unutar metode i zato taj pokazivač postaje <code>const X* const</code>.</span>


== 4. zadatak ==
== 4. zadatak ==
Koji od sledećih tvrđenja su tačni za statičke metode klase X:
Koji od sledećih tvrđenja su tačni za statičke metode klase X:
<div class="abc-list">
<div class="abc-list" data-solution="multiple">
# <span class="solution">Nemaju pokazivač <code>this</code></span>
# <span class="solution">Nemaju pokazivač <code>this</code></span>
# <span class="solution">Imaju pravo pristupa svim članovima X</span>
# <span class="solution">Imaju pravo pristupa svim članovima X</span>
Ред 54: Ред 57:


== 5. zadatak ==
== 5. zadatak ==
Šta ispisuje sledeći program na programskom jeziku C++? Ukoliko se program ne prevodi uneti NP, a ukoliko dođe do greške pri izvršavanju uneti X.
Šta ispisuje sledeći program na programskom jeziku C++? (Ukoliko smatrate da se program ne prevodi, unesite NP. Ukoliko smatrate da dolazi do greške pri izvršavanju, unesite X)
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
#include <iostream>
#include <iostream>
Ред 60: Ред 63:


int main() {
int main() {
int niz[] = {1, 2, 3};
int brojevi[] = {1, 2, 3};
int* p = niz;
int* pk = brojevi;
p++;
pk++;
int& ref = *p;
int& ref = *pk;
ref++;
ref++;
cout << niz[0] << niz[1] << niz[2];
cout << brojevi[0] << brojevi[1] << brojevi[2];
    return 0;
}
}
</syntaxhighlight>
</syntaxhighlight>
Rešenje: <span class="spoiler">133</span>
'''Rešenje:''' <span class="spoiler" data-solution="text">133</span>
 
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Pokazivač <code>pk</code> će na početku pokazivati na početak niza <code>brojevi</code>, zatim biti uvećan za 1 pa će pokazivati na drugi element niza. Referenca <code>ref</code> od stvaranja pokazuje na isti element kao <code>pk</code>, ali se primenom operatora <code>++</code> nad referencom ne menja njena lokacija (jer se ona ne može promeniti) nego vrednost člana niza na koji pokazuje, pa će u nizu biti brojevi 1, 3 i 3 koji se ispod i ispisuju.</span>


== 6. zadatak ==
== 6. zadatak ==
Koji je tip argumenta premeštajućeg operatora dodele klase X?
Kog tipa je parametar premeštajućeg operatora dodele za klasu X?


Rešenje: <span class="spoiler">X&&</span>
Rešenje: <span class="spoiler" data-solution="text">X&&</span>


== 7. zadatak ==
== 7. zadatak ==
Koji su sve ispravni parametri šablona nespecijalizovane generičke klase ili metode:
Koji od ponuđenih prefiksa opšte (nespecijalizovane) šablonske (genreičke<sup>[sic]</sup>) funkcije ili klase su ispravni?
<div class="abc-list">
<div class="abc-list" data-solution="multiple">
# <syntaxhighlight lang="cpp" inline class="solution">template<typename T></syntaxhighlight>
# <syntaxhighlight lang="cpp" inline class="solution">template<typename T, int N></syntaxhighlight>
# <syntaxhighlight lang="cpp" inline class="solution">template<int N></syntaxhighlight>
# <syntaxhighlight lang="cpp" inline class="solution">template<typename T, typename U></syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>template<></syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>template<></syntaxhighlight>
# <span class="solution"><syntaxhighlight lang="cpp" inline>template<typename T></syntaxhighlight></span>
# <span class="solution"><syntaxhighlight lang="cpp" inline>template<typename T, typename U></syntaxhighlight></span>
# <span class="solution"><syntaxhighlight lang="cpp" inline>template<int N></syntaxhighlight></span>
# <span class="solution"><syntaxhighlight lang="cpp" inline>template<typename T, int N></syntaxhighlight></span>
</div>
</div>
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation"><code>template<></code> se može koristiti samo za specijalizacije šablona.</span>


== 8. zadatak ==
== 8. zadatak ==
Koji su pravilni načini izvođenja klase B iz klase A?
Na koje sve načine je moguće definisati klasu B izvedenu iz klase A?
<div class="abc-list">
<div class="abc-list" data-solution="multiple">
# <span class="solution"><syntaxhighlight lang="cpp" inline>class B: A {...};</syntaxhighlight></span>
# <syntaxhighlight lang="cpp" inline class="solution">class B : virtual A {...};</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>class B: override A {...};</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>class B : protected public A {...};</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>class B: private protected A {...};</syntaxhighlight>
# <syntaxhighlight lang="cpp" inline>class B : override A {...};</syntaxhighlight>
# <span class="solution"><syntaxhighlight lang="cpp" inline>class B: private A {...};</syntaxhighlight></span>
# <syntaxhighlight lang="cpp" inline class="solution">class B : A {...};</syntaxhighlight>
# <span class="solution"><syntaxhighlight lang="cpp" inline>class B: public A {...};</syntaxhighlight></span>
# <syntaxhighlight lang="cpp" inline class="solution">class B : public A {...};</syntaxhighlight>
</div>
</div>


Ред 128: Ред 135:
}
}
</syntaxhighlight>
</syntaxhighlight>
Rešenje: <span class="spoiler">12150</span>
'''Rešenje:''' <span class="spoiler" data-solution="text">12150</span>
 
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Prve dve metode će biti pozvane regularno nad klasama A i B. Poziv nevirtuelne metode nad pokazivačem na klasu A, iako zapravo pokazuje na izvedenu klasu B, će pozvati metodu klase A. Na kraju se poziva <code>operator<<</code> iz osnovne klase, koji preko reference na klasu A ispisuje vrednosti polja <code>a</code> osnovnih klasa (za objekat klase A ispisuje njegovo polje a, dok za objekat klase B ispisuje polje a njegovog podobjekta klase A) jer, iako se pristupa preko reference, pristup poljima nikada ne koristi virtuelni mehanizam.</span>


== 10. zadatak ==
== 10. zadatak ==
Ред 156: Ред 165:
}
}
</syntaxhighlight>
</syntaxhighlight>
Rešenje: <span class="spoiler">34</span>
'''Rešenje:''' <span class="spoiler" data-solution="text">34</span>
 
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Hvatanje po referenci neće uhvatiti izuzetak tipa pokazivača na klasu <code>IzuzI</code>, pa se poziva opšti rukovaoc greškama koji ispisuje 3 i ponovo baca grešku. Nakon toga, prvi sledeći rukovaoc će uhvatiti grešku jer je greška pokazivačkog tipa na tip koji može standardno da se konvertuje u pokazivački tip rukovaoca i ispisaće 4.</span>


[[Категорија:Рокови]]
[[Категорија:Рокови]]
[[Категорија:ОО1]]
[[Категорија:ОО1]]

Тренутна верзија на датум 7. јануар 2022. у 23:38

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

1. zadatak

Koja od navedenih definicija najbolje odgovara apstrakciji kao elementnu objektno orijentisanog stila programiranja?

  1. Odvajanje interfejsa klase od njene implementacije koja se sakriva od korisnika.
  2. Prepoznavanje bitnih svojstava skupova sličnih objekata i opisivanje zajedničkom klasom.
  3. Mogućnost kreiranja apstraktnih klasa i funkcija članica.
  4. Pristupačnost određenim članovima klase navođenjem prava pristupa.

2. zadatak

Koji je tip promenljive i u sledećem isečku koda napisanom na jeziku C++?

const int j = 1;
const auto k = j;
auto i = new int + k;
  1. const int*
  2. int*
  3. int
  4. const int* const
  5. const int
  6. int *const

Objašnjenje: Tip promenljive k će biti const int, jer joj se samo dodeljuje j, ali će tip i biti int* jer operator new vraća pokazivač koji nije konstantan i na njega se samo dodaje pomeraj k.

3. zadatak

U klasi X je definisan metod m.

class X {
public:
	void m(X *x) const {}
};

Kog tipa je pokazivač this u metodu m?

  1. const X * const
  2. X*
  3. X * const
  4. X
  5. const X *

Objašnjenje: Pokazivač this ne može da se menja, pa je podrazumevano tipa X* const. Kada se doda const modifikator na metodu m, to znači da polja objekta ne mogu da se menjaju unutar metode i zato taj pokazivač postaje const X* const.

4. zadatak

Koji od sledećih tvrđenja su tačni za statičke metode klase X:

  1. Nemaju pokazivač this
  2. Imaju pravo pristupa svim članovima X
  3. Imaju javno pravo pristupa nezavisno od sekcije u kojoj se nalaze
  4. Mogu da pristupaju statičkim atributima i funkcijama prostim imenovanjem
  5. Moraju se definisati van tela klase

5. zadatak

Šta ispisuje sledeći program na programskom jeziku C++? (Ukoliko smatrate da se program ne prevodi, unesite NP. Ukoliko smatrate da dolazi do greške pri izvršavanju, unesite X)

#include <iostream>
using namespace std;

int main() {
	int brojevi[] = {1, 2, 3};
	int* pk = brojevi;
	pk++;
	int& ref = *pk;
	ref++;
	cout << brojevi[0] << brojevi[1] << brojevi[2];
    return 0;
}

Rešenje: 133

Objašnjenje: Pokazivač pk će na početku pokazivati na početak niza brojevi, zatim biti uvećan za 1 pa će pokazivati na drugi element niza. Referenca ref od stvaranja pokazuje na isti element kao pk, ali se primenom operatora ++ nad referencom ne menja njena lokacija (jer se ona ne može promeniti) nego vrednost člana niza na koji pokazuje, pa će u nizu biti brojevi 1, 3 i 3 koji se ispod i ispisuju.

6. zadatak

Kog tipa je parametar premeštajućeg operatora dodele za klasu X?

Rešenje: X&&

7. zadatak

Koji od ponuđenih prefiksa opšte (nespecijalizovane) šablonske (genreičke[sic]) funkcije ili klase su ispravni?

  1. template<typename T>
  2. template<typename T, int N>
  3. template<int N>
  4. template<typename T, typename U>
  5. template<>

Objašnjenje: template<> se može koristiti samo za specijalizacije šablona.

8. zadatak

Na koje sve načine je moguće definisati klasu B izvedenu iz klase A?

  1. class B : virtual A {...};
  2. class B : protected public A {...};
  3. class B : override A {...};
  4. class B : A {...};
  5. class B : public A {...};

9. zadatak

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

#include <iostream>
using namespace std;

class A {
private:
    int a;
public:
    A(int aa=0) : a(aa) {}
    void m() { cout << 1; }
    friend ostream& operator<<(ostream& os,const A& a) { return os << a.a; } 
};

class B: public A{
private:
    int a;
public:
    B(int aa) : a(aa) {}
    int m() { cout << 2; return 2; }
};

int main() {
    A a(5);
    B b(7);
    A* ap = &b;
    a.m();
    b.m();
    ap->m();
    cout << a << b;
}

Rešenje: 12150

Objašnjenje: Prve dve metode će biti pozvane regularno nad klasama A i B. Poziv nevirtuelne metode nad pokazivačem na klasu A, iako zapravo pokazuje na izvedenu klasu B, će pozvati metodu klase A. Na kraju se poziva operator<< iz osnovne klase, koji preko reference na klasu A ispisuje vrednosti polja a osnovnih klasa (za objekat klase A ispisuje njegovo polje a, dok za objekat klase B ispisuje polje a njegovog podobjekta klase A) jer, iako se pristupa preko reference, pristup poljima nikada ne koristi virtuelni mehanizam.

10. zadatak

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

#include <iostream>
using namespace std;

class IzuzO {};
class IzuzI : public IzuzO {};

int main() {
	try
	{
		try
		{
			throw new IzuzI();
		}
		catch (IzuzI&) { cout << 1; }
		catch (IzuzO&) { cout << 2; }
		catch (...) { cout << 3; throw; }
	}
	catch (IzuzO*) { cout << 4; }
	catch (IzuzI*) { cout << 5; }
	catch (...) { cout << 6; }
	return 0;
}

Rešenje: 34

Objašnjenje: Hvatanje po referenci neće uhvatiti izuzetak tipa pokazivača na klasu IzuzI, pa se poziva opšti rukovaoc greškama koji ispisuje 3 i ponovo baca grešku. Nakon toga, prvi sledeći rukovaoc će uhvatiti grešku jer je greška pokazivačkog tipa na tip koji može standardno da se konvertuje u pokazivački tip rukovaoca i ispisaće 4.