Zadania
Projekt - od 27 maja do 10 czerwca 2015 r.
Zadanie #10 - 20 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 uzycie 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 - 13 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 - 6 maja 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. Użyć elementów języka C++.
Etapy rozwiązania (po 1 pkt.):
- Struktury MasaPunktowa oraz Sprezyna. Sprezyna powinna zawierać wskaźniki lub referencje 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ę mechaniczną zgromadzona w obiektach (2 pkt.).
- Utworzenie i zainicjowanie obiektów w funkcji main().
- Symulacja metodą Eulera (1,5 pkt.).
- Wypisywanie wyników (0,5 pkt.).
- Podział na pliki źródłowe (main.cpp, obiekty.cpp, obiekty.h) oraz Makefile .
Zadanie #7 - 29 kwietnia 2015 r.
Napisać program wyświetlający w okienku obrazek w 16-bitowym formacie TPWGF16 (Tomasz Pietrzak's Weird Graphic Format). Program napisać w oparciu o dostarczony szablon, zawierający m.in. funkcje biblioteki graficznej Allegro. Po wyświetleniu obrazu program czeka na wciśnięcie dowolnego klawisza (funkcja readkey()). Wykorzystać typy o rozmiarach niezależnych od platformy (plik nagłówkowy stdint.h).
Format (binarny) plików TPWGF jest następujący: szerokość obrazu (16 bitów); wysokość (16 bitów); kolor RGB piksela 0,0 (16 bitów); kolor RGB piksela 1,0 (16 bitów); ...
Etapy rozwiązania (po 1 pkt.):
- Pobranie nazwy pliku z parametru uruchomieniowego programu (+ sprawdzenie poprawności).
- Otwarcie + zamknięcie pliku (na końcu) + sprawdzenie poprawności uchwytu.
- Wczytanie z pliku szerokości i wysokości obrazu.
- Otwarcie okna trybu graficznego; nazwa pliku w tytule okna.
- Wczytywanie kolorów kolejnych pikseli i rysowanie ich na ekranie (2 pkt.).
- Rozszerzyć program, aby wyświetlał kolejno pliki podane na liście parametrów (2 pkt.).
Materiały do pobrania:
Zadanie #6 - 22 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 KebabU zawierająca trzy ww. typy kebabów oraz struktura Kebab zawierajaca unię oraz obiekt typu wyliczeniowego określający kształt przechowywanego kebaba.
- Funkcja Kebab *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, sumaryczną objętość oraz masę).
- Funkcja StatParam oblicz_statystyke (const Kebab *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.
Punktowane zadanie domowe (2 pkt.): rozdzielić ww. program na trzy pliki: main.c, kebab.h i kebab.c.
Zadanie #5 - 15 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.)
- Definicja struktury parametry_rozkladu zawierającej składowe przeznaczone do przechowywania wartości średniej i odchylenia standardowego (0,5 pkt.).
- Funkcja struct parametry_rozkladu oblicz_statystyke (const float dane[], size_t rozmiar) 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 (0,5 pkt.).
- 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. Nadto zdefiniować kolejną strukturę (zawierającą wskaźnik i rozmiar) idealną do obsługiwania tablicy z danymi. Zmodyfikować wcześniejsze funkcje, aby mogły ją wygodnie wykorzystywać.
Zadanie #4 - 8 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 - 25 marca 2015 r.
Napisać program weryfikujący numer NIP. 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 NIP poprawny/niepoprawny. Zoptymalizować typy używanych tablic pod kątem oszczędności pamięci. W przypadku poprawnego nr. NIP, program wyświetla informację o województwie podatnika oraz nazwie US, któremu podlega.
Etapy rozwiązania (po 1 pkt.):
- Stworzenie tablicy const short [] zawierającej wagi; wyświetlenie monitu o podanie NIP
- Wczytanie NIP 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.
- "Odnalezienie" numeru US w pliku (nazwa pliku jest zapisana na stałe w programie) i wyświetlenie województwa i nazwy US dla podanego numeru NIP (2 pkt.).
Przykładowe 2 numery NIP do weryfikacji działania programu można znaleźć na stronie Miasta i Gminy Buk ;) albo sprawdzić NIP PW: 525-000-58-34.
Zadanie #2 (7 pkt.) - 18 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 - 11 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 blok funkcji 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.