Laboratorium 7: Trochę programowania
1 Wstęp
Tak nieszczęśliwie się złożyło, że niektóre grupy będą miały siedem laboratoriów inne zaś osiem (co zależy od parzystości tygodnia).
Zatem ostatnie laboratorium (ostatnie dwa laboratoria) poświęcone będą programowaniu w języku Python.
Tematyka zajęć w kolejnym semestrze będzie obejmowała programowanie w języku C — nie powinien to być specjalny problem.
Studenci na zajęciach siódmych rozpoczynają realizację zadań od „wprawek” (rozdział 2), a następnie kontynuują zadania do wykonania (rozdział 3) tyle ile dadzą rady. Im kto więcej zrobi tym lepsza ocena.
Zatem dla tych, którzy istotnie mają zajęcia ósme:
- powinny być one potraktowane w pierwszej kolejności jako zajęcia „odróbkowe”
- można też kontynuować zadania z laboratorium siódmego.
1.1 Cel laboratorium
Celem laboratorium jest zmierzenie się z (nowym?) językiem programowania i zaprogramowanie bardzo prostych problemów. Przy czym chciałbym aby samo programowanie poprzedzone było narysowaniem prostego schematu blokowego. Jako podstawowy zestaw bloków stosowanych na schematach blokowych można przyjąć ten z Wikipedii.
1.2 Wymagania
Zapoznanie się z elementarną dokumentacją programu Python (instrukcja laboratoryjna nr 4 [1] i/lub bardziej zaawansowaną dokumentacją po polsku dostępną on-line [2].
1.3 Materiały
1.3.1 Funkcje
Bardzo często programując w jakimś języku programowania musimy skorzystać z jakiejś funkcji. Python dostarcza bardzo wiele funkcj, a na przykłąd najbardzie podstawowe funkcje matematyczne dostępne są w module math. Na początkuy programu piszemy:
a poźniej możemy z funkcji korzystać swobodnie:
(Sprawdź jaki będzie wynik!)
Mozemy również zdefiniować własną funkcję. Będzie to funkcja . (Zwracam uwagę na wcięcie!)
Po jej zdefiniowaniu możemy już funkcji używać:
albo
albo
W powyższym przykładzie x jest zmienną niezależną (tak jak w funkcji ), a polecenie return powoduje wyliczenie wartości i „podstawienie jej pod f(x)”. Funkcję można zdefiniować również tak:
Teraz polecenie return zwraca (wyliczoną wcześniej) wartość y jako wartość funkcji f(x).
1.3.2 Rekurencja
Poniżej rekurencyjna definicja funkcji silnia
Sprawdź czy funkcja działa.
2 Struktura laboratorium
Zaczynamy od wprawek.
- Co robi ta instrukcja? Jaki będzie wyniki? Sprawdź! Zobacz co się będzie działo gdy zmienisz wartość a (na ujemną, na przykład). (Poniżej ␣ oznacza odstęp.)
Zmodyfikuj program tak, by rozpoznawał przypadek gdy a jest równe zero i informował o tym.
- Co robi ten program? Jaki będzie wynik?
Zmodyfikuj go tak aby drukował tablicę funkcji
dla
zmieniającego się od -10 do 10 włącznie.
- Co robi poniższy program?
Przy okazji, jaki będzie wynik programu?
A tego:
Peksperymentuj i opisz działanie instrukcji while.
3 Zadania do wykonania
3.1 Rekurencyje wyliczanie wartości Największego Wspólnego Dzielnika
Wariant rekurencyjny wyznaczania NWD wygląda jakoś tak: gdy
natomiast
gdy
.
Zadania
- Zaprogramuj w Pythonie funkcję gcd.
- Porównaj wyniki liczone każdą z trzech metod.
3.2 Ciąg Fibonacciego
Ciąg Fibonacciego jestjednym z wielu przykładów „operacji” zdefiniowanej rekurencyjnie.
Zadaniem jest zaprogramowanie (w Pythonie) rekurencyjnej funkcji wyliczającej zadany wyraz ciągu.
Dodatkowo programpowinien zliczać liczbę wywołań funkcji. W tym celu należy jedną zmienna przeznaczyć na licznik i zaraz po wejściu do funkcji zwiększać ten licznik o jeden.
Przed zakończeniem obliczeń program powinien wyswietlać wyliczony wyraz ciągu oraz liczbę wywołań funkcji.
3.3 Algorytm E
Oto jedna z jego wersji algorytmu Euklidesa: Dane są dwie dodatnie liczby całkowite i
, należy znaleźć ich największy wspólny dzielnik (NWD) tj. największą dodatnią liczbę całkowitą, która dzieli całkowicie zarówno
jak i
.
- [Znajdowanie reszty] Podziel
przez
i niech
oznacza resztę z tego dzielenia. (Mamy
.)
- [Czy wyszło zero?] Jeśli
zakończ algorytm; odpowiedzią jest
.
- [Upraszczanie] Wykonaj
,
i wróć do kroku 1.
Schemat blokowy
SVG-Viewer needed.
Zadania
- Spróbuj zaprogramować w Pythonie Algorytm E.
3.4 Algorytm B
- Przyjmij
, a następnie powtarzaj operacje:
,
,
zero lub więcej razy do chwili gdy przynajmniej jedna z liczb
i
przestanie być parzysta.
- Jeśli
jest nieparzyste to przyjmij
i przejdź do kroku 4. W przeciwnym razie przyjmij
.
- (W tym miejscu
jest parzyste i różne od zera). Przyjmij
.
- Jeśli
jest parzyste to przejdź do 3.
- Jeśli
, to przyjmij
, w przeciwnym razie przyjmij
.
- Przyjmij
. Jeśli
to wróć do kroku 3. W przeciwnym razie algorytm zatrzymuje się z wynikiem
.
Zadania
- Narysuj schemat blokowy algorytmu B
- Spróbuj zaprogramować w Pythonie Algorytm B.
3.5 Metoda Newtona-Raphsona: pierwiastek dowolnego stopnia
Załóżmy, że mamy wyznaczyć pierwiastek stopnia z liczby
, czyli znaleźć taką liczbę
, że:
(1) |
lub inaczej:
(2) |
Jeżeli oznaczymy to zadanie to można zapisać ogólniej: należy znaleźć takie
, że
.
Jeżeli zadanie dodatkowo uprościmy zakładając:
- funkcja ma dokładnie jedno miejsce zerowe,
- jest różniczkowalna,
- jej pochodna w całym przedziale jest albo dodatnia albo ujemna;
to możemy naszkicować następujący rysunek ilustrujący nasze zadanie:
Zaczynamy w punkcie ; wartość funkcji w tym punkcie wynosi
. Musimy w jakiś sposób zdecydować w którym kierunku należy wykonać następny krok. Zauważmy, że możemy w tym celu wykorzystać pochodną (czerwona, przerywana linia na powyższym rysunku). Jeżeli przybliżymy funkcję za pomocą pochodnej (stycznej do funkcji, przechodzącej przez punk
to następnym przybliżeniem będzie punkt przecięcia stycznej z osią
.
Z równania prostej mamy:
(3) |
czyli
(4) |
i dalej
(5) |
Jeżeli zauważymy, że oraz, że
to kolejne przybliżenie wyliczane będzie ze wzoru:
(6) |
albo
(7) |
Gdy , wówczas
(8) |
3.5.1 Realizacja programowa
Program będzie się składał z trzech części:
- blisko(a, b) – funkcja o wartościach logicznych sprawdzająca czy
,
- lepszy(w, g) – funkcja rzeczywista wyliczająca następne, lepsze przybliżenie pierwiastka,
- pierwiastek(n, w, g) – funkcja (rzeczywista) wyliczająca pierwiastek stopnia
z
zaczynając od przybliżenia
.
3.5.2 Zadania treningowe
- Narysować schematy blokowe poszczególncyh funkcji.
- Zaprogramować w języku Python program wyliczający dla zadanej liczby, z wykorzystaniem trzech powyższych funkcji, pierwiastek z zadanej (wczytanej) (bez rekurencji!).
- Zaprogramować wersję „rekurencyjną” powyższego algorytmu.
4 Materiały pomocnicze
4.1 Potrzebne instrukcje języka Python
- Instrukcja warunkowa
- Instrukcja while
- Definicje funkcji
5 Wersja PDF dokumentu
Literatura
[1] Wojciech Myszka. Laboratorium 4: błędy obliczen, python. Instrukcja laboratoryjna dostępna: http://kmim.wm.pwr.edu.pl/myszka/dydaktyka/technologie-informacyjne/mechatronika-mcm031003/laboratorium/laboratorium-4-bledy-obliczen-python/, 2015.
[2] Mark Pilgrim. Dive Into Python. Apress, Lipiec 2004. Dostępne jest polskie tłumaczenie on-line: http://pl.wikibooks.org/wiki/Zanurkuj_w_Pythonie zatytułowane Znurkuj w Pytonie.
Wersja: Wersja: 7 z drobnymi modyfikacjami! z dnia 2015-10-28 10:14:46 +0100