Zadania laboratoryjne (10-12)

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

Napisać program, który wczytywać będzie dane pomiarowe impedancji w formacie (częstotliwość, zawada, kąt fazowy - w stopniach) i konwertować je na format [częstotliwość, część rzeczywista, część urojona] — współrzędne Nyquista. Nazwy plików wejściowego i wyjściowego należy przekazać jako argumenty uruchomienia programu. Liczba danych nie jest znana, dlatego należy dane przechowywać w postaci listy jednokierunkowej. Ponadto program wyświetla na ekran komunikat o liczbie przekonwertowanych punktów pomiarowych.

Wartości impedancji potraktować jako liczby zespolone — użyj typów complex.

Etapy rozwiązania (po 1 pkt.):

  1. Struktura struct Impedancja zawierająca częstotliwość oraz zespoloną impedancję, przystosowana do pracy przy listach jednakowych. {0,5 pkt.}
  2. Funkcja Impedancja *WczytajDane (FILE *strumien) wczytująca dane z podanego strumienia i zwracająca wskaźnik na głowę listy jednokierunkowej. {0,5 pkt.}
  3. Struktura struct Impedancja zawierająca częstotliwość oraz zespoloną impedancję, przystosowana do pracy przy listach jednakowych. {0,5 pkt.}
  4. Funkcja void WypiszDaneNyquist (FILE *strumien, const Impedancja *lista) wypisująca do podanego strumienia dane w formacie Nyquista. {0,5 pkt.}
  5. Funkcja void KasujListę (Impedancja *lista) zwalniająca pamięć po liście. {0,5 pkt.}
  6. Funkcja size_t RozmiarListy (const Impedancja *lista) zwracająca liczbę elementów w liście. {0,5 pkt.}
  7. Obsłużenie argumentów uruchomienia programu, otwarcie plików, obsługa błędów, zamknięcie plików (na końcu). {0,5 pkt.}
  8. Użycie powyższych funkcji w funkcji main().
  9. Podział kodu na pliki źródłowe: impedancja.c, impedancja.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.

Zadanie #7 - 17 maja 2023 r. (5 pkt.)

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

Przygotuj symulator ruchu ciała niebieskiego (np. Ziemi) w polu grawitacyjnym masywnej gwiazdy (choćby Słońca), znajdującej się nieruchomo w środku układu współrzędnych. W chwili początkowej nadaj planecie sensowne położenie i prędkość, a następnie symuluj ruch przez okres dwóch obiegów wokół gwiazdy. Dane wyjściowe wyświetlamy na standardowe wyjście w postaci trzech kolumn (czas, x, y) w odstępach co jeden dzień.

Etapy rozwiązania (po 1 pkt.):

  1. Definicja struktury Obiekt2D zawierające wszystkie potrzebne składowe. {0,5 pkt.}
  2. Funkcja void SilaGrawitacji (const Obiekt2D *o1, const Obiekt2D *o1, double *Fx, double *Fy) wyliczająca składowe Fx, Fy siły grawitacji działającej na ciało o2 w polu grawitacyjnym ciała o1. {1,5 pkt.}
  3. Utworzenie obiektów struktur w funkcji main() i nadanie im 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 jeden dzień.
  5. Symulacja ruchu metodą Eulera. {1,5 pkt.}

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

Zadanie #4 - 12 kwietnia 2023 r. (5 pkt.)

Program dokonujący analizy częstotliwościowej liter w tekście podanym na standardowe wejście. Wynik należy wyświetlić w postaci "poziomego" histogramu zawierającego literę alfabetu, procentowy udział w badanej próbce oraz gwiazdki w liczbie proporcjonalnej do występowania.

Etapy rozwiązania (po 1 pkt.):

  1. Utworzenie tablicy typu unsigned w funkcji main() zainicjalizowanej zerami, przeznaczonej do przechowywania liczby wystąpień poszczególnych liter alfabetu łacińskiego. {0,5 pkt.}
  2. Funkcja void dodaj_tekst (unsigned *histogram, const char *fragment) analizująca fragment litera po literze i zwiększająca odpowiedni bin histogramu.
  3. Funkcja unsigned liczba_liter (const unsigned *histogram) zwracająca sumę wszystkich zliczeń w histogramie (sumę tablicy). {0,5 pkt.}
  4. Funkcja void gwiazdki (float procent, unsigned max) wyświetlająca na ekran liczbę gwiazdek stanowiącą procent maksymalnej liczby. {0,5 pkt.}
  5. Funkcja void wyswietl_histogram (const unsigned *histogram) wyświetlająca na ekran ładnie sformatowany histogram.
  6. Pętla while wczytująca tekst wyraz po wyrazie lub linia po linii do bufora tekstowego.
  7. Wywołanie potrzebnych funkcji w funkcji main(). {0,5 pkt.}

Program przetestować na angielskim przekładzie Księgi Rodzaju.

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

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

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

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

Napisać program, który wyliczy (w przestrzeni dwuwymiarowej) wartość potencjału elektrostatycznego wokół jednorodnie naładowanej prostokątnej płyty o szerokości 2a oraz wysokości 2b. Przyjąć, że środek płyty znajduje się w środku układu współrzędnych. Używac układu jednostek, w którym k = 1, zaś płyta jest naładowana ładunkiem o gęstości powierzchniowej σ = 1.

Wynik działania programu wysłać na standardowe wyjście w podstaci trzech kolumn: x, y, V(x, y), oddzielonych tabulacją. Po każdym "rzędzie" danych należy wstawić dodatkową pustą linię. Wówczas można w prosty sposób zwizualizować plik wynikowy za pomocą Gnuplota:
set pm3d
splot "nazwa_pliku"

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.}