Imię i nazwisko:                                                                                                       28 czerwca 2006

 

Uwaga: W poniższym teście w każdym punkcie ilość poprawnych odpowiedzi wynosi od 0 do 4. Każdą z nich należy oznaczyć słowem „TAK”, a odpowiedź błędną – słowem „NIE”.

 

1.        Asercje można wyłączyć

a)       pisząc na początku  każdego pliku programu:
#include <cassert>
#define NDEBUG
...

b)       pisząc na początku  każdego pliku programu:
#define NDEBUG
#include <cassert>
...

c)       w kompilatorze gcc stosując dodatkową opcję kompilacji –DNDEBUG

d)       w kompilatorze gcc stosując dodatkową opcję kompilacji –DNOASSERT.

 

2.        Operator new tworzy obiekt

a)       na stercie (ang. heap) programu

b)       na stosie (ang. stack) programu

c)       w obszarze danych statycznych

d)       w obszarze zmiennych automatycznych

 

3.        Wartość wyrażenia (3&1) + (3|1) + (3^1) + (1%3) + 0x13 + (1 << 3)

a)       wynosi 26

b)       wynosi 28

c)       wynosi 30

d)       jest nieparzysta

 

4.        Następujące rodzaje funkcji mogą być funkcjami wirtualnymi:

a)       konstruktory;

b)       destruktory;

c)       metody statyczne;

d)       metody inline

5.        Rozpatrzmy funkcję
void X::Rectangle(RECT const& r, COLOR c) const
{
   ::Rectangle(*this, r.x0, r.y0, r.x1, r.y1, c);
}

a)       Ciało tej funkcji zawiera wywołanie globalnej funkcji Rectangle.

b)       Ciało tej funkcji zawiera wywołanie metody Rectangle klasy X.

c)       Typem wyrażenia *this jest const X.

d)       Funkcja::Rectangle nie może zmienić wartości obiektu *this.

6.        Jacek zdefiniował zmienną logiczną b w następujący sposób:
bool b = 3/4 > 0;

a)       Wartością b jest true.

b)       Wartością b jest false

c)       Wartość b jest nieokreślona (zależy od implementacji).

d)       Powyższe wyrażenie jest błędne (zawiera błąd składniowy).

 

7.        Instrukcję f(x) && g(x); można w każdym wypadku zastąpić instrukcją:

a)       g(x) && f(x);

b)       if (f(x))
   g(x);

c)       if (g(x))
   f(x);

d)       f(x), g(x);

 

8.        Tablicę tab, zdefiniowaną instrukcją
       char tab[100];
można użyć jako argumentu następujących  funkcji:

a)       char         fa(char arg[100]);

b)       void         fb(void *arg);

c)       char &       fc(char *arg);

d)       const char & fd(const char arg[]);

 

9.        Rozpatrzmy następującą deklarację:
int X::size(X& x) const;
Użyte w niej słówko const

a)       modyfikuje typ wyniku funkcji

b)       modyfikuje typ wskaźnika this (w definicji funkcji X::size(X& x) const)

c)       modyfikuje typ argumentu funkcji (tu: x)

d)       jest błędem składniowym.

10.     Rozpatrzmy następującą definicję:
struct X
{
    int _x;
    static int y;
    int f() const { return _x + y;}
};

a)       Ciało funkcji f można zapisać jako return this->_x + this->y;.

b)       Ciało funkcji f można zapisać jako return this->_x + y;.

c)       Ciało funkcji f można zapisać jako return this->_x + ::y;.

d)       Składowa y wymaga inicjalizacji poza definicją struktury X.

 

11.     Do włączenia diagnostycznej implementacji STL dostępnej w kompilatorze g++ wystarczy

a)       skompilować program z opcją -g

e)       skompilować program z opcją -DDEBUG

f)        skompilować program z opcją  -D_GLIBCXX_DEBUG

g)       skompilować program z opcją -lm

 

12.     Żeby wyłapać dowolny wyjątek w programie należy zdefiniować blok catch:

a)       catch (std::exception) { /*stosowny kod*/ }

b)       catch (...)            { /*stosowny kod*/ }

c)       catch (std::all)        { /*stosowny kod*/ }

d)       catch (std::this)       { /*stosowny kod*/ }

 

13.     Następująca instrukcja sortuje 100 pierwszych elementów wektora
std::vector<int> tab(1000)
:

a)       std::sort( tab, 100 );

b)       std::sort( tab, tab + 100 );

c)       std::sort( tab[0], tab[100] );

d)       std::sort( tab.begin(), tab.begin() + 100 );

 


14.     Rozpatrzmy funkcję f

int f(int x, unsigned int n)

{

  int y = 0;

 

  while (n--)

  {

    if (x & 1)

       y++;

    x >>= 1;

  }

  return y;

}

wartością f(3, 3) jest

a)       0

b)       1

c)       2

d)       3

 

15.     Można się spodziewać, że na drzewach czerwono-czarnych oparta jest implementacja klasy:

a)       std::map<T>

b)       std::deque<T>

c)    std::vector<T>

d)       __gnu_cxx::hash_map<T>

 

16.     W kompilatorze gcc opcja:

a)       –c nakazuje przerwanie kompilacji po utworzeniu pliku obiektowego

b)       –E nakazuje przerwanie kompilacji po przetworzeniu pliku preprocesorem

c)       –g dołącza do programu informacje potrzebne debugerowi

d)       –W3 włącza optymalizację kodu

 

17.     Aby móc dokonać konkretyzacji szablonu std::map<K, W> należy

a)       W klasie K zdefiniować operator< (lub jego odpowiednik)

b)       W klasie W zdefiniować operator< (lub jego odpowiednik)

c)       W klasie K zdefiniować operator!= (lub jego odpowiednik)

d)       W klasie W zdefiniować operator!= (lub jego odpowiednik)

 

18.      Do składowych umieszczonych w sekcji protected: klasy X dostęp mają:

a)       wyłącznie metody klasy X 

b)       wyłącznie metody klasy X oraz funkcje z nią zaprzyjaźnione

c)       wyłącznie metody klasy X, funkcje z nią zaprzyjaźnione oraz funkcje klas pochodnych

d)       wszystkie funkcje zawarte w pliku, w którym umieszczono definicję klasy X. 

 

19.     O destruktorach obiektów globalnych można powiedzieć, że:

a)       Wywołują się po zakończeniu funkcji main.

b)       Jeżeli zostanie w nich zgłoszony wyjątek, to nie będzie go można przechwycić w programie.

c)       Nie mogą być funkcjami wirtualnymi

d)       Nie mogą być analizowane programami diagnostycznymi (np. debugerami).

20.      

a)       Po wykonaniu instrukcji int x = 2/4; wartością x  jest 0.5.

b)       Po wykonaniu instrukcji unsigned int x = -2; wartością wyrażenia x > 0 jest true;

c)       Jeżeli w wyrażeniu x + y jeden ze składników jest typu unsigned, a drugi int, to wynik jest typu  int.

d)       Po wykonaniu instrukcji int x = -3.5; wartością x  jest -4.

Zadania

Rozwiązania proszę najpierw napisać na brudno i po sprawdzeniu przenieść na podpisaną kartkę z wersją „finalną”. Proszę zwrócić uwagę na sposób definiowania argumentów i wartości funkcji.

 

  1. Zdefiniuj funkcję, która dla dowolnego argumentu n typu int zwróci liczbę jedynek („ustawionych bitów”) w jego reprezentacji dwójkowej.
  2. Uruchomienie poniższego programu w moim komputerze kończy się jego padem. Wyjaśnij, co może być tego przyczyną i zaproponuj sposób poprawy błędu..

 

#include <iostream>

 

int main()

{

    int v[1000000];

    for (int i = 0; i < 1000000; ++i)

      v[i] = i;

}

         

  1. Napisz pętlę, która wyświetli wszystkie wartości przechowywane w obiekcie zdefiniowanym instrukcją
    std::map<int, int> s;

  2. Zaprojektuj klasę X jako klasę wyjątków wyprowadzonych z klasy std::exception.  Zaimplementuj (w dowolny sposób)  jej wirtualną składową const char *what() const.