Programowanie II R (2021/2022)
Kompilatory on-line
Ćwiczenia 17.11.2021 - klasy
- Stwórz własną klasę Complex reprezentującą liczby zespolone
- Zaimplementuj konstruktor
- Zaimplementuj funkcję
abs
obliczającą moduł liczby
- Zaimplementuj operator wypisywania (dodania do strumienia)
- Zaimplementuj
operator*
dla dwóch liczb zespolonych
- Napisz program do generowania bibliografii
- Stwórz klasę Autor, która odpowiada pojedynczemu autorowi o danym imieniu, nazwisku i opcjonalnie drugiemu imieniu. Zaimplementuj wypisywanie typu: Arthur C. Clarke
- Stwórz klasę Publikacja, która ma id (dla uproszczenia - w postaci pojedynczej cyfry od 0-9), tytuł, nazwę czasopisma, rok wydania, numer strony i listę autorów. Zaimplementuj jej wypisywanie
- Zaimplementuj funkcję generuj, która przegląda dany tekst, a następnie wypisuje bibliografię. Publikacje na liście powinny pojawić się w takiej kolejności jak w tekście
- Stwórz klasy Wektor i Macierz reprezentujące odpowiednio wektor długości
n
oraz macierz n x n
(wartość n
podajemy w konstruktorze).
- zaimplementuj operator
<<
do wypisywania do strumienia
- zaimplementuj statyczną funkcję tworzącą przykładową macierz:
- Zaimplementuj
operator*
dla mnożenia obu tych klas przez liczbę rzeczywistą.
- Zaimplementuj
operator*
dla mnożenia przez siebie wektorów (skalarnie), macierzy (powstaje macierz) i macierzy przez wektor.
- Zaimplementuj funkcję
rozwiazU(const Macierz &U, const Wektor &y)
, która zwraca rozwiązanie równania $U\cdot x = y$, przy założeniu, że macierz U
jest górnotrójkątna.
- Zaimplementuj funkcję
rozwiazL(const Macierz &L, const Wektor &y)
, która zwraca rozwiązanie równania $L\cdot x = y$, przy założeniu, że macierz L
jest dolnotrójkątna.
- Zaimplementuj funkcję
rozkladLU(const Macierz &C)
, która zwraca macierze L
i U
(np. jako std::pair<Macierz,Macierz>
) spełniające równanie $C=L\cdot U$, gdzie macierz U
jest górnotrójkątna, a macierz L
jest dolnotrójkątna.
- Zaimplementuj funkcję
rozwiaz(const Macierz &C, const Wektor &y)
, która zwraca rozwiązanie równania $C\cdot x = y$.
- Zaimplementuj metodę
Macierz::odwrotna()
, która zwraca odwrotność macierzy C
.
Ćwiczenia 24.11.2021 - kontenery STL
- Masz dany plik tekstowy z danymi. W pliku są zapisane liczby całkowite
n
(mieszczące się w zakresie unsigned long long
).
- Wypisz sumę wszystkich liczb w pliku
- Wypisz 50-tą liczbę od końca pliku
- Wskaż, która liczba jako pierwsza się powtórzyła w pliku. Możesz założyć, że taka liczba istnieje.
- Używając danych z poprzedniego zadania wypisz numery wierszy, które zawierają 100 największych liczb.
- Dyskretnym logarytmem z liczby naturalnej $a$ o podstawie $b$ modulo $p$ nazywamy taką liczbę $k$, że $b^k \equiv a\ (\mathrm{mod}\ p)$. Operacja ta jest podstawą wielu algorytmów szyfrowania, gdyż obliczenie danego logarytmu jest długotrwałe, a bardzo łatwo zweryfikować, czy dana liczba $k$ jest rzeczywiście poprawnym wynikiem logarytmowania
W tym zadaniu przyjmujemy, że liczba pierwsza p = 10006721
oraz a = 53
.
- Napisz funkcję obliczającą $k$-tą potęgę danej liczby modulo $p$ (tzw. algorytm szybkiego potęgowania)
- Napisz funkcję obliczającą dyskretny logarytm poprzez testowanie kolejnych liczb od 0 do $p-1$ (liczby w zadaniu zostały dobrane tak, żeby $a$ było prymitywnym pierwiastkiem grupy $Z_p$, a do tego żadna z liczb z pliku nie jest podzielna przez $p$, więc ta funkcja zawsze jest dobrze zdefiniowana)
- Dla każdej z liczb z danych z pierwszego zadania oblicz dyskretny logarytm z tej liczby modulo $p$. Wynik zapisz w kolejnych wierszach pliku wynik.txt
Ćwiczenia 01.12.2021 - klasy, c.d.
- Zaimplementuj klasę Wielomian obslugującą następujące metody: .
- Konstruktor umożliwiający podanie wektora współczynników wielomianu
- Wypisywanie (przez przekierowanie do strumienia)
- Metodę funkcyjną zwracającą wielomian x.
- Mnożenie przez liczbę(w obie strony)
- Mnożenie przez wielomian
- Obliczanie pochodnej
- Obliczenie pierwiastków (jeśli się da)
-
Zaimplementuj klasę WielomianCzebyszewa dziedziczącą po klasie wielomian. Przetestuj w szczególności wyznaczanie pierwiastków.
Ćwiczenia 08.12.2021 - klasy, c.d.
Przykładowy kod po poprzednich zajęciach
- Rozbij kod z poprzednich zajęć na plik nagłówkowy (.h) oraz plik źródłowy (.cpp)
- Korzystając z klas napisanych na ostatnich zajęciach napisz funkcję obliczającą sumę kwadratów pierwiastków danego wielomianu. Wykorzystaj ją do zbadania działania polimorfizmu przy przekazywaniu wielomianu przez wartość, referencję, wskaźnik
- Napisz własny konstruktor kopiujący oraz operator przypisania. Przetestuj który z nich jest wykorzystywany w sytuacjach:
- Wielomian w( {1,2,3} );
- Wielomian w = Wielomian( {1,2,3} ) + 1;
- Zmodyfikuj klasę z pierwszego zadania, żeby była wzorcem (template) pozwalającym na wygenerowanie klasy wielomianów nad danym pierścieniem (np. wielomiany o współczynnikach całkowitych, wielomiany o współczynnikach zespolonych, itp.). Następnie użyj instrukcji typedef, żeby wprowadzić "prostą" nazwę na wielomian o współrzynnikach rzeczywistych.
-
Zaimplementuj rysowanie wykresu korzystając z biblioteki matplotlib-cpp. Przydatne materiały autorstwa Krzysztofa Piaseckiego:
Informacje wstępne dot biblioteki
minimalny działający przykład (do skompilowania poleceniem:
g++ mpl_test.C -o mpl_test -DWITHOUT_NUMPY -I/usr/include/python3.6m -lpython3.6m
Zadania (w szczególności przydatne komendy w zad. 2)
-
Zmodyfikuj rysowanie wykresu, żeby było bardziej ogólne. Tzn. zdefiniuj czysto wirtualną klasę Funkcja, która implementuje operację obliczenia wartości. Wielomian będzie wtedy klasą pochodną.
Ćwiczenia 15.12.2021 - ciąg dalszy klas, wzorce, strumienie
- Napisz wzorzec funkcji
mid(a,b,c)
, która zwraca środkową z trzech wartości
- Napisz program, który wczytuje jeden plik tekstowy i wypisuje do drugiego pliku ile razy wystąpiła która litera
- Zaimplementuj drzewo wyszukiwań binarnych (BST)
- Napisz program kodujący i rozkodowujący plik tekstowy wg algorytmu Huffmanna. Dla prostoty możesz "symulować" zapis binarny przez tworzenie pliku tekstowego zawierącego jedynki i zera.
Ćwiczenia 22.12.2021 - równania różniczkowe
- Rozwiąż numerycznie równanie różniczkowe: przy warunku początkowym . Porównaj dokładność uzyskiwaną przy następujących metodach:
- Eulera
- midpoint
- Rungego-Kutty 4. rzędu
- trzykrokową metodą Adamsa-Bashfortha
- Rozwiąż problem wahadła matematycznego bez używania przybliżenia małych wychyleń.
Narysuj wykres fazowy, tj. w zmiennych q,p (położenie, pęd) dla różnych warunków początkowych.
Ćwiczenia 12.01.2022
- Zainstaluj (jeśli jeszcze nie masz) bibliotekę Boost. Jeśli instalacja się udała, kompilator będzie akceptował linię
#include <boost/numeric/odeint.hpp>
.
- Bazując na przykładzie z dokumentacji biblioteki OdeInt,
przeprowadź symulację populacji liczby drapieżników (np. lisów) i ich ofiar (np. królików) w danym ekosystemie.
Zgodnie z równaniem Lotki-Volterry populacje te zmieniają się następująco:
gdzie $\alpha$ to naturalny przyrost populacji królików, $\beta$ - częstość ubywania królików wskutek
polowania lisów, $\delta$ - częstość narodzin lisów, $\gamma$ - częstość ubywania lisów. Jako parametry
wypróbuj wartości $\alpha =2.0$, $\beta = 0.2$, $\delta=0.01$, $\gamma = 0.2$.
- Korzystając z biblioteki OdeInt rozwiąż ponownie problem wahadła matematycznego bez używania przybliżenia małych wychyleń.
Narysuj wykres fazowy, tj. w zmiennych q,p (położenie, pęd) dla różnych warunków początkowych.
- Oscylator Duffinga opisany jest równaniem
Jest to przykład dynamicznego układu przejawiającego chaotyczne zachowanie - niewielka zmiana warunków początkowych
powoduje zupełnie inne zachowanie układu. Celem zadania jest wykreślenie portretu fazowego (jak w poprzednim zadaniu)
takiego układu. Wypróbuj na początku parametry $\alpha=\omega=1$, $\beta = -1.0$, $\delta = 0.2$, $\gamma = 0.3$, oraz warunki początkowe $x_0 = 1.0 \pm 0.01$.
- Rozwiąż problem ruchu sztucznego satelity umieszczonego w polu grawitacyjnym Ziemi i Księżyca. Przyjmij współrzędne $(x_1, x_2)$ opisujące położenie satelity
względem środka masy (położenie Ziemi to $(-\mu,0)$, a Księżyca to $(1-\mu,0)$). Równania ruchu satelity
o zaniedbywalnie małej masie względem ciał niebieskich mają wtedy następującą postać:
gdzie parametr $\mu$ to masa Księżyca a $1-\mu$ masa Ziemi. Przyjmij $\mu = 0.01228$, a jako warunki początkowe
$x_1 = 0$, $x_2 = 0$, $\dot{x_1} = 0$, $\dot{x_2} = -2$.
Ćwiczenia 19.01.2022 oraz 26.01.2022 - biblioteka Qt
- Zainstaluj bibliotekę Qt (np. stąd) i uruchom przykładowy program.
- Napisz prosty kalkulator (po naciśnięciu przycisku Oblicz w polu etykiety powinien pojawiać się wynik:
- Stwórz następujące okienko:
- Napisz program graficzny, który wyznacza pole trójkąta na podstawie podanych trzech boków (wejście i wyjście jako QLineEdit) oraz dodatkowo rysuje podany trójkąt, jeśli to możliwe
- Napisz prosty kalkulator:
- Napisz program zliczający przebieg myszki i jej średnią prędkość (w pikselach na sekundę).
- Napisz program do badania refleksu. W tym celu utwórz widget, który w momencie uruchomienia slotu
trigger()
rysuje w losowym miejscu kółko o średnicy np. 20 pikseli i zaczyna mierzyć czas. Jeżeli użytkownik kliknie wewnątrz kółka, to emitowany jest sygnał correct_click(float)
(argument to liczba sekund, jaka upłynęła między narysowaniem a kliknięciem), a jeśli użytkownik kliknie poza kółkiem (np. zanim kółko się pojawiło), emitowany jest sygnał wrong_click()
. Po kliknięciu (niezależnie czy dobrym czy złym), widget przestaje rysować kółko i startuje QTimer o losowym czasie trwania, który znowu wywoła slot trigger()
.
Oprócz tego widgetu program powinien mieć pole tekstowe do wyświetlania ostatniego wyniku oraz przycisk do włączania lub wyłączania testu.