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.

  1. 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}
  2. 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}
  3. 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}
  4. 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}
  5. Struktura analiza_statystyczna_arg zawieraj�ca pola bitowe: srednia, sigma, maksimum, minimum. (0,25 pkt.) {arg.c}
  6. 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}
  7. 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}
  8. 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}
  9. 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}
  10. 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}
  11. 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}
  12. 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.

  1. 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}
  2. 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}
  3. 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}
  4. 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}
  5. 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}
  6. 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.

  1. 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}
  2. 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}
  3. 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}
  4. Struktura punkt_pomiarowy zawieraj�ca sk�adowe x, y, f. (0,5 pkt.) {mnk.h}
  5. 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}
  6. 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}
  7. 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}
  8. 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())); ?>