Tomasz Kazimierczuk's webpage     Teaching(PL)     Research     Pleview

Programowanie dla I roku fizyki (2019/2020)

  1. 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)
  2. 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
  3. 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
  4. 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
  5. Znajdź, jaką najmniejszą liczbę można dodać do 1.0 aby dostać coś większego od 1.0 (metodą bisekcji)
  6. Zmierz o ile mnożenie jest wolniejsze od dodawania (cel: pomiar czasu wykonania kodu)
  7. Rozwiąż zadania nr 2 i nr 4 z Projektu Euler
  8. Napisz funkcję pierwiastek obliczającą pierwiastek n-tego stopnia
  9. Napisz funkcję zwracającą, jaki element tablicy podanej jako argument występuje najczęściej.
  10. Załóż konto i utwórz repozytorium w serwisie https://github.com/join
    1. Pobierz lokalną kopię repozytorium
      • git clone https://github.com/NAZWA-KONTA/NAZWA-REPOZYTORIUM.git
    2. W katalogu repozytorium utwórz plik szybkosc.py
    3. Dodaj ten plik do repozytorium
      • git add szybkosc.py
    4. Zatwierdź zmiany w repozytorium
      • git commit -m 'Podstawowa funkcjonalnosc mierzenia czasu'
    5. Wyślij zmiany na serwer
      • git push
  11. 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.
  12. Napisz funkcję obliczającą silnię w dwóch wersjach: iteracyjnie oraz rekurencyjnie. Zbadaj, jak szybko działają.
  13. Napisz funkcję obliczającą n-ty wyraz szeregu Fibonacciego w dwóch wersjach: iteracyjnie oraz rekurencyjnie. Zbadaj, jak szybko działają.
  14. Zmodyfikuj mierzącą szybkość. Niech zwracana wartość będzie średnią czasu z 5 uruchomień funkcji. Zapisz zmiany w repozytorium.
  15. 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.
  16. 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.

  1. Wygeneruj tablicę z liczbami 0-10 z krokiem 0,1. Wygeneruj drugą tablicę z wartościami x*sin(x)-x2. Narysuj wykres tych danych.
  2. 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ł.
  3. Zmodyfikuj program napisany w poprzednim punkcie aby zamiast pokazania wykresu zapisywał go do pliku wykres.pdf.
  4. 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.
    1. Ściągnij plik https://covid.ourworldindata.org/data/owid-covid-data.csv (dla zaawansowanych: napisz kod Pythona ściągający ten plik).
    2. Wczytaj plik poleceniem linie = open("owid-covid-data.csv").readlines(). Jakiego typu jest obiekt lines?
    3. Niech pierwszy będzie pierwszym elementem tablicy linie. Jakiego typu jest obiekt pierwszy?
    4. 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ń.
    5. Skoro umiemy już analizować poszczególne linie, przeanalizujmy je wszystkie. Utwórz pustą tablicę o nazwie zachorowania_pol. Następnie w pętli for analizuj kolejne elementy tablicy linie. Dla każdej linii sprawdź jakiego kraju dotyczy. Jeśli dotyczy kraju Poland, to dodaj liczbę zachorowań do tablicy zachorowania_pol korzystając z metody append.
    6. Narysuj wykres danych z tablicy zachorowania.
    7. Zamiast analizować tylko dane dla Polski, wydobądź dane dla wszystkich krajów. Zamiast tworzenia tablicy zachorowania_pol uwtórz pusty słownik zachorowania. 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
    8. Sprawdź poprawność pętli rysując na jednym wykresie liczbę zachorowań zachorowania['Poland'] oraz zachorowania['Italy']
    9. 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.

  1. Napisz klasę Czlowiek przechowującą imię, nazwisko, rok urodzenia i ew. rok śmierci.
  2. Napisz klasę SortowanaLista z metodami append, __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.
  3. Napisz symulację rozprzestrzeniania się zarazy z wizualizacją. Dla ułatwienia możesz wykorzystać w tym zadaniu metrykę maksimum.
    1. Napisz klasę Pacjent opisującą pojedynczą osobę. Pacjent może mieć status 'zdrowy', 'nosiciel' lub 'chory'. Ma również współrzędne x, y będące liczbami z przedziału 0-100. Przetestuj to działanie.
    2. 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.
    3. Napisz klasę Populacja opisującą populację n ludzi na obszarze wxh. 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.
    4. Napisz metodę ruch w klasie Populacja. Jej działanie powinno polegać na wywołaniu metody ruch 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.
    5. 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.
    6. 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)
      
    7. Napisz program z animacją, której kolejne kratki odpowiadają kolejnym ruchom populacji.
    8. 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).
    9. Zmodyfikuj animację tak, by oprócz “planszy” rysowany był drugi panel z liczbą zdrowych, nosicieli i chorych w funkcji numeru kroku symulacji.
    10. Dodaj do klasy Pacjent i Populacja metody pozwalające na zapisanie stanu do pliku.
    11. Dodaj do klasy Pacjent i Populacja metody pozwalające na wczytanie stanu z pliku.

Zajęcia zdalne 01-02.04.2020

Grupa środa: meet.google.com/yvu-xnwx-yoj
Grupa czwartek: meet.google.com/tma-crsq-qwp

  1. Napisz klasę Kolo z atrybutami promien, pole i obwod. Zadbaj, by zmiana dowolnego z tych atrybutów odpowiednio wpływała na pozostałe.
  2. Napisz program zapisujący i wczytujący obiekt klasy Kolo do pliku tekstowego.
  3. Napisz program zapisujący i wczytujący obiekt klasy Kolo do pliku za pomocą modułu pickle.
  4. 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.

  5. Zmień adres zdalnego repozytorium poleceniem:
    git remote set-url origin https://github.com/NAZWA-KONTA/NAZWA-REPOZYTORIUM.git
    
  6. Wyślij zmiany na serwer:
    git push
    
  7. Utwórz plik test_tekstowy.py i napisz program tworzący obiekt klasy Populacja i wypisujący go (jak na poprzednich zajęciach). Przetestuj to działanie.
    Dołącz ten plik do repozytorium i wyślij na serwer.
  8. 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.
  9. Utwórz nową gałąź projektu
    git checkout -b zapisywanie
    
  10. Dodaj do klasy Populacja metodę zapisz(plik), która zapisuje obiekt do pliku tekstowego. Zapisz zmiany w repozytorium. Wyślij zmiany na serwer.
  11. Utwórz plik test_zapis.py testujący zapis do pliku. Zmiany zapisz w repozytorium i wyślij na serwer.
  12. Scal zmiany do gałęzi master:
    git checkout master
    git merge zapisywanie
    git branch -d zapisywanie
    
  13. 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.
    1. Zaimplementuj zarażanie się jeśli dystans między chorymi jest mniejszy niż … (analogicznie do poprzednich zajęć).
    2. Obiekt Pacjent ma atrybut status. Zmodyfikuj kod, aby zwracał błąd, jeśli użytkownik spróbuje zmienić go na coś innego niż ‘zdrowy’, ‘chory’, ‘nosiciel’.
    3. Obiekt Populacja ma atrybuty x i y. 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ę).
    4. Zaimplementuj skończony czas życia choroby. Np. po 100 ruchach chory albo zdrowieje (i jest odporny - nowy status), albo umiera.
    5. Wykres animacji niech zawiera drugi panel z kołowym wykresem statusu w populacji.
    6. Zmień sposób liczenia odległości z metryki maksimum na euklidesowski.
    7. 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ść).
    8. 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. jako scatter, 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.

  1. Napisz procedurę symulującą czasochłonne zadanie, np. tworzącą Pythonową tablicę N losowych liczb, a następnie sortującą bąbelkowo. Dobierz N, żeby sortowanie trwało np. 5 s.
  2. 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.
  3. Powtórz ten sam test dla funkcji z biblioteki NumPy, np. losującej dużą macierz i ją diagonalizującą.
  4. Powtórz ten sam test dla metody .sort Pythonowej listy.
  5. 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 a dist -0.3 zmienia o określoną wartość na jaki dystans następuje zarażenie.
  6. 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 typu http://... lub https://...) 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 ...).

  1. 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.
  2. Wykonaj zadanie 2 i 3 z poprzednich zajęć korzystając ze składni await/async (tutorial)
  3. Zapoznaj się z biblioteką Paho-MQTT. Napisz program, który:
    1. Co 1 s wysyła na kanał FUW_PR/TWOJ_IDENTYFIKATOR na serwerze mqtt.eclipse.org parę liczb odpowiadających aktualnemu wykorzystania procesora i pamięci (wykorzystaj moduł psutil)
    2. Monitoruje nadesłane komunikaty przez pozostałe osoby (włączając Ciebie).
    3. 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ę.

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.

  1. Stwórz następujące okienko:
    okno1
  2. Stwórz następujące okienko:
    okno2
  3. Stwórz następujące okienko:
    okno3

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

  1. 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
  2. Napisz prosty kalkulator:
    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

  1. Napisz program zliczający przebieg myszki i jej średnią prędkość (w pikselach na sekundę).
  2. 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.

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.

  1. Wykonaj serię ćwiczeń na wyrażenia regularne ze strony https://regexone.com/lesson/introduction_abcs
  2. 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

  1. 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.
  2. 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.
  3. Napisz dekorator @uppercase, który będzie sprawdzał typ argumentów. Dla każdego argumentu typu string zmień jego zawartość na wielkie litery.
  4. Napisz dekorator @all_strings. Przyjmij, że będzie stosowany do funkcji typu f(s), które oczekują argumentu typu string i zwracają string. Celem Twojego dekoratora jest zapewnienie, że będzie można też wykonać f(bs), gdzie bs to bytestring (i wtedy wynik też będzie tego typu).
  5. Korzystając z wyrażeń lambda odfiltruj z danej listy liczb jedynie liczby parzyste.
  6. Masz daną listę par liczb. Korzystając z wyrażeń lambda posortuj malejąco według sumy kwadratów obu składowych.
  7. 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.