Wersja do druku
Transkrypt
Wersja do druku
Programowanie Podstawy Informatyki Wykład 3 Algorytmy Co to jest algorytm? Sformułowanie problemu. Opracowanie metodyki rozwiązania. Opracowanie algorytmu. Napisanie kodu źródłowego (zakodowanie) w wybranym języku (Pascal, Fortran, C++, itp.). Kompilacja kodu źródłowego Uruchomienie programu na komputerze. Wykonanie obliczeń. Analiza otrzymanych wyników. Usunięcie błędów programu (debugging). Istotne cechy algorytmu Jeżeli mamy do wykonania jakieś zadanie, budujemy sposób, przepis realizacji tego zadania. Taki przepis to algorytm. •Definicja zadania = co algorytm ma zrobić. Przykłady: •Opis ciągu czynności, które po kolei mają być wykonane. •przepis kucharski, •Czynności te muszą być na tyle proste (i możliwe do wykonania), aby wykonawca algorytmu mógł je bez dodatkowego tłumaczenia, wykonać ⇒operacje elementarne; odpowiednio dobrany poziom szczegółowości. •instrukcja składania mebla/urządzenia. . . , •zapis nutowy, •wykonywanie pisemne dodawania/mnożenia/dzielenia... •Skończona ilość operacji elementarnych ⇒skończony czas działania. Algorytm (definicja nieformalna) •Algorytm dostaje pewne informacje (dane wejściowe) i zwraca jakieś (oczekiwane) wyniki — dane wyjściowe. to sposób postępowania (przepis) umożliwiający rozwiązanie określonego zadania (klasy zadań), podany w postaci skończonego zestawu czynności do wykonania, ze wskazaniem ich następstwa. Algorytm Pochodzenie nazwy: od nazwiska w wersji łacińskiej Algorithmus, Algorismus perskiego matematyka Muhammeda ibn Musy zwanego al Chuwarismi, żyjącego w IX w (podał on algorytmy wykonywania działań arytmetycznych na liczbach dziesiętnych. Algorytmika - dział wiedzy zajmujący się badaniem algorytmów Sposoby zapisu algorytmu: •słowami, •za pomocą schematu blokowego, •w pseudokodzie, •w jednym z języków programowania Program - formalnie spisana wersja algorytmu. •Może istnieć kilka przepisów, które dają w efekcie te same wyniki. Algorytm to ściśle określony ciąg kroków obliczeniowych, prowadzący do przekształcenia danych wejściowych w wyjściowe. Cechy dobrego algorytmu: •Definicja problemu określa dane we. (pochodzące z dokładnie określonego zbioru wartości dozwolonych) i dane wy. •Precyzyjnie zdefiniowany — każdy jego krok jest jednoznacznie określony i obejmuje wyłącznie operacje elementarne. •Skończony — wyprodukuje wynik w skończonej ilości kroków. •Jednoznaczny (powtarzalny) — jego wielokrotne wykonywanie dla identycznych danych we. daje zawsze taki sam wynik. •Kompletny — uwzględnia wszystkie możliwe przypadki, jakie mogą wystąpić podczas jego wykonywania. •Uniwersalny — umożliwia rozwiązanie całej klasy zadań, a nie tylko pojedynczego, ustalonego zadania. Algorytm sekwencyjny - opis słowny Postawienie problemu: - Co należy zrobić, aby zobaczyć film “Chrzest” ? Algorytm 1a: Idź do kina Kup bilet Obejrzyj film Wróć do domu Algorytm powyższy zawiera 4 podstawowe składniki, z których każdy wymaga zakończenia wykonania pewnej akcji przed rozpoczęciem następnej. W komputerze każdy składnik będzie zapisany jako instrukcja lub grupa instrukcji (procedura). Algorytm powinien być kolejno uściślany, by mógł być w swojej ostatecznej postaci zrozumiały dla komputera, oraz by uwzględniał wszystkie okoliczności przewidziane przez projektanta. Przykład algorytmu: sumowanie zarobków pracowników Algorytm 1b: POCZĄTEK jeżeli nie wyświetlają filmu "Chrzest” to znajdź sobie inne zajęcie w przeciwnym razie idź do kina jeżeli jest kolejka to ustaw się w kolejce (na końcu?) dopóki przed Tobą stoją ludzie wykonuj przesuwaj się do przodu jeżeli są wolne miejsca to kup bilet, znajdź swoje miejsce dopóki trwa projekcja wykonuj oglądaj film w przeciwnym razie zaklnij po cichu, wyjdź z kina, :-( wróć do domu KONIEC Dane: lista pracowników z zarobkami (1) zanotuj "na boku" liczbę 0; (2) przeglądaj ankiety i dodawaj zarobki każdego pracownika do liczby "na boku"; (3) kiedy osiągniesz koniec listy, przedstaw wartość liczby "na boku" jako wynik. Cechy tego algorytmu: •Działa na różnych zestawach danych, ale daje poprawne wyniki. •Sam tekst algorytmu jest ograniczony i krótki, ale proces który opisuje zmienia się wraz z długościa listy pracowników. Oprócz algorytmów słownych, często stosuje się zapis algorytmu w postaci schematów blokowych. Algorytmy przedstawione powyżej wykorzystują język naturalny oraz słowa kluczowe. Słowa kluczowe definiują podstawowe struktury sterujące programu oraz procesy podejmowania decyzji występujących w algorytmie: jeżeli ..... to ..... w przeciwnym razie dopóki ..... wykonuj powtarzaj ..... aż do Te słowa kluczowe mają swoje odpowiedniki w każdym z języków programowania. Wprowadzenie słów kluczowych do opisu słownego algorytmu jest częścią tzw. pseudo - kodu, wykorzystywanego do zapisu algorytmu. Szczegółowy algorytm jest podstawą dla prawidłowo zakodowanego programu. Algorytm z “wcięciami” pozwala na bardziej czytelny zapis, i stanowi nieformalną metodę ułatwiającą śledzenie “dróg” programu. START czytaj: n,a(i),i=1,...n suma=0 Schemat blokowy (block diagram, flowchart) to diagram, na którym algorytm jest reprezentowany przez opisane figury geometryczne, połączone liniami zgodnie z kolejnością wykonywania czynności wynikających z przyjętego algorytmu rozwiązania zadania; pozwala dostrzec istotne etapy algorytmu i logiczne zależności między nimi; suma=suma + a(i) i=i+1 i≤n nie druk: a(i), suma STOP tak Schematy blokowe Start Stop •strzałka wskazuje kierunek przebiegu sterowania programem, łączy inne bloki, •operand (prostokąt) — wszystkie operacje z wyjątkiem instrukcji wyboru, instrukcja czytanie danych, wydruk wyników tak •predykat (romb) — instrukcja wyboru, •etykieta (owal) — początek lub koniec sekwencji schematu. •wejście/wyjście (równoległobok). ? nie Algorytm Euklidesa Opis słowny: •dane są dwie liczby a i b; Problem: mając dane dwie liczby naturalne a i b znaleźć •jeśli a jest równe b, to NWD jest równe a, ich największy wspólny dzielnik. •w przeciwnym wypadku, jeżeli a jest większe od b, to zmień a na równe a - b, a jeżeli a jest mniejsze od b to zmień b na b - a; Pierwotnie problem ten sprowadzał się do czysto geometrycznego problemu znalezienia wspólnej miary dla dwóch odcinków. •zacznij od początku. Zadanie algorytmiczne: Dane: a, b ∈ N, Wynik: NWD(a,b). Schemat blokowy Algorytm Euklidesa (metoda 1) START •Pseudokod loop czytaj: a, b if a = b then return a; else if a > b then a := a -b; a<>b Drukuj a else b := b -a; nie •Język C while(a != b) { tak tak a=a-b a>b nie b=b-a STOP if(a > b) a -= b; else b -= a; } return a; Algorytm Euklidesa (metoda 2) •Język C if(a < b) { t = a; a = b; b = t; Przy opracowywaniu algorytmu zwracamy uwagę na: jego poprawność semantyczną (składnię), prostotę, czas działania, ilość zajmowanej pamięci komputera, optymalność, ograniczenia } while(b != 0) { c = a % b; a = b; b = c; } return a; Określa elementarny lub bardziej złożony krok algorytmu. Zdanie złożone: oblicz pierwiastek równania kwadratowego Jeżeli jest to krok elementarny, to wystarczy przy tworzeniu programu zapisać ten krok w języku programowania. Jest to złożony krok algorytmu wymagający uszczegółowienia. Zdanie proste Jeżeli natomiast jest to złożony krok algorytmu, to podczas uszczegółowienia algorytmu zostanie on zastąpiony sekwencją prostszych zdań. W programie jest to realizowane poprzez instrukcję złożoną grupującą ciąg instrukcji prostych. Przykład elementarnego kroku - instrukcja podstawienia (przypisania): przypisz zmiennej suma wartość zero FORTRAN: C: PASCAL: suma = 0.0 suma = 0.0 ; suma :=0.0 ; PODEJMOWANIE DECYZJI W PROGRAMIE Zdanie decyzyjne “jeśli” Zdanie to zawiera strukturę opisującą decyzje podejmowane w algorytmie. Istnieją 2 rodzaje struktur: struktura prosta : jeśli ..... to struktura z alternatywą: jeśli ..... to .... w przeciwnym razie Struktura prosta jeśli warunek to zdanie gdzie warunek jest wyrażeniem przyjmującym dwie wartości: - wartość prawdy, - wartość fałszu Jeżeli warunek przyjmie wartość prawdy, to wykonuje się zdanie, a gdy warunek przyjmie fałsz, to zdanie nie zostanie wykonane. Przykład: jeśli średnia ocen studenta jest większa od 4.5 to wpisz studenta na listę nagród warunek : Struktura z alternatywą jeśli warunek to zdanie 1 w przeciwnym razie zdanie 2 średnia ocen studenta jest większa od 4.5 Jeżeli warunek jest prawdziwy, to wykonywane jest zdanie: wpisz studenta na listę nagród Rozważmy następujący problem: W zależności od wartości jakie przyjmuje zmienna x (np ocena) należy wydrukować następujące komunikaty: W programach numerycznych warunkiem jest najczęściej wyrażenie logiczne: nie, lub, i dla x < 3 dla 3 <= x <= 6 dla x > 6 komunikat komunikat komunikat “negatywna” “pozytywna” “niemożliwa” Np.: a lub b, (a lub b) i c, ..... Algorytm przyjmie postać: jeżeli x <3 to wypisz “negatywna” w przeciwnym razie jeżeli x >= 3 i x <= 6 to wypisz “pozytywna” w przeciwnym razie wypisz “niemożliwa” W wyrażeniach logicznych występują też relacje: = , <>, >, <, <=, >= FORTRAN: a). IF ( warunek ) THEN zdanie 1 PASCAL: a). IF warunek THEN zdanie 1; Np.: a > b, c <= d Przykład zdania decyzyjnego: jeśli (a > b) lub (c <= d) to podstaw x = 0 ENDIF b). b). IF IF ( warunek ) THEN zdanie 1 ELSE zdanie 2 ENDIF warunek THEN zdanie 1 ELSE zdanie 2; Instrukcja decyzyjna wybierz C: a). IF warunek zdanie 1; Zdanie wybierz służy do wyboru jednej z kilku możliwości. Ma ono postać: IF wybierz przełącznik z wartość_1: zdanie_1 .... wartość_n: zdanie_n w przeciwnym razie akcja awaryjna b). warunek zdanie 1; ELSE zdanie 2; Przykład: wybierz p z 1: wykonaj wariant pierwszy 2: wykonaj wariant drugi 3: wykonaj wariant trzeci w przeciwnym razie wydrukuj komunikat o błędzie Przykład: Program cenzurka1 .... .... wybierz ocena z 6: pisz(‘celujacy’); 5: pisz(‘bardzo dobry’); 4: pisz(‘dobry’); 3: pisz(‘dostateczny’); 2: pisz(‘niedostateczny’); w przeciwnym razie pisz(‘blad danych’) .... .... Koniec Blok instrukcji W przypadku, gdy w danej instrukcji, np. instrukcji warunkowej, powinna wykonać się więcej niż jedna instrukcja, wówczas stosowany jest blok instrukcji. C: Pascal: { begin } instrukcja1; instrukcja1; instrukcja2; instrukcja2; instrukcja3; instrukcja3; ........ ........ Program cenzurka2 ..... jeżeli ocena = 6 to pisz(‘celujacy’) w przeciwnym razie jeżeli ocena = 5 to pisz(‘bardzo dobry’) w przeciwnym razie jeżeli ocena = 4 to pisz(‘dobry’) w przeciwnym razie jeżeli ocena = 3 to pisz(‘dostateczny’) w przeciwnym razie jeżeli ocena = 2 to pisz(‘niedostateczny’) w przeciwnym razie pisz(‘blad danych’) Iteracja warunkowa dopóki(while) dopóki(wyrażenie) instrukcja1; nie wyrażenie tak instrukcja1 end; Instrukcja1 może nie wykonać się ani jeden raz! Iteracja warunkowa wykonuj ... dopóki ... Działanie pętli: • Obliczana jest wartość wyrażenia (do ... while ...) wykonuj instrukcja1 dopóki(wyrażenie) ; • Jeśli wyrażenie jest równe fałszywe to instrukcja1 nie jest w ogóle wykonywana • Wpp. wykonywana jest instrukcja1. instrukcja1 • Ponownie obliczana jest wartość wyrażenia i ponownie sprawdzana jego prawdziwość itd. nie • Jeśli wyrażenie będzie fałszywe, to działanie pętli zostanie przerwane wyrażenie tak Uwaga: obliczenie wartości wyrażenia odbywa się przed wykonaniem instrukcji1 Instrukcja1 musi wykonać się co najmniej jeden raz! Iteracja ograniczona dla(for) Działanie pętli: •Wykonywana jest instrukcja1 dla <zmienna> od <w1<> do <w2> (z krokiem <k>) wykonuj instrukcja1 ; •Obliczana jest wartość wyrażenia • Jeśli wyrażenie jest równe prawdziwe to instrukcja1 jest wykonywana kolejny raz • Ponownie obliczana jest wartość wyrażenia i ponownie sprawdzana jego prawdziwość itd. <zmienna> ← <w1> <zmienna> + <k> • Jeśli wyrażenie będzie fałszywe, to działanie pętli zostanie przerwane zmienna ≤ <w2> nie instrukcja1 Uwaga: obliczenie wartości wyrażenia odbywa się po wykonaniu instrukcji1 tak Instrukcja1 może nie wykonać się ani jeden raz! Działanie pętli: •Wykonanie instrukcji inicjalizujących pętlę <zmienna> ← <w1> • Sprawdzenie wyrażenia warunkowego <zmienna> ≤ <w2>. Jeśli fałsz, praca pętli zostaje zakończona, Jeśli prawda, wykonana zostanie instrukcja1 • Wykonanie instrukcji zwiększ <zmienna> o <k> Uwaga: sprawdzenie wyrażenia <zmienna> ≤ <w2> odbywa się przed wykonaniem instrukcja1