Lista 6 (29 listopada 2005): 11 punktów.

Jeszcze raz przeczytaj z książki B.W.Kernighana i D.M.Ritchiego Język ANSI C rozdział 4: Funkcje i struktura programu. Zwróć szczególną uwagę na dyrektywy dla preprocesora.

  1. (11 punktów) W pliku nagłówkowym zadeklaruj dwie funkcje: fibonacci_iter (int n) i fibonacci_rek (int n), które będą wyliczać zadaną liczbę Fibonacciego w sposób iteracyjny i rekurencyjny. Implementację tych funkcji umieść w pliku pliku źródłowym, w którym na początku włączysz wspomniany plik nagłówkowy dyrektywą #include (dyrektywy włączania warunkowego #ifndef i #endif umieść tylko w pliku nagłówkowym). W kolejnym pliku źródłowym napisz program, który będzie testował czas działania (najlepiej z dokładnościa do milisekund) obu funkcji wyliczających liczby Fibonacciego i wypisywał na bieżąco te czasy na standardowym wyjściu w formie tabelarycznej dla kolejnych wartości poczynając od 1.
    Uwaga: Liczby Fibonacciego są zdefiniowane wzorem rekurencyjnym: F0=0, F1=1 i Fn=Fn-1+Fn-2 dla n≥2.
    Uwaga: Do mierzenia czasu wykonania określonego fragmentu programu skorzystaj z funkcji ftime(struct timeb *tp) zadeklarowanej w pliku nagłówkowym sys/timeb.h, wywołując ją dwukrotnie (tuż przed uruchomieniem procedury oraz tuż po jej zakończeniu) i wyliczając różnicę czasów.
  2. (11 punktów) W pliku nagłówkowym zadeklaruj funkcję porownajizamien (double *p1, double *p2), która ma porównać ze sobą dwie liczby rzeczywiste wskazywane przez argumenty funkcji, a jeśli pierwsza z nich będzie większa od drugiej, to zamienia je miejscami. Implementację tej funkcji umieść w pliku pliku źródłowym, w którym na początku włączysz wspomniany plik nagłówkowy dyrektywą #include (dyrektywy włączania warunkowego #ifndef i #endif umieść tylko w pliku nagłówkowym). Implementując funkcję porownajizamien() skorzystaj z dwóch funkcji pomocniczych: porownaj (double d1, double d2) i zamien (double *p1, double *p2). Funkcja porownaj() ma porównywać dwie liczby rzeczywiste i odpowiadać wartością -1, 0 lub 1 gdy liczba pierwsza jest w stosunku do drugiej odpowiednio mniejsza, równa lub większa. Natomiast funkcja zamien() ma zamieniać miejscami wskazywane przez argumenty liczby rzeczywiste. Ogranicz zasięg widoczności tych funkcji tylko do tego pliku, w którym są one zdefiniowane. W kolejnym pliku źródłowym napisz program, który będzie wypełniał tablicę liczb rzeczywistych o określonym rozmiarze (dyrektywa #define) losowymi wartościami z zakresu od -99 do 99, sortował je metodą bąbelkową i wypisywał już uporządkowane na standarowym wyjściu. Wypełnanie tablicy losowymi wartościami powinno być zaprogramowane w osobnej funkcji losuj (int rozm, double *tab). Do sortowania tablicy liczb także napisz osobną funkcję sortowaniebabelkowe (int rozm, double *tab), która będzie korzystała z funkcji porownajizamien() zadeklarowanej w pliku nagłówkowym. Zmierz czas działania (z dokładnością do milisekund) samego procesu sortowania i wypisz go na standardowym wyjściu dla błędów.
    Uwaga: Do mierzenia czasu wykonania określonego fragmentu programu skorzystaj z funkcji ftime(struct timeb *tp) zadeklarowanej w pliku nagłówkowym sys/timeb.h, wywołując ją dwukrotnie (tuż przed uruchomieniem procedury oraz tuż po jej zakończeniu) i wyliczając różnicę czasów.