t n e gm.pl a r f tek y w kar o rm.bez a D ww w
Copyright by Oficyna Wydawnicza Impuls, Kraków 2009 Projekt okładki: Ewa Beniak-Haremska ISBN 978-83-7850-323-1 978-83-7587-205-7 Oficyna Wydawnicza Impuls 30-619 Kraków, ul. Turniejowa 59/5 tel. (0-12) 422-41-80, fax (0-12) 422-59-47 www.impulsoficyna.com.pl, e-mail: impuls@impulsoficyna.com.pl Wydanie I, Kraków 2009
Spis treści Wprowadzenie 5 1. Grafika żółwia 7 1.1. Podstawowe procedury.................... 7 1.2. Instrukcje iteracyjne..................... 10 1.3. Definiowanie procedur.................... 11 1.4. Zastosowanie funkcji..................... 14 1.5. Kolorowanie.......................... 17 1.6. Grubość pisaka........................ 20 1.7. Styl kreślonej linii....................... 20 1.8. Styl zamalowywania powierzchni............... 21 1.9. Bezwzględne położenie żółwia................ 22 2. Programowanie strukturalne 23 2.1. Wprowadzenie......................... 23 2.2. Wirówki............................ 28 2.3. Przykłady........................... 32 3. Okręgi i łuki 39 3.1. Okręgi............................. 39 3.2. Półokręgi............................ 46 3.3. Łuki.............................. 53 3.4. Procedura standardowa ellipse............... 58 3.5. Przykłady........................... 60 4. Procedury rekurencyjne 63 4.1. Wprowadzenie......................... 63 4.2. Spirale............................. 64 4.3. Płatek Kocha......................... 66
4 SPIS TREŚCI 4.4. Trójkąt i dywan Sierpińskiego................ 69 4.5. Krzywa Peano......................... 72 4.6. Smok Hartera......................... 74 4.7. Krzywa Hilberta........................ 76 4.8. Drzewo binarne........................ 78 4.9. Drzewo Pitagorasa...................... 80 4.10. Paprotka........................... 89 4.11. Przykłady.......................... 94 5. Obliczenia w Logo 105 5.1. Wprowadzenie......................... 105 5.2. Funkcje............................ 108 5.3. Notacja polska......................... 109 5.4. Funkcje rekurencyjne..................... 112 6. Słowa i listy 117 6.1. Wprowadzenie......................... 117 6.2. Procedury pierwotne..................... 119 6.3. Przykłady........................... 125 Podsumowanie 140 Bibliografia 141
Wprowadzenie Język programowania Logo został opracowany przez Seymourta Paperta i jego współpracowników z Laboratorium Sztucznej Inteligencji w MIT (Massachussetts Institute of Technology), zainspirowanych pracami i działalnością francuskiego psychologa i pedagoga J.Piageta, który badał sposoby myślenia dzieci, w różnych etapach ich rozwoju i podejmował próby przyspieszenia tego rozwoju. Logo powstało na początku lat siedemdziesiątych, jako język edukacyjny, przeznaczony do pierwszych kontaktów z komputerem. Spełnia w dużym stopniu warunki stawiane nowoczesnym językom programowania. Jest łatwe oraz wygodne w użyciu, czytelne i nieobciążające zbędnymi szczegółami użytkownika przy rozwiązywaniu problemów z wykorzystaniem komputera. Mimo swojej prostoty i łatwości w posługiwaniu się nim, Logo jest językiem dość wszechstronnym, nie ograniczającym programisty do wąskiej klasy zastosowań. S.Papert charakteryzuje Logo jednym zdaniem: Logo nie ma progów i sufitów, jest łatwe do nauczenia się, ale równocześnie jest interesującym wyzwaniem dla wytrawnych programistów 1. Charakterystycznym elementem tego języka jest tzw. grafika żółwia, najbardziej widoczna w pierwszych kontaktach z Logo. Logo wykorzystuje grafikę do poglądowego, wręcz wciągającego do zabawy, uczenia podstawowych pojęć informatyki związanych z programowaniem strukturalnym, tworzeniem procedur, posługiwaniem się mechanizmem rekurencji, tworzeniem procedur niezmienniczych i prawidłowym konstruowaniem wymiany parametrów między poszczególnymi procedurami. Język Logo jest językiem proceduralnym i programowanie w nim polega na tworzeniu procedur rozwiązujących konkretne zadanie. Zwykle procedury te używają innych, te z kolei innych i w rzeczywistości może być to bardzo rozbudowana struktura. Wywołanie głównej procedury, to jakby wywołanie programu, ale można też wywołać każdą procedurę osobno, aby 1 A.Jeske, Logo w zadaniach, 1988
6 WPROWADZENIE na przykład sprawdzić jej poprawność. Tak więc w środowisku Logo mamy do dyspozycji pojedyncze procedury, które wiążemy w logiczną całość lub używamy ich samodzielnie w zależności od tego co chcemy osiągnąć. Praca z programem jest konwersacyjna, Logo jest językiem interpretowanym. Tok rozumowania przy programowaniu w Logo jest zgodny z naszym naturalnym sposobem myślenia - rozbijania problemu na mniejsze części, które dadzą się już łatwo rozwiązać i składania z tych części rozwiązania całości. Użytkownik łatwo może sam rozbudować Logo o nowe instrukcje (procedury) i dopasować je do rozwiązania określonego problemu. W przeciągu ponad 35 lat od opracowania angielskiej wersji Logo, utworzono szereg interpreterów Logo, również całych środowisk, wykorzystujących coraz większe możliwości komputerów i systemów operacyjnych. Oprócz interpreterów w języku angielskim opracowywano również interpretery w języku ojczystym lub w obu tych językach. Kolejne wersje Logo oprócz wzbogacanego zestawu instrukcji standardowych umożliwiały tworzenie animacji, pracę z wieloma żółwiami, oraz tworzenie rysunków trójwymiarowych. W Polsce pierwszą szeroko rozpowszechnioną wersją było ACLogo, z 1992 roku, przystosowane do systemu operacyjnego DOS. Następnym interpreterem jest Logo Komeniusz, rozpowszechniany w Polsce od 2000 roku. Kolejnym interpreterem jest Logomocja-Imagine, rozpowszechniany w Polsce od 2003 roku. Niektóre szkoły, zwłaszcza te mniejsze, ze względów oszczędnościowych, korzystają z bezpłatnego interpretera MSWLogo, utworzonego w USA (tylko w wersji angielskiej). Występują pewne różnice w niektórych instrukcjach, zwłaszcza w iteracyjnych i warunkowych. W Logo Komeniuszu w celu kontynuacji listy w następnej linii trzeba na końcu linii wstawić znak tyldy. W pracy przedstawiono wybrane instrukcje i ich zastosowanie oraz przykłady algorytmów. Przyjęto wersję angielską, gdyż większość młodzieży uczy się języka angielskiego. Wszystkie przykłady zostały uruchomione interpreterem Logomocja-Imagine.
Rozdział 1 Grafika żółwia 1.1. Podstawowe procedury Istotą grafiki żółwia w Logo jest użycie wskaźnika graficznego, zwanego żółwiem. Wskaźnik może mieć różny kształt, zależnie od implementacji. W obecnych implementacjach można używać wiele żółwi oraz indywidualnie nadawać im kształty, najczęściej żółwiem jest trójkącik. Żółwiem można sterować podając komendy z klawiatury i w ten sposób rysować obraz na ekranie. Podsumowując, ruch generuje obraz. Stosunkowo łatwo można rysować bardzo złożone figury. Bezpośednio na ekranie widać w postaci graficznej wyniki swojej pracy. Można porównać otrzymaną figurę z oczekiwaną, wykryć i usunąć błędy. Logo w formie zabawy uczy myśleć i wprowadza w tajniki programowania. W Logo jest możliwość definiowania nowych poleceń, czyli w przenośni uczeń staje się nauczycielem komputera. Żółw na ekranie ma określone położenie w układzie kartezjańskim (współrzędne X i Y), oraz kierunek, w jakim jest ustawiony. Żołw może poruszać się naprzód i wstecz za pomocą prostych komend, można również zmieniać jego kierunek poleceniami lewo lub prawo (kąt jest wyrażony w stopniach). Żółw trzyma pióro, które może być opuszczone lub podniesione, ewentualnie zamienione na gumkę. Poniżej przedstawione są podstawowe komendy sterujące ruchem żółwia. W Polsce są używane różne wersje Logo, bardziej uniwersalne angielskie i bardziej przystępne polskie. W tych wersjach niektóre komendy mają dwie postacie, pełną i skróconą. W pracy przedstawiono zasadniczo komendy angielskie oraz dodatkowo kursywą w nawiasach kątowych komendy w języku polskim, komendy
8 ROZDZIAŁ 1. GRAFIKA ŻÓŁWIA są w postaciach pełnych i skróconych. Natomiast wszystkie przykłady są w wersji angielskiej. Dwie poniższe procedury sterujące ruchem żółwia wymagają tylko jednego argumentu, ilości pikseli na ekranie, o którą należy przesunąć żółwia: 1. przesunięcie żółwia naprzód o podaną liczbę pikseli (forwrd, fd <naprzód, np>), 2. przesunięcie żółwia wstecz o podaną liczbę pikseli (back, bk <wstecz, ws>). Dwie kolejne procedury sterujące ruchem żółwia też wymagają tylko jednego argumentu, kąta wyrażonego w stopniach, o który ma się obrócić żółw: 1. obrót żółwia w prawo o podaną liczbę stopni (right, rt <prawo, pw >), 2. obrót żółwia w lewo o podaną liczbę stopni (left, lt <lewo, lw>). Następne procedury, sterujące zółwiem, są bezargumentowe: 1. podniesienie pisaka (penup, pu <podnieś, pod >), 2. opuszczenie pisaka (pendown, pd <opuść, opu>), 3. ścieranie, pisak staje się gumką i wymazuje ślad, pozostawiając podczas ruchu linię koloru tła (penerase, pe <ścieranie, ścier >), 4. odwracanie, pisak zmienia kolor pikseli z koloru tła na kolor atramentu, a z koloru atramentu na kolor tła (penreverse, px <odwracanie, odwr >), 5. czyszczenie okienka graficznego, czyli wypełnianie kolorem tła, oraz umieszczenie żółwia w środku okienka, skierowanie pionowo w górę (clearscreen, cs <czyść, cs>), 6. czyszczenie okienka graficznego, czyli wypełnianie kolorem tła, ale pozostawienie zółwia w tym samym położeniu (clean, <zmaż >), 7. umieszczenie żółwia w położeniu początkowym, w środku okienka, skierunkowianie pionowo w górę, bez czyszczenia okienka graficznego (home <wróć>),
1.1. PODSTAWOWE PROCEDURY 9 8. pokazanie żółwia (showturtle, st <pż>), ale z widocznym żółwiem wolniej są rysowane złożone figury i przysłaniane niektóre szczegóły 9. schowanie żółwia (hideturtle, ht <sż >). Wyjście z trybu ścierania dokonuje się za pomocą jednej z instrukcji: penup (pu), pendown (pd), penreverse (px). W rozwiązywaniu zadań graficznych głównie używa się pierwszych sześciu procedur graficznych. Nowsze interpretery Logo umożliwiają posługiwanie się wieloma żółwiami. Nie przyspiesza i nie upraszcza to rysowania złożonych figur, ale ułatwia tworzenie animacji, gdyż żółwie mogą mieć różne postacie i różne własności. W trybie bezpośrednim, konwersacyjnym wpisuje się polecenia i po zatwierdzeniu klawiszem Enter nastąpuje ich wykonanie. Poszczególne polecenia mogą byc wpisywane pojedynczo, w oddzielnych liniach, oddzielnie zatwierdzane klawiszem Enter. Ten sposób umożliwia obserwację wykonywania poszczególnych poleceń. Polecenia mogą być też wpisane w jednej linii. Przykładowo wykonanie następujących poleceń spowoduje narysowanie rysunku 1.1, przedstawiającego trójkąt równoboczny: cs st rt 30 fd 100 rt 120 fd 100 rt 120 fd 100 rt 90 Rys. 1.1. W trybie bezpośrednim narysowany trójkąt równoboczny
10 ROZDZIAŁ 1. GRAFIKA ŻÓŁWIA 1.2. Instrukcje iteracyjne W języku Logo są dwie instrukcje iteracyjne: repeat i while. Instrukcja repeat <powtórz > powtarza listę instrukcji określoną liczbę razy. Po słowie repeat jest wyrażenie arytmetyczne, które podaje liczbę powtórzeń, następnie jest zamknięta w nawiasy kwadratowe lista instrukcji. Przykład zastosowania instrukcji iteracyjnej do narysowania kwadratu o boku 100: repeat 4 [fd 100 rt 90]. Instrukcja while <dopóki> powtarza listę instrukcji aż do uzyskania określonego skutku. Po słowie while występują dwie listy. Lista pierwsza zawiera wyrażenie logiczne, a lista druga ciąg instrukcji do wykonania. Dopóki wartością wyrażenia logicznego jest prawda, to powtarzane jest wykonanie instrukcji z listy drugiej. Kolejnym przykładem zastosowania instrukcji iteracyjnej jest narysowanie figury przdstawionej na rysunku 1.2. Rys. 1.2. Przykładowy rysunek (kwadrat z krzyżem) Dalej przedstawiono zestaw instrukcji do otrzymania rysunku, w trybie konwersacyjnym. cs rt 45 repeat 4 [fd 50 bk 50 rt 90] lt 45 pu bk 50 lt 90 fd 50 rt 90 pd repeat 4 [fd 100 rt 90] pu rt 90 fd 50 lt 90 fd 50 pd (wyczyszczenie ekranu, ustawienie żółwia do rysowania krzyża) (narysowanie krzyża) (przywrócenie początkowego kierunku żółwia) (ustawienie żółwia w lewym dolnym wierzchołku kwadratu) (narysowanie kwadratu) (na zakończenie przywrócenie początkowego ustawienia żółwia)