Programowanie dla I roku fizyki (2019/2020)
- Napisz program obliczający BMI (waga / wzrost2).
- Prawidłowe BMI mieści w zakresie 18,5-25. W zależności od wyniku program powinien wypisać stosowny komunikat (dobrze, za dużo, za mało)
- Napisz program rozwiązujący równanie liniowe.
- Program powinien zapytać użytkownika o współczynniki a i b, a następnie wypisać miejsce zerowe
- Napisz program rozwiązujący równanie kwadratowe
- Program powinien zapytać użytkownika o współczynniki a, b, c, a następnie wypisać wszystkie miejsca zerowe
- Napisz program rozwiązujący równanie 3 stopnia (patrz wzory Cardana)
- Program powinien zapytać użytkownika o współczynniki a,b,c,d, a następnie wypisać wszystkie miejsca zerowe
- Znajdź, jaką najmniejszą liczbę można dodać do 1.0 aby dostać coś większego od 1.0 (metodą bisekcji)
- Zmierz o ile mnożenie jest wolniejsze od dodawania (cel: pomiar czasu wykonania kodu)
- Rozwiąż zadania nr 2 i nr 4 z Projektu Euler
- Napisz funkcję
pierwiastek
obliczającą pierwiastek n-tego stopnia - Napisz funkcję zwracającą, jaki element tablicy podanej jako argument występuje najczęściej.
- Załóż konto i utwórz repozytorium w serwisie https://github.com/join
- Pobierz lokalną kopię repozytorium
git clone https://github.com/NAZWA-KONTA/NAZWA-REPOZYTORIUM.git
- W katalogu repozytorium utwórz plik
szybkosc.py
- Dodaj ten plik do repozytorium
git add szybkosc.py
- Zatwierdź zmiany w repozytorium
git commit -m 'Podstawowa funkcjonalnosc mierzenia czasu'
- Wyślij zmiany na serwer
git push
- Pobierz lokalną kopię repozytorium
- Zmodyfikuj funkcję mierzącą szybkość. Docelowo powinna ona przyjmować jako argument funkcję do zbadania oraz opcjonalnie listę wartości
n
, a zwracać listę z czasami wykonania. Zapisz zmiany w repozytorium. - Napisz funkcję obliczającą silnię w dwóch wersjach: iteracyjnie oraz rekurencyjnie. Zbadaj, jak szybko działają.
- Napisz funkcję obliczającą n-ty wyraz szeregu Fibonacciego w dwóch wersjach: iteracyjnie oraz rekurencyjnie. Zbadaj, jak szybko działają.
- Zmodyfikuj mierzącą szybkość. Niech zwracana wartość będzie średnią czasu z 5 uruchomień funkcji. Zapisz zmiany w repozytorium.
- Napisz program obliczający następną liczbę pierwszą.
- Funkcja powinna brać argument liczbowy
n
i zwracać najmniejszą liczbę pierwszą nie mniejszą niżn
. Zbadaj szybkość tej funkcji.
- Funkcja powinna brać argument liczbowy
- Zmodyfikuj funkcję mierzącą szybkość, żeby można przekazywać do badanej funkcji opcjonalne argumenty.
Zajęcia zdalne 18-19.03.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
Celem zajęć jest przećwiczenie podstawowych struktur danych (lista, słownik) i opanowanie biblioteki do rysowania wykresów Matplotlib. Dane proszę przygotowywać bez wykorzystania bibliotek typu Numpy czy pandas.
- Wygeneruj tablicę z liczbami 0-10 z krokiem 0,1. Wygeneruj drugą tablicę z wartościami x*sin(x)-x2. Narysuj wykres tych danych.
- Na jednym wykresie narysuj funkcje x, sin(x), tg(x) dla przedziału od -0,5 do 0,5. Zadbaj, by wykres miał odpowiednią legendę i tytuł.
- Zmodyfikuj program napisany w poprzednim punkcie aby zamiast pokazania wykresu zapisywał go do pliku
wykres.pdf
. - Narysuj program rysujący na jednym wykresie liczbę przypadków zarażenia COVID-19. Uwaga! Jeśli coś nie działa, to nie przechodź do kolejnego podpunktu, tylko rozwiąż bieżący problem.
- Ściągnij plik https://covid.ourworldindata.org/data/owid-covid-data.csv (dla zaawansowanych: napisz kod Pythona ściągający ten plik).
- Wczytaj plik poleceniem
linie = open("owid-covid-data.csv").readlines()
. Jakiego typu jest obiektlines
? - Niech
pierwszy
będzie pierwszym elementem tablicylinie
. Jakiego typu jest obiektpierwszy
? - Rozbij linię
pierwszy
na fragmenty metodąsplit
. Sprawdź co dostajesz w wyniku. Wydobądź z niego fragment mówiący o kraju oraz wartość całkowitej liczby zachorowań. - Skoro umiemy już analizować poszczególne linie, przeanalizujmy je wszystkie. Utwórz pustą tablicę o nazwie
zachorowania_pol
. Następnie w pętlifor
analizuj kolejne elementy tablicylinie
. Dla każdej linii sprawdź jakiego kraju dotyczy. Jeśli dotyczy krajuPoland
, to dodaj liczbę zachorowań do tablicyzachorowania_pol
korzystając z metodyappend
. - Narysuj wykres danych z tablicy
zachorowania
. - Zamiast analizować tylko dane dla Polski, wydobądź dane dla wszystkich krajów. Zamiast tworzenia tablicy
zachorowania_pol
uwtórz pusty słownikzachorowania
. Zmodyfikuj pętlęfor
, żeby działała w taki sposób, że po odczytaniu danej dla kraju X- jeśli w słowniku nie ma jeszcze kraju X, to dodaj go do słownika; odpowiadającą mu wartością jest początkowo pusta tablica
- jeśli kraj X jest już w słowniku, to dodaj do jego tablicy liczbę zachorowań z danej linii
- Sprawdź poprawność pętli rysując na jednym wykresie liczbę zachorowań
zachorowania['Poland']
orazzachorowania['Italy']
- Zmodyfikuj swój program, by najpierw czytał plik z danymi, następnie wypisywał wszystkie kraje i pytał użytkownika, który narysować. Jeśli użytkownik wpisze np. Poland, to powinien rysować wykres dla Polski. Jeśli użytkownik napisze nie istniejący kraj, program powinien wypisywać odpowiedni komunikat
Zajęcia zdalne 25-26.03.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
Na zajęciach pojawi się składnia klasy.
- Napisz klasę
Czlowiek
przechowującą imię, nazwisko, rok urodzenia i ew. rok śmierci. - Napisz klasę
SortowanaLista
z metodamiappend
,__getitem__(self, item)
,__len__(self)
oraz__str__(self)
. W ramach tych metod obiekty klasy powinny zachowywać się jak lista, z tym że po każdym dodaniu elementu na nowo całość sortujemy. - Napisz symulację rozprzestrzeniania się zarazy z wizualizacją. Dla ułatwienia możesz wykorzystać w tym zadaniu metrykę maksimum.
- Napisz klasę
Pacjent
opisującą pojedynczą osobę.Pacjent
może mieć status'zdrowy'
,'nosiciel'
lub'chory'
. Ma również współrzędnex
,y
będące liczbami z przedziału 0-100. Przetestuj to działanie. - Dodaj do klasy
Pacjent
metodęruch(self)
. Po wywołaniu tej metody położenie pacjenta zmienia się o losowy dystans. Jeżeli pacjent był zdrowy lub był tylko nosicielem, to w pojedynczym ruchu przesuwa się o dystans 0-1; jeśli był chory, przesuwa się o dystans 0-0,1. Przetestuj to działanie. - Napisz klasę
Populacja
opisującą populacjęn
ludzi na obszarzew
xh
. Przy tworzeniu obiekt tej klasy losuje współrzędne startowe osób. Każda tworzona osoba ma 20% szansy, że jest chora. Klasa powinna mieć możliwość wypisania położeń wszystkich osób. Przetestuj to działanie. - Napisz metodę
ruch
w klasiePopulacja
. Jej działanie powinno polegać na wywołaniu metodyruch
dla każdej z osób wewnątrz populacji. Jeśli w wyniku ruchu dana osoba “wyszła poza planszę”, to powinna pojawić się z drugiej strony. Przetestuj to działanie. - Napisz funkcję
rysuj(populacja)
, która rysuje rozmieszczenie osób zadanej populacji z wykorzystaniem biblioteki Matplotlib. Zdrowi powinni być narysowani jako zielone kropki, nosiciele jako żółte kropki, a chorzy jako czerwone kropki. Przetestuj to działanie. - Przetestuj następujący kod wyświetlający animację:
import matplotlib matplotlib.use('Qt5Agg') import matplotlib.pyplot as plt from math import sin,pi from matplotlib.animation import FuncAnimation fig, ax = plt.subplots() xdata, ydata = [], [] ln, = plt.plot([], [], 'ro') def init(): ax.set_xlim(0, 2*pi) ax.set_ylim(-1, 1) return ln, def update(frame): xdata.append(frame/10) ydata.append(sin(frame/10)) ln.set_data(xdata, ydata) return ln, ani = FuncAnimation(fig, update, frames=None, init_func=init, blit=True) plt.show(block=True)
- Napisz program z animacją, której kolejne kratki odpowiadają kolejnym ruchom populacji.
- Zmodyfikuj klasę
Populacja
, by po każdym ruchu sprawdzała dystans każdej pary pacjentów. Jeśli osoba zdrowa znajdzie się w odległości mniejszej niż 1 od osoby chorej lub nosicielem, sama staje się nosicielem lub choruje (z prawdopodobieństwem 50-50). - Zmodyfikuj animację tak, by oprócz “planszy” rysowany był drugi panel z liczbą zdrowych, nosicieli i chorych w funkcji numeru kroku symulacji.
- Dodaj do klasy
Pacjent
iPopulacja
metody pozwalające na zapisanie stanu do pliku. - Dodaj do klasy
Pacjent
iPopulacja
metody pozwalające na wczytanie stanu z pliku.
- Napisz klasę
Zajęcia zdalne 01-02.04.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
- Napisz klasę
Kolo
z atrybutamipromien
,pole
iobwod
. Zadbaj, by zmiana dowolnego z tych atrybutów odpowiednio wpływała na pozostałe. - Napisz program zapisujący i wczytujący obiekt klasy
Kolo
do pliku tekstowego. - Napisz program zapisujący i wczytujący obiekt klasy
Kolo
do pliku za pomocą modułupickle
. - Utwórz lokalną kopię repozytorium poleceniem:
git clone https://github.com/tkazimierczuk-fuw/symulacja.git
Przejdź do katalogu
symulacja
. Kolejne polecenia wykonuj w ramach tego repozytorium. - Zmień adres zdalnego repozytorium poleceniem:
git remote set-url origin https://github.com/NAZWA-KONTA/NAZWA-REPOZYTORIUM.git
- Wyślij zmiany na serwer:
git push
- Utwórz plik
test_tekstowy.py
i napisz program tworzący obiekt klasyPopulacja
i wypisujący go (jak na poprzednich zajęciach). Przetestuj to działanie.
Dołącz ten plik do repozytorium i wyślij na serwer. - Utwórz plik
test_graficzny.py
i napisz program wyświetlający symulację w Matplotlib (jak na poprzednich zajęciach).
Dołącz ten plik do repozytorium i wyślij na serwer. - Utwórz nową gałąź projektu
git checkout -b zapisywanie
- Dodaj do klasy
Populacja
metodęzapisz(plik)
, która zapisuje obiekt do pliku tekstowego. Zapisz zmiany w repozytorium. Wyślij zmiany na serwer. - Utwórz plik
test_zapis.py
testujący zapis do pliku. Zmiany zapisz w repozytorium i wyślij na serwer. - Scal zmiany do gałęzi
master
:git checkout master git merge zapisywanie git branch -d zapisywanie
- Dokonaj serii ulepszeń do symulacji. Zmiany realizuj w osobnej gałęzi. Po uzyskaniu danej funkcjonalności scal zmiany do gałęzi
master
. W razie możliwości wykonaj te ulepszenia w kilkuosobowej grupie w ramach wspólnego repozytorium.- Zaimplementuj zarażanie się jeśli dystans między chorymi jest mniejszy niż … (analogicznie do poprzednich zajęć).
- Obiekt
Pacjent
ma atrybutstatus
. Zmodyfikuj kod, aby zwracał błąd, jeśli użytkownik spróbuje zmienić go na coś innego niż ‘zdrowy’, ‘chory’, ‘nosiciel’. - Obiekt
Populacja
ma atrybutyx
iy
. Zmodyfikuj kod, aby po zmianie wymiarów planszy zmienić położenie osób, które w wyniku zmiany znalazły się poza planszą (jeśli ktoś był za daleko, zostaje ściągnięty na granicę). - Zaimplementuj skończony czas życia choroby. Np. po 100 ruchach chory albo zdrowieje (i jest odporny - nowy status), albo umiera.
- Wykres animacji niech zawiera drugi panel z kołowym wykresem statusu w populacji.
- Zmień sposób liczenia odległości z metryki maksimum na euklidesowski.
- Zmień sposób poruszania się Pacjentów, aby uwzględnić bezwładność. Tzn. zamiast losować zmianę położenia, losuj zmianę chwilowej prędkości pacjenta (nie zapominając o ograniczeniu na maksymalną prędkość).
- Dodaj do klasy
Populacja
metodęhistoria_zarazen()
, która zwraca listę współrzędnych miejsca zarażenia wraz z informacją o czasie zarażenia (tj. ile ruchów temu do niego doszło). Korzystając z tej metody dodaj rysowanie żółtych kółek podkreślających gdzie doszło do transmisji (np. jakoscatter
, gdzie wielkość kółka w miarę upływu czasu maleje)
Zajęcia zdalne 15-16.04.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
Czas zajęć poświęcony zostanie na zapoznanie się z biblioteką NumPy poprzez samodzielne wykonywanie ćwiczeń z listy na stronie http://www.w3resource.com/python-exercises/numpy/index.php. W trakcie trwania zajęć można będzie uzyskać pomoc/komentarz, ale nie będziemy robić zadań spoza tej listy.
Zajęcia zdalne 22-23.04.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
Na zajęciach przećwiczymy podstawowe elementy realizacji współbieżności w Pythonie.
- Napisz procedurę symulującą czasochłonne zadanie, np. tworzącą Pythonową tablicę
N
losowych liczb, a następnie sortującą bąbelkowo. DobierzN
, żeby sortowanie trwało np. 5 s. - Napisz program, który wykonuje test następujących przypadków (po każdym wykonując wynik): ile czasu trwa 4-krotne wykonanie funkcji z poprzedniego punktu; ile czasu trwa wykonanie tej samej pracy w 4 wątkach; ile czasu trwa wykonanie tej samej pracy w 4 procesach.
Program napisz tak, by każdy z testów był osobną funkcją, biorącą jako argument funkcję do testu, jej argumenty oraz liczbę powtórzeń, a zwracającą czas wykonania. - Powtórz ten sam test dla funkcji z biblioteki NumPy, np. losującej dużą macierz i ją diagonalizującą.
- Powtórz ten sam test dla metody
.sort
Pythonowej listy. - Zmodyfikuj symulację sprzed 2 zajęć (możesz też zacząć od sklonowania cudzego repozytorium). Dodaj do programu drugi wątek, który wczytuje z klawiatury polecenia użytkownika. Np.
add 3.4 6.2
dodaje nową (chorą) osobę w określonych współrzędnych adist -0.3
zmienia o określoną wartość na jaki dystans następuje zarażenie. - Napisz program pobierający kilkuwątkowo zadaną stronę WWW. Przy ładowaniu strony skorzystaj z biblioteki
urrlib
import urllib.request response = urllib.request.urlopen('http://www.example.com/') html = response.read()
Twój program powinien załadować zadaną stronę (np.
https://www.fuw.edu.pl
), znaleźć wszystkie odnośniki (fragmenty tekstu typuhttp://...
lubhttps://...
) i rekurencyjnie przejrzeć je wszystkie, najlepiej w osobnych wątkach. W wyniku wypisz listę wszystkich przejrzanych stron np. na 2 poziomy wgłąb.
Zajęcia zdalne 29-30.04.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
Na zajęciach pojawią się generatory, wspomnimy mechanizm asynchroniczności w Pythonie 3.5+ (async
, await
) oraz mechanizm wyjątków (try ... except ...
, assert ...
).
- Napisz program, który prosi użytkownika o podanie długości boków trójkąta, a na ich podstawie wypisuje pole tego trójkąta. Wykorzystaj mechanizm wyjątków do zabezpieczenia programu przed podaniem nie-liczby prrzez użytkownika lub sytuacją, gdy z podanych 3 długości nie można złożyć trójkąta.
- Wykonaj zadanie 2 i 3 z poprzednich zajęć korzystając ze składni
await
/async
(tutorial) - Zapoznaj się z biblioteką Paho-MQTT. Napisz program, który:
- Co 1 s wysyła na kanał
FUW_PR/TWOJ_IDENTYFIKATOR
na serwerzemqtt.eclipse.org
parę liczb odpowiadających aktualnemu wykorzystania procesora i pamięci (wykorzystaj modułpsutil
) - Monitoruje nadesłane komunikaty przez pozostałe osoby (włączając Ciebie).
- Co 30 sekund wypisuje listę identyfikatorów posortowaną po zużyciu procesora. Na liście uwzględnij tylko osoby, które miały co najmniej 3 komunikaty w ciągu tych 30 s. Upewnij się, że program jest odpowiednio odporny na nieprawidłową informację.
- Co 1 s wysyła na kanał
Zajęcia zdalne 06-07.05.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
Tematem zajęć będzie wprowadzenie do biblioteki PyQt.
- Stwórz następujące okienko:
- Stwórz następujące okienko:
- Stwórz następujące okienko:
Zajęcia zdalne 13-14.05.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
Kontynuujemy bibliotekę PyQt
- 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:
Zajęcia zdalne 20-21.05.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
Kontynuujemy bibliotekę PyQt
- 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 slottrigger()
.
Oprócz tego widgetu program powinien mieć pole tekstowe do wyświetlania ostatniego wyniku oraz przycisk do włączania lub wyłączania testu.
Zajęcia zdalne 27-28.05.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
I godzina zajęć zostanie przeznaczona na indywidualne ćwiczenie wyrażeń regularnych.
Na drugiej godzinie przyjrzymy się parsowaniu XML za pomocą xml.etree.ElementTree
.
- Wykonaj serię ćwiczeń na wyrażenia regularne ze strony https://regexone.com/lesson/introduction_abcs
- Wykonaj serię ćwiczeń na wyrażenia regularne ze strony https://www.w3resource.com/python-exercises/re/
Zajęcia zdalne 03-04.06.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp
- Napisz dekorator funkcji mierzący sumaryczny czas jej wykonania (tj. żeby po uruchomieniu funkcji
raportuj()
wypisywany był czas przebywania wewnątrz każdej z udekorowanych funkcji. - Napisz dekorator zapamiętujący wyniki wywołania funkcji. Jeśli funkcja została wywołana drugi raz z tymi samymi argumentami, podaj wynik ze słownika zamiast uruchomić ją ponownie. Przetestuj działanie z rekurencyjną wersją ciągu Fibonacciego.
- Napisz dekorator
@uppercase
, który będzie sprawdzał typ argumentów. Dla każdego argumentu typu string zmień jego zawartość na wielkie litery. - Napisz dekorator
@all_strings
. Przyjmij, że będzie stosowany do funkcji typuf(s)
, które oczekują argumentu typu string i zwracają string. Celem Twojego dekoratora jest zapewnienie, że będzie można też wykonaćf(bs)
, gdziebs
tobytestring
(i wtedy wynik też będzie tego typu). - Korzystając z wyrażeń lambda odfiltruj z danej listy liczb jedynie liczby parzyste.
- Masz daną listę par liczb. Korzystając z wyrażeń lambda posortuj malejąco według sumy kwadratów obu składowych.
- Ulepsz swój wybrany program za pomocą wskazań pylint
Zajęcia zdalne 10.06.2020
Grupa środa: meet.google.com/yvu-xnwx-yoj
Na zajęciach spróbujemy przyjrzymy się kwestii optymalizacji wykorzystania biblioteki NumPy na przykładzie tego programu.