Jump to content

sinnoptic

Membru
  • Posts

    212
  • Joined

  • Last visited

Everything posted by sinnoptic

  1. Pagina „CSS” trimite aici. Pentru sistemul de criptare și codificare al conținutului video vedeți Content Scramble System. Cascading Style Sheets (CSS) Extensie de fișier .css Tip MIME text/css Dezvoltat de Håkon Wium Lie, Bert Bos, World Wide Web Consortium Lansat 17 decembrie 1996; acum 19 ani Tipul formatului Style sheet language Standard(e) Level 1 (Recommendation) Level 2 (Recommendation) Level 2 Revision 1 (Recommendation) Modifică text Consultați documentația formatului HTML HTML și HTML5; HTML editor HTML dinamic XHTML XHTML Basic (Mobile) XHTML Mobile Profile și C-HTML HTML element Span și div Atribut HTML Character encodings; Unicode Cod de limbaj Document Object Model Browser Object Model Style sheets și CSS Font family și Culori web HTML scripting și JavaScript W3C, WHATWG, și validator Quirks mode HTML Frames HTML5 Canvas, WebGL, și WebCL HTML5 Audio și HTML5 video Web storage Web browser (layout) engine Comparația limbajelor de marcare a documentului browserelor web layout engine support for HTML; Non-standard HTML XHTML (1.1) HTML5; HTML5 canvas, HTML5 media (Audio, Video) v • d • m CSS (Cascading Style Sheets) este un standard pentru formatarea elementelor unui document HTML. Stilurile se pot atașa elementelor HTML prin intermediul unor fișiere externe sau în cadrul documentului, prin elementul <style> și/sau atributul style. CSS se poate utiliza și pentru formatarea elementelor XHTML, XML și SVGL. Cuprins [ascunde] 1 CSS3 2 Vezi și 3 Bibliografie 4 Legături externe CSS3[modificare | modificare sursă] CSS3 reprezintă un upgrade ce aduce câteva atribute noi și ajută la dezvoltarea noilor concepte in webdesign. Unele dintre cele mai importante segmente (module) noi adăugate acestui standard pentru formatarea elementelor HTML aduc un plus considerabil in dezvoltarea activități webdesign. Mai jos sunt prezente in listă cele mai importante modulele adăugate in CSS3: Selectors Box Model Backgrounds and Borders Image Values and Replaced Content Text Effects 2D/3D Transformations Animations Multiple Column Layout User Interface Deși au apărut unele deficiente de compatibilitate intre browsere, majoritatea proprietăților CSS3 au fost implementate cu succes in variantele browserelor noi. CSS3 - Borduri Acum CSS3 oferă posibilitatea de a crea borduri cu colțurile rotunjite fară a folosi elemente grafice de fundal așa cum se folosea anterior acestui upgrade. Proprietatea CSS3 border-radius definește prin valorile exprimate in pixeli cat de rotunjite vor fi colțurile unui element HTML sau unei imagini. Fiecare colț poate avea o alta valoare exprimată in pixeli diferită de un alt colț al aceluiași element. Prin urmare putem folosi pana la 4 valori diferite atribuite unui element HTML sau imagine. Exemplu: border-radius: 5px ; - definește valoarea de 5px radius pentru toate cele 4 colțuri ale elementului. border-radius: 5px 7px 12px 4px; - aceste valori multiple definesc cat de mult vor fi rotunjite colțurile elementului HTML, iar pentru fiecare colt este specificata valorarea. Colțul stanga-sus are valoarea border-radius de 5px, colțul dreapta-sus are valoarea border-radius de 7px, colțul dreapta-jos al elementului HTML are valoarea de 12px iar colțul din stanga-jos are valoarea de 4px. CSS3 - Borduri Rotunjite - Optimizat Varianta ne-comprimată sau ne-optimizată: border-radius-left: 5px; border-radius-right: 7px; border-radius-top: 12px; border-radius-bottom: 4px; Varianta mimificată, compresată/optimizată: border-radius: 5px 7px 12px 4px; Ambele variante sunt corecte și acceptate de clientul browser. CSS3 - Borduri Rotunjite - Compatibilitate Browser Pentru compatibilitatea cu diferite browsere se folosesc prefixe: -webkit- , -moz- , -o- Compatibilitate: Internet Explorer (IE) - 0.9 , Chrome folosește prefixul -webkit- pentru 4,0 , Firefox folosește prefixul -moz- pentru versiunea 3.0, Safari folosește prefixul -webkit- pentru versiunea 3.1, Opera 10.5 prefix -o- Exemplu CSS3 border-radius: div { border: 2px solid #333333; padding: 10px 40px; background: #dddddd; width: 300px; border-radius:25px; } Elementul HTML div este definit de urmatoarele proprietăți CSS: dimensiunea in lungime este redată de valoarea in pixeli a proprietății width, folosește o bordură de 2 pixeli, o bordură solidă de culoare gri-inchis definită de caloarea HEX #333333. Culoarea de fundal este gri deschis definită de HEX #dddddd. Bordura rotunjită este de 25 pixeli pentru toate cele 4 colțuri. Sursa : www.wikipedia.ro
  2. Fă mai multe cu sistemul Android Descarcă browserul rapid, sigur și ușor de folosit pentru telefoane Android, care include acum un nou mod de economisire date cu comprimare video. Descoperă și organizează site-urile preferate cu Opera. Site : CLICK
  3. Nick: S1NnOpTic De unde provine ?: De la numele fostei iubite (Sandra) combinat cu Sufixoidul "Optic" I-am oferit aceasta forma deoarece suna mai bine . Nu ar fi avut prea multa logica " SandraOptic" =))
  4. # Ce firmă de internet foloseşti ?: Diginet (RDS) # Motivul pe care ai ales-o: Am crezut ca este ceva ok . # Esti mulţumit de viteza şi calitatea ei? Da .
  5. Avatar/Semnatura/Logo/Banner/etc : Avatar Tema pozei / Stock-ul dorit ( obligatoriu ) : Puteti alege oricare dintre urmatoarele stockuri . Text principal : S1NnOpTic Text secundar ( rangfort / www.rangfort.ro / nume server ) : RangFort Alte precizari : Sper sa fie frumos ... Link de la ultima cerere: Este prima cerere.
  6. Denumirea hartii : de_civic Numarul de sloturi : 28 Imagini : In Link Link-ul catre descarcare : Click
  7. Denumirea hartii : deathrun_green_x Numarul de sloturi : 32 Imagini : In link Link-ul catre descarcare : Click
  8. Denumirea hartii : deathrun_unity_beta1 Numarul de sloturi : 32 Imagini : In link Link-ul catre descarcare : Click
  9. Unele dintre creatiile tale se pot numii cu adevarat opere. In rest sunt Ok .
  10. N.E.R.O.: Nothing Ever Remains Obscure is Now Available on Steam and is 30% off!* N.E.R.O. is a wonderful journey in a world of incredible beauty, a story driven first-person game with puzzles and intuitive controls where the environment is connected to the characters and their past. The world of N.E.R.O. is magical and varied, making exploring an ongoing challenge. *Offer ends May 6 at 10AM Pacific Time
  11. EN : SONAR Steam Edition 2016 is Now Available on Steam and is 30% off!* Based on the critically-acclaimed SONAR digital audio workstation, SONAR Steam Edition includes many of the high-powered features you need to make music. And now we've built a version that has been tailored to the Steam community with new features aimed at aspiring video game soundtrack designers. Also, SONAR now includes a template to help users create their own Dota 2 music packs. Users can find it in their SONAR Tutorials folder. More information on creating packs can be found here! *Offer ends May 6 at 10AM Pacific Time
  12. EN :Pharaonic is Now Available on Steam and is 15% off!* Pharaonic is an unforgiving Action RPG set in Ancient Egypt with a combat system that draws its inspiration from Dark Souls. *Offer ends May 5 at 10AM Pacific Time RO : Pharaonic este acum valabil pe Steam , avand pretul redus cu 15% Pharaonic este un joc de neuitat , de tip RolePlayGame , facut in Egiptul Antic , Cu sistem de lupte ce redau inspiratie din Editiile Dark Souls . *Oferta se incheie pe 5 Mai , la ora 10 Dimineata .
  13. Titlu : Addons GG Ultimate # Descriere: Addons de tip GunGame Ultimate # Autor : Diez# # Descarcare : Aici # Pluginuri : gungame.amxx ultimate_ss.amxx ; plugin pentru ss admin_gag.amxx ; plugin de gag ghostchat.amxx ;plugin de chat afkbomb.amxx ; cand jucatorul care are bomba sta degeaba, aceasta e transferata altui jucator admin_freelook.amxx ; adminii se pot uita pe TOTI jucatorii admin_spec_esp.amxx ; plugin pentru detectarea wallului. Se activeaza/dezactiveaza cu tastele w/s amx_autorestart.amxx ; da restart automat cand incepe o noua runda hpk.amxx ; da afara playerii cu lag resetscore.amxx ; cu acest plugin iti resetezi scorul admin_chat_colors.amxx ;adminii scriu cu vede in chat amx_destroy.amxx ;plugin destroy instant_autoteambalance.amxx ;echlibreaza echipele pingfaker.amxx ;arata ping fals jucatorilor amx_who_reloaded.amxx ; plugin amx_who. # Tip : GunGame.. # Parola Arhivei(optional): Nu
  14. Tip memorie:DDR3 Capacitate:8192 MBFrecventa (MHz):1600 Altele Latenta:CL10 Radiator:Da Voltaj:1.5 V sursa : www.emag.ro
  15. Tip: Intel Core i7 CPU Socket: 2011 v3 Frecventa procesor (MHz): 3500 Intel Smart Cache: 15 MB Multiplicare: 12 Threads Tehnologie de fabricatie (nm): 22 Puterea consumata (W): 140 W Altele: Fara stock cooler Frecventa Turbo procesor (MHz): 3.7 GHz Memorie Tip memorie: DDR4 Capacitate maxima memorie RAM (GB): 64 GB Frecventa memorie (MHz): 1333/1600/2133 MHz Sloturi memorie: 4 Grafica Interfata grafica: Nu Tehnologii Intel Turbo Boost Technology: 2.0 Intel Hyper-Threading Technology: Da Intel Virtualization Technology (VT-x): Da Intel Virtualization Technology for Directed I/O (VT-d): Da Intel Trusted Execution Technology: Nu AES New Instructions: Da Intel 64: Da Idle States: Da Enhanced Intel SpeedStep Technology: Da Thermal Monitoring Technologies: Da Execute Disable Bit: Da
  16. Noul standard pentru performanta PC a sosit. A 6 a generatie de procesoare Intel® Core™ Aceste procesoare cu viteza uimitoare, functii complete, si securitate integrata, sunt gata sa va preia productivitatea, creativitatea si jocurile 3D la nivelul urmator. In plus, cu ajutorul Windows 10, procesoarele Intel Core 6th Gen va permit sa va alimentati imaginatia si sa explorati noi posibilitati. Posibilitati puternice Mai putin timp de asteptare, mai multa activitate cu noile procesoare Intel® Core™ 6th Gen. Aceste procesoare va ofera cu pana la 2.5x mai multa performanta pentru productivitate crescuta. Joaca ca un profesionist Cu a 6 a generatie de procesoare Intel® Core™ va puteti juca jocurile preferate, 3D, la o rezolutie mult mai mare, cu detalii mai fine, rate de cadru mai rapide, oferindu-va o experienta de joc uimitoare. Impartasiti experianta 4k Experienta UHD a devenit de 6x mai rapida cu procesoarele Intel® Core™ 6th Gen. Convertiti clipurile dumneavoastra 4k in mai putin de 3 minute, si impartasiti cu familia si prietenii pe dispozitivele mobile preferate. Memorie Cache:8192Socket:1151 Frecventa procesor (MHz):4000Turbo Boost pana la:4200 MHzMod de operare (biti):64Numar nuclee:4Tehnologie de fabricatie (nanometri):14 Cooler:NuPutere termica (W):95Altele:Intel® Hyper-Threading Intel® Turbo Boost Technology 2.0 Intel® Virtualization Technology (VT-x) Intel® Virtualization Technology for Directed I/O (VT-d) Intel® VT-x with Extended Page Tables (EPT) Intel® TSX-NI Intel® 64 Idle States Enhanced Intel SpeedStep® Technology Thermal Monitoring Technologies Intel® Identity Protection Technology Intel® Small Business Advantage Intel® HD Graphics 530
  17. sinnoptic

    REZOLVAT

    Daca mai intampini probleme de genul , ma poti cauta pe forum sau pe profilul meu de facebook : Gabi Stanescu
  18. Nick: S1NnOpTic Nume: Gabi Browser-ul folosit: Google Chrome Motiv: Cel mai rapid Browser dupa parerea mea
  19. Sunt foarte incantat! Azi vom face poate cel mai spectaculos pas catre construirea unui joc. Pana aici am parcurs impreuna in lectiile trecute conceptele fundamentale pe care oricine isi doreste sa devina programator trebuie sa le stapaneasca intr-un mod personal. Am vorbit despre instructiuni, despre variabile, despre instructiunea daca, despre instructiunea cat timp, despre vectori si matrici, despre functii si despre operatori. Imbinand in moduri ingenioase toate cunostintele si abilitatile deprinse pana acum iti poti construi propriul joc. Da, ai (aproape) tot ce iti trebuie! Mai lipseste doar un aspect. Un aspect simplu, dar fara de care n-am fi putut vorbi niciodata de jocuri pe calculator. Este vorba despre interactivitate. Si cum putem asigura aceasta interactivitate altfel decat lasand utilizatorului programului nostru posibilitatea de a da comenzi programului? (Altfel am putea programa doar poze sau cel mult filme, si nicidecum jocuri.) Cum cea mai utilizata metoda de a interactiona cu calculatorul este (inca) tastatura, iti voi arata in lectia de azi cum iti poti face programul sa raspunda asa cum doresti la apasarea anumitor taste. Lectia va fi una scurta, insa intelegerea ei pe deplin va necesita exercitiu din partea ta. Hai sa vedem acum cum putem sa ii spunem calculatorului nostru virtual ce sa faca atunci cand se apasa o tasta. La prima vedere lucrurile sunt un pic mai complicate, caci imbina practic majoritatea informatiilor de pana aici. Insa daca lectiile trecute nu ti-au pus probleme, nici aceasta nu o va face. In momentul in care calculatorul detecteaza apasarea unei taste el apeleaza in mod automat o functie care a fost specificata in acest sens. In cadrul acelei functii se citeste tasta care a fost apasata si se specifica modul in care calculatorul trebuie sa reactioneze la acest eveniment. In paragraful anterior an rezumat intreaga lectie. Hai sa-l reparcurgem pas cu pas si sa detaliem acolo unde e cazul. La apasarea vreunei taste calculatorul apeleaza in mod automat o functie specificata de noi. Buuun! E foarte bine ca se ocupa el in mod automat de treaba asta. Mai ramane sa vedem (1) cum ii putem spune ce functie sa apeleze si (2) ce caracteristici trebuie sa aiba aceasta functie. Cat priveste (1), raspunsul consta in functia predefinita AscultaTaste. Numele ii e destul de sugestiv, nu? Aceasta functie asteapta ca parametru numele unei functii care sa contina functionarea dorita in cazul apasarii tastelor. Prin urmare, in program o vom apela in felul urmator: AscultaTaste(FunctieTaste) In loc de FunctieTaste pot folosi orice nume valid de functie. Singura constrangere este (si cu asta raspund la intrebarea (2)) ca aceasta functie trebuie sa primeasca un parametru. In acest parametru calculatorul (care, repet, va apela in mod automat functia FunctieTaste) va pune informatii despre evenimentul care s-a produs (adica apasarea tastei). Sa zicem ca denumim ev (de la eveniment) parametrul functiei FunctieTaste. Prin urmare, definitia ei va arata in felul urmator: function FunctieTaste(ev) { // instructiunile din cadrul functiei, // ce vor fi executate in mod automat // la fiecare apasare de tasta detectata. … } Evident, asa cum am zis mai sus, simpla definitie a acestei functii nu este suficienta pentru ca programul sa raspunda la apasarea tastelor. Este necesar ca dupa ce definesc aceasta functie sa-i spun calculatorului ca pe ea doresc sa o apeleze atunci cand detecteaza vreo tasta apasata. Cum fac asta? Am spus mai sus: prin apelul AscultaTaste(FunctieTaste). Bun. Aproape am terminat. Ramane doar sa vedem ce scriem in cadrul functiei FunctieTaste. Pai n-ar trebui sa fie prea greu, nu? Doar avem parametrul ev, in care ni se trasmit (in mod automat) informatii despre evenimentul care s-a produs. Da, chiar nu e greu. Singura mica problema e ca in ev nu ni se spune direct ce tasta a fost apasata. Dar nu e grav, caci avem la dispozitie functia predefinita TastaApasata, care face exact acest lucru. Primeste ca parametru variabila ev si returneaza tasta ce a fost apasata, in format literal. Practic, daca la inceputul functiei FunctieTaste scriem: var tasta = TastaApasata(ev) in variabila tasta vom avea memorata in format literal tasta ce a fost apasata. OK, dar ce e cu formatul asta literal? Pana aici in variabile am memorat doar numere. Ei bine, in variabile se pot memora si caractere (litere). (De fapt, la nivel intern tot cu numere se lucreaza, fiecarui caracter de pe tastatura corespunzandu-i un cod numeric. Insa pentru programator este mai simplu sa lucreze cu caractere.) Aceste caractere trebuie puse intre apostrofuri. De exemplu, caracterul corespunzator apasarii tastei A este 'a' (iar 'A' corespunde apasarii combinatiei de taste SHIFT+A). Asadar, daca doresc sa verific daca s-a apasat tasta A pot scrie in program (in cadrul functiei FunctieTaste, bineinteles, si presupunand ca in variabila tasta am tasta apasata) o conditie de genul urmator: if (tasta == 'a') { // instructiuni ce trebuie executate daca s-a // apasat tasta A … } Cam asta e. Acum e timpul sa punem cap la cap tot ce am zis pana aici si sa facem un mic program demonstrativ. Hai sa facem un program in care sa plimbam pe ecranul virtual un punct cu ajutorul tastelor A (stanga), S (jos), D (dreapta) si W (sus). Si ca lucrurile sa fie mai interesante, as propune ca punctul sa fie rosu daca ne gasim in centrul ecranului (considerand centru in acest caz patratul cu coltul stanga-jos la coordonatele (3, 3) si coltul dreapta-sus la coordonatele (8, 8)), si sa fie negru in caz contrar (deci pe primele doua linii din marginile ecranului virtual). Fara alte comentarii preliminare, iata programul: // Program deplasare punct din taste // 1) Initializari: var x = 1 var y = 1 Aprinde(x, y) // 2) Functia de tratare a apasarii tastelor: function FunctieTaste(ev) { var tasta = TastaApasata(ev) Stinge(x, y) if ( (tasta == 'a') && (x > 1) ) { x = x-1 } if ( (tasta == 'd') && (x < 10) ) { x = x+1 } if ( (tasta == 's') && (y > 1) ) { y = y-1 } if ( (tasta == 'w') && (y < 10) ) { y = y+1 } if ( (x>=3)&&(y>=3)&&(x<=8)&&(y<=8) ) { Aprinde(x, y, ROSU) } else { Aprinde(x, y) } } AscultaTaste(FunctieTaste) Il poti testa mai jos. Reseteaza afisajul 1 Executa programul N-a fost chiar greu, nu? Dupa cum ai vazut, programul contine in esenta doua parti: 1) o parte de initializari (in care nu fac altceva decat sa definesc doua variabile (x si y) in care voi memora coordonatele curente ale punctului pe ecran, coordonate pe care le initializez cu (1, 1) (deci punctul stanga-jos al ecranului), si sa aprind (cu negru) punctul de la coordonatele (x, y)) si 2) o parte in care spun calculatorului ce sa faca atunci cand se apasa vreo tasta. Si daca intram in detaliile functiei FunctieTaste vei vedea ca si acolo lucrurile sunt destul de clare. Mai intai aflu ce tasta a fost apasata, apoi sting punctul de la coordonatele (x, y), dupa care verific daca a fost apasata vreuna dintre tastele A, S, D sau W si modific in mod corespunzator coordonata x sau y (verificand, de asemenea, ca punctul sa nu iasa in afara ecranului). Iar la final aprind punctul de la coordonatele (x, y) (care probabil au fost modificate) fie cu rosu, fie cu negru (in functie de pozitia in care se gaseste punctul pe ecran).
  20. Inainte de a ne apuca de treaba asa vrea sa te gandesti putin la aceste trei cuvinte. Ce iti transmit ele? La ce te duc cu gandul? Daca in gandurile tale a rasarit ideea de logica, atunci lectia aceasta va fi una usoara. Iti voi vorbi aici despre operatori. Vei revedea operatorii cu care te-ai intalnit in lectiile trecute si vei invata altii noi. Accentul va fi pus pe trei operatori logici cu ajutorul carora vei putea scrie cu usurinta programe mai scurte si mai clare. Practic, vei putea programa la fel de simplu cum gandesti. Singura diferenta e ca gandurile tale le vei exprima nu in cuvinte, ci in limbajul simplu, concis si lipsit de ambiguitate al programarii. Culoare Si ca sa iti infirm (la nivel subconstient
  21. Daca ai urmarit atent lectiile din articolele anterioare, pana la momentul de fata deja stapanesti bazele programarii calculatoarelor. Am ajuns sa facem impreuna programe destul de complexe si suntem la doar un pas de a construi primul joc. Revino, te rog, la lectia anterioara si reia ultimul program pe care ti l-am oferit ca exemplu. Dupa cum ai vazut, programul mai intai initializa cu anumite valori elementele unei matrici (binare — adica doar cu valori de 1 si de 0), dupa care aprindea pe ecran punctele corespunzatoare acelor elemente din matrice cu valoarea 1. Urma o pauza, dupa care elementele matricii erau inversate si apoi se repeta operatiunea anterioara (folosind de asta data, bineinteles, noile valori ale elementelor matricii). Ai remarcat, probabil, ca programul rezultat a fost destul de lung. De asemenea, cred ca ai remarcat faptul ca este presarat cu comentarii care sa ajute la intelegerea rapida a lui. In ciuda lor, insa, programul are un aer destul de complicat. In lectia aceasta vei afla cum sa faci mai multe cu mai putine. Mai precis, vei invata cum sa inveti calculatorul sa execute alte functii (comenzi) fata de cele pe care le cunostea deja. Iar apoi, folosind aceste noi functii definite de catre tine, vei putea face programe mai scurte si mai puternice. Sa vedem, mai intai, la ce ne-ar ajuta definirea unei noi functii in cazul programului de care discutam (si anume ultimul din lectia despre vectori si matrici). Nu necesita un efort deosebit sa observam faptul ca secventa de program ce realizeaza aprinderea tuturor punctelor de pe ecranul de 10×10 puncte conform valorilor (1 — aprins, sau 0 — stins) din matricea m (de 10 linii si 10 coloane, bineinteles) se repeta. Ba chiar se repeta in mod identic aceasta secventa de program. N-ar fi asadar, mult mai simplu sa o scriem o singura data, sa-i dam un nume, si apoi s-o apelam folosind acel nume? Ba sigur ca da. Exact asta facem cu instructiunea “functie” (function). Ea se scrie intr-un program in felul urmator: function NumeleFunctiei() { // corpul functiei; instructiunile // … } Spre deosebire de celelalte instructiuni de pana acum, instructiunea function nu are un efect imediat si nu intervine direct in functionarea programului. Ci ea este o instructiune cu rol declarativ, care va spune calculatorului ca prin comanda NumeleFunctiei() ma voi referi in program la instructiunile care se regasesc in corpul functiei. Pentru un exemplu concret, iata cum ar arata ultimul program din articolul anterior, scris de asta data cu ajutorul unei functii pe care aleg sa o denumesc AprindeEcran: // Program inversare culori (cu matrice) // definire matrice cu 10 linii si 10 coloane var m = Matrice(10, 10) // Definesc noua functie pe care urmeaza // sa o folosesc in program. function AprindeEcran() { // Parcurg toate elementele matricii m si aprind // sau sting punctul corespunzator de pe ecran, // in functie de valoarea elementului curent // (0 – stins; 1 – aprins). var l = 0 var c while (l < 10) { c = 0 while (c < 10) { if (m[l][c] == 1) { Aprinde(c+1, 10-l) } else { Stinge(c+1, 10-l) } c = c+1 } l = l+1 } } // Si acum urmeaza programul propriu-zis: // initalizare elemente matrice var l = 0 var c while (l < 10) { c = 0 while (c < 10) { if ( ((l+c)%2) == 0 ) { m[l][c] = 1 } else { m[l][c] = 0 } c = c+1 } l = l+1 } // aprindere puncte de pe ecran, // conform valorilor din matricea m // (0 – stins; 1 – aprins) AprindeEcran() // pauza… Pauza() // inversare stare puncte l = 0 while (l < 10) { c = 0 while (c < 10) { if (m[l][c] == 1) { m[l][c] = 0 } else { m[l][c] = 1 } c = c+1 } l = l+1 } // aprindere puncte de pe ecran, // conform valorilor din matricea m // (0 – stins; 1 – aprins) AprindeEcran() Iata si caseta de testare a programului. Reseteaza afisajul 1 Executa programul Ce parere ai de noul program? Nu e mai simplu sa scrii doar AprindeEcran() decat sa scrii (de doua ori) intreg acel bloc de instructiuni? Banuiesc ca te astepti deja ca urmeaza un exercitiu pentru tine. Ei bine, ia incearca sa faci si inversarea starii punctelor tot printr-o functie (la fel cum am facut pentru AprindeEcran). (Deci programul tau va contine in partea initiala pe langa definirea variabilei m si a functiei AprindeEcran, si definirea acestei noi functii — pe care o poti numi, de exemplu InverseazaPuncte.) Buuun, cu asta ai invatat si functiile, nu? Nu inca! De ce? Pentru ca ceea ce am facut pana aici e doar un caz particular de utilizare a functiilor (si anume utilizarea lor ca pe un soi de macro-intructiuni). In cazul cel mai general, insa, o functie poate sa primeasca niste parametri si sa returneze o valoare (exact ca in cazul unei functii matematice). Hai sa vedem mai intai cum sta treaba cu functiile care au parametri. Sa zicem ca ne dorim sa construim o functie care sa deseneze un dreptunghi pe ecranul nostru virtual de 10×10 puncte. Dorim, insa, ca functia asta sa fie capabila sa deseneze nu doar un anumit dreptunghi, ci orice dreptunghi. Prin urmare, este necesar sa specificam dreptunghiul dorit prin intermediul unor parametri. Putem, de exemplu, sa specificam dreptunghiul cu ajutorul coordonatelor (pe axa x (orizontala) si pe axa y (verticala)) punctului din stanga-jos si ale celui din dreapta-sus. Sa denumim aceste coordonate prin (x1, y1) si (x2, y2). In conditiile acestea, cum ar arata o functie (sa-i zicem, de exemplu, DeseneazaDreptunghi) care sa deseneze pe ecran dreptunghiul ce are coltul din stanga-jos la coordonatele (x1, y1) si coltul din dreapta-sus la coordonatele (x2, y2)? Iata o varianta mai jos: function DeseneazaDreptunghi(x1, y1, x2, y2) { var x = x1 while (x <= x2) { Aprinde(x, y1) Aprinde(x, y2) x = x+1 } var y = y1 while (y <= y2) { Aprinde(x1, y) Aprinde(x2, y) y = y+1 } } // Si iata si cateva exemple de utilizare a functiei: // 1) un patrat DeseneazaDreptunghi(1, 1, 10, 10) // 2) o linie orizontala DeseneazaDreptunghi(3, 3, 7, 3) // 3) o linie verticala DeseneazaDreptunghi(3, 5, 3, 7) // 4) un punct DeseneazaDreptunghi(7, 7, 7, 7) // 5) nimic DeseneazaDreptunghi(8, 8, 2, 2) (Imi poti spune de ce in cazul ultimului apel al functiei (varianta 5 de mai sus) nu se deseneaza nimic pe ecran?) Dupa cum ai observat (daca ai testat programul), functia DeseneazaDreptunghi pe care am definit-o se foloseste de valorile a patru parametri, si anume x1, y1, x2 si y2. Si daca ne uitam in corpul ei vedem ca mai intai defineste o variabila locala numita x cu ajutorul careia parcuge (folosind un while in combinatie cu incrementarea cu 1 din final (adica instructiunea x = x+1)) toate valorile de la x1 la x2. Si apoi, in corpul while-ului (deci pentru fiecare valoare a lui x intre x1 si x2 inclusiv) apeleaza de doua ori functia predefinita Aprinde — mai intai pentru a aprinde punctul de la coordonata (x, y1) si apoi pe cel de la coordonata (x, y2). Prin urmare dupa finalizarea executiei acestui prim while se vor fi desenat pe ecran doua dintre laturile dreptunghiului (si anume cea de jos si cea de sus). In mod similar partea a doua a functiei deseneaza celelalte doua laturi ale dreptunghiului (si anume latura din stanga si latura din dreapta). Super, nu? Folosindu-ne de o functie deja existenta (Aprinde) am construit o functie mai complexa (DeseneazaDreptunghi). In felul acesta nu numai ca putem scrie programe mai scurte si mai clare, ci putem scrie programe generice, a caror functionare sa poata fi usor modificata prin modificarea valorilor unor parametri. (Mentionez cu aceasta ocazie ca DeseneazaDreptunghi poate fi apelata si folosind variabile pe post de parametri. Cu alte cuvinte, pot scrie in program ceva de genul DeseneazaDreptunghi(csjx, csjy, 8, 9), in conditiile in care variabilele csjx si csjy au fost in prelabil definite si initializate cu niste valori.) A mai ramas un singur caz de functii pe care as vrea sa-l discut acum. Este vorba de functiile care returneaza o valoare. Care e treaba cu ele? Este cam acelasi lucru pe care il facem la matematica atunci cand scriem y = f(x). f este functia, x este parametrul cu care ea este apelata, iar y este variabila in care memorez valoarea returnata de functia f pentru parametrul x. In esenta functiile ce returneaza o valoare nu sunt diferite de de functiile de care am vorbit pana acum. Ba chiar orice functie poate sa returneze o valoare. Cu conditia ca in corpul ei sa existe intructiunea return valoare (unde in loc de valoare se poate pune fie o valoare numerica, fie o variabila in care este memorata o valoare, fie o expresie matematica (ce poate cuprinde valori numerice, operatori, variabile)). In momentul in care o astfel de intructiune “returneaza” (return) este executata, executia functiei se finalizeaza si valoarea returnata de ea este pusa in program acolo unde functia a fost apelata. Aceste cuvinte poate ca par mult mai complicate decat stau lucrurile in realitate, asa ca haide sa vedem un exemplu. Sa zicem ca desenam pe ecran un dreptunghi (cu functia DeseneazaDreptunghi facuta anterior), dupa care dorim sa desenam un punct in centrul lui. Ce-ar fi sa facem o functie cu ajutorul careia sa calculam acest centru? In regula. Hai sa vedem ce ar trebui sa facem pentru a obtine centrul dreptunghiului, in conditiile in care avem coordonatele (x1, y1) ale coltului din stanga-jos si (x2, y2) ale coltului din dreapta-sus. Pai, pentru a obtine coordonata pe axa x a centrului ar trebui sa facem media aritmetica intre x1 si x2. Adica (x1+x2)/2. Si apoi ar trebui sa rotunjim valoarea obtinuta pentru a obtine o valoare intreaga pe care s-o putem folosi pentru a selecta una dintre cele 10 coloane de pe ecranul virtual. (Putem rotunji o valoare reala la un numar intreg folosind functia predefinita Rotunjeste.) Si similar pentru y. Prin urmare, daca am face o functie care sa calculeze media dintre doua numere si sa returneze rezultatul rotunjit la o valoare intreaga, atunci am putea folosi aceasta functie atat pentru a calcula coordonata pe axa x a centrului dreptunghiului, cat si coordonata sa pe y. Hai sa vedem ce ar iesi: // definesc functiile pe care le voi folosi function DeseneazaDreptunghi(x1, y1, x2, y2) { var x = x1 while (x <= x2) { Aprinde(x, y1) Aprinde(x, y2) x = x+1 } var y = y1 while (y <= y2) { Aprinde(x1, y) Aprinde(x2, y) y = y+1 } } function CalculeazaMedia(a, { // calculeaza media numerelor a si b // si rotunjeste rezultatul var r = (a+b)/2 r = Rotunjeste® return r } // am definit functiile; acum iata programul: DeseneazaDreptunghi(2, 3, 8, 9) var xc = CalculeazaMedia(2, 8) var yc = CalculeazaMedia(3, 9) Aprinde(xc, yc) Gata si lectia asta. La fel ca si cele de pana acum, nici ea nu se invata singura, insa. Este nevoie de ceva efort din partea ta. Dar daca ai in minte un proiect interesant pe care iti doresti sa il aduci la lumina, acest efort va deveni simplu si captivant ca o joaca.
  22. Probabil ca atunci cand auzi de vectori si de matrici te gandesti la lectiile de fizica si de matematica din scoala. Vectorii si matricile din programare, insa, sunt cu totul altceva. Si anume, ele sunt doar niste modalitati de organizare a datelor. Ele constituie, in esenta, bazele structurilor de date utilizate in programele complexe. (Si, in particular, ele constituie fundamentul bazelor de date de care cel mai probabil ai mai auzit.) Hai sa n-o lungim mult si sa vedem ce sunt vectorii si matricile din programare. Vectori Dar mai intai: de ce am avea nevoie de o modalitate de structurare a datelor? Oare variabilele simple nu sunt de ajuns? Daca am de memorat o data, folosesc o variabila. Daca imi trebuiesc doua date intr-un program, folosesc doua variabile. Dar daca am nevoie de 10 date? (Sa zicem ca as vrea sa memorez starea tuturor celor 10 “beculete” de pe linia cu y = 1 din ecranul virtual de 10×10 puncte utilizat in lectiile anterioare. As putea sa consider valoarea 1 pentru starea “aprins” si valoarea 0 pentru starea “stins”.) Da, pot folosi 10 variabile. Dar daca apoi as vrea sa schimb starea tuturor becurilor (adica pe cele aprinse sa le sting, si pe cele stinse sa le aprind)? Ar trebui, evident, sa iau fiecare dintre cele 10 variabile in parte si sa scriu pentru ea un fragment de program de genul urmator: daca (variabila == 1) { variabila = 0 } altfel { variabila = 1 } Imagineaza-ti treaba asta (scrisa, desigur, cu instructiunea if in loc de daca) repetata de 10 ori! (Of, si tocmai incepuse sa-ti placa programarea, nu?…) Ei bine, vestea buna e ca datorita vectorilor nu va trebui sa dai copy&paste de 9 ori. Cu ajutorul vectorilor vei putea scrie ceva de genul: if (variabila_numarul_n == 1) { variabila_numarul_n = 0 } else { variabila_numarul_n = 1 } Acest grup de instructiuni va trebui sa-l scrii o singura data, in interiorul unei instructiuni cat timp (adica while) cu ajutorul careia il faci pe n sa parcurga toate valorile de la 1 la 10 (asa cum ai vazut in lectia anterioara). Bun, dar cum poti traduce intr-un program variabila_numarul_n? Sa zicem ca variabila am denumit-o v. Atunci variabila v numarul n se va scrie v[n]. OK. Mai ramane doar sa vedem cum se defineste o astfel de variabila. O poti face cu functia Vector(numar_elemente), unde in loc de numar_elemente pui numarul de elemente dorit (deci cate variabile iti doresti sa contina variabila v). De exemplu, pentru 10 variabile in v (prima fiind v[0], si ultima v[9]) poti scrie astfel: var v = Vector(10) Iata, deci, un vector! Asadar, un vector e doar o variabila ce contine mai multe variabile (ce pot fi accesate prin expresii (ce pot contine numere, operatori si alte variabile) scrise intre paranteze drepte dupa numele variabilei, asa cum am aratat in paragrafele anterioare). Sa vedem acum cum ar arata programul de inversare a starii celor 10 beculete, de care vorbeam ceva mai devreme: var v = Vector(10) … var n = 0 while (n < 10) { if (v[n] == 1) { v[n] = 0 } else { v[n] = 1 } n = n+1 } … Pentru a face un program simulabil in simulatorul interactiv (asa cum te-am obisnuit in lectiile trecute), mai trebuie sa initializam valorile din vectorul v dupa ce l-am definit. Asa cum am zis anterior, pentru starea “aprins” vom folosi valoarea 1, iar pentru starea “stins” valoarea 0. De asemenea, mai trebuie sa aprindem beculetele de pe ecran atat inainte, cat si dupa rularea algoritmului de inversare a beculetelor. Putem face aceasta punand o pauza in program (cu ajutorul functiei Pauza()). Iata programul: // Program inversare culori (cu vector) // definire vector cu 10 elemente var v = Vector(10) // initalizare elemente vector v[0] = 0 v[1] = 0 v[2] = 1 v[3] = 1 v[4] = 1 v[5] = 1 v[6] = 1 v[7] = 0 v[8] = 1 v[9] = 1 // aprindere puncte de pe linia cu y = 1, // conform valorilor din vectorul v // (0 – stins; 1 – aprins) var n = 0 while (n < 10) { if (v[n] == 1) { Aprinde(n+1, 1) } else { Stinge(n+1, 1) } n = n+1 } // pauza… Pauza() // inversare stare puncte n = 0 while (n < 10) { if (v[n] == 1) { v[n] = 0 } else { v[n] = 1 } n = n+1 } // aprindere puncte de pe linia cu y = 1, // conform valorilor din vectorul v // (0 – stins; 1 – aprins) n = 0 while (n < 10) { if (v[n] == 1) { Aprinde(n+1, 1) } else { Stinge(n+1, 1) } n = n+1 } Si iata si simulatorul in care poti testa programul. Reseteaza afisajul 1 Executa programul A mers, da? Acum urmeaza partea cea mai frumoasa (si care te va ajuta cel mai mult in a deveni un bun programator) — partea de creatie si experimentare. Modifica, te rog, programul anterior astfel incat doar starea punctelor de pe coloanele pare (coloanele 2, 4, 6, 8, 10) sa se modifice (iar punctele de pe coloanele cu numar impar sa ramana nemodificate). Poti sa-mi lasi rezultatele (ca si alte idei de programe interesante cu vectori) in sectiunea de comentarii de mai jos. Matrici Acum ca e clar cum sta treaba cu vectorii, sa vedem ce sunt matricile si la ce sunt ele bune. Daca folosind un vector am putut manipula o linie din afisaj (si la fel de simplu putem manipula o coloana), cu ajutorul unei matrici putem manipula intreg ecranul de 10×10 puncte. Caci matricea este (ca si vectorul) o variabila ce contine mai multe variabile (dar nu dispuse in sir (ca la vector), ci intr-un patrat sau dreptunghi (pe linii si coloane)). Cand definim o matrice trebuie sa ii specificam numarul de linii si numarul de coloane, astfel: var m = Matrice(numar_linii, numar_coloane) Intreg afisajul de 10×10 becuri il putem, deci, considera un fel de matrice (de puncte, sau beculete), de 10 linii si 10 coloane. Numerotarea liniilor incepe, insa, de sus (deci linia cu y = 10 este linia 0, iar linia cu y = 1 este linia 9), iar a coloanelor de la stanga (deci coloana cu x = 1 este coloana 0, iar coloana cu x = 10 este coloana 9). Haide sa definim o matrice in care sa memoram starea (aprins sau stins) tuturor celor 10×10 puncte de pe afisaj. La fel ca anterior, pentru starea “aprins” vom memora in matrice valoarea 1, iar pentru starea “stins” valoarea 0. Daca denumim aceasta variabila m, atunci va trebui sa scriem in felul urmator: var m = Matrice(10, 10) Pentru accesarea elementelor matricii m vom scrie similar ca la vectori, cu diferenta ca matricii trebuie sa ii specificam doi indecsi (unul pentru linie, si celalalt pentru coloana) in loc de unul singur. Astfel, de exemplu, cu m[1][2] se acceseaza elementul de pe linia 1 si coloana 2 (care corespunde punctului de pe afisaj situat la coordonatele x = 3 si y = 9). (Imi poti spune cum ai accesa elementul matricii m in care vom memora starea punctului din coltul din dreapta sus al afisajului?) Hai sa vedem acum cum ar arata programul scris la sectiunea Vectori, dar de asta data pentru intreg ecranul, folosind matricea m definita anterior. (Iti reamintesc ca programul isi propune sa aprinda cateva puncte de pe ecran, sa puna pauza, dupa care sa inverseze starea tuturor punctelor.) // Program inversare culori (cu matrice) // definire matrice cu 10 linii si 10 coloane var m = Matrice(10, 10) // initalizare elemente matrice var l = 0 var c while (l < 10) { c = 0 while (c < 10) { if ( ((l+c)%2) == 0 ) { m[l][c] = 1 } else { m[l][c] = 0 } c = c+1 } l = l+1 } // aprindere puncte de pe ecran, // conform valorilor din matricea m // (0 – stins; 1 – aprins) l = 0 while (l < 10) { c = 0 while (c < 10) { if (m[l][c] == 1) { Aprinde(c+1, 10-l) } else { Stinge(c+1, 10-l) } c = c+1 } l = l+1 } // pauza… Pauza() // inversare stare puncte l = 0 while (l < 10) { c = 0 while (c < 10) { if (m[l][c] == 1) { m[l][c] = 0 } else { m[l][c] = 1 } c = c+1 } l = l+1 } // aprindere puncte de pe ecran, // conform valorilor din matricea m // (0 – stins; 1 – aprins) l = 0 while (l < 10) { c = 0 while (c < 10) { if (m[l][c] == 1) { Aprinde(c+1, 10-l) } else { Stinge(c+1, 10-l) } c = c+1 } l = l+1 } (Pentru a testa codul, revino la caseta de simulare de la finalul sectiunii despre vectori.) Modifica, te rog, acest program astfel incat sa-si schimbe starea doar punctele aflate pe linii si coloane pare. Gata si lectia despre vectori si matrici! Cu aceasta lectie libertatea ta in materie de construit programe a crescut enorm. Nici nu iti dai seama cat de aproape esti de a-ti programa propriul joc. Inca mai crezi ca este foarte dificil sa iti construiesti propriul joc de calculator? Te rog sa-mi spui ce crezi despre asta intr-un comentariu. De asemenea, te-as mai ruga sa-mi spui ce idei de jocuri interesante ai. Constrangerea este ca aceste jocuri sa poata fi jucate folosind doar ecranul virtual de 10×10 puncte si tastatura (sau, eventual, mouse-ul). sursa : Igotopia .ro
  23. Deja cu ceea ce ai invatat in lectiile anterioare (instructiuni (1/2, 2/2), variabile, instructiunea “daca”) poti construi programe destul de complexe. Pentru a face programe serioase, insa, iti mai lipseste o singura lectie. Este vorba despre o instructiune cu ajutorul careia vei putea, printre altele, scrie in cateva randuri programe care altfel ti-ar fi necesitat zeci sau sute de linii. O instructiune ce iti va deschide poarta catre programarea adevarata, permitandu-ti sa faci si alte lucruri nebanuite. Instructiunea aceasta este while (“cat timp” — in limba romana). Formatul in care ea se scrie in programe este urmatorul: while (conditie) { // instructiuni … } Ca si in cazul instructiunii if (“daca”) invatate in lectia anterioara, in loc de conditie se pot pune verificari de egalitati sau inegalitati intre expresii ce pot contine valori, variabile si operatori. De fapt, instructiunea while seamana mult cu instructiunea if. Singura diferenta dintre instructiunea scrisa mai sus (adica: while (conditie) {//instructiuni …}) si instructiunea if (conditie) {//instructiuni …} este aceea ca daca conditia conditie este adevarata, in cazul instructiunii if blocul de instructiuni se executa o singura data, in vreme ce in cazul instructiunii while acesta se poate executa de mai multe ori, atata timp cat conditia conditie ramane adevarata (sau, altfel spus, pana cand conditia conditie nu mai este adevarata). Scrisa in limbaj natural, instructiunea while de mai sus s-ar traduce in “cat timp conditia este adevarata, executa instructiunile scrise intre acolade”. Evident, daca in blocul de instructiuni scrise intre acolade nu exista nimic care sa afecteze conditia, atunci (in cazul in care aceasta a fost initial adevarata) ea va ramane mereu adevarata, ceea ce inseamna ca blocul de instructiuni se va repeta la nesfarsit. In mod normal, insa, conditia testata contine o variabila a carei valoare se va modifica pe parcursul executarii blocului de intructiuni. Haide sa vedem un exemplu. Sa zicem ca dorim sa aprindem linia de jos (adica linia cu y egal cu 1) din ecranul nostru de 10×10 puncte. Bineinteles, putem face asta cu urmatorul program (asa cum am vazut inca din prima lectie): Aprinde(1, 1); Aprinde(2, 1); Aprinde(3, 1); Aprinde(4, 1); Aprinde(5, 1); Aprinde(6, 1); Aprinde(7, 1); Aprinde(8, 1); Aprinde(9, 1); Aprinde(10, 1); In regula, dar mai simplu nu se poate? Ba da. Sa observam, mai intai, ca x-ul transmis instructiunii Aprinde(x, y) variaza de la 1 la 10, in vreme ce y-ul ramane constant (si egal cu 1). Ce-ar fi, atunci, sa luam o variabila (pe care o putem numi chiar x) cu ajutorul careia sa parcurgem intreaga gama de valori 1, 2, 3, …, 10. Putem face asta cu urmatorul pogram: var x = 1; while (x <= 10) { Aprinde(x, 1); x = x+1; } Hai sa vedem pas cu pas ce face programul acesta: – 1) Mai intai defineste o variabila numita x, si o initializeaza cu valoarea 1. – 2) Urmeaza apoi instructiunea “cat timp x este mai mic sau egal cu 10…” – 3) “… aprinde punctul de la coordonatele (x, 1), si mareste cu 1 valoarea memorata in variabila x“. Daca ar fi sa derulam pasii 2) si 3), am vedea ca mai intai x este egal cu 1 (de la pasul 1) ), dupa care: – 2.1) se testeaza daca (x <= 10). Rezultatul este “adevarat” (caci x este egal cu 1), deci se executa pasul 3): – 3.1) Aprinde(1, 1); x = 1+1; – 2.2) apoi se testeaza din nou daca (x <= 10). Rezultatul este tot “adevarat” (caci x este acum egal cu 2), deci se executa din nou pasul 3): – 3.2) Aprinde(2, 1); x = 2+1; – 2.3) si iar se verifica daca (x <= 10). Cum rezultatul este “adevarat” (x fiind egal acum cu 3), se executa pasul 3): – 3.3) Aprinde(3, 1); x = 3+1; … (si asa mai departe… Hai sa trecem peste cativa pasi si sa ajungem direct la pasul in care x are valoarea 10.) – 2.10) se verifica daca (x <= 10). Rezultatul este “adevarat” (caci x este egal cu 10), deci se executa pasul 3): – 3.10) Aprinde(10, 1); x = 10+1; – 2.11) iarasi se verifica daca x este mai mic sau egal cu 10. De asta data, insa, rezultatul este “fals” (caci x are acum valoarea 11), deci nu se mai executa pasul 3), ci se iese din instructiunea while. Acum testeaza, te rog, programul anterior (cu copy&paste) folosind caseta de mai jos. Reseteaza afisajul 1 Executa programul Ce s-a intamplat dupa ce ai apasat butonul “Executa programul”? Asa cum ne asteptam, s-a aprins intreaga linie de jos din afisaj. Bun, dar daca dorim acum sa aprindem pe linia 2 nu intreaga linie, ci doar punctele de pe coloanele 1, 3, 5, 7 si 9? In primul rand, observam ca ne dorim de fapt sa aprindem toate punctele aflate la coordonatele (x, y), cu proprietatea ca y este egal cu 2, iar x ia pe rand valorile 1, 3, 5, 7, 9 (adica toate valorile impare de la 1 la 10). Folosind aceasta observatie, programul rezulta cu destula usurinta. Practic putem folosi programul anterior, in care in loc de Aprinde(x, 1) punem Aprinde(x, 2) (caci nu dorim sa aprindem puncte de pe linia 1, ci de pe linia 2). De asemenea, instructiunea Aprinde nu trebuie sa se mai apeleze la fiecare pas, ci doar la pasii pentru care x are valoare impara. Prin urmare, trebuie sa ne folosim de instructiunea if pentru a-i transmite o comanda de genul “executa instructiunea Aprinde(x, 2) doar daca x este numar impar”. Cum putem testa daca x este numar impar? O varianta posibila este sa verificam restul impartirii lui x la 2. Daca acest rest este egal cu 1, inseamna ca x este impar. Acum avem tot ce ne trebuie, asa ca hai sa construim programul: var x = 1; while (x <= 10) { if ( (x % 2) == 1) { Aprinde(x, 2); } x = x+1; } Testeaza-l si pe acesta, te rog. Merge, nu? (Ce-ar fi sa-l modifici astfel incat pe linia 3 sa se aprinda “beculetele” situate pe coloane pare?) Iata ca deja am ajuns sa scriem programe serioase. Probabil ca un neinitiat s-ar uita la programul anterior ca la un text in chineza scris cu litere arabe. Insa daca ai urmarit cu atentie cele trei lectii anterioare, ai vazut ca lucrurile nu sunt nici pe departe atat de complicate pe cat par, ci totul este perfect logic. Propun sa incheiem lectia aceasta cu un exemplu ceva mai complicat. Sa zicem ca am dori sa aprindem toate punctele de pe ecranul de 10×10 puncte. Ce ar trebui sa facem, deci? Bineinteles, am putea sa punem 100 de instructiuni de tip Aprinde(x, y). Sau am putea sa observam ca de fapt tot ce trebuie sa facem este sa avem doua variabile (numite, de exemplu, chiar x si y) cu ajutorul carora sa apelam Aprinde(x, y). Si ar mai trebui sa observam si ca variabila x trebuie sa parcurga toate valorile de la 1 la 10 pentru fiecare valoare a variabilei y (care, la randul ei, ar trebui sa parcurga toate valorile de la 1 la 10). Aceasta inseamna ca ne vom puteam folosi de primul program de mai sus (cel care aprindea toate punctele de pe linia cu y egal cu 1), numai ca in blocul de insctructiuni din acel while nu vom scrie Aprinde(x, 1), ci Aprinde(x, y), unde y va fi o variabila pe care o vom fi declarat la inceputul programului si o vom fi initializat cu 1. Va trebui apoi ca intreg acel program sa fie executat din nou pentru y avand valoarea 2. Si apoi pentru y avand valoarea 3. Si asa mai departe, pana la y egal cu 10. Se poate observa ca dorim sa facem cu y o serie de operatii similare celor pe care le facem cu x. Prin urmare, intreg acest program de care vorbim va face parte din blocul de instructiuni al unei instructiuni while ce va testa conditia (y <= 10). Hai sa vedem cum ar arata programul: var y; var x; y = 1; while (y <= 10) { x = 1; while (x <= 10) { Aprinde(x, y); x = x+1; } y = y+1; } Pentru a-l testa, revino la caseta de testare de mai sus, apasa butonul “Reseteaza afisajul”, dupa care introdu acest program si apasa butonul “Executa programul”. A mers, nu? Ti s-au aprins toate punctele de pe ecran? (Ma intreb daca ai putea sa il modifici astfel incat sa nu-ti aprinda toate punctele, ci sa “deseneze” un soi de “tabla de sah” formata din 10×10 patratele. (Idee: foloseste if-uri; eventual unele in interiorul altora…)
  24. Daca ai urmarit lectiile anterioare de introducere in programarea calculatoarelor, stii deja ca un calculator nu poate sa faca altceva decat sa execute o serie de instructiuni precise, una dupa alta (asa cum ai putut vedea in lectia 1 (partea 1 si partea a 2-a)). Ai vazut si experimentat pana aici instructiuni ce au un efect vizual imediat (instructiunile Aprinde si Stinge, ce aprind, respectiv sting, un punct negru situat la coordonatele specificate pe un “ecran” virtual), precum si instructiuni cu ajutorul carora poti defini variabile si stoca valori in ele (asa cum ai vazut in lectia a 2-a). Niciuna dintre aceste instructiuni nu pare sa fie, insa, deosebit de inteligenta. Cum este posibil, atunci, ca un calculator sa poata executa operatii cu un grad semnificativ de “inteligenta”? Secretul consta in instructiunea “daca” (if — in limba engleza). Cu ajutorul ei, calculatorul e capabil sa raspunda la comenzi exprimate intr-un limbaj foarte apropiat de cel uman, de genul “daca o anumita conditie e indeplinita, atunci executa o serie de instructiuni; altfel executa o alta serie de instructiuni”. Intr-un program aceasta s-ar scrie in felul urmator: if (conditie) { // instructiuni … } else { // alte instructiuni … } In loc de conditie se pot pune verificari de egalitati sau inegalitati intre expresii ce pot contine valori, variabile si operatori. De exemplu, pentru a face un program de tip “ghiceste numarul”, am putea testa o conditie de genul if (nr_ghicit == nr_secret) …, unde nr_secret este o variabila in care am stocat numarul secret ce trebuie ghicit de catre jucator, iar nr_ghicit este numarul introdus de catre jucator in incercarea de a ghici numarul secret. (A se remarca faptul ca testarea egalitatii dintre doua valori numerice, valori de variabile sau expresii se face cu operatorul ==, si nu cu operatorul = (care este operatorul cu ajutorul caruia putem stoca o valoare intr-o variabila, asa cum ai vazut in lectia trecuta).) In cazul in care egalitatea de mai sus este adevarata, putem sa-i afisam jucatorului un mesaj in care sa-i spunem ca a ghicit. In caz contrar, ar trebui sa verificam daca numarul introdus de catre jucator este mai mare sau mai mic decat numarul ce trebuie ghicit si sa afisam un mesaj adecvat. Programul ar putea arata in felul urmator: // ————————— // Joc “Ghiceste numarul” // ————————— // Definesc variabilele: var nr_secret = 16; // numarul ce trebuie ghicit var nr_ghicit = 10; // <– aici se introduc incercarile de ghicire a numarului // Si apoi testez daca s-a ghicit numarul sau nu: if (nr_ghicit == nr_secret) { // Daca s-a ghicit numarul secret, atunci afiseaza “DA” pe ecran Aprinde(2, 3); Aprinde(2, 4); Aprinde(2, 5); Aprinde(2, 6); Aprinde(3, 3); Aprinde(3, 6); Aprinde(4, 4); Aprinde(4, 5); Aprinde(6, 3); Aprinde(6, 4); Aprinde(6, 5); Aprinde(8, 3); Aprinde(8, 4); Aprinde(8, 5); Aprinde(7, 6); Aprinde(7, 4); } else { // Daca nu s-a ghicit numarul secret, atunci afiseaza // “>” (mai mare) — daca numarul secret este mai mare, // sau “<” (mai mic) — daca numarul secret este mai mic. if (nr_secret > nr_ghicit) { Aprinde(6, 3); Aprinde(7, 4); Aprinde(8, 5); Aprinde(7, 6); Aprinde(6, 7); } else { Aprinde(5, 3); Aprinde(4, 4); Aprinde(3, 5); Aprinde(4, 6); Aprinde(5, 7); } } Te rog sa copiezi acest program si sa-l testezi folosind caseta de mai jos. Reseteaza afisajul 1 Executa programul Ce a aparut de ecran? Acum apasa butonul “Reseteaza afisajul” si modifica in program valoarea variabilei nr_ghicit, punand in loc de 10 valoarea 20. Ce se intampla acum daca apesi butonul “Executa programul”? Dar daca repeti operatiunile, folosind de asta data pentru nr_ghicit valoarea 16? Asa cum ai putut observa in programul anterior, in cadrul unui bloc de instructiuni dintr-o instructiune if se pot pune alte instructiuni de tip if. (In programul dat ca exemplu, blocul de instructiuni din ramura else contine o instructiune if … else … .) Desi instructiunea if este in esenta cea mai puternica instructiune pe care este capabil s-o execute un calculator, nu voi insista prea mult asupra ei aici.Ea va tot reveni in discutie in lectiile ulterioare, si va deveni din ce in ce mai clara pe masura ce o vei experimenta. Ca si in cazul jocului de Go, regulile in programare sunt destul de putine si simple, insa prin imbinarea lor in moduri ingenioase se pot obtine rezultate spectaculoase.
×
×
  • Create New...