PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Wszystkie wymagane algorytmy należy pisać w języku C lub C++. Drobne potknięcia językowe nie będą brane pod uwagę. Użycie języka naturalnego poza komentarzem będzie niżej punktowane. Proszę pisać czytelnie, nieczytelne rozwiązanie może zostać niezrozumiane i niżej ocenione. Łączna liczba punktów do zdobycia to 50. Czas trwania 2:30. Powodzenia! Zadanie 1. Liczby (4 pkt) a. Dany jest rejestr 8 bitowy przechowujący liczby całkowite w kodzie uzupełnieniowym do 2. W rejestrze jest FA. Podaj dziesiętną wartość zapisanej w nim liczby. b. Dany jest zmiennoprzecinkowy rejestr 16 bitowy. Mantysa 12-bitowa zakodowana jest kodem znak moduł prosty z normalizacją typu 2, tzn. 1 <= |mantysa| < 2 (uwaga: kodowana jest tylko część ułamkowa mantysy). Cecha 4-bitowa zakodowana jest kodem nadmiarowym z nadmiarem równym +7. 13 . Podaj szesnastkową reprezentację rejestru, do którego zakodowano liczbę −81 128 znak cecha 4 bity Egzamin mantysa 11 bitów Strona 1/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Zadanie 2. Sortowanie (6 pkt) a. (4pkt) Napisz funkcję sort(int T[], int n, int k), która sortuje zadaną nelementową tablicę liczb T metodą sortowania przez wstawianie według k-tego bitu. Bity liczone są od 0 od końca liczby. W przypadku tej samej wartości k-tego bitu, liczby ustawiane są w kolejności rosnącej. Przykład Dla danych wejściowych: int T[] = {16, 7, 15, 3} sort(T, 4, 2); Wartości tablicy T po sortowaniu: 3 16 7 15 Wersja za 3 pkt Napisz funkcję sort(int T[], int n) sortującą n-elementową tablicę liczb T rosnąco metodą sortowania przez wstawianie. b. (2pkt) Które z poniższych podpunktów są prawdziwe: Dla każdej tablicy wejściowej długości n a. sortowanie przez wstawianie działa w czasie O(n2 ). b. sortowanie przez wstawianie działa w czasie O(n). c. sortowanie przez wstawianie działa w czasie Ω(n2 ). d. sortowanie przez wstawianie działa w czasie Ω(n). Egzamin Strona 2/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Zadanie 3. Deklaracje (2 pkt) a. Zadeklaruj wskaźnik na wskaźnik na 8-bajtową liczbę całkowitą. b. Zadeklaruj 10 elementową tablicę wskaźników na funkcje zwracające wskaźnik na int oraz przyjmujące jako parametr referencję do 4-bajtowej liczby rzeczywistej oraz wskaźnik na 2 bajtową liczbę całkowitą. Zadanie 4. Wskaźniki (3 pkt) 1. Zadeklarowana jest tablica long long int N[20]. Nie używając operatorów [,] wypisz zawartość komórki N[7]. 2. Zadeklarowana jest tablica int M[100][100]. Nie używając operatorów [,] wypisz zawartość komórki M[2][8]. 3. Zadeklarowano dwie zmienne: float t[30]; float *w; Które z poniższych przypisań są poprawne? a. *t = *w; b. *w = t; c. w = &t[1] d. *w = t[0]; e. w = t; f. t = w; Egzamin Strona 3/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Zadanie 5. Operatory (3 pkt) Poniżej znajduje się fragment programu wykorzystującego klasę table. Uzupełnij definicje tej klasy, tak, aby poniższy program kompilował się i prawidłowo realizował zadania opisane w komentarzach. #include<iostream> using namespace std; class table { int *t; int n; public: int main() { //tworzy nowa tablicę na 10 elementów table a(10); //wczytuje liczby do tablicy a.t for (int i=0; i<10; i++) cin >> a[i]; //wypisuje oddzielone spacją liczby z a.t cout << a << endl; }; return 0; }; Wersja za 1 pkt Dana jest poniższa klasa point. Przeładuj operator dodawania, tak, aby w wyniku poniższego programu na ekranie pojawiły się liczby 8 9. #include<iostream> using namespace std; class point { int x; int y; public: point(int a=0, int b=0) { x = a; y = b; }; void print() { cout << x << " " << y << endl; } }; Egzamin int main() { point A(3,4), B(5,5); point C = A + B; C.print(); return 0; } Strona 4/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Zadanie 6. Metody klasy (3 pkt) Co zostanie wypisane na ekranie w wyniku działania poniższego programu? #include<iostream> using namespace std; class ekran { int a; public: ekran (int aa=0) { a=aa; cout << "nowy "<< a << endl; } ekran (const ekran & e) { a = e.a; cout << "kopia " << a << endl; } ~ekran ( ) { cout << "kasowany " << a << endl; } void operator=(const ekran & e) { a = e.a; cout << "przypisanie " << a << endl; } int getA() {return a;} }; int wlacz(ekran e) { cout << "wlacz " << e.getA() << endl; ekran wylacz(ekran & e) { } cout << "wylacz " << e.getA() << endl; return e; } ekran e(3); int main() { ekran x(9); ekran y = e; wlacz(x); wylacz(y); return 0; } Egzamin Strona 5/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Zadanie 7. Błędy (4 · 2 = 8 pkt) Poniżej przedstawione są kody zapisane i kompilujące sie w języku C++. Nie działają one poprawnie. Wyjaśnij na czym polegają błędy w każdym z przykładów i popraw kody. a. Funkcja zwraca wskaźnik na ostatni element mniejszy lub równy x, o ile taki istnieje w tablicy wskazywanej przez zmienną begin, wskaźnik end wskazuje element za ostatnim, tzn pierwsza komórkę pamięci znajdująca się za tablicą. Tablica przekazywana do funkcji jest posortowana niemalejąco. int* lower_bound(int* begin, int* end, int x) { int n=end-begin; int p=n; while (p>0) { int s = p/2; if (x < begin[s]) begin += s; else p = s; } return begin; } b. Usuwanie pierwszego elementu z listy wskaźnikowej jednokierunkowej bez głowy. struct person { int x, y; person* next; }; void clean(person* list) { if (list!=NULL) { person* temp = list; list = list->next; delete temp; } } Egzamin Strona 6/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. c. Deklaracja i praca z tablicą dwuwymiarową T. int **T; int n, m, i, j; scanf("%d %d",&n,&m); T = (int**) malloc(n*sizeof(**T)); for (i=0;i<n;++i) T[i] = (int*) malloc(m*sizeof(*T)); for (i=0;i<n;++i) for (j=0;j<m;j++) scanf("%d",&T[i][j]); for (i=0;i<n;++i) for (j=0;j<m;j++) printf("%d ",T[i][j]); for(i=0;i<n;++i) free(T[i]); free(T); d. Klasa z tablicą dynamiczną. #include<iostream> using namespace std; class mapa { int *t; int m; public: mapa(int k) { m = k; t = new int[m]; } ~mapa() { delete [] t; }; Egzamin int main() { mapa M(10), N(20); M = N; return 0; } } Strona 7/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Zadanie 8. Scalanie list (6 pkt) struct node { int x; node* next; node* prev; }; class list { node* first; node* last; public: list () }; { first = NULL; last = NULL; } Dane są dwie listy typu list. Każda z list składa się z różnych elementów posortowanych wg pola x ściśle rosnąco. Dopisz do klasy list metodę merge, która jako parametr otrzymuje stałą referencję do obiektu klasy list. Metoda ta dołącza do aktualnej listy, elementy listy otrzymanej jako parametr z wyjątkiem elementów, które się powtarzają. Lista, po wykonaniu metody merge nadal jest listą posortowaną zawierająca różne elementy. Lista będąca parametrem nie ulega zmianie. Egzamin Strona 8/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Zadanie 9. ONP (2+2 = 4 pkt) a. Poniższe wyrażenie zapisz w Odwrotnej Notacji Polskiej: z = ( b+c−e·d + g 3 · (3 + 5 · e)4 )2 f b. Pewne wyrażenie arytmetyczne przekształcono do Odwrotnej Notacji Polskiej i uzyskano napis: xykl+s+2n*/xy+^*+z2^+3^. Jakie to było wyrażenie? Zadanie 10. Notacje (3 pkt) Zdecyduj, które zdania są prawdziwe. Napisz obok każdego z nich T (gdy prawdziwe) lub N (gdy nieprawdziwe). ...... 7nlogn + 3n + 1 ∈ O(n2 ) ...... 7n + 4n2 logn ∈ O(6n ) ...... 5n3 + 5n2 ∈ Θ(n2 ) ...... 4n + n! ∈ Θ(4n ) ...... 3n2 + 5nlogn + 3n ∈ Ω(n3 ) ...... 4n2 + 3n ∈ Ω(nlogn) Egzamin Strona 9/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Podstawy programowania (PP) Egzamin Nazwisko i imię: ............................................................. Zadanie 11. Złożoność (2 pkt) Wskaz operacje dominujące oraz wyznacz złożoność poniższego algorytmu wyrażoną w notacji Θ. Odpowiedź uzasadnij. int count(int n, int A[]) { int s = n; while (s) { for(int b = 0; b < s; b++ ) { for (int i = b+s; i < n; i += s) { if (A[i] < A[i+h]) x++; } } s >>= 1; } return x; } Zadanie 12. Niezmienniki (6 pkt) Jaka wartość znajduję się w zmiennej i po wykonaniu algorytmu? Znajdź i udowodnij niezmienniki postaci: a = f (i), b = g(i). Następnie, wykorzystując niezmienniki uzasadnij wynik działania programu. Jaka jest złożoność programu wyrażona w notacji Θ?. int count(int n) { // założenie n >= 0 int a = 1; int b = 6; int i = 1; while (a<n) { a = a + b + 1; b = b + 6i + 6; i = i + 1; } return i; } Egzamin Strona 10/12 PP Podstawy programowania Semestr zimowy 2013/2014 Kraków 10 lutego 2014 Brudnopis Egzamin Strona 11/12