Schematy blokowe są tzw. metajęzykiem. Oznacza to, że jest to język bardzo ogólny, służy do opisywania algorytmów w taki sposób, by na jego podstawie można było je zaimplementować w każdym języku. Częściami składowymi schematów blokowych są proste figury geometryczne, np. prostokąt, romb, koło, równoległobok itd... W tych figurach umieszczamy warunki oraz proste instrukcje, przy czym mogą być one związane z jakimś konkretnym językiem (np. symbolem instrukcji przypisania może być ":=" tak, jak w Pascalu lub "=" tak, jak w C) Jeśli tworząc schemat nie jesteśmy jeszcze zdecydowani w jakim języku będziemy pisali nasz program lub tworzymy schemat dla kogoś, to lepiej jest stosować notację bardziej symboliczną, np. instrukcję przypisania zapisywać jako strzałkę skierowaną od wartości przypisywanej do zmiennej.
Za chwilę przedstawię elementy składowe schematów blokowych, przedtem jednak powiem coś o narzędziach do ich konstruowania.
Zasadniczo najszybciej schematy pisze się na zwykłej kartce, pojawia się jednak problem, gdy schemat trzeba umieścić w jakimś dokumencie (np. dokumentacji projektu). Można wtedy skorzystać z popularnych edytorów tekstu (np. Word pod Windows lub KWord pod Linux). Mają one wbudowane opcje do tworzenia figur schematu, ale nie są one zbyt wygodne w użyciu.
Teraz przejdźmy do opisu schematów.
Poszczególne elementy schematu łączy się za pomocą strzałek. W większości przypadków blok ma jedną strzałkę wchodzącą i jedną wychodzącą, lecz są także wyjątki (omówię je poniżej).
Ta figura oznacza początek lub koniec algorytmu. W każdym algorytmie musi się znaleźć dokładnie jedna taka figura z napisem "Start" oznaczająca początek algorytmu oraz dokładnie jedna figura z napisem "Stop" oznaczająca koniec algorytmu. Najczęściej popełnianym błędem w schematach blokowych jest umieszczanie kilku stanów końcowych, zależnych od sposobu zakończenia programu. Jest to niedopuszczalne, w programie mamy przecież dokładnie jedną instrukcję "end." Blok symbolizujący początek algorytmu ma dokładnie jedną strzałkę wychodzącą a blok symbolizujący koniec ma co najmniej jedną strzałkę wchodzącą.
Jest to figura oznaczająca proces. W jej obrębie umieszczamy wszelkie obliczenia lub podstawienia. Proces ma dokładnie jedną strzałkę wchodzącą i dokładnie jedną strzałkę wychodzącą.
Romb symbolizuje blok decyzyjny. Umieszcza się w nim jakiś warunek (np. "x>2"). Z dwóch wybranych wierzchołków rombu wyprowadzamy dwie możliwe drogi: gdy warunek jest spełniony (strzałkę wychodzącą z tego wierzchołka należy opatrzyć etykietą "Tak") oraz gdy warunek nie jest spełniony. Każdy romb ma dokładnie jedną strzałkę wchodzącą oraz dokładnie dwie strzałki wychodzące.
Równoległobok jest stosowany do odczytu lub zapisu danych. W jego obrębie należy umieścić stosowną instrukcję np. Read(x) lub Write(x) (można też stosować opis słowny np. "Drukuj x na ekran"). Figura ta ma dokładnie jedną strzałkę wchodzącą i jedną wychodzącą.
Ta figura symbolizuje proces, który został już kiedyś zdefiniowany. Można ją porównać do procedury, którą definiuje się raz w programie, by następnie móc ją wielokrotnie wywoływać. Warunkiem użycia jest więc wcześniejsze zdefiniowanie procesu. Podobnie jak w przypadku zwykłego procesu i tu mamy jedno wejście i jedno wyjście.
Koło symbolizuje tzw. łącznik stronicowy. Może się zdarzyć, że chcemy "przeskoczyć" z jednego miejsca na kartce na inne (np. by nie krzyżować strzałek). Możemy w takim wypadku posłużyć się łącznikiem. Umieszczamy w jednym miejscu łącznik z określonym symbolem w środku (np. cyfrą, literą) i doprowadzamy do nie go strzałkę. Następnie w innym miejscu kartki umieszczamy drugi łącznik z takim samym symbolem w środku i wyprowadzamy z niego strzałkę. Łącznik jest często porównywany do teleportacji (z jednego miejsca na kartce do drugiego). Łączniki występują więc w parach, jeden ma tylko wejście a drugi wyjście.
Ten symbol to łącznik międzystronicowy. Działa analogicznie jak pierwszy, lecz nie w obrębie strony. Przydatne w złożonych algorytmach, które nie mieszczą się na jednej kartce. Uwaga: jeśli stosujemy oba typy łączników w schemacie, to najlepiej jest stosować liczby do identyfikowania jednych i litery do drugich. Dzięki temu nie dojdzie do pomyłki.
Teraz opiszemy przykładowy algorytm za pomocą schematu blokowego. Zdefiniujmy iteracyjną wersję silni. Dla przypomnienia: rekurencyjna definicja silni wygląda następująco
silnia(0)=1
silnia(n)=n*silnia(n-1)
Etapy rozwiązywania problemów:
Sformułowanie zadania
Określenie danych wejściowych
Określenie celu, czyli wyniku
Poszukiwanie metody rozwiązania, czyli algorytmu
Przedstawienie algorytmu w postaci:
opisu słownego
listy kroków
schematu blokowego
jednego z języków programowania
Analiza poprawności rozwiązania
Testowanie rozwiązania dla różnych danych - ocena efektywności przyjętej metody
Zasady budowania schematu blokowego:
Każda operacja jest umieszczona w skrzynce
Schemat ma tylko jedną skrzynkę "Start" i przynajmniej jedną skrzynkę "Stop"
Skrzynki są ze sobą połączone
Ze skrzynki wychodzi jedno połączenie; wyjątek stanowią skrzynki "Stop" (z której nie wychodzą już żadne połączenia) oraz "warunkowa" (z której wychodzą dwa połączenia opisane Tak i Nie - w zależności od tego czy warunek jest spełniony czy też nie; można wyjść jedną z dwóch dróg).
1. Zbuduj algorytm, za pomocą, którego można obliczyć drugą i trzecią potęgę danej liczby.
BUDOWA ALGORYTMU: START - podaj liczbę a, - oblicz kwadrat liczby a, - oblicz sześcian liczby a, - podaj wartość kwadratu liczby a, - podaj sześcian liczby a. STOP |
|
Ćwiczenie 2 Przestaw schemat blokowy algorytmu obliczania wartości bezwzględnej.
Wartością bezwzględną liczby nieujemnej jest ta sama liczba, a wartością bezwzględną liczby ujemnej jest liczba do niej przeciwna.
Ćwiczenie 3
Wprowadź dwie liczby a i b. Przedstaw w postaci ciągu kroków i graficznie algorytm porównania tych liczb i wyprowadzania na wyjściu większej z nich. W przypadku liczb równych wyprowadź napis "liczby równe".
Na czym polega iteracja, czyli działanie w pętli ?
Czasami trzeba wykonać te same operacje na wielu liczbach. W takich przypadkach nie jest konieczne wielokrotne opisywanie działań lub rysowanie takich samych skrzynek. Stosujemy wówczas iterację. Mówimy także, że działania te wykonywane są w pętli. Liczba powtórzeń tych działań może być z góry określona lub zależeć od spełnienia warunku. Iteracja to najczęściej spotykana technika algorytmiczna.
Iteracja to technika algorytmiczna polegająca na wykonaniu tej samej instrukcji dla n zmiennych.
Iteracja oszczędza czas programisty, który ten musiałby spędzić wpisując instrukcję n razy, zależnie od liczby zmiennych. Liczba powtórzeń w iteracji jest zwykle z góry określona lub zależy od spełnienia określonego warunku.
Ćwiczenie 4
Przeanalizuj schemat i odpowiedz na pytania:
Jakie są dane wejściowe do zadania i jakich użyto zmiennych pomocniczych?
Jaki cel chcesz osiągnąć (wynik)?
Jaki algorytm zastosowano w operacji dodawania liczb ?
W którym miejscu wykonywane są działania w pętli ?
Które operacje powtarzają się wielokrotnie ?
Co określa liczbę powtórzeń ?
Kiedy kończy się działanie w pętli ?
W analizowanym algorytmie występuje przypisanie typu s:=s + l. Nie jest to równość w rozumieniu matematyki, ale przypisanie zmiennej "s" (sumie) poprzedniej wartości pamiętanej w zmiennej "s" (poprzedniej sumie) zwiększonej o wartość pamiętaną w zmiennej "l" (kolejną liczbę) - w ten sposób powtarzanie operacji przypisania, realizowane jest dodawanie kolejnych liczb naturalnych.
Przypisania l:=l-1 ma tu bardzo istotne znaczenie. Jest to tzw. licznik, w którym następuje obliczanie, ile zostało jeszcze powtórzeń do wykonania. W tym algorytmie liczba powtórzeń została określona na początku instrukcją l:=n.
Gdyby nie umieszczono tego działania nastąpiło by tzw. zapętlenie algorytmu, czyli po sprawdzeniu warunku l>0 działanie w schemacie przebiegałoby zawsze drogą TAK. W realizacji algorytmów iteracyjnych ważne jest prawidłowe określenie sposobu zakończenia działań. Można to zrobić za pomocą licznika, który odlicza kolejne kroki iteracji (liczbę powtórzeń).
Ćwiczenie 1
Opracuj algorytm obliczający sumę 3 wprowadzonych z klawiatury liczb.
Przedstawmy najpierw algorytm w postaci ciągu kroków do wykonania:
Podaj pierwszą liczbę
Podaj drugą liczbę
Podaj trzecią liczbę
Dodaj do siebie liczby i wynik zapamiętaj
Wypisz otrzymany wynik
Ćwiczenie 2
Dane są dwie liczby. Opracuj algorytm wybierający większą z nich, w przypadku gdy są równe wypisz stosowny komunikat.
Ćwiczenie 3
Zbuduj algorytm obliczający sumę 5 kolejnych liczb naturalnych.
Ćwiczenie 5
Narysuj algorytm sumujący liczby większe od 5 spośród 10 wprowadzonych.
Ćwiczenie 1
Opracuj algorytm obliczający kwadrat i sześcian wprowadzonej liczby.
Ćwiczenie 2
Opracuj schemat obliczania średniej n liczb naturalnych.
3