Zajęcia laboratoryjne (piątek 17-19)

Zadanie #09 — 31 maja 2022 r.

Program dokonujący sortowania bąbelkowego zestawu liczb całkowitych. Dane pobiera przez standardowe wejście, sortuje, po czym wyświetla je na standardowe wyjście. Na ekran wyświetla czas trwania operacji sortowania.

Etapy rozwiązania (po 1 pkt.):

  1. [dane.c] Funkcja int *WczytajDane (FILE *strumien, size_t *n) wczytująca dane z dowolnego podanego strumienia do tablicy na stercie (przydzielaj pamięć dynamicznie, z realokacją) i zwracająca wskaźnik na jej początek. Poprzez wskaźnik n zwracami liczbę wczytanych liczb (liczbę elementów tablicy).
  2. [dane.c] Funkcja void WypiszDane (FILE *strumien, const int *dane, size_t n) wypisująca na dowolny strumień dane z podanej tablicy o liczbie elementów n {0,5 pkt.}.
  3. [sortowanie.c] Funkcja void SortujDane (int *dane, size_t n) sortująca bąbelkowo podaną tablicę o liczbie element n.
  4. [main.c] Wczytanie danych ze standardowego wejścia, posortowanie tablicy i wypisanie danych na standardowe wyjście. {0,5 pkt.}
  5. [main.c] "Otoczenie" wywołania funkcji sortującej instrukcjami liczącymi czas operacji (z precyzją lepszą niż 1 sekunda). Wyświetlenie wyniku pomiaru czasu na ekran.
  6. Podział kodu na pliki źródłowe, nagłówkowe oraz Makefile.

Przykładowe dane do testowania możesz wygenerować samodzielnie używając polecenia linuxowego:
shuf -i 0-10000 > liczby_losowe.txt
gdzie 0-10000 oznacza zakres (i jednocześnie rozmiar zbioru) losowanych liczb.

Zadanie (niepunktowane) domowe: Wykonaj pomiary dla kilku różnych rozmiarów danych wejściowych i sprawdź, czy algorytm sortowania bąbelkowego ma złożoność obliczeniową O(n2).

Zadanie #8 - 24 maja 2022 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. {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(). {0,5 pkt.}
  8. Podział kodu na pliki źródłowe: double_l.c, dft.c, main.c (+ odpowiednie pliki nagłówkowe) oraz Makefile.

Zadanie #07 — 17 maja 2022 r.

Program obliczający numerycznie pochodną oraz całkę nieoznaczoną funkcji, której wartości znajdują się w pliku wejściowym. Format pliku wejściowego i wyjściowego (tworzonego przez program) jest taki sam: w kolejnych wierszach znajdują się dwie wartości xi oraz yi oddzielone tabulacją. Plik wejściowy podajemy strumieniem na standardowe wejście. Dane wynikowe wypisywane mają być na standardowe wyjście. Wybór operacji (całkowanie / różniczkowanie) dokonujemy poprzez argument uruchomienia programu: -I (całkowanie) lub -D (różniczkowanie). Żeby było wesoło, dane przechowywane są w programie w postaci listy jednokierunkowej. Program nie zadaje użytkownikowi żadnych pytań!

Etapy rozwiązania (po 1 pkt.):

  1. [danexy.h] Struktura struct DaneXY zawierająca dwie składowe (x, y) oraz przystosowana do pracy w listach jednokierunkowych. {0,5 pkt.}
  2. [danexy.c] Funkcja struct DaneXY *WczytajDane (FILE *strumien) wczytująca dane z dowolnego strumienia do listy jednokierunkowej i zwracająca wskaźnik na jej początek. {0,5 pkt.}
  3. [danexy.c] Funkcja void WypiszDane (FILE *strumien, const struct DaneXY *lista) wypisująca na dowolny strumień dane z podanej listy w postaci dwóch kolumn oddzielonych tabulacją. {0,5 pkt.}
  4. [danexy.c] Funkcja struct DaneXY *PoliczCalke (const struct DaneXY *lista) obliczająca całkę nieoznaczoną z funkcji podanej w liście jednokierunkowej i zwracająca ją w postaci nowej listy jednokierunkowej.
  5. [danexy.c] Funkcja struct DaneXY *PoliczPochodna (const struct DaneXY *lista) obliczająca pochodną z funkcji podanej w liście jednokierunkowej i zwracająca ją w postaci nowej listy jednokierunkowej. {0,5 pkt.}
  6. [main.c] Obsłużenie (sprawdzenie) argumentu uruchomienia programu i wybór właściwej funkcji (całkowanie / różniczkowanie). {0,5 pkt.}
  7. [main.c] Pozostałe instrukcje głównej funkcji, w tym usunięcie list jednokierunkowych na końcu (opcjonalnie można ten fragment kodu wyodrębnić w postaci dedykowanej funkcji). {0,5 pkt.}
  8. Podział kodu na pliki źródłowe, nagłówkowe oraz Makefile.

Przykładowe dane wejściowe do testowania:

Zadanie #06 — 4 maja 2022 r.

Napisać program, który obliczy wartość średnią, odchylenie standardowe, element największy, najmniejszy w zbiorze liczb podanych w pliku binarnym. Po uruchomieniu program pyta się o nazwę pliku, następnie wyświetla na ekran obliczone parametry statystyczne. Program winien się składać z trzech plików źródłowych: main.c, io.c, analiza.c, oraz stosownych plików nagłówkowych oraz Makefile.
W pliku binarnym pierwsze 32 bity mają specjalne znaczenie. Zapalony najstarszy bit (MSB) oznacza, że dane będą typu double. Zgaszony MSB oznacza, że będą typu float. Pozostałe bity określają liczbę danych. Następnie następuje określona liczba danych typu double lub float.

Etapy rozwiązania (po 1 pkt.):

  1. Funkcja double *wczytaj_dane (FILE *plik_binarny, size_t *rozmiar) wczytująca dane z pliku binarnego (podanego jako argument) oraz wracająca przez wskaźnik rozmiar wczytanych danych. Niezależnie, czy dane w pliku binarnym były w precyzji float czy double, funkcja zwraca tablicę o precyzji double. [io.c] {1,5 pkt.}
  2. Funkcja void srednia_odchylenie (const double dane[], size_t rozmiar, double *m, double *s) obliczająca wartość średnią (m) i odchylenie standardowe (s) danych w tablicy. [analiza.c]
  3. Funkcja void max_min (const double dane[], size_t rozmiar, double *max, double *min) obliczająca wartość maksymalną i minimalną. [analiza.c] {0,5 pkt.}
  4. Sensowne wywołanie instrukcji w funkcji main(). [main.c]
  5. Podział kodu na pliki źródłowe, nagłówkowe oraz Makefile.

Zadanie #05 — 26 kwietnia 2022 r.

Napisać program generujący raport statystyczny transportu towaru dla Centrum Zaopatrzenia Budek z Kebabem. Mięso dostarczane jest w postaci cylindrycznych stosów o zmierzonej wysokości, promieniu i masie oraz rodzajowi mięsa (K/W). Program wczytuje spis towarów ze standardowego wyjścia i wyświetla na ekran raport zawierający: średnią wysokość stosu (wraz z odchyleniem standardowym), średni promień stosu (wraz z odchyleniem standardowym) oraz sumaryczną masę z podziałem na kurczaka (K) i baraninę (W). Należy także podać bezwględną oraz procentową ilość stosów z kurczaka i baraniny.

Etapy rozwiązania (po 1 pkt.):

  1. Definicja typu wyliczeniowego enum rodzaj_miesa (kurczak lub baranina) oraz struktury struct kebab zawierającej stosowne składowe (wysokość, promień, masa, rodzaj mięsa (jako typ wyliczeniowy!)). {0,5 pkt.}
  2. Wprowadzenie wygodnych nazw za pomocą typedef dla powyższych typów. {0,5 pkt.}
  3. Funkcja kebab *wczytaj_dane (FILE *strumien, size_t *n) wczytująca ze strumienia opis transportu i przekazująca liczbę rekordów przez wskaźnik n, jak również zwracająca wskaźnik na tablicę wczytanych danych. {1,5 pkt.}
  4. Funkcja void analiza_statystyczna (const kebab *dane, size_t n) analizująca dane z tabeli i wyświetlająca raport na standardowe wyjście.
  5. Sensowne wywołanie powyższych funkcji w funkcji main().
  6. Zwolnienie pamięci przydzielonej do tablicy dynamicznej. {0,5 pkt.}

Niepunktowane zadanie domowe: rozdzielić powyższy fantastyczny program na trzy pliki: main.c, kebab.c, kebab.h oraz napisać Makefile.

Zadanie #4 - 12 kwietnia 2022 r.

Napisać program, który metodą najmniejszych kwadratów dopasuje prostą do zestawu danych. Dane (dwie kolumny: x, y) podajemy programowi przez standardowe wejście. Następnie program wyświetla na ekran parametry a, b dopasowania oraz na standardowe wyjście dane z dopasowaniem (w trzech kolumnach: x, y, f(x)). Przykładamy troskę o wewnętrzną budowe programu, dlatego użyjemy struktury do przechowywania danych oraz odpowiednich funkcji.

Etapy rozwiązania (po 1 pkt.):

  1. Definicja struktury struct punkt zawierająca dwie składowe x i y punktu pomiarowego. {0,5 pkt.}
  2. Funkcja struct punkt *wczytaj_dane (FILE *strumien, size_t *n) wczytująca dane ze strumienia do tablicy struktur (tworzonej i powiększanej dynamicznie); poprzez wskaźnik n przekazuje liczbę wczytanych punktów.
  3. Funkcja void mnk (const struct punkt dane[], size_t n, double *a, double *b) dopasowująca metodą najmniejszych kwadratów prostą i przekazującą parametry dopasowania przez wskaźniki a i b. {1,5 pkt.}
  4. Funkcja void wypisz_z_dopasowaniem (FILE *strumien, const struct punkt dane[], size_t n, double a, double b) wypisująca do strumienia punkty z tablicy danych oraz wartość dopasowania (w trzeciej kolumnie). {0,5 pkt.}
  5. Prawidłowe użycie ww. funkcji w funkcji main().
  6. Usunięcie tablicy dynamicznej w stosownym miejscu. {0,5 pkt.}

Niepunktowane zadanie domowe: rozdzielić powyższy fantastyczny program na trzy pliki: main.c, mnk.c, mnk.h oraz napisać Makefile.

Zadanie #03 — 29 marca 2022 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.
  3. Obliczanie liczby wystąpień słowa 'and' (uwględnij wielkość liter!).
  4. Obliczanie liczby wystąpień słowa 'God' (pamiętaj o dopełniaczu!).
  5. Obliczanie liczby wystąpień wyrazów zawierających literę 'e'.
  6. Wyświetlenie wyników analizy na ekran. {0,5 pkt.}

Zadanie #02 — 22 marca 2022 r.

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 typu 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. Wczytanie pliku z identyfikatorami banków, wyszukanie pasującego identyfikatora i wyświetlenie nazwy banku.

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

Zadanie #1 - 15 marca 2022 r.

Napisać program, którego główna funkcjonalność polegać będzie na rozwiązaniu równania kwadratowego w dziedzinie liczb rzeczywistych. Po uruchomieniu program wyświetla menu z opcjami: 1. Rozwiąż równanie 2. stopnia; 2. Rozwiąż równanie 3. stopnia; 4. Rozwiąż równanie 4. stopnia; 5. Rozwiąż równanie 5. stopnia; 0. Wyjście. Po wybraniu opcji innej niż 2, należy wyświetlić komunikat "WERSJA DEMO". Program chodzi cyklicznie aż do wybrania opcji 0.
Po wybraniu opcji 2 program pyta użytkownika o trzy współczynniki równania kwadratowego i wyświetla rozwiązania. Należy uwzględnić wszystkie możliwości!

Etapy rozwiązania (po 1 pkt.):

  1. Pętla while wyświetlająca menu aż do spełnienia warunku zakończenia programu.
  2. Zapytanie o wybór pozycji menu i szkielet instrukcji switch badającej wybraną opcję.
  3. Poszczególne opcje instrukcji switch. Wyświetlenie komunikatu WERSJA DEMO oraz BŁĘDNA OPCJA w odpowiednich przypadkach.
  4. Zapytanie o współczynniki równania 2. stopnia. {0,5 pkt.}
  5. Obliczenie i wyświetlenie wyniku w sytuacji, gdy równanie jest liniowe (tj. a == 0).
  6. Obliczenie i wyświetlenie wyniku w sytuacji, gdy równanie jest naprawdę kwadratowe. {1,5 pkt.}

Zadanie #0 — 8 marca 2022 r.

  1. Skonfiguruj swoje ulubione środowisko programistyczne, tj. Geany.
  2. Napisz swój pierwszy fantastyczny program, który pobierze ze standardowego wejścia listę osób oraz ich dochodów (imię, nazwisko, przychód, koszty - oddzielone tabulacją), a następnie wyświetli na ekran elegancką tabelkę z nagłówkiem i następującymi kolumnami: lp, imię, nazwisko, przychód, koszty, dochód, należny podatek za rok 2019.
  3. Uśmiechnij się!