Laboratorium 2: Algorytm Euklidesa

1 Pętle

Tematem przewodnim zajęć jest zapoznanie się z dwiema podstawowymi konstrukcjami do tworzenia pętli:

  1. Polecenia while

    while ( w )
    {
    	B;
    }
    
    Tak
    Nie
    start
    w==1
    B
    koniec
  2. Polecenie dowhile

    do
    {
    	B
    } while ( w );
    
    Tak
    Nie
    start
    B
    w==1
    koniec

W miejscu gdzie pojawiają się trzy kropeczki wstawiamy polecenie/polecenia, które będą wykonywane w pętli tak długo, jak długo warunek jest prawdziwy.

Polecenie while (oraz dowhile) istotnie różnią się od polecenia if. Na pierwszy rzut oka różnica nie jest specjalnie wielka:

if (m > n)
{
    m = m - n;
}

while (m > n)
{
    m = m - n;
}
T
Nie
start
m > n
m = m - n
koniec

ale istota pierwszego przykładu (if) jest taka: sprawdź czy m jest większe od n i jeżeli tak jest wykonaj operację odejmowania (m=mn) zapisując wynik w m; w przeciwnym razie nic nie rób i skończ.

T
Nie
start
m > n
m = m - n
koniec

W drugim przypadku (while) tak długo jak m jest większe od n wykonuj operację odejmowania (m=mn).

W pierwszym przypadku będzie jedno sprawdzenie i (gdy wynik będzie pozytywny) jedno wykonanie odejmowania.

W przypadku drugim będzie cykl: sprawdzenie warunku — ewentualne wykonanie odejmowania; zawsze po wykonanym odejmowaniu sprawdzany będzie ponownie warunek. Gdy warunek nie będzie spełniony — przechodzimy do wykonywania kolejnego polecenia.

Algorytm Euklidesa

Wszystkie zmienne są typu int!

Zadania do wykonania

  1. Zapoznać się z różnymi wariantami algorytmu Euklidesa:

  2. Napisać program realizujący algorytm Euklidesa w wersji „z resztą”. Algorytm powinien być zaprogramowany na co najmniej dwa sposoby: z wykorzystanie instrukcji while i dowhile. Ewentualnym, trzecim sposobem może być użycie pętli for.

Wersja „z odejmowaniem"

Dane są dwie dodatnie liczby całkowite m i n. Należy znaleźć ich największy wspólny dzielnik, tj. największą dodatnią liczbę całkowitą, która dzieli bez reszty zarówno m jak i n.

  1. Jeżeli m jest równe n — koniec, największym wspólnym dzielnikiem jest n.

  2. Jeżeli m>n przyjmij mmn; w przeciwnym razie przyjmij nnm

  3. Przejdź do kroku 1.

lub raczej, wersję zmodyfikowaną:

  1. Tak długo jak mn powtarzaj:

    1. Jeżeli m>n przyjmij mmn; w przeciwnym razie przyjmij nnm
  2. Największym wspólnym dzielnikiem jest n.

Wersja „z resztą”

Dane są dwie dodatnie liczby całkowite m i n. Należy znaleźć ich największy wspólny dzielnik, tj. największą dodatnią liczbę całkowitą, która dzieli bez reszty zarówno m jak i n.

  • [E1] : [Znajdowanie reszty] Podziel m przez n i niech r oznacza resztę z tego dzielenia.

  • [E2] : [Czy wyszło zero?] Jeśli r=0, zakończ algorytm; odpowiedzią jest n.

  • [E3] : [Upraszczanie] Wykonaj mn, nr i wróć do kroku E1.

Na czym polega problem?

Porównajmy uproszczone schematy blokowe

  • Algorytmu E

    Nie
    Tak
    Start
    Instrukcja1
    warunek
    Instukcja2
    Stop
  • polecenia while

    Tak
    Nie
    Start
    warunek
    Instrukcja
    Stop
  • petli do

    Tak
    Nie
    Start
    Instrukcja
    Warunek
    Stop

while zaczyna się od warunku, jak jest spełniony — wykonujemy jakieś polecenia i powtarzamy

do — najpierw wykonujemy jakieś polecenie, później sprawdzamy warunek i jeżeli jest spełniony — powtarzamy.

Algorytm E ma instrukcje przed warunkiem (jak do) i po warunku (jak while). Natomiast jego istotą jest aby operacje były wykonywane w kolejności:

instrukcje 1 warunek instrukcje 2 instrukcje 1 warunek instrukcje 2 warunek

W każdym przypadku korzystając ze standardowych poleceń pętlowych trzeba te „nadmiarowe" instrukcje uwzględnić.

Na koniec słów parę o pętli for

for(A ; B ; C)
{
    D
}

Realizowane będzie jako

Nie
Tak
start
A
B==1
koniec
D
C

Jak można jej użyć do realizacji Algorytmu Euklidesa?

Poprzedni
Następny