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?
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.