Zadania

Projekt - od 27 maja do 10 czerwca 2015 r.

Grupa 14-16 »
Grupa 16-18 »

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.):

  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 uzycie 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 - 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.):

  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 - 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.):

  1. Struktury MasaPunktowa oraz Sprezyna. Sprezyna powinna zawierać wskaźniki lub referencje 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ę mechaniczną zgromadzona w obiektach (2 pkt.).
  3. Utworzenie i zainicjowanie obiektów w funkcji main().
  4. Symulacja metodą Eulera (1,5 pkt.).
  5. Wypisywanie wyników (0,5 pkt.).
  6. Podział na pliki źródłowe (main.cpp, obiekty.cpp, obiekty.h) oraz Makefile
  7. .

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.):

  1. Pobranie nazwy pliku z parametru uruchomieniowego programu (+ sprawdzenie poprawności).
  2. Otwarcie + zamknięcie pliku (na końcu) + sprawdzenie poprawności uchwytu.
  3. Wczytanie z pliku szerokości i wysokości obrazu.
  4. Otwarcie okna trybu graficznego; nazwa pliku w tytule okna.
  5. Wczytywanie kolorów kolejnych pikseli i rysowanie ich na ekranie (2 pkt.).
  6. 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.):

  1. Struktury KebabW, KebabP oraz KebabT dla poszczególnych kształtów stosów.
  2. 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.
  3. Funkcja Kebab *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, sumaryczną objętość oraz masę).
  5. Funkcja StatParam oblicz_statystyke (const Kebab *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.

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.):

  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. Definicja struktury parametry_rozkladu zawierającej składowe przeznaczone do przechowywania wartości średniej i odchylenia standardowego (0,5 pkt.).
  3. 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.)
  4. Funkcja float wartosc_maksymalna (const float dane[], size_t rozmiar) zwracająca największą wartość spośród danych.
  5. Funkcja float wartosc_minimalna (const float dane[], size_t rozmiar) zwracająca najmniejszą wartość spośród danych (0,5 pkt.).
  6. 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:

  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 - 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.):

  1. Stworzenie tablicy const short [] zawierającej wagi; wyświetlenie monitu o podanie NIP
  2. Wczytanie NIP 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. Optymalizacja operacji na tablicach (w dwóch dowolnie wybranych miejscach) poprzez zastosowanie "przesuwanych" wskaźników.
  6. "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.):

  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 - 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.):

  1. Instrukcje preprocesora i blok funkcji 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.