Algorytm - pojęcie algorytmu, sposób zapisu, poziom

Transkrypt

Algorytm - pojęcie algorytmu, sposób zapisu, poziom
Algorytm - pojęcie algorytmu, sposób zapisu,
poziom szczegółowości, czynności proste i
strukturalne. Pojęcie procedury i funkcji.
Maria Górska
9 stycznia 2010
1
Spis treści
1 Pojęcie algorytmu
3
2 Sposób zapisu
3
3 Poziom szczegółowości
4
4 Czynności proste i strukturalne
5
5 Pojęcie procedury i funkcji
5
2
1
Pojęcie algorytmu
Algorytmem nazywamy ściśle określoną procedurę obliczeniową, która dla danych wejściowych ”produkuje” pożądane dane wyjściowe, czyli wynik działania
algorytmu [1]. Możemy więc traktować algorytm jako ciąg kroków obliczeniowych prowadzących do przekształcania danych wejściowych w wyjściowe. Przykładowe algorytmy to chociażby:
1. Algorytm Euklidesa (służący do odnajdywania NWD dwóch liczb);
2. Algorytm służący do obliczania n-tych wyrazów ciągu Fibonacciego;
3. Algorytmy sortowania, np. poprzez kopcowanie.
Dobrze skonstruowany algorytm powinien byc poprawny, skończony oraz efektywny.
2
Sposób zapisu
Algorytmy można przedstawiać na kilka sposobów:
Opis słowny - na ogół mało dokładny, przykładem może być chociażby przepis
kulinarny.
Lista kolejnych kroków postępowania np:
Krok 1 Rozpocznij pracę
Krok 2 Pobierz pierwszą liczbę (a)
Krok 3 Pobierz durgą liczbę (b)
Krok 4 Wykonaj dodawanie liczby pierwszej do drugiej (a+b)
Krok 5 Podaj wynik dodawania
Krok 6 Zakończ pracę
Schemat blokowy - tu przedstawiamy algorytm graficznie, przy pomocy ”skrzynek”:
• skrzynka graniczna - ma kształt owalu; oznaczamy nią początek i
koniec algorytmu.
• skrzynka operacyjna - ma kształt prostokąta; oznacza wykonywane
działania, np: podstawianie (i:=1).
• skrzynka wejścia - ma kształt równoległoboku; oznacza wprowadzanie
danych lub wyprowadzanie wyników.
• skrzynka warunkowa - ma kształt rombu; oznacza najczęśćiej sprawdzanie jakiegoś warunku i posiada najczęściej wartość zmiennej boolean (to znaczy może przyjmować wartość prawdy lub fałszu).
3
Drzewo algorytmu - graficzna reprezentacja algorytmu przyjmująca postać
drzewa. W takiej reprezentacji, wierzchołki pośrednie drzewa zawierają
wykonywane w algorytmie operacje, a w wierzchołkach końcowych znajdują się wszystkie możliwe wyniki wykonania algorytmu. Pomaga ono
prześledzić przebieg działania algorytmu oraz określić jego złożoność. W
opracowaniach informatycznych drzewo rysowane jest ”do góry nogami”,
to znaczy z ”korzeniem” u góry. Wyróżnc można ”korzeń”-wierzchołek, w
którym zaczynają się działania algorytmu, wierzchołoki pośrednie, gdzie
znajdują się wykonywane operacje, a także wierzchołki końcowe, które
odpowiadają różnych możliwością zakończenia działania algorytmu.
Pseudokod - korzystając z tego sposobu rezygnujemy z reguł składniowych danego języka programowania na rzecz czytelnośći (np: wyświetl na ekranie:
Hello World), często za graficzny obraz pseudokodu przyjmuje się schemat
blokowy.
Program w danym języku programowania , np. w języku Pascal:
begin
writeln(’Hello World’);
end.
3
Poziom szczegółowości
Poziom szczegółowości to jedna z cech algorytmów. Powinien być dobrany tak,
aby był zrozumiały dla maszyny, komputera, który wykonuje dany algorytm,
który powinien składać się z akcji podstawowych. Szczegółowość algorytmu w
dużej mierze zalezy od złożoności problemu, do którego rozwiązywania ma służyć.
Idąc tym tropem nie trudno zauważyć, że nie tylko różnić się będą struktury algorytmu którego zadaniem bedzie dodawanie do siebie dwóch liczb będzie
się różnić od struktury algorytmu liczacego wartość funkcji n!, ale także w różny
sposób można przedstawić działanie jednego algorytmu, np. algorytmu szukającego NWD dwóch liczb:
Przykład 1 - Odnajdywanie NWD dwóch liczb w sposób ”szkolny”, opisane
szczegółowo
Krok 1 Pobierz liczby a i b
Krok 2 Wypisz czynniki pierwsze liczby a jako listę A
Krok 3 Wypisz czynniki pierwsze liczby b jako listę B
Krok 4 Utwórz listę liczb C, jako listę elementów wspólnych dla A i B
4
Krok 5 Oblicz c jako iloczyn elementów listy C, jesli lista jest pusta to
c=1
Krok 6 Podaj wynik dodawania
Krok 7 Zakończ pracę
Przykład 2 - Algorytm Euklidesa [6], opisany w sposób o wiele mniej szczegółowy niż meta w Przykładzie 1
Krok 1 Oblicz c jako resztę z dzielenia a przez b
Krok 2 Zastąp pozycję a liczbą b, a pozycję b liczbą c
Krok 3 Jeżeli pozycja b=0, to szukane NWD=a, w przeciwnym wypadku
wróć do Kroku 1
Jak widac, algorytm o małym poziomie szczegółowości będzie rozumiał polecenia o wiele bardziej skomplikowane, np. ”znajd NWD liczb a i b”, natomiast
algorytm o wyższym poziomie szczegółowości będzie potrzebował, aby mu to
polecenie krok po kroku ”wytłumaczyć”, ”rozpisać”.
Przeciwieństwem poziomu szczegółowości jest poziom abstrakcji - im wyższy
poziom abstrakcji, tym niższy poziom sczegółowości danego algorytmu, tym
bardziej skompliowane polecenia algorytm ”rozumie”.
Często konstruując algorytmy pisze się je na niskim poziomie szczegółowości, a
potem dopiero uszczegóławia polecenia, które są złożone.
4
Czynności proste i strukturalne
Czynności proste są podstawowymi składnikami programów (elementarnymi elementami języka, w którym programujemy),co oznacza, że nie zawierają w sobie
żadnych dodatkowych instukcji. Przykładem może być instrukcja wprowadzenia
danych, instrukcja przypisania itp.
Czynności strukturalne natomiast zawierają w sobie czynności proste,na tej podstawie budowane są rekurencje, iteracje (instrukcje powtarzalne), czy instrukcje
warunkowe.
5
Pojęcie procedury i funkcji
Procedury i funkcje inaczej zwane sa podprogramami, czyli wydzielonymi częściami wykonującymi dane operacje. Służą one przede wszystkim do uproszczenia kodu programu głównego. Na ogół konstruując podprogram musimy dostosować opis podprogramu do struktury danych w naszym programie głównym.
W częsci języków programowania nie wyróżnia się różnicy pomiędzy procedurami i funkcjami i nazywa się je ogólnie podprogramami.
5
W gruncie rzeczy, różnica między funkcjami i procdurami jest następująca: funkcja ma wykonywać obliczenia i zwracać jakąś wartość, nie powinna natomiast
mieć żadnego innego wpływu na działanie programu (np. funkcja obliczająca
pierwiastek kwadratowy), procedura natomiast nie zwraca żadnej wartości, zamiast tego wykonuje pewne działania (np. procedura czyszcząca ekran).
W jezyku Pascal podprogramy wyglądają następująco:
Jako procedura:
procedureP rocedura({argumenty});
begin
{instrukcjedowykonania}
end;
Jako funkcja:
f unctionF unkcja({argumenty}) : integer; {typwartoscif unkcji}
begin
{instrukcjedowykonania(cialof unkcji)}
end;
Literatura
[1] Thomas H. Cormen,Charles E. Leiserson, Ronald L. Rivest, Stein Clifford
Wprowadzenie do algorytmów Warszawa 2001
[2] Maciej M. Sysło Algorytmy Warszawa 2002
[3] http://www.staff.amu.edu.pl/ psi
[4] http://icis.pcz.pl/ olga/dydaktyka.html
[5] http://www.nw.pwr.wroc.pl/ szczygiel/wyklady/ELPROG3.doc
[6] http://www.pl.wikipedia.org/
6