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 - 27.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 - 3.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}

Część #3 - 10.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


Wygenerowano %s", date ("Y-m-d H:i:s", time())); ?>