Zadania laboratoryjne (14-16)

Zadanie #9 - 31 maja 2023 r. (5 pkt.)

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. {0,5 pkt.}
  3. Funkcja size_t RozmiarListy (const double_l *lista) zwracająca liczbę elementów na liście. {0,5 pkt.}
  4. Funkcja void WypiszDane (FILE *strumien, const double_l *lista) wypisująca do podanego strumienia wszystkie liczby z listy. {0,5 pkt.}
  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.
  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().
  8. Podział kodu na pliki źródłowe: dft.c, dft.h, main.c oraz Makefile. {0,5 pkt.}

Zadanie #8 - 24 maja 2023 r. (5 pkt.)

Napisać program obliczający wartość średnią, odchylenie standardowe oraz procent wartości znajdujących się poza przedziałem 6σ i wyświetlający te wielkości na ekran. Nazwę pliku z danymi wejściowymi (pierwsza linijka oznacza liczbę podanych w pliku liczb — należy ja usunąć przed rozpoczęciem testów) program pobiera z pierwszego argumentu uruchomienia programu. Liczba liczb w pliku jest nieznana — program podczas wczytywania kolejnych liczb powinien na bieżaco dokonywać realokacji pamięci tablicy na stercie.

Etapy rozwiazania (po 1 pkt.):

  1. Obsłużenie argumentów uruchomienia programu (w tym obsługa błędów) i otwarcie pliku wejściowego.
  2. Struktura struct DaneX zawierająca wskaźnik na tablicę punktów pomiarowych (precyzja double) oraz składową przechowującą rozmiar tablicy. {0,5 pkt.}
  3. Funkcja struct DaneX WczytajDane (FILE *we) wczytująca ze strumienia dane do tablicy na stercie (z realokacją). {0,5 pkt.}
  4. Funkcja void Statystyka (struct DaneX dane, double *srednia, double *sigma) wyznaczająca estymator wartości średniej i odchylenia standardowego oraz zwracająca te wartości poprzez wskaźniki z parametrów funkcji.
  5. Funkcja unsigned SixSigma (struct DaneX dane, double srednia, double sigma) obliczająca liczbę liczb w danych zawartych poza przedziałem 6σ. {0,5 pkt.}
  6. Wyświetlenie wyników obliczeń na ekranie. {0,5 pkt.}
  7. Podział na pliki źródłowe (dane.c, dane.h, main.c) oraz Makefile.

Napisać symulator rozpadu pierwiastków promieniotwórczych. Parametry symulacji program otrzymuje w formacie binarnym w pliku, o którego nazwę pyta użytkownika po 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ść planszy (16 bitów), wysokość planszy (16 bitów), ilość_pierwiastków (8 bitów),
następnie dla każdego pierwiastka: stała rozpadu lambda (float), kolor (32 bity w formacie 0x00rrggbb)

Dane do testowania programu:

Etapy rozwiązania (po 1 pkt.):

  1. Zapytanie o nazwę pliku, otwarcie pliku w trybie binarnym, sprawdzenie błędów. (0,5 pkt.)
  2. Wczytanie rozmiarów "planszy" z pliku binarnego. Wczytanie liczby pierwiastków, utworzenie tablicy do przechowywania ich stałych rozpadu oraz kolorów i wypełnienie ich wartościami z pliku. (0,5 pkt.)
  3. Struktura struct atom zawierająca jego połozenie na planszy (x, y), stałą rozpadu (lambdę), kolor (int) oraz stan (rozpadnięty / nierozpadnięty) (0,5 pkt.).
  4. Funkcja 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) (1,5 pkt.).
  5. Symulacja rozpadu (może być w funkcji main()); atom ulegający rozpadowi zmienia swój wewnętrzny stan i nie bierze udziału w kolejnych "losowaniach"; na standardowe wyjście zapisujemy dane w formacie: czas symulacji; liczba nierozpadniętych atomów (2 pkt.).

Arcyciekawe, niepunktowane zadanie domowe: program napisać w oparciu o szablon programu z biblioteką Allego, zawierający m.in. funkcje biblioteki graficznej Allegro 4. Zrobić graficzną wizualizację rozpadu promieniotwórczego.

Zadanie #5 - 19 kwietnia 2023 r. (5 pkt.)

Symulator drgań tłumionych masy punktowej m na sprężynie o stałej sprężystkości k i długości spoczynkowej l0 w ośrodku lepkim charakteryzowanym współczynnikiem oporu b. Wyniki symulacji wyświetlamy na standardowe wyjście w postaci trzech kolumn (czas, x, v) dla kilkunastu okresów oscylacji.

Etapy rozwiązania (po 1 pkt.):

  1. Definicja struktury MasaPunktowa zawierającej wszystkie potrzebne składowe.
  2. Funkcja double SilaOporuTlumionego (const MasaPunktowa *mp, double k, double l0) wyliczająca wartość siły działającej na mp.
  3. Utworzenie obiektu struktury w funkcji main() i nadanie mu właściwych parametrów. {0,5 pkt.}
  4. Szkielet głównej pętli symulacji wraz z wyświetlaniem danych na standardowe wyjście co pewien czas.
  5. Symulacja ruchu metodą Eulera. {1,5 pkt.}

Niepunktowana praca domowa: podziel dziesiejszy kod źródłowy na pliki main.c, masapunktowa.c, masapunktowa.h oraz Makefile i spróbuj zbudować program przy użyciu komendy make.

Zadanie #4 - 12 kwietnia 2023 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.):

  1. Pętla while odczytująca wyraz po wyrazie. {0,5 pkt.}
  2. Obliczanie ilości i sumarycznej długości wyrazów. {0,5 pkt.}
  3. Obliczanie liczby wystąpień słowa 'and' (uwględnij wielkość liter!). {0,5 pkt.}
  4. Obliczanie liczby wystąpień słowa 'God' (pamiętaj o dopełniaczu!). {0,5 pkt.}
  5. Obliczanie liczby wystąpień wyrazów zawierających literę 'e'. {0,5 pkt.}
  6. Funkcja void aktualizuj_histogram (unsigned *histogram, const char *wyraz) uzupełniająca podany jako parametr "histogram" na podstawie liter występujących w podanym wyrazie.
  7. Funkcja void wyswietl_histogram (const unsigned *histogram) wyświetlający na ekran procentową zawartość poszczególnych liter w histogramie.
  8. Utworzenie tablicy na histogram (w fukcji main()) oraz prawidłowe wywoływanie ww. funkcji. {0,5 pkt.}
  9. Wyświetlenie wyników analizy na ekran. {0,5 pkt.}

Zadanie #3 - 22 marca 2023 r. (5 pkt.)

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.):

  1. Stworzenie tablicy const short [] zawierającej wagi; wyświetlenie monitu o podanie NIP.
  2. Wczytanie NIP do tablicy liczb (ignorując białe znaki).
  3. Obliczenie liczby kontrolnej.
  4. Sprawdzenie wartości liczby kontrolnej i na tej podstawie wyświetlenie komunikatu o (nie)poprawności numeru.
  5. Optymalizacja operacji na tablicach (w dwóch dowolnie wybranych miejscach) poprzez zastosowanie "przesuwanych" wskaźników.

Weryfikacji działania programu można dokonać sprawdzając NIP PW: 525-000-58-34.

Zadanie #2 - 15 marca 2023 r. (5 pkt.)

Napisz program, który zapyta użytkownika o liczbę x > 0, a następnie wyliczy wartość ln(1+x) z wykorzystaniem szeregu Maclaurina. Błąd wyliczonej wartości powinien być mniejszy niż 1/1.000.000.

Zadanie #1 - 8 marca 2023 r. (5 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.{0,5 pkt.}
  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. {0,5 pkt.}