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.
- (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 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).
- (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.
- (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.
- (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.
- (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?
|