Zadanie projektowe
Celem projektu będzie napisanie wielofunkcyjnego programu wsadowego do wszechstronnego analizowania danych. Program pobiera dane zawsze ze standardowego wejście, ewentualnie przetworzone dane wypisuje na standardowe wyjście, a obliczone wartości wyświetla na ekran. Dodatkową funkcją programu będzie obliczenie i wyświetlenie czasu, jaki zajęło wykonanie żądanych operacji.
Argumenty uruchomienia programu są następujące:
./analiza (-asdmx | -N | -S | -D | -I ) [-t]
Można podać dowolną kombinację przełączników asdmx albo jeden z przełączników NSDI. Przełącznik t jest niezależny od wszystkich i oznacza obliczanie czasu operacji. Przełączniki można podać w jednym argumencie rozpoczynającym się od znaku '-', albo w kilku argumentach, z któ?ych każdy musi rozpoczynać się od znaku '-'.
Część III - 14 czerwca 2016 r.
Etapy rozwiązania:
- {1,5 pkt.} Funkcja struct dane_2k wygladz (const struct dane_2k dane) - zwraca podaną funkcję wygładzoną (nowa wartość punktu jest średnią jego i dwóch sąsiednich). [analiza.cpp]
- {1,5 pkt.} Funkcja struct dane_2k pochodna (const struct dane_2k dane) - zwraca pochodną podanej funkcji. [analiza.cpp]
- {1,5 pkt.} Funkcja struct dane_2k calka (const struct dane_2k dane) - zwraca całkę nieoznaczoną podanej funkcji. [analiza.cpp]
- {1,5 pkt.} Funkcja struct dane_3k dopasowanie_mnk (const struct dane_2k dane, double *a, doble *b) - zwraca funkcję wraz z dopasowaniem metodą MNK, a poprzez wskaźniki a i b - parametry tegoż dopasowania. [mnk.cpp]
- {2,5 pkt.} Sensowne wywołanie jednej z ww. funkcji, jeśli podano stosowny przełącznik: wygłądzanie (S), pochodna (D), całka (I), dopasowanie MNK (M). [main.cpp]
Część II - 7 czerwca 2016 r.
Etapy rozwiązania:
- {1 pkt.} Funkcja double srednia (const struct dane_1k dane) - zwraca wartość średnią danych podanych jako parametr. [statystyka.c]
- {1,5 pkt.} Funkcja double odchylenie_std (const struct dane_1k dane, double srednia) - zwraca wartość odchylenia standardowego podanych danych wokół podanej wartości średniej. [statystyka.c]
- {1,5 pkt.} Funkcja double wartosc_minimalna (const struct dane_1k dane) - zwraca wartość minimalną spośród podanych danych. [statystyka.c]
- {1 pkt.} Funkcja double wartosc_maksymalna (const struct dane_1k dane) - zwraca wartość maksymalną spośród podanych danych. [statystyka.c]
- {1,5 pkt.} Funkcja void sortowanie_babelkowe (double *liczby, size_t rozmiar) - sortuje bąbelkowo tablicę liczb o podanym rozmiarze. [statystyka.c]
- {1 pkt.} Funkcja double mediana (const struct dane_1k dane) - zwraca medianę podanych danych. [statystyka.c]
- {2,5 pkt.} Obliczenie i wyświetlenie na ekranie odpowiednich wartości, jeśli podano stosowne przełączniki: wartość średnia (a), odchylenie standardowe (s), wartość największa (x), wartość najmniejsza (m), mediana (d). [main.c]
Część I - 31 maja 2016 r.
Etapy rozwiązania:
- {0,5 pkt.} Struktura opcje_programu - zawiera typy logiczne wskazujące na podanie poszczególnych argumentów uruchomienia programu. [arg.h]
- {1,5 pkt.} Funkcja opcje_programu analizuj_opcje_programu (int argc, char *arg[]) - analizuje argumenty uruchomieniowe programu i zwraca wypełniony obiekt struktury. W przypadku konfliktów w podanych przełącznikach, wyświetla czytelny komunikat o błędzie i kończy program. [arg.c]
- {1 pkt.} Struktury struct dane_1k, struct dane_2k, struct dane_3k - zawierają 1, 2 lub 3 wskaźniki do tablic danych double (np. x i y) oraz rozmiar tych tablic. [io.h]
- {1 pkt.} Funkcja struct dane_1k wczytaj_dane_1k (FILE *strumien) - wczytuje ze strumienia liczby do tablicy na stercie i zwraca je w postaci struktury struct dane_1k. [io.c]
- {1 pkt.} Funkcja struct dane_2k wczytaj_dane_2k (FILE *strumien) - wczytuje ze strumienia liczby ułożone w dwie kolumny x, y do dwóch tablic na stercie i zwraca je w postaci struktury struct dane_2k. [io.c]
- {1 pkt.} Funkcja void zapisz_dane_2k (FILE *strumien, struct dane_2k dane) - zapisuje dane do strumienia wyjściowego (w dwóch kolumnach oddzielonych tabulacją). [io.c]
- {0,5 pkt.} Funkcja void zapisz_dane_3k (FILE *strumien, struct dane_3k dane) - zapisuje dane do strumienia wyjściowego (w trzech kolumnach oddzielonych tabulacją). [io.c]
- {0,5 pkt.} Wywołanie funkcji analizującej parametry uruchomieniowe programu w funkcji main(). [main.c]
- {1 pkt.} Instrukcje, które będą liczyć czas wykonania operacji i wyświetlać go na ekran. [main.c]
- {2 pkt.} Podział na pliki źródłowe, nagłówkowe oraz Makefile.
Zadania laboratoryjne
Zadanie #10 - 24 maja 2016 r.
Napisać program, który wyznaczy czas pracy algorytmu sortowania bąbelkowego na różnych zbiorach liczb całkowitych. Program otwiera kolejne pliki podane jako argumenty linii komend, wczytuje liczby do pamięci, sortuje, a następnie wyświetla na ekran wynik pomiaru w postaci: rozmiar danych, czas sortowania.
Etapy rozwiązania (po 1 pkt.):
- Struktura struct dane_liczbowe zawierająca wskaźnik na tablicę int oraz zmienną przechowującą rozmiar tej tablicy. [io.h] {0,5 pkt.}
- Funkcja struct dane_liczbowe wczytaj_dane (FILE *strumien) wczytująca dane ze strumienia do tablicy na stercie. [io.c]
- Funkcja void sortowanie (struct dane_liczbowe dane) sortująca tablicę danych zawartych w przekazywanej jako argument strukturze. [analiza.c]
- Pętla for iterująca po kolejnych argumentach uruchomieniowych programu; otwiera plik (sprawdź poprawność uchwytu!), wywołuje funkcję wczytującą danę, mierzy czas wykonania funkcji sortującej. [main.c] {2,5 pkt.}
- Wyświetlenie wyników pomiarów na ekran. [main.c] {0,5 pkt.}
- Zwolnienie pamięci po przydzielonych tablicach na stercie. [main.c] {0,5 pkt.}
Zadanie #9 - 17 maja 2016 r.
Napisać program, który metodą najmniejszych kwadratów dopasuje prostą do zestawu danych. Dane (dwie kolumny: x, y) podajemy programowi przez standardowe wejście. Zakładamy, że niepewność pomiaru wynosi 1,5%. Dane powinny być przechowywane w formie listy jednokierunkowej. Następnie program wyświetla na ekran parametry a, b dopasowania, liczbę punktów pomiarowych oraz sumę chi kwadrat. Na standardowe wyjście wypisujemy dane z dopasowaniem (w trzech kolumnach: x, y, f(x)).
Etapy rozwiązania (po 1 pkt.):
- Definicja struktury struct punkt zawierającej dwie składowe x i y punktu pomiarowego, dostosowanej do listy jednokierunkowej. [analiza.h] {0,5 pkt.}
- Funkcja struct punkt *wczytaj_dane (FILE *strumien) wczytująca dane ze strumienia do listy jednokierunkowej; zwraca wskaźnik na początek listy. [analiza.c]
- Funkcja void mnk (const struct punkt *lista, double *a, double *b) dopasowująca metodą najmniejszych kwadratów prostą i przekazująca parametry dopasowania przez wskaźniki a i b. [analiza.c] {1,5 pkt.}
- Funkcja void wypisz_z_dopasowaniem (FILE *strumien, const struct punkt *lista, double a, double b) wypisująca do strumienia punkty z listy oraz wartość dopasowania (w trzeciej kolumnie). [analiza.c] {0,5 pkt.}
- Funkcja double suma_chi2_liniowa (const struct punkt *lista, double a, double b) zwracająca sumę chi kwadrat testu zgodności danych z listy i funkcji liniowej o współczynnikach a i b. [analiza.c]
- Funkcja size_t rozmiar_listy (const struct punkt *lista) zwracająca liczbę elementów w liście. [analiza.c] {0,5 pkt.}
- Prawidłowe użycie ww. funkcji w funkcji main(). [main.c] {0,5 pkt.}
- Usunięcie całej listy w stosownym miejscu. [main.c] {0,5 pkt.}
Zadanie #8 - 10 maja 2016 r.
Napisać program, który obliczy wartość średnię, odchylenie standardowe, element największy, najmniejszy oraz medianę zbioru liczb podanego w pliku binarnym. Po uruchomieniu program pyta się o nazwę pliku, następnie wyświetla na ekran obliczone parametry statystyczne. Program winien się składać z trzech plików źródłowych: main.c, io.c, analiza.c, stosownych plików nagłówkowych oraz Makefile.
W pliku binarnym pierwsze 32 bity mają specjalne znaczenie. Zapalony najstarszy bit (MSB) oznacza, że dane będą typu double. Zgaszony MSB oznacza, że będą typu float. Pozostałe bity określają liczbę danych. Następnie następuje określona liczba danych typu double lub float.
Etapy rozwiązania (po 1 pkt.):
- Funkcja double *wczytaj_dane (FILE *strumien, size_t *rozmiar) wczytująca dane z pliku binarnego (podanych uchwycie) oraz wracająca przez wskaźnik rozmiar wczytanych danych. [io.c] {1,5 pkt.}
- Funkcja void srednia_odchylenie (const double dane[], size_t rozmiar, double *m, double *s) obliczająca wartość średnią (m) i odchylenie standardowe (s) danych w tablicy. [analiza.c]
- Funkcja void max_min (const double dane[], size_t rozmiar, double *max, double *min) obliczająca wartość maksymalną i minimalną. [analiza.c] {0,5 pkt.}
- Funkcja void sortowanie (double dane[], size_t rozmiar) sortująca tablicę danych. [analiza.c]
- Funkcja douuble mediana (const double dane[], size_t rozmiar) zwracająca medianę wartości z tablicy. [analiza.c] {0,5 pkt.}
- Sensowne wywołanie instrukcji w funkcji main(). [main.c] {0,5 pkt.}
- Podział kodu na pliki źródłowe, nagłówkowe oraz Makefile.
Pliki binarne do testowania:
Zadanie #7 - 26 kwietnia 2016 r.
Napisać program generujący raport statystyczny transportu towaru dla Centrum Zaopatrzenia Budek z Kebabem. Mięso dostarczane jest w postaci cylindrycznych stosów o zmierzonej wysokości, promieniu i masie oraz rodzajowi mięsa (K/W). Program wczytuje spis towarów ze standardowego wyjścia i wyświetla na ekran raport zawierający: średnią wysokość stosu (wraz z odchyleniem standardowym), średni promień stosu (wraz z odchyleniem standardowym) oraz sumaryczną masę z podziałem na kurczaka (K) i baraninę (W). Należy także podać bezwględną oraz procentową ilość stosów z kurczaka i baraniny.
Etapy rozwiązania (po 1 pkt.):
- Definicja typu wyliczeniowego enum rodzaj_miesa (kurczak lub baranina) oraz struktury struct kebab zawierającej stosowne składowe (wysokość, promień, masa, rodzaj mięsa (jako pole bitowe!)).
- Wprowadzenie wygodnych nazw za pomocą typedef dla powyższych typów. {0,5 pkt.}
- Funkcja kebab *wczytaj_dane (FILE *strumien, size_t *n) wczytująca ze strumienia opis transportu i przekazująca liczbę rekordów przez wskaźnik n, jak również zwracająca wskaźnik na tablicę wczytanych danych. {2 pkt.}
- Funkcja void analiza_statystyczna (const kebab *dane, size_t n) analizująca dane z tabeli i wyświetlająca raport na standardowe wyjście.
- Sensowne wywołanie powyższych funkcji w funkcji main(). {2 pkt.}
- Zwolnienie pamięci przydzielonej do tablicy dynamicznej. {0,5 pkt.}
Niepunktowane zadanie domowe: rozdzielić powyższy fantastyczny program na trzy pliki: main.c, kebab.c, kebab.h oraz napisać Makefile.
Zadanie #6 - 19 kwietnia 2016 r.
Napisać program, który metodą najmniejszych kwadratów dopasuje prostą do zestawu danych. Dane (dwie kolumny: x, y) podajemy programowi przez standardowe wejście. Następnie program wyświetla na ekran parametry a, b dopasowania oraz standardowe wyjście dane z dopasowaniem (w trzech kolumnach: x, y, f(x)). Przykładamy troskę o wewnętrzną budowe programu, dlatego użyjemy struktury do przechowywania danych oraz odpowiednich funkcji.
Etapy rozwiązania (po 1 pkt.):
- Definicja struktury struct punkt zawierająca dwie składowe x i y punktu pomiarowego. {0,5 pkt.}
- Funkcja struct punkt *wczytaj_dane (FILE *strumien, size_t *n) wczytująca dane ze strumienia do tablicy struktur (tworzonej i powiększanej dynamicznie); poprzez wskaźnik n przekazuje liczbę wczytanych punktów. {1,5 pkt.}
- Funkcja void mnk (const struct punkt dane[], size_t n, double *a, double *b) dopasowująca metodą najmniejszych kwadratów prostą i przekazującą parametry dopasowania przez wskaźniki a i b. {2 pkt.}
- Funkcja void wypisz_z_dopasowaniem (FILE *strumien, const struct punkt dane[], size_t n, double a, double b) wypisująca do strumienia punkty z tablicy danych oraz wartość dopasowania (w trzeciej kolumnie). {0,5 pkt.}
- Prawidłowe użycie ww. funkcji w funkcji main().
- Usunięcie tablicy dynamicznej w stosownym miejscu. {0,5 pkt.}
Zadanie #5 - 12 kwietnia 2016 r.
Zajęcia kontrolne. :)
Napisać program, który zaszyfruje tekst ze standardowego wejścia na standardowe wyjście używając szyfru cezara ROT-13. Program ma być całkowicie nieinteraktywny, a głównym jego celem jest skontruowanie właściwej struktury programu poprzez użycie stosownych funkcji. Należy zachowywać wielkość liter oraz pozostałe znaki. Przykładowy plik z tekstem do szyfrowania dostępny TUTAJ.
Etapy rozwiązania (po 1 pkt.):
- Funkcja bool wielka_litera (char znak) zwracającą true, gdy znak jest wielką literą (A-Z); w przeciwnym wypadku false.
- Funkcja bool mala_litera (char znak) zwracającą true, gdy znak jest małą literą (a-z); w przeciwnym wypadku false.
- Funkcja char rot13 (char znak) zwracająca znak po konwersji wg szyfru ROT-13; wykorzystuje wcześniejsze funkcje przy obliczaniu konwersji znaku. {2 pkt.}
- Pętla while czytająca znak po znaku ze standardowego wejścia.
- Prawidłowe wywołanie funkcji rot13() w powyższej pętli while i wyświetlanie znaku na standardowe wyjście.
Zadanie #4 - 5 kwietnia 2016 r.
Napisać program analizujący angielski przekład Księgi Rodzaju. Program powinien wczytać treść księgi ze standardowego wejścia, obliczając: sumaryczną ilość wyrazów, średnią długość wyrazu, liczbę wyrazów zawierających literę 'e', liczbę wystąpień słowa 'and' oraz słowa 'God' (także w dopełniaczu).
Etapy rozwiązania (po 1 pkt.):
- Pętla while odczytująca wyraz po wyrazie.
- Obliczanie ilości i sumarycznej długości wyrazów.
- Obliczanie liczby wystąpień słowa 'and' (uwględnij wielkość liter!).
- Obliczanie liczby wystąpień słowa 'God' (pamiętaj o dopełniaczu!).
- Obliczanie liczby wystąpień wyrazów zawierających literę 'e'.
- Wyświetlenie wyników analizy na ekran.
Zadanie #3 - 22 marca 2016 r.
Napisać program weryfikujący numer NIP. Program powinien poprosić użytkownika o podanie numeru i wczytać go, ignorując białe znaki (np. spacje, myślniki itd.) oraz wyświetlać komunikat Numer NIP poprawny/niepoprawny. Zoptymalizować typy używanych tablic pod kątem oszczędności pamięci.
Etapy rozwiązania (po 1 pkt.):
- Stworzenie tablicy typu const short [] zawierającej wagi.
- Wyświetlenie monitu o podanie nr. NIP. >{0,5 pkt.}
- Wczytanie NIP do tablicy liczb (ignorując białe znaki).
- Obliczenie liczby kontrolnej.
- Sprawdzenie wartości liczby kontrolnej i na tej podstawie wyświetlenie komunikatu o (nie)poprawności numeru.
- Optymalizacja operacji na tablicach (w dwóch dowolnie wybranych miejscach) poprzez zastosowanie "przesuwanych" wskaźników. {1,5 pkt.}
Przykładowe 2 numery NIP do weryfikacji działania programu można znaleźć na stronie Miasta i Gminy Buk ;) albo sprawdzić NIP PW: 525-000-58-34.
Zadanie #2 - 15 marca 2016 r.
Napisać program, którego główna funkcjonalność polegać będzie na rozwiązaniu równania kwadratowego w dzidzinie liczb rzeczywistych. Po uruchomieniu program wyświetla menu z opcjami: 1. Rozwiąż równanie 2. stopnia; 2. Rozwiąż równanie 3. stopnia; 4. Rozwiąż równanie 4. stopnia; 5. Rozwiąż równanie 5. stopnia; 0. Wyjście. Po wybraniu opcji innej niż 2, należy wyświetlić komunikat "WERSJA DEMO". Program chodzi cyklicznie aż do wybrania opcji 0.
Po wybraniu opcji 2 program pyta użytkownika o trzy współczynniki równania kwadratowego i wyświetla rozwiązania. Należy uwzględnić wszystkie mozliwości!
Etapy rozwiązania (po 1 pkt.):
- Pętla while wyświetlająca menu aż do spełnienia warunku zakończenia programu.
- Zapytanie o wybór pozycji menu i szkielet instrukcji switch badającej wybraną opcję.
- Poszczególne opcje instrukcji switch. Wyświetlenie komunikatu WERSJA DEMO oraz BŁĘDNA OPCJA w odpowiednich przypadkach.
- Zapytanie o współczynniki równania 2. stopnia. {0,5 pkt.}
- Obliczenie i wyświetlenie wyniku w sytuacji, gdy równanie jest liniowe (tj. a == 0).
- Obliczenie i wyświetlenie wyniku w sytuacji, gdy równanie jest naprawdę kwadratowe. {1,5 pkt.}
Zadanie #1 - 8 marca 2016 r.
Napisać program, który zapyta użytkownika o nazwę pliku z danymi studentów, wczyta go, a następnie wyświetli na standardowe wyjście w formie eleganckiej tabelki zawierającej kolejno pola: lp., nr albumu, nazwisko, imię, grupa. Wymagane są pionowe linie oddzielające poszczególne kolumny oraz poziome linie wokół nagłówka i na końcu tabeli.
Etapy rozwiązania (po 1 pkt.):
- Zapytanie o nazwę pliku wejściowego i pobranie jego nazwy.
- Otwarcie pliku oraz sprawdzenie, czy operacja wykonała się poprawnie. Zamknięcie pliku (na końcu programu).
- Wyświetlenie nagłówka tabeli wraz z poziomymi liniami.
- Definicje zmiennych pomocniczych i pętla czytająca rekordy z plików do zmiennych pomocniczych.
- Licznik nr. porządkowego. {0,5 pkt.}
- Instrukcja printf wyświetlająca kolejne rekordy na ekran (wewnątrz pętli). {1,5 pkt.}
Zadanie #0 - 1 marca 2016 r.
Zajęcia wprowadzające.
- Korzystając z informacji zawartych na TEJ stronie, skonfiguruj w programie IceDove / Thunderbird swoją skrzynkę pocztową w domenie student.fizyka.pw.edu.pl oraz pw.edu.pl.
- Skonfiguruj swoje ulubione środowisko programistyczne, tj. Geany.
- Napisz swój pierwszy fantastyczny program, np. wyświetlający rozmiary zmiennych różnych typów na ekranie.
- Uśmiechnij się!