_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _
Imię i nazwisko Numer indeksu Login (SPOJ)
drukowanymi literami czas pisania: 45 minut
25 stycznia 2010
Zad. 1. Uzupełnij każde z wyróżnionych pól (używając od 1 do 10 znaków; nie używając średników, przecinków i spacji), tak aby poniższy kod stanowił poprawną definicję klasy, realizującej operacje push
i pop dla stosu liczb całkowitych. (9 pkt.)
class NewStack{
int *mem_block, top;
static const int MAX_SIZE = 1000;
public:
NewStack() {
mem_block = new int[MAX_SIZE];
top = -1;
}
~NewStack () { // destructor
delete[] mem_block;
}
void push (const int &value) {
if (top == MAX_SIZE-1) throw 1; // stack overflow
mem_block[++top] = value;
}
int pop();
};
int NewStack:: pop ([opcjonalnie: void]){
if (top == -1) throw 2; // stack underflow
return mem_block[top--];
}
Zad. 2. Dana jest funkcja recurse, zdefiniowana, jak poniżej. (5 pkt.)
int recurse (int p) { return (p>1) ? (2*recurse(p/2) + recurse(p-2)) : p; }
Jaka będzie wartość zwracana dla wywołania: recurse(2)? 2 recurse(6)? 12
Przy wywołaniu recurse(6), ile razy nastąpi uruchomienie funkcji recurse z wartością argumentu p równą: 0? 2 1? 4 2? 2 3? 1 4? 1 5? 0
Zad. 3. W wyróżnionych polach podaj tekst, który zostanie wypisany przy wykonaniu odpowiednich linii programu. (7 pkt.)
#include <cstdio>
void f1 (int x) { printf ("F1: %d\n", x++); }
void f2 (int y) { printf ("F2: %d\n", y--); }
void f3 (int&z) { printf ("F3: %d\n", z++); }
void (*f[])(int) = {f1,f2};
int main() {
int a = 7, b = a, *c = &b, *&d = c;
f1(*c++); F1: 7
f3(a); F3: 7
f2(b); F2: 7
f3(*d); F3: [dowolna liczba, ew. SIGSEGV]
f[1](2); F2: 2
f+(1); [pusto]
(*f)(1); F1: 1
}
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _
Imię i nazwisko Numer indeksu Login (SPOJ)
drukowanymi literami czas pisania: 45 minut
25 stycznia 2010
Zad. 1. Uzupełnij każde z wyróżnionych pól (używając od 1 do 10 znaków; nie używając średników, przecinków i spacji), tak aby poniższy kod stanowił poprawną definicję klasy, realizującej operacje push
i pop dla stosu liczb całkowitych nieujemnych. (9 pkt.)
class nw_stack{
unsigned *mem_block, top;
static const unsigned MAX_SIZE = 100;
public:
nw_stack () {
mem_block = new unsigned[MAX_SIZE];
top = 0;
}
~nw_stack () { // destructor
delete[] mem_block;
}
void push (const unsigned &number) {
if (top == MAX_SIZE) throw 1; // stack overflow
mem_block[top++] = number;
}
unsigned pop();
};
unsigned nw_stack:: pop ([opcjonalnie: void]){
if (top == 0) throw 2; // stack underflow
return mem_block[--top];
}
Zad. 2. Dana jest funkcja recurse, zdefiniowana, jak poniżej. (5 pkt.)
int recurse (int p) { return (p>1) ? (2*recurse(p/3) + recurse(p-1)) : p; }
Jaka będzie wartość zwracana dla wywołania: recurse(2)? 1 recurse(6)? 9
Przy wywołaniu recurse(6), ile razy nastąpi uruchomienie funkcji recurse z wartością argumentu p równą: 0? 2 1? 5 2? 2 3? 1 4? 1 5? 1
Zad. 3. W wyróżnionych polach podaj tekst, który zostanie wypisany przy wykonaniu odpowiednich linii programu. (7 pkt.)
#include <cstdio>
void f1 (int x) { printf ("A: %d\n", x--); }
void f2 (int y) { printf ("B: %d\n", y--); }
void f3 (int&z) { printf ("C: %d\n", z++); }
void (*f[])(int) = {f1,f2};
int main() {
int a = 5, b = a, *c = &b, *&d = c;
f1(*c++); A: 5
f3(a); C: 5
f2(b); B: 5
f3(*d); C: [dowolna liczba, ew. SIGSEGV]
(*f)(4); A: 4
f+(3); [pusto]
f[1](2); B: 2
}