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.):
- Struktura struct Impedancja zawierająca częstotliwość oraz zespoloną impedancję, przystosowana do pracy przy listach jednakowych. {0,5 pkt.}
- Funkcja Impedancja *WczytajDane (FILE *strumien) wczytująca dane z podanego strumienia i zwracająca wskaźnik na głowę listy jednokierunkowej. {0,5 pkt.}
- Struktura struct Impedancja zawierająca częstotliwość oraz zespoloną impedancję, przystosowana do pracy przy listach jednakowych. {0,5 pkt.}
- Funkcja void WypiszDaneNyquist (FILE *strumien, const Impedancja *lista) wypisująca do podanego strumienia dane w formacie Nyquista. {0,5 pkt.}
- Funkcja void KasujListę (Impedancja *lista) zwalniająca pamięć po liście. {0,5 pkt.}
- Funkcja size_t RozmiarListy (const Impedancja *lista) zwracająca liczbę elementów w liście. {0,5 pkt.}
- 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.}
- Użycie powyższych funkcji w funkcji main().
- 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.):
- Obsłużenie argumentów uruchomienia programu (w tym obsługa błędów) i otwarcie pliku wejściowego.
- Struktura struct DaneX zawierająca wskaźnik na tablicę punktów pomiarowych (precyzja double) oraz składową przechowującą rozmiar tablicy. {0,5 pkt.}
- Funkcja struct DaneX WczytajDane (FILE *we) wczytująca ze strumienia dane do tablicy na stercie (z realokacją). {0,5 pkt.}
- 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.
- Funkcja unsigned SixSigma (struct DaneX dane, double srednia, double sigma) obliczająca liczbę liczb w danych zawartych poza przedziałem 6σ. {0,5 pkt.}
- Wyświetlenie wyników obliczeń na ekranie. {0,5 pkt.}
- 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.):
- Zapytanie o nazwę pliku, otwarcie pliku w trybie binarnym, sprawdzenie błędów. (0,5 pkt.)
- 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.)
- 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.).
- 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.).
- 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.):
- Definicja struktury Obiekt2D zawierające wszystkie potrzebne składowe. {0,5 pkt.}
- 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.}
- Utworzenie obiektów struktur w funkcji main() i nadanie im właściwych parametrów. {0,5 pkt.}
- Szkielet głównej pętli symulacji wraz z wyświetlaniem danych na standardowe wyjście co jeden dzień.
- 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.):
- Utworzenie tablicy typu unsigned w funkcji main() zainicjalizowanej zerami, przeznaczonej do przechowywania liczby wystąpień poszczególnych liter alfabetu łacińskiego. {0,5 pkt.}
- Funkcja void dodaj_tekst (unsigned *histogram, const char *fragment) analizująca fragment litera po literze i zwiększająca odpowiedni bin histogramu.
- Funkcja unsigned liczba_liter (const unsigned *histogram) zwracająca sumę wszystkich zliczeń w histogramie (sumę tablicy). {0,5 pkt.}
- Funkcja void gwiazdki (float procent, unsigned max) wyświetlająca na ekran liczbę gwiazdek stanowiącą procent maksymalnej liczby. {0,5 pkt.}
- Funkcja void wyswietl_histogram (const unsigned *histogram) wyświetlająca na ekran ładnie sformatowany histogram.
- Pętla while wczytująca tekst wyraz po wyrazie lub linia po linii do bufora tekstowego.
- 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.):
- Stworzenie tablicy const short [] zawierającej współczynniki wielomianu; wyświetlenie monitu o podanie NRB.
- Wczytanie NRB 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.
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:
- Zapytanie i pobranie nazwy pliku wejściowego i wyjściowego.{0,5 pkt.}
- Otwarcie plików wraz z obsługą błędów.
- Czytanie linia po linii z pliku wejściowego do zmiennych tymczasowych (buforów).
- Przetwarzanie rekordów, obliczanie żądanych wartości i zapis do pliku wynikowego.
- Wyświetlenie nagłówka tabeli oraz ładnie sformatowanych danych.
- Sumowanie wartości łącznych i wyświetlenie ich na ekranie. {0,5 pkt.}