Grafika przedstawia dwa splecione symbole węży. Jeden jest niebieski, a drugi żółty.
Grafika przedstawia dwa splecione symbole węży. Jeden jest niebieski, a drugi żółty.
Stosowanie funkcji w języku Python do realizacji algorytmu Euklidesa z resztą z dzielenia
Logo języka Python
Źródło: Dnu72, dostępny w internecie: commons.wikimedia.org, licencja: CC BY-SA 4.0.
Algorytm wyznaczania największego wspólnego dzielnika opisany został przez greckiego matematyka Euklidesa. Algorytm ten ma dwie wersje. Pierwsza wykorzystuje odejmowanie i została przedstawiona w e‑materiale Stosowanie funkcji w języku Python do realizacji algorytmu Euklidesa z odejmowaniemP1BvUOkroStosowanie funkcji w języku Python do realizacji algorytmu Euklidesa z odejmowaniem. Druga wersja – wykorzystująca operacje obliczania reszty z dzielenia – zostanie opisana w tym e‑materiale.
Przeanalizujesz schemat blokowy algorytmu obliczania NWD z zastosowaniem działania reszty z dzielenia.
Napiszesz program obliczający NWD.
Zastosujesz napisany program do skracania ułamków zwykłych.
Porównasz liczbę operacji wykonywanych w algorytmach Euklidesa wykorzystujących odejmowanie i działanie reszty z dzielenia.
1
NWD
Największy wspólny dzielnik (NWD) dwóch liczb całkowitych a i b to największa liczba naturalna d, która jest dzielnikiem każdej z nich, czyli dzieli je bez reszty. Przyjmijmy, że będziemy ją oznaczać jako d = NWD(a, b).
NWD ma wiele zastosowań, m.in. pozwala skracać ułamki zwykłe do postaci nieskracalnej, tzn. takiej, w której licznik i mianownik są liczbami względnie pierwszymi, czyli NWD(a, b) = 1.
Algorytm Euklidesa z zastosowaniem działania reszty z dzielenia
Specyfikacja algorytmu:
Dane wejściowe:
a, b – dodatnie liczby naturalne
Wynik:
d – dodatnia liczba naturalna, NWD(a, b)
Do rozwiązania postawionego problemu użyjemy algorytmu Euklidesa w wersji z zastosowaniem działania reszty z dzielenia.
Przeanalizujemy schemat blokowy algorytmu.
R1crwcNRkMMEP
Na diagramie widoczny jest algorytm wyznaczania największego wspólnego dzielnika dwóch liczb przy użyciu metody Euklidesa. Diagram jest przedstawiony w formie schematu blokowego. Algorytm rozpoczyna się od zielonego owalu z napisem START. Od niego schodzi strzałka w dół prowadząca do pierwszego różowego równoległoboku. W nim wpisany jest tekst Wczytaj liczbę a, Wczytaj liczbę b. Od równoległoboku schodzi strzałka w dół do fioletowego rombu. W nim wpisane jest b znak większe od zero. Od rombu odchodzą dwie strzałki. Jedna z napisem tak, druga z napisem nie. Strzałka z napisem tak prowadzi do zielone prostokąta. W nim wpisany jest tekst r znak równości a mod b, a znak równości b, b znak równości r. Od prostokąta prowadzi strzałka, która zakręca do strzałki odchodzącej od różowego równoległoboku. Strzałka z napisem nie prowadzi do drugiego różowego równoległoboku. W nim wpisany jest tekst Wypisz a. Od tego równoległoboku prowadzi strzałka do czerwonego owalu z napisem STOP.
Schemat blokowy algorytmu Euklidesa z wykorzystaniem działania reszty z dzielenia
Źródło: Robert Bednarz, licencja: CC BY 3.0.
Przykład 1
Przeanalizujmy wyznaczanie NWD według algorytmu Euklidesa z wykorzystaniem działania reszty z dzielenia (zgodnie ze schematem blokowym umieszczonym powyżej) dla danych: a = 76, b = 12.
Powtórzenia
a
b
działanie
1
76
16
r = 76 mod 16 = 12 a = 16 b = 12
2
16
12
r = 16 mod 12 = 4 a = 12 b = 4
3
12
4
r = 12 mod 4 = 0 a = 4 b = 0
0
Wynik: NWD(76, 16) = 4
Liczba powtórzeń: 3
Przykład pokazuje, że dopóki b > 0, powtarzamy wykonywanie następującego zestawu instrukcji: wyliczamy resztę z dzielenia a mod b, do a przypisujemy b, natomiast do b przypisujemy wyliczoną resztę. Kiedy b, czyli ostatnia obliczona reszta, wyniesie 0, algorytm kończy działanie, a wynikiem jest wartość a, czyli wartość przedostatniej wyliczonej reszty.
Najważniejszą częścią algorytmu jest pętla, która wykonuje się, dopóki warunek b > 0 jest prawdziwy. Wewnątrz pętli obliczamy resztę z dzielenia liczb r = a mod b i wykonujemy przypisania: a = b, b = r. Po zakończeniu pętli wypisujemy wynik, tj. wartość a.
Zapis algorytmu w postaci programu
Napiszemy program, który będzie obliczał NWD, wykorzystując omówiony algorytm.
Do pisania programu możesz użyć dostępnego w swoim środowisku edytora, np. IDLE dołączonego do standardowej instalacji języka Python.
Przykład 2
Zacznijmy od kodu, w którym za pomocą komentarzy oznaczymy kolejne kroki algorytmu:
Linia 1. kratka pobierz liczbę całkowitą a.
Linia 4. kratka pobierz liczbę całkowitą b.
Linia 7. kratka pętla obliczająca NWD.
Linia 10. kratka wypisanie wyniku.
Linia 11. print otwórz nawias okrągły cudzysłów NWD otwórz nawias okrągły a przecinek b zamknij nawias okrągły znak równości cudzysłów przecinek a zamknij nawias okrągły.
# pobierz liczbę całkowitą a
# pobierz liczbę całkowitą b
# pętla obliczająca NWD
# wypisanie wyniku
print("NWD(a, b) =", a)
Dane
Jak wynika z komentarzy w kodzie programu, na początku musimy pobrać dane, czyli dwie liczby naturalne większe od zera.
1
Polecenie 1
Dodaj do kodu poniżej odpowiednich komentarzy instrukcje pobierające z klawiatury dwie liczby naturalne i zapamiętujące je w zmiennych a i b. Użyj funkcji input() i int().
Kod z uzupełnionymi instrukcjami pobierania od użytkownika danych:
Linia 1. kratka pobierz liczbę całkowitą a.
Linia 2. a znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj liczbę a dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 4. kratka pobierz liczbę całkowitą b.
Linia 5. b znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj liczbę b dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 7. kratka pętla obliczająca NWD.
Linia 10. kratka wypisanie wyniku.
Linia 11. print otwórz nawias okrągły cudzysłów NWD otwórz nawias okrągły a przecinek b zamknij nawias okrągły znak równości cudzysłów przecinek a zamknij nawias okrągły.
# pobierz liczbę całkowitą a
a = int(input("Podaj liczbę a: "))
# pobierz liczbę całkowitą b
b = int(input("Podaj liczbę b: "))
# pętla obliczająca NWD
# wypisanie wyniku
print("NWD(a, b) =", a)
Pętla
Naszym zadaniem jest teraz zapisanie w programie pętli obliczającej NWD. Ponieważ nie wiemy, ile razy trzeba wykonać instrukcje wewnętrzne pętli, aby uzyskać wynik, użyjemy instrukcji while. Pętla będzie działać, dopóki warunek b > 0 będzie prawdziwy. Wewnątrz pętli umieścimy trzy instrukcje przypisania. Pierwsza instrukcja przypisze zmiennej r obliczoną resztę z dzielenia: r = a % b, pozostałe instrukcje przypisania zmienią wartości zmiennych: a = b oraz b = r.
1
Polecenie 2
W programie pod komentarzem pętla obliczająca NWD zapisz odpowiednie instrukcje:
pętlę sprawdzającą warunek b > 0 (użyj instrukcji while),
wewnątrz pętli operacje wyliczania reszty (r = a % b) oraz przypisania (a = b i b = r).
Linia 1. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 2. r znak równości a procent b.
Linia 3. a znak równości b.
Linia 4. b znak równości r.
while b > 0:
r = a % b
a = b
b = r
Gotowy kod:
Linia 1. kratka pobierz liczbę całkowitą a.
Linia 2. a znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj liczbę a dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 4. kratka pobierz liczbę całkowitą b.
Linia 5. b znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj liczbę b dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 7. kratka pętla obliczająca NWD.
Linia 8. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 9. r znak równości a procent b.
Linia 10. a znak równości b.
Linia 11. b znak równości r.
Linia 13. kratka wypisanie wyniku.
Linia 14. print otwórz nawias okrągły cudzysłów NWD otwórz nawias okrągły a przecinek b zamknij nawias okrągły znak równości cudzysłów przecinek a zamknij nawias okrągły.
# pobierz liczbę całkowitą a
a = int(input("Podaj liczbę a: "))
# pobierz liczbę całkowitą b
b = int(input("Podaj liczbę b: "))
# pętla obliczająca NWD
while b > 0:
r = a % b
a = b
b = r
# wypisanie wyniku
print("NWD(a, b) =", a)
Przeanalizujmy operacje przypisania. Czy można wyeliminować zapisywanie reszty w zmiennej pomocniczej r? Czy jeden z dwóch zaprezentowanych niżej bloków kodu rozwiązałby ten problem?
Pierwsza propozycja
Linia 1. a znak równości b.
Linia 2. b znak równości a procent b.
a = b
b = a % b
Druga propozycja
Linia 1. b znak równości a procent b.
Linia 2. a znak równości b.
b = a % b
a = b
W obydwu wypadkach nie wykonamy poprawnych obliczeń. Przykładowo: niech a = 26 oraz b = 4.
W pierwszym przypadku wartość zmiennej a zostaje zastąpiona wartością zmiennej b, zatem w pierwszym kroku dla podanych danych otrzymamy a = 4 oraz b = 4, co w konsekwencji doprowadzi nas do sytuacji, w której a = 4 oraz b = 0, czyli NWD(a, b) wyniósłby 4, a to nie jest poprawna odpowiedź.
W drugiej propozycji w pierwszym kroku przypisujemy zmiennej b wynik obliczenia reszty z dzielenia a i b. Przyjmując jako początkowe wartości zmiennych a = 26 oraz b = 4, po pierwszym kroku będą one miały wartości a = 26 oraz b = 2, a po drugim kroku a = 2 oraz b = 2. Dlatego w obliczeniach używamy zmiennej pomocniczejzmienna pomocniczazmiennej pomocniczejr, w której tymczasowo zapisujemy resztę a % b, zanim w następnym kroku zmienimy wartość zmiennej a.
Polecenie 3
Przetestuj powyższe propozycje dla różnych argumentów w kolejnych etapach w poniższej testerce.
R1GawqhbnWekD
Źródło: GroMar, licencja: CC BY 3.0.
Wynik działania programów zaprezentowanych w testerce:
Linia 1. Przypadek pierwszy dwukropek.
Linia 2. a dwukropek 51 przecinek b dwukropek 13.
Linia 3. a dwukropek 13 przecinek b dwukropek 0.
Linia 4. Zwrócona wartość dwukropek 13.
Linia 6. Przypadek drugi dwukropek.
Linia 7. a dwukropek 51 przecinek b dwukropek 13.
Linia 8. a dwukropek 12 przecinek b dwukropek 12.
Linia 9. a dwukropek 0 przecinek b dwukropek 0.
Linia 10. Zwrócona wartość dwukropek 0.
Linia 12. Przypadek ze zmienną pomocniczą dwukropek.
Linia 13. a dwukropek 51 przecinek b dwukropek 13.
Linia 14. r dwukropek 12 a dwukropek 13 przecinek b dwukropek 12.
Linia 15. r dwukropek 1 a dwukropek 12 przecinek b dwukropek 1.
Linia 16. r dwukropek 0 a dwukropek 1 przecinek b dwukropek 0 przecinek.
Linia 17. Zwrócona wartość dwukropek 1.
Pierwsze dwie funkcje działają błędnie – prawidłowa wartość NWD podanych liczb wynosi 1.
W funkcji nwd_pierwsza(a, b), po aktualizacji a na b, wartość b jest ustawiana na a% b, tymczasem b powinno przyjąć poprzednią wartość r (reszta z dzielenia a przez b).
W funkcji nwd_druga(a, b) najpierw aktualizujemy b, a następnie a, co prowadzi do utraty oryginalnej wartości a przed kolejną iteracją.
Funkcja
Obliczanie NWD można w programie wykonywać wielokrotnie dla różnych danych. Fragment kodu programu służący do obliczania NWD zapiszemy w funkcjifunkcjafunkcji o nazwie oblicz_nwd(). Funkcja będzie wymagała dwóch parametrów – liczb naturalnych a i b. Zadaniem funkcji będzie obliczenie NWD liczb a i b oraz zwrócenie odpowiedniego wyniku.
Polecenie 4
Pisanie funkcji zacznij od nagłówka defoblicz_nwd(a, b), a następnie w ciele funkcji umieść pętlę obliczającą NWD. Na końcu funkcji wstaw instrukcję return a.
Linia 1. def oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 2. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 3. r znak równości a procent b.
Linia 4. a znak równości b.
Linia 5. b znak równości r.
Linia 6. return a.
def oblicz_nwd(a, b):
while b > 0:
r = a % b
a = b
b = r
return a
Użycie funkcji
W programie umieścimy wywołaniewywołanie funkcjiwywołanie funkcji oblicz_nwd(). Pobrane liczby (zmienne l1 i l2) przekażemy jako argumenty, tj. konkretne wartości parametrów w wywołaniu funkcji. Zwrócony wynik przypiszemy do zmiennej d, aby wypisać go na końcu programu.
1
Polecenie 5
Po instrukcjach wczytujących z klawiatury wartości zmiennych l1 oraz l2 (argumenty funkcji oblicz_nwd()) umieść instrukcję przypisania zmiennej do wyniku działania funkcji:
Linia 1. d znak równości oblicz podkreślnik nwd otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły.
d = oblicz_nwd(l1, l2)
Dodaj na końcu instrukcję odpowiedzialną za wypisanie wyniku:
Pełny kod programu wykorzystującego funkcję do obliczania NWD:
Linia 1. def oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 2. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 3. r znak równości a procent b.
Linia 4. a znak równości b.
Linia 5. b znak równości r.
Linia 6. return a.
Linia 8. l1 znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj pierwszą liczbę dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 9. l2 znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj drugą liczbę dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 11. d znak równości oblicz podkreślnik nwd otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły.
Linia 13. print otwórz nawias okrągły cudzysłów NWD otwórz nawias okrągły cudzysłów przecinek l1 przecinek cudzysłów przecinek cudzysłów przecinek l2 przecinek cudzysłów zamknij nawias okrągły znak równości cudzysłów przecinek d zamknij nawias okrągły.
def oblicz_nwd(a, b):
while b > 0:
r = a % b
a = b
b = r
return a
l1 = int(input("Podaj pierwszą liczbę: "))
l2 = int(input("Podaj drugą liczbę: "))
d = oblicz_nwd(l1, l2)
print("NWD(", l1, ",", l2,") = ", d)
1
Polecenie 6
Przetestuj napisany program wykorzystujący funkcję do obliczenia NWD dla następujących danych:
Linia 1. kratka Pierwszy zestaw danych.
Linia 2. l1 znak równości 8.
Linia 3. l2 znak równości 38.
Linia 5. kratka Drugi zestaw danych.
Linia 6. l1 znak równości 68.
Linia 7. l2 znak równości 16.
Linia 9. kratka Trzeci zestaw danych.
Linia 10. l1 znak równości 7.
Linia 11. l2 znak równości 17.
# Pierwszy zestaw danych
l1 = 8
l2 = 38
# Drugi zestaw danych
l1 = 68
l2 = 16
# Trzeci zestaw danych
l1 = 7
l2 = 17
Wypisane komunikaty:
Linia 1. NWD otwórz nawias okrągły 8 przecinek 38 zamknij nawias okrągły znak równości 2.
Linia 2. NWD otwórz nawias okrągły 68 przecinek 16 zamknij nawias okrągły znak równości 4.
Linia 3. NWD otwórz nawias okrągły 7 przecinek 17 zamknij nawias okrągły znak równości 1.
NWD(8, 38) = 2
NWD(68, 16) = 4
NWD(7, 17) = 1
Skracanie ułamków
Jednym z zastosowań algorytmu Euklidesa jest skracanie ułamków zwykłych. Wykorzystamy napisany wcześniej program do tego zadania.
Przyjmiemy, że danymi będą licznik i mianownik ułamka, który chcemy skrócić. Powinny to być liczby całkowite większe od 0, więc do programu dodamy instrukcję warunkową, która będzie sprawdzała, czy tak jest. Jeżeli któraś z podanych liczb będzie mniejsza od jeden, wypiszemy komunikat i zakończymy program, wywołując funkcję exit():
Linia 1. if l1 otwórz nawias ostrokątny 1 or l2 otwórz nawias ostrokątny 1 dwukropek.
Linia 2. print otwórz nawias okrągły cudzysłów Błędne dane wykrzyknik cudzysłów zamknij nawias okrągły.
Linia 3. exit otwórz nawias okrągły zamknij nawias okrągły.
if l1 < 1 or l2 < 1:
print("Błędne dane!")
exit()
Skracanie ułamka zwykłego polega na podzieleniu licznika i mianownika przez tę samą liczbę - największy wspólny dzielnik licznika i mianownika. W tym wypadku liczbą będzie największy wspólny dzielnik zapisany w zmiennej d. Jeżeli będzie on większy niż 1, wypiszemy skrócony ułamek.
Pełen kod programu:
Linia 1. def oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 2. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 3. r znak równości a procent b.
Linia 4. a znak równości b.
Linia 5. b znak równości r.
Linia 6. return a.
Linia 8. l1 znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj licznik dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 9. l2 znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj mianownik dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 11. if l1 otwórz nawias ostrokątny 1 or l2 otwórz nawias ostrokątny 1 dwukropek.
Linia 12. print otwórz nawias okrągły cudzysłów Błędne dane wykrzyknik cudzysłów zamknij nawias okrągły.
Linia 13. exit otwórz nawias okrągły zamknij nawias okrągły.
Linia 15. d znak równości oblicz podkreślnik nwd otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły.
Linia 16. print otwórz nawias okrągły cudzysłów NWD otwórz nawias okrągły cudzysłów przecinek l1 przecinek cudzysłów przecinek cudzysłów przecinek l2 przecinek cudzysłów zamknij nawias okrągły znak równości cudzysłów przecinek d zamknij nawias okrągły.
Linia 18. if d zamknij nawias ostrokątny 1 dwukropek.
Linia 19. print otwórz nawias okrągły cudzysłów Ułamek dwukropek cudzysłów przecinek l1 przecinek cudzysłów prawy ukośnik cudzysłów przecinek l2 zamknij nawias okrągły.
Linia 20. print otwórz nawias okrągły cudzysłów Po skróceniu dwukropek cudzysłów przecinek l1 prawy ukośnik prawy ukośnik d przecinek cudzysłów prawy ukośnik cudzysłów przecinek l2 prawy ukośnik prawy ukośnik d zamknij nawias okrągły.
Linia 21. else dwukropek.
Linia 22. print otwórz nawias okrągły cudzysłów Ułamka nie da się skrócić kropka cudzysłów zamknij nawias okrągły.
def oblicz_nwd(a, b):
while b > 0:
r = a % b
a = b
b = r
return a
l1 = int(input("Podaj licznik: "))
l2 = int(input("Podaj mianownik: "))
if l1 < 1 or l2 < 1:
print("Błędne dane!")
exit()
d = oblicz_nwd(l1, l2)
print("NWD(", l1, ",", l2,") = ", d)
if d > 1:
print("Ułamek:", l1, "/", l2)
print("Po skróceniu:", l1 // d, "/", l2 // d)
else:
print("Ułamka nie da się skrócić.")
W kodzie warto zwrócić uwagę na operator //, który oznacza dzielenie całkowite.
1
Polecenie 7
Przetestuj działanie programu dla następujących danych:
Linia 1. kratka Pierwszy zestaw danych.
Linia 2. l1 znak równości 9.
Linia 3. l2 znak równości 45.
Linia 5. kratka Drugi zestaw danych.
Linia 6. l1 znak równości 7.
Linia 7. l2 znak równości 9.
# Pierwszy zestaw danych
l1 = 9
l2 = 45
# Drugi zestaw danych
l1 = 7
l2 = 9
Wypisane komunikaty:
Linia 1. NWD otwórz nawias okrągły 9 przecinek 45 zamknij nawias okrągły znak równości 9.
Linia 2. Ułamek dwukropek 9 prawy ukośnik 45.
Linia 3. Po skróceniu dwukropek 1 prawy ukośnik 5.
Linia 1. NWD otwórz nawias okrągły 7 przecinek 9 zamknij nawias okrągły znak równości 1.
Linia 2. Ułamka nie da się skrócić kropka.
NWD( 7 , 9 ) = 1
Ułamka nie da się skrócić.
Notatnik
R1FhhXaq8A0vG
Miejsce na Twoje notatki: (Uzupełnij)
.
Symulacja interaktywna
R1HnYmDmqDrqF
Symulacja dotyczy algorytmów do znajdowania największego wspólnego dzielnika (NWD) przy użyciu dwóch metod: odejmowania i dzielenia modulo. Na grafice znajduje się instrukcja dotycząca analizy tych algorytmów. Instrukcja jest umieszczona w ramce z niebieskim obramowaniem, z ilustracją osoby w lewym górnym rogu oraz pytajnikiem w różowym kółku nad ilustracją. Po lewej stronie widnieje tekst: „Korzystając z przygotowanej symulacji, przeanalizuj, jak przebiega znajdowanie NWD w obydwu algorytmach dla wartości podanych w polach zamieszczonych pod symulacją. Zwróć uwagę na wartości, które przyjmują zmienne w kolejnych powtórzeniach oraz liczbę powtórzeń koniecznych do uzyskania wyniku. By wykonać jedno powtórzenie działania pętli, użyj przycisku „Wykonaj jedno powtórzenie”. By obliczyć od razu wynik końcowy, użyj przycisku „Oblicz wynik końcowy'”. W centralnej części grafiki znajdują się dwa prostokąty z pseudokodem algorytmów: pętla wykorzystująca odejmowanie oraz pętla wykorzystująca dzielenie modulo. Poniżej znajdują się pola do wprowadzenia wartości liczb a i b oraz dwa przyciski: „Wykonaj jedno powtórzenie” oraz „Oblicz wynik końcowy”. Pola te umożliwiają użytkownikowi interaktywne wprowadzenie danych i przeprowadzenie symulacji działania algorytmów.
Symulacja dotyczy algorytmów do znajdowania największego wspólnego dzielnika (NWD) przy użyciu dwóch metod: odejmowania i dzielenia modulo. Na grafice znajduje się instrukcja dotycząca analizy tych algorytmów. Instrukcja jest umieszczona w ramce z niebieskim obramowaniem, z ilustracją osoby w lewym górnym rogu oraz pytajnikiem w różowym kółku nad ilustracją. Po lewej stronie widnieje tekst: „Korzystając z przygotowanej symulacji, przeanalizuj, jak przebiega znajdowanie NWD w obydwu algorytmach dla wartości podanych w polach zamieszczonych pod symulacją. Zwróć uwagę na wartości, które przyjmują zmienne w kolejnych powtórzeniach oraz liczbę powtórzeń koniecznych do uzyskania wyniku. By wykonać jedno powtórzenie działania pętli, użyj przycisku „Wykonaj jedno powtórzenie”. By obliczyć od razu wynik końcowy, użyj przycisku „Oblicz wynik końcowy'”. W centralnej części grafiki znajdują się dwa prostokąty z pseudokodem algorytmów: pętla wykorzystująca odejmowanie oraz pętla wykorzystująca dzielenie modulo. Poniżej znajdują się pola do wprowadzenia wartości liczb a i b oraz dwa przyciski: „Wykonaj jedno powtórzenie” oraz „Oblicz wynik końcowy”. Pola te umożliwiają użytkownikowi interaktywne wprowadzenie danych i przeprowadzenie symulacji działania algorytmów.
Źródło: GroMar Sp. z o.o., licencja: CC BY-SA 3.0.
Symulacja dotyczy algorytmów do znajdowania największego wspólnego dzielnika (NWD) przy użyciu dwóch metod: odejmowania i dzielenia modulo. Na grafice znajduje się instrukcja dotycząca analizy tych algorytmów. Instrukcja jest umieszczona w ramce z niebieskim obramowaniem, z ilustracją osoby w lewym górnym rogu oraz pytajnikiem w różowym kółku nad ilustracją. Po lewej stronie widnieje tekst: „Korzystając z przygotowanej symulacji, przeanalizuj, jak przebiega znajdowanie NWD w obydwu algorytmach dla wartości podanych w polach zamieszczonych pod symulacją. Zwróć uwagę na wartości, które przyjmują zmienne w kolejnych powtórzeniach oraz liczbę powtórzeń koniecznych do uzyskania wyniku. By wykonać jedno powtórzenie działania pętli, użyj przycisku „Wykonaj jedno powtórzenie”. By obliczyć od razu wynik końcowy, użyj przycisku „Oblicz wynik końcowy'”. W centralnej części grafiki znajdują się dwa prostokąty z pseudokodem algorytmów: pętla wykorzystująca odejmowanie oraz pętla wykorzystująca dzielenie modulo. Poniżej znajdują się pola do wprowadzenia wartości liczb a i b oraz dwa przyciski: „Wykonaj jedno powtórzenie” oraz „Oblicz wynik końcowy”. Pola te umożliwiają użytkownikowi interaktywne wprowadzenie danych i przeprowadzenie symulacji działania algorytmów.
1
Polecenie 8
Przeanalizuj w symulacji działanie algorytmu Euklidesa z wykorzystaniem odejmowania i działania reszty z dzielenia dla podanych niżej liczb. Podaj wynik oraz liczbę powtórzeń pętli dla każdego z algorytmów.
Do wykonania polecenia wykorzystaj następujące dane:
Linia 1. kratka Pierwszy zestaw.
Linia 2. a znak równości 56.
Linia 3. b znak równości 3.
Linia 5. kratka Drugi zestaw.
Linia 6. a znak równości 3.
Linia 7. b znak równości 56.
# Pierwszy zestaw
a = 56
b = 3
# Drugi zestaw
a = 3
b = 56
R6mZ14trtjfr1
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
Przykładowe wyniki dla a = 24 i b = 5:
Odejmowanie:
NWD(24, 5) = 1 Liczba powtórzeń: 8
Działanie reszty z dzielenia:
NWD(24, 5) = 1 Liczba powtórzeń: 3.
Dla a = 56, b = 3
Odejmowanie: NWD(56, 3) = 1 Liczba powtórzeń: 20
Działanie reszty z dzielenia: NWD(56, 3) = 1 Liczba powtórzeń: 3
Dla a = 3, b = 56
Odejmowanie: NWD(3, 56) = 1 Liczba powtórzeń: 20
Działanie reszty z dzielenia: NWD(3, 56) = 1 Liczba powtórzeń: 4
Wniosek:
Kolejność podawanych argumentów nie ma wpływu na liczbę wykonywanych operacji w przypadku algorytmu Euklidesa wyznaczania NWD z wykorzystaniem operacji odejmowania.
Kolejność podawanych argumentów ma wpływ na liczbę wykonywanych operacji w przypadku algorytmu Euklidesa wyznaczania NWD z wykorzystaniem operacji reszta z dzielenia.
1
Polecenie 9
Przeanalizuj w symulacji działanie algorytmu Euklidesa z wykorzystaniem odejmowania i działania reszty z dzielenia dla podanych niżej liczb. Podaj wynik oraz liczbę powtórzeń pętli dla każdego z algorytmów.
Do wykonania polecenia wykorzystaj następujące dane:
Linia 1. kratka Pierwszy zestaw danych.
Linia 2. a znak równości 3.
Linia 3. b znak równości 566.
Linia 5. kratka Drugi zestaw danych.
Linia 6. a znak równości 3.
Linia 7. b znak równości 5666.
# Pierwszy zestaw danych
a = 3
b = 566
# Drugi zestaw danych
a = 3
b = 5666
R6HCR7l0uGXZ5
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
Przykładowe wyniki dla a = 24 i b = 5:
Odejmowanie: NWD(24, 5) = 1 Liczba powtórzeń: 8
Dzielenie: NWD(24, 5) = 1 Liczba powtórzeń: 3
Dla a = 3, b = 566
Odejmowanie: NWD(3, 566) = 1 Liczba powtórzeń: 190
Działanie reszty z dzielenia: NWD(3, 566) = 1 Liczba powtórzeń: 4
Dla a = 3, b = 5666
Odejmowanie: NWD(3, 5666) = 1 Liczba powtórzeń: 1890
Działanie reszty z dzielenia: NWD(3, 5666) = 1 Liczba powtórzeń: 4
Zestaw ćwiczeń interaktywnych
1
Pokaż ćwiczenia:
R1TgTJ8iRKu2j1
Ćwiczenie 1
Wskaż poprawnie obliczone wartości NWD.
RtFxGsZEAWKkx1
Ćwiczenie 2
Wskaż, ile razy wykona się pętla while w algorytmie obliczania NWD z wykorzystaniem reszty z dzielenia dla liczb 170 oraz 2023.
RVsHd9M4sEGB12
Ćwiczenie 3
Zaznacz poprawne dokończenie zdania. Jeżeli nagłówek funkcji wyliczającej NWD z wykorzystaniem algorytmu Euklidesa z działaniem reszty z dzielenia ma postać def NWD(a, b), pętla wykonująca obliczenia kończy się, kiedy…
RV4IIUDPTx1Mq2
Ćwiczenie 4
Uporządkuj podane instrukcje wewnątrz funkcji obliczającej NWD przy użyciu algorytmu Euklidesa z wykorzystaniem dzielenia. Elementy do uszeregowania: 1. a = b, 2. b = r, 3. r = a % b, 4. while b > 0:, 5. return a
Uporządkuj podane instrukcje wewnątrz funkcji obliczającej NWD przy użyciu algorytmu Euklidesa z wykorzystaniem dzielenia. Elementy do uszeregowania: 1. a = b, 2. b = r, 3. r = a % b, 4. while b > 0:, 5. return a
Źródło: Robert Bednarz, licencja: CC BY 3.0.
RvQxMmFeAXqSL2
Ćwiczenie 5
Zaznacz wszystkie poprawne odpowiedzi. Do zakodowania pętli obliczającej NWD przy użyciu algorytmu Euklidesa z wykorzystaniem dzielenia użyjesz: Możliwe odpowiedzi: 1. instrukcji pobierania, 2. pętli for, 3. pętli while, 4. instrukcji przypisania, 5. instrukcji warunkowej
Źródło: Robert Bednarz, licencja: CC BY 3.0.
RwlNIhUuLwOfo2
Ćwiczenie 6
Po zakończeniu działania pętli w algorytmie Euklidesa obliczającym NWD z wykorzystaniem dzielenia i funkcji wynikiem jest: Możliwe odpowiedzi: 1. przedostatnia obliczona reszta, 2. zmienna b (drugi parametr), 3. ostatnia obliczona reszta, 4. zmienna a (pierwszy parametr)
Źródło: Robebert Bednarz, licencja: CC BY 3.0.
311
Ćwiczenie 7
Uzupełnij program obliczający największy wspólny dzielnik według algorytmu Euklidesa z wykorzystaniem działania reszty z dzielenia w taki sposób, aby wypisywał wartości przyjmowane przez zmienne r, a, b wykorzystywane w pętli while, liczbę wykonanych iteracji oraz największy wspólny dzielnik zadanych wartości l1 oraz l2.
Specyfikacja problemu:
Dane wejściowe:
l1, l2 - liczby naturalne
Wyniki:
wartości przyjmowane przez zmienne r, a i b w kolejnych iteracjach pętli while
tekst Liczba powtórzeń: oraz liczba iteracji (wartość zmiennej licznik)
wartości l1, l2 oraz NWD(l1, l2)
Przykład:
Dla l1= 63 i l2= 8:
Linia 1. 7 8 7.
Linia 2. 1 7 1.
Linia 3. 0 1 0.
Linia 4. Liczba powtórzeń dwukropek 3.
Linia 5. 63 8 1.
7 8 7
1 7 1
0 1 0
Liczba powtórzeń: 3
63 8 1
Ćwiczenie wykonaj w kolejnych etapach w poniższej testerce:
R19FI55kldpP31
Źródło: GroMar Sp. z o.o, licencja: CC BY 3.0.
Zwróć uwagę na komunikaty wyświetlane w testerce po błędnym zapisaniu kodu lub niespełnieniu wszystkich warunków polecenia w danym etapie.
W pętli while użyj instrukcji print() do wypisania wartości zmiennych oraz instrukcji, która zwiększy wartość licznika o 1. Poza pętlą while użyj instrukcji print() do wypisania liczby powtórzeń. Do ostatniej instrukcji w programie wstaw wywołanie funkcji obliczającej NWD.
Ważne!
Odpowiedzi mogą w niewielkim stopniu różnić się od napisanego przez ciebie kodu, zależnie od kolejności definiowania zmiennych i przypisywania.
Krok pierwszy:
Linia 1. print otwórz nawias okrągły r przecinek a przecinek b zamknij nawias okrągły.
Linia 2. licznik znak równości licznik plus 1.
print(r, a, b)
licznik = licznik + 1
Krok drugi:
Linia 1. print otwórz nawias okrągły cudzysłów Liczba powtórzeń dwukropek cudzysłów przecinek licznik zamknij nawias okrągły.
Linia 2. oblicz podkreślnik nwd otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły.
Linia 1. def oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 2. licznik znak równości 0.
Linia 3. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 4. r znak równości a procent b.
Linia 5. a znak równości b.
Linia 6. b znak równości r.
Linia 7. print otwórz nawias okrągły r przecinek a przecinek b zamknij nawias okrągły.
Linia 8. licznik znak równości licznik plus 1.
Linia 9. print otwórz nawias okrągły cudzysłów Liczba powtórzeń dwukropek cudzysłów przecinek licznik zamknij nawias okrągły.
Linia 10. return a.
Linia 12. l1 znak równości 3.
Linia 13. l2 znak równości 77.
Linia 14. print otwórz nawias okrągły l1 przecinek l2 przecinek oblicz podkreślnik nwd otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły zamknij nawias okrągły.
def oblicz_nwd(a, b):
licznik = 0
while b > 0:
r = a % b
a = b
b = r
print(r, a, b)
licznik = licznik + 1
print("Liczba powtórzeń:", licznik)
return a
l1 = 3
l2 = 77
print(l1, l2, oblicz_nwd(l1, l2))
311
Ćwiczenie 8
Napisz funkcję oblicz_nww(a, b), która będzie obliczała najmniejszą wspólną wielokrotność przekazanych argumentów. Program powinien wyświetlić liczby l1 i l2 oraz ich najmniejszą wspólną wielokrotność.
Specyfikacja problemu:
Dane wejściowe:
l1, l2 – liczby naturalne
Wyniki:
liczby l1 i l2 oraz NWW(l1, l2)
Przykład:
Dla l1= 7 i l2= 3:
Linia 1. 7 3 21.
7 3 21
Ćwiczenie wykonaj w kolejnych etapach w poniższej testerce:
R1AaVqIEjWbW21
Źródło: GroMar Sp. z o.o, licencja: CC BY 3.0.
Zwróć uwagę na komunikaty wyświetlane w testerce po błędnym zapisaniu kodu lub niespełnieniu wszystkich warunków polecenia w danym etapie.
Ważne!
Odpowiedzi mogą w niewielkim stopniu różnić się od napisanego przez ciebie kodu, zależnie od kolejności definiowania zmiennych i przypisywania.
Krok pierwszy:
Linia 1. return a asterysk b prawy ukośnik prawy ukośnik oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły.
return a * b // oblicz_nwd(a, b)
Gotowy kod:
Linia 1. def oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 2. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 3. r znak równości a procent b.
Linia 4. a znak równości b.
Linia 5. b znak równości r.
Linia 6. return a.
Linia 8. def oblicz podkreślnik nww otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 9. return a asterysk b prawy ukośnik prawy ukośnik oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły.
Linia 11. l1 znak równości 12.
Linia 12. l2 znak równości 5.
Linia 13. print otwórz nawias okrągły l1 przecinek l2 przecinek oblicz podkreślnik nww otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły zamknij nawias okrągły.
def oblicz_nwd(a, b):
while b > 0:
r = a % b
a = b
b = r
return a
def oblicz_nww(a, b):
return a * b // oblicz_nwd(a, b)
l1 = 12
l2 = 5
print(l1, l2, oblicz_nww(l1, l2))
Słownik
funkcja
funkcja
wyodrębniony i nazwany blok kodu zawierający instrukcje wykonujące najczęściej jedno zadanie; w języku Python definicja funkcji rozpoczyna się słowem kluczowym def
Linia 1. def nazwa podkreślnik funkcji otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 2. kratka ciało funkcji.
def nazwa_funkcji():
# ciało funkcji
parametry i argumenty funkcji
parametry i argumenty funkcji
parametry to zmienne umieszczane w nawiasach okrągłych w momencie definiowania funkcji, które symbolizują wartości wymagane do jej działania; argumenty to konkretne wartości liczbowe podawane w nawiasach okrągłych po nazwie funkcji w miejscu jej wywołania
wywołanie funkcji
wywołanie funkcji
uruchomienie funkcji polegające na wpisaniu jej nazwy wraz z nawiasami, w których mogą zostać podane argumenty (jeśli są wymagane)
zmienna pomocnicza
zmienna pomocnicza
zmienna tymczasowo przechowująca pośredni wynik obliczeń