Programowanie obiektowe 1

Zadanie 1

Co robi poniższa funkcja?
int zagadka(int a, int b)
{
        int c = 0;
        if(b < 0) { 
                a = -a;
                b = -b;
        }
        while(b > 0) { 
                c = c + a;
                b = b - 1;
        }
        return c;
}
Czy jest to dobra metoda?

Zadanie 2

Co wypisze poniższy program:
#include <iostream>
using namespace std;

int fun(int a[])
{
        int b;
        b=a[0]+a[1];
        return b;
}
int main(void)
{
        int a[2]={5,2};
        int b = 3;
        fun(a);
        cout << b << endl;
        return 0;
}

Zadanie 3

Dany jest poniższy fragment kodu w C++:
    {
        int nowe_a = a + b;
        int nowe_b = a - b;
        a = nowe_a;
        b = nowe_b;
    }
Powiemy że inny fragment kodu jest równoważny z danym jeśli dla dowolnych wartości zmiennych a i b przed wykonaniem fragmentu po wykonaniu wartości a i b zmienią się tak samo zaś inne zmienne zachowają wartości. Podaj fragment równoważny który używa tylko jedną zmienną pomocniczą i zawiera te same obliczenia. Uzasadnij że nie da się zrobić równoważnego fragmentu zawierającego te same instrukcje obliczeniowe (tzn. jedną operację dodawania i jedno odejmowanie) i nie używającego zmennych pomocniczych.

Zadanie 4

Napisz funkcję obliczającą przybliżoną wartość funkcji wykładniczej metodą obliczania sumy częściowej szeregu potęgowego. Sprawdź że metoda działa dla wartości argumentu bliskich zera. Spróbuj obliczyć w ten sposób wartości dla -10, -20, ..., -100. Czy powiększanie liczby wyrazów pomaga?

Zadanie 5

Napisz treść funkcji (zastąp kropki kodem) która dla zadanego wektora liczb całkowitych i liczby całkowitej k przesunie o k pozycji w prawo elementy wektora liczb całkowitych. Elementy na początku wektora należy zastąpić zerami. Wynik ma zastąpić (zniszczyć) elementy wektora wejściowego. Zakładamy że k jest nieujemne (nie sprawdzać tego).

#include 
using namespace std;

void
mininmum(vector <int> t, int k) {
...
}

Zadanie 6

Zapisz funkcję obliczającą liczby Fibonacciego jako funkcje rekursywną. Porównaj liczbę operacji z wersją iteracyjna. Napisz rekursywny wariant który zwraca strukturę zwierającą zarówno F(n) jak i F(n + 1). Uzasadnij że tą wersję można napisać tak by liczba wykonywanych operacji była proporcjonalna z wersją iteracyjną.

Zadanie 7

Największy wspólny dzielnik dwu liczb całkowitych spełnia następującą równość
NWD(a, a) = a
NWD(a, b) = NWD(r, b)
gdzie r jest resztą z dzielenia a przez b. Użyj tą równość do napisania rekursywnej procedury obliczania wspólnego dzielnika. Następnie przerób to na wersję z pętlą 'while'. Użyj bibliotekę GMP by móc obliczać wspólny dzielnik dużych liczb.