Strona główna

Logo podręcznik, cz. 1 Gimnazjum nr 26 w Gdańsku I. Podstawowe polecenia


Pobieranie 81.88 Kb.
Data17.06.2016
Rozmiar81.88 Kb.

LOGO – podręcznik, cz. 1 Gimnazjum nr 26 w Gdańsku




I. Podstawowe polecenia.

LOGO wykonuje polecenia wydawane w wierszu poleceń przez użytkownika. Niektóre z poleceń są zawarte w wersji instalacyjnej programu (polecenia pierwotne), inne muszą być zdefiniowane przez użytkownika.


Podstawowe polecenia pierwotne:
Skrót

POKAŻŻÓŁWIA pż

SCHOWAJŻÓŁWIA sż

NAPRZÓD liczba np liczba

WSTECZ liczba ws liczba

PRAWO liczba pw liczba

LEWO liczba lw liczba

PODNIEŚ pod

OPUŚĆ opu

ŚCIERANIE ścier

CZYŚĆ cs

Polecenia wykonywane są po ich wpisaniu w wierszu poleceń i naciśnięciu klawisza ENTER. Polecenia możemy zatwierdzać pojedynczo lub też możemy wpisać kilka poleceń w jednym wierszu i je wszystkie jednocześnie zatwierdzić.


Niektóre z poleceń są bezparametrowe, tzn. wykonywane są bez podawania dodatkowych danych. Są też takie polecenia, które wymagają danych. Na przykład polecenie PRAWO wymaga podania liczby będącej kątem obrotu żółwia. Parametry (dane) podajemy po nazwie polecenia, oddzielając je od polecenia spacją. Jeśli zatwierdzimy polecenie bez podania danych, LOGO wyświetli okno umożliwiające wpisanie lub wybór danych.
Z pomocą podstawowych poleceń pierwotnych można narysować proste figury, np. linię przerywaną:
np 100 pod np 50 opu np 100 pod np 50 opu np 100 pod np 50 opu

100

50

100

50

100

50

albo schody:


np 50 pw 90 np 80 lw 90 np 50 pw 90 np 80 lw 90 np 50 pw 90 np 80 lw 90

80



50

Wykonane rysunki można zapisać na dysku poleceniem poprzez menu programu Strona Zapisz tło...


Więcej o LOGO dowiesz się z jego pomocy, Pomoc Tematy pomocy (F1).
Ćwiczenia:

  1. „Pobaw się” nieco podstawowymi poleceniami. Narysuj, co chcesz (lub co Ci wyjdzie  ).

  2. Narysuj choinkę.


II. Wykonywanie obliczeń.
LOGO umożliwia wykonywanie obliczeń. Potrzebne to jest w wielu programach tworzonych w LOGO przez użytkownika, ale może także być wykorzystane jako podręczny kalkulator.
Jeśli chcemy wyświetlić wynik obliczeń na ekranie należy wykorzystać polecenie PISZ (ps). Inaczej otrzymamy komunikat programu: Nie wiem co zrobić z [wynik_obliczeń].
LOGO używa powszechnie stosowanego priorytetu (kolejności) podstawowych działań arytmetycznych. Jak w matematyce, można tę kolejność zmienić używając nawiasów (tylko okrągłych!), np.
pisz 3+4*5 pisz (3+4)*5

23 35
LOGO zawiera listę kilkunastu funkcji matematycznych, np. PWK (pierwiastek kwadratowy), SIN (sinus).


UWAGA!

Czasem ważna jest kolejność argumentów. Inne wyniki otrzymamy, pisząc:


pisz pwk 5 + 3 albo pisz (pwk 5) + 3

2,83 5,24


Wyniki obliczeń mogą być argumentami poleceń, tzn. argumentami nie muszą być pojedyncze liczby, argumentem może być liczba będąca wynikiem obliczeń podanych wyrażeń, np. polecenie np 20 * 3 da taki sam rezultat jak polecenie np 60. Najpierw zostanie wykonane obliczenie wartości wyrażenia 20 * 3, a następnie wynik tego obliczenia (60) zostanie wstawiony jako argument polecenia np.
Ćwiczenia:

  1. Oblicz i wyświetl wynik wyrażenia: 47 + 23 : 7 – 5
    Zapisz powyższe polecenia

    …………………………………………………………………..



  2. Oblicz i wyświetl wynik wyrażenia:
    Zapisz powyższe polecenia

    …………………………………………………………………..




III. Polecenie POWTÓRZ, stosowanie kolorów
Czasem zdarza się, że wykonywane przez nas operacje powtarzają się. Widać to było choćby przy rysowaniu linii przerywanej czy schodów. Polecenie POWTÓRZ umożliwia krótsze definiowanie operacji do wykonania.
powtórz n [lista poleceń]

gdzie:


n – liczba powtórzeń,

lista poleceń – polecenia do wykonania.
Zapis poleceń potrzebnych do narysowania linii przerywanej z użyciem polecenia powtórz wygląda następująco:
powtórz 3 [np 100 pod np 50 opu]
Polecenie POWTÓRZ doskonale nadaje się do rysowania wielokątów foremnych, np. żeby narysować kwadrat należy wykonać polecenie:

70

powtórz 4 [np 70 pw 90]


90o


72o



85


Dla pięciokąta miałoby ono postać, np.:
powtórz 5 [np 85 pw 72]

Kierunek obrotu (prawo, lewo) nie ma znaczenia przy rysowaniu tych prostych figur. Zauważ, że nie musimy sami kłopotać się z liczeniem kąta obrotu, może to za nas zrobić LOGO. Wystarczy zamiast konkretnej liczby podać wyrażenie ją obliczające, np. w przypadku pięciokąta 360 / 5. Dlaczego 360 / 5 ? Spróbuj to uzasadnić.


Ćwiczenia:

  1. Napisz polecenie POWTÓRZ, które wykona rysunek schodów.

  2. Napisz polecenie POWTÓRZ, które wykona rysunek:

    1. trójkąta równobocznego,

    2. siedmiokąta foremnego.



Kolory w LOGO
Do wykonywania kolorowych rysunków najczęściej stosowane są procedury:

ustalKolPis (ukp) kolor – parametr kolor to liczby od 0 (czarny) do 15 (biały) lub słowa określające kolor

ustalGrubość (ugp) grubość – parametr grubość to szerokość pisaka (domyślnie 1)

ustalKolMal (ukm) kolor – parametr kolor to liczby od 0 (czarny) do 15 (biały) lub słowa określające kolor

ustalWzórMal (uwm) wzór – parametr wzór to numer wzoru (kreskowania tła), od 0 do 7

zamaluj – polecenie bez parametru, wypełnia obszar aktualnym kolorem i wzorem.

Ćwiczenie

Poeksperymentuj ze zmianami koloru i grubości pisaka żółwia. Narysuj kilka linii, kilka różnych wielokątów.

Aby zamalować wnętrze figury poleceniem zamaluj pisak żółwia musi znajdować się wewnątrz tej figury. Kolejność działań powinna być następująca (ustalenie parametrów malowania należy wykonać przed wywołaniem polecenia zamaluj):

- narysowanie figury,

- podniesienie pisaka,

- przemieszczenie pisaka do wnętrza figury,

- wykonanie polecenia zamaluj,

- przemieszczenie pisaka do poprzedniej pozycji,

- opuszczenie pisaka.
Oto procedura umożliwiająca rysowanie zamalowanego kwadratu w kolorze podanym przez użytkownika:
oto kwadrat_zamalowany :bok :kolor

kwadrat :bok

pod pw 45 np 10

ukm :kolor

zamaluj

ukm 0

ws 10 lw 45 opu

już
Poleceniem ukm :kolor ustalany jest kolor malowania (zmienna kolor to liczba podana przez użytkownika), następnie wnętrze kwadratu wypełniane jest kolorem malowania (rzecz jasna, przedtem pisak żółwia został przemieszczony do wnętrza kwadratu), na koniec następuje powrót do standardowego koloru malowania (czarnego, numer 0).
Czasem chcemy rysować figury w różnych, dowolnych kolorach. Pomocna w tym może być funkcja: losowa liczba. Wynikiem tej funkcji jest liczba należąca do zbioru liczb od 0 do n-1.

Przykłady:

losowa 16 – wynikiem jest liczba z zakresu 0-15,

(losowa 3) + 5 – wynikiem jest liczba z zakresu 5-7,

ugp 1 + losowa 10 – wynikiem jest grubość pisaka z zakresu 1-10.

Ćwiczenia:


  1. Napisz procedurę sześciokąt_zamalowany rysującą sześciokąt foremny zamalowany kolorem zielonym.

  2. Napisz procedurę okrąg_kolorowy rysującą różne okręgi. Zastosuj funkcję losowa do wyboru grubości, koloru, koloru malowania i wzoru malowania pisaka.

  3. Napisz procedurę prostokąt_zamalowany :kolor1 :kolor2 ry-sującą prostokąt o kolorowych bokach i wnętrzu.

  4. Napisz procedurę kwadraty_kolorowe rysującą współśrodkowe kwadraty, każdy z innym kolorem boków i wypełnienia.


IV. Zmienne.
Zmienna to para – nazwa i wartość. Jest to rodzaj pojemnika do przechowywania określonych wartości lub też nazwy, za pomocą którego możemy się odwołać do pewnych wartości. Aktualna wartość zmiennej przechowywana jest w pamięci operacyjnej komputera.
Kiedy stosujemy nazwę zmiennej to poprzedzamy ją znakiem " (pojedynczy cudzysłów), a kiedy stosujemy jej wartość (mówimy też – odwołujemy się do zmiennej) poprzedzamy ją znakiem : (dwukropek), np.

"a – nazwa zmiennej a

:a – wartość zmiennej a
Do nadawania wartości zmiennym służą ich deklaracje w procedurach (o tym w dalszej części podręcznika) oraz polecenie PRZYPISZ (przyp).
PRZYPISZ "nazwa_zmiennej wartość (słowo, liczba, lista)
np.

przypisz "kh misiu

przypisz "x 13

przypisz "szkoła [Gimnazjum nr 26]


Poleceniem przypisz można nadać nową wartość dotychczasowej zmiennej (zmienić jej wartość dotychczasową na inną), np.:
przypisz "a :a+4
Powyższy zapis oznacza: do wartości zmiennej a dodaj liczbę 4, i wynikiem tej sumy zastąp dotychczasową wartość zmiennej a (również pod nazwą a).
W poleceniu przypisz można stosować różne zmienne i wyrażenia, np.:
przypisz "x 3 * :y - 15

przypisz "długość :bok + :odstęp


Polecenie przypisz wraz z poleceniem powtórz umożliwiają tworzenie różnych kompozycji graficznych.
Przykłady



przyp "dł 10

powtórz 5 [np :dł pod np :dł opu przyp "dł :dł + 20]






przyp "n 5

przyp "bok 20

powtórz :n [powtórz 4 [np :bok pw 90] przyp "bok :bok + 20]

Ćwiczenia:


  1. Jaka będzie wartość zmiennej 2d po wykonaniu poleceń:

przyp "x 7

przyp "2d :x * :x

odp. ……


  1. W trakcie działania programu komputerowego zmienne mogą przyjmować różne wartości np. w zależności od danych wejściowych. Aby dokonać w programie zamiany aktualnych (nie znanych nam) wartości dwóch zmiennych a i b stosujemy trzecią zmienną (pomocniczą) c. Napisz polecenia, które wykonają zamianę wartości zmiennych a i b.


V. Procedury bez parametrów i z paramet-rami.
Polecenia w LOGO dzielimy na dwie części – właśnie polecenia i funkcje.
Polecenie to działanie, które wykonuje jakąś czynność i powoduje określony skutek. Na przykład poleceniami są: np 100 (narysowanie odcinka o długości 100) lub pisz 2 + 3 (wyświetlenie liczby 5).
Funkcja to element języka LOGO, który wykonuje działania na wyrażeniach i zapamiętuje ich wynik. Ten wynik jest później używany jako argument innych poleceń lub funkcji. Na przykład funkcją jest SIN (sinus). Wynikiem sin 30 jest liczba 0,5. Wywołanie jedynie wyrażenia sin 30 spowoduje błąd i wyświetlenie komunikatu: Nie wiem co zrobić z 0,5. Funkcję sin 30 możemy wykorzystać np. wyświetlając jej wynik:
pisz sin 30

0,5
lub stosując ją (ściślej: jej wynik) w innych wyrażeniach, np. pwk sin 30 (oczywiście, wywołanie jedynie tego polecenia też spowoduje błąd i wyświetlenie komunikatu o nim; błędu nie będzie, jeśli zastosujemy np. wyrażenie: np 250 * sin 30, żółw narysuje odcinek o długości 125).


Polecenia i funkcje pierwotne języka LOGO to jedynie część jego możliwości. LOGO umożliwia użytkownikowi tworzenie własnych poleceń, czyli procedur. Dzięki temu łatwiejsze jest tworzenie bardziej skomplikowanych programów.


Definiowanie własnych procedur

Definicja własnej procedury wygląda następująco:


OTO nazwa_polecenia argumenty

treść procedury

JUŻ
Argumenty (dane) nie są składnikiem koniecznym, mogą wystąpić lub nie.
Przykłady procedur:

bez argumentu z argumentem

oto kwadrat oto kwadrat :bok

powtórz 4 [np 100 pw 90] powtórz 4 [np :bok pw 90]

już już
Własne procedury wywołujemy podając ich nazwę i ewentualne argumenty. Jeśli definicja procedury zawiera argumenty, a my ich nie podamy, LOGO wyświetli okno, w którym należało będzie wpisać wartości argumentów. W pierwszym podanym wyżej przypadku (procedura bez argumentu) narysowany zostanie kwadrat o boku 100. Drugi przypadek (procedura z argumentem) umożliwia wywoływanie procedury z różnymi wartościami argumentu "bok i rysowanie kwadratu o długości boku podanej przez użytkownika jako argument.


Przykład procedury z dwoma argumentami:


o
b


to prostokąt :a :b

powtórz 2 [np :b pw 90 np :a pw 90]

j
a

Często stosowaną czynnością jest przenoszenie żółwia z jednego położenia w drugie bez rysowania linii. To zadanie można łatwo wykonać definiując odpowiednią procedurę. Oto przykładowa realizacja:


y


oto przenieś :x :y

pod pw 90 np :x lw 90 np :y opu

j
x

Przyjrzyjmy się procedurze rysującej wielokąt foremny:


oto wielokąt_for :bok :ile

powtórz :ile [np :bok pw 360/:ile]

już
Działanie 360/:ile wykonywane jest tyle razy, ile wynosi parametr :ile, czyli np. 4, 7, 150. Wynik tego działania jest za każdym razem taki sam. Można usprawnić działanie procedury przez zastosowanie zmiennej, która zawierać będzie wynik tego działania.
Zastosujemy zmienną obrót w poprzedniej procedurze nadając jej wartość będącą wynikiem dzielenia kąta pełnego przez ilość boków, czyli stosując polecenie: przypisz "obrót 360/:ile
oto wielokąt_for :bok :ile

przypisz "obrót 360/:ile

powtórz :ile [np :bok pw :obrót]

już
Teraz dzielenie 360/:ile wykonywane jest tylko raz, na początku procedury. Wynik tego dzielenia umieszczany jest w pamięci operacyjnej pod nazwą zmiennej obrót. Od tej pory można zmienną obrót wykorzystywać w procedurze wywołując jej wartość wyrażeniem :obrót (poprzedzając nazwę zmiennej dwukropkiem, bez odstępu).




Ciąg kwadratów


oto kwadraty :bok :ile

powtórz :ile [kwadrat :bok przyp "bok :bok + 20]

już
Rysowanie kwadratu powtarzane jest :ile razy; pierwszy kwadrat ma długość boku :bok; po narysowaniu pierwszego kwadratu zmiennej bok nadawana jest nowa wartość zwiększona o 20 w porównaniu z poprzednią jej wartością).

Ćwiczenia:


  1. Napisz procedurę ośmiokąt (bez argumentów) rysującą ośmiokąt foremny o długości boku 75.

  2. Napisz procedurę ośmiokąt (z argumentem "bok) rysującą ośmiokąt o długości boku podanej przez użytkownika.

  3. Napisz procedurę wielokąt_for1 (z argumentami "ile i "bok) rysującą wielokąt foremny o ilości boków i o długości boku podanych przez użytkownika.

  4. Napisz procedurę wielokąt_for2 (z argumentami "ile i "obwód) rysującą wielokąt foremny o ilości boków i o obwodzie podanych przez użytkownika.

  5. N
    apisz procedurę ciąg :bok rysującą ciąg trzech kwadratów. Największy kwadrat ma długość boku :bok, następne mają boki o 30 mniejsze. Możesz wykorzystać procedurę przenieś.





  6. Napisz procedurę rysującą spiralę przedstawioną na rysunku. Pierwszy (zewnętrzny) odcinek spirali ma długość 150, każdy następny jest o 5 krótszy.



VI. Krzywe i wielokąt.
Rysowanie okręgu wykonuje polecenie: okrąg :liczba

Środek okręgu znajduje się w aktualnym położeniu żółwia, a parametr :liczba określa średnicę okręgu.


Rysowanie elipsy wykonuje polecenie: elipsa [liczba1 liczba 2]




Środek elipsy znajduje się w aktualnym położeniu żółwia, a parametry liczba1 i liczba2 określają odpowiednio długość wielkiej i małej osi elipsy.
Jeśli polecenie elipsa ma postać elipsa [liczba1 liczba2 k1 k2] to jej wynikiem jest fragment elipsy (łuk) od kąta k1 do kąta k2,
np. elipsa [200 100 45 270]







Polecenia koło i owal wykonują podobne działania jak okrąg i elipsa, z tym że wypełniają rysowaną figurę aktualnym kolorem malowania.


Polecenie wielokąt kod rysunku wykonuje rysunek wielokąta zawarty w poleceniach listy kod rysunku i wypełnia jego wnętrze aktualnym kolorem malowania. Możliwa jest chwilowa zmiana parametrów pisaka i koloru malowania, jeśli dane te podamy na początku listy kod rysunku, np.

wielokąt [ugp 3 ukm "czerwony powtórz 5 [np 100 pw 72]]


Ćwiczenia:

  1. Napisz procedurę półokrąg :d rysującą półokrąg o średnicy d.



  2. Napisz procedurę pawie_oczko rysującą figurę przedstawioną na rysunku. Argumentami procedury są: promień najmniejszego okręgu i ilość okręgów. Kolejne okręgi mają promienie o 20 dłuższe od poprzednich.



  3. Napisz procedurę pawie_oczko_1, która w porównaniu z procedurą poprzednią zawierać będzie także argument określający przyrost promienia kolejnych okręgów.



  4. Napisz procedurę fala :d rysującą figurę przedstawioną na rysunku (wykorzystaj procedury półokrąg i przenieś).



  5. Używając polecenia wielokąt napisz polecenie rysujące ośmiokąt foremny o bokach grubości 5 w kolorze zielonym i o wnętrzu w kolorze żółtym.


VII. Programowanie w LOGO

Program komputerowy to zbiór procedur, z których jedne wywołują inne. Stosowaliśmy już takie działanie, np. wywołanie procedury przenieś przez inną procedurę.


Teraz zastosujemy programowanie do wykonania złożonego zadania. Będzie to rysunek ula.

W programowaniu stosuje się dwie metody: wstępującą (od szczegółu do ogółu) oraz zstępującą (od ogółu do szczegółu). Tu wykorzystamy drugą metodę – najpierw podzielimy rysunek na części go tworzące, a następnie zdefiniujemy coraz to mniejsze składniki tych części.


Zaczniemy od nazwania części rysunku i te same nazwy nadamy procedurom je tworzącym (np. rysowanie dachu wykonywać będzie procedura dach). Główną procedurą programu będzie procedura ul. Przyjmiemy też zasadę, że po wykonaniu danej procedury żółw wracać będzie do pozycji początkowej (za taką przyjmiemy lewy dolny wierzchołek ściany ula).
oto ul

ściana


dach

nogi


okienko

już
Ściana ula jest prostokątem o wymiarach 120x150. Procedura ściana zawiera wywołanie procedury prostokąt z parametrami będącymi bokami prostokąta.


oto ściana

prostokąt 120 150

już
Żeby ściana została narysowana należy zdefiniować procedurę prostokąt :a :b. a i b to odpowiednio długość i szerokość prostokąta.
oto prostokąt :a :b

powtórz 2 [np :b pw 90 np :a pw 90]

już
Podobne działanie jak przy definiowaniu procedur rysujących ścianę zastosujemy przy definiowaniu pozostałych elementów składowych ula.
oto dach

przenieś 0 150

pw 30

trójkąt 120



lw 30

przenieś 0 -150

już
W procedurze dach występuje wywołanie dwóch procedur: trójkąt i przenieś. Należy podać ich definicje.
oto trójkąt :bok

powtórz 3 [np :bok pw 120]

już
oto przenieś :x :y

pod pw 90 np :x

lw 90 np :y opu

już
Definicje kolejnych procedur nogi i okienko korzystają z procedur już wcześniej zdefiniowanych.


oto nogi

prostokąt 30 -20

przenieś 90 0

prostokąt 30 -20

przenieś –90 0

już
oto okienko

przenieś 40 50

prostokąt 40 10

przenieś –40 –50

już
Definiowanie wszystkich elementów składowych rysunku ula zostało zakończone. Teraz wywołanie głównej procedury ul spowoduje narysowanie ula na ekranie.


Ćwiczenia:

  1. Zmodyfikuj procedurę ul, tak aby rysunek ula pojawiał się na środku ekranu.

  2. Napisz program ul_w_skali :a, który rysować będzie ule różnej wielkości. Parametr a jest liczbą, która oznacza skalę, np. program ul_w_skali 1 powinien narysować ul o podanych w tym zadaniu wymiarach, a program ul_w_skali 0,5 powinien narysować ul o wymiarach dwukrotnie mniejszych.


VIII. Projekt - mur

Zadanie

Napisz program, który wykona rysunek muru przedstawionego poniżej.



Inaczej niż w programowaniu rysunku ula, w tym zadaniu zastosujemy metodę wstępującą programowania (od szczegółu do ogółu). Zaczniemy od definicji pojedynczej cegły, potem zdefiniujemy jedną warstwę cegieł, na koniec zdefiniujemy główną procedurę rysującą cały mur.


Definicja cegły jest prosta. W zadaniu przyjmujemy, że szerokość cegły jest 2 razy mniejsza od jej długości.
o
a/2
to cegła :a


a
powtórz 2 [np :a / 2 pw 90 np :a pw 90]

już
Procedura warstwa ma dwa parametry. dc określa wymiary cegły, n ilośc cegieł w warstwie. Procedura ta wykorzystuje procedurę przenieś. Zdefiniuj ją samodzielnie.

Procedura warstwa działa następująco: po narysowaniu każdej z cegieł żółw przenoszony jest poziomo o długość cegły i rysowana jest kolejna cegła. Po zakończeniu rysowania wszystkich cegieł żółw przenoszony jest na „górny środek” pierwszej cegły. Dzięki temu gotowy jest do rysowania kolejnej warstwy cegieł.


o
dc
to warstwa :n :dc

powtórz :n [cegła :dc przenieś :dc 0]


n
przenieś - :dc * ( :n - 0,5 ) :dc / 2

już
Główna procedura mur ma dwa parametry. dł_cegły określa wymiary jednej cegły, ilość_warstw określa ilość warstw w murze. Procedura przenieś tak ustawia żółwia, by rysunek muru znalazł się na środku ekranu. Zasadnicza część programu wykonywana jest w poleceniu powtórz. Każde powtórzenie to rysowanie kolejnej warstwy cegieł, za każdym razem o 1 cegłę mniej. To zmniejszanie ilości cegieł odbywa się dzięki zastosowaniu dodatkowej zmiennej ilość_cegieł. Przed rozpoczęciem powtarzania rysowania kolejnych warstw, zmiennej ilość_cegieł nadawana jest wartość zmiennej ilość_warstw. W trakcie działania polecenia powtórz zmienna ilość_cegieł zmniejszana jest o 1.
oto mur :ilość_warstw :dł_cegły

przenieś - :ilość_warstw * :dł_cegły / 2 (- :ilość_warstw * :dł_cegły / 4)

przyp "ilość_cegieł :ilość_warstw

powtórz :ilość_warstw [warstwa :ilość_cegieł :dł_cegły przyp ~ "ilość_cegieł :ilość_cegieł - 1]

już
IX. Projekt - wiatrak


oto kwadrat :bok

powtórz 4 [np :bok pw 90]

już
oto przenieś :x :y

pod pw 90 np :x lw 90 np :y opu

już
oto kwadrat_zamal :a

kwadrat :a

przenieś :a/2 :a/2

ukm losowa 16

zamaluj


ukm 0 wiatrak 100 30 10

przenieś -:a/2 (-:a/2)

już
Inny sposób wykonania zamalowanego kwadratu polega na wykorzystaniu polecenia wielokąt:
oto kwadrat_zamal :a

przypisz "k losowa 16

wielokąt [ukm :k powtórz 4 [np :a pw 90]]

już


Tworzymy procedurę rysującą jedną gałąź wiatraka:
oto gałąź :dł :b

np :dł lw 45

kwadrat_zamal :b

pw 45 ws :dł

już
Główna procedura programu może wyglądać następująco:
oto wiatrak :dł_g :c :ile

powtórz :ile [gałąź :dł_g :c pw 360 / :ile]

już
Wiatrak z dwoma kolorami kwadratów występującymi naprzemiennie:
oto wiatrak_2kol :dł_g :c :ile

powtórz :ile [jeżeli reszta npw 2 = 0 [gałąź1 :dł_g :c][ gałąź2 :dł_g :c] pw 360/:ile]

już

Procedury gałąź1 i gałąź2 powinny zawierać wywołania procedur kwadrat_zamal1 i kwadrat_zamal2.



Procedury kwadrat_zamal1 i kwadrat_zamal2 powinny rysować kwadrat w ustalonym w ich wnętrzu kolorze. Zamiast funkcji losowa należy zastosować numer lub nazwę koloru, np. ukm "zielony.

Ćwiczenie:

Napisz programy rysujące wiatraki, które na końcu gałęzi mieć będą:



  1. trójkąty równoboczne

  2. koła

w losowych kolorach.

X. Procedury rekurencyjne

Często w programowaniu występuje wielokrotne wykonywanie grypy jednakowych poleceń. Taką czynność nazywamy pętlą poleceń. Poznałeś już jedną z pętli – polecenie powtórz. Innymi przykładami pętli są np. dla, dopóki. Niektóre z tych pętli mają skończoną ilość powtórzeń (powtórz, dla), ilość powtórzeń innych trudno przewidzieć – ilość ta zależy od parametrów początkowych i zmian dokonywanych w pętli (dopóki).


Ciekawą formą pętli jest rekurencja, działanie polegające na tym, że w treści procedury następuje wywołanie tej właśnie procedury, ale już z innymi parametrami.

Takie „samo się” wywoływanie powoduje, że procedura działałaby w nieskończoność, wciąż i wciąż siebie wywołując (ewentualny koniec działania mógłby nastąpić np. w wyniku błędów – przekroczenia zakresu wartości zmiennych, przepełnienia pamięci komputera).

Sposobem na uniknięcie „zapętlenia” jest stosowanie warunków zatrzymania działania procedury rekurencyjnej. Do tego celu wykorzystuje się polecenia jeśli i stop:

Można stosować krótszą wersję polecenia jeśli:



JEŚLI warunek_logiczny [lista poleceń do wykonania jeśli warunek_logiczny jest prawdą]
W tym przypadku polecenia zawarte w liście poleceń zostaną wykonane jeśli warunek_logiczny jest prawdziwy. W przeciwnym razie wykonywane są polecenia następujące za poleceniem jeśli.
Polecenie stop kończy działanie danej procedury i przekazuje dalsze działanie procedurze nadrzędnej (o ile taka istnieje).
W temacie o okręgach jedno z ćwiczeń dotyczyło rysowania tzw. pawiego oka. Jednym z parametrów procedury wykonującej rysunek była liczba określająca ilość okręgów wchodzących w skład rysunku.

Obecnie napiszemy procedurę rekurencyjną wykonującą to samo zadanie. Jej zaletą będzie to, że ilość okręgów nie będzie z góry zadana, ilość ta zależeć będzie od treści procedury.

Oto i treść nowej procedury (zakładamy, że okręgi o promieniu mniejszym lub równym 10 nie powinny być rysowane oraz, że kolejne okręgi oka będą miały promienie równe ¾ promienia okręgu poprzedniego; parametr r określa promień największego okręgu i jest podawany przez użytkownika):
oto pawie_oko :r

jeśli :r <= 10 [stop]

przenieś :r 0

okrąg 2*:r

przenieś -:r 0

przyp "r :r * 0.75

pawie_oko :r

już
Procedura pawie_oko_rek za każdym razem na początku sprawdza czy promień okręgu nie jest mniejszy lub równy 10. Jeśli warunek :r <= 10 jest prawdą, procedura jest zatrzymywana poleceniem stop. Jeśli dany warunek nie jest prawdą (jest fałszem), następuje wykonywanie kolejnych poleceń procedury. Rysowany jest okrąg o aktualnej wartości zmiennej r (za pierwszym razem r ma wartość podaną przez użytkownika). Kolejne polecenie powoduje zmianę wartości zmiennej r. Dalej następuje sedno procedury rekurencyjnej – procedura pawie_oko_rek wywołuje procedurę pawie_oko_rek, czyli wywołuje samą siebie. Jednak to wywołanie różni się od poprzedniego tym, że parametr r ma już nową mniejszą wartość.

Procedura pawie_oko_rek działa „na okrągło” – porównuje wartość promienia z 10, rysuje okrąg o aktualnej wartości promienia, zmienia wartość promienia, itd. do mementu, aż wartość promienia osiągnie liczbę 10 lub mniejszą. Wtedy działanie procedury (rysowanie kolejnych, coraz to mniejszych okręgów) jest przerywane poleceniem stop.
Uwaga

Można nieco skrócić zapis powyższej procedury. Zamiast w poleceniu przypisania, obliczenie nowej wartości promienia może być wykonane wraz z rekurencyjnym wywołaniem procedury, czyli można zastosować zapis



pawie_oko_rek :r * 0.75

Napiszemy teraz procedurę łuki, która narysuje figurę złożoną z półokręgów.



Na początek zdefiniujemy procedurę półokrąg :r,
oto półokrąg :r

przypisz "śr 2*:r

elipsa [:śr :śr 270 90]

już


a następnie procedurę łuki :w (w to promień największego półokręgu):
oto łuki :w

jeśli :w < 20 [stop]

półokrąg :w

przenieś :w + 0.75*:w 0

łuki :w * 0.75

już
Działanie tej procedury jest bardzo podobne do działania procedury pawie_oko_rek.


Ograniczeniem procedur rekurencyjnych jest to, że można w ich treści ustalać wartości początkowych zmiennych, nie można też wyświetlić jednego końcowego wyniku obliczeń. Problem ten rozwiązuje się poprzez stosowanie dodatkowej procedury. Właśnie w tej dodatkowej procedurze inicjujemy zmienne, wywołujemy procedurę rekurencyjną, a następnie wyświetlamy końcowy wynik.

Takie rozwiązanie zastosujemy w zadaniu obliczającym sumę kolejnych liczb naturalnych zawartych pomiędzy dwiema liczbami podanymi przez użytkownika.


Procedura rekurencyjna suma_rek :a :b wygląda następująco:
oto suma_rek :a :b

jeśli :a > :b [stop]

przypisz "suma :suma + :a

przypisz "a :a + 1

suma_rek :a :b

już
W procedurze tej występuje zmienna suma. W każdym kolejnym wywołaniu zmienna ta powiększana jest o wartość pierwszego parametru wywołania, czyli o liczbę a, zaś liczba a zwiększana jest o 1. Problemem jest to, że przed pierwszym wywołaniem tej procedury wartość zmiennej suma musi być ustalona na wartość 0. To ustalenie, a wywołanie procedury rekurencyjnej suma_rek oraz wypisanie końcowej wartości zmiennej suma wykona procedura dodatkowa suma_lnat :x :y.


oto suma_lnat :x :y

przypisz "suma 0

suma_rek :x :y

pisz :suma



już
Ćwiczenia:

  1. Napisz procedurę kwiat :r :ilość rysującą figurę złożoną z pawich oczu. r to promień największego z okręgów, ilość określa liczbę płatków kwiata.

  2. Napisz procedurę spirala :r :d rysującą spiralę złożoną z półokręgów. r to promień największego z półokręgów, d określa liczbę, o którą zmniejszany jest promień każdego z kolejnych półokręgów.

  3. Napisz procedurę kwadraty :a rysującą ciąg kwadratów. a to długość boku największego kwadratu. Wierzchołki kolejnego kwadratu leżą w połowie boków poprzedniego kwadratu.

  4. Napisz procedurę tarcza_kw :bok :d rysującą figurę podaną na rysunku. Bok to długość boku największego kwadratu, d określa liczbę, o którą zmniejszany jest bok każdego z kolejnych kwadratów (zastosuj procedurę rysującą kwadrat, którego środek jest w punkcie położenia żółwia.





- -


©snauka.pl 2016
wyślij wiadomość