Katolickie Gimnazjum i Liceum Ogólnokształcące im. Jana Pawła II w Łodzi Microsoft Small Basic Translated by Anna Wilk (klasa 2a 2009/2010)
Wstęp Small Basic i programowanie
Programowanie komputerowe jest zdefiniowane jako proces tworzenia oprogramowania komputerowego używającego języki programowania. Tylko jak mówimy i rozumiemy Anglików albo Hiszpana albo Francuzów, komputery mogą zrozumieć programy napisane w pewnych językach. To tzw. języki programowania. Na początku było niewiele takich języków, były proste i zrozumiałe. Z czasem oprogramowanie i komputery stały się bardziej skomplikowane i wyszukane, więc języki programowania również musiały ewaluować. W efekcie są to trudne do zrozumienia metody programowania, szczególnie dla początkujących. Small Basic przedstawia programowanie w przyjemny, niezwykle łatwy i ciekawy sposób, usuwa bariery, by każdy mógł wkroczyć w świat programowania. Small Basic - Środowisko Zacznijmy od przedstawienia interfejsu Small Basic a i poruszania się w nim. Po pierwszym uruchomieniu zobaczycie właśnie takie okno: Obrazek 1 To jest Small Basic Środowisko, gdzie napiszemy nasze programy. Opiszemy każdy element zaznaczony numerem. 1. Edytor(1) to miejsce, w którym piszemy program. Otwierając przykładowy program lub poprzednio zapisany, pojawi się on w tym oknie. Możesz otworzyć i korzystać z kilku edytorów na raz. 2. Pasek narzędzi(2) nadaje komendy w edytorze. O różnych zadaniach nauczymy się później. 3. Powierchnia pod edytorem (3) to obszar na wszystkie okna edycji.
Już znasz podstawy, więc zacznijmy programować. Wpiszmy poniższą linijkę do edytora. Nasz pierwszy Program TextWindow.WriteLine( Hello World ) Jeżeli wszystko zostało wpisane poprawnie, to ujżymy coś takiego: Pierwszy Program Teraz, kiedy już napisaliśmy nasz pierwszy program, włączmy go. Możemy to zrobić klikajać na przycisk RUN w pasku narzędzi lub naciskając F5. Jeżeli wykonaliśmy wszystko poprawnie, ujrzymy to: Obrazek 2 Gratulacje! Właśnie napisałeś I uruchomiłeś swój pierwszy program. Chociaż to prosty I mały program, to jest to pierwszy poważny krok dla każdego nowego programisty. Jeszcze tylko jeden szczegół przed rozpoczęciem prawdziwego programowania. Musismy zrozumieć co zrobiliśmy i jak komputer zrozumiał nasze polecenie. W następnym dziale przeanalizujemy tę małą operację. Zapisywanie programu Jeżeli chcesz zakończyć pisanie programu i wrócić do niego później, musisz go zapisać. Możesz to zrobić klikając na SAVE lub używając skrótu ctrl+s.
Nasz pierwszy program Co to naprawdę jest komputerowy program? Rozdział 2 Program jest kompletem instrukcji dla komputera. Te instrukcje mówią komputerowi dokładnie czemu, by zrobić i komputer zawsze idzie za tymi instrukcjami. Tylko jak ludzie, komputery mogą tylko pójść za instrukcjami, jeśli wyszczególniony w języku, że oni mogą zrozumieć. Te są zawołane zaprogramowywanie języków. Są bardzo wiele języków, które komputer może zrozumieć i Small Basic ma jednego lat. Wyobraź sobie rozmowę zdarzającą między tobą i twoim przyjacielem. Ty i twoi przyjaciele użyłybyście słów, zorganizowanych jako zdania, by przewieźć informację tam i z powrotem. Podobnie, programujące języki zawierają zbiory słów, które mogą zostać zorganizowane do zdań, które przewożą informacje do komputera. I programy są zasadniczo kompletami zdań (czasami tylko mało i czasami tysiące dużo) że razem mieć sens dla zarówno programisty i komputera podobnie. Small Basic Programs Typowy Small program Basic składa się z wiązki stwierdzeń. Każda linia programu reprezentuje stwierdzenie i każde stwierdzenie jest instrukcją dla komputera. Kiedy prosimy komputer wykonać Small program Basic, to bierze program i czyta pierwszy stwierdzenie. To rozumie co próbujemy powiedzieć i wtedy wykonuje nasza instrukcja. Raz to jest zrobione wykonywanie naszego pierwszy stwierdzenia, to wraca do program i czyta i wykonuje drugi linię. To kontynuuje zrobić tak, aż to dociera do końca programu. Właśnie wtedy nasze końce programu. Tylny do Our First Program Tutaj jest pierwszy program, który napisaliśmy: jest wiele języków, które komputer może zrozumieć. Jawa, C ++, Python, VB, etc. jest wszystkimi potężnymi nowoczesnymi językami komputera, które są użyte, by rozwinąć się prostymi do złożonych programów oprogramowania. TextWindow.WriteLine( Hello World ) To jest bardzo prosty program, który składa się z jednego stwierdzenia. To stwierdzenie każe komputerowi, by napisać linii o tekście, który jest Hello World, do Window Text. To dosłownie tłumaczy w umyśle komputera do: Write Hello World Mógłbyś już zauważyć, że stwierdzenie może w domu obrócić się być częściowe do mniejsze segmenty dużo jak zdania mogą być częściowe do słów. W pierwszy stwierdzeniu mamy 3 odmiennych segmentów: a) TextWindow b) WriteLine c) Hello World Kropka, parentheses i cytaty są wszystkimi interpunkcjami, które są musiane, by zostać umieszczona w odpowiednich pozycjach w stwierdzeniu, dla komputera, by zrozumieć nasz zamiar.
Mógłbyś zapamiętać czarne okno, które ukazało się kiedy prowadziliśmy nasz pierwszy program. To czarne okno jest zawołane TextWindow albo czasami zwany Console. Właśnie tam skutek tego programu idzie. TextWindow, w naszym programie, jest zawołany przedmiot. Jest pewna liczba takich przedmiotów dostępnych, ponieważ nas, by użyć w naszych programach. Możemy wykonać kilka różnych operacji na tych przedmiotach. Już użyliśmy WriteLine operacja w naszym programie. Mógłbyś też zauważyć że WriteLine operacja jest poszły za około Hello World wewnątrz cytaty. Ten tekst jest uszły za wejścia do WriteLine operacja, którą to wtedy drukuje się użytkownikowi. To jest zawołane wejście do operacji. Jakieś operacje biorą jednego albo więcej danych wejściowych kiedy inni nie biorą jakiegoś. Nasz Second Program Interpunkcje takie jak cytaty, przestrzenie i nawias są bardzo ważne w komputerowym programie. Oparty na ich pozycji i rachunku, oni mogą zmienić znaczenie czego jest wyrażany. Teraz, że zrozumiałeś nasz pierwszy program, chodziłeś i zrobiłeś to fantastyczny przez dodawanie jakichś kolorów. TextWindow.ForegroundColor = Yellow TextWindow.WriteLine( Hello World ) Obrazek 4 Kiedy prowadzisz powyższy program, zauważysz, że to drukuje to sam Hello World fraza wewnątrz TextWindow, ale ten raz to drukuje to w żółtym zamiast z szary, że to zrobiło wcześniejszy.
Zgadza się 6 - Hello World w Yellow Zauważ nowe stwierdzenie, które dodaliśmy do naszego oryginalnego programu. To używa nowego słowa, ForegroundColor, którego zrównaliśmy do wartości Żółty. This sposób, który wyznaczyliśmy Żółty do ForegroundColor. Teraz, różnica między ForegroundColor i operacją WriteLine jest, że ForegroundColor nie wziął jakichś wejść ani to potrzebowało jakiś nawias. Zamiast to zostało poszły za przez równa się, by symbol i słowo. Definiujemy ForegroundColor jako Property TextWindow. Tutaj jest lista wartości, które obowiązują dla własności ForegroundColor. Spróbuj zastępowanie Żółty z jednym z tych i zobacz skutki - nie zapominaj cytatów, oni są wymagani interpunkcjami. Black Blue Cyan Gray Green Magenta Red White Yellow DarkBlue DarkCyan DarkGray DarkGreen DarkMagenta DarkRed DarkYellow
Wprowadzając Variables Używając Zmienne w naszym programie Rozdział 3 To nie byłoby miłe, jeśli nasz program może właciwie powiedzieć Hello z użytkownikami nazywają zamiast mówienia ogólnego Hello World? Żeby zrobić, że musimy po pierwsze poprosić użytkownika o jego / jej imię i wtedy zgromadzić to gdzieś i wtedy drukujemy się Cześć z imieniem użytkownika. Zobaczmy jak możemy zrobić że: TextWindow.Write( Enter your Name: ) name = TextWindow.Read() TextWindow.WriteLine( Hello + name) Kiedy piszesz i wykonujesz ten program, będziesz widział, jak produkcja lubi następować: Zgadza się 7 - Ask imię użytkownika I kiedy wprowadzasz twoje imię i uderzasz WEJŚĆ, będziesz widział poszły za produkcją: Zgadza się 8 - Warm Hello Teraz, jeśli prowadzisz program znów, będziesz spytany to sam pytanie znów. Możesz wprowadzić różne imię i komputer przywita się z tym imieniem. Analiza programu W programie tylko biegłeś, linia, która mogłaby złapać twoją uwagę jest ta: name = TextWindow.Read() Read()spogląda tylko jak WriteLine(),ale z żadnymi wejściami. To jest operacja i zasadniczo to każe komputerowi, by zaczekać na użytkownika wprowadzić coś i uderza klawisze Enter. Raz użytkownik uderza klawisze Enter, to coś co użytkownik napisał bierze i zwraca to do programu. Interesujący punkt jest, że jakikolwiek, który użytkownik napisał teraz jest wprowadzony do pamięci zmienną zawołaną imię. Zmienna jest zdefiniowana jako miejsce, gdzie możesz zgromadzić wartości chwilowo i używasz ich później. W linii powyższej, imię zostało zgromadzone imię użytkownika. Następna linia też interesuje:
TextWindow.WriteLine( Hello + name) To jest miejsce, gdzie używamy wartości wprowadzonej naszą zmienną do pamięci, imię. Bierzemy wartość w imieniu i dodajemy to by Cześć i napisz to TextWindow. Raz zmienna jest ustawiona, możesz odwołanie to dowolna ilość czasów. Na przykład, możesz zrobić co następować: TextWindow.Write( Enter your Name: ) name = TextWindow.Read() TextWindow.Write( Hello + name +. ) TextWindow.WriteLine( How are you doing + name +? ) I będziesz widział poszły za produkcją: Zgadza się 9 - Reusing Variable Reguły dla nazywania Variables [TODO] Bawiąc się Numbers Właśnie zobaczyliśmy jak możesz użyć zmiennych, by zgromadzić imię użytkownika. W kilku programach, będziemy widzieli jak możemy zgromadzić i zmanipulować numerami w zmiennych. Rozpocznijmy od naprawdę prostego programu: number1 = 10 number2 = 20 number3 = number1 + number2 TextWindow.WriteLine(number3) Kiedy prowadzisz ten program, który dostaniesz czemu następuje jako produkcja: Notice that the numbers don t have quotes around them. For numbers, quotes are not Obrazek 5 necessary. You need quotes only when you re using text. W pierwszej linijce programu przydzielasz zmiennej number1 wartość 10. W drugiej linijce, wyznaczasz zmiennej number2 wartość 20. W trzeciej linijce, dodaj number1 i number2 a potem
wyznacz wynik tego dla number3. W tym wypadku, number3 będzie miał wartość 30. To właśnie wprowadziliśmy do okna tekstowego. Teraz zmodyfikujmy program delikatnie I zobaczmy rezultat: number1 = 10 number2 = 20 number3 = number1 * number2 TextWindow.WriteLine(number3) Program powyżej podzieli number1 z number2 i przechowa wynik w number3. Możesz zobaczyć to w wyniku z program poniżej. Obrazek 6 Podobnie możesz odejmować i dzielić numery. To jest przykład odejmowania: number3 = number1 - number2 Symbolem dzielenia jest /. Program będzie wyglądał tak: number3 = number1 / number2 Wynikiem tego dzielenia będzie: Prosty konwerter temperatury Dla następnego programu użyjemy formuły Celsjusza. Obrazek 7 by przeliczyć temperaturę z Fahrenheita na stopnie Najpierw, przechowamy temperaturę w Fahrenheitach w zmiennej. Jest taka specjalna komenda, która umożliwia nam czytanie numerów: TextWindow.ReadNumber. TextWindow.Write( Enter temperature in Fahrenheit: ) fahr = TextWindow.ReadNumber() celsius = 5 * (fahr - 32) / 9
Jeżeli już mamy temperaturę w Fahrenhaitach w zmiennej możemy ją zamienić na stopnie Celsjusza. Nawiasy mówią komputerowi, by wyliczył temperaturę fahr 32 (część pierwszą)a potem przetworzył resztę. Składając wszystko razem otrzymujemy: TextWindow.Write( Enter temperature in Fahrenheit: ) fahr = TextWindow.ReadNumber() celsius = 5 * (fahr - 32) / 9 TextWindow.WriteLine( Temperature in Celsius is + celsius) Rezultat: Obrazek 8
Conditions and Branching Rozdział 4 Wracając do pierwszego programu, czy nie byłoby fajnie mówić zamiast podstawowego Hello World - Good Morning World, lub Good Evening World w zależności od pory dnia? W następnym porgramie, ustawimy by komputer mówił Good Morning World jeżeli jest wcześniej niż 12 w południe i Good Evening jeżli jest później niż 12. If (Clock.Hour < 12) Then TextWindow.WriteLine( Good Morning World ) EndIf If (Clock.Hour >= 12) Then TextWindow.WriteLine( Good Evening World ) EndIf W zależnośći kiedy włączasz program będziesz widział jedno z tych przywitań: Obrazek 9 Obrazek 10 Przeanalizujmy teraz trzy pierwsze linijki programu. Widać, że pierwsza lininja wzkazuje, że gdy Clock.Hour jest mniejsza niż godzina 12., to wyświetli się Good Morning World. Słowa If, Then i EndIf są specjalnymi słowami które są zrozumiałe przez komputer gdy In Small Basic, you can use the Clock object to access the current date and time. It also provides you a bunch of properties that allow you to get the current Day, Month, Year, Hour, Minutes, Seconds separately. program jest włączony. Po słowie If występuje zawsze warunek, w tym przypadku (Clock.Hour < 12). Pamiętaj, że nawiasy są konieczne, by komputer zrozumiał twoje zamiary. Po tej sekwencji występuje then i zadanie zostaje wykonane. Na samym końcu wpisujemy EndIf,co informuje komputer o zakończeniu naszych działań.
Pomiędzy then i EndIf, może być więcej niż jedna operacja,a komputer wykona ją, jeżeli będzie wpisana poprawnie. Na przykład,możesz napisać coś takiego: If (Clock.Hour < 12) Then TextWindow.Write( Good Morning. ) TextWindow.WriteLine( How was breakfast? ) EndIf Else Na początku tego rozdziału mogłeś zauważyć, że drugi warunek jest nieco zbyteczny. Wartość Clock.Hour mogłaby być mniejsza od 12 lub nie. Możemy skrócić if..then.. do jednego słowa, else. Przepisując ten program z użyciem else wygląda to tak: If (Clock.Hour < 12) Then TextWindow.WriteLine( Good Morning World ) Else TextWindow.WriteLine( Good Evening World ) EndIf Stanie się dokładnie to samo co we wcześniejszym przypadku,to pokazuje nam bardzo ważną rzecz w programowaniu: W programowaniu, jest zwykle wiele sposobów na zrobienie jednej rzeczy. Czasami jedna metoda jest dużo lepsza od innych. Wybór należy do osoby programującej. Z czasem, gdy masz już dużo doświadczenia, będziesz zauważał te różne metody, ich wady i zalety. Akapit We wszystkich przykładach możesz zauważyć jak zdania pomiędzy If, Else and EndIf zaczynają się od akapitów. Nie jest to konieczne. Komputer zrozumie program bez tego. Jednakże, one pomagają nam zobaczyć strukturę programu i łatwiej go zrozumieć. Stąd, używanie akapitów to dobra metoda nauki i doskonalenia się w programowaniu. Liczby parzyste i nieparzyste Teraz, kiedy znamy wyrażenia If..Then..Else..EndIf, napiszmy program, który określi czy podana liczba jest przysta czy też nie. TextWindow.Write( Enter a number: ) num = TextWindow.ReadNumber() remainder = Math.Remainder(num, 2) If (remainder = 0) Then TextWindow.WriteLine( The number is Even ) Else TextWindow.WriteLine( The number is Odd ) EndIf Po włączeniu programu zobaczysz:
Obrazek11 W tym programieprzedstawiliśmy również nową i przydatną funkcję, Math.Remainder. Math.Remainder podzieli pierwszą liczbę przez drugą i otrzymamy resztę. Branching Pamiętaj, w drugim rozdziale nauczyłeś się że, komputer przetwarza jednocześnie jedną linijke programu, w kolejności od góry do dołu. Jednakże, jest specjalna komenda która spowoduje, że komputer przeskoczy z jednego polecenia do drugiego. Spójrzmy na kolejny program. i = 1 start: TextWindow.WriteLine(i) i = i + 1 If (i < 25) Then Goto start EndIf Obrazek 12 W programie powyżej, ustawiamy wartość od 1 do jakiej chcemy. Potem dodajemy nowe zdanie zakończone dwukropkiem(:) start: Nazywamy to etykietką. Etykietki są jak zakładki, które komputer rozpoznaje. Możesz nazwać zakładkę jak chcesz I dodać tyle etykietek ile chcesz, jeżeli każda będzie miała inną nazwę.
Kolejna interesująca komenda: i = i + 1 Rozkazuje ona komputerowi by dodał 1 do różnorodnej i I zmienił znowu do i. Więc jeżeli wartością i była 1przed tą komendą to zamieni się to na 2. W końcu, If (i < 25) Then Goto start EndIf To jest część która rozkazuje komputerowi, by w przypadku gdy wartość i jest mniejsza od 25, zaczął wykonywać zadania od zakładki start. Niekończący się proces Używanie Goto powoduje, że komputer powtarza coś tyle razy ile chcesz. Na przykład, weźmy programy Even lub Odd i zmodyfikujmy jak poniżej, wtedy program będzie działał w nieskończoność. Można go zatrzymać klikając przycisk X w prawym górnym rogu okna. begin: TextWindow.Write( Enter a number: ) num = TextWindow.ReadNumber() remainder = Math.Remainder(num, 2) If (remainder = 0) Then TextWindow.WriteLine( The number is Even ) Else TextWindow.WriteLine( The number is Odd ) EndIf Goto begin Pętle Pętla For Obrazek 13 Rozdział 5
Użyjmy programu, który napisaliśmy w poprzednim rozdziale. i = 1 start: TextWindow.WriteLine(i) i = i + 1 If (i < 25) Then Goto start EndIf Ten program wyświetla liczby od 1 do 24. Ten process wzrastania zmiennej jest popularny dla programowania i jego języka. Można to zrobić prościej. Powyższy program jest taki sam jak ten poniżej. For i = 1 To 24 TextWindow.WriteLine(i) EndFor Rezultat: Obrazek 14 Zauważ, że zredukawiliśmy osiem linijek do 4, a program działa identycznie! Wcześniej wspomnieliśmy, że zwykle jest dużo sposobów na robienie jedniej rzeczy, to był właśnie idealny przykład. For..EndFor jest nazywane pętlą. Pozwala Ci wziąć zmienną, nadać jej nazwę i końcową wartość, a komputer powiększy zmienną za Ciebie. Za każdy razem, gdy komputer będzie powiększał zmienną, użyje zdań między For i EndFor. Jednak jeżeli chcesz by zmienna powiększyła się o 2 a nie 1, wymagane będzie by wyświetlone zostały wszystkie liczby nieparzyste od 1 do 24. Pętla zrobi to za Ciebie. For i = 1 To 24 Step 2 TextWindow.WriteLine(i) EndFor
Obrazek 15 Step 2, czyli druga cześć zdań z For mówi komputerowi by zwiększył wartość i o 2. Używając Step sprecyzujesz każde powiększenie jakie chcesz. Możesz nawet określić ujemną wartość, przez co komputer będzie liczył do tyłu. For i = 10 To 1 Step -1 TextWindow.WriteLine(i) EndFor Pętla While Obrazek 16 Pętla While to kolejna metoda zapętlania, szczególnie użyteczna gdy nie znamy ilości wykonanych pętli. W przeciwieństwie do pętli For, której ilość znamy, pętla While działa dopóki dany warunek nie okaże się prawdą. W przykładzie poniżej dzielimy liczbę, póki jej wartość nie będzie większa niż 1. number = 100 While (number > 1) TextWindow.WriteLine(number) number = number / 2 EndWhile Obrazek 17
W programie powyżej przydzielamy wartość 100 do number i włączamy pętla tak długo, aż liczba będzie większa od jedynki. W środku pętli wpisujemy liczbę, nastepnie dzielimy przez 2. Tak jak się spodziewaliśmy, wynik programu jest liczbą, która progresywnie dzieli się w kółko. Byłoby trudno napisać ten program z pętlą For, ponieważ nie wiemy ile razy pętla ma działać. Z While jest to proste, zawsze można sprawdzić stan i zatrzymać bądź zupełnią wyłączyć program. Zauważmy, że każda pętla while może być rozwinięta do zdania If..Then. Na przykład, program powyżej może być napisany jak ten poniżej bez żadnej zmiany. number = 100 startlabel: TextWindow.WriteLine(number) number = number / 2 If (number > 1) Then Goto startlabel EndIf Komputer wewnętrznie przepisuje każdą pętlę While w zdanie z użyciem If..Then ze komendą Goto.
Grafika-początki Rozdział 6 Dotychczas we wszystkich przykładach używaliśmy TextWindow, by wytłumaczyć podstawy Small Basic. Jednak ten program zawiera ogromne zaplacze graficzne, o którym napiszemy w tym rozdziale. GraphicsWindow-przedstawienie Mieliśmy TextWindow, które umożliwiało nam pracowanie z tekstem i liczbami, teraz mamy doczynienia z GraphicsWindow, dzięki któremu rysujemy. Zacznijmy od początku wpisując GraphicsWindow. GraphicsWindow.Show() Po włączeniu programu zauważysz, że zamiast zwykłego czarnego okna, mamy białe. Jest to podstawa naszej pracy z grafiką. Ustawienia Obrazek 18 To okno można ustawić wedle własnych preferencji. Można zmienić tytuł, tło, rozmiar. GraphicsWindow.BackgroundColor = SteelBlue GraphicsWindow.Title = My Graphics Window GraphicsWindow.Width = 320 GraphicsWindow.Height = 200 GraphicsWindow.Show()
Tak wygląda to okno po zmianach. Rysowanie lini Figure 1 - A Custom Graphics Window Gdy już otworzymy GraphicsWindow, możemy rysować figury. Zacznijmy od najprostszych rzeczy. Oto program rysujący proste linie. GraphicsWindow.Width = 200 GraphicsWindow.Height = 200 GraphicsWindow.DrawLine(10, 10, 100, 100) GraphicsWindow.DrawLine(10, 100, 100, 10) Obrazek 20 Pierwsze dwie linijki ustawiają okno, dwie kolejne rysują skrzyżowane linie. Pierwsze dwie liczby po DrawLine określają początkowe współrzędne x I y, a pozostałe dwie to końcowe współrzędne. Interesującą rzeczą w grafice komputerowej jest to, że współrzędne (0,0) mieszczą się w lewym górnym rogu okna. W efekcie przestrzeń współrzędnych w okienku jest uznawane ze drugą ćwiartkę. [TODO: Insert picture of quadrant] Zamiast używania nazw kolorów można skorzystać z takiego oznakowania (#RRGGBB). Na przykład, #FF0000 to kolor czerwony, #FFFF00 żółty.
Obrazek 21 Small Basic umożliwia modyfikowanie lini, np. pod względem koloru czy grubości. Najpierw spróbujmy zmienić kolor. GraphicsWindow.Width = 200 GraphicsWindow.Height = 200 GraphicsWindow.PenColor = Green GraphicsWindow.DrawLine(10, 10, 100, 100) GraphicsWindow.PenColor = Gold GraphicsWindow.DrawLine(10, 100, 100, 10) Obrazek 22 Teraz zmieńmy również rozmiar. Poniżej, zmieniamy szerokość(width) do 10, a nie do 1. GraphicsWindow.Width = 200 GraphicsWindow.Height = 200 GraphicsWindow.PenWidth = 10 GraphicsWindow.PenColor = Green GraphicsWindow.DrawLine(10, 10, 100, 100) GraphicsWindow.PenColor = Gold GraphicsWindow.DrawLine(10, 100, 100, 10) Obrazek 23 PenWidth i PenColor modyfikują ołówek, którym są rysowane linie. Nie tylko ma to wpływ na linie, lecz również na każdą figurę, która jest rysowana po uaktualnieniu właściwości. Używając pętli możemy łatwo napisać program rysujący wiele lini o powiększającej się grubości.
GraphicsWindow.BackgroundColor = Black GraphicsWindow.Width = 200 GraphicsWindow.Height = 160 GraphicsWindow.PenColor = Blue For i = 1 To 10 GraphicsWindow.PenWidth = i GraphicsWindow.DrawLine(20, i * 15, 180, i * 15) endfor Obrazek 24 Interesującą częścią tego programu jest pętla, w której zwiększamy PenWidth za każdym razem i rysujemy nową linię pod tą starą. Rysowanie i wypełnianie Wyróżnia się dwie operacje dla każdego sposobu rysowania figur: Draw i Fill. Operacja Draw rysuje kontur figury, Fill zamalowuje przy użyciu pędzla. W przykładzie poniżej widać, że kontur zaznaczono czerwonym kolorem a wypełnienie zielonym. GraphicsWindow.Width = 400 GraphicsWindow.Height = 300 GraphicsWindow.PenColor = Red GraphicsWindow.DrawRectangle(20, 20, 300, 60) GraphicsWindow.BrushColor = Green GraphicsWindow.FillRectangle(60, 100, 300, 60)
Obrazek 25 Aby wykonać tę operację potrzeba 4 numerów. Pierwsze dwa reprezentują współrzędne X i Y dla lewego górnego rogu prostokąta. Trzeci określa szerokość protokąta, czwarty jego wysokość. Identyczne wymagania występują w przypadku elipsy. GraphicsWindow.Width = 400 GraphicsWindow.Height = 300 GraphicsWindow.PenColor = Red GraphicsWindow.DrawEllipse(20, 20, 300, 60) GraphicsWindow.BrushColor = Green GraphicsWindow.FillEllipse(60, 100, 300, 60) Obrazek 26 Elipsa jest podstawą koła. Jeżeli chcesz narysować koło, musisz określić takie same parametry. GraphicsWindow.Width = 400 GraphicsWindow.Height = 300
GraphicsWindow.PenColor = Red GraphicsWindow.DrawEllipse(20, 20, 100, 100) GraphicsWindow.BrushColor = Green GraphicsWindow.FillEllipse(100, 100, 100, 100) Obrazek 27
Zabawa z figurami Rozdział 7 Pobawimy się teraz tym, czego nauczyliśmy się wcześniej. Ten rozdział zawiera przykłady interesujących metod kombinacji rzeczy, których już się nauczyliśmy i tworzenia fajnie wyglądających programów. Prostokąty W tym przykładzie rysujemy kilka prostokątów o zwiększających się rozmiarach. GraphicsWindow.BackgroundColor = Black GraphicsWindow.PenColor = LightBlue GraphicsWindow.Width = 200 GraphicsWindow.Height = 200 For i = 1 To 100 Step 5 GraphicsWindow.DrawRectangle(100 - i, 100 - i, i * 2, i * 2) EndFor Koła Obrazek 28 Wariant następnego programu umożliwia narysowanie kół zamiast kwadratów. GraphicsWindow.BackgroundColor = Black GraphicsWindow.PenColor = LightGreen
GraphicsWindow.Width = 200 GraphicsWindow.Height = 200 For i = 1 To 100 Step 5 GraphicsWindow.DrawEllipse(100 - i, 100 - i, i * 2, i * 2) EndFor Losowo Obrazek 29 Ten program używa operacji GraphicsWindow.GetRandomColor by ustawić dowolny kolor pędzla, następnie używa Math.GetRandomNumber by ustawić współrzędne x i y dla koła. Te dwie operacje pozwalają uzyskać interesujący efekt za każdym razem gdy ponownie włączamy program. GraphicsWindow.BackgroundColor = Black For i = 1 To 1000 GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor() x = Math.GetRandomNumber(640) y = Math.GetRandomNumber(480) GraphicsWindow.FillEllipse(x, y, 10, 10) EndFor
Fraktale Obrazek 30 Kolejny program rysuje prosty, trójkątny fractal używając losowych numerów. Fraktal jest figurą geometryczną, która może być podzielona na mniejsze części. Każda taka część przypomina macierzystą figurę. W tym przypadku program rysuje setki trójkątów, które wyglądają jak ich początkowy trójkąt. Program wykonuje zadanie przez pare sekund, więc można dokładnie zobaczyć formowanie się trójkątów ze zwykłych kropek. GraphicsWindow.BackgroundColor = Black x = 100 y = 100 For i = 1 To 100000 r = Math.GetRandomNumber(3) ux = 150 uy = 30 If (r = 1) then ux = 30 uy = 1000 EndIf If (r = 2) Then ux = 1000 uy = 1000 EndIf x = (x + ux) / 2 y = (y + uy) / 2 GraphicsWindow.SetPixel(x, y, LightGreen )
EndFor Obrazek 31 Jeżeli naprawdę chcesz zobaczyć kropki powoli formujące fractal, musisz włączyć opóźnienie pętli wpisując Program.Delay. Ta operacja używa numeru określającego milisekundy opóźnienia. Oto zmodyfikowany program, pogrubione zdanie to właśnie wprowadzona zmiana. GraphicsWindow.BackgroundColor = Black x = 100 y = 100 For i = 1 To 100000 r = Math.GetRandomNumber(3) ux = 150 uy = 30 If (r = 1) then ux = 30 uy = 1000 EndIf If (r = 2) Then ux = 1000 uy = 1000 EndIf x = (x + ux) / 2 y = (y + uy) / 2 GraphicsWindow.SetPixel(x, y, LightGreen ) Program.Delay(2)
EndFor Zwiększenie opóźnienia spowoduje spowolnienie programu. Poeksperymentuj z numerami, zobacz co pasuje Ci najbardziej. Inną modyfikacją, którą możemy zastosować w tym programie to zastąpienie tej linijki: GraphicsWindow.SetPixel(x, y, LightGreen ) Tą: color = GraphicsWindow.GetRandomColor() GraphicsWindow.SetPixel(x, y, color) Ta zmiana wprowadzi rysowanie pikseli trójkąta używając losowych kolorów.
Żółw Logo Rozdział 8 W latach 70. XX wieku, był bardzo prosty ale skuteczny język programowania - Logo. Do czasu gdy ktoś dodał coś co nazywa się Grafiką żółwia i tym samym udostępnił żółwia który był widoczny na ekranie i odpowiadał na polecenia typu: przejdź do przodu, skręc w prawo itp. Używając żółwia,ludzie mogli rysować interesujące kształty na ekranie. To spowodowało, że język był przystępny dla ludzi w każdym wieku. Small basics łączy się z żółwiem wieloma poleceniami. W tym rozdziale użyjemy żółwia do rysowanie grafik na ekranie. Żółw Aby zacząć musimy wpisać polecenie, by żółw pojawił się. Turtle.Show() Kiedy włączysz program zauważysz białe okienko, takie jak w poprzednim rozdziale,tylko że to będzie zawierało żółwia. To on będzie wykonywał nasze polecenia i rysował to co chcemy.
Poruszanie i rysowanie Obrazek 32 Jedną z komend, które rozumie żółw jest Move. Należy użyć numerów. Dzięki nim żółw będzie wiedział o ile ma się poruszyć. W przykładzie poniżej rozkażemy, by żółw poruszył się o 100 pikseli. Turtle.Move(100) Po włączeniu programu można zauważyć, że żółw porusza się powoli o 100 pikseli do góry. Podczas tego ruchu, widać linię kreśloną za nim. Gdy żółw skończy, rezultat będzie wyglądał tak jak poniżej. Gdy używamy żółwia nie musimy zawsze wpisywać Show(). Żółw automatycznie się pojawi podczas każdej operacji z jego zastosowaniem.
Rysowanie kwadratu Obrazek 33 Kwadrat ma 4 boki, dwa pionowe i dwa poziome. By narysować kwadrat musimy rozkazać żółwiowi by nakreślił linię, odwrócił się w prawo, narysował kolejną i tak dalej aż uzyskamy kwadrat. Turtle.Move(100) Turtle.TurnRight() Turtle.Move(100) Turtle.TurnRight() Turtle.Move(100) Turtle.TurnRight() Turtle.Move(100) Turtle.TurnRight() Poniżej widać efekt.
Obrazek 34 Można zauważyć, że powtarzamy dwie instrukcje cztery razy. Wcześniej nauczyliśmy się, że takie powtarzające się komendy można zastosować używając pętli. Program powyżej można zmodyfikować z zastosowaniem pętli For..EndFor, to dużo łatwiejsze rozwiązanie. For i = 1 To 4 Turtle.Move(100) Turtle.TurnRight() EndFor Zmiana barwy Żółw rysuje w GraphicsWindow, takim samym jak wcześniej opisywaliśmy. To znaczy, że wszystkie poznane operacje są użyteczne i w tym przypadku. Następna komenda narysuje kwadrat, którego każdy bok będzie innego koloru. For i = 1 To 4 GraphicsWindow.PenColor = GraphicsWindow.GetRandomColor() Turtle.Move(100) Turtle.TurnRight() EndFor
Rysowanie bardziej złożonych kształtów Obrazek 35 Żółw oprócz TurnRight i TurnLeft ma również komendę Turn. Ta operacja wykorzystuje jedną daną określającą kąt rotacji. Tym sposobem narysujemy dowolny wielokąt. Następujący program rysuje sześciokąt. For i = 1 To 6 Turtle.Move(100) Turtle.Turn(60) EndFor Wypróbujmy, by zobaczyć czy naprawdę da się narysować sześciokąt. Skoro kąt między bokami wynosi 60 stopni, to napiszemy Turn(60). Dla takiego wielokąta, którego boki sa równe, kąt ten można łatwo otrzymać dzieląc 360 przez numer boków. Uzbrojeni w takie informacje i możliwości możemy już napisać solidny program generujący dowolny wielokąt. sides = 12 length = 400 / sides angle = 360 / sides For i = 1 To sides Turtle.Move(length) Turtle.Turn(angle) EndFor
Używając tego programu można narysować każdy wielokąt, wystarczy tylko zmodyfikować zmienne ścian. Napisanie 4 tutaj dałoby nam kwadrat. Wstawiając wystarczająco dużą wartość, np. 50, spowoduje coś nierozróżnialnego od koła. W programie poniżej przyspieszyliśmy żółwia ustawiając wartość Speed na 9. Możesz ustawić szybkość od 1 do 10, w zależności od swojej woli. Obrazek 36 Używając tej techniki nauczyliśmy się rozkazywać żółwiowi, by rysował wiele kół, za każdym razem z małą zmianą. sides = 50 length = 400 / sides angle = 360 / sides Turtle.Speed = 9 For j = 1 To 20 For i = 1 To sides Turtle.Move(length) Turtle.Turn(angle) EndFor Turtle.Turn(18) EndFor Program powyżej ma dwie pętle For..EndFor. Wewnętrzna pętla (i = 1 to sides)jest podobna do programu z wielokątami I odpowiada za rysowanie kół. Zewnętrzna pętla (j = 1 to 20) odpowiada za przesuwanie żółwia o kawałek po każdym narysowanym kole. W przykładzie jest rozkaz narysowania 20 kół. Wszystko to połączone razem tworzy interesujący wzór.
Poruszanie Obrazek 37 Jeżeli chcesz by żółw się poruszył bez rysowania za sobą linii, użyj komendy PenUp. Żółw przeniesie się wszędzie gdzie chcesz, ale nie narysuje niczego. Wpisanie PenDown spowoduje, że żółw znowu zacznie rysować przy poruszaniu. Ta opcja może być wykorzystana by np. narysować przerywaną linię. Oto program umożliwiający narysowanie wielokąta o przerywanym konturze. sides = 6 length = 400 / sides angle = 360 / sides For i = 1 To sides For j = 1 To 6 Turtle.Move(length / 12) Turtle.PenUp() Turtle.Move(length / 12) Turtle.PenDown() EndFor Turtle.Turn(angle) EndFor W tym programie wyróżniamy dwie pętle jedna rysuje przerywaną linię, druga określa ilość tych linii. W naszym przykładzie, wykorzystaliśmy 6 dla zmiennej ścian, stąd wyszedł wielokąt taki jak poniżej.
Obrazek 38
Podprogram Bardzo często podczas pisanie programu spotkamy się z koniecznością wykorzystywania tych samym sentencji jak poprzednio. W tych przypadkach nie ma sensu wciąż przepisywać tego samego. Wtedy podprogramy bardzo się przydają. Rozdział 9 Podprogram to porcja kodu z większej komendy, która zwykle robi coś specjalnego i może być wywołana w różnych miejscach w programie. Podprogramy są identyfikowane przez słowo poprzedzone wyrażeniem Sub i kończą się wyrazem EndSub. Na przykład, następujący skrawek reprezentuje podprogram PrintTime, który wyświetla aktualny czas w TextWindow. Sub PrintTime TextWindow.WriteLine(Clock.Time) EndSub Poniżej widzimy program zawierający podprogram, który jest przywoływany w różnych momentach. PrintTime() TextWindow.Write( Enter your name: ) name = TextWindow.Read() TextWindow.Write(name +, the time now is: ) PrintTime() Sub PrintTime TextWindow.WriteLine(Clock.Time) EndSub Obrazek 39
Wykonujesz podprogram wpisując SubroutineName(). Zwykle nawiasy są potrzebne, by powiedzieć komputerowi, że chcesz wywołać podprogram. Zalety korzystania z podprogramu Powyżej widzimy, że podprogramy pomagają skrócić ilość kodu, który musimy wpisać. Po wpisaniu raz komendy PrintTime, możesz ją przywołać w każdym momencie. Na dodatek, podprogramy podzielą złożone problemy na prostsze części. Jeżeli mamy do rozwiązania trudne równanie, możemy je rozpisać na kilka podprogramów, każdy rozwiązujący poszczególną część. Na końcu wystarcz złożyć wszystko razem i otrzymamy wynik całego równania. Podprogramy również ulepszają czytelność programu. W przypadku klarownie rozpisanych podprogramów łatwo nam przejrzyście zrozumieć cały program. To ważne, gdy chcesz przeanalizować dzieło innego programisty lub by to właśnie twoja praca była czytelna. Używanie zmiennych Możesz udostepnić i użyć każdą zmienną przez podprogram. As an example, the following program accepts two numbers and prints out the larger of the two. Zauważmy, że zmienna max jest użyta wewnątrz i na zewnątrz podprogramu. Pamietaj, w SmallBasic możesz Remember, you can only call a SmallBasic subroutine from within the same program. You cannot call a subroutine from within another program. TextWindow.Write( Enter first number: ) num1 = TextWindow.ReadNumber() TextWindow.Write( Enter second number: ) num2 = TextWindow.ReadNumber() FindMax() TextWindow.WriteLine( Maximum number is: + max) Sub FindMax If (num1 > num2) Then max = num1 Else max = num2 EndIf EndSub Oto rezultat: Obrazek 40
Spójrzmy na następny przykład wykorzystania podprogramu. Tym razem użyjemy programu graficznego, który oblicza różne punkty zapisane w zmiennych x I y. Wywoływany jest podprogram DrawCircleUsingCenter, który odpowiada za rysowanie koła używając x i y za środek. GraphicsWindow.BackgroundColor = Black GraphicsWindow.PenColor = LightBlue GraphicsWindow.Width = 480 For i = 0 To 6.4 Step 0.17 x = Math.Sin(i) * 100 + 200 y = Math.Cos(i) * 100 + 200 DrawCircleUsingCenter() EndFor Sub DrawCircleUsingCenter startx = x - 40 starty = y - 40 GraphicsWindow.DrawEllipse(startX, starty, 120, 120) EndSub Obrazek 41 Podprogramy w pętlach Czasami podprogram jest używany w pętli, w której wykorzystuje się te same komendy, tylko że z innymi wartościami. Na przykład, podprogram PrimeCheck i ten podprogram określają czy liczba jest pierwsza. Możesz napisać program, który pozwala użytkownikowi wpisać dowolną wartość i dowiedzieć się czy liczba jest pierwsza za pomocą podprogramu. Poniżej znajduje się wzór.
TextWindow.Write( Enter a number: ) i = TextWindow.ReadNumber() isprime = True PrimeCheck() If (isprime = True ) Then TextWindow.WriteLine(i + is a prime number ) Else TextWindow.WriteLine(i + is not a prime number ) EndIf Sub PrimeCheck For j = 2 To Math.SquareRoot(i) If (Math.Remainder(i, j) = 0) Then isprime = False Goto EndLoop EndIf Endfor EndLoop: EndSub Podprogram PrimeCheck bierze daną wartość i I próbuje ją podzielić przez mniejsze liczby. Jeżeli nie uzyskujemy żadnej reszty, wtedy i nie jest liczbą pierwszą. W takim momencie podprogram ustawia wartość isprime na fałsz(false) i kończy operację. Jeżeli liczba była niepodzielna przez mniejsze liczby, wtedy wartością isprime jest prawda(true). Obrazek 42 Skoro już mamy podprogram sprawdzający liczby pierwsze, możemy stworzyć listę liczb pierwszych mniejszych od 100. Bardzo łatwo można zmodyfikować program poniżej, by wyświetlał takie liczby przez pętlę. Ten program rozkazuje obliczanie różnych wartości przy każdym włączeniu pętli. Spójrzmy na przykład poniżej. For i = 3 To 100 isprime = True PrimeCheck() If (isprime = True ) Then TextWindow.WriteLine(i) EndIf EndFor Sub PrimeCheck For j = 2 To Math.SquareRoot(i) If (Math.Remainder(i, j) = 0) Then isprime = False Goto EndLoop EndIf Endfor EndLoop:
EndSub Widzimy, że wartość i jest uaktualniona po każdym włączeniu pętli. W środku wywoływana jest komenda PrimeChec. PrimeCheck bierze wartość i i oblicza czy jest liczbą pierwszą. Wynik jest przechowany w isprime, a następnie dostępny na zewnątrz pętli. Wartość i jest potem wyświetlana jeżeli okaże się liczbą pierwszą. Skoro pętla zaczyna od 3 i idzie do 100, otrzymujemy listę wszystkich liczb pierwszych z tego przedziału. Oto wynik: Obrazek 43
Rozdział 10 Events and Interactivity In the first two chapters, we introduced objects that have Properties and Operations. In addition to properties and operations, some objects have what are called Events. Events are like signals that are raised, for example, in response to user actions, like moving the mouse or clicking it. In some sense events are the opposite of operations. In the case of operation, you as a programmer call it to make the computer do something; whereas in the case of events, the computer lets you know when something interesting has happened. How are events useful? Events are central to introducing interactivity in a program. If you want to allow a user to interact with your program, events are what you ll use. Say, you re writing a Tic-Tac-Toe game. You ll want to allow the user to choose his/her play, right? That s where events come in - you receive user input from within your program using events. If this seems hard to grasp, don t worry, we ll take a look at a very simple example that will help you understand what events are and how they can be used. Below is a very simple program that has just one statement and one subroutine. The subroutine uses the ShowMessage operation on the GraphicsWindow object to display a message box to the user. GraphicsWindow.MouseDown = OnMouseDown Sub OnMouseDown GraphicsWindow.ShowMessage( You Clicked., Hello ) EndSub The interesting part to note in the program above is the line where we assign the subroutine name to the MouseDown event of GraphicsWindow object. You ll notice that MouseDown looks very much like a property except that instead of assigning some value, we re assigning the subroutine OnMouseDown to it. That s what is special about events when the event happens, the subroutine is called automatically. In this case, the subroutine OnMouseDown is called every time the user clicks using the mouse, on the GraphicsWindow. Go ahead, run the program and try it out. Anytime you click on the GraphicsWindow with your mouse, you ll see a message box just like the one shown in the picture below.
Figure 2 - Response to an event This kind of event handling is very powerful and allows for very creative and interesting programs. Programs written in this fashion are often called event-driven programs. You can modify the OnMouseDown subroutine to do other things than popup a message box. For instance, like in the program below, you can draw big blue dots where the user clicks the mouse. GraphicsWindow.BrushColor = Blue GraphicsWindow.MouseDown = OnMouseDown Sub OnMouseDown x = GraphicsWindow.MouseX - 10 y = GraphicsWindow.MouseY - 10 GraphicsWindow.FillEllipse(x, y, 20, 20) EndSub Figure 3 - Handling Mouse Down Event Notice that in the program above, we used MouseX and MouseY to get the mouse co-ordinates. We then use this to draw a circle using the mouse co-ordinates as the center of the circle.
Handling multiple events There are really no limits to how many events you want to handle. You can even have one subroutine handle multiple events. However, you can handle an event only once. If you try to assign two subroutines to the same event, the second one wins. To illustrate this, let s take the previous example and add a subroutine that handles key presses. Also, let s make this new subroutine change the color of the brush, so that when you click your mouse, you ll get a different colored dot. GraphicsWindow.BrushColor = Blue GraphicsWindow.MouseDown = OnMouseDown GraphicsWindow.KeyDown = OnKeyDown Sub OnKeyDown GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor() EndSub Sub OnMouseDown x = GraphicsWindow.MouseX - 10 y = GraphicsWindow.MouseY - 10 GraphicsWindow.FillEllipse(x, y, 20, 20) EndSub Figure 4 - Handling multiple events If you ran this program and clicked on the window, you ll get a blue dot. Now, if you press any key once and click again, you ll get a different colored dot. What s happening when you press a key is that the subroutine OnKeyDown gets executed which changes the brush color to a random color. After that when you click the mouse, a circle is drawn using the newly set color giving the random color dots.