Projekt 2015
Lasciate ogni speranza,
voi ch'entrate
Og�lny opis programu
Ostatecznym celem projektu jest napisanie programu wsadowego (nieinteraktywnego, sterowanego z linii polece�) - kombajnu do operacji numeryczno-analitycznych. Wyboru ��danej operacji dokonuje si� za pomoc� flagi - parametru uruchomienia programu. Program pobiera dane wej�ciowe z pliku (prze��cznik -i <plik_wejsciowy>) i wypisuje wynik do innego pliku (prze��cznik -o <plik_wyjsciowy>). Je�li kt�ry� z prze��cznik�w nie jest podany, operacje s� dokonywane do/na stardardowe wej�cie/wyj�cie. Natomiast b��d otwarcia podanego pliku powoduje zako�czenie programu.
Kolejno�� podania argument�w jest dowolna. Tzn., �e wywo�anie programu na poni�sze sposoby powinno da� identyczny efekt:
./projekt -A mMas -i wejscie.txt -o wyjscie.txt
./projekt -o wyjscie.txt -i wejscie.txt -A mMas
./projekt -i wejscie.txt -A mMas -o wyjscie.txt
Wszelkie komunikaty o b��dnym zachowaniu programu powinny by� wy�wietlane na standardowe wyj�cie b��d�w. W nawiasach klamrowych - dla u�atwienia - podane s� nazwy plik�w �r�d�owych, w kt�rych powinny si� znale�� ��dane funkcje.
Cz�� #1 - 29.05.2015 r.
- Funkcja pomocnicza unsigned znajdz_parametr (const char *param, int argc, char *argv[]) - przeszukuje parametry uruchomieniowe w porzukiwaniu identycznego z param. Zwraca numer parametru, pod kt�rym znajduje si� poszukiwany, albo zero w przypadku niepowodzenia.
(0,5 pkt.) {arg.c}
- Funkcja FILE *strumien_wejsciowy (int argc, char *argv[]) otrzymuj�ca porametry funkcji main(). Sprawdza, czy w�r�d parametr�w znajduje si� prze��cznik -i. Je�li tak, to zak�amy, �e kolejny parametr zawiera nazw� pliku. Funkcja pr�buje otworzy� do odczytu plik i zwraca uchwyt do niego. W przypadku b��du otwarcia generuje komunikat i ko�czy program (u�ycie funkcji exit (int kod_bledu)). Gdy nie ma prze��cznika, swraca stdin.
(1 pkt.) {arg.c}
- Funkcja FILE *strumien_wyjsciowy (int argc, char *argv[]) - jak wy�ej, ale poszukuje prze��cznika -o i pr�buje otworzy� plik wyj�ciowy.
(0,5 pkt.) {arg.c}
- Funkcja double *wczytaj_dane_tab (FILE *we, size_t *rozmiar) wczytuj�ca wszystkie liczby ze strumienia do tablicy na stercie. Zwraca wska�nik na t� tablic�. Liczb� wczytanych danych wpisuje poprzez wska�nik rozmiar.
(1 pkt.) {io.c}
- Struktura analiza_statystyczna_arg zawieraj�ca pola bitowe: srednia, sigma, maksimum, minimum.
(0,25 pkt.) {arg.c}
- Funkcja analiza_statystyczna_arg argumenty_analizy_statystycznej (const char *parametr) - otrzymuje wska�nik na parametr nast�pny po prze��czniku -A i sprawdza, czy zawiera on litery odpowiadaj�ce okre�lonym wielko�ciom statystycznym: �rednia (a), odchylenia standardowe (s), warto�� najwi�ksza (M), warto�� najmniejsza (m). Zwraca wype�niony obiekt struktury analiza_statystyczna_arg.
(0,75 pkt.) {arg.c}
- Funkcja double srednia (const double dane[], size_t rozmiar) - oblicza warto�� �redni� wszystkich liczb z tablicy dane o rozmiarze rozmiar.
(0,5 pkt.) {statystyka.c}
- Funkcja double sigma (const double dane[], size_t rozmiar, double srednia) - oblicza odchylenie standardowe dla wszystkich liczb z tablicy dane o rozmiarze rozmiar. Wykorzystuje podan� warto�� srednia.
(0,5 pkt.) {statystyka.c}
- Funkcja double wartosc_maksymalna (const double dane[], size_t rozmiar) - zwraca warto�� najwi�ksz� ze wszystkich liczb z tablicy dane o rozmiarze rozmiar.
(0,5 pkt.) {statystyka.c}
- Funkcja double wartosc_minimalna (const double dane[], size_t rozmiar) - zwraca warto�� najmniejsz� ze wszystkich liczb z tablicy dane o rozmiarze rozmiar.
(0,5 pkt.) {statystyka.c}
- Funkcja void analiza_statystyczna (FILE *we, FILE *wy, analiza_statystyczna_arg zakres) - wczytuje dane ze strumienia we (u�yj wcze�niejszej funkcji!), nast�pnie oblicza tylko wielko�ci statystyczne okre�lone w strukturze zakres i wypisuje wyniki do strumienia wy.
(2 pkt.) {statystyka.c}
- Funkcja main (int argc, char *argv[]), w kt�rej po kolei: ustawiamy strumienie wej�ciowy i wyj�ciowy (standardowe wej�cia lub pliki); sprawdzamy argumenty wywo�ania programu pod k�tem prze��cznik�w funkcjonalno�ci (b�dzie ich kilka); je�li wyst�puje prze��cznik -A (analiza statystyczna), okre�lamy kt�re wielko�ci nale�y policzy� i wywo�ujemy funkcj� analiza_statystyczna().
(2 pkt.) {main.c}
Kary umowne: za brak podzia�u na pliki �r�d�owe i Makefile - do -2 pkt.!
Cz�� #2 - 1.06.2015 r.
- Je�li zostanie podana flaga -T, program obliczy czas wykonania od momentu otwarcia plik�w do wy�wietlenia ostatniej linijki tekstu/danych. Czas zostanie wy�wietlony na ekran z precyzj� lepsz� ni� 1 s.
(2 pkt.) {main.c}
- Funkcja double *fft_oblicz (const double dane[], size_t rozmiar) obliczaj�ca szybk� transformacj� Fouriera dla podanej pr�bki danych. Zwracana jest tablica przydzielona na stercie o takim samym rozmiarze.
(2,5 pkt.) {fft.c}
- Funkcja void wypisz_dane_tab (FILE *wy, const double dane[], size_t rozmiar) wypisuj�ca wszystkie liczby z tablicy do strumienia.
(1 pkt.) {io.c}
- Funkcja void fft_rysuj (double *transformata), kt�ra wy�ietli w dowolnej postaci (okno Allegro lub Ncurses) pierwsze 50 warto�ci transformaty w postaci s�upk�w o wysoko�ci proporcjonalnej do warto�ci FFT w tym punkcie, znormalizowanej do najwi�kszej warto�ci.
(2+2 pkt.) {fft.c}
- Funkcja void fft (FILE *we, FILE *wy), kt�ra wczyta dane ze strumienia, obliczy FFT, wypisze wynik do strumienia wyj�ciowego oraz ewentualnie wywo�a funkcj� rysuj�c�.
(1,5 pkt.) {fft.c}
- Poszukiwanie flagi -F w�r�d argument�w i prawid�owe wywo�anie funkcji fft().
(1 pkt.) {main.c}
Dane do testowania FFT
Cz�� #3 - 12.06.2015 r.
Do programu do��czy� funkcjonalno�� dopasowania metod� najmniejszych kwadrat�w (opart� o listy jednokierunkowe) oraz generatora liczb losowych o rozk�adzie jednolitym i gaussa. Przyk�adowe u�ycie:
a) 10000 liczb o rozk�adzie Gaussa (3; 0,15):
./projekt -G 10000 3 0.15
b) 5000 liczb o rozk�adzie jednostajnym pomi�dzy -100 a +100:
./projekt -J 5000 -100 +100
b) Dopasowanie metod� najmniejszych kwadrat�w:
./projekt -D
Prze��czniki -i oraz -o nadal zachowuj� swoje dzia�anie.
- Funkcja double generator_gaussa (double m, double s) zwracaj�ca jedn� liczb� z rozk�adu Gaussa (m, s) oraz
funkcja double generator_jednostajny (double min, double max) zwracaj�ca jedn� liczb� z rozk�adu jednostajnego o warto�ci z zakresu (min, max).
(1,5 pkt.) {generator.c}
- Funkcja double *generator_losowych (double (*generator) (double, double), size_t n, double p1, double p2) zwracaj�ca wska�nik na tablic� na stercie (przydzieli� pami��!) zawieraj�c� n liczb losowych wygenerowanych przez podany generator, o parametrach p1 i p2.
(1 pkt.) {generator.c}
- Funkcja void liczby_losowe (FILE *wy, const char *arg_typ, const char *arg_n, const char *arg_p1, const char *arg_p2) otrzymuj�ca uchwyt do strumienia wyj�ciowego oraz wska�niki do kolejnych argument�w uruchomienia programu zawieraj�cych rodzaj generatora, ilo�� liczb i dwa parametry. Funkcja sama dokonuje konwersji string�w o semantyce liczbowej na odpowiednie typy liczbowe. Sprawdza rodzaj rozk�adu i wywo�uje funkcj� z powy�szego punktu.Wy�wietla liczby na strumie� wyj�ciowy za pomoc� stosownej funkcji z io.c oraz oblicza faktyczn� warto�� �redni� i odchylenie standardowe (u�yj ju� gotowych funkcji!) i wy�wietla je na ekran.
(2 pkt.) {generator.c}
- Struktura punkt_pomiarowy zawieraj�ca sk�adowe x, y, f.
(0,5 pkt.) {mnk.h}
- Funkcja punkt_pomiarowy *wczytaj (FILE *we) wczytuj�ca dane ze strumienia i zwracaj�ca wska�nik na pocz�tek listy oraz funkcja void wypisz_dane_z_dopasowaniem (FILE *wy, const punkt_pomiarowy *dane) wypisuj�ca dane wraz z dopasowaniem do strumienia wyj�ciowego.
(1,5 pkt.) {mnk.c}
- Funkcja pomocnicza void wartosci_dopasowania (punkt_pomiarowy *dane, double a, double b) uzupe�niaj�ca dane o warto�ci dopasowania prost� f(x)= a*x + b.
(0,5 pkt.) {mnk.c}
- Funkcja void dopasowanie_mnk (FILE *we, FILE *wy) - wczytuje dane do listy ze strumienia wej�ciowego, wykonuje obliczenia zwi�zane z dopasowaniem (a, b oraz ich niepewno�ci), a w mi�dzyczasie wywo�uje funkcj� z powy�szego podpunktu. Na ko�cu wy�wietla parametry dopasowania na ekran oraz warto�ci dopasowania (u�yj wcze�niej zdefiniowanej funkcji!) do strumienia wyj�ciowego.
(2 pkt.) {mnk.c}
- Dodanie obs�ugi parametr�w -D, -J oraz -G do funkcji main().
(1 pkt.) {main.c}
Wygenerowano %s", date ("Y-m-d H:i:s", time()));
?>