Programowanie obiektowe 1
Zadanie 1
a) Oblicz ilości działań arytmetycznych potrzebnych do
obliczenia wartości wielomianu stopnia n różnymi metodami
(sumowanie wyrazów z obliczaniem potęg oddzielnie dla każdego
wyrazu (przy pomocy oddzielnej funkcji), przy iteracyjnym obliczaniu
potęg (równocześnie z obliczaniem sumy), itp. (np. schemat Hornera)).
Przedyskutuj wyniki.
b) Oblicz ilość działań arytmetycznych potrzebnych do
pomnożenia dwu macierzy n na n metodą "z definicji".
Zadanie 2
Oblicz ile wywołań rekursywnych wykonuje się przy
rekursywnym obliczaniu liczb Fibonacciego:
int fib(int n)
{
if (n < 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2)
}
}
Zadanie 3
Co wypiszą poniższe programy:
#include <iostream>
using namespace std;
void fun(int * a, int * b)
{
int tmp=*a;
*a = *b;
*b = tmp;
}
int main(void)
{
int a=5, b=2;
fun(&a, &b);
cout << a << " " << b << endl;
return 0;
}
#include <iostream>
using namespace std;
void fun(int * * a, int * * b)
{
int * tmp=*a;
*a = *b;
*b = tmp;
}
int main(void)
{
int a=5, b=2;
int * ap = &a, * bp = &b;
fun(&ap, &bp);
cout << a << " " << b << endl;
return 0;
}
Uwaga: Chodzi o to by umieć przewidzieć co zrobi program przed
jego wykonaniem.
Zadanie 3
Zapoznaj się z przykładowym programem 'stos.cpp'. Prześledź
zawartość stosu dla różnych sekwencji wywołań metod
'umiesc' i 'pobierz'. Używając klasy 'stos' napisz prosty
kalkulator RPN, tzn. funkcję która mając dany łańcuch znaków
przetworzy znaki tak że cyfry umieszcza na stosie, zaś znaki
'+', '-' i '*' powodują pobranie dwu pozycji ze stosu, wykonanie
operacji i umieszczenie wyniku na stosie. Wynikiem kalkulatora
jest wartość zwracana przez 'pobierz'. Przykladowe dane:
"12+" ma dać 3, "123*+" ma dać 6, "123+*" ma dać 5,
"12+3*" ma dać 9.
Zadanie 4
Kolejka działa w ten sposób że operacja pobierania zwraca
pierwszy element umieszczony w kolejce (w przypadku stosu
operacja pobierania zwraca element ktory był ostatnio
umieszczony). Można ją zaimplementować podobnie do
stosu, ale trzeba pamiętać dwie pozycje: elementu
ostatnio umieszczonego (za nim umieszcza się kolejne
elementy) i elementu który był umieszczony jako pierwszy
(ten będzie zwrócony przez 'pobierz'). Typowo kolejkę
w tablicy realizuje się jako tak zwany bufor cykliczny,
tzn. po dojściu do końca tablicy elementy umieszcza się
od początku (zakładając że jest tam wolne miejsce).
Przy takiej implementacji jest problem z odróżnianiem
pustej kolejki od kolejki całkowicie zapełnionej, tzn.
takiej gdzie wszystkie pozycje w tablicy są używane.
Dlatego zwykle nie pozwala się na całkowite zapełnienie
tablicy i sygnalizuje się przepełninie już przy próbie
użycia ostatniej pozycji.
Zaimplementuj kolejkę w tablicy wzorując się na
implementacji stosu. Prześledź zawartość dla różnych
sekwencji wywołań metod 'umiesc' i 'pobierz'.
Dodaj metodę podającą ilość elementów w kolejce.
Zadanie 5
Sortowanie metodą łącznia polega na tym że mając ciąg do
posortowania dzielimy go na połowy, sortujemy każdą z nich
a następnie łączymy te dwa ciągi w jeden. Aby uniknąć
rekursji pożyteczny może być trochę inny punkt widzenia:
tablica długości n zawiera n ciągów długości 1. Łącząc
ciągi długości 1 uzyskujemy ciągi posortowane długości 2
(na końcu może zostać ciąg długości 1). Następnie łączymy
ciągi długości 2 w ciągi długości 4 i tak dalej, aż
otrzymamy jeden ciąg posortowany. Napisz funkcję
sortująca metodą łączenia. Użyj wariant funkcji
'merge' z listy 1.
Uwaga: Przy sortowaniu użyj tablicy pomocniczej o
rozmiarze równym wejściowej tablicy.