Zadania

Projekt - od 29 maja do 12 czerwca 2015 r.

Grupa 12-14 »

Zadanie #10 - 22 maja 2015 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. Do obsługi danych użyć listy jednokierunkowej.

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) wczytująca dane ze strumienia i zwracająca wskaźnik na początek listy (1,5 pkt.).
  3. Funkcja void wartosci_dopasowania (punkt_pomiarowy *dane, double a, double b) uzupełniająca dane o wartości dopasowania prostą f(x)= a*x + b.
  4. Funkcja void dopasowanie_mnk (punkt_pomiarowy *dane, double dopasowanie[2][2]) wpisująca do tablicy 2x2 parametry dopasowania a i b wraz z ich niepewnościami; wykonuje wszystkie potrzebne obliczenia, a w międzyczasie wywołuje funkcję z powyższego podpunktu (3 pkt.).
  5. Funkcja void wypisz_dane_z_dopasowaniem (FILE *wy, const punkt_pomiarowy *dane) wypisująca dane wraz z dopasowaniem do strumienia.
  6. Funkcja main() zawierająca sensowne użycie powyższych funkcji.
  7. Skasowanie listy (dealokacja pamięci) oraz wyświetlenie parametrów dopasowania na ekran.
  8. Podział na pliki: main.c, mnk.c, mnk.h + Makefile.

Zadanie #9 - 12 maja 2015 r.

Napisać generator liczb losowych o dwóch rozkładach: a) jednostajnego pomiędzy wartością minimalną a maksymalną; b) Gaussa. Wybór rozkładu, rozmiar próbki oraz jego parametry określane są jako argumenty wywołania programu. Liczby wypisywane są na standardowe wyjście. Na ekran wypisuje się także faktyczne parametry rozkładu (wartość średnia i odchylenie standardowe). Komunikaty o błędach na standardowe wyjście błędów. Użyć wskaźników na funkcje!

Przykłady użycia:
a) 10000 liczb o rozkładzie Gaussa (3; 0,15):
./program09 -G 10000 3 0.15
b) 5000 liczb o rozkładzie jednostajnym pomiędzy -100 a +100:
./program09 -J 5000 -100 +100

Etapy rozwiązania (po 1 pkt.):

  1. Funkcja double generator_gaussa (double m, double s) zwracająca jedną liczbę z rozkładu Gaussa (m, s).
  2. Funkcja double generator_jednostajny (double min, double max) zwracająca jedną liczbę z rozkładu jednostajnego o wartości z zakresu (min, max).
  3. Analiza parametrów uruchomienia programu, sprawdzenie ich poprawności i przypisanie do wskaźnika funkcji wybranego rozkładu (1,5 pkt.).
  4. Funkcja double *generator_losowych (double (*generator) (double, double), size_t n, double p1, double p2) zwracająca wskaźnik na tablicę na stercie (przydzielić pamięć!) zawierającą n liczb losowych wygenerowanych przez podany generator, o parametrach p1 i p2 (2 pkt.).
  5. Funkcja struct parametry_rozkladu oblicz_statystyke (const double dane[], size_t rozmiar) obliczająca estymator wartości średniej i odchylenia standardowego danych w tablicy.
  6. Trywialna funkcja void wypisz (FILE *wy, const double dane[], size_t n) wypisująca na podany strumień wyjściowy n liczb z tablicy dane.
  7. Funkcja main(), w tym porównanie parametrów rozkładu z oczekiwanymi i zwolnienie na końcu pamięci (1,5 pkt.).
  8. Podział na pliki: main.c, generator.c, generator.h + Makefile.

Zadanie #8 - 8 maja 2015 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 (por. praca domowa do zad #5). 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 (32 bity 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. Struktura struct atom zawierająca jego połozenie na planszy (x, y), czas połowicznego rozpadu, kolor oraz stan (rozpadnięty / nierozpadnięty) (0,5 pkt.).
  5. Funkcja struct atomy *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.).
  6. Narysowanie atomów na planszy (0,5 pkt.).
  7. 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 (1,5 pkt.).

Zadanie #7 - 24 kwietnia 2015 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 teraz 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.
  2. Unia KebabUu zawierająca trzy ww. typy kebabów oraz struktura KebabU zawierajaca unię oraz obiekt typu wyliczeniowego określający kształt przechowywanego kebaba.
  3. Funkcja KebabU *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ę).
  5. Funkcja StatParam oblicz_statystyke (const KebabU *tk, size_t n) obliczająca i zwracająca wymagane informacje statystyczne (1,5 pkt.).
  6. Instrukcje funkcji main() wywołujące sensownie powyższe funkcje.
  7. Wyświetlenie wyników analizy na ekranie.

Niepunktowane zadanie domowe: rozdzielić ww. program na trzy pliki: main.c, kebab.h i kebab.c.

Zadanie #6 - 17 kwietnia 2015 r.

Wykonać symulację jednowymiarowego układu złożonego z dwóch mas punktowych m1 = 10 kg i m2 = 2 kg połączonych sprężyną o stałej sprężystości k = 200 N/m i długości l = 1 m. W chwili początkowej masie m1 nadano prędkość υ0 = 0,5 m/s. Zaimplementować struktury MasaPunktowa oraz Sprezyna zawierające fizyczne parametry reprezentowanych obiektów. Wyniki zapisywać do pliku / standardowego wyjścia (wybór) w czterech kolumnach: czas, x1, x2, Ecałkowita.

Etapy rozwiązania (po 1 pkt.):

  1. Struktury MasaPunktowa oraz Sprezyna. Sprezyna powinna zawierać wskaźniki na masy punktowe stanowiące początek i koniec sprężyny.
  2. Funkcja double silaSprezyny (const Sprezyna &s) zwracająca siłę pochodzącą od sprężyny s oraz funkcje double energia (const Sprezyna &s) oraz double energia (const MasaPunktowa &m) zwracające energię mechaniczna zgromadzona w obiektach (2 pkt.).
  3. Utworzenie i zainicjowanie obiektów w funkcji main().
  4. Symulacja metodą Eulera (2 pkt.).
  5. Wypisywanie wyników.

Punktowane zadanie domowe (2 pkt.): rozdzielić ww. program na trzy pliki: main.c, obiekty.h (definicja struktur) i obiekty.c (funkcje użytkownika).

Zadanie #5 - 10 kwietnia 2015 r.

Napisać program, który wczyta dane z pliku (do tablicy o rozmiarze dostosowanym dynamicznie do ilości danych), a następnie wyświetli na ekran: wartość średnią, odchylenie standardowe, wartość najmniejszą i najwiekszą. Użyć funkcji!

Etapy rozwiązania (po 1 pkt.):

  1. Funkcja float *wczytaj_dane (FILE *strumien, size_t *rozmiar) wczytująca dane z podanego (dowolnego) strumienia do tablicy na stercie (dostosowującej swój rozmiar do ilości danych); zwraca wskaźnik na początek tej tablicy oraz rozmiar tablicy poprzez wskaźnik z argumentu. (2 pkt.)
  2. Funkcja void oblicz_statystyke (const float dane[], size_t rozmiar, float *srednia, float *sigma) obliczającą estymator wartości średniej i odchylenia standardowego dla danych w tablicy. (2 pkt.)
  3. Funkcja float wartosc_maksymalna (const float dane[], size_t rozmiar) zwracająca największą wartość spośród danych.
  4. Funkcja float wartosc_minimalna (const float dane[], size_t rozmiar) zwracająca najmniejszą wartość spośród danych.
  5. Funkcja main() i instrukcje tam zawarte; prawidłowe wywołanie powyższych funkcji; wyświetlenie obliczonych wartości.

Zadanie domowe (niepunktowane): zmodyfikować program tak, aby nazwa pliku była podawana jako pierwszy argument wywołania programu.

Zadanie #4 - 1 kwietnia 2015 r.

Napisać program, który wczyta poprzez standarodwe ze 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. (2 pkt.)
  3. Wysortowanie daych 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.
  7. Wyświetlenie pełnych rekordów na standardowe wyjście.

Zadanie #3 - 27 marca 2015 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. Do weryfikacji numeru użyć tzw. metody wielomianowej. Zoptymalizować typy używanych tablic pod kątem oszczędności pamięci. W przypadku poprawnego nr. NRB, program wyświetla informację o nazwie banku, który prowadzi rachunek.

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 (1,5 pkt.).
  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.
  6. "Odnalezienie" identyfikatora banku w pliku (nazwa pliku jest zapisana na stałe w programie) i jej wyświetlenie dla podanego numeru NRB (1,5 pkt.).

Przykładowe numery kont do weryfikacji działania programu można znaleźć na stronie PW w Płocku.

Zadanie #2 (7 pkt.) - 20 marca 2015 r.

Obliczyć, jaka część (procent) energii emitowanej przez ciało doskonale czarne o podanej przez użytkownika temperaturze zawiera się w zakresie fal widzialnych (400-700 nm). Powszechnie wiadomo, że radiancja spektralna na jednostkę długości fali ciała doskonale czarnego wyraża się prawem Plancka.

Przydatne stałe fizyczne:

const long double hc = 1.23984193e-6;	// eV*m
const long double k_B = 8.6173324e-5;	// eV/K

Etapy rozwiązania (po 1 pkt.):

  1. Nagłowki, blok funkcji main() i definicje stałych.
  2. Zapytanie o temperaturę ciała (w kelwinach) i zareagowanie, gdy temperatura będzie niedodatnia.
  3. Nagłowek petli for iterujący po długości fali z zadanym krokiem całkowania.
  4. Obliczenie przyczynku "mocy" promieniowania w danej iteracji.
  5. Dodanie powyższego do mocy łączej i ewentualnie mocy "widzialnej".
  6. Wyświetlenie wyniku (sprawności) w procentach.
  7. .

Zadanie domowe #2 (fakultatywne, niepunktowane)

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. Program trwa do czasu wybrania opcji "wyjście" w menu.

Zadanie #1 - 13 marca 2015 r.

Napisać program, który wczytuje z pliku dane obywateli, analizuje je, a następnie wyświetla na standardowe wyjście. Po uruchomieniu program pyta użytkowanika o nazwę pliku do analizy.
Format danych wejściowych:
Imie Nazwisko rok_urodzenia płeć
Format danych wyjściowych:
Lp. Nazwisko Imię wiek (NIE)PEŁNOLETNI płeć
Dodatkowo, jeśli obywatel jest kobietą (K), dopisać w linijce "KWIATEK NA DZIEŃ KOBIET!". Natomiast jeśli nie jest ani mężczyzną, ani kobietą, dopisać "OJOJ!".

Etapy rozwiązania (po 1 pkt.):

  1. Instrukcje preprocesora i funkcja main().
  2. Zapytanie o nazwę pliku i jego otwarcie (wraz z zabezpieczeniem przed otwarciem nieistniejącego pliku).
  3. Pętla wczytująca dane z pliku wejściowego i zapisująca do buforów.
  4. Obliczenie wieku, określenie pełnoletności i dopisków.
  5. Instrukcje wypisujące poprawnie sformatowane dane na standardowe wyjście.