I Liceum Ogólnokształcące w Jarosławiu - Informatyka

Algorytm Euklidesa - ćwiczenia w Pythonie

Kontynuacja lekcji o algorytmie Euklidesa. Tym razem mniej ręcznych obliczeń, a więcej pracy z kodem. Uczniowie uruchamiają gotowe programy, zmieniają je, dopisują brakujące fragmenty i obserwują, jak działa pętla, funkcja, warunek oraz operator modulo.

← Wróć do lekcji głównej

1Cel ćwiczeń

Na tej lekcji pracujemy głównie z Pythonem. Matematyka jest tylko pretekstem do ćwiczenia programowania.

Uczeń powinien umieć:

  • uruchomić gotową funkcję,
  • zmienić wartości przekazywane do funkcji,
  • wczytać liczby za pomocą input(),
  • zrozumieć działanie pętli while,
  • dopisać komunikaty i proste zabezpieczenia programu,
  • wykorzystać funkcję nwd() w innym zadaniu.
Propozycja pracy: uczniowie kopiują kod do edytora Python, uruchamiają go, a następnie wykonują polecenia „Zmień kod”.
2Gotowy kod do uruchomienia

Kod 1. Najprostsza wersja funkcji obliczającej NWD.

def nwd(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

print(nwd(48, 18))

Po uruchomieniu program powinien wypisać 6.

Zmień kod:

  1. Zmień liczby 48 i 18 na 36 i 24.
  2. Uruchom program i sprawdź wynik.
  3. Sprawdź jeszcze pary: 56, 42, 100, 25, 14, 15.
  4. Dopisz drugi print(), aby program obliczał dwa przykłady jeden po drugim.

Ćwiczenie z lukami: uzupełnij brakujące miejsca.

def nwd(a, b):
    while b != 0:
        r = a ___ b
        a = ___
        b = ___
    return ___
3Wczytywanie danych od użytkownika

Kod 2. Program pyta użytkownika o dwie liczby.

def nwd(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

liczba1 = int(input("Podaj pierwszą liczbę: "))
liczba2 = int(input("Podaj drugą liczbę: "))

wynik = nwd(liczba1, liczba2)
print("NWD wynosi:", wynik)

Zmień kod:

  1. Zmień komunikaty w input() na własne.
  2. Dopisz zdanie: Obliczam największy wspólny dzielnik...
  3. Na końcu wypisz pełny komunikat, np. NWD liczb 48 i 18 wynosi 6.

Dodatkowe zadanie: zabezpiecz program przed liczbą zero.

if liczba1 == 0 or liczba2 == 0:
    print("Podaj liczby większe od zera.")
else:
    wynik = nwd(liczba1, liczba2)
    print("NWD wynosi:", wynik)

Wklej ten fragment na końcu programu zamiast zwykłego wywołania funkcji.

4Śledzenie działania pętli

Kod 3. Ta wersja pokazuje wartości zmiennych w każdym kroku.

def nwd(a, b):
    krok = 1
    while b != 0:
        print("Krok", krok, ": a =", a, "b =", b)
        r = a % b
        print("Reszta z dzielenia", a, "przez", b, "to", r)
        a = b
        b = r
        krok = krok + 1
    print("Koniec. NWD =", a)
    return a

nwd(48, 18)

Zmień kod:

  1. Uruchom program dla 48 i 18.
  2. Zmień liczby na 84 i 30.
  3. Usuń jedną linię z print() i sprawdź, czy program dalej działa.
  4. Dopisz licznik kroków tak, aby na końcu program wypisał: Liczba kroków: ...
5Modyfikacje gotowych programów

Program A - NWD trzech liczb.

def nwd(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

x = int(input("Podaj pierwszą liczbę: "))
y = int(input("Podaj drugą liczbę: "))
z = int(input("Podaj trzecią liczbę: "))

wynik = nwd(nwd(x, y), z)
print("NWD trzech liczb wynosi:", wynik)

Zadania: zmień program tak, aby pytał o imię użytkownika i wypisywał: Tomku, wynik to...

Program B - NWW dwóch liczb. NWW można obliczyć za pomocą NWD.

def nwd(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

a = int(input("Podaj a: "))
b = int(input("Podaj b: "))

nww = a * b // nwd(a, b)
print("NWW wynosi:", nww)

Zmień kod: dopisz obok wyniku także obliczone NWD.

Program C - skracanie ułamka.

def nwd(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

licznik = int(input("Podaj licznik: "))
mianownik = int(input("Podaj mianownik: "))

d = nwd(licznik, mianownik)
print("Po skróceniu:", licznik // d, "/", mianownik // d)

Zmień kod: dodaj zabezpieczenie, aby mianownik nie mógł być równy zero.

6Mini-projekty do samodzielnej modyfikacji

Mini-projekt 1 - kalkulator NWD w pętli.

def nwd(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

while True:
    a = int(input("Podaj a: "))
    b = int(input("Podaj b: "))
    print("NWD =", nwd(a, b))

    dalej = input("Czy chcesz policzyć jeszcze raz? tak/nie: ")
    if dalej == "nie":
        break

print("Koniec programu.")

Zadania:

  1. Zmień słowo kończące program z nie na koniec.
  2. Dopisz numer kolejnego obliczenia, np. Obliczenie nr 1.
  3. Dodaj komunikat, gdy użytkownik poda dwie takie same liczby.

Mini-projekt 2 - sprawdzanie, czy liczby są względnie pierwsze.

def nwd(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

a = int(input("Podaj pierwszą liczbę: "))
b = int(input("Podaj drugą liczbę: "))

if nwd(a, b) == 1:
    print("Liczby są względnie pierwsze.")
else:
    print("Liczby nie są względnie pierwsze.")

Zmień kod: program ma wypisać również wartość NWD.

7Mini-test z Pythona
1. Co robi operator % w Pythonie?
2. Która pętla została użyta w funkcji nwd()?
3. Co oznacza return a?
4. Co trzeba zmienić, aby funkcja policzyła NWD innych liczb?