include ('autoryzacja_imap.php');
include ('dostep_czasowy.php');
setlocale (LC_ALL, 'pl_PL.iso88592');
header("Content-Type: text/html; charset=iso-8859-2");
// Wymuszenie autoryzacji przez serwer
if (!isset($_SERVER['PHP_AUTH_USER']))
{
header('WWW-Authenticate: Basic realm="Aby uzyskać dostęp, podaj swój login i hasło z serwera student.fizyka"');
header('HTTP/1.0 401 Unauthorized');
echo 'Brak dostępu!';
exit;
}
// Autoryzacja po protokole IMAP
if (autoryzacja_imap ($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) == FALSE)
{
echo ("Brak dostępu!");
exit;
}
// Logowanie dostępu
$plik = fopen ('pp2015_projekt_sr1.log', 'a');
flock ($plik, LOCK_EX);
fprintf ($plik, "%s\t%s\t%s (%s)\n", date ("Y-m-d H:i:s", time()), $_SERVER['PHP_AUTH_USER'], $_SERVER['REMOTE_ADDR'], gethostbyaddr($_SERVER['REMOTE_ADDR']));
flock ($plik, LOCK_UN);
fclose ($plik);
?>
PP2015 - projekt
Projekt 2015
Lasciate ogni speranza,
voi ch'entrate
$START1 = mktime (14, 10, 0, 5, 27, 2015); // czas w formacie h, m, s, m, dz, rok
//$STOP1 = $START1 + 200*60;
$STOP1 = mktime (12, 15, 0, 5, 29, 2015);
if (dostep_czasowy ($START1, $STOP1))
{
?>
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.
- 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.!
}
$START2 = mktime (14, 10, 0, 6, 3, 2015); // czas w formacie h, m, s, m, dz, rok
$STOP2 = $START2 + 100*60;
//$STOP1 = mktime (12, 15, 0, 5, 29, 2015);
if (dostep_czasowy ($START2, $STOP2))
{
?>
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.
- 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}
}
$START3 = mktime (14, 10, 0, 6, 10, 2015); // czas w formacie h, m, s, m, dz, rok
$STOP3 = mktime (14, 10, 0, 6, 12, 2015);
//$STOP1 = mktime (12, 15, 0, 5, 29, 2015);
if (dostep_czasowy ($START3, $STOP3))
{
?>
Część #3 - 10.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
}
?>
printf ("Wygenerowano %s", date ("Y-m-d H:i:s", time()));
?>