Lista 5 (22 listopada 2005): 15 punktów.

Przeczytaj z książki B.W.Kernighana i D.M.Ritchiego Język ANSI C rozdział 4: Funkcje i struktura programu.

  1. (3 punkty) Dość często potrzebujemy ustawiać lub sprawdzać wartości pojedynczych bitów w słowie typu int lub unsigned int. Zdefiniuj dwie funkcje: jedną do odczytywania wartości określonego bitu (funkcja ma zwracać wartość 0 lub 1), a drugą do ustawiania wartości określonego bitu:
    int jakiBit (unsigned *komorka, int nrBitu);
    void ustawBit (unsigned *komorka, int nrBitu, int wartosc);
    Przy programowaniu tych funkcji skorzystaj z operatorów bitowych. Następnie napisz krótki program testowy, sprawdzający ich poprawne działanie (numer bitu to wartość z zakresu od 0 do (sizeof(unsigned)<<3)-1).
  2. (2 punkty, kontynuacja poprzednego zadania) Zaprogramuj analogiczne funkcje działające na całych tablicach:
    int jakiBit (unsigned *tablica, int nrBitu);
    void ustawBit (unsigned *tablica, int nrBitu, int wartosc);
    Następnie napisz krótki program testowy, sprawdzający ich poprawne działanie (numer bitu to nieujemna liczba całkowita).
  3. (5 punktów, kontynuacja poprzednego zadania) Zadeklaruj globalną tablicę unsigned sito[] o najmniejszym możliwym rozmiarze, która będzie zawierała co najmniej MAX_BIT bitów (wartość MAX_BIT zdefiniuj dyrektywą #define dla preprocesora). Zaprogramuj dodatkową funkcję, która wypełni tą tablicę wartościami 1 tylko na tych pozycjach, które odpowiadają liczbom pierwszym (na i-tej pozycji znajduje się 1 tylko wtedy, gdy liczba i jest pierwsza):
    void sitoEratostenesa ();
    Popraw funkcje jakiBit() i ustawBit(), tak aby sprawdzały one wartość parametru nrBitu (dla wartości <0 lub ≥MAX_BIT funkcja jakiBit() zawsze zwraca 0 a funkcja ustawBit() nie robi nic). Napisz też funkcję, która dla zadanej liczby całkowitej sprawdzi, czy jest ona pierwsza (zwracana wartość to 1) czy nie (zwracana wartość to 0); dla liczb >(MAX_BIT-1)2 funkcja może nie odpowiadać (zwracana wartość to -1):
    int czyPierwsza (int liczba);
    Następnie napisz krótki program testowy, wypisujący wszystkie liczby pierwsze niewiększe od zadanej liczby wczytanej ze standardowego wejścia. Komunikaty zachęcające do wpisywania danych należy kierować na standardowe wyjście dla błędów.
  4. (5 punktów, kontynuacja poprzednego zadania) Podziel poprzednie zadanie na trzy części: plik nagłówkowy (z dyrektywami włączania warunkowego #ifndef i #endif dla preprocesora) z funkcją do testowania pierwszości liczby, plik źródłowy z implementacją funkcji z pliku nagłówkowego (oraz lokalnymi funkcjami pomocniczymi i tablicą bitową z sitem Eratostenesa), a także plik źródłowy z funkcją main(), która w pętli będzie wczytywała liczbę całkowitą i wypisywała komunikat o jej pierwszości.

  5. (2 punkty) Średniej wielkości tablicę liczb całkowitych (jej rozmiar określ dyrektywą #define dla preprocesora) wypełnij losowymi wartościami z zakresu -999...999. Następnie wypisz te wartości na standardowym wyjściu w 10 kolumnach. Przy każdym uruchomieniu programu losowane wartości powinny być inne (wywołaj funkcję srand((unsigned)time(NULL)) na początku programu). Do wypełniania tablicy losowymi wartościami użyj osobnej funkcji.
  6. (3 punkty) Średniej wielkości tablicę liczb całkowitych (jej rozmiar określ dyrektywą #define dla preprocesora) wypełnij losowymi wartościami z zakresu 0...999999999 z rozkładem jednostajnym (każda wartość ma być jednakowo prawdopodobna). Następnie oblicz wypisz na standardowym wyjściu średnią arytmetyczną wszystkich wylosowanych przez ciebie liczb. Do wypełniania tablicy losowymi wartościami i do obliczania wartości średniej użyj osobnych funkcji. Czy otrzymywane w trakcie testowania wyniki były zbliżone do 499999999.5?