Uploaded by tcarbatushka228

Egzamin 13-14

advertisement
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
Download