Zadania
Projekt - od 29 maja do 12 czerwca 2015 r.
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.):
- Struktura punkt_pomiarowy zawierająca składowe x, y, f (0,5 pkt.).
- Funkcja punkt_pomiarowy wczytaj (FILE *we) wczytująca dane ze strumienia i zwracająca wskaźnik na początek listy (1,5 pkt.).
- 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.
- 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.).
- Funkcja void wypisz_dane_z_dopasowaniem (FILE *wy, const punkt_pomiarowy *dane) wypisująca dane wraz z dopasowaniem do strumienia.
- Funkcja main() zawierająca sensowne użycie powyższych funkcji.
- Skasowanie listy (dealokacja pamięci) oraz wyświetlenie parametrów dopasowania na ekran.
- 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.):
- Funkcja double generator_gaussa (double m, double s) zwracająca jedną liczbę z rozkładu Gaussa (m, s).
- Funkcja double generator_jednostajny (double min, double max) zwracająca jedną liczbę z rozkładu jednostajnego o wartości z zakresu (min, max).
- Analiza parametrów uruchomienia programu, sprawdzenie ich poprawności i przypisanie do wskaźnika funkcji wybranego rozkładu (1,5 pkt.).
- 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.).
- Funkcja struct parametry_rozkladu oblicz_statystyke (const double dane[], size_t rozmiar) obliczająca estymator wartości średniej i odchylenia standardowego danych w tablicy.
- Trywialna funkcja void wypisz (FILE *wy, const double dane[], size_t n) wypisująca na podany strumień wyjściowy n liczb z tablicy dane.
- Funkcja main(), w tym porównanie parametrów rozkładu z oczekiwanymi i zwolnienie na końcu pamięci (1,5 pkt.).
- 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.):
- Analiza parametru uruchomienia programu, otwarcie pliku w trybie binarnym, sprawdzenie błędów.
- Wczytanie rozmiarów "planszy" i otwarcie okna.
- 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).
- 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.).
- 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.).
- Narysowanie atomów na planszy (0,5 pkt.).
- 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.):
- Struktury KebabW, KebabP oraz KebabT dla poszczególnych kształtów stosów.
- 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.
- Funkcja KebabU *wczytaj_dane (FILE *we, size_t *rozmiar) z dynamiczną realokacją pamięci (1,5 pkt.).
- Definicja struktury StatParam przechowującej obliczoną statystykę (średnią wysokość stosu wraz z odchyleniem, sumaryczną objętość oraz masę).
- Funkcja StatParam oblicz_statystyke (const KebabU *tk, size_t n) obliczająca i zwracająca wymagane informacje statystyczne (1,5 pkt.).
- Instrukcje funkcji main() wywołujące sensownie powyższe funkcje.
- 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.):
- Struktury MasaPunktowa oraz Sprezyna. Sprezyna powinna zawierać wskaźniki na masy punktowe stanowiące początek i koniec sprężyny.
- 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.).
- Utworzenie i zainicjowanie obiektów w funkcji main().
- Symulacja metodą Eulera (2 pkt.).
- 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.):
- 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.)
- 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.)
- Funkcja float wartosc_maksymalna (const float dane[], size_t rozmiar) zwracająca największą wartość spośród danych.
- Funkcja float wartosc_minimalna (const float dane[], size_t rozmiar) zwracająca najmniejszą wartość spośród danych.
- 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:
- Eskulapa - nazwisko zawiera co najmniej 2 litery e
- Kokoszka - nazwisko zaczyna się od sylaby ko
- Orzeł - nazwisko zawiera literę o
- Lew - nazwisko kończy się na ski/ska
- Króliczek - nagroda pocieszenia
Etapy rozwiązania (po 1 pkt.):
- Wczytanie liczebności grupy oraz utworzenie dwóch tablic wskaźników char*.
- 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.)
- Wysortowanie daych bąbelkowo (2 pkt.).
- Sprawdzenie warunków 1-2.
- Sprawdzenie warunków 3-4.
- Instrukcje if sprawdzające powyższe tudzież przyznające nagrodę pocieszenia.
- 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.):
- 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 (1,5 pkt.).
- 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.
- "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.):
- Nagłowki, blok funkcji main() i definicje stałych.
- Zapytanie o temperaturę ciała (w kelwinach) i zareagowanie, gdy temperatura będzie niedodatnia.
- Nagłowek petli for iterujący po długości fali z zadanym krokiem całkowania.
- Obliczenie przyczynku "mocy" promieniowania w danej iteracji.
- Dodanie powyższego do mocy łączej i ewentualnie mocy "widzialnej".
- Wyświetlenie wyniku (sprawności) w procentach. .
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.):
- Instrukcje preprocesora i funkcja main().
- Zapytanie o nazwę pliku i jego otwarcie (wraz z zabezpieczeniem przed otwarciem nieistniejącego pliku).
- Pętla wczytująca dane z pliku wejściowego i zapisująca do buforów.
- Obliczenie wieku, określenie pełnoletności i dopisków.
- Instrukcje wypisujące poprawnie sformatowane dane na standardowe wyjście.