Prezentarea Limbajului Logo

Cap. 1. Introducere în LOGO

1.1. LOGO – un limbaj serios ?

Răspunsul la această întrebare constituie prima surpriză furnizată de LOGO și, totodată, un prim element care particularizează acest limbaj printre toate celelalte: LOGO nu a fost conceput ca un instrument pentru profesioniștii calculatoarelor, ci pentru copii. Altfel spus, LOGO provine dintr-un demers pedagogic, iar Harold Abelson o spune într-un mod foarte concis: “Logo este un nume pentru o filosofie a educației și pentru o familie în continuă evoluție de limbaje de programare care ajută la realizarea acesteia”.

Chiar dacă a fost conceput pentru copii, LOGO este extrem de elegant, puternic și … simpatic. Este însă obligatoriu să amintim (pe scurt, desigur) câteva repere din istoria sa de peste 30 de ani.

1.2. Scurt istoric

Totul a pornit de la studiile unui psiholog elvețian, pe nume Jean Piaget, privind mecanismele învățării la copii. Rezultatele sale s-au constituit într-o nouă teorie a educației, numită constructivism, care a revoluționat știința pedagogică. Pe scurt, constructivismul consideră cunoașterea ca fiind produsul creației intelectuale a celui care învață, rezultând din interacțiunea acestuia cu oamenii și mediul înconjurător. Pare foarte natural, dar adesea practica pedagogică neglijează încă acest adevăr simplu: învățarea este un act de creație, nu de memorare. Transpunerea în practică a teoriei lui Piaget avea deci nevoie de instrumente specifice.

Pe la mijlocul anilor ’60, un matematician care lucrase cu Piaget ajunge în Statele Unite. Și nu oriunde, ci tocmai la MIT (Massachusetts Institute of Technology), o adevărată Mecca a informaticii. Numele său: Seymour Papert. La MIT, Papert înființează, împreună cu Marvin Minsky, Laboratorul de Inteligență Artificială, care devine curând incubatorul unor realizări excepționale. Aici, împreună cu o echipă de specialiști, Papert realizează în 1967 prima versiune de LOGO, un limbaj de programare care își propune să fie un instrument didactic în sensul teoriei lui Piaget, un instrument care să stimuleze tocmai acea creație intelectuală care stă la baza învățării.

LOGO se bazează pe un limbaj de programare – folosit intens în Inteligența Artificială – numit LISP (programatorii profesioniști încă îl mai consideră un dialect al acestuia). De la LISP a moștenit LOGO flexibilitatea și puterea calculului simbolic, care l-au recomandat pentru numeroase proiecte avansate în matematică, lingvistică, robotică, muzică și alte domenii. Spre deosebire însă de LISP, LOGO a fost gândit ca un “instrument pentru învățare”, deci trebuia să fie în primul rând accesibil nespecialiștilor (chiar și copiilor), să fie expresiv și, mai ales, simplu.

La sfărșitul anilor ’70 apar calculatoare personale și primele implementări pentru LOGO pentru acestea (mai întâi Apple II și Texas Instruments TI 99/4). Răspândirea PC-urilor în deceniul următor va aduce cu sine utilizarea limbajului pe scară largă în multe școli din întreaga lume.

Sigur, se pune întrebarea privitoare la motivul care a stat la baza creării unui nou limbaj de programare în momentul în care exista, deja, la dispoziția utilizatorilor o multitudine de limbaje de programare. Răspunsul este legat de faptul că fiecare limbaj de programare, prin facilitățile și lipsurile sale, favorizează formarea și utilizarea unui stil propriu de a realiza programe, dar nici unul nu reprezintă o bază optimă – care să stimuleze la maxim calitățile care sălășluiesc în stare latentă la copii, cum sunt: capacitatea de modelare și rezolvare de probleme și spiritul de explorare.

În plus, unele din limbajele de programare alese pentru inițiere în informatică (datorită comodității lor în utilizare) conduc către un stil în disonanță cu stilurile moderne de programare, clare și eficiente. Limbajul LOGO, în schimb, are încorporate toate conceptele moderne care s-au impus în ultimii ani în informatică. Astfel, LOGO permite, pe lângă uzualele calcule aritmetice, și manipularea cu ușurință și naturalețe a cuvintelor și frazelor, fiind astfel adaptat explorării limbajelor naturale și artificiale. În plus, o mare parte a succesului limbajului LOGO rezidă în facilitățile sale grafice. Aceste facilități cunoscute sub numele de “TURTLE GRAPHICS” sunt implementate în toate limbajele moderne și permit atât realizarea de către începători (chiar copii mici) a unor desene, cât explorarea unor concepte de matematică avansată (analiză, topologie, algebră, geometrie diferențială, mecanică clasică și chiar relativistă etc.).

Cap. 2. Utilizarea limbajului

2.1. Proceduri

Ca și în alte limbaje de programare și în Logo, programele pot fi structurate cu ajutorul procedurilor. Practic un program realizat în Logo este de fapt compus din una sau mai multe proceduri. Un exemplu foarte simplu de procedură ar fi :

(1) to salut

(2) print [hello world!]

(3) end

Astfel am definit o procedură (în acest caz este o comandă) care, atunci când este invocată, afișează mesajul “hello world!”. Înainte de a ne ocupa mai îndeaproape de semnificația liniilor de mai sus, trebuie menționat faptul că definirea procedurilor nu se face în mod conversațional. Este vorba de o editare de text similară cu cea a surselor pentru alte limbaje de programare. Editorul se poate lansa prin comanda edit urmată de numele procedurii pe care vrem să o edităm sau din meniul File opțiunea Edit.

Să revenim la exemplul dat. Linia (1) reprezintă antetul definiției, constând din comanda to, urmată de numele pe care îl dăm procedurii (în cazul nostru salut) și, dacă e cazul, de parametrii formali ai procedurii.

Ultima linie a definiției conține, obligatoriu, doar cuvântul end. Între prima și ultima linie se desfășoară o succesiune de instrucțiuni, care constituie corpul definiției. În cazul nostru, corpul definiției este format dintr-o singură linie (2), cuprinzând o singură comandă.

De îndată ce definiția a fost încheiată, ea poate fi utilizată fie în regim conversațional, fie pentru a defini alte proceduri. Procedurile, împreună cu alte elemente pe care le-am definit (de pildă variabilele), formează contextul sesiunii, sau spațiul de lucru (workspace). Acesta poate fi salvat (prin comanda save) și restaurat apoi într-o altă sesiune de lucru (prin comanda load).

Desigur, procedurile nu prea sunt utile fără argumente. Să definim deci o procedură cu un argument:

(1) to inc :in

(2) output :in + 1

(3) end

Argumentul este o variabilă locală procedurii (adică: vizibilă doar pentru instrucțiuni din corpul acesteia) care se declară în cadrul comenzii to, imediat după numele procedurii. Numele pe care i-l atribuim este la alegerea noastră (în acest caz este in – remarcăm convenția prin care numele trebuie precedat de caracterul “:”) iar valoarea cu care este inițializată este cea pe care o primește la apel:

print inc 23

24

Procedura output are ca efect încheierea execuției procedurii în care apare și returnarea către interpretor a valorii argumentului său – în cazul de mai sus 23+1, deci 24. Este interesant faptul că output este o comandă (deci nu poate să apară ca argument al unei proceduri), dar procedura în care apare este o funcție. O comandă înrudită cu output este stop, care încheie execuția procedurii în care apare, dar nu determină returnarea unei valori.

Așa cum am definit o procedură cu un argument se pot defini proceduri cu mai multe argumente, ele având forma următoare:

to nume_procedură :arg1 :arg2 :arg3 …

; corpul procedurii

end

Argumentele se scriu după numele procedurii având ca delimitator caracterul spațiu. Se observă în corpul procedurii apariția caracterului “;”. El semnifică apariția unui comentariu scris de către utilizator.

2.2. Variabile

Ca în orice limbaj de programare și în Logo există variabile. Acestea din punct de vedere al locului în care se folosesc sunt de două tipuri: locale și globale.

Variabilele care apar ca parametri de intrare într-o procedură sunt create de procedură în momentul apelării și folosite în timpul executării procedurii respective; la terminarea procedurii, aceste variabile sunt “distruse”, deci nu mai putem utiliza conținutul lor. Din acest motiv, variabilele care sunt declarate ca parametri de intrare în proceduri se mai numesc și variabile locale.

Deoarece variabilele locale sunt create de fiecare procedură, se poate utiliza același nume de variabilă locală în diferite proceduri, fără ca prin aceasta să se creeze confuzii. De exemplu, putem folosi numele LATURĂ pentru latura pătratului, ca și pentru latura triunghiului, ca parametru de intrare declarat în titlul ambelor proceduri; fiecare procedură rezervă și utilizează variabila sa locală cu numele respectiv.

Totuși sunt situații când am vrea ca o aceeași variabilă să poată fi utilizată de mai multe proceduri independente sau chiar de unele comenzi Logo din afara procedurilor. O astfel de variabilă ar fi, deci globală.

Variabilele globale pot fi create în proceduri sau în afara lor cu ajutorul instrucțiunii MAKE. Forma generală a instrucțiunii MAKE este:

MAKE “nume expresie

Unde nume este al variabilei, iar ca expresii putem pune, deocamdată:

un număr întreg;

un număr zecimal (scris cu . în loc de ,);

conținutul unei variabile care a fost creată anterior;

mai multe numere sau variabile legate între ele cu semne de operații aritmetice.

Instrucțiunea MAKE creează variabila cu numele respectiv și depune la adresa corespunzătoare (din memorie) ceea ce urmează după numele variabilei; deoarece este vorba de “adresa de destinație” a unei valori, aici înaintea numelui variabilei se pun ghilimele (“). Pentru a folosi valoarea pe care o are o anumită variabilă trebuie ca înaintea numelui variabilei să fie puse “:”.

După cum am văzut parametrii de intrare ai procedurilor sunt considerate variabile locale. În afară de acestea avem posibilitatea ca, în cadrul unei proceduri să putem defini în corpul procedurii și alte variabile locale. Acestea se pot defini cu ajutorul instrucțiunii LOCALMAKE a cărei sintaxă este asemănătoare cu a instrucțiunii MAKE.

LOCALMAKE “nume expresie

deci, variabila cu numele nume va avea ca valoare expresie și va fi folosită numai în interiorul procedurii în care a fost definită.

2.3. Structuri de date

2.3.1. Generalități

În LOGO există următoarele structuri de date: cuvinte (printre care se află și numerele), liste, tablouri, stive și cozi.

Trebuie spus că variabilele în LOGO nu sunt tipizate astfel încât s-ar putea crede că – structurile de date pe care le are acest limbaj oferă prea puține posibilități pentru a reprezenta structuri de date complexe.

În primul rând trebuie arătat că listele se pretează foarte bine atât la reprezentarea structurilor liniare, cât și a celor arborescente. Iată două exemple:

[ Vasile Barbu 37 M [ Ploiești ] [ Fictiv Srl ] ]

[ Bogdan [ Alex [ Vasile Maria ] Ioana [ Valentin Valeria ] ] ]

În primul exemplu este vorba de o structură liniară, de tip “articol“ (record), în timp ce în al doilea este vorba despre o structură arborescentă (mai precis: este un arbore genealogic, reprezentat ca un arbore binar pe trei niveluri).

Desigur, aceste construcții pot fi îmbinate în cele mai diverse moduri. Dacă mai adăugăm și abilitatea lui LOGO de a manevra fișiere, posibilitățile de reprezentare a structurilor de date nu mai par atât de sărace.

Este demn de semnalat că este relativ ușor de a construi (un fel de) tipuri de date, înțelegând prin aceasta structuri de date însoțite de seturi de operații asociate acestora. De pildă, stiva (stack) și coada (queue) sunt furnizate de LOGO, prin intermediul operațiilor specifice (push și pop pentru stivă, queue și dequeue pentru coadă) care sunt funcții de bibliotecă predefinite. O altă structură de date este tabloul, acesta fiind asemănător cu o listă, dar care are un număr finit de elemente. Dar despre toate acestea vom vorbi mai pe larg în cele ce urmează.

Pentru a ințelege mai bine exemplele ce vor urma trebuie definită comanda show

(SHOW thing1 thing2 …)

comaanda show

(SHOW thing1 thing2 …)

comandă care afișează thing1 thing2 … cu excepția cazului în care una dintre intrări (thing) este o listă, fapt care determină afișarea acesteia intre paranteze.

2.3.2. Constructori:

word (WORD word1 word2 word3 …)

returnează un cuvânt format prin concatenarea a două sau mai multe cuvinte, în cazul de față word va fi format prin concatenarea cuvintelor word1, word2, word3 … .

Exemplu:

show (word "a "o "k "to)

aokto

list (LIST thing1 thing2 thing3 …)

returnează o listă ale cărei componente sunt formate din obiecte Logo (cuvinte, liste sau șiruri). Deci list va fi o listă formată din thing1, thing2, thing3, … , acestea din urmă putând fi orice obiect Logo.

Exemplu:

show (list "This "is "a "List)

[This is a List]

list (SENTENCE thing1 thing2 thing3 …)

returnează o listă (list) ale cărei componente sunt formate din thing1, thing2, thing3, … dacă acestea nu sunt liste sau returneaza componentele obiectelor thing1, thing2, thing3, … dacă acestea sunt liste.

Exemplu:

show (se "A "Sentence "is "simply "a "list "of "words)

[A Sentence is simply a list of words]

newlist FPUT thing list

returnează o nouă listă (newlist) obținută prin adăugarea la început a obiectului thing în lista list.

Exemplu:

show fput 1 [2 3 4]

[1 2 3 4]

newlist LPUT thing list

returnează o nouă listă (newlist) obținută prin adăugarea la sfârșit a obiectului thing în lista list.

Exemplu:

show lput 5 [1 2 3 4]

[1 2 3 4 5]

array (ARRAY size origin)

returnează un șir (array) de size elemente unde indexul primului element din șir este dat de origin. Size trebuie să fie un număr întreg pozitiv iar origin trebuie să fie un număr întreg. Elementele șirului pot fi selectate cu ITEM și schimbate cu SETITEM.

Exemplu:

make "myarray (array 3 0)

setitem 2 :myarray 1

setitem 1 :myarray 2

setitem 0 :myarray 3

show :myarray

{3 2 1}

mdarray (MDARRAY sizelist origin)

returnează un șir multi-dimensional (mdarray), unde sizelist este o lista de două sau mai multe elemente întregi pozitive care reprezintă dimensiunea șirului iar origin, dacă apare, trebuie să fie un număr intreg care va spune de unde se începe indexarea elementelor pentru fiecare dimensiune. Selectarea elementelor se va face cu MDITEM iar schimbarea lor cu MDSETITEM.

Exemplu:

make "myarray (mdarray [2 3] 0)

mdsetitem [0 0] :myarray 1

mdsetitem [0 1] :myarray 2

mdsetitem [0 2] :myarray 3

mdsetitem [1 0] :myarray 4

mdsetitem [1 1] :myarray 5

mdsetitem [1 2] :myarray 6

show :myarray

{{1 2 3} {4 5 6}}

array LISTTOARRAY list

returnează un șir (array) ale cărui număr de elemente este egal cu numărul de elemente al listei list , fiind format din elementele listei list. Practic convertește o lista la un șir de elemente.

Exemplu:

show listtoarray [1 2 3]

{1 2 3}

list ARRAYTOLIST array

returnează o listă (list) ale cărei număr de elemente este egal cu numărul de elemente al șirului array , fiind format din elementele șirului array. Practic convertește un șir la o lista de elemente.

Exemplu:

show arraytolist {1 2 3}

[1 2 3]

newlist REVERSE list

returnează o listă (newlist) ale cărei elemente sunt elementele listei list dar în ordine inversă.

Exemplu:

show reverse [1 2 3]

[3 2 1]

2.3.3. Selectori:

firstthing FIRST thing

dacă thing este un cuvânt atunci firstthing va fi primul caracter din cuvânt;

dacă thing este o listă atunci firstthing va fi primul element al listei;

dacă thing este un șir atunci firstthing va fi primul element al șirului.

Exemplu:

print first [1 2 3]

1

print first "Hello

H

firstslist FIRSTS list

în cazul în care list este o listă de mai multe liste atunci firstlist va fi o listă formată din primele elemente ale listelor care sunt conținute în lista list.

Exemplu:

show firsts [[1 2 3] [a b c]]

[1 a]

lastthing LAST thing

dacă thing este un cuvânt atunci lastthing va fi ultimul caracter din cuvânt;

dacă thing este o listă atunci lastthing va fi ultimul element al listei;

dacă thing este un șir atunci lastthing va fi ultimul element al șirului.

Exemplu:

print last [1 2 3]

3

print last "Hello

o

newthing BUTFIRST thing

dacă thing este un cuvânt atunci butfirst returnează un cuvânt format din toate caracterele cuvântului thing mai puțin primul caracter;

dacă thing este o listă atunci newthing va fi o listă formată din membrele listei thing mai putin primul membru.

Exemplu:

show butfirst [1 2 3]

[2 3]

show butfirst "Hello

ello

newthing BUTLAST thing

dacă thing este un cuvânt atunci butfirst returnează un cuvânt format din toate caracterele cuvântului thing mai puțin ultimul caracter;

dacă thing este o listă atunci newthing va fi o listă formată din membrele listei thing mai putin ultimul membru.

Exemplu:

show butlast [1 2 3]

[1 2]

show butlast "Hello

Hell

item ITEM index thing

dacă thing este un cuvânt, ITEM returnează caracterul care se află pe poziția index din cuvântul thing;

dacă thing este o listă atunci ITEM returnează elementul din thing care se află pe poziția index;

dacă thing este un șir atunci ITEM returnează elementul de pe poziția index din șirul thing .

Exemplu:

show item 2 [a b c]

b

show item 3 "ABC

c

item MDITEM indexlist mdarray

returnează un element dintr-un șir multi-dimensional (mdarray) care este dat de lista de numere indexlist, valoarea acestuia fiind reținută în item.

Exemplu:

show mditem [2 2] {{0 1} {2 3}}

3

item PICK thing

returnează un element ales la întâmplare din thing.

Exemplu:

show pick [1 2 3]

2

show pick [1 2 3]

3

show pick "Hello

e

newthings REMOVE thing things

returnează un obiect Logo de același tip cu things din care s-au eliminat toate elementele care sunt egale cu thing.

Exemplu:

show remove "b [a b c b]

[a c]

show remove "e "Hello

Hllo

newthings REMDUP things

returnează un obiect Logo de același tip cu things din care s-au eliminat toate elementele care se repetă.

Exemplu:

show remdup [a b c b]

[a c b]

show remdup "Hello

Helo

2.3.4. Comenzi pentru schimbarea valorilor unor date

SETITEM index array value

Comandă care înlocuiește elementul de pe locul index din șirul array cu valoarea value.

Exemplu:

make "myarray (array 3 0)

setitem 2 :myarray 1

setitem 1 :myarray [2]

setitem 0 :myarray 3

show :myarray

{3 [2] 1}

MDSETITEM indexlist mdarray value

Comandă care actualizează elementul de pe poziția dată de indexlist din șirul multi-dimensional mdarray cu noua sa valoare value.

Exemplu:

make "myarray (mdarray [2 3] 0)

mdsetitem [0 0] :myarray 1

mdsetitem [0 1] :myarray 2

mdsetitem [0 2] :myarray 3

mdsetitem [1 0] :myarray 4

mdsetitem [1 1] :myarray 5

mdsetitem [1 2] :myarray 6

show :myarray

{{1 2 3} {4 5 6}}

PUSH stackname thing

Comandă care adaugă la o stivă a cărei nume este stackname un obiect Logo thing. O stivă trebuie să aibă o listă ca valoare iar valoarea sa inițială trebuie să fie listă vidă. Noile membre ale stivei sunt adăugate la începutul listei. Mai târziu putem extrage elementele stivei cu comanda POP.

Exemplu:

make "mystack [ ]

push "mystack 1

push "mystack 2

show :mystack

[2 1]

show pop "mystack

2

show pop "mystack

1

thing POP stackname

returnează ultimul obiect care a fost introdus în stiva cu nume stackname și elimină obiectul din stivă. Spunem ca are loc o extragere, thing având valoarea elementului extras. Se poate vedea exemplul de la comanda PUSH.

2.3.5 Predicate:

truth WORDP thing

returnează TRUE dacă obiectul Logo thing este un cuvânt și FALSE în caz contrar.

Exemplu:

show wordp "Hello

true

show wordp [Hello]

false

truth LISTP thing

returnează TRUE dacă obiectul Logo thing este o listă și FALSE în caz contrar.

Exemplu:

show listp "Hello

false

show listp [Hello]

true

truth ARRAYP thing

returnează TRUE dacă obiectul LOGO thing este un șir și FALSE în caz contrar.

Exemplu:

show arrayp [Hello]

false

show arrayp {Hello}

true

truth EMPTYP thing

returnează TRUE dacă obiectul LOGO thing este o listă vidă sau un cuvânt vid și FALSE în caz contrar.

Exemplu:

show emptyp [1 2 3]

false

show emptyp [ ]

true

truth EQUALP thing1 thing2

returneaza TRUE dacă cele două obiecte LOGO thing1 și thing2 sunt egale și FALSE în sens contrar. Două numere sunt egale dacă au aceeași valoare numerică. Două cuvinte non-numerice sunt egale dacă ele conțin aceleași caractere în aceeași ordine. Dacă variabila numită CASEIGNOREDP are valoarea true atunci literele mari sunt considerate aceleeași cu literele mici. Două liste sunt egale dacă elementele lor constituiente sunt identice. Trebuie spus că nu se întâmplă același lucru și cu șirurile. Un șir este egal numai cu el însuși. Două șiruri create separat nu sunt niciodată egale chiar dacă elementele lor coincid.

Exemplu:

show equalp 1 1

true

show equalp 1 2

false

show equalp [1 2 3] [1 2 3]

true

show equalp [1 2 3] [3 2 1]

false

truth MEMBERP thing1 thing2

Dacă thing2 este o listă, MEMBERP returnează TRUE dacă thing1 este egal cu un membru al lui thing2 și false în caz contrar.

Dacă thing2 este un cuvânt MEMBERP returnează TRUE dacă thing1 este un subșir al lui thing2 și false în caz contrar.

Exemplu:

show memberp 1 [1 2 3]

true

show memberp 4 [1 2 3]

false

truth NUMBERP thing

returnează TRUE dacă obiectul LOGO thing este un număr și FALSE în caz contrar.

Exemplu:

show numberp 1

true

2.3.6. Alte comenzi care se pot aplica unor structuri de date (QUERIES):

number COUNT thing

returnează în variabila number numărul de caractere al obiectului LOGO thing, dacă acesta este un cuvânt; iar dacă thing este un șir sau o listă variabila number va avea ca valoare numărul de elemente al șirului sau listei respective.

Exemplu:

count [1 2 3]

3

count "ab

2

number ASCII character

returnează un număr între 0 și 127 ce reprezintă codul ASCII al caracterului character .

Exemplu:

show ascii "a

97

show ascii "A

65

character CHAR number

returnează un caracter al cărui cod ASCII este dat de number.

Exemplu:

show char 97

a

show char 65

A

list TIME

returnează timpul curent al sistemului ca o listă de cuvinte.

Exemplu:

show time

[Wed Jul 14 23:34:08 1993]

number TIMEMILLI

returnează timpul care a trecut de la apelarea acestuia până la afișare în milisecunde.

Exemplu:

make "start timemilli

repeat 36 [ellipse 100 200 rt 5]

show timemilli – :start

8189

2.4. Operații numerice

MSWLogo suportă toate operațiile uzuale pentru numere : adunare, scădere, înmulțire și împărțire, precum și altele.

num MODULO num1 num2

num va avea ca valoare restul împărțirii lui num1 la num2.

int INT num

int va avea ca valoare num din care se scade partea fracționară, adica un întreg care are același semn cu num și a cărui valoare absolută este cel mai mare întreg mai mic sau egal cu valoarea absolută a lui num.

int ROUND num

int va avea ca valoare cel mai apropriat întreg fată de num.

num ABS num1

num va avea ca valoare, valoarea absolută a lui num1.

int SIGN num

int va avea valoarea 1 dacă num este strict mai mare decât 0, 0 dacă num este egal cu 0, și –1 dacă num este strict mai mic decât 0.

num SQRT num1

num va avea ca valoare radicalul numărului num1.

num POWER num1 num2

num va avea ca valoare num1 ridicat la puterea num2.

num EXP num1

num va avea ca valoare numărul e (2.718281828+) la puterea num1.

num LOG10 num1

num va avea ca valoare logaritm în baza 10 din num1.

num LN num1

num va avea ca valoare logaritm în baza e din num1.

num PI

returnează valoarea lui (3.141592653589793227020265931059839203954).

num SIN anglep

num va avea ca valoare sinusul unghiului dat de anglep care este dat în grade.

num RADSIN angle

num va avea ca valoare sinusul unghiului dat de angle care este dat în radiani.

Analog sunt definite COS, TAN, ARCTAN, ARCSIN, ARCCOS – care au argumentele date în grade ; și RADCOS, RADTAN, RADARCTAN, RADARCSIN, RADARCCOS care au argumentele date în radiani.

2.5. Instrucțiuni repetitive

FOR forcontrol instructionlist

Această comandă are două intrări. Prima (forcontrol) conține o listă cu trei sau patru membri:

un cuvânt, care poate fi folosit ca nume al variabilei locale;

un cuvânt sau o listă care poate fi evaluată pentru a determina un număr, și care reprezintă valoarea de start a variabilei;

un cuvânt sau o listă care poate fi evaluată pentru a determina un număr, și care reprezintă valoarea maximală pe care o poate avea variabila;

(opțional) un cuvânt sau o listă care poate fi evaluată pentru a determina un număr- care reprezintă mărimea pasului.

A doua intrare este o listă de comenzi sau proceduri care se execută repetat atâta timp cât variabila de control este mai mică decât valoarea maximală la care poate ajunge.

Exemplu:

for [i 2 7 1.5] [print :i]

2

3.5

5

6.5

WHILE tfexpressionlist instructionlist

Această comandă execută repetat comenzile sau procedurile aflate în instructionlist atâta timp cât evaluarea expresiei tfexpressionlist rămâne TRUE. Astfel instructionlist nu se poate executa niciodată dacă evaluarea expresiei tfexpressionlist este FALSE. Expresia tfexpressionlist trebuie neapărat să aibă valoarea TRUE sau FALSE.

Exemplu:

make "i 0

while [:i<3] [make "i :i+1 print :i]

1

2

3

DO.UNTIL instructionlist tfexpressionlist

Această comandă execută repetat comenzile sau procedurile aflate în instructionlist atâta timp cât evaluarea expresiei tfexpressionlist rămâne FALSE. Astfel instructionlist se execută cel puțin o dată.

Exemplu:

make "i 0

do.until [make "i :i+1 print :i] [:i>3]

1

2

3

4

DO.WHILE instructionlist tfexpressionlist

Această comandă execută repetat comenzile sau procedurile aflate în instructionlist atâta timp cât evaluarea expresiei tfexpressionlist rămâne TRUE. Astfel instructionlist se execută cel puțin o dată.

Exemplu:

make "i 0

do.while [make "i :i+1 print :i] [:i<3]

1

2

3

REPEAT num instructionlist

Această comandă execută de num ori lista de instrucțiuni dată de instructionlist.

Exemplu:

repeat 2 [print (list "This "Is "loop repcount)]

This Is loop 1

This Is loop 2

2.6. Grafica țestoasei

De ce “țestoasei” ? Pentru că “dispozitivul” cu care se desenează în LOGO se cheamă turtle (broască țestoasă). Desenul fiind poarta principală în LOGO pentru copii, inventatorii limbajului au ales o personificare cât mai atractivă. În unele implementări (Superlogo, de exemplu), pe ecran chiar este desenată o țestoasă. Țestoasa în MSWLogo e reprezentată printr-un triunghi isoscel.

Ce face țestoasa ? Duce cu ea o peniță și ascultă de comenzi simple, de genul : du-te înainte 100 de pași (forward 100), întoarce-te cu 30 de grade spre dreapta (right 30) sau du-te la poziția dată prin coordonatele 200 și –50 (setxy 200 –50 sau setpos [200 –50]). Dacă penița este jos, în urma broaștei rămăne o linie. Țestoasa știe să manevreze penița pe baza unui alt set de comenzi simple: las-o jos (pendown), ridic-o (penup), pune-i cerneală galbenă (setpencolor [255 255 0]) și așa mai departe.

De fapt, modul de desenare este asemănător cu al unui plotter. Desigur, țestoasa știe să facă și lucruri pe care un plotter nu le poate face. De exemplu, să schimbe penița cu o radieră (penerase), după care, pe unde trece, șterge.

Din păcate, partea grafică are de a face cu dispozituvul de afișare al calculatorului și, ca urmare, apar foarte multe elemente care sunt dependente de hardware, tratate în mod diferit de diferite implementări, ceea ce reduce foarte mult portabilitatea programelor. Totuși, principiile sunt aceleași, așa că o studiere mai amănunțită a documentației care vine odată cu implementarea rezolvă toate problemele.

În implementarea MSWLogo “pașii” țestoasei sunt de fapt pixeli, iar culorile se codifică în model RGB, adică o culoare se reprezintă ca o listă cu trei elemente având valori de la 0 la 255. Primul element reprezintă “concentrația” de roșu, al doilea se referă la verde, iar al treilea la albastru. Forma peniței este dreptunghiulară, deci grosimea liniei se exprimă printr-o pereche de numere. A desena pătrate și cercuri nu este o treabă grea nici în alte limbaje. Grafica țestoasei însă abia de aici începe. Dacă ținem seama că în mai multe medii LOGO (printre care și MSWLogo) putem lucra cu mai multe țestoase deodată, că putem scrie text, că putem folosi imagini bitmap externe, că putem lucra direct în 3D – … LOGO devine cu atât mai mult atractiv. Despre toate acestea vom discuta în continuare în mod amănunțit.

2.6.1 Comenzi pentru mișcarea țestoasei

FORWARD dist

Mută țestoasa înainte în direcția în care aceasta este orientată, cu distanța specificată de dist (distanță măsurată în pixeli).

BACK dis

Mută țestoasa înapoi în direcția opusă direcției în care aceasta este orientată, cu distanța specificată de dis . Orientarea țestoasei nu se modifică.

LEFT angle

Rotește țestoasa în sens invers acelor de ceas, cu unghiul specificat de angle. Unghiul se dă în grade de la 1 la 360. (Rotește spre stânga)

RIGHT angle

Rotește țestoasa în sensul acelor de ceas, cu unghiul specificat de angle. (Rotește spre dreapta)

SETPOS pos

Mută țestoasa la coordonatele absolute date de pos. Pos este o listă de două numere X și Y, ce reprezintă cele două coordonate în plan.

SETPOSXYZ pos

Mută țestoasa la coordonatele absolute date de pos. Pos este o listă de trei numere X, Y și Z, ce reprezintă cele trei coordonate în spațiu. Această comanda se poate folosi atunci când lucrăm în modul perspective.

SETXY xcor ycor

Mută țestoasa la coordonate date de xcor și ycor.

SETXYZ xcor ycor zcor

Mută țestoasa la coordonate date de xcor, ycor și zcor. Această comandă se poate folosi doar când lucrăm în modul PERSPECTIVE.

HOME

Mută testoasa în centrul ecranului (acasă). Este echivalentă cu comanda setpos [0 0].

ELLIPSE minor major

Desenează o elipsă bazată pe poziția și orientarea țestoasei, precum și cele două argumente date. Mărimea elipsei este bazată pe cele două valori : minor și major. Poziția curentă a țestoasei va fi chiar centrul elipsei. Minor va reprezenta distanța cea mai mică de la elipsă la centrul acesteia, iar major va reprezenta distanța cea mai mare de la elipsă la centrul ei. Această comandă nu determină mișcarea țestoasei.

ARC angle radius

Desenează un arc de cerc bazat pe poziția și orientarea țestoasei, precum și cele două argumente date. Arcul va începe din spatele țestoasei și va ține atât cât este unghiul dat de angle. Raza arcului de cerc este dată de radius. Poziția curentă a țestoasei va fi chiar centrul arcului de cerc. Arc 360 radius va desena bineînțeles un cerc de rază radius.

CIRCLE radius

Desenează un cerc de rază radius al cărui centru este situat în pozitia curentă a țestoasei.

2.6.2 Comenzi care returnează diferite informații despre țestoasă

pos POS

returnează poziția curentă a testoasei ca o listă de două numere reprezentând coordonatele X și Y în plan.

pos POSXYZ

returnează poziția curentă a testoasei ca o listă de trei numere reprezentând coordonatele X, Y și Z în spatiu. Această comandă se poate folosi doar când lucrăm în modul PERSPECTIVE.

xcor XCOR

returnează coordonata X a țestoasei. Analog sunt definite YCOR și ZCOR, fiecare returnând coordonatele pentru care au fost definite (Y respectiv Z).

dist DISTANCE pos

returnează un număr (dist) care reprezintă distanța pe care țestoasa trebuie să o străbată în linie dreaptă pentru a ajunge la poziția dată de pos.

dist DISTANCEXYZ pos

este asemănătoare cu DISTANCE doar că aceasta rulează numai în modul PERSPECTIVE.

colorvector PIXEL

returnează o listă de numere ce reprezintă intensitatea de roșu, verde și albastru al pixelului pe care este poziționată țestoasa.

2.6.3 Comenzi pentru țestoasă și controlul suprafeței de desenare

SHOWTURTLE

Face ca țestoasa să fie vizibilă pe suprafața de desenare.

HIDETURTLE

Face ca țestoasa să fie invizibilă pe suprafața de desenare.

CLEARSCREEN

Șterge ecranul și aduce țestoasa la poziția și orientarea inițială.

clean

Șterge toate liniile pe care țestoasa le-a desenat pe suprafața de desenare. Caracteristicile țestoasei (poziția, orientarea, culoarea și mărimea peniței, etc.) vor rămâne neschimbate.

FILL

Umple o regiune din suprafața de desenare care conține țesoasa și este înconjurată de linii care au fost desenate anterior. Culoarea de umplere se poate seta cu comanda SETFLOODCOLOR colorvector, unde colorvector este o listă ce conține intensitatea culorilor roșu, verde și albastru.

LABEL text

Afișează text, care poate fi un cuvânt sau o listă, pe suprafața de desenare. Dacă text este o listă atunci orice sub-listă este delimitată de paranteze pătrate, dar întregul obiect nu este delimitat de paranteze. De reținut că originea șirului este colțul din stânga-sus al acestuia. Un alt lucru pe care trebuie să îl avem în vedere este că, caracteristicile textului depind de mărimea și orientarea țestoasei, de fontul și dimensiunile alese pentru acestea, precum și de proprietățile ecranului (sau a imprimantei). Cu alte cuvinte uneori textul poate fi desenat de la capul țestoasei uneori nu.

Culoarea textului poate fi setată prin comanda SETPENCOLOR.

Poziția textului este determinată de poziția țestoasei.

Fontul textului poate fi determinat de comanda SETLABELFONT.

Unghiul textului este determinat de orientarea țestoasei.

Mărimea textului poate fi determinată de comanda LABELSIZE.

SETPIXEL colorvector

Setează culoarea pixelului pe care este poziționată țestoasa. Deci colorvector este o listă ce cuprinde intensitatea culorilor roșu, verde și albastru.

2.7. Comenzi pentru crearea ferestrelor

WINDOWCREATE parent name title xpos ypos width height setup

Această comandă crează o fereastră. O fereastră este folosită ca un cadru de lucru unde noi putem adăuga mai târziu obiecte ale ferestrei sau controale. Astfel putem adăuga lucruri ca: butoane, bare de derulare etc.

parent – este un cuvânt care reprezintă numele ferestrei care deține noua fereastră;

name – este un cuvânt folosit pentru identificarea noii ferestre;

title – este o listă care reprezintă titlul ferestrei;

xpos – reprezintă poziția pe axa OX unde plasăm colțul din stănga-sus al ferestrei;

ypos – reprezintă poziția pe axa OY unde plasăm colțul din stănga-sus al ferestrei;

width – reprezintă lățimea în pixeli a noii ferestre;

height – reprezintă înălțimea în pixeli a noii fereste;

setup – reprezintă o listă de comenzi LOGO sau de nume de proceduri care sunt executate atunci când este creată fereastra.

Exemplu:

windowcreate "main "mywindow "mytitle 0 0 100 100 [ ]

WINDOWDELETE name

Această comandă va șterge fereastra al cărui nume este dat de name. Toate ferestrele copii precum și celelalte controale vor fi șterse.

Exemplu:

windowdelete "mywindow

DIALOGCREATE parent name title xpos ypos width height setup

Această comandă va crea o fereastră de dialog. Intrările pentru această comandă sunt identice cu cele de la WINDOWCREATE și au aceeași semnificație. Diferența dintre cele două comenzi este că la DIALOGCREATE fereastra creată nu va returna controlul decât atunci când ea este închisă. Așadar trebuie obligatoriu un buton de tip OK, END, CLOSE, CANCEL sau oricare altul care să apeleze comanda DIALOGDELETE.

Exemplu:

to mysetup

buttoncreate "mydialog "myok "OK 25 25 50 50 ~

[dialogdelete "mydialog]

end

dialogcreate "main "mydialog "mytitle 0 0 100 100 [mysetup]

DIALOGDELETE name

Această comandă va șterge fereastra de dialog al cărui nume este dat de name. Toate ferestrele copii precum și celelalte controale vor fi șterse.

BUTTONCREATE parent name label xpos ypos width height callback

Această comandă va crea un buton. Singura funcțiune a butonului este de a executa callback atunci când butonul este apăsat.

parent – este un cuvânt care reprezintă numele ferestrei care deține noul buton;

name – este un cuvânt folosit pentru identificarea noului buton;

label – este o etichetă care reprezintă titlul butonului;

xpos – reprezintă poziția pe axa OX unde plasăm colțul din stănga-sus al butonului;

ypos – reprezintă poziția pe axa OY unde plasăm colțul din stănga-sus al butonului;

width – reprezintă lățimea în pixeli al noului buton;

height – reprezintă înălțimea în pixeli al noului buton;

callback – reprezintă o listă de comenzi LOGO sau de nume de proceduri care sunt executate atunci când este apăsat butonul.

Exemplu;

windowcreate "main "mywindow "mytitle 0 0 100 100 []

buttoncreate "mywindow "myleft "Left 25 25 25 25 ~

[fd 2 lt 1]

buttoncreate "mywindow "myright "Right 50 25 25 25 ~

[fd 2 rt 1]

windowdelete "mywindow

BUTTONDELETE name

Această comandă va șterge butonul care are numele name.

BUTTONUPDATE name text

Această comandă va înlocui numele butonului (name), care apare pe acesta, cu text.

Asemănătoare cu aceste comenzi există și altele care se referă la LISTBOX, COMBOBOX, SCROLLBAR, GROUPBOX, CHECKBOX, RADIOBUTTON, dându-se astfel utilizatorului posibilitatea de a crea o interfață grafică puternică.

2.8. Comenzi pentru lucru cu obiecte de tip Bitmap

LOGO oferă un set de comenzi cu ajutorul cărora putem folosi fișiere de tip bitmap, și nu numai, chiar manipularea sub-imaginilor imaginii de pe ecran (tăiere, copiere, lipire, etc.), fapt care poate veni în ajutorul programatorilor, ușurându-le acestora munca în realizarea unor imagini și efecte deosebite (animație). Lucrul cu aceste comenzi este relativ destul de simplu și asta se poate vedea din examinarea celor prezentate în continuare.

BITLOAD bitmapname

Această comandă va încărca fișierul de tip Bitmap al cărui nume este dat de bitmapname pe suprafața de desenare.

Exemplu:

bitload "c:\\windows\\forest.bmp

BITSAVE bitmapname

Această comandă permite salvarea suprafeței de desenare sub forma unui fișier de tip Bitmap (Microsoft Windows Bitmap). Salvarea se face sub numele dat de bitmapname, iar fișierul rezultat poate fi văzut sau modificat de alte programe cum ar fi : PAINT, COREL DRAW și altele.

Exemplu:

bitsave "myfile.bmp

BITCUT width height

Această comandă va decupa o parte din suprafața de desenare și o va pune în memoria LOGO (Clipboard dacă BITINDEX este 0). Mai târziu putem lipi ceea ce este în memoria LOGO (sau Clipboard) pe suprafața de desenare. LOGO va tăia din suprafața de desenare începând de la poziția țestoasei cu lățimea dată de primul argument (width) și înălțimea dată de al doilea argument (height).

BITCOPY width height

Această comandă este asemănătoare cu BITCUT doar că BITCOPY în loc de a “tăia” doar copie o zonă dreptunghiulară din suprafața de desenare, imagine pe care o “pune” în memoria LOGO (sau Clipboard).

BITPASTE

Această comandă va “lipi” înapoi pe ecran ceea ce a fost copiat în memoria LOGO . Imaginea va fi lipită de la poziția țestoasei, țestoasa fiind în colțul din stânga jos.

GIFLOAD bitmapname

Această comandă va încărca fișierul de tip Gif (o imagine Bitmap compresată, în format Graphics Interchange Format) al cărui nume este dat de bitmapname pe suprafața de desenare. Formatul GIF a apărut în premierăîn 1987, fiind disponibil în două formate: GIF 87a și GIF 89a, fiind un format folosit mai ales pe Web, în cadrul paginilor Web.

GIFSAVE bitmapname

Această comandă permite salvarea suprafeței de desenare sub forma unui fișier de tip Gif.

2.9. Comenzi multimedia

Multimedia în LOGO se referă la faptul că noi, programatorii în LOGO putem manipula dispozitive ca player-ul pentru CD-ROM, placa de sunet – etc. Practic putem controla orice dispozitiv multimedia de care dispune Windows.

PLAYWAVE wavefile flags

Așa cum spune și numele comenzii, aceasta permite ascultarea unui fișier de tip wav. Numel fișierului este dat de wavefile. Flags este folosit pentru a indica cum anume dorim să ascultăm fișierul wave. Acesta poate avea una dintre valorile:

0 = controlul nu se retunează până când nu s-a terminat “melodia”;

1 = controlul se returnează imediat, chiar dacă “melodia” nu s-a terminat;

2 = nu se folosește sunetul inițial dacă cel specificat nu se poate găsi;

8 = “melodia” este cântată din nou până când altă “melodie” este “comandată”;

16 = nu se oprește o melodie care deja cântă.

Aceste flag-uri pot fi combinate însumându-le împreună.

Exemplu:

playwave "c:\\windows\\tada.wav 1+8

status MCI mci-command-list

această comandă deschide o ușă pentru a permite limbajului LOGO să controleze dispozitive multimedia cum ar fi : placa de sunet, player pentru CD-ROM, filme VIDEO și multe altele. MCI (Media Control Interface) poate sau nu poate returna o listă cu diferite informații (status) în funcție de comenzile pe care aceasta le primește în mci-command-list . Practic MCI este o interfață pentru comenzi multimedia. Folosind MCI aplicația noastră poate controla dispozitivele multimedia prin simple comenzi ca: open, play și close. Comenzile respective fac parte din mci-command-list .

open device [alias device_alias][shareable][type device_type][notify][wait]

Această comandă inițializează un dispozitiv dat de device.

alias device_alias

– specifică un alias (device_alias)pentru dispozitivul respectiv. Dacă se specifică atunci acesta este folosit ca id pentru celelalte comenzi care se referă la dispozitiv;

Shareable

permite dispozitivului să poată fi folosit și de alte aplicații;

type device_type

specifică tipul dispozitivului (device_type);

notify

anunță atunci când a terminat lucrul cu dispozitivul respectiv;

wait

– în cazul în care dispozitivul este ocupat se așteaptă eliberarea acestuia.

play device_id [from position][to position][notify][wait]

Această comandă pornește dispozitivul care are id-ul device_id.

from position

specifică poziția de start al playback-ului. Dacă parametrul from nu este specificat playback-ul începe de la poziția curentă.

to position

specifică poziția de sfârșit al playback-ului. Dacă parametrul to nu este specificat playback-ul se termină la șfârșit.

notify și wait au aceeași semnificație ca la open.

close device_id [notify] [wait]

această comandă închide dispozitivul care are id-ul device_id.

Exemplu de utilizare a interfeței MCI:

print mci [open c:\\windows\\tada.wav type waveaudio ~

alias wa1]

mci [seek wa1 to start]

mci [play wa1 wait]

mci [close wa1]

Această succesiune de comenzi permite ascultarea unui fișier wav. Observăm că este mai simplu de ascultat un fișier wav folosind comanda playwave, dar aceasta nu ne oferă un control mai fin asupra playback-ului.

Folosirea acestor interfeței MCI cere mai multă experiență din partea utilizatorului, dar simplu fapt că LOGO ne permite utilizarea directă a dispozitivelor multimedia face ca acest limbaj să fie privit cu alți ochi de către cei care spun că acesta este pentru cei neinițiați în ale programării. Și acesta este numai unul din motivele pentru care LOGO poate fi folosit chiar și de către studenții aflați în an terminal.

Cap. 3. Mediul de lucru MSWLogo

3.1. Generalități

MSWLogo este o versiune pentru Windows dezvoltată de George Mills pe baza nucleului Berkeley Logo, pe care l-a extins cu elemente multimedia și de comunicații, precum și cu posibilități de a realiza aplicații Windows interactive. Există versiuni pe 16 biți pentru Windows 3.x și pe 32 de biți pentru Windows 95/NT. Cuprinde un manual de help și exemple. Este disponibilă și o versiune în format Word a documentației (coincide cu help-ul – cuprinde integral documentația pentru UCBLogo).

MSWLogo este un interpretor de comenzi, fapt care încetinește procesul de execuție, dar care are avantajul de a nu cere o completă compilare pentru fiecare schimbare oricât de mică ar fi. Fiind un interpretor de comenzi este ideal pentru un proces de învățare activă.

Prin succesul înregistrat, prin răspândirea sa din ce în ce mai mare, prin revoluționarea sistemelor instrucționale, LOGO a depășit granițele unui limbaj obișnuit de programare, devenind un nou stil, o nouă paradigmă de gândire și de învățare.

3.2. Interfața grafică

3.2.1 Intrarea și ieșirea din MSWLogo

Pentru a lansa interpretorul MSWLogo trebuie doar apăsat un click pe icon-ul MSWLogo (bineînțeles că mai întâi trebuie instalat MSWLogo). Pentru a ieși din acest mediu de programare se poate tasta comanda bye sau din meniul File alegem opțiunea Exit.

3.2.2. Opțiuni pentru linia de comandă

Opțiunile pentru linia de comandă pot fi setate ca proprietăți pentru icon-ul MSWLogo. Pentru aceasta pot fi adăugate la linia de comanda dupa LOGO.exe următoarele opțiuni:

-w lățime – seteaza lățimea spațiului de lucru virtual la “lățime”

-h înălțime – seteaza înalțimea spațiului de lucru virtual la “înălțime”

-f – spațiul de lucru virtual nu va avea bare de derulare, fereastra de lucru având dimensiuni fixe

-p – activează modul de lucru “Perspective” , lucru în spațiu tri-dimensional

-e – activează modul “Expert” ce permite mai multe sesiuni de editare dar care poate duce la erori în cazul în care utilizatorul este începător în programare

-l file1 file2 – permite ca la pornirea mediului MSWLogo să fie încărcate unul sau mai multe fișiere (“file1” , “file2”). Acestea vor fi încărcate înainte ca interpretorul să citească comenzi de la centrul de comandă.

Exemplu :

Logo.exe –f –w 1024 –h 750 –l proiect.lgo

va avea ca efect lansarea mediului de lucru MSWLogo într-o fereastră fără bare de derulare, având dimensiunea spațiului de lucru virtual 1024*750 și încărcarea fișierului proiect.lgo.

3.2.3. Meniuri disponibile în MSWLogo

Acestea au comenzi de nivel înalt, precum ar fi încărcarea unui program LOGO, încărcarea unei imagini Bitmap, setarea imprimantei, citirea help-ului, etc. Meniurile sunt:

Meniul File

New – șterge toate procedurile curente care sunt încărcate în memorie și începe o nouă sesiune de lucru.

Load – permite încărcarea procedurilor de pe unitatea magnetică în memorie pentru a fi executate sau editate.

Save – salvează tot ce este încărcat în memorie pe disc.

Save as – are aceeași acțiune ca Save dar permite salvarea sub un nume ales de utilizator.

Edit – permite editarea unor proceduri. Se vor afișa toate procedurile existente în memorie pentru ca utilizatorul să poată alege una dintre ele sau o procedură nouă pentru editare.

Erase – permite ștergerea unor proceduri încărcate în memorie. Se vor afișa toate procedurile existente pentru ca utilizatorul să poată alege una dintre ele sau toate pentru ștergere.

Exit – se iese din mediul de programare MSWLogo.

Meniul Bitmap

New – șterge tot ce apare în zona de lucru și crează un nou mediu de lucru.

Load – permite încărcarea unei imagini Bitmap care a fost salvată în trecut.

Save – permite salvarea a tot ceea ce apare în zona de lucru sub forma unui fișier Bitmap care poate fi folosit ulterior ca wallpaper sau în alte rațiuni.

Save as – are aceeași acțiune ca Save, dar permite salvarea sub un nume ales de utilizator.

Print – trimite la imprimantă tot ceea ce apare în zona de lucru pentru tipărire.

Print setup – permite setarea imprimantei înainte ca aceasta să fie folosită.

Active area – permite selectarea zonei de lucru care va fi imprimată sau salvată. De asemenea permite și setarea numărului de pixeli pe inch (rezoluția).

Meniul Set

PenSize – permite ajustarea mărimii peniței cu care “broscuța” va desena.

Label Font – permite selectarea fontului cu care comanda LABEL va afișa pe ecran.

Commander Font – permite selectarea fontului folosit de centru de comenzi. Acest font va rămâne setat chiar și după de MSWLogo a fost restartat.

PenColor – selectează culoarea peniței.

FloodColor – selectează culoarea de umplere pe care “broscuța” o folosește atunci când întâlnește comanda Fill

ScreenColor – selectează culoarea zonei de lucru (a ecranului).

Meniu Zoom

In – dublează factorul de mărire.

Out – reduce la jumătate factorul de mărire.

Normal – resetează factorul de mărire la 1.0 .

Meniul Help

Index – folosește Microsoft Windows Help pentru LOGO.

MCI – help pentru MCI (Media Control Interfaces – o serie de comenzi cu ajutorul cărora limbajul LOGO poate să controleze dispozitive multimedia cum ar fi : placa de sunet, player pentru CD-ROM, filme VIDEO și multe altele).

Demo – execută un program demo din biblioteca LOGO.

Tutorial – execută un program “tutorial” din biblioteca LOGO.

Examples – folosește NotePad pentru a prezenta exemplele care au fost livrate odată cu LOGO.

Release Notes – folosește NotePad pentru a prezenta noțiuni generale despre MSWLogo (cerințe minime de instalare, surse folosite, etc.)

About – informații despre versiunea MSWLogo.

3.2.4. Editorul de proceduri

Pentru a putea edita o procedură există două posibilități: ori introducem de la centrul de comenzi comanda edit “nume_procedură ori din meniul file alegem opțiunea Edit (care ne oferă diferite posibilități: edităm o procedură nouă, edităm o procedură deja creată sau edităm toate procedurile existente în același timp).

Editorul ne oferă diferite posibilități, toate acestea găsindu-se în meniurile sale.

Meniul File ne permite salvarea sau nu a spațiului de lucru precum și imprimarea acestuia.

Meniul Edit ne oferă posibilități de editare cum ar fi: anularea ultimei acțiuni, copierea unui text în clipboard și ștergerea acestuia, copierea unui text în clipboard, lipirea unui text aflat în clipboard la poziția curentă a cursorului, ștergerea unui text selectat și ștergerea întregului text.

Meniul Set Font conține o opțiune pentru schimbarea fontului folosit la editare. Fontul ales va rămâne setat chiar și după ce MSWLogo a fost restartat.

Meniul Test ne oferă posibilitatea de a testa codul selectat.

Meniul Help ne oferă informații despre editor, comenzi și Logo în general.

În cazul în care salvăm tot ceea ce este în editor și există o eroare de tipul: lipsește o paranteză “ ] ” sau caracterul de continuare “ ~ ” se va reintra în editor, iar cursorul va fi poziționat la începutul definiției care a cauzat eroarea.

De asemenea pentru a afla informații despre o comandă este de ajuns ca să selectăm comanda respectivă și să apăsăm tasta F1.

3.2.5. Centrul de comenzi

Centrul de comenzi este locul în care ne vom petrece cea mai mare parte a timpului în cadrul unei sesiuni Logo. De aici putem instrui Logo să execute ceea ce dorim să facem.

Cea mai importantă componentă a centrului de comenzi este zona de introducere a comenzilor care se află in colțul din stânga jos. O altă zonă importantă se află deasupra zonei de introducere a comenzilor, aici găsindu-se toate comenzile care s-au tastat precum și rezultatele care le-au returnat comenzile respective. În partea dreaptă a centrului de comenzi se află o serie de butoane, fiecare având diferite funcționalități:

Butonul Execute – atunci când este apăsat se execută comanda care se află în zona de introducere a comenzilor.

Butonul Status – determină apariția unei ferestre în care apar informații despre starea peniței, culoarea curentă a peniței, poziția și orientarea “broscuței”.

Butonul Trace – activează urmărirea execuției programului. Pentru dezactivare se mai apasă o dată.

Butonul Halt – oprește imediat Logo din execuția sa, acesta așteptând o nouă comandă.

Butonul Reset – aduce Logo la starea sa inițială.

Butonul Step – activează executarea programului pas cu pas, dând posibilitatea utilizatorului să urmărească mai bine execuția acestuia. Pentru dezactivare se mai apasă o dată.

Butonul Pause – determină oprirea din execuție a programului, dând posibilitatea urmării unor variabile sau efectuării unor schimbări în program. Pentru continuare în locul butonului Pause va apare butonul Continue și se va apăsa pe acesta din urmă.

MSWLogo, un mediu de lucru freeware realizat de Softronics, Inc.

Cap. 4. Jocul “Reversi”

Ca exemplificare a celor prezentate mai sus, vom implementa un joc de strategie în LOGO, reprezentând partea practică a acestei lucrări.

4.1. Tema jocului

Pe o tabla pătratică de ordin par cu n linii, respectiv coloane ( n=2*k , k={4,5,6,7,…} ) se afla în centru patru piese, două câte două de culori diferite, așezate simetric ca în figura 1.1. Jocul se joacă în doi, fiecare urmărind să captureze cât mai multe piese, astfel ca la sfârșitul jocului să obțină un număr de piese mai mare decât ale adversarului.

După cum spune și numele jocului, “Reversi”, piesele adversarului se pot captura atunci când ele sunt “prinse” între două piese pe linie, coloană sau diagonală. Piesele capturate își vor schimba culoarea și vor deveni piese ale jucătorului care le-a capturat. Jocul are următoarele reguli :

Jucătorul curent poate muta doar într-o căsuță libera, cu condiția de a captura cel puțin o piesă a adversarului ,

Jocul se termină atunci când jucatorul aflat la rând nu poate captura nici o piesa deținută de adversar sau atunci când toate căsuțele de pe tablă au fost ocupate,

Câștigătorul este cel care deține numărul cel mai mare de piese.

4.2. Implementarea jocului

Programul realizat în LOGO este alcătuit din proceduri, fiecare având importanța ei. Numele fișierului în care sunt aceste proceduri este “Reversi.lgo”. Atunci când LOGO încarcă un fișier cu extensia “lgo” caută în acesta variabila cu numele “startup”. În această variabilă putem memora numele procedurilor pe care dorim să le execute LOGO la încărcarea fișierului. În acest fel dacă nu definim variabila startup, LOGO încarcă în memorie toate procedurile care apar în fișier făra a executa nimic. În cazul fișierului “Reversi.lgo” ca procedură de start am definit procedura introducere.

4.3. Realizarea interfeței

La începutul execuției programului apare pe suprafața de desenare o imagine de tip GIF (am preferat acest tip în locul celor de tip BMP deoarece ocupă mai puțin spațiu, gif-urile fiind bitmap-uri comprimate), pe care apar rând pe rând câte două litere sugerând în mod simbolic cum se joacă acest joc: astfel, de exemplu, dacă două litere de culoare roșie sunt cuprinse de alte două litere de culoare albastră își vor schimba culoarea, devenind albastre. Iată cum arată două cadre luate din execuția programului:

După un timp scurt imaginea de mai sus va arăta în felul următor:

După ce are loc această introducere (lucru realizat de procedura introducere) se apelează procedura meniu care ne va afișa un meniul principal din care putem alege următoarele opțiuni:

Play : selectează tipul de joc (cu calculatorul sau cu un alt jucător);

Help : ofera informații despre joc (care sunt regulile);

Credits : informații generale despre joc (versiune, autor);

Exit : ieșire în Windows.

Meniul principal (Main Menu) așa cum arată în joc:

În cazul în care selectăm Play va apare un submeniu din care vom putea selecta una din următoarele opțiuni: să jucăm Reversi cu calculatorul, să jucăm cu un alt jucător, sau să revenim în meniul principal.

Așa cum se observă în figura de mai sus , submeniul seamănă cu meniul principal și prezintă aceleași caracteristici. Selectarea unor opțiuni se poate realiza fie cu ajutorul mouse-ului, fie cu ajutorul tastaturii. Aceasta se face foarte ușor cu ajutorul comenzilor: mouseon și keyboardon a căror sintaxă este următoarea –

KEYBOARDON keydown keyup

Această comandă permite tratarea evenimentelor apărute la apăsarea unei taste. Astfel keydown și keyup reprezintă câte o succesiune de comenzi sau proceduri; cele din keydown se vor executa atunci când va fi ținută o tastă apăsată, iar cele din keyup se vor executa atunci când se va eliberată tasta apăsată.

Pentru a obține ce tastă a fost invocată se poate apela KEYBOARDVALUE. De asemenea, pentru a capta evenimentele apărute la apăsarea unei taste trebuie ca fereastra în care se află suprafața de desenare trebuie să fie activă. În cazul în care nu mai avem nevoie de a capta evenimentele de la tastatură apelăm comanda KEYBOARDOFF.

MOUSEON leftbuttondown leftbuttonup rightbuttondown rightbuttonup move

Această comandă activează prinderea evenimentelor de la mouse. Pentru a putea obține poziția mouse-ului atunci când am apăsat un buton sau a fost mișcat mouse-ul apelăm MOUSEPOS. De asemenea ferestra în care este suprafața de desenare trebuie să fie activă pentru a putea prinde evenimentele de la mouse. Ca și la keyboardon leftbuttondown, leftbuttonup, rightbuttondown, rightbuttonup și move reprezintă blocuri de comenzi sau proceduri care se vor executa atunci când se apăsa clic stânga sau dreapta, când se va elibera clic stănga sau dreapta, sau când se va muta mouse-ul. Când vrem să dezactivăm prinderea evenimentelor de la mouse apelăm MOUSEOFF.

Revenind la meniuri, se poate observa că atunci când se mișcă mouse-ul peste una din căsuțele cu opțiuni, în partea de jos a ecranului vor apare informații despre opțiunea respectivă, iar căsuța respectivă îsi va modifica unele caracteristici.

În cazul în care se selectează SinglePlayer va apare o “fereastra” în care se poate introduce numele jucătorului care va juca împotriva calculatorului. Numele trebuie să aibă cel puțin un caracter, și maximul șapte catactere. Se pot folosi caracterele mici și cele mari. Pentru a șterge un caracter se apasă tasta <Backspace>. De asemenea dacă ne-am răzgândit și nu mai vrem să jucăm, putem reveni în orice moment în meniul principal apăsând tasta <Esc>. Dacă dorim să jucăm introducem numele după care apăsăm tasta <Enter>.

Aceleași situații le întâlnim și dacă selectăm opțiunea MultiPlayer doar că aici vom introduce, pe rând, numele celor doi jucători care vor juca. Și aici, ca și în cazul SinglePlayer, după ce introducem numele jucătorilor și apăsăm tasta <Enter> intrăm în joc.

Astfel în centrul ecranului va apare tabla de joc care are dimensiunile 10*10 . Pe tabla de joc, în centrul său se vor afla patru piese, două de culoare verde și două de culoare roșie, așezate ca in figura de mai jos:

4.4. Strategia de joc

Strategia de joc pe care o adoptă calculatorul, atunci când jucăm cu acesta, este următoarea: mutarea următoarei piese se face pe poziția care asigură un număr maxim de piese capturate. Dacă se găsesc mai multe poziții cu același număr maxim de piese capturate se alege prima găsită.

Algoritmul de găsire al poziției în care calculatorul ar putea muta este destul de simplu.

Tabla de joc este implementată cu ajutorul unei matrici pătratice care are dimensiunea n = 10. Inițial elementele matricii au valoarea 0, ceea ce înseamnă că nu este pe tablă nici o piesă. Matricea este definită astfel:

dacă poziția este liberă;

Matrice [i,j]= 1 dacă poziția este ocupată de jucătorul 1;

2 dacă poziția este ocupată de jucătorul 2;

Găsirea poziției în care calculatorul ar putea muta se realizează în următorul mod – pentru fiecare poziție liberă din tabla de joc (matrice[i,j] =0) se calculează numărul de piese capturate și se compară cu cel găsit anterior; dacă acesta este mai mare atunci se ține minte numărul de piese capturate și poziția unde s-a găsit acest număr. La sfârșit se va obține poziția căutată. Dacă este găsită, atunci se efectuează mutarea și se schimbă rândul jucătorului. Toate aceste operatii se găsesc în procedura definită cu numele calculator.

to calculator

make "max1 0

make "max 0

make "rezultat 0

make "ia 1

make "ja 1

for [ i 1 :nrlinii 1 ]~

[~

for [ j 1 :nrlinii 1 ]~

[~

if (mditem (list :i :j) :matrice) = 0 ~

[ make "rezultat captura :i :j 2 1 :nrlinii 0 ]~

if ((:rezultat) > 0) ~

[~

if ((:max) < (:rezultat))~

[~

make "max :rezultat~

make "rezultat 0~

make "ia :i ~

make "ja :j ~

]~

]~

]~

]

ifelse :max > 0 ~

[ make "max1 captura :ia :ja 2 1 :nrlinii 1~

afiseaza_informatii_joc~

afiseaza_jucatorul_curent 1 ~

testeaza_sfarsit_joc :k :r ]~

[ testeaza_sfarsit_joc :r :k ]

end

Calculul numărului de piese calculate se face cu ajutorul procedurii captura. Procedură are mai mulți parametri, aceștia fiind:

captura :i :j :k :r :nrlinii :test_castigator

unde

i și j sunt linia și coloana poziției;

k reprezintă jucătorul care se află la mutare;

r reprezintă jucătorul celălalt;

test_castigator este un parametru care poate avea două valori 1 și 0

daca are valoarea 1 atunci piesele care pot fi capturate își vor schimba culoarea devenind ale jucătorului k;

dacă are valoarea 0 atunci piesele care pot fi capturate nu își schimbă culoarea, caz în care procedura va returna numărul total de piese pe care le poate captura jucătorul k dacă ar muta în poziția [i,j].

Sunt situații în care avem nevoie numai de numărul de piese pe care un jucător le poate captura și de aceea procedura captura poate returna acest număr fără a mai fi nevoie de o altă procedură, apelând procedura cu ultimul parametru având valoarea 0. În acest fel obținem rezultatul dorit și nu se efectuează nici o schimbare în tabla de joc .

Se poate observa din codul de mai jos că, în mare parte, se repetă unele blocuri de instrucțiuni cu mici diferențe. Acest lucru se întâmplă deoarece, pentru o poziție de pe tabla de joc este necesar să verific pentru toate căsuțele ce o înconjoară. Așadar, există maxim opt căsuțe invecinate. Deci, pentru acestea, verific dacă se pot captura piese ce aparțin adversarului.

to captura :i :j :k :r :nrlinii :test_castigator

make "test_validare_mutare 0

if and :i<(:nrlinii) :j<(:nrlinii) ~

[~

if ((mditem (list (:i+1) (:j+1)) :matrice )= :r)~

[~

make "i1 (:i+1) make "j1 (:j+1) ~

while [ and ( and :i1<(:nrlinii) :j1<(:nrlinii) ) ~

((mditem (list :i1 :j1) :matrice )= :r)]~

[ make "i1 (:i1+1) make "j1 (:j1+1) ]~

if ((mditem (list (:i1) (:j1)) :matrice )= :k)~

[~

make "var1 (:j+1)~

for [var (:i+1) :i1-1 1]~

[~

if :test_castigator > 0~

[~

if :test_validare_mutare=0~

[~

deseneaza :i :j :marime :nrlinii :k~

mdsetitem (list :i :j) :matrice :k~

]~

mdsetitem (list :var :var1) :matrice :k~

deseneaza :var :var1 :marime :nrlinii :k~

make "var1 (:var1+1)~

]~

make "test_validare_mutare :test_validare_mutare+1~

]~

]~

]~

]

if and :i<(:nrlinii) :j>1 ~

[~

if ((mditem (list (:i+1) (:j-1)) :matrice )= :r)~

[~

make "i1 (:i+1) make "j1 (:j-1) ~

while [ and ( and :i1<(:nrlinii) :j1>1 ) ~

((mditem (list :i1 :j1) :matrice )= :r)]~

[ make "i1 (:i1+1) make "j1 (:j1-1) ]~

if ((mditem (list (:i1) (:j1)) :matrice )= :k)~

[~

make "var1 (:j-1)~

for [var (:i+1) :i1-1 1]~

[~

if :test_castigator > 0~

[~

if :test_validare_mutare=0~

[~

deseneaza :i :j :marime :nrlinii :k~

mdsetitem (list :i :j) :matrice :k~

]~

mdsetitem (list :var :var1) :matrice :k~

deseneaza :var :var1 :marime :nrlinii :k~

make "var1 (:var1-1)~

]~

make "test_validare_mutare :test_validare_mutare+1~

]~

]~

]~

]

if and :i>1 :j>1 ~

[~

if ((mditem (list (:i-1) (:j-1)) :matrice )= :r)~

[~

make "i1 (:i-1) make "j1 (:j-1) ~

while [ and ( and :i1>1 :j1>1 ) ~

((mditem (list :i1 :j1) :matrice )= :r)]~

[ make "i1 (:i1-1) make "j1 (:j1-1) ]~

if ((mditem (list (:i1) (:j1)) :matrice )= :k)~

[~

make "var1 (:j1+1)~

for [var (:i1+1) (:i-1) 1]~

[~

if :test_castigator > 0~

[~

if :test_validare_mutare=0~

[~

deseneaza :i :j :marime :nrlinii :k~

mdsetitem (list :i :j) :matrice :k~

]~

mdsetitem (list :var :var1) :matrice :k~

deseneaza :var :var1 :marime :nrlinii :k~

make "var1 (:var1+1)~

]~

make "test_validare_mutare :test_validare_mutare+1~

]~

]~

]~

]

if and :i>1 :j<:nrlinii ~

[~

if ((mditem (list (:i-1) (:j+1)) :matrice )= :r)~

[~

make "i1 (:i-1) make "j1 (:j+1) ~

while [ and ( and :i1>1 :j1<:nrlinii ) ~

((mditem (list :i1 :j1) :matrice )= :r)]~

[ make "i1 (:i1-1) make "j1 (:j1+1) ]~

if ((mditem (list (:i1) (:j1)) :matrice )= :k)~

[~

make "var1 (:j1-1)~

for [var (:i1+1) (:i-1) 1]~

[~

if :test_castigator > 0~

[~

if :test_validare_mutare=0~

[~

deseneaza :i :j :marime :nrlinii :k~

mdsetitem (list :i :j) :matrice :k~

]~

mdsetitem (list :var :var1) :matrice :k~

deseneaza :var :var1 :marime :nrlinii :k~

make "var1 (:var1-1)~

]~

make "test_validare_mutare :test_validare_mutare+1~

]~

]~

]~

]

if :i<(:nrlinii)~

[~

if ((mditem (list (:i+1) (:j)) :matrice )= :r)~

[~

make "i1 (:i+1)~

while [ and :i1<(:nrlinii) ~

((mditem (list :i1 :j) :matrice )= :r)]~

[ make "i1 (:i1+1) ]~

if ((mditem (list (:i1) (:j)) :matrice )= :k)~

[~

for [var (:i+1) :i1-1 1]~

[~

if :test_castigator > 0~

[~

if :test_validare_mutare=0~

[~

deseneaza :i :j :marime :nrlinii :k~

mdsetitem (list :i :j) :matrice :k~

]~

mdsetitem (list :var :j) :matrice :k~

deseneaza :var :j :marime :nrlinii :k~

]~

make "test_validare_mutare :test_validare_mutare+1~

]~

]~

]~

]

if :j<(:nrlinii)~

[~

if ((mditem (list (:i) (:j+1)) :matrice )= :r)~

[~

make "j1 (:j+1)~

while [ and :j1<(:nrlinii) ~

((mditem (list :i :j1) :matrice )= :r)]~

[ make "j1 (:j1+1) ]~

if ((mditem (list (:i) (:j1)) :matrice )= :k)~

[~

for [var (:j+1) :j1-1 1]~

[~

if :test_castigator > 0~

[~

if :test_validare_mutare=0~

[~

deseneaza :i :j :marime :nrlinii :k~

mdsetitem (list :i :j) :matrice :k~

]~

mdsetitem (list :i :var) :matrice :k~

deseneaza :i :var :marime :nrlinii :k~

]~

make "test_validare_mutare :test_validare_mutare+1~

]~

]~

]~

]

if :j>1~

[~

if ((mditem (list (:i) (:j-1)) :matrice )= :r)~

[~

make "j1 (:j-1)~

while [ and :j1>1 ((mditem (list :i :j1) :matrice )= :r)]~

[ make "j1 (:j1-1) ]~

if ((mditem (list (:i) (:j1)) :matrice )= :k)~

[~

for [var (:j1+1) :j-1 1]~

[~

if :test_castigator > 0~

[~

if :test_validare_mutare=0~

[~

deseneaza :i :j :marime :nrlinii :k~

mdsetitem (list :i :j) :matrice :k~

]~

mdsetitem (list :i :var) :matrice :k~

deseneaza :i :var :marime :nrlinii :k~

]~

make "test_validare_mutare :test_validare_mutare+1~

]~

]~

]~

]

if :i>1~

[~

if ((mditem (list (:i-1) (:j)) :matrice )= :r)~

[~

make "i1 (:i-1)~

while [ and :i1>1 ((mditem (list :i1 :j) :matrice )= :r)]~

[ make "i1 (:i1-1) ]~

if ((mditem (list (:i1) (:j)) :matrice )= :k)~

[~

for [var (:i1+1) :i-1 1]~

[~

if :test_castigator > 0~

[~

if :test_validare_mutare=0~

[~

deseneaza :i :j :marime :nrlinii :k~

mdsetitem (list :i :j) :matrice :k~

]~

mdsetitem (list :var :j) :matrice :k~

deseneaza :var :j :marime :nrlinii :k~

]~

make "test_validare_mutare :test_validare_mutare+1~

]~

]~

]~

]

output :test_validare_mutare

end

4.5. Determinarea câștigătorului

Jocul se termină atunci când s-au ocupat toate pozițiile de pe tabla de joc sau când jucătorul curent nu mai poate captura nici o piesă a adversarului. Testarea sfârșitului de joc se face de fiecare dată când are loc o mutare prin procedura testeaza_sfarsit_joc. Această procedură are doi parametri k și r. Ea verifică dacă jucătorul k poate captura piese ale jucătorului r, caz în care nu face nimic; dar dacă nu mai poate captura nici o piesă atunci se verifică cine e câștigătorul și se afișează.

to testeaza_sfarsit_joc :k :r

setlabelfont [[Times New Roman] 34 0 0 800 0 0 0 0 3 2 1 18]

make "nr_piese_jucator1 0

make "nr_piese_libere 0

make "nr_piese_jucator2 0

make "test_sfarsit 0

for [ a1 1 :nrlinii 1 ]~

[~

for [a2 1 :nrlinii 1]~

[~

ifelse ((mditem (list :a1 :a2) :matrice) = 0)~

[~

make "nr_piese_libere :nr_piese_libere+1 ~

if 0 = captura :a1 :a2 :k :r :nrlinii 0 ~

[ make "test_sfarsit :test_sfarsit+1] ~

]~

[~

ifelse ((mditem (list :a1 :a2) :matrice) = 1)~

[ make "nr_piese_jucator1 :nr_piese_jucator1 + 1]~

[ make "nr_piese_jucator2 :nr_piese_jucator2 + 1]~

]~

]~

]

if ( :test_sfarsit = :nr_piese_libere ) ~

[~

ifelse ( :nr_piese_jucator1 = :nr_piese_jucator2 )~

[ ~

pu~

home~

setxy -320 -270~

lt 270~

label (list "Jocul "s-a "terminat "la "egalitate ~

"cu "scorul :nr_piese_jucator1 "la :nr_piese_jucator2 ) ~

mouseoff ~

wait 720 ~

] ~

[ ~

ifelse ( :nr_piese_jucator1 > :nr_piese_jucator2 )~

[~

pu~

home~

setxy -320 -270~

lt 270~

label (list "A "castigat :nume_jucator1 "cu ~

"scorul :nr_piese_jucator1 "la :nr_piese_jucator2 ) ~

mouseoff ~

playwave "c:/work/licenta/aplauze.wav 2 ~

] ~

[ ~

pu ~

home ~

setxy -320 -270 ~

lt 270 ~

label (list "A "castigat :nume_jucator2 "cu ~

"scorul :nr_piese_jucator2 "la :nr_piese_jucator1 ) ~

mouseoff ~

playwave "c:/work/licenta/aplauze1.wav 2 ~

] ~

] ~

]

end

Determinarea câștigătorului se face prin numărarea pieselor fiecăruia dintre jucători și compararea acestora. Pentru revenire în meniul principal se apasă tasta <Escape>.

Cap. 5. Concluzii

Această lucrare a prezentat limbajul LOGO, încercând să răspundă la întrebarea: „Ce se poate face cu LOGO ?” Credem că răspunsul la această întrebare este : “Teoretic, orice”. Practic, singura limitare este viteza (ca în cazul oricărui limbaj interpretat). MSWLogo dispune de posibilitatea de a crea în LOGO interfețe Windows, de a programa elemente multimedia, chiar și comunicații în rețea, folosind stiva de protocoale TCP/IP. Printre exemplele livrate odată cu interpretorul – (totul încape pe o dischetă) se află chiar și un compilator de Pascal.

Am descris succint câteva caracteristici ale limbajului LOGO:

Prietenos – LOGO este ușor de înțeles; putem să-l folosim ca pe un “ajutor al gândirii”;

Extensibil – LOGO poate să învețe noi comenzi pe baza celor existente;

Tolerant – LOGO oferă un feed-back imediat prin mesaje informative și utile;

Flexibil – LOGO este la fel de bun pentru preșcolari și pentru studenți în an terminali sau pentru specialiști în inteligență artificială, fiind apropiat de limbajul funcțional LISP;

Puternic – LOGO oferă tot ceea ce este necesar pentru a realiza programe oricât de complexe.

De ce este bine să știm LOGO? În primul rând pentru a-l folosi. Dar mai ales pentru a avea și o altă viziune asupra programării. Astfel vom putea programa mai bine în limbaje precum C, Pascal sau Java.

Bibliografie

Sabin-Corneliu Buraga – Curs: “Programare Interfețe Utilizator”, Facultatea de Informatică, Iași, 2001: http://www.infoiasi.ro/~busaco/teach/courses/interfaces/

Ion Diamandi, Gheorghe Vass – “LOGO – o nouă metodă de a învăța cu ajutorul calculatorului”, Editura Pacific, București, 1991

* * * – MSWLogo Help

Resurse Web

Logo Fundation (http://el.www.media.mit.edu/groups/logo-foundation/)

EUROLOGO Web Server (http://www.eurologo.org/)

Berkeley Logo download (ftp://anarres.cs.berkeley.edu/pub/ucblogo/)

MSWLogo download (http://www.softronix.com/logo.html)

MicroWorlds 2.0 – demo (http://www.lcsi.ca/getdemos.htm)

Similar Posts

  • O Viziune Inovativa Asupra Ciclului Informativ In Conditiile Razboiului Bazat PE Retea

    TEMA: „O VIZIUNE INOVATIVĂ ASUPRA CICLULUI INFORMATIV ÎN CONDIȚIILE RĂZBOIULUI BAZAT PE REȚEA” CUPRINS INTRODUCERE Manifestări ale globalizării și Erei informaționale La începutul mileniului III, omenirea este confuză, în plină transformare, iar caracteristici precum dinamismul, flexibilitatea, globalizarea, emergența, complexi-tatea, radicalismul nu sunt suficiente pentru a descrie schimbările care se petrec în mediul de securitate internațional…

  • Detectia Fețelor Umane

    DETECTIA FEȚELOR UMANE Cuprins INTRODUCERE Detectia fetelor…………………………………………………………………………………………………………….4 CAPITOLUL I I.1. Imaginile digitale……………………………………………………………………………………………………5 CAPITOLUL II II.1. Segmentarea imaginilor și a culorilor……………………………………………………………………….6 II.2. Reprezentarea culorilor în spațiul YcbCr………………………………………………………………….6 II.3. Reprezentarea culorilor în spațiul RGB……………………………………………………………………7 II.4. Reprezentarea culorilor în spațiul HSI……………………………………………………………………..8 II.5. Segmentarea imaginilor………………………………………………………………………………………….9 II.6. Segmentarea culorilor în spațiul RGB………………………………………………………………………9 CAPITOLUL III III.1. Operațiuni morfologice……………………………………………………………………………………….11 III.2. Dilatarea morfologică………………………………………………………………………………………….11…

  • Realizarea Unei Pagini Web Interactive Utilizand Php Si Baze de Date Mysql

    Introducere Proiectul cu TEMA: „Realizarea unei pagini web interactive la firma Agentia Sfera utilizând PHP și baze de date MySQL” a fost realizată în urma analizei asupra sistemului de activitate a unei firme care are nevoie de o pagină web pe internet. Scopul acestei lucrari este – analiza sistemului existent, analiza agenției din punct de…

  • Pachete Profesionale Pentru Grafica pe Paginile Web

    „Pachete profesionale pentru grafică pe paginile Web” Introducere Capitolul I. Noțiuni generale privind grafica și design pe paginile web . Noțiunea de web design, particularitațile acestuia . Apariția și dezvoltarea a web design în timp Capitolul II. Pachete profesionale pentru grafică pe paginile web cunoscute 2.1 . Compatibilitatea pachetelor profesionale cu diferite limbaje de programare…

  • Arhitectura Software

    Cuprins Introducere ei ăș internetului se impune acordarea unei atenții ridicate compatibiltății i soluiei se dorete utlizarea de tehnologii care Obiectivele și Specificațiile proiectului Obiective Principalul obiectiv al acestei lucrări este de a realiza unei platforme online care să faciliteze studiul la distanță prin intermediul internetului. Se dorește accesul cursanților la materialele de curs/laborator cu…

  • Crearea Unui Plugin Pentru Platforme Cms

    Pluginul “Design Programabil” este dezvoltat pentru cea mai mare platforma de website-uri si blogging din lume denumita WordPress.Pluginul consta intr-o interfata unde administratorul website-ului poate programa o data de incepere si de sfarsit, din viitor, si un fisier css care sa ruleze in intervalul datei respective pe paginile generate de WordPress. In sub-meniul panoului de…