Zadania laboratoryjne (14-16)

Zadanie K4 - 14 czerwca 2017 r.

Uzupełnić program o funkcjonalność polegającąna przełączaniu (w trakcie pracy) radaru z trybu domyślnego (D) w analizę odległości (R) oraz rozkładu kątowego (A).

Etapy rozwiązania (po 1 pkt.):

  1. [histogram.cpp] Funkcja void StatystykaMaxMin (const float *dane, size_t n, float &min, float &max) obliczająca wartość najmniejszą i największą i zwracająca je poprzez referencje min oraz max.
  2. [histogram.hpp] Struktura struct Histogram zawierająca tablicę 20 liczb zmiennoprzecinkowych (zawartość binów), składową na wartość najmniejszą i największą oraz rozmiar próbki. {0,5 pkt.}
  3. [histogram.cpp] Funkcja void WypelnijHistogramR (Histogram &h, const dane dane) wypełniająca histogram h odległości obiektów na podstawie danych.
  4. [histogram.cpp] Funkcja void WypelnijHistogramFi (Histogram &h, const dane dane) wypełniająca histogram h położenia kątowego obiektów na podstawie danych.
  5. [grafika.hpp] Aktualizacja typu wyliczeniowego enum RodzajWykresu na pola: DEFAULT, RADIAL oraz ANGLE. {0,5 pkt.}
  6. [grafika.cpp] Funkcja void RysujRadar (RodzajWykresu rw, const dane dane) rysująca okno radaru o rozmiarach 500x500 o podanym kształcie. Dzisiejsza wersja programu rysuje radar kwadratowy oraz nanosi punkty w przypadku typu RADIAL oraz ANGLE. Na swoją potrzebę wywołuje funkcję wypełniania hiostogramu. Normuje wykres do warości maksymalnej korzystając z wcześniej napisanej funkcji {4 pkt.}
  7. [main.cpp] Końcowa wersja funkcji main()obsługująca wszystkie funkcjonalności. W szczególności pętla zmieniająca wyświetlane radary po wciśnięciu odpowiedniego klawisza oraz kończąca program po wciśnięciu Q. {1,5 pkt.}
  8. Uzupełniony Makefile. {0,5 pkt.}

Zadanie K3 - 7 czerwca 2017 r.

Napisać program do wizualizacji (w bibliotece Allegro) danych ze stacji radarowej. Nazwę pliku z danymi wejściowymi podajemy jako argument wywołania programu. Każda linia danych zawiera kolejno: znormalizowaną odległość od stacji (0-100), kąt obserwacji (0-359), rozmiar obiektu (1-10).

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 odpowiednią liczbę parametrów, właściwy przełącznik jako pierwszy argument (-b lub -t), próbuje otworzyć plik i wpisuje do zwracanej struktury typ pliku oraz uchwyt. Sygnalizuje błędy.
  3. [dane.hpp] Struktura struct obiekt zawierająca położenie biegunowe obiektu i jego rozmiar. {0,5 pkt.}
  4. [dane.hpp] Obiekty 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 obiekty {0,5 pkt.}
  5. [dane.cpp] Funkcja obiekty WczytajDaneTXT (FILE *plik) wczytująca dane tekstowe z pliku, przydzielająca pamięć itd.
  6. [dane.cpp] Funkcja obiekty WczytajDaneBIN (FILE *plik) wczytująca dane binarne (precyzja float) z pliku, przydzielająca pamięć itd.
  7. [dane.cpp] Funkcje float polozenieX (const obiekt &o) oraz float polozenieY (const obiekt &o) zwracające znormalizowane (-100; +100) położenie X lub Y podanego obiektu.
  8. [grafika.hpp] Typ wyliczeniowy enum RodzajWykresu zawierający pola RADIALNY oraz KWADATOWY. {0,5 pkt.}
  9. [grafika.cpp] Funkcja void RysujRadar (RodzajWykresu rw) rysująca okno radaru o rozmiarach 500x500 o podanym kształcie. Dzisiejsza wersja programu rysuje radar oraz nanosi punkty tylko w przypadku podania opcji radaru radialnego {2 pkt.}
  10. [main.cpp] Testowa funkcja main()wywołująca funkcję analizującą argumenty programu, wczytująca dane oraz wyświetlająca radar radialny.
  11. [Makefile] Makefile.

Dane wejściowe (tekstowe) do testowania:

Dane wejściowe (binarne) do testowania:

Zadanie #9 - 31 maja 2017 r.

Do poprzedniego programu dołączyć trzy nowe funkcjonalności: wygładzanie oraz numeryczne obliczanie pochodnej i całki funkcji wejściowej. 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. 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 *WczytajDane2 (FILE *strumien) wczytująca dane z podanego strumienia i zwracająca wskaźnik na głowę listy jednokierunkowej. {0,5 pkt.}
  3. Funkcja size_t RozmiarListy2 (const double2_l *lista) zwracająca liczbę elementów na liście. {0,5 pkt.}
  4. Funkcja void WypiszDane2 (FILE *strumien, const double2_l *lista) wypisująca do podanego strumienia wszystkie liczby z listy. {0,5 pkt.}
  5. Funkcja double2_l *Calka (const double2_l *lista) licząca całkę nieoznaczoną dla podanych danych i zwracająca ją w postaci nowej listy. {2 pkt.}
  6. 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.}
  7. Funkcja double2_l *Wygladzanie (const double2_l *lista) wygładzająca podane dane i zwracająca je w postaci nowej listy. {1,5 pkt.}
  8. Funkcja void KasujListe2 (double2_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ł nowego kodu na pliki źródłowe: double2_l.c, calculus.c (+ odpowiednie pliki nagłówkowe) oraz uaktualniony Makefile. {1 pkt.}

Dane wejściowe do testowania:

Zadanie #8 - 24 maja 2017 r.

Napisać program, który będzie obliczać dyskretną transformatę Fouriera 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 double_l służąca do przechowywania liczb typu double w postaci listy jednokierunkowej {0,5 pkt.}
  2. Funkcja double_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 double_l *lista) zwracająca liczbę elementów na liście.
  4. Funkcja void WypiszDane (FILE *strumien, const double_l *lista) wypisująca do podanego strumienia wszystkie liczby z listy.
  5. 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,5 pkt.}
  6. Funkcja void KasujListę (double_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: double_l.c, dft.c, main.c (+ odpowiednie pliki nagłówkowe) oraz Makefile. {2 pkt.}

Zadanie #7 - 17 maja 2017 r.

Napisać symulator rozpadu pierwiastków promieniotwórczych. Parametry symulacji podaje się w formacie binarnym w pliku, którego nazwę należy podać jako parametr uruchomienia programu. Atomy są rozłozone na dwuwymiarowym prostokącie. Reakcję rozpadu symulujemy metodą Monte Carlo. "Rozpadnięty" atom znika z planszy i nie bierze udziału w dalszej symulacji. Symulacja kończy się, gdy liczba atomów zmaleje 25-krotnie.

Format pliku binarnego:
szerokość (16 bitów), wysokość (16 bitów), ilość_pierwiastków (8 bitów),
dla każdego pierwiastka: lambda (float), kolor (4x8 bitów formacie 0x00rrggbb).

Dane do programu:

Etapy rozwiązania (po 1 pkt.):

  1. Analiza parametru uruchomienia programu, otwarcie pliku w trybie binarnym, sprawdzenie błędów.
  2. Wczytanie rozmiarów "planszy" i otwarcie okna.
  3. Wczytanie liczby pierwiastków, utworzenie tablicy do przechowywania ich kolorów i wypełnienie jej (użyj funkcji int makecol (int r, int g, int b).
  4. Wyświetlenie na standardowe wyście błędów liczby atomów i ich czasów rozpadu (w formacie tekstowym).
  5. Struktura struct atom zawierająca jego połozenie na planszy (x, y), czas połowicznego rozpadu, kolor oraz stan (rozpadnięty / nierozpadnięty).
  6. Funkcja struct atom *generuj_atomy (size_t szerokosc, size_t wysokosc, size_t n, const int kolory[], const float lambdy[]) zwracająca wskaźnik na tablicę na stercie zawierającą rozlosowane atomy na całej planszy; n oznacza liczbę pierwiastków; każdy pierwiastek losowany jest z jednakowym prawdopodobieństwem). {2 pkt.}
  7. Narysowanie atomów na planszy.
  8. Symulacja rozpadu (może być w funkcji main()); atom ulegający rozpadowi znika (staje się czarny) z planszy; na standardowe wyjście zapisujemy dane w formacie: czas symulacji; liczba atomów. {2 pkt.}

Zadanie K2 - 10 maja 2017 r.

Napisać program, który będzie losował zestawy liczb o rozkładzie normalnym i zadanym rozmiarze, a następnie obliczał estymatory wartości średniej, odchylenia standardowego oraz medianę. Na ekranie należy wyświetlić wyniki obliczeń w postaci czterech kolumn (n, m, s, d) dla n = 10, 100, 1000,..., 10000000.

  1. struct tablica_d zawierająca wskaźnik na tablicę typu double oraz zmienną typu size_t określającą liczbę elementów tablicy (0,5 pkt.)
  2. Funkcja tablica_d GeneratorNormalny (size_t n) tworzący na stercie tablicę o podanej liczbie elementów n i wypełniający ją liczbami o rozkładzie normalnym. (2 pkt.)
  3. Funkcja void Statystyka_ms (const tablica_d 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 tablica_d Sortuj (const tablica_d tab) zwraca kopię (na stercie) podanej jako argument tablicy, posortowanej bąbelkowo. (2 pkt.)
  5. Funkcja double Statystyka_d (const tablica_d tab) zwraca medianę liczb z podanej tablicy; wywołuje powyższą funkcję do sortowania bąbelkowego; pamięta o zwolnieniu pamięci przydzielonej na kopię tablicy.
  6. Wywołanie ww. funkcji w funkcji main() w celu wyświetlenia żądanej tabelki.
  7. 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 mięsa (w postaci stosów) z Centrum Zaopatrzenia Budek z Kebabami, który powinien zawierać sumaryczną liczbę stosów, średnią wysokość stosu, sumaryczną objętość oraz masę. W związku ze wzrostem popytu na kebaby w Polsce, Centrum Zaopatrzenia Budek z Kebabami rozpoczęlo dystrybucję stosów mięsa 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 następująca:

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

Stosy powinny być reprezentowane w programie jako obiekty odpowiednich struktur.

Etapy rozwiązania (po 1 pkt.):

  1. Struktury KebabW, KebabP oraz KebabT dla poszczególnych kształtów stosów. {0,5}
  2. Unia KebabU zawierająca trzy ww. typy kebabów oraz struktura Kebab zawierajaca unię oraz obiekt typu wyliczeniowego określający kształt przechowywanego kebaba.
  3. Funkcja Kebab *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 Kebab *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, kebab.cpp, kebab.hpp oraz Makefile.

Zadanie #5 - 19 kwietnia 2017 r.

Napisać program, który pobierze ze standardowego wejścia dowolną liczbę danych (x, y) oraz wypisze na standardowe wyjście dane w formacie (x, y, f(x)), gdzie f(x) jest funkcją liniową najlepszego dopasowania. Nadto wypisze na ekran parametry dopasowania a i b wraz z ich niepewnościami.

Etapy rozwiązania (po 1 pkt.):

  1. Struktura punkt_pomiarowy zawierająca składowe x, y, f {0,5 pkt.}.
  2. Funkcja punkt_pomiarowy *wczytaj (FILE *we, size_t &n) wczytująca dane ze strumienia i zwracająca wskaźnik na początek tablicy oraz uzupełniająca jej rozmiar n {1,5 pkt.}.
  3. Funkcja void wartosci_dopasowania (punkt_pomiarowy *dane, size_t n, double a, double b) uzupełniająca dane o wartości dopasowania prostą f(x)= a*x + b. {0,5 pkt.}
  4. Funkcja void dopasowanie_mnk (const punkt_pomiarowy *dane, size_t n, double &a, double &b, doble &sa, double &sb) wpisująca do zmiennych a, b, sa, sb parametry dopasowania wraz z ich niepewnościami; wykonuje wszystkie potrzebne obliczenia {2 pkt.}.
  5. Funkcja void wypisz_dane_z_dopasowaniem (FILE *wy, const punkt_pomiarowy *dane, size_t n) wypisująca dane wraz z dopasowaniem do strumienia.
  6. Funkcja main() zawierająca sensowne uzycie powyższych funkcji.
  7. Skasowanie tablicy (dealokacja pamięci) oraz wyświetlenie parametrów dopasowania na ekran. {0,5 pkt.}

Zadanie #4 - 5 kwietnia 2017 r.

Napisać program, który wczyta poprzez standardowe wejście nazwiska i imiona studentów w grupie (pierwsza linijka ma zawierać liczebność grupy), posortuje je alfabetycznie (wykorzystując algorytm sortowania bąbelkowego) i wyświetli na standardowe wyjście, dodając obok nazwiska nazwę pluszowego zwierzątka, które wygrywa dana osoba. Nagrodą jest zwierzątko, któremu odpowiada spełnienie pierwszego z poniższych warunków:

  1. Eskulapa - nazwisko zawiera co najmniej 2 litery e
  2. Kokoszka - nazwisko zaczyna się od sylaby ko
  3. Orzeł - nazwisko zawiera literę o
  4. Lew - nazwisko kończy się na ski/ska
  5. Króliczek - nagroda pocieszenia

Etapy rozwiązania (po 1 pkt.):

  1. Wczytanie liczebności grupy oraz utworzenie dwóch tablic wskaźników char*.
  2. Wczytywanie w pętli nazwisk i imion do buforów, tworzenie dynamicznych tablic dostosowanych do przechowania tychże oraz skopiowanie tam nazwiska i imiona oraz "podczepienie" pod tablice z pkt. 1. {1,5 pkt.}
  3. Wysortowanie danych bąbelkowo {2 pkt.}.
  4. Sprawdzenie warunków 1-2.
  5. Sprawdzenie warunków 3-4.
  6. Instrukcje if sprawdzające powyższe tudzież przyznające nagrodę pocieszenia. {0,5}
  7. Wyświetlenie pełnych rekordów na standardowe wyjście.

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ę!