Zadania laboratoryjne (16-18)

Zadanie K4 - 14 czerwca 2017 r.

Uzupełnić funkcjonalność programu o możliwość wyboru (z linii poleceń) rozkładu statystycznego do dopasowania: Gaussa (przełącznik -G) lub Poissona (-P), który wraz z histogramem zostanie wyświetlony na ekranie.

Etapy rozwiązania (po 1 pkt.):

  1. [statystyka.hpp] Typ wyliczeniowy enum RodzajRozkladu. {0,5 pkt.}
  2. [arg.hpp] Uzupełnienie struct Parametry o rodzaj rozkładu - wykorzystać powyższy typ wyliczeniowy. {0,5 pkt.}
  3. [arg.cpp] Aktualizacja funkcji Parametry analizujArgumenty (int argc, char *arg[]) o wyszukanie przełączników odpowiadających za wybór rozkładu.
  4. [statystyka.cpp] Funkcja void StatystykaSigma (const dane_f dane, float &srednia, float &sigma) obliczająca estymatory wartości średniej i odchylenia standardowego i zwracająca je poprzez referencje srednia oraz sigma. {1,5 pkt.}
  5. [histogram.cpp] Funkcja void WyswietlHistogramGFX (const Histogram &h, RodzajRozkladu r) wyświetlająca na ekranie histogram w postaci pionowych słupków. {3 pkt>}
  6. [histogram.cpp] Obliczenie (wewnątrz powyższej funkcji) estymatorów średniej i odchylenia standardowego oraz narysowanie linią ciągła odpowiedniego rozkładu statystycznego. {2 pkt.}
  7. [main.cpp] Zmodyfikowanie funkcji main (), aby realizowała zadane funkcjonalności. {1,5 pkt.}

Zadanie K3 - 7 czerwca 2017 r.

Napisać program do analizy statystycznej i wizualizacji danych liczbowych, które mogą być podawane zarówno w formacie tekstowym, jak i binarnym. Dzisiejsza wersja programu powinna wyświetlić w konsoli rozmiar próbki, wartość największą i najmniejszą oraz na ekranie o rozmiarze 800x600 px wyświetlić 20-binowy histogram próbki.

Uruchomienie programu:
./statystyka [ -b | -t ] <nazwa_pliku>

Etapy rozwiązania (po 1 pkt.):

  1. [arg.hpp] Struktura struct Parametry zawierająca typ pliku (tekstowy, binarny - wykorzystaj zmienną bool) oraz uchwyt do pliku. {0,5 pkt.}
  2. [arg.cpp] Funkcja Parametry analizujArgumenty (int argc, char *arg[]) która sprawdza, czy podano minimalną liczbę parametrów, szuka właściwego przełącznika (-b lub -t), próbuje otworzyć plik o nazwie zawierającej się w następnym argumencie i wpisuje do zwracanej struktury typ pliku oraz uchwyt. Sygnalizuje błędy. {1,5 pkt>}
  3. [dane.hpp] Liczby (o precyzji float) można przechowywać w postaci listy jednokierunkowej, nadstruktry zawierającej wskaźnik do tablicy i jej rozmiar lub kontenera vector z C++. W dalszej części kodu będziemy się odwoływać do tego elementu jako do typu dane_f {0,5 pkt.}
  4. [dane.cpp] Funkcja dane_f WczytajDaneTXT (FILE *plik) wczytująca dane tekstowe z pliku, przydzielająca pamięć itd.
  5. [dane.cpp] Funkcja dane_f WczytajDaneBIN (FILE *plik) wczytująca dane binarne (precyzja float) z pliku, przydzielająca pamięć itd.
  6. [statystyka.cpp] Funkcja void StatystykaMaxMin (const dane_f dane, float &min, float &max) obliczająca wartość najmniejszą i największą i zwracająca je poprzez referencje min oraz max.
  7. [histogram.hpp] Struktura struct Histogram zawierająca tablicę 20 liczb całkowitych (zawartość binów), składową na wartość najmniejszą i największą oraz rozmiar próbki. {0,5 pkt.}
  8. [histogram.cpp] Funkcja void WypelnijHistogram (Histogram &h, const dane_f dane) wypełniająca histogram h na podstawie danych. Wartość minimalną i maksymalną należy określić na podstawie wcześniej zdefiniowanej funkcji.
  9. [histogram.cpp] Funkcja void WyswietlHistogram (FILE *strumien, const Histogram &h) wyświetlająca na podany strumień histogram w postaci procentowej i proporcjonalnej liczby gwiazdek.
  10. [main.cpp] Testowa funkcja main()wywołująca funkcję analizującą argumenty programu, wczytująca dane oraz wyświetlająca histogram.
  11. [Makefile] Makefile.

Dane wejściowe (tekstowe) do testowania:

Dane wejściowe (binarne) do testowania:

Ze względu na duży rozmiar plików zaleca je się ściągać programem wget do katalogu na dysku lokalnym (np. /var/tmp)

Zadanie #9 - 31 maja 2017 r.

Do poprzedniego programu dołączyć trzy nowe funkcjonalności: wygładzanie, obliczanie dyskretnej transformaty Fouriera danych wejściowych oraz pochodnej. Wyboru operacji dokonuje się poprzez podanie odpowiedniej flagi - argumentu uruchomienia programu: -F (transformata Fouriera), -W (wygładzanie), -P (pochodna), -C (całka).

Etapy rozwiązania (po 1 pkt.):

  1. Funkcja double2_l *Pochodna (const double2_l *lista) licząca pochodną dla podanych danych i zwracająca ją w postaci nowej listy. {1,5 pkt.}
  2. Funkcja double2_l *Wygladzanie (const double2_l *lista) wygładzająca podane dane i zwracająca je w postaci nowej listy. {1,5 pkt.}
  3. Struktura struct double_l służąca do przechowywania liczb typu double w postaci listy jednokierunkowej {0,5 pkt.}
  4. Funkcja double_l *WczytajDane (FILE *strumien) wczytująca dane z podanego strumienia i zwracająca wskaźnik na głowę listy jednokierunkowej. {0,5 pkt.}
  5. Funkcja size_t RozmiarListy (const double_l *lista) zwracająca liczbę elementów na liście. {0,5 pkt.}
  6. Funkcja void WypiszDane (FILE *strumien, const double_l *lista) wypisująca do podanego strumienia wszystkie liczby z listy. {0,5 pkt.}
  7. Funkcja double_l *DFT (const double_l *lista) licząca dyskretną transformatę Fouriera dla podanych danych i zwracająca ją (moduł Ak) w postaci nowej listy. {2 pkt.}
  8. Funkcja void KasujListę (double_l *lista) zwalniająca pamięć po liście. {0,5 pkt.}
  9. Obsługa argumentu linii komend (wybór właściwej operacji) i prawidłowe wywołanie powyższych funkcji w funkcji main(). {1,5 pkt.}
  10. Podział kodu na pliki źródłowe: calculus.c, double2_l.c, dft.c (+ odpowiednie pliki nagłówkowe) oraz uaktualniony Makefile. {1 pkt.}

Zadanie #8 - 24 maja 2017 r.

Napisać program, który będzie obliczać numerycznie całkę danych wejściowych (podawanych na standardowe wejście) i wyświetlać ją na standardowe wyjście. Liczba danych nie jest znana, dlatego należy dane wejściowe oraz wyjściowe przechowywać w postaci listy jednokierunkowej.

Etapy rozwiązania (po 1 pkt.):

  1. Struktura struct double2_l służąca do przechowywania par liczb typu double (x, y) w postaci listy jednokierunkowej {0,5 pkt.}
  2. Funkcja double2_l *WczytajDane (FILE *strumien) wczytująca dane z podanego strumienia i zwracająca wskaźnik na głowę listy jednokierunkowej.
  3. Funkcja size_t RozmiarListy (const double2_l *lista) zwracająca liczbę elementów na liście.
  4. Funkcja void WypiszDane (FILE *strumien, const double2_l *lista) wypisująca do podanego strumienia wszystkie liczby z listy.
  5. Funkcja double2_l *Calka (const double_l *lista) licząca całkę nieoznaczoną dla podanych danych i zwracająca ją w postaci nowej listy. {2,5 pkt.}
  6. Funkcja void KasujListę (double2_l *lista) zwalniająca pamięć po liście. {0,5 pkt.}
  7. Użycie powyższych funkcji w funkcji main(). {1,5 pkt.}
  8. Podział kodu na pliki źródłowe: double2_l.c, calculus.c, main.c (+ odpowiednie pliki nagłówkowe) oraz Makefile. {2 pkt.}

Dane wejściowe do testowania:

Zadanie #7 - 17 maja 2017 r.

Napisać program wyświetlający w okienku obrazek zapisany w 16-bitowym formacie TPWGF16 (Tomasz Pietrzak's Weird Graphic Format). Program napisać w oparciu o dostarczony szablon, zawierający m.in. funkcje biblioteki graficznej Allegro. Po wyświetleniu obrazu program czeka na wciśnięcie dowolnego klawisza (funkcja readkey()). Wykorzystać typy o rozmiarach niezależnych od platformy (plik nagłówkowy stdint.h).

Format (binarny) plików TPWGF jest następujący: szerokość obrazu (16 bitów); wysokość (16 bitów); kolor RGB piksela 0,0 (16 bitów); kolor RGB piksela 1,0 (16 bitów); ... Kolor zakodowany jest wg specyfikacji bitowej: 0bbbbbgggggrrrrr.

Etapy rozwiązania (po 1 pkt.):

  1. Pobranie nazwy pliku z parametru uruchomieniowego programu (+ sprawdzenie poprawności).
  2. Otwarcie + zamknięcie pliku (na końcu) + sprawdzenie poprawności uchwytu.
  3. Wczytanie z pliku szerokości i wysokości obrazu.
  4. Otwarcie okna trybu graficznego; nazwa pliku w tytule okna.
  5. Wczytywanie kolorów kolejnych pikseli (binarnie, 16 bitów) i konwertowanie ich na trzy składowe RGB w zakresie 0-255. {2 pkt.}
  6. Rysowanie pikseli na ekranie {3 pkt.}.
  7. Rozszerzyć program, aby wyświetlał kolejno pliki podane na liście parametrów.

Materiały do pobrania:

Zadanie K2 - 10 maja 2017 r.

Napisać program, który będzie losował zestaw liczb całkowitych z zakresu od 0 do 1000 o rozkładzie jednorodnym i podanym przez użytkownika rozmiarze, a następnie wyświetlał na ekran estymatory wartości średniej i odchylenia standardowego, a na standardowe wyjście dane do histogramu o 20 binach.

  1. struct tablica_i zawierająca wskaźnik na tablicę typu int oraz zmienną typu size_t określającą liczbę elementów tablicy (0,5 pkt.)
  2. Funkcja tablica_i GeneratorJ (int max, size_t n) tworzący na stercie tablicę o podanej liczbie elementów n i wypełniający ją liczbami o rozkładzie jednorodnym od 0 do podanej wartości max. (2 pkt.)
  3. Funkcja void Statystyka_ms (const tablica_i tab, double &m, double &s) obliczająca estymatory wartości średniej i odchylenia standardowego dla podanej tablicy liczb; obliczone wartości zwraca poprzez referencje m i s. (1,5 pkt.)
  4. Funkcja void WyswietlHistogram (FILE *wy, const tablicza_i tab, int max, int n_bin) wyświetlająca na strumień wy "histogram" liczb z podanej tablicy, przy czym podaje się maksymalną liczbę oraz liczbę binów. (3 pkt.)
  5. Wywołanie ww. funkcji w funkcji main() w celu wyświetlenia żadanych wartości.
  6. Podział kodu na pliki: main.cpp, statystyka.cpp oraz statystyka.hpp. Makefile. (2 pkt.)

Zadanie #6 - 26 kwietnia 2017 r.

Napisać program generujący raport statystyczny dla transportu modnych francuskich kapeluszy (w modnych francuskich pudłach) z Centrum Mody Francuskiej, który powinien zawierać sumaryczną liczbę pudeł, średnią wysokość pudła, sumaryczną objętość oraz masę. W związku ze wzrostem popytu na modne francuskie kapelusze w Polsce, Centrum rozpoczęlo dystrybucję kapeluszy w kształcie walców (W), prostopadłościanów (P) oraz graniastosłupów o podstawie trójkątnej (T).

Specyfikacja zestawienia transportu jest teraz następująca:

W masa wysokość promień
P masa wysokość szerokość głębokość
T masa wysokość długość_krawędzi_podstawy

Pudła powinny być reprezentowane w programie jako obiekty odpowiednich struktur.

Etapy rozwiązania (po 1 pkt.):

  1. Struktury KapeluszW, KapeluszP oraz KapeluszT dla poszczególnych kształtów pudeł. {0,5 pkt.}
  2. Unia KapeluszU zawierająca trzy ww. typy pudeł oraz struktura Kapelusz zawierajaca unię oraz obiekt typu wyliczeniowego określający kształt przechowywanego kapelusza.
  3. Funkcja Kapelusz *wczytaj_dane (FILE *we, size_t &rozmiar) z dynamiczną realokacją pamięci {1,5 pkt.}.
  4. Definicja struktury StatParam przechowującej obliczoną statystykę (średnią wysokość stosu wraz z odchyleniem, sumaryczną objętość oraz masę). {0,5 pkt.}
  5. Funkcja StatParam oblicz_statystyke (const Kapelusz *tk, size_t n) obliczająca i zwracająca wymagane informacje statystyczne. {2 pkt.}
  6. Instrukcje funkcji main() wywołujące sensownie powyższe funkcje.
  7. Wyświetlenie wyników analizy na ekranie. {0,5 pkt.}
  8. Podział kodu na pliki źródłowe: main.cpp, kapelusz.cpp, kapelusz.hpp oraz Makefile.

Zadanie #5 (7 pkt.) - 19 kwietnia 2017 r.

Wykonać symulację jednowymiarowego układu złożonego z dwóch mas punktowych m1 = 10 kg i m2 = 2 kg połączonych sprężyną o stałej sprężystości k = 200 N/m i długości l = 1 m. W chwili początkowej masie m1 nadano prędkość υ0 = 0,5 m/s. Zaimplementować struktury MasaPunktowa oraz Sprezyna zawierające fizyczne parametry reprezentowanych obiektów. Wyniki zapisywać do pliku / standardowego wyjścia (wybór) w czterech kolumnach: czas, x1, x2, Ecałkowita.

Etapy rozwiązania (po 1 pkt.):

  1. Struktury MasaPunktowa oraz Sprezyna. Sprezyna powinna zawierać wskaźniki na masy punktowe stanowiące początek i koniec sprężyny.
  2. Funkcja double silaSprezyny (const Sprezyna &s) zwracająca siłę pochodzącą od sprężyny s oraz funkcje double energia (const Sprezyna &s) oraz double energia (const MasaPunktowa &m) zwracające energię mechaniczna zgromadzoną w obiektach. {2,5 pkt.}
  3. Utworzenie i zainicjowanie obiektów w funkcji main().
  4. Symulacja metodą Eulera. {2 pkt.}
  5. Wypisywanie wyników na standardowe wyjście. {0,5 pkt}

Zadanie #4 (7 pkt.) - 5 kwietnia 2017 r.

Napisać program, który wczyta ze standardowego wejścia zestaw liczb całkowitych, posortuje je bąbelkowo i wypisze je w takim samym formacie na standardowe wyjście.

  1. Wczytanie danych ze standardowego wejścia do tworzonej tablicy dynamicznej; rozmiar tablicy należy powiększać o 1 (realloc) przy okażdym wczytaniu kolejnej liczby, aby robić miejsce na nową daną; na koniec ustawia w n rozmiar wczytanej tablicy. {3 pkt.}
  2. Sortowanie bąbelkowe podanej tablicy z danymi o rozmiarze n. {2,5 pkt.}
  3. Wyświetlenie tablicy z danymi na standardowe wyjście.
  4. Usunięcie w odpowiednim miejscu tablicy na stercie. {0,5 pkt}

Zadanie K1 - 29 marca 2017 r.

Napisać program, który wczyta z pliku o dowolnej nazwie zestaw liczb i obliczy dla niego wartość średnią i odchylenia standardowe oraz obliczy, jaki procent wartości znajduje się poza przedziałem 6 sigma. Pierwsza wartość w pliku z danymi oznacza liczbę liczb zawartych w pliku. Należy użyć rozwiązań wymienionych poniżej. Inne rozwiązania nie będą tym razem honorowane.

  1. Szkielet programu - odpowiednie pliki nagłówkowe, funkcja main().
  2. >
  3. Zapytanie o nazwę pliku z danymi, otwarcie pliku do odczytu, sprawdzenie poprawności uchwytu i ewentualne komunikaty o błędach. {1,5 pkt.}
  4. Pobranie rozmiaru próbki z pliku, utworzenie stosownej tablicy na stercie, sprawdzenie błędów alokacji. {1,5 pkt.}
  5. Wczytanie wszystkich liczb z pliku do tablicy.
  6. Obliczenie wartości średniej i odchylenia standardowego. {2 pkt.}
  7. Obliczenie bezwględnej oraz procentowej liczby danych znajdujących się poza przedziałem 6 sigma. {1,5 pkt.}
  8. Ładne wyświetlenie na ekranie obliczonych wartości.
  9. Zamknięcie pliku i zwolnienie przydzielonej pamięci. {0,5 pkt.}

Plik źródłowy należy wysłać na mój adres mailem (ze skrzynki w domenie PW) do godziny wskazanej na tablicy. Programy nadesłane po terminie nie będą sprawdzane.

Zadanie #3 - 22 marca 2017 r.

Napisać program weryfikujący numer konta bankowego podanego w formacie NRB. 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 rachunku poprawny/niepoprawny oraz wyświetlić nazwę banku prowadzącego rachunek. Do weryfikacji numeru użyć tzw. metody wielomianowej. Zoptymalizować typy używanych tablic pod kątem oszczędności pamięci.

Etapy rozwiązania (po 1 pkt.):

  1. Stworzenie tablicy const short [] zawierającej współczynniki wielomianu; wyświetlenie monitu o podanie NRB
  2. Wczytanie NRB do tablicy liczb (ignorując białe znaki).
  3. Obliczenie liczby kontrolnej. {2 pkt.}
  4. Sprawdzenie wartości liczby kontrolnej i na tej podstawie wyświetlenie komunikatu o (nie)poprawności numeru.
  5. Wczytanie pliku z identyfikatorami banków, wyszukanie pasującego identyfikatora i wyświetlenie nazwy banku. {1,5 pkt.}
  6. Optymalizacja operacji na tablicach (w dwóch dowolnie wybranych miejscach) poprzez zastosowanie "przesuwanych" wskaźników. {1,5 pkt.}

Przykładowe numery kont do weryfikacji działania programu można znaleźć na stronie ZUS.

Zadanie #2 - 15 marca 2017 r.

Napisać program obliczający wartości funkcji sinus, cosinus oraz ln (1+x) ze wzoru Taylora. Użytkownik dokonuje wyboru funkcji z menu, następnie podaje wartość argumentu oraz minimalną dokładność wyniku. Obliczanie wartości funkcji trwa tak długo, aż policzony w danej iteracji wyraz szeregu będzie mniejszy (co do modułu) od założonej dokładności. Program trwa do czasu wybrania opcji "wyjście" w menu.

Etapy rozwiązania (po 1 pkt.):

  1. Pętla while oraz wyświetlenie opcji menu (w tym 0 - wyjście).
  2. Analiza wyboru z menu instrukcją switch. Uwgzlędnienie błędnych opcji oraz wyjścia.
  3. Case 1: pętla do-while obliczająca i sumująca kolejne wyrazy szeregu Taylora dla funkcji sinus.
  4. Case 2 i 3: pętle do-while obliczające i sumujące kolejne wyrazy szeregu Taylora dla funkcji cosinus i ln (1+x). {2 pkt.}
  5. Schludne wyświetlanie wyników na ekran.

Zadanie #1 - 8 marca 2017 r. (6 pkt.)

Napisz program do wykonania obliczeń księgowych zestawu towarów. Program po uruchomieniu zapyta o nazwę pliku wejściowego oraz wyjściowego. Zestawienie towarów zawiera w każdej linii kolejno: nazwa towaru (jeden wyraz), cena jednostkowa netto, ilość, numer identyfikujący stawkę VAT (0 - 0%, 1 - 5%, 2 - 8%, 3 - 23%). Do pliku wyjściowego przetworzone dane należy zapisać następująco: nazwa towaru (jeden wyraz), cena jednostkowa netto, ilość, numer identyfikujący stawkę VAT, wartość netto, podatek VAT, wartość brutto. Każda kolumna oddzielona tabulacją. Identyczne informacje należy wyświetlić na ekranie, ale w postaci ładnie sformatowanej tabelki wraz z liczbą porządkową w pierwszej kolumnie. Ponadto na ekran należy wyświetlić następujące informacje: liczba pozycji, suma netto, suma VAT, suma brutto.

Etapy rozwiązania programu:

  1. Zapytanie i pobranie nazwy pliku wejściowego i wyjściowego.
  2. Otwarcie plików wraz z obsługą błędów.
  3. Czytanie linia po linii z pliku wejściowego do zmiennych tymczasowych (buforów).
  4. Przetwarzanie rekordów, obliczanie żądanych wartości i zapis do pliku wynikowego.
  5. Wyświetlenie nagłówka tabeli oraz ładnie sformatowanych danych.
  6. Sumowanie wartości łącznych i wyświetlenie ich na ekranie.

Zadanie #0 - 1 marca 2017 r.

Zajęcia wprowadzające.

  1. Korzystając z informacji zawartych na TEJ stronie, skonfiguruj w programie IceDove / Thunderbird swoją skrzynkę pocztową w pw.edu.pl.
  2. Skonfiguruj swoje ulubione środowisko programistyczne, tj. Geany.
  3. Napisz swój pierwszy fantastyczny program, np. wyświetlający rozmiary zmiennych różnych typów na ekranie.
  4. Uśmiechnij się!