Imię i nazwisko:                                                                                                             16 września 2002

 

 

1.      Jaki jest efekt zdefiniowania w programie makrodefinicji NDEBUG?



2.      Dlaczego treść plików nagłówkowych z zasady umieszcza się wewnątrz bloku makroinstrukcji
#ifndef TEREFERE_H
#define TEREFERE_H
...
#endif

 

3.      Zdefiniuj x jako stałą typu const int, która przyjmuje wartość -100, jeśli pewna zmienna y jest dodatnia, w przeciwnym zaś wypadku x przyjmuje wartość 0.

 

 

4.      Podaj (konkretny) przykład standardowej operacji, która może spowodować rzucenie wyjątku.


 

5.      Jaki jest wynik działania instrukcji
std::cout << (4&2) << (4|2) << (4 >> 2) << 0x24 << "\n";



6.      Podaj przykład dwóch instrukcji definiujących zmienne x i y  typu unsigned int takich, że spełniony jest warunek  assert(x && y && x + y == 0);

      unsigned int  x =                          ;
     
      unsigned
int y =                          ;

7.      Jaki błąd, którego nie wyłapie kompilator, popełnił Jacek, pisząc
x[i] = a[++i];



8.      Czym różni się '\n' od "\n"?



9.      Czym różnią się instrukcje cout << "\n"; od cout << endl; ?



10.   Co w poniższej definicji funkcji oznacza *this?
void X::Rectangle(RECT const& r, COLOR c) const
{
   ::Rectangle(*this, r.x0, r.y0, r.x1, r.y1, c);
}


11.   Jaki jest typ wyrażenia *this  w definicji funkcji z poprzedniego zadania?




12.   Podaj przykład funkcji, które nie mogą być rozwijane w miejscu wywołania ("inlining").


13.   Zapisz instrukcję for (int i = 0; i < 10; i++) { f(i); }  przy pomocy instrukcji while.







14.   Jaki efekt uboczny towarzyszy przekazywaniu wartości funkcji przez wartość, jeśli tą wartością jest obiekt typu zdefiniowanego przez użytkownika?




15.   Czy wyrażenie *p-- jest równoważne wyrażeniu(*p)--, czy też może *(p--)? Uwaga: za błędną odpowiedź tracisz punkt!


16.   Zadeklaruj f jako funkcję nie zwracającą żadnej wartości i pobierającą jeden argument całkowity (int) o wartości domyślnej 0.

 



17.   Czym różni się metoda std::vector<T>::resize() od std::vector<T>::reserve();
resize:


reserve:

18.   Napisz instrukcję, która przy pomocy pewnego standardowego algorytmu posortuje 333 pierwszych elementów tablicy int tablica[1000] w kolejności od najmniejszej do największej.



19.   Co oznacza typ void*?


20.   Oto deklaracja jednego ze standardowych algorytmów:
template<class Bi, class Bi2> Bi2 copy_backward (Bi first, Bi last, Bi2 res);
Co w niej oznacza identyfikator Bi?

 

21.   Podaj przykład wyrażenia, które generuje NaN.

 

 

 

22.   Przy pomocy deklaracji typedef zdefiniuj PFUNjako alternatywną nazwę funkcji zwracającej liczbę całkowitą
i pobierającą jako argument dwie liczby całkowite (int).

 

 

 

23.   Wszystkie wyjątki rzucane przez bibliotekę standardową są wyprowadzane z klasy std::exception, która posiada składową virtual const char *what() const, informującą  (werbalnie) o rodzaju wyjątku. Jaką korzyść uzyskujemy z faktu, że metoda ta jest wirtualna?

 

 

 

24.   Co w powyższej deklaracji funkcji what oznacza ostatnie słowo kluczowe const?



25.   Co w deklaracji funkcji what z pytania 23 oznacza pierwsze  słowo kluczowe const?



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ę inline void odwroc(unsigned long int & n), która w swoim argumencie n każdy bit zerowy zamienia na 1, a każdy bit równy 1 zamienia na 0.

2.      Proszę przeciążyć operator>>  tak, aby służył do wczytywania z dowolnego strumienia wszystkich elementów dowolnego kontenera typu std::vector<int>.  Elementy zapisywane są w następującym formacie: lewy nawias okrągły, kolejne elementy wektora oddzielone przecinkiem i spacją, prawy nawias okrągły. Przykładowy strumień wejściowy:

       (1, -10, 3, 17)

oznacza wektor o elementach 1, -10, 3 i 17. Załóż, że strumień wejściowy zapisany jest poprawnie (nie kontroluj poprawności danych). Przypomnij sobie o metodzie push_back standardowego wektora.

3.      Zdefiniuj szablon funkcji swap(x, y), która nadaje x dotychczasową wartość y, a y – dotychczasową wartość x. Zakładamy, że typy obu argumentów są takie same, acz a priori nieznane. Pamiętaj o poprawnym zadeklarowaniu argumentów!

4.      Zaimplementuj klasę Macierz, która reprezentuje macierz kwadratową liczb typu int. Rozmiar tablicy powinien być podawany w konstruktorze. Dostęp do elementu znajdującego się w wierszu n i kolumnie m powinien być zapewniany przez dwa dwuargumentowe operatory  operator(). Argumentami tych operatorów są oczywiście numery rzędu i kolumny danego elementu macierzy, indeksowane od 0.

5.      Do klasy z poprzedniego zadania dodaj drugi konstruktor, który oprócz rozmiaru macierzy pobierać będzie drugi argument – wskaźnik *pf na funkcję zwracającą liczbę całkowitą i pobierającą (przez wartość) dwa argumenty typu całkowitego. Użyj tej funkcji do zainicjowania w konstruktorze wartości elementów macierzy – element (i,j) powinien otrzymywać wartość pf(i,j).

6.    Oto błędna definicja algorytmu copy_backward przepisana z polskiego wydania podręcznika B. Stroustrupa
(Język C++, WNT, Warszawa 2000):

template<class Bi, class Bi2> Bi2 copy_backward (Bi first, Bi last, Bi2 res)
{
   while (first != last) *--res = *--first;
   return res;
}

Proszę poprawić powyższy kod tak, aby faktycznie odpowiadał algorytmowi copy_backward.