Sunteți pe pagina 1din 161

UNIVERSITATEA TRANSILVANIA, BRAOV

DEPARTAMENTUL PENTRU PREGTIREA PERSONALULUI DIDACTIC

LUCRARE METODICO-TIINIFIC PENTRU OBINEREA GRADULUI DIDACTIC I

Coordonator, Prof. dr. Daniela MARINESCU, Univ. Transilvania - Braov, Facultatea de Matematic i Informatic

Autor, Prof. de informatic, Adrian MODRIAN, Colegiul Naional Andrei aguna, Braov

BRAOV, an colar 2008 - 2009

PROGRAMAREA PAGINILOR WEB FOLOSIND LIMBAJUL PHP

Coordonator, Prof. dr. Daniela MARINESCU, Univ. Transilvania - Braov, Facultatea de Matematic i Informatic

Autor, prof. de informatic, Adrian MODRIAN, Colegiul Naional Andrei aguna, Braov

BRAOV, An colar 2008 - 2009

Cuprins: 1. INTRODUCERE
1.1. Justificarea temei alese............................................................................................................................5 1.2. Descrierea capitolelor lucrrii.................................................................................................................6

2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB LIMBAJUL HTML


2.1. Scurt istoric al apariiei Internetului i funcionarea sa. Reeaua WWW. Conceptul de Hipertext........8 2.2. Despre website-uri................................................................................................................................10 2.3. HTML standard limbaj descriptiv al unei pagini WEB.....................................................................11
2.3.1 Scrierea de cod HTML. Editoare specializate i validatoare HTML..............................................................12 2.3.2. Structura de baz a unei pagini.......................................................................................................................12 2.3.3. Paragrafe. Atribute ale unui tag......................................................................................................................13 2.3.4. Elemente care permit formatarea textului.......................................................................................................14 2.3.5. Liste................................................................................................................................................................17 2.3.6. Imagini............................................................................................................................................................19 2.3.7. Specificarea culorilor n HTML.....................................................................................................................22 2.3.8. Tabele.............................................................................................................................................................23 2.3.9. Legturi (link-uri)...........................................................................................................................................26 2.3.10. Elemente de structur (HTML, HEAD, BODY)..........................................................................................29 2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME)....................................................................................31 2.3.12. Bare de separare (HR)..................................................................................................................................35 2.3.13. Formulare......................................................................................................................................................36

2.4. Extinderi ale limbajului HTML standard: HTML dinamic, script-uri..................................................41


2.4.1. CSS (Cascading Style Sheets)........................................................................................................................41 2.4.2. JavaScript........................................................................................................................................................45 2.4.3. DOM (Document Object Model)....................................................................................................................47

3. LIMBAJUL PHP FACILITI ALE ACESTUIA


3.1. Introducere scurt istoric al apariiei limbajului PHP; faciliti i mod de funcionare; similitudini ntre limbajele PHP i C++...........................................................................................................................51 3.2. Cerine tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii asupra instalrii.........52 3.3. Testarea instalrii. Structura unui fiier PHP........................................................................................53 3.4. Constante. Variabile. Operatori. Afiarea datelor.................................................................................58 3.5. Instruciuni ale limbajului PHP.............................................................................................................62
3.5.1. Instruciunea expresie.....................................................................................................................................62 3.5.2. Instruciunea bloc (se mai numete i compus)............................................................................................62 3.5.3. Instruciunea if................................................................................................................................................63 3.5.4. Instruciunea while.........................................................................................................................................63 3.5.5. Instruciunea do...while..................................................................................................................................64 3.5.6. Instruciunea for.............................................................................................................................................64

3.6. Transmiterea datelor prin intermediul formularelor.............................................................................65 3.7. Funcii n PHP.......................................................................................................................................71 3.8. Prelucrarea irurilor de caractere..........................................................................................................74 3.9. iruri (masive) n PHP..........................................................................................................................77 3.10. Programare grafic utiliznd PHP.......................................................................................................80 3.11. Upload de fiiere via PHP...................................................................................................................85 3.12. Variabile cookie..................................................................................................................................87 3.13. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP
3.13.1. Introducere n MySQL.................................................................................................................................89 3.13.2. Testarea instalrii MySQL. Configurarea bazei de date..............................................................................89 3.13.3. Crearea unei baze de date.............................................................................................................................91 3.13.4. Tabele...........................................................................................................................................................91 3.13.5. Tipuri de date n MySQL.............................................................................................................................93 3.13.6. Operatori utilizai n MySQL. Variabile......................................................................................................96 3.13.7. Funcii predefinite n MySQL......................................................................................................................99 3.13.8. Coloane calculate prin intermediul unei interogri....................................................................................101 3.13.9. Valoarea NULL..........................................................................................................................................102 3.13.10. Valori implicite pentru coloanele unei tabele...........................................................................................102 3.13.11. Cheie primar i cheie unic....................................................................................................................103 3.13.12. Coloane cu valori de tip autoincrementare...............................................................................................104
3

3.13.13. Sortarea datelor.........................................................................................................................................105 3.13.14. Filtrarea datelor........................................................................................................................................106 3.13.15. Actualizarea datelor..................................................................................................................................106 3.13.16. Funcii agregate........................................................................................................................................107 3.13.17. Subinterogri............................................................................................................................................108 3.13.18. Gruparea datelor.......................................................................................................................................109 3.13.19. Uniuni de tabele........................................................................................................................................111 3.13.20. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP...................................................115

4. APLICAII PRACTICE I METODOLOGICE


Reluarea, dintr-o alt perspectiv, a algoritmilor reprezentativi studiai la disciplina informatic n clasele a IX-a, a X-a i a XI-a.....................................................................................................................................118
4.1. Algoritmi care nu opereaz cu iruri (cifrele unui numr, numere prime, factori primi, cmmdc, irul lui Fibonacci)..................................................................................................................................................118 4.2. Algoritmi care opereaz cu iruri sau matrice (sortri, tergeri, inserri)...............................................................122 4.3. Prelucrarea irurilor de caractere.............................................................................................................................127 4.4. Probleme de Backtracking, Divide et Impera, Aplicaii ale geometriei analitice plane studiate n cadrul disciplinei matematic, Reprezentri de fractali.......................................................................................................................129

5. CONSIDERAII METODOLOGICE
5.1. Posibilitatea predrii limbajului PHP la clasa a XII-a; premise care faciliteaz introducerea sa n cadrul noilor programe colare. Analiza nsuirii sale de ctre elevi. Concluzii stabilite.............................156 5.2. Posibiliti de predare ct mai atractive ale informaticii, fr a se ajunge la banalizare: propunere de curs opional Programare grafic ntr-un limbaj vizual..................................................................158

Bibliografie:
1. Tudor Sorin i Vlad Huanu, Crearea i programarea paginilor WEB, Bucureti, L&S Infomat, 2004; 2. Vlad Huanu i Carmen Popescu, Manual de Informatic Intensiv pentru clasa a XII-a, Bucureti, L&S Infomat, 2007; 3. Bogdan Ptru, Internet pentru nceptori, Bucureti, Teora, 1998; 4. Traian Anghel, Programarea n PHP. Ghid practic, Iai, Polirom, 2005; 5. Julie C. Meloni, nva singur PHP, MySQL i APACHE, Bucureti, Corint, 2005; 6. Larry Ulman, PHP i MySQL pentru site-uri web dinamice, Bucureti, Teora, 2006;

Bibliografie Internet :
7. http://wikipedia.org enciclopedia liber; 8. http://www.php.net pagina oficial a grupului de lucru pentru dezvoltarea limbajului PHP; 9. http://www.w3schools.com set gratuit de tutoriale i documentaii pentru programarea paginilor web.

1. INTRODUCERE
1.1. Justificarea temei alese. ncepnd cu anii 95, Internetul, sub aspectul su cel mai popular, i anume al paginilor web, a cunoscut o amploare greu de imaginat. Dac la nceput, paginile web aveau un coninut simplu i oarecum stngace, n zilele noastre aspectul acestora s-a schimbat radical. Dup doar 10 ani, n paralel cu evoluia tehnicii de calcul, au evoluat i tehnicile de programare a acestora. Primele pagini permiteau doar navigarea prin coninutul lor, pe cnd n zilele noastre ele au o utilizare foarte larg, de la jocuri i aplicaii grafice dinamice la comer pe Internet. Aceste realiti au trebuit s-i gseasc o reflectare i asupra programelor colare din cadrul disciplinei informatic. Astfel, ncepnd cu anul colar 2007-2008, n cazul claselor cu specializare matematic-informatic, programa clasei a XII-a la disciplina informatic a devenit mult mai flexibil, permind iniierea elevilor noile tehnici care s-au impus n domeniul programrii paginilor web. Lucrarea de fa i propune n primul rnd s fie o unealt didactic, un manual colar care s i poat ajuta pe elevi n procesul de nvare, coninnd i ctva detalii mai tehnice, cum ar fi instalarea suportului software de care este nevoie pentru aplicarea noiunilor nvate. Limbajul PHP este un limbaj de programare destinat n primul rnd Internetului, aducnd dinamic unei pagini web. Este unul dintre cele mai importante limbaje de programare web open-source (codul surs este public, fiind accesibil tuturor) i server-side (rularea sa nu se face pe calculatorul celui care vizualizeaz pagina, ci pe server-ul care o conine). Este unul dintre cele mai folosite limbaje de programare server-side. Statisticile arat c la 1 mai 2008, suportul PHP este prezent pe 20 de milioane dintr-ul total de 70 de milioane de website-uri active din lumea ntreag. Popularitatea de care se bucur acest limbaj de programare se datoreaz urmtoarelor sale caracteristici: Familiaritatea sintaxa limbajului este foarte uoar, fiind foarte la ndemn n special pentru programatorii care cunosc limbajul C; Simplitatea sintaxa limbajului este destul de liber. Nu este nevoie de includere de biblioteci sau de directive de compilare, codul PHP inclus ntr-un document fiind trecut ntre nite marcaje speciale; Securitatea PHP-ul pune la dispoziia programatorilor un set flexibil i eficient de msuri de siguran;
5

Flexibilitatea fiind aprut din necesitatea dezvoltrii web-ului, PHP a fost modularizat pentru a ine pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat de un anumit server web, PHP-ul a fost integrat pentru numeroasele servere web exitente: Apache, IIS, Zeus, etc. Gratuitatea este, probabil, cea mai important caracteristic a PHP-ului. Dezvoltarea PHP-ului sub licena open-source a determinat adaptarea rapid a sa la nevoile web-ului, eficientizarea i securizarea codului.

1.2. Descrierea capitolelor lucrrii. n capitolul al II-lea al acestei lucrri (Fundamente teoretice ale paginilor WEB limbajul HTML) mi-am propus o parcurgere ceva mai amnunit, sub forma unui tutorial, a limbajului HTML standard, descriind tag-urile cele mai importante i exemplificnd aceste descrieri cu mici aplicaii. Capitolul se ncheie cu o trecere n revist, n care exist cteva exemple comentate, a tehnicilor de programare dinamice ale unei pagini web, care rmn ns tot pe domeniul HTML. Acest capitol este mai mult dect necesar, din cauz c PHP nu face altceva dect s ruleze programe n urma cruia este generat cod HTML. Nu putem aadar vorbi de limbajul PHP fr a cunoate HTML n capitolul al III-lea (Limbajul PHP faciliti ale acestuia) am fcut, la fel ca i n capitolul al II-lea, o parcurgere mai amnunit a elementelor limbajului PHP, cu exemple. Totodat, n acest capitol exist i cteva detalii tehnice despre instalarea pachetelor software necesare rulrii. n prima parte a capitolului al IV-lea (Aplicaii practice i metodologice), am reluat, din considerente metodice i din perspectiva programrii pe Internet, o serie de algoritmi studiai la disciplina informatic n clasele a IX-a, a X-a i a XI-a. De remarcat faptul c transcrierea algoritmilor propriu-zii n PHP rmne foarte similar limbajului C++. Principalul element care face diferena este dat de interfaa acestora, lucru normal de altfel, deoarece aplicaiile PHP sunt destinate n primul rnd utilizrii lor pe Internet, deci de ctre public foarte larg. Este motivul pentru care interfaa trebuie s prezinte un grad ridicat de interactivitate (adesea vorbim de "interfa inteligent") astfel nct s permit o comunicare ct mai simpl dintre utilizator i aplicaie.

n a doua parte a aceluiai capitol mi-am propus abordarea interdisciplinar matematic-informatic a geometriei analitice plane, studiate de ctre elevi n clasa a XI-a. Tot n aceast parte am propus o serie de aplicaii care realizeaz reprezentri grafice de fractali. Ultimul capitol al lucrrii (Consideraii metodologice) conine, n prima sa parte, o analiz, din punct de vedere metodic, al modului de adaptare i de reacie al elevilor de clasa a XII-a la noul coninut al programei colare. n ultima parte propune analiza unui curs opional, care atinge un alt subiect de actualitate al informaticii, i anume programarea ntr-un limbaj vizual. Lucrarea este nsoit i de un CD-rom cu urmtorul coninut: A) Pachetul software xampp, necesar rulrii server-ului http, limbajului php i bazei de date mysql; B) Prezenta lucrare, n format digital (.pdf); C) Codurile surs ale exemplelor utilizate pe parcursul lucrrii (fiiere .html respectiv .php fiecare exemplu prezent n cadrul lucrrii va avea o referire la un astfel de fiier, de exemplu:
apl10.html, sau apl30.php).

2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB LIMBAJUL HTML


2.1. Scurt istoric al apariiei Internetului i funcionarea sa. Reeaua WWW. Conceptul de Hipertext. Istoria Internetului ncepe cu anul 1968, cnd guvernul S.U.A. inteniona s interconecteze universitile, departamentele militare i de aprare ale rii, astfel nct ele s coopereze n cadrul unor proiecte de cercetare comune. Astfel, s-a format o agenie numit Advanced Research Projects Agency (ARPA). Una din cheile proiectului punea n discuie faptul c, stocarea tuturor informaiilor pe un singur calculator nu ar fi fost deloc sigur, fie din cauz c acesta ar putea fi int vulnerabil a unui eventual atac, fie pur i simplu din cauz c acestea ar putea fi pierdute n cazul unei defeciuni tehnice majore. O metod de a face fa unei asemenea situaii ar fi de a copia i distribui informaiile pe mai multe calculatoare, n ntreaga ar, folosind o reea. n 1975, cteva dintre limbajele sau protocoalele pe care calculatoarele le foloseau pentru a comunica ntre ele s-au standardizat. Majoritatea universitilor importante i a departamentelor de aprare din S.U.A. s-au legat mpreun ntr-o reea numit DARPANET, toate calculatoarele folosind acelai protocol pe care astzi l cunoatem sub denumirea de TCP/IP. Reeaua, cu timpul, a fost nlocuit de mai multe reele, care astzi mpnzesc globul pmntesc. ncepnd cu anul 1980, mai multe colegii i universiti au fost conectate la Internet. Acest lucru a permis universitilor s-i mpart informaii despre cercetrile lor, programe i tiri recente. n anii 90 Internetul s-a deschis i n scopuri comerciale. n curnd, multe alte ci de utilizare a informaiilor transmise prin intermediul acestei gigantice reele au fost dezvoltate. n prezent, este posibil s foloseti Internetul pentru a trimite scrisori electronice pe ntregul glob n doar cteva secunde. Poi cuta informaii despre orice subiect doreti. Expresia World Wide Web (WWW) definete o colecie de documente care se ntinde n cteva sute de milioane de calculatoare. Principiul de baz al funcionrii Internetului const n faptul c dou sau mai multe calculatoare pot comunica ntre ele. Pentru ca acest lucru s fie posibil este necesar s existe un protocol, adic un ansamblu de norme care trebuie respectate de calculatoare (deci de programele care ruleaz pe ele) pentru ca schimbul de date s poat avea loc. Normele se refer la: gsirea calculatorului destinatar al transferului de date; transmiterea efectiv a datelor; modaliti prin care expeditorul comunic faptul c au fost transmise toate datele, iar destinatarul comunic faptul c le-a recepionat;
8

compresia datelor: prin aplicarea anumitor algoritmi matematici, datele care urmeaz s fie expediate sunt prelucrate de aa natur, nct s fie memorate prin utilizarea unui spaiu ct mai mic de memorie. Prin urmare, transmiterea lor dureaz mai puin. Invers, la destinaie sunt decompresate prin utilizarea acelorai algoritmi matematici; identificarea erorilor care pot interveni n transmiterea datelor: i aici exist mai muli algoritmi care permit identificarea i corectarea erorilor. Standardul care s-a impus n ceea ce privete Internetul, const n protocolul TCP/IP. Numele este de fapt, numele comun al unei familii de protocoale utilizate pentru transferul datelor n reea. Orice calculator conectat la Internet are o adres, numit adres IP (Internet Protocol Address). O adres IP este alctuit din 4 numere ntre 0 i 255, prin urmare o astfel de adres ocup 4 octei. Cum transmiterea datelor la un moment dat se face ntre dou calculatoare, datele se transmit de la o adres IP la alta. Protocolul IP (Internet Protocol) reglementeaz transmiterea datelor de la o adres IP la alta. Datele sunt transmise divizate n pachete. n acest fel, se prentmpin monopolizarea transmisiei n reea doar de ctre un singur utilizator. Protocolul TCP (Transmission Control Protocol): de la plecare, un program TCP mparte informaia de transmis n mai multe pachete IP. Acestea sunt transmise la destinaie prin intermediul reelei. O dat ajunse la destinaie, un alt program TCP asambleaz i aranjeaz n ordinea corect pachetele IP de date primite. Firete, din cauza unor probleme hardware, unele pachete se pot pierde pe drum. Protocolul TCP se ocup i de acest lucru. Astfel, cnd mpacheteaz datele ntr-un plic IP, protocolul TCP al expeditorului adaug i un numr (numit sum de control) care va permite destinatarului s se asigure de faptul c datele primite sunt corecte. Receptorul recalculeaz suma de control i o compar cu cea transmis de emitor. Dac ele nu sunt identice, nseamn c a aprut o eroare n timpul transmisiei, motiv pentru care protocolul TCP anuleaz acel pachet, cernd retransmiterea sa. Bazele World Wide Web (WWW) au fost puse n 1989 la Centrul European de Cercetri Nucleare (CERN) n Geneva (Elveia). Propunerea iniial de creare a unei colecii de documente avnd legturi ntre ele a fost fcut de Tim Berners-Lee n martie 1989. Aceast propunere a aprut n urma problemelor de comunicare pe care le ntmpinau echipele de cercettori ce foloseau centrul, chiar i folosind pota electronic.

Primul server web folosit de Tim Berners-Lee a aprut nu mult nainte de decembrie 1991, cnd s-a fcut prima lui demonstraie public. Studiul a fost continuat prin apariia primei aplicaii grafice Mosaic, n februarie 1993, realizat de cercettorul Marc Andreessen de la centrul universitar National Center for Supercomputing Applications (NCSA) din oraul UrbanaChampaign din statul federal Illinois, SUA. Ulterior WWW-ul a evoluat pn la ceea ce este astzi, un serviciu integrativ i multimedial, avnd ca suport fizic Internetul. Practic, WWW este un sistem de documente i informaii de tip hipertext legate ele ntre ele, care pot fi accesate prin reeaua mondial de Internet. Documentele, care rezid n diferite locaii pe diverse calculatoare-server, pot fi regsite cu ajutorul unei adrese unice. Hipertextul este prelucrat cu un ajutorul unui program de navigare n web numit browser care descarc paginile web de pe un server web i le afieaz pe un terminal. Prin conceptul de hipertext se nelege o form de document electronic, o metod de organizare a informaiilor n care datele sunt memorate ntr-o reea de noduri i legturi, putnd fi accesat prin intermediul programelor de navigare interactiv, i manipulat de un editor structural. Conceptul de baz n definirea hipertextului este "legtura" (link-ul), fie n cadrul aceluiai document, fie ctre alt document. Legtura de tip link permite organizarea neliniar a informaiilor. Un sistem hipertext permite autorului su s creeze aa-numite "noduri", s le lege ntre ele, iar unui cititor navigarea de la un nod la altul. Astfel un nod reprezint un concept putnd conine orice fel de informaie: text, grafic, imagini, animaii, sunete, etc. Nodul surs al unei legturi se numete "referin" iar cel destinaie "referent" sau ancor, punctele de legtur din respectivele noduri fiind marcate. Activarea marcajelor unei legturi duce la vizualizarea nodurilor. Asocierea cu unele elemente mediale a dus la extinderea noiunii de hipertext ctre "hipermedii".

2.2. Despre website-uri. Noiunea de website (sau pur i simplu site, ori site web) desemneaz o grup de pagini web multimediale (coninnd texte, imagini fixe, imagini mictoare i chiar sunete), accesibile n Internet n principiu oricui, de obicei pe o tem anume, i care sunt conectate ntre ele prin aanumite hyperlinkuri. Diversele situri web pot fi oferite de ctre o companie, un proiect, o reea de utilizatori, o persoan particular, o administraie public i multe altele.

10

Pentru crearea paginilor web s-a impus limbajul HTML (HyperText Markup Language) un limbaj de marcare, al crui scop const n prezentarea ntr-un anumit format a informaiilor: paragrafe, tabele, fonturi, culori, .a.m.d. Calculatorul pe care se gsete site-ul se numete server, iar calculatoarele care acceseaz coninutul site-ului se numesc client. Orice calculator client trebuie s dispun de un program specializat, numit browser, cu ajutorul cruia s se poat interpreta i deci vizualiza fiierele HTML. Pe server trebuie s se gseasc un program care rspunde cererilor browser-ului aflat pe calculatorul client. Cererea efectuat de ctre browser i rspunsul server-ului se fac prin respectarea unui anumit protocol. Acest protocol se numete HTTP (HyperText Transfer Protocol).

2.3. HTML standard limbaj descriptiv al unei pagini WEB. HTML este un limbaj de marcare orientat ctre prezentarea documentelor text pe o singura pagin. Utiliznd un software de redare specializat, numit agent utilizator HTML (cel mai bun exemplu de astfel de software fiind browserul web) HTML furnizeaz mijloacele prin care coninutul unui document poate fi adnotat cu diverse tipuri de metadate i indicaii de redare. Indicaiile de redare pot varia de la decoraiuni minore ale textului (cum ar fi specificarea faptului c un anumit cuvnt trebuie subliniat sau c o imagine trebuie introdus) pn la scripturi sofisticate, hri de imagini i formulare. Metadatele pot include informaii despre titlul i autorul documentului, informaii structurale despre cum este mprit documentul n diferite segmente, paragrafe, liste, titluri etc. i informaii cruciale care permit ca documentul s poat fi legat de alte documente pentru a forma astfel hiperlink-uri. HTML este un format text proiectat pentru a putea fi citit i editat de oameni utiliznd un editor de text simplu. Totui scrierea i modificarea paginilor n acest fel solicit cunotine solide de HTML i este consumatoare de timp. Editoarele grafice cum ar fi Macromedia Dreamweaver sau Microsoft FrontPage permit ca paginile web sa fie tratate asemntor cu documentele Word, dar cu observaia c aceste programe genereaz un cod HTML care este de multe ori de proast calitate. HTML se poate genera direct utiliznd tehnologii de codare din partea serverului cum ar fi PHP, JSP sau ASP.

11

2.3.1 Scrierea de cod HTML. Editoare specializate i validatoare HTML. Crearea unui fiier HTML este foarte simpl, putnd fi fcut cu ajutorul oricrui editor de text. Totui, pentru a avea un control ridicat asupra corectitudinii codului scris, este recomandat s utilizm un editor specializat, care s pun n eviden diversele elemente de marcare (TAG-uri, numite i elemente sau etichete) sau, mai mult, s poat verifica i detecta erorile. Din categoria editoarelor care pun n eviden diferitele elemente face parte editorul Notepad++, iar din categoria validatoarelor face parte CSE HTML Validator Lite, ambele fiind gratuite i putnd fi descrcate de pe Internet.

2.3.2. Structura de baz a unei pagini. Structura de baz a unei pagini HTML este urmtoarea (apl001.html):

Iat i modul n care pagina de mai sus este vizualizat n Internet Explorer:

Din analiza exemplului observm c: O pagin ncepe cu tag-ul <HTML> i se termin cu tag-ul </HTML>; O pagin conine un antet (HEAD) i corpul propriu-zis (BODY); Antetul este cuprins ntre etichetele <HEAD> i </HEAD>; Corpul este cuprins ntre etichetele <BODY> i </BODY>;

12

Opional, antetul poate conine titlul paginii, cuprins ntre tag-urile <TITLE> i </TITLE>. Titlul apare pe bara de titlu a ferestrei afiate n browser. Corpul poate conine texte i/sau imagini. n exemplu, pagina conine textul Acesta este primul exemplu de pagina... Comentariile, care nu sunt afiate de ctre browser, pot fi scrise ntre tag-urile <!-- i -->. Numele tag-urilor nu sunt case sensitive, deci pot fi scrise att cu litere mici ct i cu litere mari. n continuare, pentru a le pune n eviden, le vom scrie cu litere mari.

2.3.3. Paragrafe. Atribute ale unui tag. n general, textele coninute de o pagin se pot gsi n mai multe paragrafe. Un paragraf se introduce ntre tag-urile <P> ... </P>. La afiare, dou paragrafe consecutive vor fi separate printr-o linie goal. Tag-ul </P> poate lipsi; un nou paragraf poate fi detectat prin tag-ul <P>. n cadrul unui fiier HTML, Enter-ul nu are nici un efect. De asemenea, dac dou cuvinte ale unui paragraf sunt separate prin mai multe spaii sau alte caractere albe (enter-uri, tab-uri), browser-ul afieaz doar un singur spaiu. Majoritatea tag-urilor li se pot specifica atribute. Acestea determin comportamentul mai amnunit al elementului respectiv. Un atribut se specific nainte de nchiderea parantezei unghiulare a tag-ului (>) prin
nume_atribut=valoare.

n cazul paragrafului, atributul align controleaz alinierea textului din cadrul paragrafului. Dac acest atribut nu este prezent, alinierea este fcut n mod implicit la stnga. Acest atribut poate lua una dintre valorile center, left, right, justify, ca n exemplul de mai jos (apl002.html):
<HTML> <HEAD> <TITLE>Alinierea paragrafelor</TITLE> </HEAD> <BODY> <P align="center">Aliniat in centru</P> <P align="right">Aliniat la dreapta</P> <P align="left">Aliniat la stinga</P> <P align="justify">Paragraful acesta este aliniat la ambele margini</P> </BODY> </HTML>
13

Iat pagina al crei cod tocmai a fost prezentat, vizualizat n Internet Explorer:

2.3.4. Elemente care permit formatarea textului. <BR> : Are ca efect forarea afirii a ceea ce urmeaz pe rndul urmtor. Acest tag nu creeaz un nou paragraf (s ne reamintim c ntre dou paragrafe este automat lsat o linie vid) <B>...</B> : Are rolul de a afia bold (ngroat) textul cuprins ntre cele dou tag-uri ale sale. Un tag sinonim al lui <B> este: <STRONG>...</STRONG> <I>...</I> : Are rolul de a afia italic (nclinat) textul cuprins ntre cele dou tag-uri ale sale. Tag-uri sinonime ale lui <I> sunt: <EM>...</EM>, <DFN>...</DFN>,<CITE>...</CITE>. <U>...</U> : Are rolul de a afia subliniat textul cuprins ntre cele dou tag-uri ale sale. Un tag sinonim al lui <U> este: <INS>...</INS> <S>...</S> : Are rolul de a afia tiat (cu o linie orizontal) textul cuprins ntre cele dou tag-uri ale sale. Un tag sinonim al lui <S> este: <DEL>...</DEL> <BIG>...</BIG> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai mare dect textul n care este cuprins. <SMALL>...</SMALL> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai mic dect textul n care este cuprins. <SUP>...</SUP> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai sus (ca o putere) <SUB>...</SUB> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai sus (ca un indice)

14

<TT>...</TT> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai sus monospaiat (toate caracterele ocup aceeai lungime practic, se folosete fontul Courier New) n cod-ul HTML de mai jos gsii toate aceste tag-uri exemplificate (apl003.html):
<HTML> <HEAD> <TITLE>Formatarea textului</TITLE> </HEAD> <BODY> <P> <B>Acest text este afisat folosind tag-ul B</B> <BR> <STRONG>Acest text este afisat folosind tag-ul STRONG</STRONG> <BR> <I>Acest text este afisat folosind tag-ul I</I> <BR> <DFN>Acest text este afisat folosind tag-ul DFN</DFN> <BR> <EM>Acest text este afisat folosind tag-ul EM</EM> <BR> <U>Acest text este afisat folosind tag-ul U</U> <BR> <INS>Acest text este afisat folosind tag-ul INS</INS> <BR> <S>Acest text este afisat folosind tag-ul S</S> <BR> <DEL>Acest text este afisat folosind tag-ul DEL</DEL> <BR> Normal <BIG>Mai mare</BIG> Normal <BR> Normal <SMALL>Mai mic</SMALL> Normal <BR> Iata si un <SUP>exponent</SUP> <BR> iar acum un <SUB>indice</SUB> <BR> <TT>Acest text este monospatiat</TT> </P> </BODY> </HTML>

Acest cod vizualizat n browser arat n felul urmtor:

Pentru scrierea titlurilor se utilizeaz tag-urile <H1>...<H1>, <H2>...<H2>, . . . ,


<H6>...<H6>. Practic, n funcie de numrul de dup H mrimea fontului difer (<H1> utilizeaz

fontul de dimensiune maxim, <H6> fontul de dimensiune minim) iar textul care apare ntre tag-uri este scris ngroat (bold). Pentru stabilirea font-ului se folosete tag-ul <FONT>...<FONT>. Atributele acestuia sunt: - face indic numele font-ului - size indic mrimea (trebuie s fie un numr cuprins ntre 1 i 7. Implicit este 3)

15

- color permite specificarea culorii. Aceasta se specific fie prin intermediul constantelor predefinite ale HTML-ului (numele englezesc al culorii) fie prin componentele sale de Rou, Verde i Albastru exprimate n hexazecimal, de forma #RRGGBB (vom detalia aceste constante de culoare ceva mai ncolo). Iat un exemplu de utilizare al lor (apl004.html):
<HTML> <HEAD> <TITLE>Exemplificare titluri si font</TITLE> </HEAD> <BODY> <P> <H1>Acesta este un titlu de tip H1</H1> <H2>Acesta este un titlu de tip H2</H2> <H3>Iar acesta este un titlu de tip H3</H3> <FONT face="arial" color="blue" size="4"> Acest text este scris cu fontul Arial, albastru, dimensiune 4 </FONT><BR> Iar acest text este scris normal<BR> </P> <P> Iata si culorile cucubeului, scrise cu font-ul Comic Sans MS, bold, dimensiune 7:<br> <B> <FONT face="Comic Sans MS" size="7" color="red">R</FONT> <FONT face="Comic Sans MS" size="7" color="orange">O</FONT> <FONT face="Comic Sans MS" size="7" color="yellow">G</FONT> <FONT face="Comic Sans MS" size="7" color="green">V</FONT> <FONT face="Comic Sans MS" size="7" color="blue">A</FONT> <FONT face="Comic Sans MS" size="7" color="darkblue">I</FONT> <FONT face="Comic Sans MS" size="7" color="magenta">V</FONT> </B> </P> </BODY> </HTML>

Vizualizat n browser:

Aa cum am vzut, dac n cadrul unui text din cadrul documentului HTML apare un grup de mai multe spaii, n browser va fi afiat doar unul singur. Dac dorim forarea afirii unui spaiu, se folosete identificatorul special &nbsp; (ultimul caracter, ;, face parte din identificator)

16

2.3.5. Liste. Acestea permit ca anumite enunuri (texte, elemente) s fie numerotate sau marcate ntr-un anumit fel. O astfel de organizare poart numele de liste. n HTML distingem 3 feluri de liste: Liste ordonate (Ordered Lists): sunt liste n care elementele sunt numerotate. Inserarea lor n cadrul documentului HTML se face prin tag-urile <OL>...</OL>, elementele (itemii) lor fiind introduse ntre aceste dou tag-uri prin <LI>...</LI> (tag-ul de sfrit nefiind obligatoriu). Implicit, numerotarea se face cu numere arabe (1, 2, 3, ...). Ea poate fi modificat prin folosirea atributului type n cadrul tag-ului OL. Acesta poate lua una dintre valorile: - a : numerotarea se va face cu litere mici (a, b, c, ...) - A : numerotarea se va face cu litere mari (A, B, C, ...) - i : numerotarea se va face cu numere romane mici (i, ii, iii, iv ...) - I : numerotarea se va face cu numere romane mari (I, II, III. IV, ...) - 1 : (implicit) numerotarea se va face cu numere arabe obinuite (1, 2, 3, ...) Iat un exemplu de cod i vizualizarea sa n browser (apl005.html):
<HTML> <HEAD> <TITLE>Liste</TITLE> </HEAD> <BODY> <P> Iata o lista ordonata implicita: <OL> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </OL> Iata si o alta lista, cu numere romane <OL type="i"> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </OL> </P> </BODY> </HTML>

Liste neordonate (Unordered Lists): sunt liste n care elementele nu sunt numerotate, ci n dreptul fiecruia este afiat un marcator. Inserarea lor n cadrul documentului HTML se face prin tag-urile <UL>...</UL>, elementele (itemii) lor fiind introduse ntre aceste dou tag-uri prin <LI>...</LI> (tag-ul de sfrit nefiind obligatoriu). Implicit, marcarea lor se face prin cerculee pline. Ea poate fi modificat prin folosirea atributului type n cadrul tag-ului UL. Acesta poate lua una dintre valorile:
17

- disc : marcarea se face cu cerculee pline (implicit) - square : marcarea se face cu ptrele - circle : marcarea se face cu cerculee goale Iat un exemplu de cod i vizualizarea sa n browser (apl006.html):
Iata o lista neordonata implicita: <UL> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </UL> Iata si o alta lista, marcata cu patratele <UL type="square"> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </UL> Si alta, marcata cu cerculete goale <UL type="circle"> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </UL>

Liste de definiie (Definition Lists): au rolul de a descrie o list de definiii. Inserarea lor n cadrul documentului HTML se face prin tag-urile <DL>...</DL>. Elementele lor sunt de dou tipuri: - Termenul care este definit: este introdus ntre tag-urile <DT>...</DT> (tag-ul de sfrit nefiind obligatoriu). - Definiia propriu-zis: este introdus ntre tag-urile <DD>...</DD> (tag-ul de sfrit nefiind obligatoriu). Iat un exemplu de cod i vizualizarea sa n browser (apl007.html):
Iata o lista de definitie: <DL> <DT>Leontopodium Alpinum</DT> <DD>Este numele stiintific al florii de colt. Este o planta ocrotita. Creste la altitudini mari, in locuri stancoase</DD> <DT>Dianthus Callizonus</DT> <DD>Este numele stiintific al Garofitei Pietrei Craiului. Este o planta ocrotita. Fiind un endemism, este o planta unica in lume. Practic, aceasta specie de garofita, in afara de locul sau de origine, si anume masivul Piatra Craiului din apropierea Brasovului, nu se mai intilneste in nici un alt loc de pe planeta</DD> <DT>Aconitum Napellus</DT> <DD>Este numele stiintific al Omagului. Este o planta otravitoare. Totusi, in cantitati foarte mici contine o substanta activa din care este preparat un medicament contra tusei</DD> </DL>

18

2.3.6. Imagini. Tag-ul utilizat pentru inserarea unei imagini n documentul HTML este <IMG>. Forma general a acestui element este <IMG atribute>. Acest tag nu are i form de nchidere. Atributele sale sunt: src identific fiierul efectiv de pe disc, ce conine imaginea respectiv. Dac imaginea se afl n directorul curent, se specific doar numele i extensia sa. Dac se afl ntr-un subdirector, acesta se specific naintea numelui i extensiei imaginii, separat prin caracterul /. Imaginile recunoscute de majoritatea browser-elor internet sunt de tip .jpg, .gif, .png align specific tipul de aliniere al imaginii n raport cu textul n cadrul cruia se afl. Acesta poate lua una dintre valorile urmtoare: - right : imaginea se aliniaz n dreapta, iar textul care urmeaz este scris n locul rmas liber, n stnga acesteia; - left : imaginea se aliniaz n stnga, iar textul care urmeaz este scris n locul rmas liber, n dreapta acesteia; - top : doar latura de sus a imaginii se aliniaz cu rndul de text n cadrul cruia se afl; urmtorul rnd de text va fi afiat dup imagine, ocupnd ntreaga lime a ecranului; - middle : rndul de text n cadrul cruia se afl imaginea se aliniaz la jumtatea nimii acesteia; urmtorul rnd de text va fi afiat dup imagine, ocupnd ntreaga lime a ecranului; - bottom : doar latura de jos a imaginii se aliniaz cu rndul de text n cadrul cruia se afl; urmtorul rnd de text va fi afiat dup imagine, ocupnd ntreaga lime a ecranului; Dac dorim ntreruperea unei alinieri de imagine de tip right sau left nainte ca textul s fi umplut spaiul liber din stnga, respectiv dreapta acesteia, putem folosi tag-ul br, cruia i adugm unul dintre atributele clear=left sau clear=right sau clear=all, dup caz. atributul alt=text permite specificarea unui text alternativ ce va fi afiat fie dac meninem cursorul de mouse asupra imaginii, fie n locul imaginii propriu-zise, n cazul n care imaginea nu poate fi ncrcat din cauza unei probleme de conexiune. Iat cteva exemple, cu tot cu vizualizarea lor n browser: 1) Exemplu la folosirea atributului align=right i a atributului
alt=text :(apl008.html)
<P>Acest text este asezat inaintea imaginii<br> <IMG SRC="dog.jpg" align="right" alt="catelus"> In schimb, acest text este aliniat in stinga imaginii, deoarece am folosit atributul align="right" in momentul in care am inserat imaginea in pagina noastra web prin intermediul tag-ului src. </P>
19

2) Exemplu la folosirea opiunii align=right mpreun cu tag-ul <br clear=right> (apl009.html):


<P> Acest text este asezat inaintea imaginii<br> <IMG SRC="dog.jpg" align="right" alt="catelus"> Acest text, aliniat in stinga imaginii, il intrerupem fortat AICI <BR clear="right"> In acest fel, restul textului se va alinia in mod obisnuit, sub imagine, restul spatiului din stinga raminind liber. </P>

3) Exemplu la folosirea opiunii (apl010.html):

align=top

<P> Acest text este asezat inaintea imaginii <br> Se observa ca <IMG SRC="dog.jpg" align="top" alt="catelus"> doar primul rind al textului este aliniat cu latura de sus a imaginii, restul textului fiind afisat dupa imagine </P>

4) Exemplu la folosirea opiunii (apl011.html):

align=middle

<P> Acest text este asezat inaintea imaginii <br> Se observa ca <IMG SRC="dog.jpg" align="middle" alt="catelus"> doar primul rind al textului este aliniat la jumatatea inaltimii imaginii, restul textului fiind afisat dupa imagine </P>

5) Exemplu la folosirea opiunii align=bottom (apl012.html):


<P> Acest text este asezat inaintea imaginii <br> Se observa ca <IMG SRC="dog.jpg" align="top" alt="catelus"> doar primul rind al textului este aliniat cu latura de jos a imaginii, restul textului fiind afisat dupa imagine </P>

atributele height i width permit specificarea altor dimensiuni pentru imagine, dect cele reale ale acesteia. Evident, dac dimensiunile nu sunt proporionale cu cele reale, imaginea va fi deformat. Totodat, dac specificm dimensiuni mai mari dect cele reale, imaginea se va vedea mai puin clar. n realitate, imaginea este transferat de pe server la dimensiunile sale originale, redimensionarea avnd loc doar la nivelul calculatorului pe care este vizualizat pagina.
20

Iat un exemplu de folosire al celor dou tag-uri, i vizualizarea acestui exemplu n browser (apl013.html):
<P> Imaginea originala are dimensiunile 200x150: <BR> <IMG src="dog.jpg"> <BR> Iat-o redimensionata proportional la 100x75: <BR> <IMG src="dog.jpg" width="100" height="75"> <BR> Iat-o si deformata:<BR> <IMG src="dog.jpg" width="50" height="100"> sau <IMG src="dog.jpg" width="150" height="50"> <BR> </P>

atributul border permite stabilirea grosimii unui chenar care va nconjura poza. Implicit, valoarea acestui atribut este 0, ceea ce nseamn c imaginea nu este nconjurat de chenar (apl014.html):
<P> Imaginea este inconjurata de un chenar de dimenisiune 10<br> <IMG src="dog.jpg" border="10"> </P>

atributele hspace=nr.pixeli respectiv vspace=nr.pixeli permit stabilirea distantei minime care separa imaginea de celelalte obiecte pe vertical, respectiv pe orizontal (apl015.html):
<P> Iata o aliniere a imaginii de tip "right", aliniere <IMG src="dog.jpg" align="right"> in cadrul careia nu am modificat nici unul dintre cele doua atribute care controleaza spatierea dintre imagine si restul elementelor, pe orizontala respeciv pe verticala <BR clear="all"><BR> Iata acum o aliniere a imaginii tot de tip "right", aliniere <IMG src="dog.jpg" align="right" hspace="15" vspace="20"> in cadrul careia am modificat ambele atribute care controleaza spatierea dintre imagine si restul elementelor, stabilind valorile de 20 pe verticala respeciv de 15 pe orizontala <BR clear="all"> </P>

21

2.3.7. Specificarea culorilor n HTML. O serie de elemente din HTML permit utilizarea de atribute de culoare. Acestea pot fi specificate n dou moduri: prin constanta HTML ce reprezint numele culorii (n englez, bineneles). Exist 216 astfel de constante recunoscute de majoritatea browser-elor. Ne vom limita n a le enumera doar pe cele 16 care sunt considerate de baz, exemplificndu-le pe fiecare:

O serie dintre culori (ns nu toate) au i constante n variantele dark (nchis) respectiv light (deschis). De exemplu: darkred sau lightblue. prin constanta de tip RGB (Red, Green, Blue): Principiul de baz al redrii electronice ale unei imagini n culori se bazeaz pe amestecarea n proporii diferite ale culorilor Rou, Verde i Albastru. n acest mod, se poate obine orice culoare se dorete. n cazul culorilor pe care le poate reda un browser HTML, fiecare dintre aceste componente de culoare poate avea 256 de stri posibile: de la 0, care nseamn c respectiva culoare lipsete cu desvrire, pn la 255, care nseamn c respectiva culoare este folosit la intensitatea maxim. n acest fel, prin amestecuri diferite, putem obine 2563, deci aproximativ 16 milioane de nuane diferite. Componentele de culoare n HTML se specific folosind numere hexazecimale. Astfel, fiecare dintre numerele dintre 0 i 255 se codific n hexazecimal printr-un numr ntre 00 i FF. Constanta HTML pentru specificarea unei culori are forma general #RRGGBB, n care RR, GG respectiv BB reprezint cte un numr hexazecimal cuprins ntre 00 i FF. Iat cteva exemple de culori obinute folosind constante de forma celei de mai sus:

22

2.3.8. Tabele. Tabelele reprezint un element foarte important al unei pagini web. n foarte multe cazuri, tabele cu chenare invizibile sunt folosite ca i schelet al paginii, pentru a putea realiza alinieri complexe ale elementelor acesteia. Tag-ul pentru descrierea unui tabel este <TABLE>...</TABLE>. n cadrul acestora trebuie descrise liniile (rndurile) tabelului, n cadrul fiecrui rnd trebuind descrise celulele acestuia. Descrierea unui rnd se face ntre tag-urile <TR>...</TR>. La rndul lor, celulele din cadrul rndului se descriu ntre <TD>...</TD>. Att tag-ul </TR> ct i tag-ul </TD> pot fi omise. Un prim atribut al tag-ului <TABLE> este border=grosime_pixeli. Dac acest atribut este omis, tabelul va avea un chenar invizibil. Dac se specific doar atributul, omind grosimea, aceasta va fi luat, implicit, ca fiind 1. Iat un exemplu de cod pentru definirea unui tabel (apl016.html):
<TABLE border> <TR> <TD>Rindul <TD>Rindul <TR> <TD>Rindul <TD>Rindul </TABLE> 1, celula 1 1, celula 2 2, celula 1 2, celula 2

Atribute ale tag-ului <TABLE> cellpadding=nr_pixeli permite stabilirea unui spaiu care va fi lsat, n fiecare celul a tabelului, ntre coninutul celulei i marginile acesteia. Dac nu se specific acest atribut, el este n mod implicit considerat 0 cellspacing=nr_pixeli permite stabilirea spaiului care va fi lsat ntre chenarele celulelor vecine n tabel (i inclusiv ntre ele i chenarul exterior al tabelului). Dac nu se specific acest atribut, el este n mod implicit considerat 2. Coninutul unei celule poate fi ct se poate de general: de la text i imagini pn la alte tabele (se pot deci construi chiar i tabele imbricate), ca n exemplul urmtor (apl017.html):

23

<TABLE border="1" cellspacing="4" cellpadding="5"> <TR> <TD> Poza cu catelus<BR> <IMG src="dog.jpg"> <TD> Tabel cu baieti <TABLE border cellspacing="0"> <TR><TD>Mihai <TR><TD>Costel <TR><TD>Alin </TABLE> <TD> Tabel cu fete <TABLE border cellspacing="0"> <TR><TD>Mihaela <TR><TD>Costina <TR><TD>Alina </TABLE> </TABLE>

width=lime poate stabili ct de lat s fie tabelul. Limea poate fi dat n procente, caz n care se va calcula ca i procent din limea ferestrei browser-ului (ex: width=50%) sau n pixeli (ex: width=500); height=nlime poate stabili ct de nalt s fie tabelul. Limea poate fi dat, la fel ca i n cazul atributului width, n procente sau n pixeli; align determin alinierea tabelului n pagin. Poate la una dintre valorile left, right sau center. Dac, pe lng tabel, mai scriem i text, acesta se va poziiona fa de tabel n acelai mod n care se poziioneaz i fa de imagini; bgcolor=culoare permite stabilirea culorii de fundal a tuturor celulelor tabelului; bordercolor=culoare permite stabilirea culorii chenarului (deopotriv cel interior ct i cel exterior)

Atribute ale tag-ului <TR> align determin, pentru toate celulele de pe linie, modul alinierii coninutului pe orizontal, n interiorul celulelor. Poate la una dintre valorile left, right, center sau justify; valign determin, pentru toate celulele de pe linie, modul alinierii coninutului pe vertical, n interiorul celulelor. Poate la una dintre valorile top, bottom sau middle; bgcolor determin, pentru toate celulele de pe linia respectiv, culoarea de fundal.

Atribute ale tag-ului <TD> width i height determin, pentru celula respectiv, limea i nlimea. Poate fi dat n procente sau pixeli. Dac e specificat n procente, se va lua din limea, respectiv nlimea

24

tabelului. Modificarea limii i a nlimii unei celule va avea efect i asupra celorlalte celule, pentru ca tabelul s fie aliniat; align i valign stabilesc, la fel ca i n cazul lui <TR>, modul n care este aliniat coninutul n interiorul celulei, pe orizontal respectiv pe vertical, fiind prioritare fa de alinierea la nivel de linie colspan=n stabilete ntinderea celulei respective n dreapta cu n coloane (echivalentul operaiei Merge Cells din Word, n cazul n care unim celule adiacente pe orizontal); rowspan=n stabilete ntinderea celulei respective n jos cu n linii (echivalentul operaiei Merge Cells din Word, n cazul n care unim celule adiacente pe vertical); bgcolor determin, pentru celula respectiv, culoarea de fundal. Evident, este prioritar fa de acelai atribut la nivel de linie. Exemplu (apl018.html):
<TABLE border="1" cellspacing="0" cellpadding="5"> <TR bgcolor="#c0c0ff"> <TD>Ziua <TD>09h00 - 11h00 <TD>11h00 - 13h00 <TD>13h00 - 15h00 <TR bgcolor="yellow" align="center"> <TD align="left"><B>Luni</B> <TD colspan="2">Mecanica <TD bgcolor="#ffd0d0">Termodinamica <TR bgcolor="yellow" align="center"> <TD align="left"><B>Marti</B> <TD>Electrostatica <TD>Optica <TD>Atomica <TR bgcolor="yellow" align="center"> <TD align="left"><B>Miercuri</B> <TD rowspan="2" bgcolor="#ffd0d0">Termodinamica <TD>Optica <TD>Electrostatica <TR bgcolor="yellow" align="center"> <TD align="left"><B>Joi</B> <TD>Mecanica <TD>Optica </TABLE>

Tag-ul <TH>...</TH> poate nlocui <TD>...</TD>. Atributele sunt aceleai. Singura diferen este c textele de dup tag-ul <TH> sunt, n mod implicit, tiprite ngroat (Bold) iar alinierea lor se face pe centru; Tag-ul <CAPTION>...</CAPTION> permite scrierea unui titlu pentru tabel. Acest tag trebuie s se gseasc imediat dup </TABLE>. Acest tag suport atributul align. Acesta poate lua una dintre valorile: left (titlul va fi poziionat n stnga sus), right (poziionare dreapta sus), top (poziionare pe centru sus), bottom (poziionare pe centru jos);

25

Exemplu (apl019.html):
<H3>Colegiul National "Andrei Saguna"</H3> <TABLE border="1" cellspacing="0" cellpadding="5" align="left"> <CAPTION align="bottom"> Scorul pe echipe</CAPTION> <TR><TH>Echipa<TH>Punctaj <TR><TD>clasa a 9-a A<TD align="right">87 <TR><TD>clasa a 10-a B<TD align="right">80 <TR><TD>clasa a 12-a B<TD align="right">91 </TABLE> <FONT color="blue"> Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" Colegiul National "Andrei Saguna" </FONT>

2.3.9. Legturi (link-uri). Aa cum am vzut n partea introductiv a acestui capitol, noiunea de www este strns legat de documentele de tip hipertext. Tot ceea ce am prezentat din limbajul HTML pn n momentul de fa, reprezint doar partea descriptiv a acestuia, cu ajutorul creia putem crea un coninut static. Link-urile reprezint mecanismul prin care: putem face ca un vizitator al paginii, prin executarea unui click, s poat accesa o alt pagin, la care dorim s-i crem posibilitatea unui acces rapid i, dac acesta dorete, s poat reveni n pagina iniial prin apsarea butonului Back al browser-ului de Internet; putem face ca un vizitator al paginii noastre s primeasc un anumit fiier, de orice tip, care se gsete pe site-ul nostru (download); putem face ca un vizitator al paginii noastre s poat asculta un mesaj sonor sau chiar s poat viziona un film; putem ca, printr-un click, s putem vizualiza o pagin (inclusiv cea curent) doar dintr-un anumit loc, fr a folosi barele de derulare; putem ca, prin accesarea unui click, cel care viziteaz pagina s ne poat trimite un e-mail. Pentru toate acestea, vom folosi tag-ul <A>...</A>, numit i Ancor.

26

Ancore de legtur ctre alte pagini Acestea permit ca un anumit element din document s conin legtura ctre o alt pagin. Elementul care face legtura este de obicei un text sau o imagine. De regul, elementul legat i schimb aspectul fa de cel clasic: textul va fi subliniat i colorat altfel, iar imaginea va avea un chenar colorat. n momentul n care ducem cursorul deasupra elementului legat, acesta capt forma unei mini, indicndu-ne astfel c este vorba de un link pe care l putem utiliza. Printr-un simplu click, accesm pagina ctre care este fcut legtura. Acest tip de legtur se realizeaz practic folosind atributul href, ca n exemplul de mai jos (a se remarca modul n care, elementul legat, este inclus ntre tag-urile <A href=...> i </A> :
apl020.html):
<p> Prin executarea unui click <A href="http://mail.yahoo.com"> pe acest text </A> poti accesa direct pagina de mail yahoo. </p>

Dup cum se observ, atributul href primete adresa complet a paginii ctre care dorim s facem legtura. Dac e vorba de un fiier local, din acelai director cu pagina din care facem legtura, la href este suficient s scriem numele i extensia (de ex: href=pagina.htm)

Ancore de legtur ctre fiiere (pentru download) Se realizeaz n mod analog cu cele ctre alte pagini, la atributul href trebuind specificat adresa fiierului respectiv (dac este n acelai director cu pagina din care facem legtura, e suficient s-i scriem numele i extensia). Ex: n cazul n care fiierul pentru download este local:
Pentru download arhiva executa un click <A href="arhiva.zip">aici</A>

Ex: n cazul n care fiierul pentru download se afl la alt adres:


Pentru a descarca subiectele de bacalaureat la disciplina informatica, da un click <A href="http://subiecte2008.edu.ro/bacalaureat/subiecte/E_informatica_c.zip">aici</A>

Legturile ctre fiiere de tip sunet sau film se fac absolut n aceeai manier. n funcie de extensia lor (.wav, .mid, .mp3, .avi) n momentul executrii unui click asupra obiectului care face legtura ctre ele, acestea vor fi deschise automat ctre browser cu programul corespunztor.

27

Legturi relative la coninutul documentului (paginii) Sunt acele ancore care permit accesarea direct a unei pagini web ntr-un anumit loc, fr a mai folosi barele de derulare pentru a ajunge n acel loc. Pentru aceasta, locul respectiv trebuie marcat. Acest lucru se face tot cu ajutorul tag-ului
<a>, ns folosind atributul id, care va denumi locul respectiv printr-un identificator, ca n

exemplul de mai jos (a se observa c ntre tag-ul de deschidere i cel de nchidere putem s nu punem nici un element):
<A id=capitolul2></A>

Accesarea direct a acestui loc cu ajutorul unui link se poate face astfel: a) Din interiorul aceleii pagini: specificnd la atributul href identificatorul respectiv (cel de la id) nainte de care se pune de caracterul #, ca n exemplul urmtor:
<A href=#capitolul2>Salt direct la capitolul 2</A>

b) Din alt pagin: specificnd la atributul href adresa paginii accesate (a fiierului html) urmat de caracterul #, ca n exemplul urmtor:
<A href=http://www.myserver.ro/document.html#capitolul2>Deschide documentul extern, direct la capitolul 2</A>

Ancor de legtur pentru trimiterea unui e-mail Acestea permit ca, atunci cnd o persoan ne viziteaz site-ul, dac dorete, s ne poat trimit un e-mail fcnd un simplu click pe legtura respectiv. Totui, pentru ca acest lucru s fie funcional, cel care viziteaz site-ul trebuie s aib configurat pe calculatorul su un client de e-mail (cel mai frecvent este Outlook Express). Iat un exemplu pentru o astfel de ancor:
<ADDRESS> Click <A href=mailto:somebody@someserver.com>aici</A> pentru a trimite un e-mail </ADDRESS>

(tag-ul <ADDRESS>...</ADDRESS> nu face altceva dect s afieze textul din cadrul su italic) Dup cum se observ, pentru trimiterea unui e-mail, dup atributul href trebuie specificat
mailto: urmat de adresa de e-mail a destinatarului.

28

2.3.10. Elemente de structur (HTML, HEAD, BODY). Dup cum am vzut n partea introductiv, orice document html este cuprins ntre tag-urile
<HTML> i </HTML>. El este alctuit dintr-un unic antet (HEAD) i un unic corp (BODY). Aceste 3

elemente au rolul de a defini structura documentului. Din acest motiv ele se mai numesc i elemente de structur. Tag-ul BODY poate conine urmtoarele atribute: background=fiier_imagine permite specificarea unei imagini de fundal. Aceasta se va repeta att pe orizontal ct i pe vertical, pn cnd se acoper ntreaga suprafa necesar corpului; bgcolor=culoare permite specificarea unei culori de fond; text=culoare permite specificarea culorii ntregului text cuprins n pagin; link=culoare permite specificarea culorii unui link nevizitat; alink=culoare permite specificarea culorii unui link activ; un link este considerat activ n timpul vizitrii i imediat dup aceasta; vlink=culoare permite specificarea culorii unui link vizitat, care nu mai este activ.

Coninutul seciunii <HEAD> n cadrul acestei seciuni putem ntlni diverse alte tag-uri. Despre tag-ul <TITLE> am discutat deja, el permind scrierea unui titlu pentru pagin. n afar de acestea, vom aminti nc alte 3 tag-uri: <BASE> permite stabilirea unei adrese de baz pentru resurse. Acest tag se folosete n special atunci cnd resursele (sau, n fine, o mare parte a acestora) se gsesc n alt director dect cel n care se afl documentul curent. n acest fel, folosirea fiierelor din directorul specificat n BASE se poate face direct prin numele i extensia lor. Specificarea se face prin:
<BASE href=adresa resurse>

<META> este folosit pentru a furniza informaii motoarelor de cutare. Unele dintre acestea viziteaz doar antetul pentru a obine informaii. Informaiile coninute de acest element nu sunt afiate de browser, ns este important s l folosim pentru ca informaiile coninute n site-ul nostru s fie accesibile. Locul tag-ului <META> este n antet (<HEAD>).
29

Atributele tag-ului <META> sunt name i content. Folosirea lor este ceva mai particular, rezultnd din exemplele urmtoare: - pentru a specifica autorul unui document:
<META name=Author content=Prenume NUME>

- pentru a specifica titlul unui document:


<META name=TITLE content=Metode de programare>

- pentru a preciza cuvintele cheie dup care s fie regsit site-ul:


<META name=KEYWORDS content=backtracking, divide et impera, greedy, programare dinamica>

- pentru a specifica limba n care este scris site-ul:


<META name=LANGUAGE content=RO>

Exist i alte atribute ale elementului META, ns cele dou deja prezentate sunt suficiente. <STYLE> este utilizat pentru introducerea stilurilor. Acestea permit stabilirea mai amnunit a modului n care apar, implicit, diferitele elemente din document. Valorile se trec ntre
<STYLE>...</STYLE>.

Exemplu:
<STYLE> P {font-family:Comic Sans MS; font-size:14pt;} </STYLE>

Prin specificarea lui P nainte de paranteza acolad, stabilim ca modul implicit de afiare al paragrafelor (s ne reamintim c <P> este tag-ul pentru paragraf) s fie cel descris ntre parantezele acolade, deci, n cazul exemplului de fa font-ul folosit s fie Comic Sans MS, iar dimensiunea caracterelor s fie de 14. <SCRIPT> este utilizat pentru introducerea anumitor secvene de program n cadrul paginilor web. Exist mai multe limbaje (numite de scriptare) care permite scrierea acestor secvene, cum ar fi JavaScript, VBscript. Specificarea limbajului n care este codat scriptul se face cu ajutorul atributului language, ca n exemplul de mai jos (apl021.html):
<SCRIPT language="JavaScript"> function calcul() { s=0; for(i=1;i<=10;i++) s+=i; alert("suma nr. de la 1 la 10 este: "+s);} </SCRIPT> ... <BODY onload="calcul();"> ... </BODY>

Acest exemplu definete n antetul paginii o funcie JavaScript capabil s calculeze suma numerelor de la 1 la 10 ntr-o variabil s i-apoi s afieze valoarea obinut prin intermediul unei ferestre de dialog. Funcia este apelat automat (atributul onload) la ncrcarea paginii.
30

2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME). Utilizarea frame-urilor permite ca, n cadrul aceleiai ferestre ale browser-ului s fie afiate simultan mai multe documente HTML (sau alte resurse). Tag-ul <FRAMESET> are rolul de a mpri fereastra n mai multe cadre. n fiierul HTML, el nlocuiete tag-ul <BODY>. Iat cteva atribute ale lui FRAMESET: rows descrie liniile n care este mprit seciunea FRAMESET respectiv cols descrie coloanele n care este mprit seciunea FRAMESET respectiv descrierile pentru rows, respectiv cols, pot fi de forma:
<FRAMESET rows=30%, 50%, 20%> <FRAME ...> <FRAME ...> <FRAME ...> </FRAMESET>

n acest exemplu, se definesc 3 cadre orizontale (linii) de nlimi 30%, 50% respectiv 20% din nlimea ferestrei. Un alt exemplu, n care nlimea cadrelor este definit proporional:
<FRAMESET rows=3*, 1*, 2*>...

aici se definesc 3 cadre orizontale, proporionale cu 3, 1 i 2 dintr-o nlime de 3+2+1=6 (deci cadrele vor fi 3/6, 1/6 respectiv 2/6 din nlimea ferestrei) Un alt exemplu, n care nlimea cadrelor este definit n pixeli:
<FRAMESET rows=100, 200, *>...

aici se definesc trei frame-uri: unul de nlime de 100 de pixeli, altul de 200 de pixeli, al treilea fiind alocat cu spaiul rmas. Tag-ul <NOFRAMES>...</NOFRAMES> reprezint coninutul care va fi afiat unui vizitator, n cazul n care browser-ul su nu poate afia cadre (n prezent, nu prea mai este cazul unor asemenea browsere). Fiecare tag <FRAMESET>...</FRAMESET> trebuie ca, dup definirea aspectului (cu ajutorul unuia dintre atributele cols sau rows) s conin descrierile fiecruia dintre cadrele definite. Acest lucru se face cu ajutorul tag-ului <FRAME> prin intermediul atributelor: src adresa fiierului HTML sau a imaginii care se va ncrca iniial n cadru; marginheight marginile (n pixeli sau procent) fa de partea de sus i cea de jos; marginwidth marginile (n pixeli sau procent) fa de partea din stnga i din dreapta;

31

frameborder poate lua valorile 1 (implicit), care nseamn c acest cadru este separat de celelalte printr-un chenar, respectiv 0, care nseamn c acest cadru nu mai este separat de celelalte printr-un chenar. scrolling trateaz afiarea barei de scroll (derulare). Poate lua trei valori:
auto valoarea implicit. Bara de scroll este prezent numai dac este cazul yes bara de scroll este totdeauna prezent no bara de scroll nu va fi niciodat afiat

noresize dac atributul acesta este prezent (el se folosete fr a i se atribui nici o valoare) atunci vizitatorului paginii nu i se va permite s redimensioneze cadrul. Prezena acestui atribut pentru un cadru nu permite nici redimensionarea cadrelor vecine. name este un atribut foarte important. Prin intermediul su va putea fi identificat frame-ul respectiv. Acest lucru este foarte important, deoarece dintr-un cadru se poate comanda coninutul oricrui alt cadru. Deschiderea unei pagini ntr-un anumit cadu, prin intermediul ancorelor, se poate specifica prin folosirea atributului target=nume cadru imediat dup folosirea atributului href n cadrul tag-ului <A href=... .. >. Iat un exemplu prin care definim o pagin cu dou frame-uri verticale. Frame-ul din stnga va conine numele a 3 zile ale sptmnii (pe limba romn). Accesarea fiecruia va produce deschiderea n frame-ul drept a unei pagini care va conine traducerea numelui zilei respective n 4 limbi. n total vom avea de construit 5 fiiere: - un fiier pentru pagina iniial, cea care definete scheletul paginii cu frame-uri - un fiier cu cele 3 zile ale sptmnii, pe fiecare dintre ele fiind pus cte un hyperlink care va deschide traducerea numelui su n cellalt frame - 3 fiiere cu traducerilor numelor zilelor n 4 limbi strine. Pagina iniial (apl022pagframe.html):
<HTML> <HEAD> <TITLE>Pagina cu frames</TITLE> </HEAD> <FRAMESET cols="30%,*"> <FRAME name="stinga" src="apl022zile.html" noresize> <FRAME name="dreapta" src="apl022luni.html"> </FRAMESET> <NOFRAMES> Browser-ul tau nu este capabil sa afiseze pagini cu frame-uri </NOFRAMES> </HTML>

32

De remarcat faptul c aceast fiier HTML nu conine dect scheletul cadrelor, ele urmnd a fi populate iniial, dup cum remarcai din codul surs, cu fiierele apl022zile.html pentru primul cadru (cel din stnga) respectiv cu fiierul apl022luni.html pentru cel de-al doilea cadru. Observai modul n care au fost definite cadrele n cadrul tag-ului FRAMESET:
cols="30%,*". Acest lucru semnific prezena a dou cadre verticale (coloane) dintre care primul

va ocupa 30% din limea ferestrei, iar al doilea restul (lucru semnificat de caracterul * care nchide irul de definiie al cadrelor). De asemenea, atributul noresize n cadrul primului tag FRAME mpiedic redimensionarea cadrelor de ctre utilizator. n cazul n care acest atribut nu ar fi fost prezent, utilizatorul, printr-un simplu drag and drop ar fi putut trage bara care separa cele dou frame-uri, dndu-i orice poziie ar fi dorit. Dac ncrcm n browser-ul de internet documentul creat n acest stadiu, fr ca pe disc s existe vreunul dintre celelalte patru fiiere planificate, am obine urmtorul rezultat:

Acesta era i de ateptat, de altfel, deoarece el demonstreaz existena frame-urilor i lipsa coninutului. Iat i coninutul celorlalte fiiere, pe care le vom pune n acelai director cu documentul de mai sus (n dreptul fiecruia vom arta i vizualizarea sa n browser): Fiierul apl022zile.html:
<HTML> <HEAD> <TITLE>Zilele</TITLE> </HEAD> <BODY> <br> <A href="apl022luni.html" target="dreapta">Luni</A><br><br> <A href="apl022marti.html" target="dreapta">Marti</A><br><br> <A href="apl022miercuri.html" target="dreapta">Miercuri</A><br><br> </BODY> </HTML>

De remarcat modul n care am realizat link-urile asupra celor 3 cuvinte: folosind i atributul
target n cadrul ancorei (<A ...>) am specificat browser-ului ca paginile respective s fie

deschise n cadrul frame-ului al crui nume apare dup target.


33

Fiierul apl022luni.html:
<HTML><BODY> <H2>Luni</H2> FR: Lundi<BR> IT: Lunedi<BR> GE: Montag<BR> EN: Monday<BR> </BODY></HTML>

Fiierul apl022marti.html:
<HTML><BODY> <H2>Marti</H2> FR: Mardi<BR> IT: Martedi<BR> GE: Dienstag<BR> EN: Tuesday<BR> </BODY></HTML>

Fiierul apl022miercuri.html:
<HTML><BODY> <H2>Miercuri</H2> FR: Mercredi<BR> IT: Mercoledi<BR> GE: Mittwoch<BR> EN: Wednesday<BR> </BODY></HTML>

Iat cum arat vizualizarea final n browser (dup crearea celor 4 fiiere de mai sus):

Evident, la efectuarea unui click asupra legturilor (luni, marti, miercuri) din partea stng, se va produce deschiderea paginii corespunztoare n frame-ul drept. Tag-ul <IFRAME> este un element care nu a fost prezent n primele versiuni ale limbajului HTML, ci a aprut ceva mai nou. Actualmente, folosirea sa este preferat de majoritatea celor care programeaz pagini web, deoarece se comport ceva mai flexibil dect cadrele clasice. Totodat, motoarele de cutare nu indexeaz coninutul paginilor cu frame-uri obinuite, pe cnd cele care conin iframe-uri sunt indexate. Prin intermediul su, este permis crearea unui cadru n corpul unui documente HTML, cadrul care se comport asemntor unei imagini. Atributele lui IFRAME sunt: name la fel ca i la FRAME, acest atribut permite identificarea IFRAME-ului (pentru a putea comanda coninutul su din orice link) height, width nlimea, respectiv limea. Pot fi specificate att n pixeli, ct i n procente, relativ la dimensiunile ferestrei browser-ului frameborder poate lua valoarea 0 sau 1, la fel ca la elementul FRAME src adresa resursei care va fi ncrcat iniial n IFRAME marginwidth, marginheight, scrolling la fel ca i la FRAME align poate lua una dintre valorile left, right, top, bottom, middle, comportndu-se ntocmai ca i n cazul imaginilor

34

Iat reluarea aceleiai idei structurale ca i la aplicaia de dinainte (cu frame-uri clasice) ns folosind un element de tipul IFRAME. Fiierele apl022luni.html, apl022marti.html respectiv apl022miercuri.html le pstrm nemodificate. Practic, mai crem doar un singur fiier HTML, cu coninutul urmtor, i avem grij s copiem n acelai director i cele 3 fiiere de mai sus (apl023.html):
<HTML> <HEAD><TITLE>Elementul IFRAME</TITLE></HEAD> <BODY> <IFRAME name="cadru" width="140" height="160" align="right" src="apl022luni.html"> </IFRAME> <BR> <A href="apl022luni.html" target="cadru"> Luni</A><BR><BR> <A href="apl022marti.html" target="cadru"> Marti</A><BR><BR> <A href="apl022miercuri.html" target="cadru"> Miercuri</A><BR><BR> </BODY> </HTML>

2.3.12. Bare de separare (HR). Bara de separare, al crei tag este <HR> reprezint un element decorativ. De obicei se folosete pentru a separa anumite seciuni ale paginii web. Atributele sale sunt: width permite specificarea lungimii sale. Poate fi dat n pixeli sau n procente. Dac acest atribut lipsete, atunci lungimea sa va fi maxim (din marginea stng i pn marginea dreapt a ferestrei); size permite specificarea nlimii barei. Se specific n pixeli; color permite specificarea culorii sale.

Exemplu (apl024.html):
<BODY> O linie clasica: <HR> <CENTER>O linie de lungime 50%</CENTER> <HR width="50%"> <CENTER>O linie de lungime 200 de pixeli, grosime 10 pixeli, de culoare rosie</CENTER> <HR width="200" size="10" color="red"> </BODY>

35

2.3.13. Formulare. Formularele sunt elemente ale limbajului HTML. Ele reprezint o grupare de componente care permit trimiterea de date i de comenzi ctre un server. Acesta trebuie s fie mai mult dect un clasic server HTTP, trebuind s aib instalat i o component capabil de a rspunde comenzilor i a prelucra datele. Cea mai popular astfel de component, foarte larg utilizat n ultimii 10 ani n programarea pe Internet este limbajul PHP, de care ne vom ocupa pe larg n capitolul al III-lea al acestei lucrri. Pentru moment ne vom concentra asupra componentelor unui formular i a aspectului acestora. Un formular este descris prin intermediul tag-ului <FORM>...</FORM>. Atributele acestuia sunt: action=adresa acest atribut specific adresa script-ului care se va ocupa de a rspunde la comenzi i de a prelucra datele. method acest atribut specific modul n care datele vor fi transmise ctre server. Distinge, dou valori pe care le poate lua acest atribut, i anume: - get datele sunt la vedere acest lucru nseamn c, n momentul trimiterii lor ctre server, ele vor aprea scrise n clar, n bara de adres, ntr-un anumit format standard. De exemplu, dac formularul trimite ctre pagina test.php o variabil a care este egal cu 5, n bara de adres a browser-ului ne va aprea http://.../test.php?a=5. Un dezavantaj major al acestei metode de trimitere a datelor este c volumul acestora este limitat (datorit irului de caractere din adres, care este limitat n cazul fiecrui browser). - post datele nu mai apar n mod explicit utilizatorului. Totui, ele nu sunt criptate practic, un program rufctor le poate intercepta. Pe lng componentele specifice, un formular poate conine orice fel de alte elemente valide de HTML tabele, imagini, text, bare de separare ... n continuare vom prezenta cteva din componentele unui formulare, prin intermediul crora utilizatorul poate introduce date i trimite apoi aceste date ctre server. Un atribut foarte important al oricruia dintre aceste componente este name, deoarece prin intermediul su, server-ul care va primi datele va ti despre care dintre controale este vorba.

36

Cmpuri text Permit utilizatorului s introduc date ntr-un cmp de tip edit (pe o singur linie). Aceste se specific prin tag-ul
<INPUT type=text ...>

Atributele sale sunt: size specific limea (n numr aprox. de caractere) cmpului text; Dac acest parametru este omis, este implicit considerat ca fiind 20; maxlength specific numrul maxim de caractere ce pot fi scrise n cmpul text. Acest atribut poate primi o valoare mai mare dect cea scris la size, caz n care, textul va defila n control (stnga dreapta) n cazul n care scriem mai multe caractere dect cte ncap n poriunea vizibil. Omiterea acestui atribut va permite introducerea unui numr foarte mare de caractere (limita difer de la un browser la altul); name numele cmpului text (prin care server-ul va identifica acest cmp, pentru a prelua datele din el); value poate specifica o valoare care s fie iniial (la ncrcarea paginii) deja scris n cadrul controlului. Dac omitem acest atribut, cmpul text va fi gol.

Butoane de tip submit Aceasta componenta se prezint sub forma unui buton. Prin apsarea sa are loc trimiterea tuturor datelor din formular ctre script-ul de pe server-ul care le va prelucra. Un control de tip submit se specific prin tag-ul:
<INPUT type=submit ...>

Atributele sale sunt: name numele de identificare a componentei. Putem omite acest atribut. El se folosete n cazul n care aceluiai formular dorim s-i atam mai multe butoane de acest tip, iar apsarea fiecruia s produc o aciune diferit; value textul care va fi scris pe buton. De altfel, aceasta va fi i valoarea pe care serverul o va primi pentru acest control.

37

Cmpuri de tip password Se comport identic cu cmpurile de tip text. Singura deosebire este c, la scrierea de text n ele, acesta nu va fi vizibil, ci n locul caracterelor introduse se vor afia asterisc-uri. Totodat, textul dintr-un astfel de control nu poate fi luat cu copy/paste. Controalele de acest fel se specific prin tag-ul:
<INPUT type=password ...>

Atributele sunt identice cu cele de la <INPUT type=text ...> Cmpuri de tip butoane radio Sunt controalele care permit ca, dintr-o serie de opiuni posibile, utilizatorul s aleag una singur. Controalele de acest fel se specific prin tag-ul:
<INPUT type=radio ...>

Atributele sale sunt: name numele de identificare al componentei. Este obligatoriu ca toate butoanele care aparin aceluiai grup (deci seria de opiuni din care trebuie aleas doar una singur posibil) s poarte acelai nume de identificare; value valoarea pe care o va ntoarce butonul respectiv, dac el a fost cel ales; checked dac acest atribut este prezent, butonul respectiv va fi ales n mod implicit, la ncrcarea paginii. Este recomandabil ca, dintre toate butoanele care aparin aceluiai grup, exact unul singur s conin acest atribut. Iat i un exemplu care combin controalele prezentate pn acum (apl025.html):
<FORM action="nefunctional.php" method="post"> Introdu numele tau de familie <INPUT type="text" size="10" maxlength="20" name="numele"> <BR><BR>Alege-ti si o parola <INPUT type="password" size="10" maxlength="20" name="parola"> <BR><BR> Alege ce fel de studii ai:<BR><BR> <INPUT type="radio" name="studii" value="scprim"> Doar scoala primara<BR> <INPUT type="radio" name="studii" value="8clase"> Scoala primara si cea generala (8 clase)<BR> <INPUT type="radio" name="studii" value="medii" checked> Studii medii (liceul si eventual un curs postliceal) <BR> <INPUT type="radio" name="studii" value="univ"> Studii universitare<BR><BR> <INPUT type="submit" value="Trimite datele"> </FORM>

Evident, acest exemplu este nefuncional, n sensul c datele din formular nu sunt prelucrate. Acest lucru va face obiectul capitolului urmtor, i anume preluarea datelor dintr-un formular prin intermediul limbajului php.
38

Cmpuri de tip checkbox Sunt controale care permit bifarea sau tergerea bifrii unei csue. Din punct de vedere practic, ele permit utilizatorului s marcheze una, nici una, sau mai multe opiuni. Controalele de acest fel se specific prin tag-ul:
<INPUT type=checkbox ...>

Atributele sale sunt: name numele de identificare al componentei; value valoarea pe care o va ntoarce controlul respectiv; checked dac acest atribut este prezent, atunci controlul va fi bifat la ncrcarea paginii. Exemplu (apl026.html):
<FORM action="nefunctional.php" method="post"> Alege din lista de mai jos limbile pe care le cunosti:<BR><BR> <INPUT type="checkbox" name="rom" value="1" checked> Limba romn<BR> <INPUT type="checkbox" name="eng" value="2"> Limba engleza<BR> <INPUT type="checkbox" name="fr" value="3"> Limba franceza<BR> <INPUT type="checkbox" name="germ" value="4"> Limba germana<BR><BR> <INPUT type="submit" value="Trimite datele"> </FORM>

Cmpuri ascunse (de tip hidden) Aceste componente permit trimiterea de valori ctre server (o dat ce butonul submit a fost apsat) fr ca acestea s fie vizibile n cadrul form-ului. Practic, aceste componente se specific doar n cadrul codului HTML:
<INPUT type=hidden name=nume value=value>

Aa cum se observ n tag-ul de mai sus, cu ajutorul atributului name specificm numele controlului, iar cu ajutorul atributului value specificm valoarea care va fi trimis ctre server.

Controlul de tip TEXTAREA Este o component care se utilizeaz pentru a introduce un text mai lung, care se poate ntinde pe mai multe linii. Tag-ul su este: <TEXTAREA>...</TEXTAREA>.

39

Atributele sale sunt: name numele de identificare al componentei; rows numrul de linii pe care se ntinde componenta (implicit 2); cols numrul de coloane pe care se ntinde componenta (implicit 20); Dac dorim ca la ncrcarea paginii s ne apar un text deja scris n cadrul controlului, acest text se va scrie ntre tag-ul de deschidere i cel de nchidere al lui TEXTAREA. Exemplu (apl027.html):
<FORM action="nefunctional.php" method="post"> Scrie-ti parerea despre spectacol:<BR> <TEXTAREA rows="3" cols="30" name="parerea"></TEXTAREA> <BR> <INPUT type="submit" value="Trimite datele"> </FORM>

Controlul de tip SELECT Acest control este utilizat pentru afiarea unei liste din care utilizatorul poate s aleag unul sau mai multe opiuni. Tag-ul prin care se utilizeaz aceast component este <SELECT>...</SELECT>. Atributele sale sunt: name numele de identificare al componentei; multiple dac acest atribut este prezent, utilizatorul poate alege mai multe opiuni din list, innd apsat tasta control sau shift n timp ce d click pe acestea. size numrul de opiuni care sunt afiate. Implicit este 1, n cazul listelor care nu sunt de tip multiple. n acest caz, lista se prezint sub forma unei liste de tip drop-down; Fiecare opiune din list se specific printr-un tag <OPTION>...</OPTION>. Acestea, la rndul lor, au urmtoarele atribute: value reprezint valoarea care va fi ntoars de controlul SELECT n cazul n care va fi selectat opiunea respectiv; selected dac acest atribut este prezent, opiunea respectiv va fi selectat la ncrcarea paginii Textul efectiv al opiunii se scrie ntre tag-ul de deschidere i cel de nchidere. Tag-ul de nchidere este opional, el putnd fi omis.

40

Iat un exemplu de folosire al controlului de tip select (apl028.html):


<FORM action="nefunctional.php" method="post"> Alege din lista de mai jos ce fel de studii ai: <BR> <SELECT name="studii"> <OPTION value="prim">Scoala primara (4 clase) <OPTION value="gen">Scoala generala (8 clase) <OPTION value="lic" selected>Studii medii (12 clase) <OPTION value="univ">Studii universitare </SELECT> <INPUT type="submit" value="Trimite datele"> </FORM>

2.4. Extinderi ale limbajului HTML standard: HTML dinamic, script-uri. Dei HTML-ul clasic permite redactarea unor documente hypertext de un nivel foarte nalt i elaborat, o dat cu evoluia limbajelor de programare vizuale, a nceput s devin mai puin atractiv dect a fost la nceput. Din acest motiv, a fost pus la punct ceea ce numim DTHML (Dynamic HTML) care nu este un limbaj n sine, ci un termen prin care sunt desemnate tehnicile utilizate pentru a face paginile web ct mai dinamice i ct mai interactive. Pe lng HTML-ul propriu-zis, noile unelte recunoscute de browser-ele din ultima generaie sunt CSS (Cascading Style Sheets), JavaScript i DOM (Document Object Model). Scopul acestei lucrri nu este studiul amnunit al acestora, de aceea le vom trece doar n revist, folosind mici exemple comentate pentru fiecare dintre ele.

2.4.1. CSS (Cascading Style Sheets). Noiunea de stil este, pentru un document HTML, asemntoare cu formatarea documentului, spre exemplu, pentru un document Word. Exis o mulime de atribute prin care se pot stabili font-urile, caracteristicile de aliniere a textului, forma elementului, culorile de fond i ale literelor, marginile, poziia elementelor, etc. Pentru a putea gestiona ct mai eficient stilurile, a fost pus la dispoziia programatorilor de pagini web un limbaj prin care se poate realiza acest lucru. Acest limbaj este cunoscut sub numele de CSS (actualmente, vorbim de versiunea CSS2). Legtura dintre HTML i CSS se realizeaz prin intermediul tag-ului <STYLE>...</STYLE> care trebuie aezat ntre <HEAD> i </HEAD>.

41

n cadrul tag-ului STYLE vom stabili modul n care dorim s arate elementele paginii. Fiecare element al HTML-ului pe care l-am studiat este identificat, n cadrul CSS-ului de tag-ul care l gestioneaz. Spre exemplu, identificatorul CSS pentru paragrafe este P, pentru table este TABLE, pentru imagini este IMG, .a.m.d. Folosind aceti identificatori n cadrul unui <STYLE>...</STYLE>, putem face ca toate elementele de acelai fel din cadrul unui document s arate la fel. Astfel suntem scutii de a scrie o grmad de cod care s-ar repeta n cazul fiecrui element de acelai fel. De exemplu, dac dorim ca, n cadrul paginii noastre, absolut toate paragrafele s fie scrise cu fontul Comic Sans MS, caractere de 14, culoare albastr, pe fond galben, n loc de a scrie aceti parametri la fiecare paragraf din document, este suficient s definim urmtorul STYLE (apl029.html):
<HTML><HEAD> <TITLE>Utilizare STYLE in HEAD</TITLE> <STYLE> P { background:yellow; color:blue; font-family:"Comic Sans MS"; font-size:14pt; } HR { text-align:left; width:50%; height:5px; color:red; } </STYLE> </HEAD> <BODY> <P>Iata un paragraf formatat asa cum am anuntat</P> <HR> Acesta este un text care nu se afla in paragraf <HR> <P>Acest text este din nou in cadrul unui paragraf</P> </BODY></HTML>

De remarcat faptul c ambele paragrafe, i de asemenea ambele linii orizontale (HR) din cadrul lui BODY nu conin nici un fel de referin de formatare. Cu toate acestea, definirile lui P i ale lui HR n cadrul lui STYLE au predefinit modul n care vor arta toate paragrafele respectiv toate liniile orizontale ale documentului. Sintaxa definiiei este de felul urmtor: Se ncepe cu identificatorul elementului dorit a fi formatat (n cazul nostru P tag-ul pentru paragraf, respectiv HR) ntre acolade trecndu-se specificatorii de format (acetia in de limbajul CSS) dorii a fi modificai. n cazul de fa, avem de-a face cu:
background = culoarea de fundal; font-familiy = numele font-ului; text-align = alinierea n cadrul unui text; height = nlimea.
42

color = culoarea scrisului; font-size = dimensiunea caracterelor; width = limea;

O alt form de utilizarea a CSS-ului const n definirea stilurilor cu ajutorul unor identificatori proprii, care se pot aplica ulterior unui anumit paragraf. n acest caz, n cadrul unui style putem defini proprii identificatori, precedndu-i de caracterul #. Aplicarea ulterioar a lor asupra unui element, se face specificnd un nou atribut, i anume id=identificator unde identificator este cel propriu, definit n cadrul lui STYLE (cel precedat de #) Ex: dac inserm n codul de mai sus secvena urmtoare (tot n cadrul lui STYLE, dup definiia lui HR, adic cea scris cu rou nchis):
#alt_paragraf { color:green; font-weight:bold; }

iar nainte de </BODY> mai inserm urmtorul paragraf:


<P id="alt_paragraf">Acesta este un paragraf personalizat</P>

vom obine urmtorul rezultat:

Remarcai faptul c au fost aplicai doar cei doi specificatori de format definii n noul stil, i anume culoarea fontului i faptul c scrisul este bold. Celelalte caracteristici (font-ul i culoarea galben de fundal) au rmas cele definite tot n STYLE, n cadrul lui P.

n loc de a defini stilurile n cadrul antetului (HEAD), aa cum am artat mai sus, ele pot fi scrise separat, ntr-un fiier text cu extensia .css, exact n aceeai manier n care le-am fi scris ntre cele dou tag-uri prezentate, <STYLE>...</STYLE>. Includerea efectiv a acestui fiier n cadrul HTML-ului se face tot n seciunea <HEAD>, prin intermediul urmtorului tag:
<LINK rel="stylesheet" type="text/css" href="fisier_stil.css">

43

Iat un exemplu: 1) Coninutul fiierului css, pe care l-am numit apl30stil.css:


TABLE { border-width:2px; border-style:ridge; border-collapse:collapse; } TD { border-style:ridge; border-width:2px; padding:5px; } TH { border-style:ridge; border-width:2px; background:#7fffff; padding:5px; } TR { background:#ffff7f; } #TR1 { background:#00ff00; }

Dup cum se observ, am definit n cadrul su formatele implicite pentru un tabel, rndurile i celulele sale (TABLE, TR, TD, TH) precum i un identificator propriu, #TR1. Iat i fiierul HTML care va folosi acest .css (apl030.html):
<HTML> <HEAD> <TITLE>Utilizare css</TITLE> <LINK rel="stylesheet" type="text/css" href="apl30stil.css"> </HEAD> <BODY> <TABLE> <TR><TH>Numar<TH>Nume <TR><TD>1<TD>Ion <TR><TD>2<TD>Pop <TR><TD>3<TD>Top <TR id="TR1"><TD>4<TD>Ivan </TABLE> </BODY> </HTML>

Iat, n continuare, n partea stng, cum arat HTML-ul, datorit includerii acestui fiier CSS, iar n partea dreapt cum ar fi artat acelai HTML, fr a specifica nici un fel de format n CSS:

44

2.4.2. JavaScript. JavaScript este un limbaj de programare orientat pe obiecte. n ciuda numelui i a unor oarecare similariti n sintax, ntre JavaScript i Java nu exist nici o legtur. JavaScript are o sintax apropiat de cea a C-ului; din acest motiv un programator care cunoate C poate cu uurin s nvee JavaScript. Dei acest limbaj are o plaj mai larg de extindere, cel mai des ntlnit este n scriptarea paginilor web. Programatorii web pot ngloba n paginile HTML script-uri pentru diverse activiti, cum ar fi verificare datelor introduse de utilizatori, sau crearea de meniuri ori de alte efecte animate. Browser-ele rein n memorie o reprezentare a paginii web sub forma unui arbore de obiecte, punnd aceste obiecte la dispoziia JavaScript-ului, care le poate citi i manipula. Acest arbore de obiecte, de care ne vom ocupa n paragraful urmtor, poart numele de DOM (Document Object Model). Pentru moment, vom da cteva exemple comentate de script-uri JavaScript, care nu folosesc DOM (pentru familiarizarea cu sintaxa), n cadrul unor documente HTML. 1) Calculul sumei cifrelor unui numr natural (apl031.html):
<HTML><HEAD> <TITLE>JavaScript</TITLE> </HEAD> <BODY><HR> <!--Vom scrie secventa de cod direct in cadrul paginii. A se remarca faptul ca, va aparea mai intii primul HR, se va rula codul din tag-ul SCRIPT iar apoi va aparea cel de-al doilea HR--> <SCRIPT language="JavaScript"> v_text=prompt("Introdu un numar intreg cu maxim 9 cifre:",""); //functia prompt deschide o fereastra de dialog prin intermediul //careia utilizatorul poate sa introduca date de tip string. Al doilea parametru //(irul vid "") reprezint valoarea care se va gsi implicit scris n fereastra //de dialog. Evident, dac nu dorim nici o valoare implicit, se folosete irul vid ("") //String-ul obtinut l-am atribuit variabilei v_text nr=parseInt(v_text);//am facut conversia de la variabila text //la un numar intreg s=0;//in s calculam suma cifrelor lui nr do//procedam intocmai ca in limbajul C: { r=nr%10; s+=r; nr=parseInt(nr/10);//in JavaScript impartirea NU mai respecta //regulile din C, deoarece operatorul / face impartire cu //zecimale. Pentru a obtine citul intreg, am facut conversia la //intreg cu acelasi parseInt }while(nr); alert("Suma cifrelor este "+String(s)); //functia alert(mesaj_de_tip_string) produce afisarea unei ferestre //de dialog ce contine mesajul respectiv. A se remarca modul in care //am concatenat mesajul cu valoarea variabilei s, convertita la string //cu ajutorul functiei String. </SCRIPT> <HR> </BODY></HTML>

A se remarca locul n care am pus script-ul (n cadrul paginii). n exemplele urmtoare nu vom mai da tot codul, ci doar secvena efectiv a script-ului.
45

2) Sortarea unui ir de numere (apl032.html):


<SCRIPT language="JavaScript"> v_text=prompt("Introdu un sir de numere pe care le separi prin spatii:",""); x=v_text.split(" ");//functia split, aplicata lui v_text (cu parametrul " ") //va extrage substringurile din v_text care sunt separate de spatii si va crea //un sir de string-uri, pe care i-l atribuie variabilei x. Acestea vor fi //x[0], x[1], ... Numarul total de elemente din sirul x se obtine prin x.length n=x.length;//obtinem acest numar in variabila n for(i=0;i<n;i++) x[i]=parseInt(x[i]);//in acest fel transformam toate componentele sirului //x din string-uri in intregi. In C acest lucru nu ar fi fost posibil. //acum sortam sirul obtinut: for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(x[i]>x[j]) { aux=x[i];x[i]=x[j];x[j]=aux;} //si afisam sirul final. Pentru asta, formam tot mesajul de afisat intr-un string s="Iata sirul final, sortat:\n"; for(i=0;i<n;i++) s=s+String(x[i])+" "; alert(s); </SCRIPT>

3) Descompunerea unui numr n factori primi (apl033.html):


<SCRIPT language="JavaScript"> v_text=prompt("Introdu nr. intreg pe care doresti sa-l descompui in factori primi:",""); s="Iata descompunerea in factori primi:\n"; //pregatim string-ul in care vom afisa rezultatul final, pentru ca la acest string //vom tot concatena noile date obtinute n=parseInt(v_text); f=2; while(n!=1) { p=0; while(n%f==0) { n=parseInt(n/f); p++; } if(p) s+="Factor="+String(f)+" putere="+String(p)+"\n"; //fiecare nou factor si putere obtinute le concatenam la stringul //care va fi in final afisat f++; } alert(s); </SCRIPT>

46

2.4.3. DOM (Document Object Model). DOM reprezint o interfa independent fa de orice limbaj de programare i platform, care permite programelor informatice i script-urilor s aib acces sau s actualizeze coninutul, structura sau stilurile unui document. Documentul poate fi apoi prelucrat, iar rezultatele acestor prelucrri pot fi reincorporate n document atunci cnd acesta este prezentat. nainte de standardizarea DOM-ului, fiecare navigator dispunea de propriul su model. Dac limbajul de baz destinat manipulrii documentelor web a fost repede standardizat n jurul lui JavaScript, nu acelai lucru se poate spune i despre funciile specifice de utilizat i maniera de a parcurge documentul. Cele dou mari browser-e care s-au impus (Netscape Navigator i Internet Explorer) denumeau n moduri diferite o serie de componente. n practic, acest lucru obliga programatorul s scrie cel puin dou versiuni ale fiecrui script, dac dorea ca site-ul su s fie accesibil pentru ct mai mult lume. Prima ncercare de standardizare (DOM 1) a avut loc de-abia n 1998. Ultimul nivel de standardizare (DOM 3) a avut loc n 2004. Din punct de vedere dinamizrii paginilor web, limbajul JavaScript reprezint doar o unealt de lucru (ai remarcat n paragraful anterior similitudinea dintre acesta i limbajul C). Pentru ca limbajul JavaScript s acioneze asupra coninutului paginii, ei bine, acest lucru l face tocmai prin intermediul DOM. Prin intermediul DOM putem accesa orice obiect al paginii web i l putem face s se comporte exact n felul n care dorim noi. Ca i n cazul programrii vizuale, DOM permite interceptarea anumitor evenimente (poziia mouse-ului, click-uri, etc.) i tratarea lor difereniat. Vom da n continuare, cteva exemple comentate, n care operm cu JavaScript + DOM. 1) Schimbarea unei imagini atunci cnd trecem cu cursorul peste ea: Pentru aceasta aplicaie avem nevoie de doua fiiere imagine, care s fie, de preferabil, identice ca i dimensiuni, i obinute una dintr-alta printr-un procedeu de genul negativ sau trecere la alb-negru. Iat fiierele imagine pe care am testat script-ul urmtor:

dog.jpg:

dogneg.jpg

(negativul)
47

apl034.html:
<HTML><HEAD> <TITLE>Schimbare de imagini</TITLE> <SCRIPT language="JavaScript"> function schimba_negativ() {//in momentul apelului, aceasta functie obtine //in variabila dp o referinta catre obiectul img //din pagina principala, gratie id-ului sau, si //anume 'poza' dp=document.getElementById("poza"); //dupa care imaginea sursa a sa este schimbata, //folosind imaginea din fisierul dogneg.jpg (cea negativa) dp.src="dogneg.jpg"; } function revine_normal() {//exact la fel ca functia precedenta, insa //se foloseste alta imagine, si anume cea initiala, //dog.jpg dp=document.getElementById("poza"); dp.src="dog.jpg"; } </SCRIPT> </HEAD> <BODY> <!--elementului img ii stabilim id-ul 'poza' pentru a-l putea folosi apoi in cadrul script-ului de asemenea, programam ca elementul img sa reactioneze la cele doua evenimente: - onmouseover (cind mouse-ul intra deasupra imaginii) se va apela functzia care schimba imaginea originala cu cea pe negativ - onmouseout (cind mouse-ul iese de deasupra imaginii) se va apela functzia care pune la loc imaginea originala--> <IMG src="dog.jpg" id="poza" onmouseover="schimba_negativ();" onmouseout="revine_normal();"> </BODY> </HTML>

2) Schimbarea culorii de fundal a unui tabel, culoare pe care o compunem cu ajutorul a 3 valori pentru componentele R, G, B (ntre 0 i 255) pe care le scriem n nite zone text. Cele 3 valori le vom valida (apl035.html):
<HTML><HEAD><TITLE>Exemplu de JavaScript</TITLE> <SCRIPT laguage="JavaScript"> function toHex(numar) {//aceasta functie converteste numarul parametru din zecimal //in hexazecimal. Ne bazam ca este cuprins intre 0 si 255 c1=parseInt(numar/16); c2=numar%16; //in c1 si c2 am obtinut cele 2 cifre hexazecimale if(c1>9) c1=String.fromCharCode(65+c1-10); //daca c1 este mai mare decit 9, o inlocuim cu litera corespunzatoare (A=10, B=11, ..., // F=15) adunind la codul ASCII al lui A (65) diferenta corespunzatoare. Conversia, in //JavaScript, de la codul ASCII la caracter se face prin //String.fromCharCode(codul ascii al caracterului) if(c2>9) c2=String.fromCharCode(65+c2-10); return String(c1)+String(c2); } function rgb(red,green,blue) {//aceasta functie genereaza constanta HTML de tip culoare plecind de la valorile lui //red, green, blue, numere cuprinse intre 0 shi 255.Ea se foloseste de functia de mai sus return "#"+toHex(red)+toHex(green)+toHex(blue); }
48

function coloreaza() {//aceasta functie se apeleaza la apsarea butonului definit in cadrul lui BODY. In primul //rind testam daca valorile sunt intregi. Observati ca am folosit identificatorii dati la //atributul id pentru a extrage valorile din cimpurile text. In primul rind, pentru a //accesa obiectele de tip <input type="text" id="..."> va trebui sa ne folosim de o //functie speciala DOM, si anume document.getElementById. Aceasta functie ne intoarce //o variabila prin intermediul careia putem accesa in continuare obiectul cu ID-ul //respectiv. //In cazul nostru, obtinem variabilele r, g si b pe baza cimpurilor text cu ID-urile //rr, gg si bb definite in cadrul sectiunii <body>, mai jos. //Pe baza variabilelor de tip obiect r, g si b, cimpul "value" ne va intoarce taman //valoarea scrisa in acestea r=document.getElementById("rr"); g=document.getElementById("gg"); b=document.getElementById("bb"); nr=parseInt(r.value);ng=parseInt(g.value); nb=parseInt(b.value); if(nr!=r.value)//daca valoarea convertita la intreg nu coincide //cu cea neconvertita, inseamna ca nu este inteaga, deci dam un mesaj {alert("Valoarea lui r nu este corecta!"); return;}//si iesim fortat (ca in C) cu return //procedam analog pentru celelalte doua if(ng!=g.value) {alert("Valoarea lui g nu este corecta!");return;} if(nb!=b.value) {alert("Valoarea lui b nu este corecta!");return;} //acum verificam sa fie cuprinse intre 0 si 255 if(nr<0||nr>255) { alert('Valoarea lui r nu este cuprinsa intre 0 si 255');return;} if(ng<0||ng>255) { alert('Valoarea lui g nu este cuprinsa intre 0 si 255');return;} if(nb<0||nb>255) { alert('Valoarea lui b nu este cuprinsa intre 0 si 255');return;} //in fine, daca am trecut de aceste filtre, valorile lui r, g si b sunt corecte // si putem, in fine, stabili culoarea de fundal a celuilalt tabel (caruia i-am dat //id-ul tabel) la cea pe care o obtinem din combinatia r, g, b introdusa. tbl=document.getElementById("tabel"); //La fel ca mai sus, getElementById ne intoarce o variabila prin intermediul //careia putem accesa obiectul cu id-ul respectiv tbl.style.backgroundColor=rgb(nr,ng,nb); //apoi, prin intermediul variabilei intoarse, si anume tbl, //stabilim culoarea de fundal a tabelului. Pentru intoarcerea culorii //in formatul recunoscut de HTML, adica #RRGGBB apelam functia //rgb scrisa tot de noi, mai sus } </SCRIPT> <BODY> Introdu componentele de culoare (numere intre 0 si 255):<BR><BR> <!--In tabelul de mai jos am folosit 3 input type="text" fara a ne afla intr-un form. Este posibil si asa ceva, deoarece continutul lor il vom prelua cu ajutorul unui script JavaScript. In cadrul acelui script ne vom folosi de aceste controale prin intermediul atributului id pe care l-am stabilit, deci rr, gg si bb--> <TABLE border="1" cellspacing="0" cellpadding="5"> <TR><TD>Rosu<TD> <INPUT type="text" id="rr" maxlength="3" size="3"> <TR><TD>Verde<TD> <INPUT type="text" id="gg" maxlength="3" size="3"> <TR><TD>Albastru<TD> <INPUT type="text" id="bb" maxlength="3" size="3"> </TABLE><BR> <!--Mai jos am folosit o componenta de tip BUTTON. Aceastei componente i-am folosit atributul onclick. Acestui atribut ii specificam practic ce functie JavaScript trebuie apelata in momentul in care se da click pe buton --> <BUTTON onclick="coloreaza();">Testeaza</BUTTON> <BR><BR> <!--acestui tabel i-am utilizat atributul id, pentru a-l putea mai usor accesa prin modelul DOM in cadrul codului JavaScript--> <TABLE width="50%" height="50%" id="tabel" border="1"> <TR><TD align="center" valign="middle">TEST AREA </TABLE> </BODY></HTML>
49

3) n aplicaia urmtoare, prin intermediul unui control de tip input type=text vom cere utilizatorului s introduc un numr x ntre 4 si 20. Pe baza acestui numr (pe care-l validm) vom genera, ntr-un element de tipul iframe, un tabel cu x linii i x coloane, n care punem numerele de la 1 la x2 i ale crui celule le colorm alternativ, la fel ca pe o tabl de ah. Pe lng codul surs am pus i o captur a ferestrei, in urma rulrii cu n=7 (apl036.html):
<HTML><HEAD><SCRIPT language="JavaScript"> function genereaza() { n=document.getElementById("nn"); nr=parseInt(n.value); if(nr!=n.value)//verificam daca in n este un numar intreg {alert('Numarul introdus nu este intreg');return;} else if(nr<4||nr>20)//verificam si daca este intre 4 si 20 {alert('Numarul trebuie sa fie intre 4 si 20'); return;} d=document.getElementById("ifr").contentWindow.document; //obtinem in variabila d referinta DOM catre documentul din iframe d.open();//deschidem acest document pentru rescriere d.write('<TABLE border="1" cellspacing="0" cellpadding="5">'); k=0;//si generam, prin script, in cadrul sau, codul HTML //care creeaza tabelul anuntat for(i=1;i<=nr;i++) { d.write('<TR>'); for(j=1;j<=nr;j++) { d.write('<TD align="center" '); if((i+j)%2)//in functie de paritatea lui i+j //coloram intr-un fel sau intr-altlul fundalul celulei d.write('bgcolor="#ffff7f">'); else d.write('bgcolor="#7fffff">'); ++k; d.write(String(k)); } } d.write('</TABLE>'); d.close(); } </SCRIPT></HEAD><BODY> Introdu un numar natural cuprins intre 4 si 20: <!--prin intermediul input type="text" scriem o valoare care este apoi preluata de JavaScript. Acesta are id-ul "nn" --> <INPUT type="text" id="nn" size="2" maxlength="2"> <BR><BR> <!--prin intermediul metodei "onclick()" a butonului apelam functia care generaza codul HTML al tabelului in documentul din iframe--> <BUTTON onclick="genereaza();">Genereaza tabelul</BUTTON> <BR><BR> <IFRAME id="ifr" width="70%" height="500"> </IFRAME><HR></BODY></HTML>

De reinut din aceast ultim parte, c script-urile, dei reprezint o automatizare i dinamizare foarte important a unei pagini web, nu sunt rulate pe server-ul HTML (de altfel, pn n momentul de fa am lucrat cu toate fiiere n mod local, ele fiind deschise automat de ctre browser-ul de internet) ci ele sunt rulate de ctre browser pe calculatorul clientului care acceseaz pagina ce le conine.

50

3. LIMBAJUL PHP FACILITI ALE ACESTUIA


3.1. Introducere scurt istoric al apariiei limbajului PHP; mod de funcionare. PHP este un limbaj de programare destinat n primul rnd Internetului, aducnd dinamic unei pagini web. Este unul dintre cele mai importante limbaje de programare web open-source (este gratuit i, n plus, utilizatorii pot aciona liber asupra procesului de dezvoltare) i server-side (codul surs nu se ruleaz pe calculatorul celui care vizualizeaz pagina, ci pe serverul web). Numele su este un acronim recursiv: Php este un Hypertext Processor. Limbajul a fost nceput n 1994 ca o extensie a limbajului server-side Perl, i apoi ca o serie de CGI-uri compilate, de ctre Rasmus Lerdorf, pentru a genera un curriculum vitae i pentru a urmri numrul de vizitatori ai unui site. A evoluat apoi n PHP/FI 2.0, dar proiectul open-source a nceput s ia amploare dup ce Zeev Suraski i Andi Gutmans au lansat o nou versiune a interpretorului PHP n vara anului 1998, aceast versiune primind numele de PHP 3.0. Tot ei au schimbat numele n acronimul recursiv amintit mai sus, pn atunci PHP-ul fiind cunoscut ca Personal Home Page tools. n prezent este utilizat versiunea 6 a acestui limbaj. Prin CGI (Common Gateway Interface) se nelege o interfa a unui server de web, care extinde funcionalitile acestuia. CGI nu se refer la un anumit limbaj de programare, ci definete un modul standardizat, prezent n cadrul unui server HTTP. Prin intermediul acestui modul se stabilesc regulile prin care server-ul va pasa datele primite de la un utilizator ctre o aplicaie scris ntr-un anumit limbaj de programare, pentru ca apoi s ntoarc rezultatele acestei aplicaii napoi la utilizator. Limbajul PHP, n marea majoritate a cazurilor, se folosete sub form de secvene de cod inserate n cadrul unui document HTML. Din acest motiv, vom prefera termenul de script PHP celui de program PHP. Structura unui script PHP este foarte asemntoare cu cea a unui cod scris n limbajul C, mai ales n sensul n care structurile de programare au aceeai sintax i aceeai funcionalitate. Rolurile de baz ale unui script PHP constau n aceea c scipt-ul poate prelua date trimise de ctre o pagin web de la un client (n general, datele pot fi trimise de ctre o pagin web prin intermediul formularelor) i de a executa o secven de program n urma creia va rezulta un cod HTML, cod pe care clientul l va primi sub forma unei pagini web. Clientul nu va avea acces la codul efectiv al script-ului, ci, prin faptul c acesta se afl pe server i se ruleaz tot pe acesta, va primi direct HTML-ul generat de script.

51

3.2. Cerine tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii asupra instalrii. Dup cum am vzut n capitolul precedent, PHP nu este un limbaj de programare de sine-stttor (cum ar fi C++, spre exemplu) ci se folosete n simbioz n primul rnd cu HTML, i deci pentru a rula, are nevoie neaprat de un server de web (http server). Practic, pentru a face ca pe calculatorul nostru s poat rula fiiere php, avem nevoie s instalm, pe lng limbajul PHP, i un server de web, i de a face legtura dintre cele dou. Acest lucru se poate face separat, ns sunt necesare o serie de setri foarte minuioase i greoaie. Din acest motiv, pentru testarea aplicaiilor pe care le vom studia, vom folosi un pachet gratuit, disponibil pe Internet, numit XAMPP. Acest pachet, foarte simplu de instalat, conine mai multe aplicaii. Cele care ne vor interesa pe noi sunt serverul Apache (pentru http), un server de MySQL, i suport pentru limbajul PHP. Cerinele tehnice pentru rularea n bune condiii sunt minimale: practic, pe orice calculator care este capabil s ruleze Windows 2000, XP sau Vista, pachetul XAMPP va rula fr probleme. Dei instalarea sa poate fi fcut n mai multe feluri, cel mai la ndemn este s folosim o versiune de tip Installer a sa. Adresa de unde poate fi descrcat pachetul gratuit este:
http://www.apachefriends.org/en/xampp-windows.html

1. Downloadai executabilul installer-ului: derulai pagina pn cnd dai de seciunea Download, accesnd primul link Installer, ca n figura de mai jos:

52

La momentul scrierii lucrrii de fa, ultima versiune public a XAMPP-ului este 1.6.7. Fiierul executabil al installer-ului acestei versiuni este xampp-win32-1.6.7-installer.exe 2. Lansai n execuie installer-ul. Vom alege instalarea n limba englez. Lsm nemodificat directorul propus pentru instalare (c:\xampp). n fereastra urmtoare vom bifa toate cele 3 csue care ne propun instalarea server-elor Apache, Mysql respectiv Filezilla (acesta din urm fiind de fapt un server de FTP) ca i servicii. 3. La sfritul instalrii, server-ul de web este deja funcional, avnd inclus att suport php ct i baza de date MySQL. Prin intermediului panoului de control XAMPP putem vedea care este starea curent a server-elor instalate, i le putem de asemenea gestiona. 4. Pentru a testa efectiv funcionalitatea server-ului web, deschidem un browser de internet, scriind la adres: http://localhost. Dac instalarea a fost fcut cu succes, ne apare o pagin din care suntem invitai s alegem limba de operare, dup care suntem dui n pagina HOME a instalrii fcute. Directorul rdcin al documentelor web este c:\xampp\htdocs. n vederea testrii aplicaiilor PHP pe care le vom studia n continuare, vom crea n acest director un alt subdirector phpapps. Dup ce l-am creat, putem testa existena sa deschiznd browser-ul de internet n care scriem adresa: http://localhost/phpapps n browser trebuie s ne apar un director gol. n mod implicit, toate fiierele i subdirectoarele pe care le punem n acesta vor fi vizibile prin intermediul server-ului de http. Numele index.htm, index.html respectiv index.php sunt rezervate: dac denumim vreun fiier n acest mod, la intrarea n directorul care l conine, n loc de a ne arta ceea ce se gsete n acest director, serverul web ne va arta direct pagina coninut de fiierul respectiv.

3.3. Testarea instalrii. Structura unui fiier PHP. Spre deosebire de fiierele .html care o dat create pe discul local cu un editor de texte pot fi deschise imediat tot local, direct n browser-ul de Internet, pentru a rula codul PHP este absolut necesar ca fiierele s fie puse n directorul n care rezid documentele serverului web, iar

53

vizualizarea lor s fie fcut prin intermediul acestuia. n mod implicit, un fiier care conine un script PHP trebuie s fie salvat cu extensia .php. S crem primul nostru script PHP. Vom descrie operaiile necesare acestui lucru, bazndu-ne pe instalarea pachetului XAMPP descris n capitolul anterior. Astfel, toate scripturile pe care le vom crea le vom pune n directorul c:\xampp\htdocs\phpapps . Cu ajutorul unui editor de texte (de exemplu Notepad, Notepad++) creai urmtorul fiier, pe care l salvai n directorul de mai sus sub numele apl037.php (codul de mai jos este preluat aa cum apare vizualizat n editorul Notepad++. Numele fiierelor aplicaiilor continu numrtoarea din capitolul precedent):

Observai structura absolut identic celei a unui fiier HTML. Noutatea este adus de scriptul PHP, care este inserat ntre tag-urile colorate n rou: <?php i ?>. Instruciunea echo cuprins ntre acestea este o instruciune specific limbajului PHP, ea avnd rolul de a scrie n pagina web textul ce urmeaz dup, cel cuprins ntre ghilimele. S vizualizm acum pagina rezultat n urma acestui fiier. Pentru aceasta, deschidei browser-ul de Internet, scriind urmtoarea adres: http://localhost/phpapps. Dac XAMPP a fost corect instalat, vei obine urmtoarea pagin:

54

n pagin v este artat coninutul directorului n care am creat fiierul apl037.php, aa cum este vizualizat prin intermediul serverului de web. n aceast pagin facei un click pe fiierul apl037.php, pentru a-l vizualiza prin intermediul serverului web. Dac totul este n regul, coninutul afiat n browser trebuie s fie urmtorul:

Remarcai c, ceea ce vedem este rezultatul instruciunii echo din PHP. Dac se obine altceva, nseamn c instalarea nu s-a fcut n mod corect. Mai mult, s analizm codul surs generat. Pentru aceasta, n browser, executai comanda de vizualizare a sursei (n cazul lui Internet Explorer, alegei din meniul View opiunea Source). Va trebui s obinei urmtorul cod surs:
<HTML><HEAD> <TITLE>Primul HTML continind script PHP</TITLE> </HEAD> <BODY> <H2>Acesta este un titlu H2 scris normal, in afara scriptului</H2> Acest text este scris de catre script-ul PHP</BODY> </HTML>

Aa cum am anunat, codul PHP, ba chiar nsui faptul c n aceast pagin ar exista vreun script, nu sunt vizibile clientului, ci acesta vede doar rezultatul obinut n urma rulrii. S mai scriem nc un exemplu, nainte de a trece la detalierea limbajului de programare PHP. n acelai director (c:\xampp\htdocs\phpapps) creai fiierul apl038.php, cu urmtorul coninut:

Remarcai similitudinea dintre limbajul PHP i C, n cazul instruciunilor din cadrul scriptului: n afara faptului c variabila, care n C ar fi fost i, aici este $i, instruciunea for are
55

aceeai sintax. Sintaxa lui echo este uor de asimilat, prin analogie cu cout<< (entitile de afiat, n loc s mai fie separate de << sunt separate de virgule). Remarcai, de asemenea, c la fiecare afiare echo din cadrul repetitivei for, este afiat tag-ul <br>, pentru ca, n pagina vizualizat, dup fiecare linie s se treac la rnd nou. Iat rezultatul pe care trebuie s-l obinem n browser:

Din nou, vizualiznd codul primit de ctre browser, vom obine urmtorul HTML:

Remarcai din nou c, ceea ce ajunge la client este doar rezultatul execuiei script-ului PHP. Observai c, dei tag-ul <BR> produce n browser trecerea la rnd nou, n cadrul vizualizrii sursei obinute, codul este dezordonat, deoarece este scris una-ntr-una, fr Enter-uri. Acest lucru, n mod normal, nu deranjeaz, atta timp ct aspectul paginii vizualizate n browser are acelai aspect. Totui, o aliniere este binevenit n cazul depanrii unui script, pentru c se poate urmri mai uor apariia unei eventuale erori sau neconcordane. Pentru acest lucru, n cadrul unui echo putem folosi, la afiare, oricte treceri la rnd nou dorim. Acestea se fac, la fel ca i n C, prin caracterul special \n. Dup cum tim din capitolul precedent, Enter-urile n cadrul unui text din codul HTML nu au efect, deci afiarea de \n-uri o folosim n special pentru structurarea ordonat a acestuia.

56

n cazul aplicaiei de fa (apl038.php) s modificm linia a 8-a a sa (afiarea cu echo) schimbnd-o n urmtoarea:

Aspectul su n browser rmne absolut nemodificat. Totui, vizualiznd codul surs, vom remarca alinierea acestuia:

De reinut deci, din exemplele prezentate, c: un fiier ce conine script-uri PHP se salveaz de regul cu exensia .php, fiind localizat n directorul n care rezid documentele serverului web; orice script PHP este cuprins ntre tag-urile <?php i ?>; instruciunea PHP care produce output n pagina HTML este echo; rularea unei pagini care conine script PHP se va face ntotdeauna prin intermediul serverului de web; la fel ca i n C, separatorul dintre instruciunile unui script .php este caracterul ;. O ultim observaie care trebuie fcut este aceea c, n mod implicit (deci fr a modifica setrile de instalare) limbajul PHP, spre deosebire de C, nu este case-sensitive (deci nu face diferena ntre literele mari i cele mici) n ceea ce privete cuvintele rezervate ale limbajului (instruciunile) respectiv funciile (fie c e vorba de cele predefinite ale limbajului, fie c e vorba de cele definite de ctre utilizator). n schimb, este case-sensitive n ceea ce privete numele de variabile. Astfel, fie c scriem for fie FOR, limbajul va recunoate instruciunea repetitiv cu contor. n schimb, dac folosim identificatorii $a respectiv $A, va fi vorba de dou variabile distincte.

57

3.4. Constante. Variabile. Operatori. Afiarea datelor. Constante Constantele recunoscute de limbajul PHP sunt asemntoare cu cele ale limbajului C: constante numerice ntregi i reale: 14, -80, 3.14, -8.25, 1e+2, 314e-2, etc. constante de tip caracter i ir de caractere: a, \n, Ana are mere, Cici,
Mimi, etc. Spre deosebire de C, n PHP nu se mai face diferena ntre un singur caracter i un

ntreg ir de caractere din punct de vedere al constantelor. Separatorii pot fi att ghilimelele ct i apostrofurile, rolul lor funcional fiind puin diferit vom vedea acest lucru mai ncolo. Caracterele speciale sunt aceleai ca i n C: \n, \\, \, \ i altele. constante de tip bool: false i true. Spre deosebire de C, rezultatul oricrei expresii relaionale sau logice este de acest tip special de date. Totui, n cazul instruciunilor care necesit expresii relaionale sau logice, se pstreaz convenia din C, i anume c orice valoare diferit de 0 este echivalent cu true, iar orice valoare egal cu 0 este echivalent cu false. Definirea constantelor de ctre utilizator, n sensul c prin anumii identificatori putem folosi valori constante, se face cu ajutorul funciei define. Forma general a acesteia este:
define(nume constanta, valoare);

Exemplu de script (apl039.php):


<?php define("pi",314e-2);//aici am definit o constanta numerica reala define("greeting","Buna ziua!");//iar aici o constanta de tip sir de caractere echo greeting,"<br>";//aici afisam constanta sir de caractere echo "Constanta pi, aproximata cu 2 zecimale este ",pi;//iar aici pe cea numerica ?>

Variabile n PHP identificatorii rezervai variabilelor ncep cu caracterul $. n continuare, respect aceleai specificaii din C, deci imediat dup caracterul $ trebuie s fie o liter sau liniua de subliniere (_), iar n rest pot fi folosite i cifrele. Spre deosebire de C, variabilele nu se declar la nceput, ci tipul lor este definit (implicit, de ctre limbaj) atunci cnd sunt folosite. Mai mult, i pot schimba tipul n funcie de valoarea pe care o rein.

58

Exemplu de script (apl040.php):


<?php $a=4+5.5;//La fel ca si in C, mai intii se evalueaza expresia din dreapta. //Rezultatul 9.5 este real. In urma atribuirii este creata variabila $a, de tip real echo "Valoarea din variabila a este: ",$a,"<BR>\n"; $b="Ana are mere";//Se creeaza variabila $b, de tip string $a=$b;//Modificam variabila $a, dindu-i continutul lui $b. Acesta fiind de tip //string, se modifica si tipul variabilei $a, de la real la string. //Acest lucru n-ar fi fost posibil in C echo "Noua valoare din variabila a este: <B><FONT color=\"red\">",$a; echo "\n</FONT></B>";//in plus, am mai imbogatit afisarea, folosind tag-urile //pentru scris bold si cel pentru caractere de culoare rosie ?>

Analizai legtura dintre codul surs de mai sus i alinierea fiierului obinut n browser (deci afirile de \n din cadrul instruciunilor echo) :
Valoarea din variabila a este: 9.5<BR> Noua valoare din variabila a este: <B><FONT color="red">Ana are mere </FONT></B>

Remarcai de asemenea i faptul c valoarea atributului color (i anume red) a trebuit a fi scris ntre ghilimele. Textul din cadrul echo-ului n care am afiat acest atribut, fiind deja n interiorul unor ghilimele, a trebuit s folosim caracterul special \ pentru a face aceast afiare posibil. Dac am fi folosit, pur i simplu, ghilimele obinuite, instruciunea echo ar fi considerat c n acel loc se ncheie stringul, iar din acest caz n-ar mai fi putut interpreta caracterele urmtoare, ceea ce s-ar fi terminat cu producerea unei erori. n PHP este posibil i adresarea indirect. Acest lucru nseamn c, dac o variabil conine o expresie de tip string n care este reinut numele unei variabile, putem afia direct valoarea variabilei reinut de string. Pentru aceasta se va folosi nc o dat caracterul $ (de forma $$x). Exemplu de script (apl041.php):
<?php $a=5; $x="a"; echo "Iata stringul din variabila x: ",$x,"<BR>\n"; echo "Iata valoarea variabilei din stringul x: ",$$x; ?>

Operatori Muli dintre operatorii limbajului PHP sunt cunoscui din C++. Acesta este motivul pentru care vom prezenta doar anumite particulariti specifice limbajului PHP.

59

Pentru nceput, i prezentm, n ordine descresctoare a prioritilor lor: 1. ! , ++ , -- , (int) , (double) , (string) ; 2. * , % , / ; 3. < , <= , > , >= ; 4. == , != , === , !== ; 5. & ; 6. ^ ; 7. && ; 8. ?: ; 9. = , += , -= , /= , *= , %= , &= , |= , ^= ; 10. And ; 11. Xor ; 12. Or ; 13. , ; n PHP se pot folosi operatori de conversie explicit, cunoscui din C++. Ca i n C++, ei se aplic prefixat. Astfel, exist: (int) conversie ctre o valoare ntreag, (string) conversie ctre ir, iar (double) conversie ctre real. Exemplu de script (apl042.php):
<?php $a=(int)8.65;//la fel ca si in C, se vor elimina zecimalele echo "variabila a are valoarea: ",$a,"<BR>"; $b=(double)"3.85copac";//conversia se va face atita cit se poate, deci variabila //b va contine valoarea 3.85, restul de caractere vor fi ignorate echo "variabila b are valoarea: ",$b,"<BR>"; $c="1.25mere"+"3.75pere";//ba mai mult, se va face conversia explicita, adica //limbajul va converti mai intii cele doua stringuri la numere, apoi va face adunarea echo "variabila c are valoarea: ",$c,"<BR>"; $d=19/5;//spre deosebire de C, operatorul C face impartire reala, chiar daca //operatorii sai sunt intregi echo "variabila d are valoarea: ",$d,"<BR>"; //daca dorim impartire intreaga, facem conversia la int: $e=(int)(19/5); echo "variabila e are valoarea: ",$e,"<BR>"; ?>

Exemplu de script (apl043.php):


<?php echo "<TT>"; //operatorul == functioneaza ca si in C. Limbajul PHP fiind ceva mai larg in ceea ce //priveste tipurile de date, verifica doar egalitatea ca valoare. //vom folosi functia var_dump(variabila), care ne afiseaza tipul unei variabile //si valoarea sa. Facem acest lucru, deoarece rezultatele unor comparatii in PHP //au o valoare de tipul bool (true sau false) ce nu poate fi afisata in mod direct $a=("3"==3);//vom obtine true, deoarece in urma conversiei, cele 2 valori sunt egale echo 'Iata rezultatul comparatiei "3"==3 : ';//remarcati cum, de aceasta data, pentru //ca stringul pe care dorim sa-l afisam contine ghilimele, l-am delimitat prin //apostrofuri var_dump($a);echo "<BR>";
60

$b=("3"==3.90);//vom obtine false echo 'Iata rezultatul comparatiei "3"==3.90 : '; var_dump($b);echo "<BR>"; $b=("3.90"==3.90);//vom obtine true echo 'Iata rezultatul comparatiei "3.90"==3.90 : '; var_dump($b);echo "<BR>"; ?>

Exemplu de script (apl044.php):


<?php echo "<TT>"; //operatorul === reprezinta o noutate fata de C. Acest operator verifica egalitatea //atit ca valoare cit ca si tip. Evident, operatorul !== reprezinta negatia sa. $a=("3"==3);//acesta este true, pentru ca valorile sunt egale echo 'Iata rezultatul comparatiei "3"==3 : '; var_dump($a);echo "<BR>"; $b=("3"===3);//acesta este false, pentru ca, desi valorile sunt egale, tipurile nu sunt echo 'Iata rezultatul comparatiei "3"===3 : '; var_dump($b);echo "<BR>"; $c=(1+2===3);//aceasta este true, pentru ca expresiile sunt de acelasi tip echo 'Iata rezultatul comparatiei 1+2===3 : '; var_dump($c);echo "<BR>"; $d=(3.0===3);//aceasta este false, pentru ca tipurile nu sunt egale echo 'Iata rezultatul comparatiei 3.0===3 : '; var_dump($d);echo "<BR>"; ?>

Exemplu de script (apl045.php):


<?php //Operatorul =, de atribuire, functioneaza la fel ca si in C. //Este asadar permisa si atribuirea multipla: $a=$b=$c=5.23; echo "Iata variabilele a, b si c, initializate toate cu aceeasi valoare: "; echo $a,", ",$b,", ",$c; ?>

Afiarea datelor Dup cum am vzut deja, una dintre cele mai folosite instruciuni de afiare n PHP este
echo. Are dou forme:

a) data afiat se scrie ntre paranteze rotunde (aceast form nu poate fi folosit pentru afiarea mai multor date): echo(Ana are mere); b) datele afiate sunt scrise dup echo, fr a fi grupate ntre paranteze i separate prin virgule: echo Ana are , 1+2, mere; O alt instruciune de afiare este print. Dup ea urmeaz o singur dat, care poate fi sau nu pus ntre paranteze. Funcioneaz ca i echo, n plus, n cazul n care folosim forma cu paranteze, va ntoarce valoarea true dac afiarea a fost fcut cu succes, respectiv false n caz contrar. Alte dou instruciuni folosite n special pentru cazurile n care dorim s depanm un program sunt:
61

var_dump(expresie) afieaz tipul expresiei urmat de valoarea sa; print_r(variabila) n cazul unor variabile compuse (iruri, obiecte) produce o afiare a tuturor componentelor ale acestora. Observaii: Dup cum am vzut deja prin exemplele date, n loc de ghilimele, se pot folosi i apostrofuri. Diferena este dat de faptul c, n cazul folosirii ghilimelelor, dac irul de caractere conine numele unor variabile, acestea vor fi evaluate, deci se va afia coninutul lor, pe cnd n cazul apostrofurilor se va afia numele variabilei ca atare. Nu putem folosi ghilimele incluse n cadrul altei perechi de ghilimele, i nici apostrofuri incluse ntre alte perechi de apostrofuri, n schimb, putem include ghilimele ntr-un ir delimitat de apostrofuri sau apostrofuri ntr-un ir delimitat de ghilimele. Exemplu de script (apl046.php):
<?php $a=3;$b=4; echo "Ana are $a mere si $b mere<BR>";//aici se vor evalua atit $a cit si $b echo 'Ana are $a mere si $b mere<BR>';//pe cind aici nu ?>

3.5. Instruciuni ale limbajului PHP. Instruciunile PHP sunt asemntoare cu cele din C. Din acest motiv, ne vom limita la o scurt prezentare a lor i la cteva exemple de utilizare.

3.5.1. Instruciunea expresie. La fel ca i n C++ se folosete n special pentru calcule i atribuiri. Exemplu: $x=$x*10+3;

3.5.2. Instruciunea bloc (se mai numete i compus). Are aceeai sintax i funcionalitate ca n C, i anume de a grupa mai multe instruciuni, astfel nct acestea s joace rolul sintactic al uneia singure. Instruciunile se scriu ntre paranteze acolade:
{ ... ... }
62

3.5.3. Instruciunea if. Are aceeai form i funcionalitate ca i n C:


if(expresie) instruciune1; [else instruciune2;]

Deci, dac expresia este evaluat ca fiind adevrat (sau diferit de 0) se execut
instruciune1. Dac este fals (sau 0) iar ramura else este prezent, se va executa instruciune2. La fel ca i n C, dac n loc de o singur instruciune sunt mai multe, se vor

grupa ntr-un bloc. Exemplu de script (apl047.php) care conine un if:


<?php //urmatorul script ia ca si parametru de intrare variabila a definita mai jos. //Pentru ca inca nu am prezentat cum se face preluarea de date de catre PHP, ne //vom limita sa modificam manual variabila $a de mai jos. //Program formeaza alte doua variabile $b si $c, cu primele doua respectiv //ultimele doua cifre ale lui $a, daca acesta are exact 4 cifre, sau scrie un //mesaj corespunzator in caz contrar $a=1425; echo 'Valoarea din variabila $a este : ',$a,"<BR>"; if($a>=1000&&$a<=9999)//deci verificam sa aiba exact 4 cifre {//in caz afirmativ se executa instructiunile din acest bloc $b=(int)($a/100); $c=$a%100; echo "Primele doua cifre ale sale sunt : ",$b,"<BR>"; echo "Ultimele doua cifre ale sale sunt : ",$c,"<BR>"; } else //iar in caz contrar afisam un mesaj corespunzator echo "Valoarea din variabila a NU are exact 4 cifre!<BR>"; ?>

3.5.4. Instruciunea while. Are aceeai form i funcionalitate ca i n C:


while(expresie) instruciune;

Principiul de executare este urmtorul: Pasul P1: Se evalueaz expresia; Pasul P2: Dac aceasta este adevrat (sau diferit de 0) se execut instruciunea subordonat, dup care se revine la Pasul P1. n caz contrar se termin execuia repetitivei while, trecndu-se la instruciunea urmtoare n codul surs. Exemplu de script (apl048.php) care conine while:
<?php //Programul afiseaza cifrele numarului intreg din variabila a, in ordine inversa, dupa //fiecare afisind caracterul #: $a=1425; echo 'Valoarea din variabila $a este : ',$a,"<BR>"; while($a)//deci cit timp valoarea din $a este nenula { $r=$a%10;//determinam ultima sa cifra in variabila $r $a=(int)($a/10);//inlocuim $a cu citul impartirii sale la 10, deci //"stergem" ultima sa cifra echo $r,"# ";//afisam cifra curenta, obtinuta in variabila $r, urmata de un # } ?>

63

3.5.5. Instruciunea do...while. Are aceeai form i funcionalitate ca i n C:


do instruciune; while(expresie);

Principiul de executare este urmtorul: Pasul P1: Se execut instruciunea subordonat (cea de dup do); Pasul P2: Se evalueaz expresia. n cazul n care valoarea evaluat este false (sau 0), executarea instruciunii do...while se termin. n cazul n care este adevrat (sau nenul) se reia executarea pasului P1. Exemplu de script (apl049.php) care conine do...while:
<?php //Programul afiseaza cifrele numarului intreg din variabila a, in ordine inversa, dupa //fiecare afisind caracterul #: $a=1425; echo 'Valoarea din variabila $a este : ',$a,"<BR>"; do { $r=$a%10;//determinam ultima sa cifra in variabila $r $a=(int)($a/10);//inlocuim $a cu citul impartirii sale la 10, deci //"stergem" ultima sa cifra echo $r,"# ";//afisam cifra curenta, obtinuta in variabila $r, urmata de un # }while($a);//deci repetam ciclarea cit timp valoarea din $a este nenula ?>

3.5.6. Instruciunea for. Are aceeai form i funcionalitate ca i n C:


for(expresieiniializare;expresiecontinuare;expresieincrementare) instruciune;

Principiul de executare este uor de neles, datorit faptului c for-ul se poate transcrie n mod perfect echivalent prin urmtoarea secven de program:
expresieiniializare; while(expresiecontinuare) { instruciune; expresieincrementare; }

Dei for-ul este, n limbajul C, deci i n PHP, o instruciune mult mai general dect n alte limbaje, totui, cel mai utilizat scop al su este de a atribui unui contor, rnd pe rnd, valori (de regul ntregi) cuprinse ntre dou limite. Exemplu de script (apl050.php) care conine un for:
<?php //Programul calculeaza suma primelor $n numere naturale in variabila $s: $n=10; $s=0; echo 'Valoarea din variabila $n este : ',$n,"<BR>"; for($i=1;$i<=$n;$i++) $s+=$i; echo "Suma primelor $n numere naturale este $s<BR>"; ?>
64

3.6. Transmiterea datelor prin intermediul formularelor. n capitolul 2 am amintit de formulare i de rolul pe care acestea l joac n dinamizarea paginilor web. Formularele reprezint un mecanism prin care se pot trimite date ctre serverul HTML. Aceste date pot fi preluate de ctre script-urile PHP i n continuare folosite n cadrul programelor. S nu uitm c formularele sunt elemente HTML. Fie urmtorul unui formular, pe care l crem n fiierul apl051.html :
<form action="apl052.php" method="post"> Introdu o valoare numerica: <input type="text" name="a" maxlength="4"> <br><br> <input type="submit" value="Calculeaza patratul sau"> </form>

Atributul action al tag-ului form se refer la numele fiierului PHP care se va ocupa de prelucrarea datelor iar atributul method de metoda prin care sunt trimise datele ctre server. Tag-ul <input type=text...> creeaz un cmp de date de tip text. Atributul name al acestuia specific un identificator prin care PHP-ul va prelua valoarea din acesta. Tag-ul <input type=submit...> creeaz un buton de trimitere a datelor. Practic, apsarea pe acest buton permite trimiterea coninutului ntregului formular ctre server. Preluarea datelor trimise ctre server prin intermediul metodei POST, n cadrul unui script PHP se face prin intermediul vectorului predefinit $_POST[nume_cmp_din_formular]. Atenie la faptul c $_POST trebuie scris cu majuscule !. De exemplu, n cazul nostru, putem recupera aceast valoare prin intermediul lui
$_POST[a].

Analog, dac datele ar fi trimise ctre server prin intermediul metodei GET (deci n mod vizibil, n cererea URL, de exemplu http://mypage.html?a=13), n cadrul script-ului PHP asociat, preluarea lor se face prin intermediul vectorului predefinit
$_GET[nume_cmp_formular].

n cazul n care un anumit cmp nu exist, n momentul cererii $_POST[...] din cadrul PHP-ului, acesta s-ar putea sa genereze un mesaj de tip atenionare (warning) n funcie de setri. Pentru a evita acest lucru, n faa caracterului $ (de la $_POST[...]) punem caracterul @. Semnificaia acestuia este de a ignora mesajele de tip warning.

65

Iat i codul lui apl052.php, scriptul PHP pe care l-am anunat n atributul action al formularului apl051.html, script care va trebui s se afle n acelai director cu apl051.html. Scriptul preia valoarea cmpului text din form i afieaz att valoarea recuperat ct i ptratul su:
<?php $a=$_POST['a'];//deci, in variabila $a preluam valoarea din cimpul cu //atributul name="a" al form-ului care a trimis datele. echo "Iata valoarea preluata din formular: ",$a,"<br><br>"; echo "Patratul sau este ",$a*$a; ?>

Vom studia, n continuare, modul n care se preiau datele din toate tipurile de elemente care pot s apar ntr-un formular obinuit: - n cazul unui input de tip text, am vzut deja cum se face acest lucru. n exact acelai mod se preiau datele dintr-un input de tip password, de tip hidden sau de tip textarea. - n cazul unui input de tip submit, valoarea (care este de fapt textul scris pe buton) se poate prelua doar n cazul n care, n cadrul tagului <input type=submit...> apare i atributul name. Evident, n cazul n care formularul are un singur control de tip submit, e destul de ilogic sa dorim sa vedem ce valoare are. Totui, n cazul n care un formular are dou sau mai multe butoane de tip sumbit, crora vrem s le asignm funcii diferite, este foarte important s tim care dintre ele a fost apsat. Iat mai jos un astfel de exemplu:
apl053.html + apl054.php primul fiier conine un formular cu dou cmpuri text, n care

introducem valori numerice. n funcie de controlul submit pe care-l apsm, al doilea fiier va prelua datele i va calcula fie produsul fie suma celor dou valori numerice:
apl053.html:
<form action="apl054.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td align="right">Introdu o valoare numerica: <td align="center"> <input type="text" name="cta" maxlength="4" size="4"> <tr><td align="right">Introdu o alta valoare numerica: <td align="center"> <input type="text" name="ctb" maxlength="4" size="4"> <tr><td colspan="2" align="center"> <input type="submit" value="Calculeaza suma" name="operatia"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="submit" value="Calculeaza produsul" name="operatia"> </table> </form>

apl054.php:
<?php $op=$_POST['operatia'];//controlul cu numele 'operatia' este chiar butonul de submit //preluam valoarea sa in variabila $op, pentru a vedea care dintre butoane a fost apasat $a=$_POST['cta'];//preluam si cele doua valori numerice $b=$_POST['ctb'];//din cimpurile text cu numele cta si ctb //le afisam: echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>"; //in functie de valoarea lui "op" calculam suma sau produsul

66

if($op=="Calculeaza suma") echo "Suma celor doua este ",$a+$b; else echo "Produsul celor doua este ",$a*$b; ?>

- n cazul unui control de tip radio, s ne amintim mai nti c toate tag-urile de tipul
<input type=radio...> trebuie s aib la atributul name acelai nume, iar la atributul value valori diferite, prin care vom identifica opiunea aleas. Aceast valoare va fi trimis ctre

PHP. Iat un exemplu de utilizare al controlul de tip radio: apl055.html + apl056.php. Cu aceast ocazie vom folosi i instruciunea switch a limbajului PHP, instruciune pe care nu am prezentat-o, ns care are exact aceeai sintax i funcionalitate ca n C.
apl055.html:
<form action="apl056.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td align="right">Introdu o valoare numerica: <td align="center"> <input type="text" name="cta" maxlength="4" size="4"> <tr><td align="right">Introdu o alta valoare numerica: <td align="center"> <input type="text" name="ctb" maxlength="4" size="4"> <tr><td colspan="2"> Alege operatia pe care doresti<br> sa o faci cu cele doua:<br> <input type="radio" value="1" name="op" checked>Suma<br> <input type="radio" value="2" name="op">Diferenta<br> <input type="radio" value="3" name="op">Produsul<br> <input type="radio" value="4" name="op">Citul <tr><td colspan="2" align="center"> <input type="submit" value="Calculeaza"> </table> </form>

apl056.php:
<?php $op=$_POST['op'];//controlul cu numele 'op' este grupul de butoane radio. //preluam valoarea sa in variabila $op, pentru a vedea care optiuni a fost aleasa $a=$_POST['cta'];//preluam si cele doua valori numerice $b=$_POST['ctb'];//din cimpurile text cu numele cta si ctb //le afisam: echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>"; //in functie de valoarea lui "op" calculam suma sau produsul switch($op) { case 1: echo "Suma celor doua este ",$a+$b; break; case 2: echo "Diferenta celor doua este ",$a-$b; break; case 3: echo "Produsul celor doua este ",$a*$b; break; default: echo "citul celor doua este ",$a/$b; } ?>

67

- n cazul unui control de tip checkbox, s ne reamintim c fiecare control de acest tip are un nume separat. Dac este bifat, va trimite ctre PHP valoarea indicat n atributul value a tag-ului <input type=checkbox...> (ca ir de caractere). Dac acest atribut nu este prezent, valoarea trimis ctre PHP va fi irul de caractere on. n schimb, dac nu este bifat, pur i simplu nu va trimite nimic, deci s-ar putea ca cererea
$_POST[...] sa genereze un warning (depinde i de setrile PHP-ului). Pentru ca acest lucru s nu

se ntmple, indiferent de setri, aa cum am anunat mai nainte, folosim caracterul @ n faa cererii
$_POST[...].

Iat mai jos un exemplu: apl057.html + apl058.php


apl057.html:
<form action="apl058.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td>Alege, dintre cele de mai jos,<br> limbile straine pe care le cunosti: <tr><td> <input type="checkbox" name="en">Engleza<br> <input type="checkbox" name="fr">Franceza<br> <input type="checkbox" name="ge">Germana<br> <input type="checkbox" name="it">Italiana<br> <input type="checkbox" name="es">Spaniola<br> <tr><td align="center"> <input type="submit" value="Trimite date"> </table> </form>

apl058.php:
<?php $en=@$_POST['en']; $fr=@$_POST['fr']; $ge=@$_POST['ge']; $it=@$_POST['it']; $es=@$_POST['es']; $l=0;//$l este un flag pe care-l facem 1 cind dam de o limba straina bifata echo "Iata limbile straine pe care le-ai bifat:<br>"; if($en=="on") {echo "Engleza<br>";$l=1;} if($fr=="on") {echo "Franceza<br>";$l=1;} if($ge=="on") {echo "Germana<br>";$l=1;} if($it=="on") {echo "Italiana<br>";$l=1;} if($es=="on") {echo "Spaniola<br>";$l=1;} if($l==0)//daca flag-ul a ramas 0, dam utilizatorului //un mesaj prin carae il informam ca nu a bifat nimic echo "Nu ai bifat nici una dintre limbile straine!"; ?>

- n cazul unui control de tip select simplu, PHP-ul va putea recupera valoarea cu ajutorul numelui stabilit n atributul name al tag-ului <select ...>, valoarea trimis fiind cea stabilit n atributul value al tag-urilor option nglobate n cadrul select-ului. Iat mai jos un exemplu (apl059.html + apl060.php) care reia ideea din apl055.html cu deosebirea c, n loc de a alege operaia dorit prin intermediul unui control radio, o alegem cu ajutorul controlului select. A se remarca faptul c fiierul care prelucreaz datele (apl060.php) a rmas identic cu cel care prelucra datele din apl055.html.

68

apl059.html:
<form action="apl060.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td align="right">Introdu o valoare numerica: <td align="center"> <input type="text" name="cta" maxlength="4" size="4"> <tr><td align="right">Introdu o alta valoare numerica: <td align="center"> <input type="text" name="ctb" maxlength="4" size="4"> <tr><td colspan="2">Alege operatia pe care doresti<br> sa o faci cu cele doua: <select name="op"> <option value="1">Suma <option value="2">Diferenta <option value="3">Produsul <option value="4">Citul </select><tr><td colspan="2" align="center"> <input type="submit" value="Calculeaza"></table></form>

apl060.php:
<?php $op=$_POST['op'];//controlul cu numele 'op' este cel de tip option $a=@$_POST['cta']; $b=@$_POST['ctb']; echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>"; switch($op) { case 1: echo "Suma celor doua este ",$a+$b; break; case 2: echo "Diferenta celor doua este ",$a-$b; break; case 3: echo "Produsul celor doua este ",$a*$b; break; default: echo "citul celor doua este ",$a/$b; } ?>

- n cazul unui control de tip select multiplu, form-ul va trimite ctre PHP un ir n care vom regsi valorile selectate. Este obligatoriu, totui, ca atributul name din cadrul tag-ului
<select multiple ...> s specifice faptul c se va trimite un ir. Acest lucru se face punnd

un set de paranteze ptrate dup numele cmpului, deci de forma name=nume_sir[]. Preluarea n PHP se face n mod normal, prin @variabila=@$_POST[nume_sir] (remarcai faptul c nu se mai pun []). Acest ir va conine pe post de elemente valorile stabilite prin atributul value ale opiunilor selectate. irul va ncepe de la indicele 0, numrul su total de elemente fiind dat de funcia
count(nume_ir).

Iat un exemplu care exploateaz o list de tipul <select multiple...> (apl061.html + apl062.php)

69

apl061.html:
<form action="apl062.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td>Alege, dintre cele de mai jos,<br> limbile straine pe care le cunosti.<br> Poti selecta, evident, mai multe<br> daca tii apasata tasta Control in<br> timpul selectarii <tr><td> <select name="lang[]" multiple size="5"> <option value="en">Engleza <option value="fr">Franceza <option value="ge">Germana <option value="it">Italiana <option value="sp">Spaniola </select> <tr><td align="center"> <input type="submit" value="Trimite date"> </table> </form>

apl062.php:
<?php $lang=$_POST['lang'];//recuperam sirul trimis de catre form prin cimpul lang $nl=count($lang);//apelam functia count pentru a vedea cite elemente are sirul if($nl==0) echo "Nu ai selectat nici o limba straina<br>"; else { echo "Ai selectat $nl limbi straine. Acestea sunt:<br>"; for($i=0;$i<$nl;$i++)//parcurgem sirul pe un for, de la 0 la $nl-1 switch($lang[$i])//si vedem ce valoare are fiecare element, in functie de { //care afisam: case "en":echo "Engleza<br>";break; case "fr":echo "Franceza<br>";break; case "ge":echo "Germana<br>";break; case "it":echo "Italiana<br>";break; default:echo "Spaniola<br>"; } } ?>

- una dintre facilitile transmiterii datelor prin intermediul formularelor const n posibilitatea trimiterii rezultatului mai multor controale sub forma elementelor unui ir sau chiar matrice. n acest caz, atributul name al controlului din form trebuie s specifice acel element din ir (sau matrice) care va primi valoarea sa, deci s fie de forma: name="nume_ir[indice]" respectiv name="nume_matrice[indice_linie][indice_coloan]". Iat un exemplu n care crem un form cu 4 controale de tip input type="text", ale cror valori vor fi preluate de ctre un ir cu 4 elemente (apl063.html + apl064.php):
apl063.html:
<form action="apl064.php" method="post"> Introdu 4 valori numerice intregi:<br><br> prima valoare: <input type="text" name="a[1]"><br><br> valoarea a 2-a:<input type="text" name="a[2]"><br><br> valoarea a 3-a:<input type="text" name="a[3]"><br><br> valoarea a 4-a:<input type="text" name="a[4]"><br><br> <br> <input type="submit" value="Trimite valorile spre prelucrare"> </form>

70

apl064.php:
<?php $a=$_POST['a']; echo 'Cele 4 valori sunt: ',$a[1],' ',$a[2],' ',$a[3],' ',$a[4],'<br>'; $s=0; for($i=1;$i<=4;$i++) $s+=$a[$i]; echo '<br>Suma lor este: ',$s; ?>

3.7. Funcii n PHP. n PHP se pot scrie funcii ntr-un mod foarte similar fa de ceea ce tim din C/C++. S considerm exemplul urmtor, n care se utilizeaz o funcie care calculeaz i ntoarce suma unui numr ntreg pe care l primete ca parametru:
apl065.php:
<?php function suma_c($n)//antetul funciei: se remarc folosirea cuvntului cheie //function fr a se specifica vreun tip (nici mcar void) { $s=0; while($n) { $s+=$n%10; $n=(int)($n/10);//ne reamintim c n PHP operatorul / calculeaz //ctul real (deci cu zecimale): din acest motiv folosim conversia //explicit ctre int } return $s;//la fel ca i n C++, rezultatul ntors de funcie se specific //prin intermediul instruciunii return } echo suma_c(13254); ?>

Aadar: Pentru a ntoarce un rezultat din corpul unei funcii, se folosete, aa cum suntem deja obinuii, instruciunea return. Forma sa general este: return expresie.
n cazul unei funcii care nu ntoarce rezultat (deci echivalentul unei funcii de tip void

din C++), cuvntul cheie function rmne obligatoriu (fr a specifica nimic suplimentar) putnd s apar oriunde n cadrul funciei cuvntul cheie return fr a mai fi urmat de vreo expresie, avnd ca efect ieirea imediat din funcie. El poate fi, de asemenea, omis, ieirea din funcie producndu-se n acest caz n mod natural (dup executarea ntregului su cod). Transmiterea parametrilor se poate face att prin valoare ct i prin referin, n acelai mod n care se face i n C++ : 1) Parametrii specificai n mod direct (folosind doar numele variabilei) sunt cei transmii prin valoare. Chiar dac valoarea unui astfel de parametru este schimbat n cadrul funciei, ea rmne

71

totui neschimbat dup executarea acesteia. Atunci cnd apelm funcia, pe poziiile acestor parametri se pot transmite att valori ct i coninutul unor variabile. Script-ul urmtor afieaz valoarea variabilei de dinainte de apelul funciei (10) chiar dac n funcie s-a ncercat modificarea valorii transmise (apl066.php):
<?php function test($x) { $x=$x*2; } $a=10; test($a); echo $a; ?>

2) Parametrii pe care dorim s-i transmitem prin referin, trebuie precedai de caracterul & (ampersand) n antetul funciei. Dac valoarea unui astfel de parametru este modificat n cadrul funciei, ea rmne modificat i dup executarea acesteia. Evident, atunci cnd apelm funcia, pe poziiile acestor parametrii e obligatoriu s specificm variabile. Relum scriptul anterior, punnd un & (ampersand) n faa parametrului $x. n acest fel, valoarea variabilei dup ce apelm funcia nu va mai fi cea anterioar (10) ci cea obinut n urma modificrii (20) apl067.php:
<?php function test(&$x) { $x=$x*2; } $a=10; test($a); echo $a; ?>

n funcie de domeniul de vizibilitate, i n PHP variabilele se clasific n variabile locale

i variabile globale. Cele globale sunt cele definite n afara oricrei funcii. Implicit, ele nu pot fi adresate din corpul vreunei funcii. Totui, exist o posibilitate de a face acest lucru: n cadrul funciei n care vrem s utilizm variabile globale, le specificm pe toate, precedate de cuvntul cheie global. Putei observa acest mecanism n exemplu urmtor:
apl068.php:
<?php function suma() { global $a,$b,$c; //functia se bazeaza pe cele 3 variabile globale $a, $b si $c //calculnd n $c suma dintre $a si $b //daca nu am fi pus instructiunea global, exemplul nu ar fi functionat deoarece //cele 3 variabile nu ar fi fost recunoscute in functie. $c=$a+$b; } $a=5;$b=6; suma(); echo $c; ?>

72

Variabilele locale sunt variabilele create n corpul unei funcii sau cele create prin transmiterea parametrilor formali (din antetul funciilor). Ele nu sunt recunoscute n afara funciilor. i n PHP funciile pot fi recursive. Pentru a nu ncrca foarte mult un anumit script, putem ngloba toate definiiile complete ale funciilor ntr-un singur fiier de tip text (preferabil cu extensia .php, pentru a nu putea fi vizualizat accidental prin intermediul server-ului http). Mecanismul includerii este unul asemntor cu cel din C/C++ (clauza #include...) cu deosebirea c, putem include codul surs al funciilor n orice loc dorim. Acest lucru se face cu ajutorul funciei predefinite PHP:
require(nume_fisier); .

Codul surs al funciilor trebuie inclus i el ntre tag-urile <?php .. ?>. n exemplul de mai jos, vom crea dou fiiere: apl069.php, ce conine definiia corect a unei funcii care verific dac un numr este prim, i un altul apl070.php, ce afieaz toate numerele prime dintre 1 i n, folosind funcia din apl069.php:
apl069.php:
<?php //a se remarca folosirea tag-urilor specifice includerii unei secvene PHP function is_prime($x) {//$x este un parametru prin valoare for($i=2;$i<=sqrt($x);$i++)//variabila $i este local if($x%$i==0) return 0; if($x<=1) return 0; return 1; } ?>

apl070.php:
<?php require("apl069.php");//prin aceast funcie includem codul existent n apl069.php for($i=2;$i<=100;$i++) if(is_prime($i)) echo $i,"&nbsp;&nbsp;&nbsp;"; //o dovad a comportamentului local al variabilei $i din cadrul funciei const n faptul //c i n codul principal (mai sus) folosim tot o variabil $i, iar cele dou nu se //ncurc ntre ele ?>

Limbajul PHP este nzestrat cu biblioteci care conin numeroase alte funcii. Iat cteva dintre funciile matematice predefinite: - abs(numr) ntoarce modulul numrului (valoarea absolut); - sin(x), cos(x), tan(x) sinusul, cosinusul i tangenta unui unghi. Argumentul x trebuie specificat n radiani; - exp(x) ntoarce ex ; - pow(x, y) ntoarce xy ; - log10(x), log(x) ntorc log10(x), respectiv ln(x); - max(x1, x2, ... , xn) ntoarce maximul (cel mai mare) dintre argumentele sale numerice;
73

- min(x1, x2, ... , xn) ntoarce minimul (cel mai mic) dintre argumentele sale numerice; - ceil(x) ntoarce cel mai mic nr. ntreg care este mai mare sau egal cu x; - floor(x) ntoarce cel mai mic nr. ntreg mai mare sau egal cu x (partea ntreag d.p.d.v. matematic); - rand(min,max) ntoarce o valoare ntreag aleatoare cuprins ntre valorile ntregi min i max (inclusiv); - pi() ntoarce o aproximaie a numrului ; - sqrt(x) calculeaz radicalul (rdcina ptrat) a lui x.

3.8. Prelucrarea irurilor de caractere. Spre deosebire de C/C++, unde irurile de caractere sunt privite ca pointeri, n PHP irurile de caractere sunt privite mai degrab ca nite variabile de sine stttoare. n PHP sunt permise atribuirile directe (prin operatorul =) ntre dou iruri de caractere. Din punct de vedere structural, n PHP irurile de caractere nu mai respect regulile din C/C++ (i n special, NU mai este valabil marca sfritului de string prin caracterul de cod ASCII 0), n schimb, limbajul ne pune la dispoziie o serie de funcii care fac foarte simpl prelucrarea i manipularea stringurilor. n rest, irurile se memoreaz ca o succesiune de caractere ASCII. Putem adresa fiecare caracter al irului prin indicele su, la fel ca n C/C++, ncepnd de la 0. Funcia strlen(ir) ne ntoarce lungimea irului (numrul su de caractere). Dac dorim s parcurgem irul de caractere, putem s-l parcurgem, ca n C++, de la 0 la
strlen(...)-1.

apl071.php:

Afim caracterele unui string, ntr-un tabel cu o singur linie:

<?php $a="Iepurechin"; echo '<table border="1" cellspacing="0" cellpadding="10"><tr>'; for($i=0;$i<strlen($a);$i++) echo '<td>',$a[$i]; echo '</table>'; ?>

Concatenarea a dou sau mai multe stringuri se face cu operatorul . (punctul). Observai

n exemplu de mai jos cum se face acest lucru, i de asemenea faptul c, n timpul concatenrii, valoarea numeric a fost convertit implicit ctre ir de caractere:
$x=9; $s="Ana "."are ".$x." mere"; echo $s;//valoarea final a stringului este "Ana are 9 mere"

74

Funcia strpos(sir1, sir2, [poz_start]) caut dac sir2 este subir al lui sir1 (eventual ncepnd de la poziia poz_start, dac aceasta este specificat). n caz afirmativ, ntoarce poziia de nceput a acestuia, altfel ntoarce false. n exemplul de mai jos se va afia valoarea 3 (pentru c la indicele 3 este gsit secvena pu n stringul dat):
$s="computer"; echo strpos($s,"pu");

Funcia se utilizeaz i pentru a testa dac un ir include sau nu un anumit subir. Dac subirul este gsit, funcia ntoarce poziia de nceput a acestuia iar dac nu, ntoarce false. Dup cum tim, valoarea lui false este, de fapt, 0. Pentru a diferenia cazurile n care subirul nu apare deloc n ir sau apare chiar de la poziia 0, folosim operatorul ===, care rezolv corect problema:
$s="ana are mere"; $gasit=strpos($s,"a"); if($gasit===false) echo "Negasit"; else echo "Gasit la indicele ",$gasit;

Valoarea ntoars de funcie este reinut de variabila $gasit. Pentru a face distincie ntre
false i 0, folosim operatorul ===, care testeaz coincidena att ca valoare, ct i ca tip. De altfel,

acesta este i rostul unui astfel de operator. Acest procedeu se poate folosi i pentru alte funcii. Funcia strstr(sir1, sir2) returneaz din sir1 secvena de caractere din poziia n care a fost gsit prima apariie a lui sir2, dac sir2 este subir pentru sir1 sau false, n caz contrar. Funcia strcmp(sir1, sir2) compar lexicografic (alfabetic) sir1 cu sir2. Valoarea ntoars este: - pozitiv, dac sir1 se gsete lexicografic dup sir2; (sir1>sir2) - nul (0), dac sir1 este identic egal cu sir2; (sir1==sir2) - negativ, dac sir2 se gsete lexicografic nainte de sir1. (sir1<sir2) n PHP se pot folosi deopotriv i pentru stringuri operatorii relaionali: <, <=, >, >=, ==,
!=, care le compar direct, n sens lexicografic, avnd ca rezultat true sau false. Observaie: Comparaia face distincie ntre literele mari i cele mici (codul ASCII) !

Funcia substr(sir, indice, [lungime]) ntoarce subirul irului ir, care ncepe n poziia indice i are lungimea lungime. Dac parametru lungime este absent, se ntoarce irul care ncepe n poziia indice i ine pn la sfritul irului ir. Exemplu: apl072.php
<?php $s="televiziune"; $s1=substr($s,1,4); echo $s1,'<br>';//afiseaza "elev"; $s2=substr($s,4); echo $s2;//afiseaza "viziune"; ?>

75

Funcia substr_replace(sir1, sir2, ind, [lung]) ntoarce irul rezultat prin nlocuirea n sir1, a subirului care ncepe n poziia ind i are lungimea lung, cu sir2. Dac parametrul lung este absent, sir2 nlocuiete subirul care ncepe cu ind i ine pn la sfritul irului ir1, cu ir2. Exemplu: apl073.php
<?php $s="Ana are mere"; echo substr_replace($s,"poseda",4,3); //nlocuiete subirul are (care ncepe la //indicele 4 i are 3 litere) cu subirul poseda, deci afieaz Ana poseda mere ?>

Funcia strtoupper(sir) ntoarce irul rezultat prin conversia doar a acelor caractere

sunt litere mici, la litere mari, iar funcia strtolower(sir) ntoarce irul rezultat prin conversia literelor mari la litere mici. Funcia strtok(...) este utilizat pentru extrage substringuri ale unui string, care n acesta sunt delimitate de nite caractere ce aparin unui ir cu delimitatori, dat. De exemplu, dac avem stringul Ana? Nu, doar tu. i considerm stringul cu separatori: .? #, (este i un caracter spaiu printre ele) se vor separa i obine substringurile Ana, Nu, doar, tu. Modelul de aplicare: - iniial se apeleaz funcia strtok(string, ir_cu_separatori). Funcia va ntoarce fie primul cuvnt obinut prin separare, fie false dac acest lucru nu a fost posibil. - apoi se apeleaz funcia strtok(ir_cu_separatori). Aceasta va tot extrage cte un cuvnt nou obinut prin separare, fie false dac s-a ajuns deja la sfrit, deci dac au fost separate toate cuvintele. Este recomandat ca testarea valorii false ntoars de funcie s fie testat cu operatorul
=== deoarece, n caz contrar este posibil s apar erori din cauza conversiilor (de exemplu, funcia

s ntoarc 0, iar acesta s fie interpretat ca i false). De remarcat, spre deosebire de limbajul C++, c funcia strtok NU distruge stringul asupra creia este aplicat, ci l las intact, exact ca nainte de separare. Exemplu: apl074.php
<?php $s="Ana? Nu, doar tu."; //varianta 1: pe un while: $p=strtok($s,"?,.# "); echo "Stringul initial este:",$s,'<br>Cuvintele sale sunt:<br><br>'; while($p!==false) { echo "cuvintul <b>",$p,"</b> are ",strlen($p),' litere<br>'; $p=strtok("?.#, "); } //varianta 2: pe un for "mascat": echo '<br>Iata acelasi string, separat in acelasi mod, folosind o repetitiva'; echo ' de tip for:<br>'; for($p=strtok($s,"?.,# ");$p!==false;$p=strtok("., ?#")) echo "Cuvintul curent <b>",$p,"</b> are ",strlen($p)," litere<br>"; ?>
76

3.9. iruri (masive) n PHP. n PHP exist mult mai puine constrngeri dect n C/C++ atunci cnd lucrm cu iruri sau cu matrice. n primul rnd, n PHP un ir nu se declar. n momentul n care dorim s crem un ir (sau o matrice), pur i simplu atribuim valori elementelor:
apl075.php:
<?php for($i=1;$i<=5;$i++) $x[$i]=$i; for($i=1;$i<=5;$i++) echo $x[$i]," "; ?>

sau

apl076.php:

<?php $k=1; for($i=1;$i<=5;$i++) for($j=1;$j<=5;$j++) $a[$i][$j]=$k++; for($i=1;$i<=5;$i++) { for($j=1;$j<=5;$j++) echo $a[$i][$j],' '; echo '<br>'; } ?>

Dac unui element aflat la un anumit indice nu i-am atribuit nici o valoare, n orice evaluare, acel element are valoarea NULL. Nu este obligatoriu s folosim indici consecutivi. Ba mai mult, n PHP irurile pot primi pe post de indici chiar i iruri de caractere. Acest fel de tablou se numete tablou asociativ. De exemplu, putem crea un ir n care s reinem pe post de indici denumirile unor produse, iar pe post de indici preurile acestora:
apl077.php:
<?php $x['Piine']=1.61; $x['Vin']=5.99; $x['Alune']=2.21; $x['Ciocolata']=2.69; echo $x['Piine'],' ',$x['Vin'],' ',$x['Alune'],' ',$x['Ciocolata']; ?>

Evident, parcurgerea unui astfel de ir (variabila de ciclare printre indici nu mai respect o regul clasic, numeric) nu se mai face dup regulile clasice, ci exist o instruciune special de ciclare ce permite parcurgerea vectorului n ordinea n care elementele au fost create, cu determinarea, pentru fiecare element, a perechii indice, valoare:
foreach(vector as indice=>valoare) instruciune;

Funcia count(vector) ntoarce numrul total de elemente (folosite, deci crora le-am atribuit valori) ale vectorului.
77

apl078.php:
<?php $x['Piine']=1.61; $x['Vin']=5.99; $x['Alune']=2.21; $x['Ciocolata']=2.69; echo "Sirul are in total ",count($x)," elemente.<br>"; echo "Acestea sunt:<hr>"; $s=0; foreach($x as $indice=>$valoare) { echo $indice," in valoare de ",$valoare,"<br>"; $s=$s+$valoare; } echo "<hr>Valoarea totala:",$s; ?>

Dac n cadrul instruciunii foreach omitem partea cu indice=> (deci lsm instruciunea n forma foreach(vector as valoare) ..., se vor parcurge doar valorile vectorului, indicii fiind omii. Exist i alte funcii care faciliteaz accesul la elementele vectorului. Acestea se bazeaz pe urmtoarea particularitate a implementrii unui vector n PHP: fiecare vector are asociat un pointer intern, pointer care se afl pe un anumit element al irului (numit element curent): current(vector); - ntoarce valoarea reinut de elementul curent al vectorului; key(vector); - ntoarce indicele elementului curent al vectorului; Ambele funcii (current i key), dac pointerul a trecut de vreunul din capete, sau dac irul este vid, ntorc valoarea false. Din cauz c valoarea 0 sau pot fi valori valide pentru ir, pentru a testa dac funcia a ntors valoarea false, trebuie utilizat operatorul === next(vector); - deplaseaz pointerul pe elementul urmtor al vectorului; prev(vector); - deplaseaz pointerul pe elementul anterior al vectorului; reset(vector); - deplaseaz pointerul pe primul element al vectorului; end(vector); - deplaseaz pointerul pe ultimul element al vectorului; Exemplu: apl079.php (care realizeaz exact acelai lucru ca i aplicaia precedent)
<?php $x['Piine']=1.61; $x['Vin']=5.99; $x['Alune']=2.21; $x['Ciocolata']=2.69; echo "Sirul are in total ",count($x)," elemente.<br>"; echo "Acestea sunt:<hr>"; $s=0; while(($valoare=current($x))!==false) { echo key($x)," in valoare de ",$valoare,"<br>"; next($x); $s=$s+$valoare; } echo "<hr>Valoarea totala:",$s; ?>
78

Exist de asemenea o serie de funcii cu ajutorul crora putem sorta elementele unui vector. Le vom exemplifica pe irul din exemplul de mai sus ($x['Piine']=1.61;
$x['Alune']=2.21; $x['Ciocolata']=2.69;) $x['Vin']=5.99;

n ideea c, dup ce am aplicat funcia specific de

sortare, afim irul nou cu ajutorul urmtoarei secvene:

foreach($x as $i=>$v) echo $i," => ",$v,"<br>";

asort(vector) : sorteaz cresctor vectorul dup valorile reinute de fiecare element. Indicii se vor interschimba, evident, n mod corespunztor;

Piine => 1.61 Alune => 2.21 Ciocolata => 2.69 Vin => 5.99

arsort(vector) : sorteaz descresctor vectorul dup valorile reinute de fiecare element. Indicii se vor interschimba, evident, n mod corespunztor;

Vin => 5.99 Ciocolata => 2.69 Alune => 2.21 Piine => 1.61

ksort(vector) : sorteaz cresctor vectorul dup valorile reinute de indici. Valorile se vor interschimba, evident, n mod corespunztor;

Alune => 2.21 Ciocolata => 2.69 Piine => 1.61 Vin => 5.99

krsort(vector) : sorteaz cresctor vectorul dup valorile reinute de indici. Valorile se vor interschimba, evident, n mod corespunztor;

Vin => 5.99 Piine => 1.61 Ciocolata => 2.69 Alune => 2.21

sort(vector) i rsort(vector) sorteaz cresctor, respectiv descresctor, valorile elementelor vectorului. Valorile indicilor se pierd, nlocuindu-se cu indici numerici avnd valori cuprinse ntre 0 i
nr.elemente-1.

irul $x n urma unui sort($x): 0 => 1.61 1 => 2.21 2 => 2.69 3 => 5.99

79

3.10. Programare grafic utiliznd PHP. Una dintre cele mai spectaculoase componente ale multor limbaje de programare, din pcate lsat de multe ori n umbr n majoritatea cursurilor de programare, const n crearea i manipularea imaginilor. Limbajul PHP nu este limitat doar la crearea de output HTML, ci poate fi folosit i pentru a crea respectiv a lucra cu diferite formate de imagini, incluznd gif, png, jpg. Ba mai mult, PHP poate genera o imagine sub forma unui flux de date (deci fr a o nregistra efectiv sub forma unui fiier pe server) direct ctre browser. Pentru a face funcional suportul grafic al limbajului, este necesar utilizarea bibliotecii gd2. n cazul pachetului XAMPP, aceasta este instalat i activat n mod implicit. n cazul altor distribuii, acest lucru trebuie fcut manual. Pentru nceput, s vedem cum se poate crea n mod dinamic o imagine: vom crea un script PHP, a crui deschidere, n browser, va avea ca efect vizualizarea imaginii create de ctre acest script. Vei remarca faptul c, o serie de elemente (imaginile, textul, culorile) au nevoie de nite variabile numite variabile resurs. Din pcate, spre deosebire de o serie de alte limbaje de programare, nu exist constante predefinite pentru culori, ci acestea trebuie s fie create manual, specificnd pentru fiecare componentele de rou, verde i albastru, ntocmai ca la HTML, cu deosebirea faptului c, de aceast dat, cele trei componente de culoare se specific n baza 10, deci printr-un numr de la 0 la 255. Script-ul conine comentariile necesare nelegerii codului su. Dup prezentarea sa vom relua detaliat fiecare dintre funciile folosite.
apl080.php
<?php header("Content-type: image/png"); /*aceasta instructiune va atasa fluxului de date creat, care la utilizator va ajunge sub forma de fisier, informatii asupra faptului ca este vorba de un fisier imagine, si anume de tip png. Aceasta informatie este esentiala pentru browser pentru a deschide fisierul ca si pe o imagine. Puteti incerca ce se intimpla daca omiteti apelul acestei functii: browser-ul va primi datele sub forma de text, deci va afisa o serie de caractere aparent fara nici un sens*/ $imagine=imagecreatetruecolor(400,250); /* aceasta instructiune creeaza o resursa de tip imagine, pe 32 de biti (truecolor) ce va putea fi identificata in continuare prin variabila $imagine. Imaginea va avea latimea de 400 de pixeli, si inaltimea de 250. */ $galben=imagecolorallocate($imagine,255,255,0); /* prin aceasta instructiune am definit culoarea galben */ imagefilledrectangle($imagine,0,0,399,249,$galben); /* iar prin aceasta instructiune am desenat un dreptunghi plin, de culoare galbena, ce se intinde peste toata imaginea: (0,0) respectiv (399,249) sunt doua colturi diaginale ale dreptunghiului. Practic am "umplut" toata imaginea cu un fundal galben */

80

$rosu=imagecolorallocate($imagine,255,0,0); /* prin aceasta cream culoarea rosie */ imagesetthickness($imagine,4); /* prin aceasta stabilim grosimea implicita a liniilor desenate la 4 pixeli */ imageline($imagine,10,10,389,239,$rosu); /* si desenam o linie de culoare rosie*/ imageellipse($imagine,200,125,200,200,$rosu); /* iar apoi desenam un cerc cu centrul in centrul imaginii, de raza 100 */ imagepng($imagine); /*si, in fine, afisam imaginea respectiva in format png, trimitind-o direct in browser*/ imagedestroy($imagine); /* dezalocam resursa, pentru a nu ocupa memorie inutila */ ?>

Iat rezultatul obinut prin ncrcarea sa n browser:

Iat cteva dintre cele mai importante funcii care lucreaz cu imagini: header(string) - are ca efect trimiterea unui header HTTP. n cazul nostru, al lucrului cu imagini, ne intereseaz s trimitem browser-ului informaii despre mime-type-ul imaginii create. Astfel, valorile pe care le putem da string-ului, n funcie de tipul imaginii pe care o crem, pot fi: Content-type: image/png pentru imaginile de tip png Content-type: image/jpeg pentru imaginile de tip jpg Content-type: image/gif pentru imaginile de tip gif Este foarte important (n caz contrar se vor genera erori) ca aceast funcie s fie apelat nainte de trimiterea oricrui alt output din cadrul script-ului n care apare; imagecreatetruecolor(lime, nlime)- creeaz o resurs de tip imagine, pe 32 de bii (truecolor) avnd limea, respectiv nlimea specificat. Rezultatul ntors de aceast funcie trebuie obligatoriu atribuit unei variabile, prin intermediul creia vom accesa n continuare imaginea. Imaginea este de fapt o matrice de pixeli. Orice punct din imagine se va putea referi prin coordonatele sale carteziene (x, y). Originea sistemului de coordonate se gsete n coul stnga-sus al imaginii (0,0) iar axa Oy este ndreptat n jos. Valorile posibile pentru x i y sunt numere ntregi, cuprinse n intervalul 0..lime-1, respectiv 0..nlime-1

81

De exemplu, iat o reprezentare schematic a imaginii definite prin: $imagine=imagecreatetruecolor(400,300); O(0,0)


y1 = 75 y0 = 150 x0 = 200 x1= 300

399

(300,75)

(200,150)

299 y Am pus n eviden n cadrul imaginii de mai sus punctele de coordonate (200,150) respectiv (300,75). imagecolorallocate(resurs_imagine, rou, verde, albastru)- creeaz o resurs de tip culoare, asociat imaginii specificat prin resursa din primul parametru. Rezultatul ntors de aceast funcie trebuie atribuit unei variabile, prin intermediul creia vom accesa n continuare culoarea definit; imagesetthickness(res_imag,
thickness) - stabilete grosimea liniilor la

thickness pixeli, atunci cnd se deseneaz linii, dreptunghiuri, poligoane;

imageline(resurs_imagine,x0,y0,x1,y1,resurs_culoare) - deseneaz un segment de dreapt, de culoarea specificat de resurs_culoare, n imaginea specificat de


resurs_imagine, ntre punctele de coordonate (x0,y0) i (x1,y1);

imagedashedline(resurs_imagine,x0,y0,x1,y1,resurs_culoare) - la fel ca imageline, doar c segmentul de dreapt desenat este punctat. Pentru ca segmentul punctat s fie vizibil, trebuie ca imagesetthickness s seteze grosimea liniei la cel puin 2 pixeli; imageellipse(resurs_imagine,x0,y0,diam_x,diam_y,resurs_culoare) - deseneaz o elips cu axe paralele cu axele de coordonate, avnd centrul n punctul de coordonate (x0,y0) i diametrul orizontal dat de diam_x respectiv cel vertical dat de diam_y;
imagerectangle(res_imag,x0,y0,x1,y1,res_culoare)

deseneaz

un

dreptunghi avnd colurile diagonal opuse n punctele de coordonate (x0,y0) respectiv (x1,y1), cu culoarea dat de resursa res_culoare;

82

imagefilledrectangle(res_imag,x0,y0,x1,y1,res_culoare) deseneaz un dreptunghi plin, cu colurile diagonal opuse n punctele de coordonate (x0,y0) respectiv (x1,y1), de culoarea dat de resursa res_culoare; imagefilledellipse(res_imag,x0,y0,diam_x,diam_y,res_culoare) - la fel ca imageellipse, doar c elipsa desenat este plin, avnd culoarea dat de
res_culoare;

imagechar(res_imag,font,x0,y0,caracter,res_culoare) afieaz n imagine caracterul caracter, ncepnd de la coordonatele (x0,y0) n dreapta i n jos, avnd culoarea dat de res_culoare. font poate fi unul dintre font-urile predefinite 1, 2, 3, 4, 5, sau orice resurs de tip font ncrcat prin imageloadfont(); imagestring(res_imag,font,x0,y0,caracter,res_culoare) afieaz n imagine string-ul string, ncepnd de la coordonatele (x0,y0) n dreapta i n jos, avnd culoarea dat de res_culoare. font poate fi unul dintre font-urile predefinite 1, 2, 3, 4, 5, sau orice resurs de tip font ncrcat prin imageloadfont(); Exemplu: apl081.php
<?php header("Content-type: image/png"); $imagine=imagecreatetruecolor(250,150); $red=imagecolorallocate($imagine,255,0,0); $green=imagecolorallocate($imagine,0,196,0); $blue=imagecolorallocate($imagine,0,0,255); $magenta=imagecolorallocate($imagine,255,0,255); $orange=imagecolorallocate($imagine,255,128,0); $yellow=imagecolorallocate($imagine,255,255,196); imagefilledrectangle($imagine,0,0,249,149,$yellow); //afisam 5 stringuri, pentru a testa cum arata fiecare dintre cele //5 font-uri predefinite ale PHP-ului: imagestring($imagine,1,10,10,'Text scris cu font-ul 1',$red); imagestring($imagine,2,10,40,'Text scris cu font-ul 2',$green); imagestring($imagine,3,10,70,'Text scris cu font-ul 3',$blue); imagestring($imagine,4,10,100,'Text scris cu font-ul 4',$magenta); imagestring($imagine,5,10,130,'Text scris cu font-ul 5',$orange); imagepng($imagine);imagedestroy($imagine); ?>

Rezultatul afiat n browser arata n felul urmtor:

imagefill(res_imag,x0,y0,res_culoare) umple prin algoritmul flood


fill, pornind din punctul dat (x0,y0), schimbnd culoarea acestuia i a tuturor punctelor

conectate (din aproape n aproape) care au aceeai culoare cu cea existent iniial la (x0,y0), n noua culoare dat de res_culoare;
83

imagefilltoborder(res_imag,x0,y0,culoare_border, res_culoare) umple prin algoritmul flood fill, pornind din punctul dat (x0,y0), schimbnd culoarea tuturor punctelor conectate (indiferent ce culoare au) n noua culoare dat de
res_culoare, pn la ntlnirea culorii specificate prin parametrul culoare_border;

imagecopy(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc,width,height) copiaz din imag_sursa, poriunea rectangular care are colul stnga sus la coordonatele (xsrc,ysrc) i lungimea, respectiv nlimea, date de (width,height)n
imag_dest, ncepnd de la coordonatele (xdest,ydest) n dreapta respectiv n jos; imagecopyresized(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc, widthdest,heightdest,widthsrc,heightsrc)

copiaz din imag_sursa, poriunea rectangular care are colul stnga-sus la coordonatele (xsrc,ysrc) i lungimea, respectiv nlimea, date de (widthsrc,heightsrc) n
imag_dest, ncepnd de la coordonatele (xdest,ydest), redimensionnd astfel nct noua lime

respectiv nlime s fie (widthdest,heightdest);


imagerotate(res_imag,unghi,culoare_fundal)

rotete

imaginea

din

res_imag cu unghiul unghi (specificat n grade !). Centrul rotaiei este centrul imaginii, iar

imaginea rotit este redimensionat la scar, astfel nct ntreaga imagine rotit s ncap: marginile nu sunt decupate. Poriunile rmase neacoperite n urma rotaiei, se vor colora cu
culoare_fundal;

imagesx(res_imag) ntoarce limea imaginii (width); imagesy(res_imag) ntoarce nlimea imaginii (height); imagecreatefromgif(nume_fiier) creeaz i ntoarce o resurs de tip imagine, n care este ncrcat imaginea de tip GIF din fiierul specificat de nume-fiier; imagecreatefrompng(nume_fiier)respectiv
imagecreatefromjpeg(nume_fiier) funcioneaz analog, pentru imagini de tip

PNG respectiv JPG; imagegif(res_imagine), imagepng(res_imagine), imagejpeg(res_imagine) produc afiarea n browser (deci trimiterea fluxului de date ctre acesta) a imaginii specificat de res_imagine. n funcie de tipul imaginii (GIF, PNG sau JPG) folosim varianta convenabil a acestei funcii; imagedestroy(res_imag) produce dezalocarea ntregii memorii asociate imaginii reprezentat de res_imag;

84

getimagesize(nume_fiier) ntoarce un array (ir) ce conine informaii despre imaginea din fiierul nume_fiier. Informaiile se gsesc structurate astfel: - la indicele 0 se gsete limea (width); - la indicele 1 se gsete nlimea (height); - la indicele 2 se gsete o constant care ne indic tipul imaginii (posibile valori pentru acest element sunt: IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, etc.); - la indicele 3 se gsete un string de forma height="yyy" width="xxx", pentru a putea fi folosit direct ntr-un tag <IMG....> - la indicele mime se gsete un string ce conine tipul MIME corespunztor imaginii;

3.11. Upload de fiiere via PHP. Prin aciunea de upload, utilizatorul poate ncrca, prin intermediul unei pagini web, un ntreg fiier (indiferent c este un fiier binar sau un fiier text) pe server-ul pe care este stocat i pagina respectiv. La nceputurile dezvoltrii internetului, s-a pus desigur aceast problem, a transferului de fiiere. Rezolvarea a fost gsit atunci prin implementarea unui protocol de transferare de fiiere ntre dou calculatoare care sunt legate ntre ele. Este vorba de FTP (File Transfer Protocol), care dei este o metod eficient de transfer, este greoi de folosit de un utilizator nespecializat (necesit specificarea adresei calculatorului la care ne conectm, un nume de utilizator i o parol, precum i un program specializat). Avantajul adus de upload-ul prin intermediul unei pagini web const n faptul c este uor de folosit de ctre orice utilizator al internetului, cel care face operaia avnd nevoie doar de cteva cunotine minimale de utilizare a calculatorului. Cea mai frecvent aciune de upload din parte unui utilizator obinuit este ntlnit la ataarea unui fiier la un e-mail. Care este principiul de funcionare ? n primul rnd, trebuie conceput un form special, n care se vor insera unul sau mai multe elemente de tip <input type=file...>. Acestea se prezint sub forma unor textbox-uri n dreapta crora este prezent un buton Browse, ca n figura de mai sus. Un click fie n interiorul textbox-ului, fie pe butonul Browse va permite alegerea unui fiier de pe disc pentru a fi ncrcat. n etapa urmtoare, dup ce utilizatorul apas, tot n acel form, butonul de postare date, fiierul ales pentru upload va fi trimis ctre server, tot prin intermediul unui script (cel specificat n
85

cadrul atributului action=... al formularului) i copiat ntr-o locaie temporar. Treaba programatorului PHP este ca el s copieze fiierul la locaia sa definitiv. Atenie ! Pentru ca upload-ul s funcioneze, att directorul temporar n care este ncrcat fiierul, ct i directorul n care vom muta acest fiier trebuie s aib drepturi de scriere pentru orice utilizator de pe Internet. n mod implicit, directorul temporar al instalrii XAMPP-ului are aceste drepturi stabilite de la instalarea ntregului pachet. Dac ele nu sunt corect setate, va trebui s le configurai manual. n tot cazul, pentru directorul n care vei muta fiierul, va trebui obligatoriu s le configurai. Voi exemplifica modul n care se face acest lucru pentru directorul tmp al instalrii XAMPP. Pentru directorul destinaie, vei proceda analog. Astfel, deschidei un Windows Explorer. V asigurai c opiunea Use simple file
sharing (Recommended) NU este bifat (pentru a ajunge la aceast opiune deschidei din

meniul Tools submeniul Folder Options i apoi accesai tab-ul View. n cadrul acestuia sunt mai multe opiuni printre care i cea de mai sus), dup care mergei pe directorul temporar al instalrii xampp (n mod implicit C:\xampp\tmp), NU intrai n director, ci dai click dreapta pe el, alegnd opiunea Properties, apoi tab-ul Security. n acest tab, alegei Add, scriei numele
network, i apoi alegei din lista ce vi se deschide utilizatorul network. Dup ce l-ai ales,

asigurai-v c are drepturi de scriere n directorul tmp (bifai, n csuele de sub el, i opiunile
Modify respectiv Write).

n cadrul script-ului PHP care se ocup de preluarea fiierului ncrcat, ne vom folosi de un masiv predefinit al limbajului, i anume $_FILES, care ne va furniza date despre fiierul ncrcat, i anume (primul parametru al lui $_FILES este dat de numele input-ului de type=file): $_FILES[nume_input][name] ne ntoarce numele i extensia fiierului pe care lam upload-at; $_FILES[nume_input][tmp_name] ne ntoarce numele complet (cu tot cu calea) fiierului temporar care s-a creat n urma upload-ului. Atenie ! acest nume poate s fie complet diferit fa de cel original. $_FILES[nume_input][type] ne ntoarce tipul mime al fiierului (un string, de exemplu: application/octet-stream sau image/gif. Valoarea sa nu poate fi garantat ca fiind corect; $_FILES[nume_input][size] ne ntoarce dimensiunea (n octei) a fiierului upload-at $_FILES[nume_input][error] ne ntoarce codul de eroare al operaiei de upload asupra fiierului dat de nume_input. Dac operaia s-a ncheiat cu succes, are valoarea 0.

86

Exemplu: Urmtoarele dou script-uri realizeaz o aplicaie prin care putem upload-a un fiier n acelai director n care se afl i sursele aplicaiei. Primul fiier reprezint un HTML obinuit, ce conine doar form-ul prin care se poate face uploadul fiierului, iar al doilea fiier reprezint script-ul PHP care preia fiierul upload-at i l mut n directorul curent:
apl082.html
<form enctype="multipart/form-data" action="apl083.php" method="post"> <!- este obligatoriu sa specificati atributul enctype="multipart/form-data", in caz contrar nu va fi permisa upload-area de fisiere. De asemenea, remarcati atributul action, care specifica numele scriptului care se va ocupa de preluarea fisierului upload-at --> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> <!- acest control de tip hidden permite stabilirea unei limite maxime a dimensiunii fisierului care urmeaza a fi uploadat. Din pacate, acest parametru poate fi usor pacalit din browser --> Alege un fisier pentru upload (sa aiba sub 30000 bytes):<br> <!- cu ajutorul acestui input type=file putem defini cimpul de tip upload din form --> <input type="file" name="fisier_incarcat"><br><br> <!-- de valoarea atributului sau name, in cazul nostru fisier_incarcat ne vom folosi pentru a-l manipula din cadrul codului PHP in care il vom prelua, in cazul nostru apl083.php--> <input type="submit" value="Incarca fisierul"> </form>

apl083.php
<?php if($_FILES['fisier_incarcat']['error']!=0) echo 'Upload nereusit, a aparut o eroare'; else { move_uploaded_file($_FILES['fisier_incarcat']['tmp_name'], $_FILES['fisier_incarcat']['name']); //cu ajutorul functiei move_uploaded_file mutam fisierul de la locatia sa temporara la //locatia sa definitiva, care n cazul nostru este directorul curent. Parametrii acestei //funcii sunt sursa respectiv destinatia echo 'Fisierul a fost incarcat<br>'; echo 'Dimensiunea sa este de ',$_FILES['fisier_incarcat']['size'],' octeti'; } ?>

3.12. Variabile cookie. Utilizarea lor a pornit din necesitatea pstrrii anumitor setri (opiuni) ale utilizatorului atunci cnd acesta intr pe un anumit site, pentru a nu mai fi nevoit sa le specifice la fiecare intrare. Mecanismul care st la baza acestei probleme se bazeaz pe memorarea, pe calculatorul vizitatorului unui anumit site, a unor informaii sub forma unor mici fiiere text. Operaia poate fi comandat de pe server i tot de pe server se poate comanda citirea, actualizarea sau tergerea acestor mici fiier, numite uzual, prin abuz de limbaj, variabile cookie. n PHP se poate lucra foarte uor cu variabilele cookie. Pentru a crea o variabil cookie se utilizeaz funcia:
setcookie(nume_variabil, valoare, dat_expirare);

Exemplu: n instruciunea de mai jos este creat o variabil cookie numit limba_pref. Variabila reine valoarea romana i expir ntr-o or:
87

setcookie(limba_pref,romana,time()+3600);

Observaii ! 1) Nu pot exista mai mult de 20 de variabile cookie. Dac se creeaz vreuna n plus, prima creat este tears automat; 2) Pentru a terge o variabil cookie se creeaz o alta cu acelai nume, dar cu data de expirare naintea celei curente (de exemplu, time()-1). Pentru a citi (recupera) valoarea unei variabile cookie, se utilizeaz coninutul unui masiv asociativ special, predefinit, al limbajului PHP, numit $HTTP_COOKIE_VARS[..]. Fiecare component a sa are ca indice numele unei variabile cookie, iar ca valoare, reine valoarea variabilei respective. Exemplu: instruciunea de mai sus afieaz valoarea variabilei cookie creat prin exemplul anterior:
echo $HTTP_COOKIE_VARS[limba_pref];//afieaz romana

Exemplu: Script-ul care urmeaz exemplific modul n care se pot reine anumite informaii pe care utilizatorul le-a tastat o dat. Apelat pentru prima dat, atunci cnd nu exist variabila
cookie numit loc, se cere tastarea localitii n care se afl cel care viziteaz pagina. Dac acel

vizitator reintr pe acel site, reapelnd script-ul, acesta va identifica variabila cookie loc, va prelua direct localitatea memorat i, n loc ca utilizatorului s i se cear din nou introducerea acesteia, i se va afia direct un mesaj:
apl084.php
<?php $loc=@$_POST['loc'];//testam mai intii daca am primit dintr-un form //postat tot din cadrul acestei pagini, o variabila numita loc, //cu valoarea careia trebuie sa cream variabila cookie if($loc!=NULL)//daca am primit setcookie("loc",$loc,time()+24*3600);//atunci setam variabila //cookie cu valoare primita, pentru o durata de 24 de ore else//pe cind, daca nu am primit, verificam daca variabila cookie este deja creata $loc=@$HTTP_COOKIE_VARS['loc']; if($loc!=NULL)//deci daca este creata {//dam utilizatorului un mesaj: echo "Localitatea curenta este: ",$loc; //si ii permitem sa schimbe aceasta localitate, daca doreste echo '<form action="apl084.php" method="post">'; echo '<p align="right">'; echo 'Schimba localitatea:'; echo '<input type="text" name="loc"><br>'; echo '<input type="submit" value="Schimba localitatea"></p></form>'; } else//in caz contrar, cream formularul care permite introducerea localitatii { echo '<form action="apl084.php" method="post">'; echo 'Introdu localitatea<br><br>'; echo '<input type="text" name="loc"><br><br>'; echo '<input type="submit" value="Salveaza"></form>'; } ?>

88

3.13. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP. 3.13.1. Introducere n MySQL. n ultimii ani, utilizarea bazelor de date pe Internet a luat o amploare deosebit. Exist o mulime de aplicaii, extrem de utile, care le utilizeaz, cum ar fi: aplicaii de contorizare, comer electronic, vot electronic, aplicaii de comunicare. De unde SQL ? n domeniul crerii i utilizrii bazelor de date relaionale s-a impus necesitatea existenei unui limbaj standard care s permit efectuarea acestor operaii. Astfel, a aprut SQL Structured Query Language. Limbajul a fost supervizat de comisia de standardizare ANSI (American National Standards Institute), motiv pentru care se mai numete i ANSI SQL. SQL nu este un limbaj de firm, ci el este implementat de o mulime de SGBD-uri consacrate, cum ar fi Microsoft Access, Oracle, Microsoft SQL Server i, bineneles, MySQL. MySQL este un limbaj specializat pentru gestiunea bazelor de date relaionale pe Internet, avnd la baz limbajul SQL. MySQL gestioneaz baze de date care se gsesc pe un server. Baza de date poate fi foarte lesne exploatat prin intermediul limbajului PHP, dar i cu alte limbaje (de exemplu Java).

3.13.2. Testarea instalrii MySQL. Configurarea bazei de date. Dup cum am anunat n capitolul 3.2., suportul MySQL a fost deja instalat, n cadrul pachetului XAMPP, deodat cu limbajul PHP. Tot suportul software al bazei de date MySQL se gsete n directorul C:\XAMPP\MYSQL. n subdirectorul BIN al acestuia se gsesc o serie de programe utilizare, care permit configurarea i operarea imediat cu serverul de baze de date. Utilitarul pe care o s-l utilizm cel mai des este
mysql.exe. Pentru a-l putea accesa din orice alt locaie a calculatorului v-ai afla, este

recomandat s adugai calea spre el (C:\XAMPP\MYSQL\BIN) n variabila PATH a sistemului. Acest lucru se face executnd un click dreapta pe My Computer, alegnd apoi tab-ul Advanced, apoi butonul Environment Variabies. Din fereastra care se deschide, derulai n partea de jos (seciunea System Variables) pn ntlnii variabila PATH. Dai dublu click pe ea (sau apsai butonul Edit de dedesubt) i, la sfritul irului de caractere deja existent acolo, adugai caracterul ; urmat de calea C:\XAMPP\MYSQL\BIN. Din acest moment, utilitarul mysql se poate rula din orice locaie (de exemplu direct din
Start + Run).

89

Vom configura n continuare serverul de baze de date. MySQL fiind un server de baze de date partajat, accesul se face pe baza unui nume de utilizator (user) i a unei parole (password). Pentru moment, este configurat doar utilizatorul root (cu drepturi depline asupra bazei de date) i NU are parola. Pentru a va conecta, lansai dintr-un Command Prompt sau din Start + Run urmtoarea comand: mysql u root p Atunci cnd suntei invitai s introducei parola (prin Enter password:) trebuie s dai Enter. n cazul n care conectarea a reuit, vei primi un mesaj de ntmpinare, iar prompt-ul se va schimba n :
mysql>... (pentru a v deconecta de la server, n dreptul acestui prompt trebuie s

scriei comanda quit dup care dai Enter). Din acest suntei conectai la baza de date. n continuare vom da cteva comenzi pentru a configura serverul, baza de date asupra creia vom lucra, i un utilizator pe care l vom folosi pentru a lucra n mod curent (deoarece este complet nerecomandat s folosim utilizatorul root pentru a lucra n mod curent la baza de date). n primul rnd, vom terge toi utilizatorii predefinii, n afar de root, iar apoi vom crea o baz de date n care vom lucra i un utilizator cu drepturi de utilizare asupra acestei baze de date. Atenie s nu uitai caracterul ; dup fiecare comand executat. De asemenea, dup fiecare comand dai un Enter:
mysql>use mysql; prin aceast comand intrm n baza de date administrativ, cu numele mysql mysql>delete from user where user!=root or host!=localhost;
prin aceast comand tergem toi utilizatorii predefinii, lsnd utilizatorul root cu drepturi de conectare de pe maina local

mysql>update user set password=password('parolanou') where user='root';


prin aceast comand schimbm parola utilizatorului root, de la parola vid (pe care o avea de la instalare) cu noua parol (evident, irul de caractere parolanou l nlocuii cu noua parol)

mysql>create database lucru;


prin aceast comand crem o baz de date cu numele lucru, n care vom lucra n continuare

mysql>grant all on lucru.* to 'utilizator'@'localhost' identified by 'parola';


prin aceast comand crem utilizatorul cu numele utilizator, cu parola parola (evident, le vei schimba dup bunul plac) ce se poate conecta de pe maina local, i are drepturi de lucru doar n baza de date lucru

mysql>flush privileges;
prin aceast comand facem ca toate modificrile efectuate pn n momentul de fa s devin efective i operative.

mysql>quit;
i ieim din monitorul mysql

Putem testa imediat instalarea, prin conectarea la serverul mysql cu noul utilizator creat (lansai aceast comand fie din Command Prompt fie din Start+Run) :
90

mysql u utilizator p

n momentul n care vi se cere parola, introducei, evident, parola definit mai sus. Dup conectarea la MySQL, pentru a stabili ca punct de lucru baza de date asociat acestui utilizator, vei da comanda:
mysql>use lucru;

dup care vei putea testa toate comenzile ce urmeaz s fie testate n paragrafele urmtoare. 3.13.3. Crearea unei baze de date. Aceast operaie nu poate fi fcut de ctre orice utilizator, ci doar de ctre root sau de anumii utilizatori cu drepturi speciale. Comanda pentru crearea unei baze de date este:
create database nume_baz_date;

n urma executrii sale este creat baza de date cu numele indicat. Din moment ce fiecare baz de date este stocat pe disc, ntr-un anumit director, n fapt se va crea un subdirector cu acelai nume cu baza de date, n subdirectorul data al folder-ului instalrii MySQL (n cazul XAMPP, acest folder este C:\XAMPP\MYSQL\DATA. Dac exist deja o baz de date cu numele specificat, se va refuza crearea uneia noi. Dac se dorete lucrul cu o anumit baz de date, se va da comanda urmtoare:
use nume_baz_date;

Pentru tergerea unei baze de date se utilizeaz comanda:


drop database nume_baz_date;

Dac dorim o list a bazelor de date existente (sau, n fine, n funcie de utilizator, a bazelor de date la care avem acces) se utilizeaz comanda:
show databases;

3.13.4. Tabele. ntr-o tabel coloanele sunt identificabile prin nume, iar rndurile, prin valorile pe care le memoreaz. Toate datele dintr-o coloan au acelai tip. O tabel are un numr specificat de coloane, ns are un numr nespecificat de rnduri. Uneori, cnd ne referim la un rnd, folosim i termenul de nregistrare, iar atunci cnd ne referim la data din rnd, situat ntr-o anumit coloan, folosim i termenul de cmp. Instruciunea prin care se poate crea o tabel este prezentat mai jos; ceea ce este trecut ntre paranteze drepte reprezint clauze, atribute sau buci de instruciune care, din punct de vedere sintactic (n funcie de fiecare caz) pot s nu apar:
91

create table nume_tabel ( nume_coloan1 tip_date [specificatori], nume_coloan2 tip_date [specificatori], ... nume_coloann tip_date [specificatori] );

Specificatorii se refer la cheia primar, valori distincte, valori implicite, autoincrementare, dac printre valorile memorate n tabel se poate gsi sau nu valoarea NULL. Toate acestea le vom trata separat, n alt paragraf.
Exemplu: pentru a crea o tabel cu 3 coloane, n care vom reine indicativul fiecrui jude

(ca pe plcuele de la maini), numele judeului (un ir de cel mult 30 de caractere) i numrul su de locuitori (un numr ntreg de cel mult 7 cifre) folosim urmtoarea comand:
create table judete (ind char(2),nume char(30),nrloc int(7));

Adugarea unui nou rnd ntr-o tabel se face prin instruciunea de mai jos, n care se introduc, pe rnd, valori pentru toate cmpurile unei linii, n ordinea n care au fost declarate coloanele la crearea tabelei:
insert into nume_tabel values(valoare1,valoare2,...,valoaren); Exemplu: pentru a insera dou linii n tabela creat n exemplul anterior: insert into judete values('CJ','Cluj',702755); insert into judete values('BV','Brasov',589028);

n practica utilizrii bazelor de date, instruciunea anterioar este considerat ca generatoare de erori, deoarece fie se poate grei ordinea de introducere a datelor, fie pe parcursul dezvoltrii se insereaz coloane noi ntre cele deja existente, iar efectul ar fi acela c tabela va conine date eronate. Din acest motiv este preferat forma urmtoare a instruciunii, dei este necesar s scriem mai mult:
insert into nume_tabel(nume_coloan1,nume_coloan2,...,nume_coloank) values(valoare1,valoare2,...,valoarek);

Se pot omite coloane (caz n care ele vor primi automat valori NULL) i bineneles c putem scrie coloanele n orice ordine dorim.
Exemplu: mai adugm dou linii la tabela anterioar: una n care nu completm numrul

de locuitori i alta n care trecem toate cele 3 valori, ns n alt ordine dect cea n care le-am creat:
insert into judete(nrloc,ind,nume) values(510110,'MM','Maramures'); insert into judete(ind,nume) values('CL','Calarasi');

Pentru a afia ntreaga tabel, utilizm comanda:


select * from nume_tabel;

92

Exemplu: pe tabela creat anterior, dac executm: select * from judete;

se va afia n urmtorul format:

+------+-----------+--------+ | ind | nume | nrloc | +------+-----------+--------+ | CJ | Cluj | 702755 | | BV | Brasov | 589028 | | CL | Calarasi | NULL | | MM | Maramures | 510110 | +------+-----------+--------+ 4 rows in set (0.02 sec)

Dac dorim s afim doar anumite coloane ale tabelei, n ordinea pe care o dorim, folosim forma de mai jos a instruciunii:
select nume_coloana1,...,nume_coloanak from tabel;

Se observ faptul c, atunci cnd afim tabela, n antetul (capul de tabel) su se trece numele coloanelor acesteia. Dac dorim ca n antet s figureze alt nume pentru o coloan, atunci, n instruciunea de mai sus, n loc de a scrie doar numele coloanei, vom scrie numele coloanei urmat de cuvntul cheie AS i de numele care dorim s fie afiat n antet. Astfel, prin cuvntul cheie AS, am definit alias-uri pentru numele coloanelor.
Exemplu: pentru tabela din exemplele anterioare, am putea scrie urmtoarea comand: select ind as indicativ, nume as "nume judet", nrloc as "numar de locuitori" from judete;
+-----------+------------+--------------------+ | indicativ | nume judet | numar de locuitori | +-----------+------------+--------------------+ | BV | Brasov | 589028 | | CJ | Cluj | 702755 | | CL | Calarasi | NULL | | MM | Maramures | 510110 | +-----------+------------+--------------------+ 4 rows in set (0.00 sec)

Rezultatul const n afiarea sub urmtorul format:

Pentru listarea numelor tuturor tabelelor din baza de date, folosim comanda urmtoare:
show tables [from nume_baz_date];

Dac nu specificm clauza [from nume_baz_date] se vor afia toate tabelele din baza de date curent (cea ctre care am dat use); Pentru a afia o descriere detaliat a unei tabele (numele coloanelor, tipurile lor) se folosete una dintre comenzile (ele fac acelai lucru):
describe nume_tabel; show columns from nume_tabel;

3.13.5. Tipuri de date n MySQL. Tipurile principale de date ale MySQL sunt: a) iruri de caractere; b) numerice; c) dat, or n continuare, vom prezenta fiecare tip de dat n parte:
93

a) iruri de caractere: char[(n)] reine un ir de caractere de lungime n (fix). n caz c n nu este precizat, reine un singur caracter. Ocup n octei; varchar[(n)] reine un ir de cel mult 255 de caractere. Ocup n+1 octei; tinytext[(n)] este echivalent cu varchar[(n)]; text[(n)] reine un ir de cel mult 65535 caractere. Ocup n+2 octei; mediumtext[(n)] reine un ir de cel mult 16.777.215 caractere. Ocup n+3 octei; longtext[(n)] reine un ir de cel mult 4.294.967.295 caractere. Ocup n+4 octei; enum un cmp care poate reine un singur ir de caractere dintr-un vector de iruri de caractere predefinit de ctre utilizator la crearea tabelei. De altfel, tabela va memora vectorul de iruri de caractere, iar n acest cmp se va reine doar indicele elementului corespunztor din vector. Vezi exemplele de dup; set la fel ca la enum, doar c un cmp de acest tip poate reine unul sau mai multe iruri de caractere din vectorul predefinit de ctre utilizator. Vezi exemplele de dup.
Exemplu (pentru tipul enum): crem o tabel n care trecem civa pictori i curentele artistice pe

care le reprezint.
create table pictori(nume text, curent enum('impresionism','postimpresionism','suprarealism','art nouveau')); insert into pictori values('Gustave Klimt','art nouveau'); insert into pictori values('Vincent Van Gogh','postimpresionism'); insert into pictori values('Alphonse Mucha','art nouveau'); insert into pictori values('Auguste Renoir','impresionism'); insert into pictori values('Rene Magritte','suprarealism'); insert into pictori values('Tiziano Vecellio','renastere');

A se remarca faptul c dup executarea ultimei comenzi apare o avertizare (warning). Acest lucru se ntmpl deoarece ultimul curent introdus, renastere nu apare printre stringurile din enum, permise pentru acest cmp. Totui, n urma execuiei sale, pictorul cu numele Tiziano Vecellio va fi trecut n tabel, ns n dreptul curentului su va fi trecut irul vid:
Exemplu (pentru tipul set): crem o tabel n care trecem numele ctorva persoane i hobby-urile
+------------------+------------------+ | nume | curent | +------------------+------------------+ | Gustave Klimt | art nouveau | | Vincent Van Gogh | postimpresionism | | Alphonse Mucha | art nouveau | | Auguste Renoir | impresionism | | Rene Magritte | suprarealism | | Tiziano Vecellio | | +------------------+------------------+

lor favorite, dintre muzic, sport i desen. Vom ncerca i de aceast dat s punem valori invalide. Efectul este asemntor celui de la enum: datele respective vor fi ignorate:
create table persoane (nume text, hobby set('muzica','desen','sport')); insert into persoane values('Ion MARIN','muzica,desen'); insert into persoane values('Ion TIRIAC','sport,desen'); insert into persoane values('Nina CHIRIAC','muzica'); insert into persoane values('Ion BETEA','sport,fumat'); +--------------+--------------+ | nume | hobby | +--------------+--------------+ | Ion MARIN | muzica,desen | | Ion TIRIAC | desen,sport | | Nina CHIRIAC | muzica | | Ion BETEA | sport | +--------------+--------------+
94

b) Tipuri de date numerice: tinyint[(n)] ocup 1 octet. Reine nr. ntregi cuprinse ntre -128..127. Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..255; smallint[(n)] ocup 2 octei. Reine nr. ntregi cuprinse ntre -32768..32767. Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..65535; mediumint[(n)] ocup 3 octei. Reine nr. ntregi cuprinse ntre -8388608..8388607. Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..16777215; int[(n)] ocup 4 octei. Reine nr. ntregi cuprinse ntre -2147843648..2147843647. Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..4294967295; bigint[(n)] ocup 8 octei. Reine nr. ntregi cuprinse ntre -9223372036854775808 i 9223372036854775809. Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..18446744073709551615; float ocup 4 octei este echivalentul tipului cu acelai nume din C/C++; double ocup 8 octei este echivalentul tipului cu acelai nume din C/C++; decimal(n,d) numrul este stocat sub form de ir de caractere. Parametrul n reprezint numrul de cifre nenule aflate naintea virgulei (cu tot cu semnul pentru numerele negative, dac este cazul) iar d reprezint numrul de zecimale. c) Tipuri pentru dat i or: year un cmp de acest tip reine un an calendaristic. Acetia se introduc ca i ir de caractere; time un cmp de acest tip reine o anumit or dintr-o zi. Se introduce sub forma unui ir de caractere, de forma hh:mm:ss; date un cmp de acest tip reine o anumit dat calendaristic. Se introduce sub forma unui ir de caractere, de forma yyyy-mm-dd; datetime un cmp de acest tip reine o anumit dat calendaristic i o anumit or. Se introduce sub forma unui ir de caractere, de forma yyyy-mm-dd hh:mm:ss; 3.13.6. Operatori utilizai n MySQL. Variabile. Voi prezenta mai nti principalii operatori din MySQL, n ordinea cresctoare a prioritii lor. Utilitatea operatorilor i funcionalitatea acestora va fi prezentat n paragrafele urmtoare: 1. ||, or, xor 2. &&, and 3. between, case when, then, else

95

4. =, >=, >, <=, <, !=, <>, is, like, in 5. | 6. & 7. <<, >> 8. +, (operatori binari) 9. *, /, div, %, mod 10. ^ 11. +, (operatori unari) 12. !, not Pentru a testa un anumit operator, putei utiliza instruciunea select. De exemplu, dac dai comanda select 5+7; se va afia un rezultat ca n imaginea alturat:
Observaie
+-----+ | 5+7 | +-----+ | 12 | +-----+

important: n MySQL exist o valoare special numit Null.

Semnificaia ei este de valoare necunoscut. Reinei faptul c, dac Null este un operand al oricrei expresii, rezultatul oricrei operaii care se efectueaz cu Null este Null. Operatorii se mpart, la rndul lor, n mai multe grupe. Acestea sunt prezentate n continuare: a) Operatori aritmetici: Acioneaz asupra tipurilor numerice i furnizeaz o valoare de tip numeric: + adunare (Ex: 2+3 are ca rezultat valoarea 5); - scdere (Ex: 2-3 are ca rezultat valoarea -1); * nmulire (Ex: 2*3 are ca rezultat valoarea 6); / mprire cu zecimale (Ex: 5/4 are ca rezultat valoarea 1.25); div mprire cu zecimale (Ex: 15 div 4 are ca rezultat valoarea 3); mod i % mprire cu zecimale (Ex: 14 mod 4 sau 14%4 are ca rezultat valoarea 3); - i + operatorii unari plus i minus (Ex: --4 are ca rezultat valoarea 4); b) Operatori de comparare (sau relaionali): Permite compararea a dou valori numerice sau a dou iruri de caractere. irurile de caractere se compar lexicografic i nu se face distincie ntre literele mari i literele mici. Rezultatul este 1 pentru adevrat i 0 pentru fals. < mai mic (Ex: 2<3 are ca rezultat valoarea 1); <= mai mic sau egal (Ex: 3<=3 are ca rezultat valoarea 1); > mai mare (Ex: 2>3 are ca rezultat valoarea 0);
96

>= mai mare sau egal (Ex: 2>=3 are ca rezultat valoarea 0); = egalitate (Ex: 2=3 are ca rezultat valoarea 0); <> sau != diferit (Ex: 2<>3 sau 2!=3 are ca rezultat valoarea 1);
Observaie: se pot compara, de altfel, cu aceti operatori, i date de tipul time, date. n fapt, o

astfel de comparare este tot una lexicografic. c) Operatori logici: Analog limbajului C/C++, n MySQL se consider dou valori logice: 0 joac rolul lui
false, iar orice valoare diferit de 0 joac rolul lui true.

|| sau or sau-ul logic (este 0 doar cnd ambii operanzi sunt 0, n rest este 1); && sau and i-ul logic (este 1 doar cnd ambii operanzi sunt nenuli, n rest este 0); not negaie (negaia lui 0 este 1, iar negaia lui 1 este 0); xor sau-ul exclusiv (este 0 cnd ambii operanzi sunt fie nuli, fie nenuli, i este 1 n rest); d) Operatori logici pe bii: Se aplic tuturor tipurilor ntregi i acioneaz asupra tuturor biilor aflai pe poziii corespondente. | sau-ul pe bii; & i-ul pe bii; ^ sau-ul exclusiv pe bii; ~ negaia pe bii; e) Operatori de deplasare pe bii: Se aplic tuturor tipurilor ntregi, deplasnd biii reprezentrii binare: << deplasare la stnga: a<<b deplaseaz cu b poziii la stnga biii lui a; >> deplasare la dreapta: a>>b deplaseaz cu b poziii la dreapta biii lui a; f) Operatori specifici pentru MySQL: is null, is not null testeaz dac o valoare este sau nu null (sunt singurii operatori care testeaz acest lucru! Atenie, compararea cu null ntoarce, conform unei observaii anterioare, TOT TIMPUL valoarea null, indiferent c se compar null-ul tot cu null sau cu alt valoare); in, not in testeaz dac o valoare aparine sau nu unei mulimi (ex:
1 in (1,2,3,4) are valaorea 1; 5 in (1,2,3,4) are valoarea 0; cici in (cici, mimi, lola) are valoarea 1);

97

like, not like testeaz dac un ir de caractere are o anumit form: dac este prefixat respectiv postfixat sau nu de un anumit subir, dac acesta conine un anumit subir. Forma sub care se utilizeaz este string like ablon respectiv string not like sablon. ablon este tot un string, n care se folosesc urmtoarele caractere speciale: % pentru un numr neprecizat de caractere necunoscute, respectiv _ pentru un singur caracter neprecizat. (ex:
cici like ci% are valoarea 1; lola like la% are valoarea 0; mimi not like me_i are valoarea 1);

between min and max testeaz dac o valoare se gsete n intervalul nchis cu capetele min, respectiv max. (Ex: 1 between 0 and 4 are valoarea 1); case .. when .. then .. else .. are dou forme sub care se poate aplica: - forma 1: case v
when v1 then val1 . . . when vn then valn else valn+1 end

Se evalueaz v, i dac se produce vreuna dintre valorile v1 .. vn se va ntoarce valk corespunztoare, iar dac nu se va ntoarce valn+1

- forma 2: case
when cond1 then val1 . . . when condn then valn else valn+1 end

Se evalueaz condiiile n ordinea scrierii. Prima care este adevrat va ntoarce valoarea valk corespunztoare. Dac nici una nu este advrat, se va ntoarce valn+1

Exemple: 1)
case cif when when when else end case when a<0 then valoare negativ when a=0 then valoare nul else valoare strict pozitiv end 1 then unu 2 then doi 3 then trei nu stiu sa numar decit pina la 3

2)

98

g) Variabile n MySQL: n MySQL variabilele se specific prin @identificator, unde identificator respect aceleai reguli sintactice ca i n alte limbaje de programare (s fie format doar din litere, cifre i '_' i s nu nceap cu o cifr). Atribuirea unei valori ctre o variabil se face cu operatorul ':=' i, la fel ca n C++, atribuirea poate juca i rolul unei expresii, care ntoarce valoarea atribuit. Exemplu:
select @c:=(@a:=4)+(@b:=5); atribuie att valoarea 4 variabilei @a, valoarea 5 select @a; select @b; select @c;

variabilei @b ct i valoarea 9 variabilei @c pentru verificare, afim apoi valorile celor trei variabile

3.13.7. Funcii predefinite n MySQL. a) Cteva funcii matematice: abs(x) modulul lui x; ceil(x) cel mai mic ntreg mai mare sau egal cu x; floor(x) cel mai mare ntreg mai mic sau egal cu x (partea ntreag matematic); exp(x) ex; log(b,x) logbx; ln(x) ln x; pi() ; pow(x,y) xy; round(x) cel mai apropiat ntreg de x (rotunjire la ntreg); sin(x), cos(x) sinusul i cosinusul unghiului x. Unghiul trebuie dat n radiani; sign(x) semnul lui x (-1 pt. nr. negativ, 0 pt. 0, 1 pt. numr pozitiv); sqrt(x) radicalul (rdcina ptrat) lui x; b) Cteva funcii care lucreaz asupra irurilor de caractere: length(x) lungimea (nr. de caractere) a irului x; concat(x1,x2,...) concateneaz irurile de caractere pe care le primete ca parametri. Atenie ! n MySQL NU exist un operator de concatenare (ca n PHP, spre exemplu); instr(x,y) Caut dac y este subir al lui x. Dac este ntoarce indicele de nceput (primul caracter avnd indicele 1) iar dac nu este, ntoarce 0; substring(x,poz,lung) ntoarce subirul de caractere din x care ncepe pe poziia
poz i are lungimea lung. Dac lung este omis, ntoarce de la poziia poz pn la sfrit;

rtrim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile din dreapta;
99

ltrim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile din stnga; trim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile att din dreapta ct i din stnga; upper(x) ntoarce irul obinut prin convertirea tuturor literelor mici la litere mari; lower(x) ntoarce irul obinut prin convertirea tuturor literelor mari la litere mici; find_in_set(x,string) ntoarce indicele apariiei irului x n irul de entiti separate prin virgule din cadrul lui string. Ex: find_in_set(mimi,cici,mimi,lola) va ntoarce valoarea 2. format(x,d) convertete valoarea real la un string cu d zecimale. Dac este cazul, la ultima zecimal din string se face rotunjire. Ex: format(5.678,2) va ntoarce stringul 5.68; strcmp(x,y) compar lexicografic irurile de caractere x i y, ntorcnd -1 dac x<y, 0 dac x=y, 1 dac x>y. Nu face distincie ntre literele mari i cele mici; c) Cteva funcii care lucreaz asupra datei i orei: now() ntoarce data i ora curent sub forma yyyy-mm-dd hh:mm:ss; day(d) ntoarce numrul zilei din data pe care o primete ca parametru; month(d) ntoarce numrul lunii din data pe care o primete ca parametru; year(d) ntoarce numrul anului din data pe care o primete ca parametru; time(d) ntoarce timpul (sub forma hh:mm:ss) extras din data+timpul pe care o primete ca parametru; hour(d) ntoarce ora din parametrul su. Acesta poate fi de tip date sau datetime; minute(d) ca mai sus, ntoarce minutul din parametrul su; second(d) ca mai sus, ntoarce secunda din parametrul su; datediff(x,y) calculeaz diferena, n zile, dintre datele x i y; date_add(x,interval nr tip) adun la data x un numr nr de zile, luni sau ani, n funcie de valoarea parametrului tip. Cuvntul interval este un cuvnt rezervat, trebuind scris ca atare. Parametrul tip poate avea una dintre valorile day, month respectiv year. Dac se dorete o scdere, fie folosim valori negative pentru x, fie folosim funcia pe care o prezentm imediat n continuare. Ex: date_add(2009-01-14,interval 18 day) va ntoarce valoarea 2009-02-01;
date_add(2009-01-14,interval -14 day) va ntoarce valoarea 2008-12-31;

date_sub(x,interval nr tip) analog, produce o scdere;

100

d) Funcii specifice MySQL: if(exp1,exp2,exp3) dac exp1 este nenul (adevrat) funcia va ntoarce exp2, n caz contrar ntorcnd exp3.
Observaie: Dac exp1 este de tip real, va fi convertit la ntreg (prin eliminarea

zecimalelor). De exemplu, dac este 0.87, se va converti la 0, deci s-ar putea ca rezultatul s nu fie cel scontat. Ex: if(a>=0,pozitiv nestrict,negativ strict) va ntoarce, dup caz, una dintre valorile de tip ir de caractere; ifnull(exp1,exp2) dac exp1 este nenul, o ntoarce chiar pe ea. Dac nu, o ntoarce pe exp2. Ex: ifnull(cici,mimi) ntoarce cici;
ifnull(null,mimi) ntoarce mimi;

3.13.8. Coloane calculate prin intermediul unei interogri. Am prezentat ceva mai nainte comanda select. Dup cum am vzut, aceast comand permite vizualizarea informaiei dintr-o anumit tabel a bazei de date. Sintaxa general a comenzii este mult mai larg dect cele prezentate n paragraful 3.13.4. Vom descoperi, pe parcurs, o serie de funcionaliti ale sale. Pentru moment, reinei faptul c operaia de consultare a datelor unei tabele dintr-o baz de date (mai precis, tot ceea ce realizeaz comanda select) se numete interogare. O regul elementar n crearea i exploatarea unei baze de date impune ca aceasta s nu conin informaie redundant, adic informaie care se poate deduce pe baza datelor deja existente. Nerespectarea ei ar conduce la baze de date care ocup mult spaiu, i n care, din aceast cauz, prelucrrile devin mai lente. Vom nva s afim date (coloane) care rezult prin calcule, pe baza celor deja existente. Acest lucru se realizeaz prin utilizarea unei expresii n cadrul comenzii select. n acest fel, interogarea va afia o nou coloan, avnd ca antet expresia respectiv i pe post de coninut valoarea expresiei, aplicat pentru fiecare dintre liniile tabelei. Dac numele din antet nu ne convine, am nvat deja s-l schimbm, cu ajutorul clauzei as, care, dup am vzut, creeaz de fapt un alias pentru acea coloan. Ex: ntr-o tabel, cu numele prod, avnd informaii despre nite produse dintr-un magazin, avem reinute, pentru fiecare produs, denumirea, costul unitar i numrul de buci din produsul respectiv. Coloanele deja existente au numele den, cost_u i cant. Pentru a afia pentru fiecare produs toate aceste date, plus costul total, vom folosi urmtoarea interogare:
select den,cost_u,cant,cost_u,cost_u*cant as cost_tot from prod;
101

Iat cum vi se va afia rezultatul acestei interogri:


+----------+--------+------+--------+----------+ | den | cost_u | cant | cost_u | cost_tot | +----------+--------+------+--------+----------+ | minge | 3.25 | 4 | 3.25 | 13.00 | | lopatica | 2.10 | 5 | 2.10 | 10.50 | | galetusa | 4.50 | 3 | 4.50 | 13.50 | +----------+--------+------+--------+----------+

3.13.9. Valoarea NULL. Dup cum am vzut n sintaxa comenzii care creeaz o tabel, dup fiecare coloan a tabelei se pot trece nite specificatori. Ne vom ocupa pentru moment de specificatorii null respectiv not null. Primul, care este i implicit (dac nu-l trecem, se asum automat c acea coloan este de tip null), se refer la faptul c n coloana respectiv pot s apar i valori de tip null. Astfel, dac ntr-o comand insert omitem o valoare pentru o anumit coloan, n acea coloan se va trece automat valoarea null. Al doilea specificator, not null, NU permite valori null n acea coloan. n acest caz, dac omitem valoarea acelei coloane, n ea se va trece automat: - 0 dac este de tip numeric; - irul vid dac acea coloan este de tip ir de caractere; - primul element din irul de stringuri, dac este de tip enum; - mulimea vid, dac acea coloan este de tip set. Exemplu: crem o tabel, n care punem dou coloane numerice, una n care permite valoarea
null, alta n care nu, si inserm n aceast tabel o linie n care specificm doar numele. create table pers1(nume text,virsta int not null,greut int); insert into pers1(nume) values(Copaceanu);

La analizarea valorilor existente prin-o interogare, constatm c s-au trecut urmtoarele date:
+-----------+--------+-------+ | nume | virsta | greut | +-----------+--------+-------+ | Copaceanu | 0 | NULL | +-----------+--------+-------+

3.13.10. Valori implicite pentru coloanele unei tabele. Un alt specificator pentru coloanele unei tabele, n cadrul comenzii de creare a tabelei este:
default valoare_implicit

Acesta permite ca, la omiterea unei valori pentru un anumit cmp, atunci cnd inserm o nou coloan la tabel, acel cmp s fie automat cu o valoare implicit. Acest specificator nu funcioneaz dect n cazul cmpurilor cu lungime fix. De exemplu, un cmp declarat char(10) poate lua o valoare civil, pe cnd unul declarat text nu poate lua o astfel de valoare.
102

Exemplu: crem o tabel studenti n care trecem numele, virsta si starea civil. Ultimelor dou cmpuri le vom da valorile implicite 19 respectiv necasatorit:
create table studenti(nume text,virsta int default 19, stare_civ char(20) default necasatorit); insert into studenti(nume) values(ANTON Costel); insert into studenti(nume,virsta) values(POP Mihai,21);

Iat coninutul tabelei n urma comenzilor de mai sus:


+--------------+--------+-------------+ | nume | virsta | stare_civ | +--------------+--------+-------------+ | ANTON Costel | 19 | necasatorit | | POP Mihai | 21 | necasatorit | +--------------+--------+-------------+

3.13.11. Cheie primar i cheie unic. Cheia primar este constituit dintr-unul sau mai multe cmpuri i trebuie s ndeplineasc toate condiiile de mai jos: - Valorile reinute de coloana care alctuiete cheia primar trebuie s fie distincte. n cazul n care cheia este alctuit din mai multe cmpuri, pentru a avea dou chei distincte este necesar ca acestea (cheile) s fie diferite pentru cel puin o coloan dintre ele. Tentativa de a aduga n tabel o nregistrare care are cheia primar identic cu alt nregistrare se soldeaz cu eroare iar adugarea, evident, nu va mai avea loc; - Cmpul (cmpurile) care alctuiete (alctuiesc) cheia primar trebuie s aib o lungime fix. De exemplu, nu putem avea o cheie primar de tip text (sau care s conin un cmp de tip
text).

Principalul rol al cheii primare este s asigure accesul foarte rapid la o anumit nregistrare, atunci cnd dm cheia. Trebuie s precizm c, nregistrrile unei tabele se rein n ordinea introducerii lor. Atunci cnd, de exemplu, un cmp este declarat cheie primar, se construiete o tabel auxiliar, invizibil pentru utilizator, n care se trec valorile cheilor, n ordine cresctoare, pentru fiecare cheie reinndu-se poziia rndului (liniei) din tabel, care are acea cheie. Practic, pornind de la o anumit cheie, n tabela invizibil se poate identifica foarte rapid numrul de ordine (poziia) al rndului cu acea cheie (se folosete cutarea binar). De aici, accesul la acel rnd (nregistrare) este imediat. Pentru a preciza faptul c o anumit coloan este cheie primar, atunci cnd definim tabela, folosim specificatorul primary key, la fel ca n exemplu de mai jos:
create table elev(nr_matricol char(10) primary key,nume text);

103

Pentru a preciza faptul c mai multe coloane particip la formarea cheii primare, atunci cnd definim tabela, folosim specificatorul primary key(coloan1,...,coloank) dup ce am terminat descrierea tuturor coloanelor, nainte de a nchide paranteza final de la comanda create
table, ca n exemplu de mai jos: create table elev(nume char(20),prenume char(20),i_tata char(4), adresa text,primary key(nume,prenume,i_tata));

Cheia unic este constituit dintr-un singur cmp. Se folosete atunci cnd, ntr-o anumit coloan, fie ea participant la cheia primar, dorim s avem doar valori distincte. La fel ca i la cheia primar, putem avea cheie unic doar pentru coloanele de lungime fix (deci nu putem avea, spre exemplu, cheie unic pentru o coloan de tip text). Dac se ncearc inserarea unei linii n tabel, cu o valoare care exist deja n cazul unei coloane de tip cheie unic, se va semnala eroare i inserarea nu va fi permis. Specificatorul de cheie unic este unique key. El se folosete ca n exemplul de mai jos:
create table test(nr_matr char(10) primary key, nume text,cnp char(13) unique key);

3.13.12. Coloane cu valori de tip autoincrementare. De multe ori, n afara datelor deja existente ntr-o tabel, este util o coloan n care s putem avea doar valori numerice distincte, de preferabil cu valori numerice cresctoare, ncepnd de la 1. Acest lucru se poate rezolva prin specificatorul auto_increment pentru o anumit coloan. Pentru a putea utiliza acest specificator, este necesar s fie ndeplinite urmtoarele condiii: - coloana s fie de un tip ntreg; - coloana s fie format doar din valori distincte. La tergerea unei linii, numerotarea nu se reia, ci se continu de la ultimul numr atribuit n tabel. Indiferent dac utilizatorul specific la un moment dat o valoare explicit (pe care o dorete), pentru acest cmp, restul numerotrii se va face ncepnd de la cea mai mare valoare pe care a atins-o vreodat acel cmp (chiar dac ntre timp, valoarea respectiv a fost tears) plus 1. Exemplu: crem o tabel n care definim o coloan de tipul auto_increment i o alt coloan n care trecem numele unor persoane:
create insert insert insert table test(id int unique key auto_increment,nume text); into test(nume) values(cici); into test(nume) values(mimi); into test(nume) values(lola);

104

Iat coninutul tabelei dup comenzile de mai sus:


+----+------+ | id | nume | +----+------+ | 1 | cici | | 2 | mimi | | 3 | lola | +----+------+

3.13.13. Sortarea datelor. Afiarea datelor ntr-o anumit ordine se face tot cu ajutorul interogrilor: ntr-o interogare ale cror date dorim s le sortm, specificm, la sfritul comenzii, clauza:
order by expresie1[desc], expresie2[desc],...

specificatorul desc este folosit n cazul n care dorim ca sortarea s fie descresctoare. Sortarea dup mai multe expresii are urmtoare semnificaie: dac pentru dou linii
expresie1 nu este suficient pentru a determina ordinea (deci pentru ambele, are aceeai valoare)

se consider mai departe expresie2. Dac nici expresie2 nu este suficient, se ia n considerare
expresie3, i aa mai departe. Exemple: select * from tabela order by nume; se afieaz toate datele din tabel, ns

sortate dup coloana nume


select * from tabela order by media desc,nume; se afieaz toate datele din

tabel, sortate descresctor dup coloana media. Dac la dou linii alte tabelei, coloana media are valori egale, ordinea va fi dat de valorile din coloana nume. Indiferent de faptul c dorim o sortare sau nu, exist posibilitatea ca o interogare select s afieze doar anumite rnduri Pentru aceasta se folosete clauza limit (n cazul n care n comanda select apare i un
order by, clauza limit se va specifica dup).

Sintaxa acesteia are una dintre urmtoarele dou forme: - limit n din ceea ce s-ar afia n mod normal, se afieaz doar primele n linii; - limit m,n din ceea ce s-ar afia n mod normal, se afieaz doar ncepnd de la a m+1-a linie (prima linie este numerotat cu 0) un numr de n linii.

105

3.13.14. Filtrarea datelor. Se face tot cu ajutorul interogrii select: prin specificarea clauzei where condiie se vor afia doar acele linii ale tabelei pentru care condiia este evaluat ca fiind adevrat. Clauza poate fi utilizat n acelai timp cu clauza precendet (order by) care realizeaz sortarea. n aceast situaie, trebuie specificat mai nti clauza where, i abia apoi clauza order by. Iat mai jos cteva exemple:
select * from tabela where nume like a%; afieaz din tabel, doar acele

linii pentru care numele ncepe cu litera a


select * from tabela where nume like a% order by media desc;

afieaz din tabel, doar acele linii pentru care numele ncepe cu litera a, n ordinea descresctoare a mediilor.
Exemple: select * from tabela order by nume limit 5; n urma sortrii dup coloana

nume, se afieaz doar primele 5 linii;


select * from tabela limit 1,3; se afieaz 3 linii din tabel ncepnd de la

linia a 2-a. 3.13.15. Actualizarea datelor. Prin actualizare a unei tabele nelegem operaia (operaiile) prin care modificm fie datele reinute de aceasta, fie modificarea structurii, fie modificarea numelui tabelei. a) pentru actualizarea datelor: pentru inserarea unei noi linii n tabel, se folosete instruciunea:
insert into nume_tabel[(nume_coloan1,...,nume_coloann)] values(expr1,...,exprn)

funcionalitatea acestei instruciuni a fost deja prezentat; pentru inserarea de noi linii n tabel, linii care provin din datele altei tabele, se poate realiza prin comanda:
insert into [distinct] nume_tabel[(nume_coloan1,...,nume_coloann)] select ...

specificatorul distinct se folosete pentru a insera doar datele distincte (care nu apar deja n tabela n care inserm) din tabela surs.

106

b) pentru modificarea datelor se utilizeaz urmtoarea instruciune:


update nume_tabel set coloan1=exp1,..,coloann=expn [where condiie]

n urma execuiei sale, pentru fiecare rnd din tabel care ndeplinete clauza where, se actualizeaz coloanele indicate de set cu expresiile corespunztoare.
Observaie (!): n absena clauzei where vor fi modificate toate rndurile tabelei.

c) pentru tergerea uneia sau a mai multor linii ale unei tabel se utilizeaz instruciunea:
delete from nume_tabel where [conditie]; Observaie (!): n absena clauzei where vor fi terse TOATE (!) liniile tabelei;

d) pentru redenumirea unei tabele:


rename table nume_vechi to nume_nou;

e) pentru tergerea unei coloane, chiar dac aceasta conine date:


alter table nume_tabel drop column nume_coloan;

f) pentru adugarea (inserarea) unei coloane noi, cu un anumit tip de date, se utilizeaz instruciunea:
alter table nume_tabel add nume_coloan_nou tip_coloan nou [after coloan_existent]sau[first]

dac nu este prezent vreuna dintre clauzele after sau first, coloana cea nou se va aduga la sfrit. Dac este prezent cel puin vreuna, atunci coloana cea nou se va insera dup coloana identificat de coloan_existent dac folosim clauza after... respectiv la nceput (nainte de toate celelalte coloane) dac folosim clauza first. 3.13.16. Funcii agregate. Toate exemplele de pn acum au avut ca operanzi doar cmpurile unui acelai rnd. n practic, este foarte adesea necesar s putem efectua calcule i cu valorile (toate sau doar o parte) reinute de o coloan. Pentru astfel de calcule se utilizeaz aa-numitele funcii agregate. n cele ce urmeaz vom prezenta aceste funcii, iar pentru exemplificare vom utiliza urmtoarea tabel (cu numele "elevi"):
+------------------+------+------+------+ | nume | mate | engl | info | +------------------+------+------+------+ | Aura Urziceanu | 8 | 10 | 7 | | Gica Petrescu | 6 | 4 | 9 | | Angela Similea | 10 | 10 | 10 | | Gabriel Cotabita | 8 | 5 | 4 | | Corina Chiriac | 7 | NULL | NULL | +------------------+------+------+------+
107

Iat o trecere n revist a funciilor agregate: count() sub forma count(*) determin numrul total de linii ale tabelei. Sub forma
count(nume_coloan) numr cte dintre valorile de pe acea coloan nu sunt null;

min(nume_coloan) determin cea mai mic valoare din coloan, ignornd valorile care sunt egale cu null; max(nume_coloan) determin cea mai mare valoare din coloan, ignornd valorile care sunt egale cu null; sum(nume_coloan) determin suma tuturor valorilor din coloan, ignornd valorile care sunt egale cu null; avg(nume_coloan) determin media aritmetic a tuturor valorilor din coloan, ignornd valorile care sunt egale cu null; Exemple: select count(*) as numar_elevi from elevi; afieaz numrul total de elevi din tabel; n cazul nostru va fi 5. select count(info) as numar_note_info from elevi; afieaz numrul total de valori nenule din coloana info; n cazul nostru va fi 4. select avg(info) as medie_note_info from elevi; afieaz media tuturor notelor nenule din coloana info; n cazul nostru va fi 7.50. select count(engl) as nota10 from elevi where engl=10; afieaz cte note de 10 sunt n coloana engl; 3.13.17. Subinterogri. Reprezint mecanismul prin care rezultatul ntors de o interogare poate fi folosi mai departe, pentru a efectua o nou interogare. Distingem urmtoarele dou cazuri: a) Interogarea subordonat ntoarce o singur valoare (deci o coloan cu un singur rnd): Interogarea care ntoarce valoarea se scrie inclus ntre paranteze rotunde din acest moment ea se comport ca i cum, n acel loc, din punct de vedere sintactic, am avea o singur valoare.
Exemplu: pe tabela anterioar, s afim toi elevii care au nota maxim la englez. n

primul rnd, va trebui s determinm printr-o subinterogare, care este nota maxim la englez, iar pe baza valorii obinute s filtrm datele din tabela cu toi elevii. Pentru o mai bun evideniere, am colorat cu verde subinterogarea care ntoarce nota maxim de la englez:
select * from elevi where engl=(select max(engl) from elevi);

108

b) Interogarea subordonat ntoarce o tabel i dorim ca n continuare, s manipulm datele din aceast tabel: n acest caz, tabela returnat de interogarea subordonat trebuie s primeasc un nume (un alias). Acesta se specific tot cu ajutorul clauzei as. Trebuie de asemenea inclus ntre paranteze rotunde. Cmpurile tabelei ntoarse de subinterogare au numele exact ca n antetul care s-ar afia pentru aceast subinterogare. Atunci cnd sunt folosite de ctre interogarea care o subordoneaz, cmpurile interogrii subordonate trebuie adresate prin numele alias-ului, urmat de caracterul . i apoi de numele cmpului din subinterogare.
Exemplu: din tabela cu elevii, dorim s afim, doar pentru elevii care au note completate

la toate cele 3 materii, o list cu numele i media celor 3 materii, n ordine descresctoare a mediilor. Dac am dori s afim o tabel ce conine numele i media general doar de la acei elevi care au trecute toate cele 3 note, am scrie interogarea urmtoare (ne reamintim c, dac ntr-o sum, cel puin un termen este null, atunci toat suma este null):
select nume,(mate+engl+info)/3 as media from elevi where mate+engl+info is not null;

Aceasta va juca rolul subinterogrii. Coloanele sale sunt nume respectiv media. Remarcai faptul c, n cadrul interogrii pe care ne propunem s-o realizm aceast tabel va primi alias-ul
medii, iar coloanele sale pot fi accesate prin expresiile medii.nume respectiv medii.media: select * from (select nume,(mate+engl+info)/3 as media from elevi where mate+engl+info is not null) as medii order by medii.media desc;

3.13.18. Gruparea datelor. Datele dintr-o tabel pot fi grupate n funcie de valorile dintr-o anumit coloan. Astfel, toate valorile egale dintr-o anumit coloan vor forma un grup. Prelucrrile datelor din cadrul unui grup se pot face cu ajutorul funciilor agregate, aceste acionnd datelor din fiecare grup. Gruparea efectiv se realizeaz cu clauza group by, aplicat de comenzii select. n cazul n care dorim filtrarea interogrii rezultate n urma unei grupri, nu se mai folosete clauza where (va genera eroare!) ci exist o nou clauz, having. Datele din tabela rezultat n urma gruprii vor fi sortate dup coloana care realizeaz gruparea. Sintaxa general a comenzii select n cazul unei grupri este:
select exp1,exp2,... from tabel group by exp_gr1,exp_gr2,.... [having condiie_filtrare];

109

Gruprile se constituie ierarhic dup exp_gr1, exp_gr2, etc. Practic, grupurile mari sunt date de valorile egale pentru exp_gr1. n cadrul acestora, se fac subgrupurile dup valorile egale ale lui exp_gr2, etc. Printre expresiile din select putem avea: - nume de cmpuri (sau expresii n funcie de acestea): n acest caz se va folosi valoarea primei linii din fiecare grup; - funcii agregate: acestea vor aciona asupra tuturor valorilor coloanei din grup asupra crora sunt aplicate; - dac n loc de exp1,exp2,... folosim * se va afia prima linie din fiecare grup.
Exemple: Considerm urmtoarea tabel, numit pers, asupra creia vom aplica mai multe

interogri de grupare:
+------+------+--------+ | nume | jud | scoala | +------+------+--------+ | dora | bv | sc2 | | bebe | cj | sc2 | | bubu | cj | sc2 | | fifi | bv | sc3 | | lala | bv | sc2 | | gogu | cj | sc1 | | fefe | bv | sc2 | | gigi | bv | sc1 | | mimi | bv | sc2 | | dede | cj | sc1 | | lola | bv | sc1 | | coco | bv | sc3 | | calu | cj | sc1 | | cici | bv | sc1 | +------+------+--------+

select jud,count(jud) as total_judet from pers group by jud;

grupeaz dup jude, afind pentru fiecare jude indicativul su, respectiv numrul total de persoane provenind din acel jude:
+------+-------------+ | jud | total_judet | +------+-------------+ | bv | 9 | | cj | 5 | +------+-------------+

select jud,scoala,count(scoala) as total_scoala from pers group by jud,scoala; grupeaz dup jude, n fiecare jude apoi dup numele colii,

afind pentru fiecare grup obinut numele judeului, numele colii i numrul de elevi din acea coal:
+------+--------+--------------+ | jud | scoala | total_scoala | +------+--------+--------------+ | bv | sc1 | 3 | | bv | sc2 | 4 | | bv | sc3 | 2 | | cj | sc1 | 3 | | cj | sc2 | 2 | +------+--------+--------------+

110

Dac din interogarea de mai sus dorim s afim doar acele coli pentru care numrul de elevi este de cel puin 3, adugm clauza having interogrii de mai sus:
select jud,scoala,count(scoala) as total_scoala from pers group by jud,scoala having total_scoala>=3;

Rezultatul afiat va fi urmtorul:


+------+--------+--------------+ | jud | scoala | total_scoala | +------+--------+--------------+ | bv | sc1 | 3 | | bv | sc2 | 4 | | cj | sc1 | 3 | +------+--------+--------------+

3.13.19. Uniuni de tabele. Un punct de maxim importan i eficien n utilizarea bazelor de date este dat de uniunea de tabele. Uniunea este alctuit din dou sau mai multe tabele ntre care exist o legtur. De cele mai multe ori, legtura este dat de valorile existente n cte o coloan a fiecrei tabel din uniune. Pentru tabelele care alctuiesc uniunea se pot realiza alias-uri de nume, sub forma nume_tabel as alias_nume, introduse n clauza from. Alias-urile pot fi utilizate n orice parte a instruciunii select. Ca i la subinterogri, adresarea unei coloane a unei tabele se va face sub forma nume_alias.nume_coloan. E recomandat s asigurm nume scurte pentru alias-urile tabelelor (a, b, pers, elev,...). Un alt avantaj al alias-urilor este c putem realiza auto-uniuni, n cadrul crora aceeai tabel poate avea alias-uri diferite. a) Uniuni de tip produs cartezian: se realizeaz printr-un select n care se trec toate cmpurile pe care dorim s le obinem, din cadrul ambelor tabele, iar la clauza from se trec ambele tabele, fiecare dintre ele putnd avea definit i un alias. Clauza where poate filtra doar acele perechi de linii (din ambele tabele) pe care le dorim. n absena clauzei where, se vor genera toate combinaiile (produs cartezian) de linii din prima tabel, cu linii din a doua tabel. Comanda poate fi generalizat i pentru mai mult de dou tabele. Sintaxa:
select exp1,exp2 ... from tabel1 [as alias1],tabel2 [as alias2] [where condiie];

Evident, exp1, exp2, ... vor trebui s conin numele coloanelor, simplu, dac nu exist confuzii (coloane care au n ambele tabele acelai nume) sau numele alias-urilor urmate de punct i de numele coloanelor n caz contrar.

111

Exemplu: fie urmtoarele dou tabele, una cu numele unor actori, fiecare actor avnd asociat un

cod, alta cu numele unor filme, fiecare film avnd trecut n dreptul su codul actorilor care joac n acel film:
mysql> select * from actori; +------+-----------------+ | cod | nume | +------+-----------------+ | 101 | Tom Hanks | | 105 | Dustin Hoffman | | 107 | Roberto Benigni | | 110 | Jessica Lange | +------+-----------------+ mysql> select * from filme; +-----------------+-----------+ | titlu | cod_actor | +-----------------+-----------+ | Tootsie | 105 | | Tootsie | 110 | | La vita e bella | 107 | +-----------------+-----------+

Prin urmtoarea interogare realizm un produs cartezian al celor dou:


select f.titlu,f.cod_actor,a.cod,a.nume from filme as f,actori as a;

(putem folosi i urmtoarele forme: 1) folosim operatorul * pentru a specifica toate coloanele din fiecare tabel:
select f.*,a.* from filme as f,actori as a;

2) sau i mai simplu, pentru c nu exist coloane care s se confunde (toate au nume diferite):
select * from filme,actori;

) Rezultatul este urmtorul (observai cum se ia fiecare film cu fiecare actor):


+-----------------+-----------+------+-----------------+ | titlu | cod_actor | cod | nume | +-----------------+-----------+------+-----------------+ | Tootsie | 105 | 101 | Tom Hanks | | Tootsie | 110 | 101 | Tom Hanks | | La vita e bella | 107 | 101 | Tom Hanks | | Tootsie | 105 | 105 | Dustin Hoffman | | Tootsie | 110 | 105 | Dustin Hoffman | | La vita e bella | 107 | 105 | Dustin Hoffman | | Tootsie | 105 | 107 | Roberto Benigni | | Tootsie | 110 | 107 | Roberto Benigni | | La vita e bella | 107 | 107 | Roberto Benigni | | Tootsie | 105 | 110 | Jessica Lange | | Tootsie | 110 | 110 | Jessica Lange | | La vita e bella | 107 | 110 | Jessica Lange | +-----------------+-----------+------+-----------------+

Dac dorim s se afieze doar datele care sunt n coresponde (acest lucru este fcut, evident, prin cmpurile numerice cod_actor, respectiv cod) folosim urmtoarea interogare:
select f.*,a.* from filme as f,actori as a where f.cod_actor=a.cod;

(sau, i mai simplu: select * from filme,actori where cod_actor=cod;) Rezultatul va fi, conform ateptrilor, n forma urmtoare:
+-----------------+-----------+------+-----------------+ | titlu | cod_actor | cod | nume | +-----------------+-----------+------+-----------------+ | Tootsie | 105 | 105 | Dustin Hoffman | | La vita e bella | 107 | 107 | Roberto Benigni | | Tootsie | 110 | 110 | Jessica Lange | +-----------------+-----------+------+-----------------+

112

b) Uniuni de tip inner join: Se aplic atunci cnd uniunea se realizeaz doar ntre dou tabele i dorim ca din ambele tabele s fie afiate doar acele linii pentru care condiia de legtur este satisfcut. Sintaxa comenzii:
select exp1,exp2,.. from tabel1 [as alias1] inner join tabel2 [as alias2] on condiie;

Ca i mai nainte, dac exist coloane care se numesc la fel n ambele tabele, vom folosi alias-uri.
Exemplu: acelai lucru ca n exemplul anterior se poate realiza cu urmtoarea interogare: select * from filme as f inner join actori as a on f.cod_actor=a.cod;

(sau, mai simplu: select * from filme join actori on cod_actor=cod;) Obs: cuvntul cheie inner poate fi omis: prin specificarea doar a clauzei join se subnelege c, de fapt, este vorba de un inner join; c) Uniuni de tip left outer join: Se aplic atunci cnd uniunea se realizeaz ntre dou tabele i dorim ca din prima tabel s fie incluse absolut toate liniile iar din a doua tabel doar acele linii care ndeplinesc condiia de la clauza on. La acele linii din prima tabel care nu au corespondent n a doua tabel, n dreptul cmpurilor acesteia din urm se va trece valoarea null. Sintaxa comenzii este:
select exp1,exp2,... from tabel1 [as alias1] left outer join tabel2 [as alias2] on condiie;

n exemplu nostru, o astfel de interogare n care prima tabel este cea cu filme iar a doua cu actori, va afia toate filmele, inclusiv cele pentru care nu am trecut actorii corespondeni n cea ce-a doua tabel. Pentru a face exemplul ct mai ilustrativ, inserm urmtoarea linie n tabela cu filme:
insert into filme(titlu) values('Forest Gump');

Dup care lansm urmtoarea interogare de tipul left outer join:


select * from filme left outer join actori on cod_actor=cod;

Obs: Cuvntul outer poate fi omis: prezena lui left implic o uniune de tip outer. Iat rezultatul:
+-----------------+-----------+------+-----------------+ | titlu | cod_actor | cod | nume | +-----------------+-----------+------+-----------------+ | Tootsie | 105 | 105 | Dustin Hoffman | | Tootsie | 110 | 110 | Jessica Lange | | La vita e bella | 107 | 107 | Roberto Benigni | | Forest Gump | NULL | NULL | NULL | +-----------------+-----------+------+-----------------+

d) Uniuni de tip right outer join: Dup cum e de ateptat, prin analogie cu situaia precedent, se aplic atunci cnd uniunea se realizeaz ntre dou tabele i dorim ca din a doua tabel s fie incluse absolut toate liniile, iar din prima doar acele linii pentru care condiia de la clauza on este ndeplinit. La acele linii din a
113

doua tabel care nu au corespondent n prima tabel, n dreptul cmpurilor acesteia din urm se va trece valoarea null. Sintaxa comenzii este:
select exp1,exp2,... from tabel1 [as alias1] right outer join tabel2 [as alias2] on condiie;

n exemplu nostru, o astfel de interogare n care prima tabel este cea cu filme iar a doua cu actori, va afia toi actorii, inclusiv cei pe care nu i-am asociat la vreun film, i doar acele filme ctre care exist legtur din tabela cu actori.
Exemplu: select * from filme right outer join actori on cod_actor=cod;

Iat rezultatul:
+-----------------+-----------+------+-----------------+ | titlu | cod_actor | cod | nume | +-----------------+-----------+------+-----------------+ | NULL | NULL | 101 | Tom Hanks | | Tootsie | 105 | 105 | Dustin Hoffman | | La vita e bella | 107 | 107 | Roberto Benigni | | Tootsie | 110 | 110 | Jessica Lange | +-----------------+-----------+------+-----------------+

Obs: Cuvntul outer poate fi omis: prezena lui right implic o uniune de tip outer. e) Auto-uniuni: Se pot face uniuni n care ambele tabele sunt, de fapt, unul i acelai, ns au alias-uri diferite i se consider unite printr-o coloan.
Exemplu: s considerm urmtoarea tabel, cu care am lucrat ntr-unul din exemplele

paragrafului anterior 3.13.5:


mysql> select * from pictori; +------------------+------------------+ | nume | curent | +------------------+------------------+ | Gustave Klimt | art nouveau | | Vincent Van Gogh | postimpresionism | | Alphonse Mucha | art nouveau | | Auguste Renoir | impresionism | | Rene Magritte | suprarealism | | Tiziano Vecellio | | +------------------+------------------+

Pentru a afia toi pictorii care aparin aceluiai curent cruia i aparine i Gustav Klimt putem proceda n felul urmtor (! atenie, exemplu este doar didactic, din punct de vedere practic NU se procedeaz n acest fel):
select b.nume from pictori as a join pictori as b on a.curent=b.curent where a.curent='art nouveau' and a.nume='Gustave Klimt';

114

3.13.20. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP. Pentru a face funcional suportul de conectivitate a limbajului PHP ctre bazele de date MySQL, este necesar utilizarea bibliotecii mysql. n cazul pachetului XAMPP, aceasta este instalat i activat n mod implicit. n cazul altor distribuii, acest lucru trebuie fcut manual. n primul rnd, din interiorul unui script PHP trebuie realizat conectarea la baza de date. Pentru acest lucru, avem nevoie de adresa IP a server-ului MySQL (n cazul nostru, deoarece utilizm o configuraie standard, server-ul se afl pe calculatorul local, deci aceast adres este localhost), numele unui utilizator i parola cu care acest utilizator se conecteaz la baza de date. n cazul nostru, vom asuma faptul c utilzatorul are numele utilizator iar parola sa este parola (aa cum l-am creat n paragraful 3.3.12). Conectarea efectiv se face cu ajutorul instruciunii:
$resurs=mysql_connect(localhost, utilizator, parola);

Variabila $resurs va fi cea prin care, n continuare, ne vom putea referi la conexiunea creat. Dac aceasta nu reuete din diferite motive (nume utilzator sau parola incorecte, server-ul MySQL nu este pornit, etc.) variabila $resurs va avea valoarea null. Selectarea unei baze de date, o dat ce conexiunea a fost creat, pentru a plasa comenzi n aceast baz de date, este:
mysql_select_db(nume_baz_date);

Aceasta ntoarce o valoare diferit de 0 dac selectarea a reuit, sau 0 n caz contrar; Plasarea unei comenzi (interogri) asupra bazei de date selectate se face prin instruciunea:
$resurs1=mysql_query(string_ce_conine_comanda_MySQL);

Dac interogarea (comanda) a funcionat corect, funcia va ntoarce o valoare diferit de 0. n caz contrar, ntoarce valoarea 0. Variabila $resurs1 este cea care va permite, n continuare, obinerea rezultatului efectiv al interogrii. n cazul oricrei erori, perechea de funcii mysql_errno(); respectiv mysql_error(); ne ntorc codul (numrul) ultimei erori generate, respectiv mesajul asociat acesteia. nchiderea conexiunii ctre baza de date MySQL se face prin comanda:
mysql_close(resurs_conexiune);

E preferabil s nchidem conexiunile deschise prin mysql_connect la sfritul script-ului. Obinerea datelor ntoarse de interogare se face prin intermediul resursei ntoarse de comanda mysql_query. Iat funciile cele mai folosite:
115

- mysql_num_rows(resursa) returneaz numrul de linii (rnduri) ale tabelei rezultate n urma interogrii; - mysql_num_fields(resursa) returneaz numrul de cmpuri (coloane) ale tabelei rezultate n urma interogrii; - mysql_field_name(resursa,k) returneaz numele cmpului (coloanei) al k-lea al tabelei. Coloanele sunt numerotate de la 0; Exemplu: urmtorul script PHP va realiza o conectare la baza de date MySQL, lansnd o interogare de afiare a tuturor datelor din tabela elevi, din exemplul 3.13.16. n urma acestei interogri va afia datele obinute cu ajutorul funciilor de mai sus:
apl085.php:
<?php $l=mysql_connect('localhost','utilizator','parola'); mysql_select_db('lucru'); $r=mysql_query('select * from elevi'); $n=mysql_num_rows($r); $m=mysql_num_fields($r); echo 'Nr. total de linii intoarse de interogare: ',$n,'<br>'; echo 'Nr. total de coloane intoarse de interogare: ',$n,'<br>'; echo 'Numele coloanelor sunt urmatoarele:<br>'; for($j=0;$j<$m;$j++) echo 'Coloana de la indicele ',$j,' are numele: <b>', mysql_field_name($r,$j),'</b><br>'; mysql_close($l); ?>

Iat rezultatul afiat de ctre script:

- mysql_fetch_array(resurs) ntoarce rndul (linia) curent, sub forma unui ir (vector) din interogarea specificat de resurs, mutnd pointerul intern pe urmtoarea linie (rnd) al interogrii. Dac liniile interogrii s-au terminat, va ntoarce fals. n irul ntors, putem folosi pe post de indici att numele coloanelor, ct i valori numerice cuprinse ntre 0 i numrul de coloane minus 1. Modelul general de aplicare al acestei instruciuni este pe o repetitiv de tip while, n care atribuim unui vector valoarea ntoars de funcia mysq_fetch_row direct n condiia de ciclare a repetitivei:
while($a=msql_fetch_row($resursa)) {...prelucrm elementele vectorului $a, care ne dau linia curent a interogrii...}

116

Iat modul n care putem obine, ntr-o form prezentabil, toate datele coninute de tabela din exemplul anterior, afind inclusiv o linie de antet cu numele coloanelor tabelei:
apl086.php:
<?php $l=mysql_connect('localhost','utilizator','parola'); mysql_select_db('lucru'); $r=mysql_query('select * from elevi'); $m=mysql_num_fields($r); echo '<table border="1" cellspacing="0" cellpadding="10">'; //pregtim afiarea ntr-un tabel echo '<tr>'; for($j=0;$j<$m;$j++)//afim numele coloanelor n celule de tipul th echo '<th align="center">',mysql_field_name($r,$j); while($a=mysql_fetch_row($r)) { echo '<tr>'; for($j=0;$j<$m;$j++) { echo '<td>'; if($a[$j]) echo $a[$j];//n locul valorilor vide afim un spaiu else echo '&nbsp;';//altfel, tabelul HTML va arta urt } } echo '</table>'; mysql_close($l); ?>

Iat rezultatul afiat de ctre script n browser:

117

4. APLICAII PRACTICE I METODOLOGICE


Reluarea, dintr-o alt perspectiv, a algoritmilor reprezentativi studiai la disciplina informatic n clasele a IX-a, a X-a i a XI-a.

n cele ce urmeaz, voi prezenta nu doar cteva exerciii i probleme rezolvate ci i cteva enunuri de probleme propuse spre rezolvare, care trateaz principalele teme studiate la disciplina informatic, din clasa a IX-a pn n clasa a XI-a. n cazul problemelor rezolvate, sunt prezentate enunul i codul surs (cu comentarii, acolo unde este cazul) al rezolvrii. Principalele nouti sunt aduse de interfa, care, prin intermediul limbajului PHP i deci, implicit, prin funcionalitatea adus de o pagin web, poate deveni mult mai atractiv, n special prin utilizarea culorilor i elementelor grafice. Astfel, o serie de aplicaii pot genera afiri mult mai sugestive ale datelor de ieire. Ultimul subcapitol aduce n discuie i abordarea interdisciplinar a ctorva noiuni de geometrie analitic plan, aplicate n realizarea de reprezentri grafice. Dintre acestea, cele mai spectaculoase constau n reprezentri grafice de fractali. 4.1. Algoritmi care nu opereaz cu iruri (cifrele unui numr, numere prime, factori primi, cmmdc, irul lui Fibonacci) 1) Problem rezolvat (apl087.html + apl088.php): Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare natural avnd cel mult 9 cifre. Scriei un program PHP care s preia valoarea respectiv din formular i s o valideze, afind apoi cifrele sale ntr-un tabel cu o singur linie, n aceeai ordine n care apar ele n numr, colornd cu fundal verde cifrele de valoare minim, cu fundal rou cifrele de valoare maxim i cu fundal galben restul cifrelor. Dac numrul are toate cifrele egale, se va colora fundalul tuturor cifrelor cu culoarea roie. Rezolvare:
apl087.html:
<html><body> <form action="apl088.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu un numar natural cu cel mult 9 cifre: <td> <input type="text" maxlength="9" size="9" name="nr"> <tr><td colspan="2" align="center"> <input type="submit" value="Trimite date"> </table> </form> </body></html>
118

apl088.php:
<html><body> <?php $nr=@$_POST['nr']; if(!$nr)//daca este egala cu NULL, atunci inseamna ca nu s-a introdus nimic echo "Ai uitat sa introduci vreo valoare"; else//functia is_numeric verifica daca valoarea dintr-un string este numerica if(!is_numeric($nr)) echo "Valoarea introdusa nu este numerica!"; else//daca este numerica, verificam sa nu fie cumva reala: if($nr!=(int)$nr) echo "Valoarea introdusa nu este intreaga!"; else//daca este intreaga, verificam sa fie pozitiva si sa aiba cel mult 9 cifre if($nr<0||$nr>999999999) echo "valoarea introdusa trebuie sa fie pozitiva si sa aiba cel mult 9 cifre"; else {//in sfirsit ne putem apuca de rezolvarea problemei: impartim numarul //in cifrele sale, determinind minimul si maximul si determinind totodata si puterea //lui 10 care corespunde numarului total de cifre ale numarului. Avem nevoie de aceasta //pentru a afisa cifrele numarului in acceasi ordine ca si in numar $p=1; $n=(int)$nr; $min=10;$max=-1; do{ $p*=10; if($n%10<$min) $min=$n%10; if($n%10>$max) $max=$n%10; $n=(int)($n/10); }while($n); echo '<table border="1" cellspacing="0" cellpadding="10"><tr>'; $n=(int)$nr; do{ $p/=10; $cif=(int)($n/$p)%10; if($cif==$max) echo '<td bgcolor="red">',$cif; else if($cif==$min) echo '<td bgcolor="lime">',$cif; else echo '<td bgcolor="yellow">',$cif; }while($p!=1); } ?> </body></html>

Iat un exemplu de rulare:

2) Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare natural avnd cel mult 9 cifre. Scriei un program PHP care s preia valoarea respectiv din formular i s o valideze, afind apoi cifrele sale ntr-un tabel cu o singur linie, n aceeai ordine n care apar ele n numr, colornd cu fundal verde cifrele pare i cu fundal rou cifrele impare. Afiai apoi, sub acest tabel, care este suma cifrelor pare, respectiv care este suma cifrelor impare.

119

3) Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare natural avnd cel mult 9 cifre. Scriei un program PHP care s preia valoarea respectiv din formular i s o valideze, afind apoi cifrele sale ntr-un tabel cu o singur linie, n aceeai ordine n care apar ele n numr, colornd cu fundal verde cifrele pare i cu fundal rou cifrele impare. Afiai apoi, sub acest tabel, numrul natural format doar cu cifrele pare, respectiv numrul natural format doar cu cifrele impare. 4) Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare natural avnd cel mult 9 cifre. Scriei un program PHP care s preia valoarea respectiv din formular i s o valideze, afind apoi cifrele sale ntr-un tabel cu o singur linie, n aceeai ordine n care apar ele n numr, colornd cu fundal verde cifrele aflate pe poziii pare respectiv cu fundal rou cifrele aflate pe poziii impare. Poziiile se consider astfel: cifra unitilor are poziia 0, cifra zecilor poziia 1, cifra sutelor poziia 2, etc. Afiai apoi sub tabel suma cifrelor aflate pe poziiile pare, respectiv suma cifrelor aflate pe poziiile impare, apoi, sub ele, modulul diferenei dintre cele dou sume. Pe baza valorii obinute afiai un mesaj corespunztor faptului c numrul introdus este sau nu divizibil cu 11 (dac valoarea obinut este divizibil cu 11, atunci tot numrul este divizibil cu 11). 5) Problem rezolvat (apl089.html + apl090.php): Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural avnd cel mult 9 cifre. Scriei un program PHP care s preia valoarea respectiv din formular i s afieze primele 10 numere prime mai mari sau egale cu numrul introdus. Numerele determinate se vor afia ntr-un tabel cu o singur coloan, alternnd culorile de fundal ale celulelor cu bleu respectiv portocaliu.
apl089.html
<html><body> <h3>Dindu-se un numar natural, sa se afiseze primele 10 valori prime mai mari sau egale cu el</h3> <form action="apl090.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu numarul natural cu maxim 9 cifre: <td><input type="text" name="n" maxlength="9" size="9"> <tr><td colspan="2" align="center"> <input type="submit" value="Rezolva"> </table></form> </body></html>

120

apl090.php
<html><body> <?php $n=$_POST['n']; $k=0; echo '<h3>Numarul primit = ',$n; echo '<br>Iata primele 10 valori prime mai mari sau egale cu el<br>'; echo '<table border="1" cellspacing="0" cellpadding="10">'; while($k<=10)//cit timp nu s-au generat inca toate cele 10 numere {//testam daca valoarea curenta, adica $n, este numar prim: $is_prime=1; for($d=2;$d<=sqrt($n);$d++) if($n%$d==0) $is_prime=0; if($n<=1) $is_prime=0; //daca este numar prim, il afisam intr-o noua linie de tabel if($is_prime) { echo '<tr><td align="center" '; //in functie de paritatea lui$k, //alternam culorile de fundal ale celulelor tabelei if($k%2==0) echo 'bgcolor="#88ffff">'; else echo 'bgcolor="#ffaa50">'; echo $n; $k++;//daca $n a fost numar prim, il numaram in contorul $k } $n++;//si trecem la verificarea urmatorului numar } ?> </table></body></html>

6) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural avnd cel mult 9 cifre. Scriei un program PHP care s preia valoarea respectiv din formular i s afieze toate valorile de cel puin dou cifre, mai mici sau egale cu numrul natural introdus, care au proprietatea c sunt n acelai timp i numere prime i palindroame. Valorile se vor afia ntr-un tabel cu o singur coloan, alternnd culorile de fundal ale celulelor cu galben, respectiv mov pal. 7) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural avnd cel mult 9 cifre. Scriei un program PHP care preia valoarea respectiv din formular i afieaz descompunerea numrului n factori primi. Afiarea se va face prezentabil, folosind tag-urile <sup> i </sup> pentru scrierea exponenilor diferii de 1 ai factorilor care apar n descompunere. De exemplu, dac se citete numrul 300, se va afia descompunerea n forma: 22 * 3 * 52. 8) Se citesc, prin intermediul a dou cmpuri de tip text ale unui formular, dou numere naturale nenule avnd cel mult 9 cifre. Scriei un program PHP care afieaz numerele introduse i totodat calculeaz i afieaz att cmmdc-ul ct i cmmmc-ul lor.

121

9) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural cu cel puin 3 cifre. S se scrie un program PHP care determin i afieaz cel mai mic numr natural, mai mare sau egal cu numrul dat, care are proprietatea c cele dou valori obinute prin eliminarea primei respectiv a ultimei sale cifre, sunt prime ntre ele. Ex: Dac se citete 1266 (care NU este un astfel de numr, deoarece 126 i 266 NU sunt prime ntre ele) se va determina i afia numrul 1269. 10) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural n cuprins ntre 3 i 40. S se scrie un program PHP care afieaz ntr-un tabel termenii irului lui Fibonacci ncepnd de la cel de indice 2 la cel de indice n, pentru fiecare termen afind totodat i raportul dintre acest termen i cel de dinainte sa, sub forma unui numr real, cu zecimale. 11) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural n avnd cel mult 9 cifre. S se scrie un program PHP care determin i afieaz cel mai mare termen al irului lui Fibonacci care are proprietatea c este mai mic sau egal cu numrul dat. 12) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural n avnd cel mult 9 cifre. S se scrie un program PHP care determin descompunerea numrului n n sum de termeni ai irului lui Fibonacci. Rezultatul se va afia prezentabil sub forma urmtoare: Exemplu: dac se citete numrul n = 2891 vom avea descompunerea: 2891 = 1 + 5 + 13 + 21 + 34 + 89 + 144 +377 + 610 + 1597 4.2. Algoritmi care opereaz cu iruri sau matrice (sortri, tergeri, inserri) 13) Problem rezolvat (apl091.html + apl092.php + apl093.php): Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural nenul n, mai mic sau egal cu 40. Pe baza lui n vei genera un alt formular, n care vei citi un ir cu n elemente numere naturale (fiecare element al irului va fi citit ntr-un textbox). Scriei un program PHP care preia valorile irului, le sorteaz cresctor i le afieaz ntr-un tabel cu o singur linie, colornd cu fundal verde deschis elementele pare, respectiv cu fundal rou deschis elementele impare.
apl091.html
<html><body><form action="apl092.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td> Introdu numarul de elemente din sir (cel mult 40) <td><input type="text" name="n"> <tr><td align="center" colspan="2"> <input type="submit" value="Citeste elementele"> </table></form></body></html>

122

apl092.php
<html><body> <?php $n=$_POST['n']; echo '<h3>Introdu cele ',$n,' valori naturale ale sirului:',"\n"; echo '<form action="apl093.php" method="post">',"\n"; echo '<table border="1" cellspacing="0" cellpadding="10">',"\n"; for($i=1;$i<=$n;$i++) echo '<tr bgcolor="yellow"><td>Elem. al ',$i,'-lea: ', '<td><input type="text" name="a[',$i,']">',"\n"; //deci pentru fiecare indice generam un text care se va //numi a[1], a[2], .... echo '<tr><td colspan="2" align="center">',"\n"; echo '<input type="submit" value="Sorteaza sirul">',"\n"; echo '<input type="hidden" name="n" value="',$n,'">',"\n"; //deci valoarea lui $n o trimitem mai departe (pentru ca avem //nevoie de ea la prelucrarea datelor shirului) prin intermediul //unui control de tipul "hidden" echo '</table></form>'; ?> </body></html>

apl093.php
<html><body> <?php $n=$_POST['n']; $a=$_POST['a'];//in felul asta obtinem //in variabila $a tot sirul trimis din cadrul form-ului //prin intermediul atributelor name=a[1], name=a[2],... //mai intii sortam elementele sirului, crescator: for($i=1;$i<=$n-1;$i++) for($j=$i+1;$j<=$n;$j++) if($a[$i]>$a[$j]) { $aux=$a[$i];$a[$i]=$a[$j];$a[$j]=$aux; } echo '<h3>Iata elementele sirului sortat:</h3>'; echo '<table border="1" cellspacing="0" cellpadding="10">'; echo '<tr>'; for($i=1;$i<=$n;$i++) if($a[$i]%2==0) echo '<td bgcolor="#80ff80">',$a[$i]; else echo '<td bgcolor="#ff8080">',$a[$i]; ?> </table></body></html>

14) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural nenul n, mai mic sau egal cu 40. Pe baza lui n vei genera un alt formular, n care vei citi un ir cu n elemente numere naturale (fiecare element al irului va fi citit ntr-un textbox). Scriei un program PHP care preia valorile irului i le afieaz ntr-un tabel cu o singur linie, colornd cu fundal rou deschis acele numere care sunt prime i cu verde deschis acele numere care sunt ptrate perfecte. Dac n irul dat nu sunt fie numere prime, fie numere ptrate perfecte, fie de ambele categorii, s se afieze un mesaj corespunztor. 15) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural nenul n, mai mic sau egal cu 40. Pe baza lui n vei genera un alt formular, n care vei citi un ir cu n elemente numere naturale (fiecare element al irului va fi citit ntr-un textbox). Scriei un program

123

PHP care preia valorile irului i le afieaz ntr-un tabel cu o singur linie, colornd cu fundal rou prima valoare din irul introdus, care are proprietatea c este palindrom. S se tearg apoi aceast valoare din ir, reafind, tot sub forma unui tabel cu o singur linie, valorile rmase. Dac printre valorile introduse nu se afl nici un palindrom, se va afia un mesaj corespunztor. 16) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural nenul n, mai mic sau egal cu 40. Pe baza lui n vei genera un alt formular, n care vei citi un ir cu n elemente numere naturale (fiecare element al irului va fi citit ntr-un textbox). Scriei un program PHP care preia valorile irului i le afieaz ntr-un tabel cu o singur linie, colornd cu fundal galben prima pereche de elemente vecine (consecutive ca poziie) care au proprietatea c NU sunt prime ntre ele. S se insereze apoi, ntre cele dou valori, cmmdc-ul lor. Se va reafia, tot sub forma unui tabel, irul obinut, n care colorm tot cu galben elementele perechii, respectiv cu bleu cmmdc-ul inserat. Dac printre valorile introduse nu se afl nici o pereche de elemente vecine cu proprietatea cerut, se va afia un mesaj corespunztor. 17) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural nenul n, mai mic sau egal cu 40. Pe baza lui n vei genera un alt formular, n care vei citi un ir cu n elemente numere naturale (fiecare element al irului va fi citit ntr-un textbox). Scriei un program PHP care preia valorile irului i le afieaz ntr-un tabel cu o singur linie, colornd cu fundal rou deschis toate numerele care sunt prime. S se tearg apoi din ir toate aceste numere. Se va reafia, tot sub forma unui tabel, irul obinut. Dac printre valorile introduse nu se afl nici un numr prim, se va afia un mesaj corespunztor. 18) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural nenul n, mai mic sau egal cu 40. Pe baza lui n vei genera un alt formular, n care vei citi un ir cu n elemente numere naturale (fiecare element al irului va fi citit ntr-un textbox). Scriei un program PHP care preia valorile irului i le afieaz ntr-un tabel cu o singur linie. S se insereze apoi ntre oricare pereche de vecini consecutivi (ca poziie) ai irului, care au proprietatea c au aceeai paritate, media lor aritmetic. Se va reafia, tot sub forma unui tabel, irul obinut, colornd cu fundal verde deschis elementele care au fost inserate. Dac printre valorile introduse nu se afl nici o pereche de vecini care s aib aceeai paritate, se va afia un mesaj corespunztor. 19) Problem rezolvat (apl094.html + apl095.php + apl096.php): Se citesc, prin intermediul a dou cmpuri de tip text ale unui formular, dou numere naturale nenule, n i m, mai mici sau egale cu 30. Pe baza lor vei genera un alt formular, n care vei citi elementele unei
124

matrice cu n linii i m coloane, numere ntregi. Scriei un program PHP care preia valorile matricei, determin minimul (dac sunt mai multe, primul dintre ele, n sensul n care se parcurge matricea pe linii, de la stnga la dreapta) i afieaz matricea, colornd acest element cu verde, restul elementelor de pe linia sa cu galben, iar restul elementelor de pe coloana sa cu bleu.
apl094.html
<html><body> <form action="apl095.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td> Introdu numarul de linii ale matricei (cel mult 30) <td><input type="text" name="n"> <tr><td> Introdu numarul de coloane ale matricei (cel mult 30) <td><input type="text" name="m"> <tr> <td align="center" colspan="2"> <input type="submit" value="Citeste elementele"> </table></form></body></html>

apl095.php
<html><body> <?php $n=$_POST['n']; $m=$_POST['m']; echo '<h3>Introdu elementele matricei:',"\n"; echo '<form action="apl096.php" method="post">',"\n"; echo '<table border="1" cellspacing="0" cellpadding="10">',"\n"; for($i=1;$i<=$n;$i++) { echo '<tr bgcolor="yellow">'; for($j=1;$j<=$m;$j++) echo '<td><input type="text" size="4" name="a[',$i,'][',$j,']">',"\n"; //deci generam campurile text care se vor //numi a[1][1], a[1][2], .... } echo '</table><br>'; echo '<input type="submit" value="Proceseaza datele">',"\n"; echo '<input type="hidden" name="n" value="',$n,'">',"\n"; echo '<input type="hidden" name="m" value="',$m,'">',"\n"; //deci valoarile lui $n si $m le trimitem mai departe //(pentru ca avem nevoie de ele la prelucrarea datelor //matricei) prin intermediul unor controale de tipul "hidden" echo '</table></form>'; ?> </body></html>

125

apl096.php
<html><body> <?php $n=$_POST['n']; $m=$_POST['m']; $a=$_POST['a'];//in felul asta obtinem //in variabila $a toata matricea trimisa din cadrul form-ului //prin intermediul atributelor name=a[1][1], name=a[1][2],... //determinam mai intii minimul, cu tot cu indicii sai: $min=$a[1][1];$imin=1;$jmin=1; for($i=1;$i<=$n;$i++) for($j=1;$j<=$m;$j++) if($a[$i][$j]<$min) { $min=$a[$i][$j]; $imin=$i;$jmin=$j; } echo 'Minimul este ',$min,' pe linia ',$imin,' si coloana ',$jmin,'<br>'; echo '<table border="1" cellspacing="0" cellpadding="10">'; for($i=1;$i<=$n;$i++) { echo '<tr>'; for($j=1;$j<=$m;$j++) { if($i==$imin&&$j==$jmin) echo '<td bgcolor="#00ff00" align="center">'; else if($i==$imin) echo '<td bgcolor="#ffff00" align="center">'; else if($j==$jmin) echo '<td bgcolor="#80ffff" align="center">'; else echo '<td align="center">'; echo $a[$i][$j]; } } ?> </table> </body></html>

20) Se citesc, prin intermediul a dou cmpuri de tip text ale unui formular, dou numere naturale nenule, n i m, mai mici sau egale cu 30. Pe baza lor vei genera un alt formular, n care vei citi elementele unei matrice cu n linii i m coloane, numere ntregi. Scriei un program PHP care preia valorile matricei i sorteaz cresctor elementele primei linii ale sale prin inteschimbri de coloane. Se vor afia att matricea iniial, ct i matricea final, ambele n cte un tabel, colornd cu fundal galben elementele primei linii. 21) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural nenul, n mai mic sau egal cu 30. Pe baza lui vei genera un alt formular, n care vei citi elementele unei matrice ptratice cu n linii i coloane, numere ntregi. Scriei un program PHP care preia valorile matricei, afind-o ntr-un tabel n care:
126

- elementele de pe diagonala principal sunt colorate cu fundal galben; - elementele de pe diagonala secundar sunt colorate cu fundal bleu; - n cazul n care diagonalele se intersecteaz, elementul de la intersecia lor va fi colorat cu fundal verde. 22) Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural nenul, n mai mic sau egal cu 30. Pe baza lui vei genera un alt formular, n care vei citi elementele unei matrice ptratice cu n linii i coloane, numere ntregi. Scriei un program PHP care preia valorile matricei, afind-o ntr-un tabel n care coloreaz cu fundal galben elementele ptratului concentric care conine elementul minim al matricei. n cazul n care n matrice sunt mai multe minime, se va lua n considerare primul pe care l ntlnim, n sensul n care parcurgem matricea pe linii, fiecare linie fiind parcurs de la stnga la dreapta. 23) Se citesc, prin intermediul a dou cmpuri de tip text ale unui formular, dou numere naturale nenule, n i m, mai mici sau egale cu 30. Pe baza lor vei genera un alt formular, n care vei citi elementele unei matrice cu n linii i m coloane, numere ntregi. Scriei un program PHP care preia valorile matricei i determin cele dou linii care conin minimul respectiv maximul din matrice. n cazul n care sunt mai multe minime, se consider prima apariie, iar n cazul n care sunt mai mult maxime, se consider ultima apariie (parcurgnd matricea pe linii, i n cadrul fiecrei linii de la stnga la dreapta). Se vor interschimba cele dou linii. Programul va afia ntr-un tabel elementele matricei nainte i dup interschimbare, colornd cu fundal bleu linia care conine minimul, respectiv cu fundal portocaliu linia care conine maximul. Dac att minimul ct i maximul determinate dup procedeul de mai sus se afl pe aceeai linie, se va da un mesaj corespunztor i se va afia doar o singur dat matricea. 4.3. Prelucrarea irurilor de caractere 24) Problem rezolvat (apl097.html + apl098.php): Se citete, prin intermediul unui cmp de tip text al unui formular, o fraz ale crei cuvinte pot fi separate prin spaii, virgule, puncte. S se scrie un program PHP care s afieze toate cuvintele care apar n string, n ordine alfabetic, convertite la litere mici, ntr-un tabel cu o singur coloan.
apl097.html
<html><body> <form action="apl098.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu o fraza <tr><td><input type="text" name="s" size="50"> <tr><td align="center"> <input type="submit" value="Proceseaza fraza"> </table> </form></body></html>
127

apl098.php
<html><body> <?php $s=$_POST['s']; $n=0; //separam cuvintele din string cu strtok si le punem //in sirul a: for($p=strtok($s,",. ");$p!==false;$p=strtok(",. ")) $a[++$n]=strtolower($p); //le sortam alfabetic for($i=1;$i<=$n-1;$i++) for($j=$i+1;$j<=$n;$j++) if($a[$i]>$a[$j]) {$aux=$a[$i];$a[$i]=$a[$j];$a[$j]=$aux;} echo '<h3>Iata cuvintele in ordine alfabetica:</h3>'; echo '<table border="1" cellpadding="10" cellspacing="0">'; for($i=1;$i<=$n;$i++) echo '<tr><td>',$a[$i]; ?> </table></body></html>

25) Se citete, prin intermediul unui cmp text al unui formular, un ir de caractere ce conine mai multe cuvinte, separate prin virgule, spaii, puncte. S se scrie un program PHP care preia string-ul din acest formular i formeaz i afieaz un ir ce conine doar cuvintele distincte din irul dat. irul cu cuvintele distincte se va afia ntr-un tabel cu o singur coloan. 26) Se citete, prin intermediul unui cmp text al unui formular, un ir de caractere ce conine mai multe cuvinte, separate prin virgule, spaii, puncte. S se scrie un program PHP care preia string-ul din acest formular i afieaz toate cuvintele sale ntr-un tabel cu o singur coloan, colornd cu fundal rou doar acele cuvinte care sunt palindromice. Daca nici un cuvnt nu este palindromic, se va afia un mesaj corespunztor. 27) Se citete, prin intermediul unui cmp de tip text al unui formular, o dat calendaristic de forma zz/ll/aaaa (z i l pot avea fie un caracter, iar anul este pozitiv). S se scrie un program PHP care determin cte zile au trecut de la nceputul acelui an pn la data respectiv. 28) Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare pozitiv nenul mai mic dect 40. S se genereze mai nti, printr-un script PHP, un formular cu n cmpuri de tip text, n care se permite citirea a n iruri de caractere. S se afieze apoi, prin intermediul altui program PHP, toate aceste iruri de caractere ntr-un tabel cu o singur coloan, colornd cu fundal rou irul cel mai lung. Dac sunt dou sau mai multe iruri de lungime maxim, se vor colora fundalul tuturor cu rou.

128

29) Se citesc, prin intermediul a dou cmpuri de tip text ale unui formular, dou cuvinte. Scriei un program PHP care afieaz cele dou cuvinte introduse i verific dac sunt angrame, adic sunt formate din exact aceleai litere, fiecare liter trebuie s apar n fiecare cuvnt de exact acelai numr de ori, iar ordinea n care apar poate, evident, s fie diferit. 30) Se citete, prin intermediul unui cmp de tip text al unui formular, o fraz format din cuvinte separate prin puncte, virgule, spaii. Determinai care este litera care apare de cele mai multe ori, precum i numrul su de apariii. Dac o mai multe litere apar de acelai numr maxim de ori, se vor afia toate aceste litere. Literele determinate le vei afia ntr-un tabel cu o singur coloan. 4.4. Probleme de Backtracking, Divide et Impera, Aplicaii ale geometriei analitice plane studiate n cadrul disciplinei matematic, Reprezentri de fractali 31) Problem rezolvat (apl099.html + apl100.php): Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare pozitiv nenul n mai mic sau egal cu 7. S se scrie un program PHP care genereaz toate permutrile de n, afindu-le ntr-un tabel. Fiecare linie a tabelului va conine elementele unei permutri.
apl099.html
<html> <body> <form action="apl100.php" method="post"> <table border="1" cellpadding="10" cellspacing="0"> <tr> <td>Introdu ordinul permutarilor: <td> <input type="text" name="n"> <tr> <td align="center" colspan="2"> <input type="submit" value="Genereaza permutarile"> </table> </form> </body> </html>

apl100.php
<html><body> <?php $n=$_POST['n']; function afis() {//in functia de afisare, variabilele //$x (sirul de generare si $n = //ordinul permutarilor, le luam globale global $n,$x; echo '<tr>'; //afisam deci elementele permutarii //curente intr-o linie noua a tabelului for($i=1;$i<=$n;$i++) echo '<td align="center">',$x[$i]; }

129

function valid($k) {//in functia de valid de asemenea $n si $x sunt globale global $n,$x; //verificam daca elementul curent este diferit de fiecare //dintre cele de dinaintea sa for($i=1;$i<=$k-1;$i++) if($x[$i]==$x[$k]) return 0; return 1; } function permutari($k) { //de asemenea $n si $x sunt variabile globale global $n,$x; //implementam sub forma recursiva functia de tip backtracking //ce ne generaza permutarile for($x[$k]=1;$x[$k]<=$n;$x[$k]++) if(valid($k)) if($k==$n) afis(); else permutari($k+1); } //afisam definitia tabelului "in programul principal" echo '<table border="1" cellpadding="10" cellspacing="0">'; //dupa care, prin apelul recursiv, dam drumul la generarea permutarilor permutari(1); //iar la sfirsit inchidem tag-ul tabelului echo '</table>'; ?> </body></html>

32) Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare pozitiv nenul n mai mic sau egal cu 10. S se scrie un program PHP care genereaz toate permutrile de n care au proprietatea c pe oricare dou poziii vecine (adic la indici consecutivi) se afl doar valori de pariti diferite, afindu-le ntr-un tabel. Fiecare linie a tabelului va conine elementele unei permutri. 33) Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare pozitiv nenul n mai mic sau egal cu 10. S se scrie un program PHP care genereaz toate permutrile de n care au proprietatea c diferena n modul a oricare elemente de pe poziii vecine (adic la indici consecutivi) este cel mult 2, afindu-le ntr-un tabel. Fiecare linie a tabelului va conine elementele unei permutri. 34) Se citesc, prin intermediul a dou cmpuri de tip text ale unui formular, dou valori pozitive nenule n i m, astfel nct m n. S se scrie un program PHP care genereaz toate combinrile de elemente ale mulimii {1, 2, .., n} luate cte m. Combinrile generate se vor afia ntr-un tabel. Fiecare linie a tabelului va conine elementele unei combinri.

130

35) Problem rezolvat (apl101.html + apl102.php): Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare pozitiv nenul n mai mic sau egal cu 8 i mai mare sau egal cu 4. S se scrie un program PHP care genereaz toate posibilitile de a aranja n regine pe-o tabl de ah n x n astfel nct s nu se atace ntre ele. Fiecare soluie se va afia sub forma unui tabel cu n linii i n coloane, n care celulele sunt colorate alternativ, ca n cazul tablei de ah iar reginele sunt reprezentate printr-o imagine reprezentativ. Soluiile se vor numerota. n implementare vom folosi urmtoarea imagine, queen.gif:
apl101.html
<html><body> <form action="apl102.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu dimensiunea tablei de sah: <td><input type="text" name="n"> <tr><td colspan="2" align="center"> <input type="submit" value="Aseaza reginele"> </table> </form></body></html>

apl102.php
<html><body> <?php $n=$_POST['n']; function afish() { global $x,$n,$nrsol; //sirul de generare, $n si variabila in care numaram //solutiile sunt globale echo '<h3>Solutia numarul ',++$nrsol; echo '<table border="1" cellspacing="0" cellpadding="3">'; //afisam un tabel cu $n linii si coloane for($i=1;$i<=$n;$i++) { echo '<tr>'; for($j=1;$j<=$n;$j++) { //in functie de paritatea lui $i+$j stabilim culoarea //alternam culorile de fundal ale patratelelor, ca pe //tabla de sah if(($i+$j)%2==0) echo '<td bgcolor="#ffffaa">'; else echo '<td bgcolor="$aaffaa">'; //iar daca la celula curenta se afla o regina //atunci reprezentam acea regina prin imaginea queen.gif if($x[$i]==$j) echo '<img src="queen.gif">'; //iar in caz ca e goala,punem un spatziu in acea celula else echo '&nbsp;'; } } echo '</table>'; } function valid($k) { global $x; //in functia de valid verificam faptul ca dama //de la indicele $k sa nu se atace cu vreuna de dinainte for($i=1;$i<=$k-1;$i++) if($x[$i]==$x[$k]||abs($x[$k]-$x[$i])==$k-$i) return 0; return 1; }

131

function dame($k) { global $x,$n; //functia dame implementeaza backtracking-ul recursiv for($x[$k]=1;$x[$k]<=$n;$x[$k]++) if(valid($k)) if($k==$n) afish(); else dame($k+1); } $nrsol=0; dame(1); ?> </body></html>

36) Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare pozitiv nenul n mai mic sau egal cu 8 i mai mare sau egal cu 4. S se scrie un program PHP care genereaz doar 10 posibiliti ce a aeza n ture pe-o tabl de ah n x n astfel nct s nu se atace ntre ele. Fiecare soluie se va afia sub forma unui tabel cu n linii i n coloane, n care celulele sunt colorate alternativ, ca n cazul tablei de ah iar turele sunt reprezentate printr-o imagine reprezentativ. Soluiile se vor numerota. 37) Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare pozitiv nenul n mai mic sau egal cu 8 i mai mare sau egal cu 4. S se scrie un program PHP care genereaz doar 10 posibiliti ce a aeza n regi pe-o tabl de ah n x n astfel nct pe fiecare linie de pe tabl s se gseasc exact un rege, iar regii s nu se atace ntre ei. Fiecare soluie se va afia sub forma unui tabel cu n linii i n coloane, n care celulele sunt colorate alternativ, ca n cazul tablei de ah iar turele sunt reprezentate printr-o imagine reprezentativ. Soluiile se vor numerota. 38) Problem rezolvat (apl103.html + apl104.php + apl105.php): Se citete, prin intermediul unui cmp de tip text al unui formular, o valoare pozitiv nenul n, cel mult egal cu 40. Prin intermediul altui formular cu n cmpuri de tip text se citesc elementele ntregi ale unui ir. Scriei un program PHP care afieaz mai nti elementele citite, le sorteaz cresctor prin interclasare (deci folosind metoda divide et impera) i le afieaz i dup sortare. Elementele se vor afia ntr-un tabel cu o singur linie.

132

apl103.html
<html><body> <form action="apl104.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td> Introdu numarul de elemente din sir (cel mult 40) <td><input type="text" name="n"> <tr> <td align="center" colspan="2"> <input type="submit" value="Citeste elementele"> </table></form></body></html>

apl104.php
<html><body> <?php $n=$_POST['n']; echo '<h3>Introdu cele ',$n, ' valori naturale ale sirului:',"\n"; echo '<form action="apl105.php" method="post">',"\n"; echo '<table border="1" cellspacing="0" cellpadding="10">',"\n"; for($i=1;$i<=$n;$i++) echo '<tr bgcolor="yellow"><td>Elem. al ',$i,'-lea: ', '<td><input type="text" name="a[',$i,']">',"\n"; echo '<tr><td colspan="2" align="center">',"\n"; echo '<input type="submit" value="Sorteaza sirul prin interclasare">',"\n"; echo '<input type="hidden" name="n" value="',$n,'">',"\n"; echo '</table></form>'; ?> </body></html>

apl105.php
<html><body> <?php $n=$_POST['n']; $a=$_POST['a']; function afis($a,$n) { echo '<table border="1" cellspacing="0" cellpadding="10">'; echo '<tr bgcolor="yellow">'; for($i=1;$i<=$n;$i++) echo '<td align="center">',$a[$i]; echo '</table>'; } echo '<h3>Iata sirul initial:</h3>'; afis($a,$n); //mai jos este functia care interclaseaza din sirul //$a, bucatile dintre indicii $l..$m respectiv $m+1..$r //punind rezultatul la loc in sirul $a, incepind de la //indicele $l function intercl(&$a,$l,$m,$r) { $k=$l;$i=$l;$j=$m+1; while($i<=$m&&$j<=$r) if($a[$i]<$a[$j]) $c[$k++]=$a[$i++]; else $c[$k++]=$a[$j++]; while($i<=$m) $c[$k++]=$a[$i++]; while($j<=$r) $c[$k++]=$a[$j++]; for($i=$l;$i<=$r;$i++) $a[$i]=$c[$i]; }

133

//si in fine, mai jos este functia care // realizeaza sortarea prin //interclasare: function merge_sort(&$a,$l,$r) { if($l<$r) { //se calculeaza $m=indicele mijlocului dintre $l si $r $m=(int)(($l+$r)/2); //se sorteaza recursiv partea dintre $l si $m merge_sort($a,$l,$m); //apoi partea dintre $m+1 si $r merge_sort($a,$m+1,$r); //si, in fine, cele doua se interclaseaza: intercl($a,$l,$m,$r); } } merge_sort($a,1,$n); echo '<h3>Iata sirul final, obtinut dupa sortarea sa prin interclasare:</h3>'; afis($a,$n); ?>

39) Problem rezolvat (apl106.html + apl107.php): Se citesc, prin intermediul unor cmpuri de tip text ale unui formular, coordonatele a trei puncte ce reprezint vrfurile unui triunghi. Abscisele sunt cuprinse ntre 0 i 639 iar ordonatele ntre 0 i 479. S se creeze o imagine de tip PNG n care reprezentai triunghiul i cele trei nlimi ale sale. Suportul matematic necesar rezolvrii: Fie cele trei vrfuri ale triunghiului A(xa, ya), B(xb, yb), C(xc, yc). Pentru a scrie ecuaia nlimii care trece prin vrful A, vom considera ecuaia dreptei care trece printr-un punct dat i are panta cunoscut: (y yA) = m(x xA) nlimea, fiind perpendicular pe segmentul BC, are panta egal cu -1/m', unde m' = panta dreptei BC. Aadar: m' =

yC y B x xB de unde rezult c m = C i deci ecuaia nlimii care trece prin xC xB yC y B


xC xB (x x A ) . Dup efectuarea calculelor, obinem: yC y B

vrful A este ( y y A ) =

y ( yC y B ) + x( xC xB ) = y A ( yC y B ) + x A ( xC xB ) .

Pentru a determina apoi piciorul unei nlimi, este suficient s rezolvm sistemul format din ecuaia nlimii i ecuaia dreptei suport al laturii corespunztoare. Pentru a scrie ecuaia unei laturi a triunghiului (fie, n cazul nostru, latura BC) cel mai la ndemn este s ne folosim de formula:
x xB xC y 1 yB 1 = 0 . yC 1

134

apl106.html
<html><body> <form action="apl107.php" method="post"> <h3>Introdu coordonatele a 3 virfuri ale triunghiului</h3> <table border="1" cellspacing="0" cellpadding="10"> <tr> <th align="center" rowspan="2" bgcolor="lightblue"> VARFUL<br>A <td>x<sub>A</sub>= <td><input type="text" name="xa" size="4"> <tr> <td>y<sub>A</sub>= <td><input type="text" name="ya" size="4"> <tr> <th align="center" rowspan="2" bgcolor="yellow"> VARFUL<br>B <td>x<sub>B</sub>= <td><input type="text" name="xb" size="4"> <tr> <td>y<sub>B</sub>= <td><input type="text" name="yb" size="4"><tr> <th align="center" rowspan="2" bgcolor="lime"> VARFUL<br>C <td>x<sub>C</sub>= <td><input type="text" name="xc" size="4"> <tr> <td>y<sub>C</sub>= <td><input type="text" name="yc" size="4"> <tr><td colspan="3" align="center"> <input type="submit" value="Deseneaza triunghiul"> </table> </form> </body></html>

apl107.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $xa=$_POST['xa'];$ya=$_POST['ya']; $xb=$_POST['xb'];$yb=$_POST['yb']; $xc=$_POST['xc'];$yc=$_POST['yc']; imagesetthickness($im,2); $b=imagecolorallocate($im,0,0,255); imageline($im,$xa,$ya,$xb,$yb,$b); imageline($im,$xa,$ya,$xc,$yc,$b); imageline($im,$xc,$yc,$xb,$yb,$b); $r=imagecolorallocate($im,255,0,0); //determinam $a1,$b1,$c1 coeficientii //ecuatiei inaltimii corespunzatoare vf.A $a1=$xc-$xb;$b1=$yc-$yb; $c1=$xa*($xc-$xb)+$ya*($yc-$yb); //determinam $a2, $b2, $c2 coeficientii //dreptei suport a segmentului bc: $a2=$yb-$yc; $b2=-$xb+$xc; $c2=$yb*$xc-$xb*$yc; //aflam solutia sistemului format de cele doua: $xha=($c1*$b2-$c2*$b1)/($a1*$b2-$a2*$b1); $yha=($c1*$a2-$c2*$a1)/($b1*$a2-$a1*$b2); //procedam analog si cu celelalte inaltimi: //cea care pleaca din c: $a3=$xb-$xa;$b3=$yb-$ya; $c3=$xc*($xb-$xa)+$yc*($yb-$ya); $a4=$ya-$yb; $b4=-$xa+$xb; $c4=$ya*$xb-$xa*$yb; $xhc=($c3*$b4-$c4*$b3)/($a3*$b4-$a4*$b3); $yhc=($c3*$a4-$c4*$a3)/($b3*$a4-$a3*$b4);

135

//si in fine cu cea care pleaca din b: $a5=$xc-$xa;$b5=$yc-$ya; $c5=$xb*($xc-$xa)+$yb*($yc-$ya); $a6=$ya-$yc; $b6=-$xa+$xc; $c6=$ya*$xc-$xa*$yc; $xhb=($c5*$b6-$c6*$b5)/($a5*$b6-$a6*$b5); $yhb=($c5*$a6-$c6*$a5)/($b5*$a6-$a5*$b6); //desenam inaltimile imageline($im,$xa,$ya,$xha,$yha,$b); imageline($im,$xc,$yc,$xhc,$yhc,$b); imageline($im,$xb,$yb,$xhb,$yhb,$b); //si in fine, punem literele //virfurilor triunghiului imagestring($im,5,$xa,$ya,'A',$r); imagestring($im,5,$xb,$yb,'B',$r); imagestring($im,5,$xc,$yc,'C',$r); imagepng($im); imagedestroy($im); ?>

40) Problem rezolvat (apl108.html + apl109.php): Se citesc, prin intermediul unor cmpuri de tip text ale unui formular, coordonatele a trei puncte ce reprezint vrfurile unui triunghi. Abscisele sunt cuprinse ntre 0 i 639 iar ordonatele ntre 0 i 479. S se creeze o imagine de tip PNG n care reprezentai triunghiul, cele trei bisectoare ale sale i cercul nscris n triunghi.
Suportul matematic necesar rezolvrii:

Fie triunghiul de vrfuri A(xA,yA), B(xB,yB), C(xC,yC), n care notm cu la, lb, lc lungimile laturilor opuse vrfurilor A, B respectiv C. Fie A'(x'A,y'A) piciorul bisectoarei din A pe latura BC. Aplicnd teorema bisectoarei, avem
AB A' B = . AC A' C

O dat ce cunoatem valoarea raportului, dac proiectm membrul drept al egalitii pe axele OX respectiv OY, se pstreaz proporionalitatea, deci obinem urmtoarele relaii care ne permit calcului lui x'A i y'A:
' lC x A x l + xC l C xB y l + yC lC ' = de unde deducem x 'A = B B . Analog y A = BB . ' l B xC x A l B + lC l B + lC

tiind coordonatele picioarelor bisectoarelor, putem foarte lesne obine centrul cercului nscris n triunghi prin intersecia a dou dintre ele.
apl108.html
<html><body> <form action="apl109.php" method="post"> <h3>Introdu coordonatele a 3 virfuri ale triunghiului</h3> <table border="1" cellspacing="0" cellpadding="10"> <tr> <th align="center" rowspan="2" bgcolor="lightblue"> VARFUL<br>A <td>x<sub>A</sub>= <td><input type="text" name="xa" size="4"> <tr> <td>y<sub>A</sub>= <td><input type="text" name="ya" size="4"> <tr> <th align="center" rowspan="2" bgcolor="yellow"> VARFUL<br>B

136

<td>x<sub>B</sub>= <td><input type="text" name="xb" size="4"> <tr> <td>y<sub>B</sub>= <td><input type="text" name="yb" size="4"><tr> <th align="center" rowspan="2" bgcolor="lime">VARFUL<br>C <td>x<sub>C</sub>= <td><input type="text" name="xc" size="4"> <tr> <td>y<sub>C</sub>= <td><input type="text" name="yc" size="4"> <tr><td colspan="3" align="center"> <input type="submit" value="Deseneaza triunghiul"> </table> </form> </body></html>

apl109.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $xa=$_POST['xa'];$ya=$_POST['ya']; $xb=$_POST['xb'];$yb=$_POST['yb']; $xc=$_POST['xc'];$yc=$_POST['yc']; imagesetthickness($im,2); $b=imagecolorallocate($im,0,0,255); imageline($im,$xa,$ya,$xb,$yb,$b); imageline($im,$xa,$ya,$xc,$yc,$b); imageline($im,$xc,$yc,$xb,$yb,$b); $r=imagecolorallocate($im,255,0,0); $g=imagecolorallocate($im,0,188,0); //definim o functie care sa ne calculeze distanta dintre //doua puncte de coordonate date function dist($x1,$y1,$x2,$y2) { return sqrt(($x1-$x2)*($x1-$x2)+($y1-$y2)*($y1-$y2)); } //si definim o functie care sa ne calculeze coordonatele //picioarei unei bisectoare: function coordbis($xa,$ya,$xb,$yb,$xc,$yc,&$x1a,&$y1a) {//vom calcula coordonatele piciorului bisectoarei ce pleaca //din virful A: $lb=dist($xa,$ya,$xc,$yc); $lc=dist($xa,$ya,$xb,$yb); $x1a=($xb*$lb+$xc*$lc)/($lb+$lc); $y1a=($yb*$lb+$yc*$lc)/($lb+$lc); } //definim si o functie care sa determine ecuatia unei drepte //care trece prin doua puncte de coordonate date: //functia va da coeficientii ecuatiei ax + by + c = 0 //care trece prin punctele ($x1,$y1) si ($x2,$y2) function ec2puncte($x1,$y1,$x2,$y2,&$a,&$b,&$c) { $a=$y1-$y2; $b=-$x1+$x2; $c=$x1*$y2-$y1*$x2; } //si o functie care, date fiind doua ecuatii de drepte //in forma ax+by+c=0 determina punctul de intersectie function inters($a1,$b1,$c1,$a2,$b2,$c2,&$x,&$y) { $x=($b1*$c2-$b2*$c1)/($a1*$b2-$b1*$a2); $y=($a1*$c2-$a2*$c1)/($b1*$a2-$a1*$b2); }

137

//calculam picioarele celor 3 inaltimi si le desenam: coordbis($xa,$ya,$xb,$yb,$xc,$yc,$x1a,$y1a); coordbis($xb,$yb,$xa,$ya,$xc,$yc,$x1b,$y1b); coordbis($xc,$yc,$xb,$yb,$xa,$ya,$x1c,$y1c); imageline($im,$xa,$ya,$x1a,$y1a,$g); imageline($im,$xb,$yb,$x1b,$y1b,$g); imageline($im,$xc,$yc,$x1c,$y1c,$g); //calculam ecuatiile a doua inaltimi, de forma ax + by = c ec2puncte($xa,$ya,$x1a,$y1a,$a1,$b1,$c1); ec2puncte($xb,$yb,$x1b,$y1b,$a2,$b2,$c2); //si determinam originea centrului cercului //inscris intersectindu-le: inters($a1,$b1,$c1,$a2,$b2,$c2,$xo,$yo); //determinam lungimea razei cercului, ca si //inaltime a triunghiului cu virful in //centrul cercului inscris si baza una dintre //laturi $s=0.5*abs($xa*$yb+$xb*$yo+$xo*$ya -$xo*$yb-$xa*$yo-$xb*$ya); $lc=dist($xa,$ya,$xb,$yb); $raza=2*$s/$lc;$diam=2*$raza; $mg=imagecolorallocate($im,255,0,140); imageellipse($im,$xo,$yo,$diam,$diam,$mg); //si in fine, punem literele virfurilor //triunghiului imagestring($im,5,$xa,$ya,'A',$r); imagestring($im,5,$xb,$yb,'B',$r); imagestring($im,5,$xc,$yc,'C',$r); imagestring($im,5,$x1a,$y1a,'A1',$r); imagestring($im,5,$x1b,$y1b,'B1',$r); imagestring($im,5,$x1c,$y1c,'C1',$r); imagepng($im); imagedestroy($im); ?>

41) Se citesc, prin intermediul unor cmpuri de tip text ale unui formular, coordonatele a trei puncte ce reprezint vrfurile unui triunghi. Abscisele sunt cuprinse ntre 0 i 639 iar ordonatele ntre 0 i 479. S se creeze o imagine de tip PNG n care reprezentai triunghiul, cercul su circumscris i segmentele de pe mediatoare care unesc picioarele lor pe laturile triunghiului cu centrul cercului circumscris. 42) Se citesc, prin intermediul unor cmpuri de tip text ale unui formular, coordonatele a patru puncte ce reprezint vrfurile unui patrulater convex ABCD. Abscisele sunt cuprinse ntre 0 i 639 iar ordonatele ntre 0 i 479, punctele fiind date n ordine (deci AB, BC, CD, AD sunt laturile poligonului convex). S se deseneze triunghiurile ABD, respectiv BCD, precum i cercurile lor circumscrise, precum i razele care unesc centrele fiecrui cerc cu vrfurile triunghiului corespunztor. 43) Se citesc, prin intermediul unor cmpuri de tip text ale unui formular, coordonatele a trei puncte ce reprezint vrfurile unui triunghi. Abscisele sunt cuprinse ntre 0 i 639 iar ordonatele ntre 0 i 479. S se creeze o imagine de tip PNG n care reprezentai triunghiul, fie el ABC, cele 3 nlimi AA', BB', CC' i cercul circumscris patrulaterului inscriptibil OA'B'C, unde O este ortocentrul triunghiului.
138

44) Problem rezolvat (apl110.html + apl111.php): Se citete, prin intermediul unui cmp de tip text al unui formular, un numr natural n, cel puin 3 i cel mult 40. S se creeze o imagine PNG de dimensiuni 640x480, n care reprezentai un poligon regulat cu n laturi, avnd centrul la coordonatele (320,240) i raza cercului circumscris 200. Suportul matematic necesar rezolvrii: Ne vom folosi de coordonatele polare: Dat fiind un punct de coordonate (x0,y0) din care pleac un segment de lungime l sub un unghi u, cellalt capt al segmentului va avea coordonatele x1=x0+lcos u y1=y0lsin u (semnul "" se datoreaz orientrii inverse a axei OY): x0 x1 y1 l y0 u l cos u l sin u

S ne reamintim n primul rnd c funciile trigonometrice ale limbajului PHP, ca de altfel ale multor alte limbaje de programare, lucreaz n radiani. n cazul de fa, pentru a obine coordonatele vrfurilor poligonului cu n laturi, vom considera unghiul la centru u = 2 i vom "plimba" un segment de lungime r avnd un capt fixat n centrul n

centrului i cellalt capt mobil, la unghiurile 0, u, 2u, 3u, ... (n-1)u. Astfel, coordonatele captului mobil ne vor da tocmai coordonatele vrfurilor poligonului.
apl110.html
<html><body> <form action="apl111.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu numarul de laturi:<br>(intre 3 si 40) <td><input type="text" name="n" size="4"> <tr><td colspan="2" align="center"> <input type="submit" value="Deseneaza poligonul"> </table> </form></body></html>

apl111.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $n=$_POST['n']; $red=imagecolorallocate($im,255,0,0); imagesetthickness($im,2);
139

$xc=320;$yc=240;$r=200; $u=2*pi()/$n;//u=unghiul la centru for($i=0;$i<=$n-1;$i++) {//pe baza xc, yc, r, si unghiuri //variabile i*u calculam coordonatele //a 2 vf. vecine ale poligonului $x1=$xc+$r*cos($i*$u); $y1=$yc-$r*sin($i*$u); $x2=$xc+$r*cos(($i+1)*$u); $y2=$yc-$r*sin(($i+1)*$u); imageline($im,$x1,$y1,$x2,$y2,$red); } imagepng($im); imagedestroy($im); ?>

45) Generai o imagine PNG de dimensiuni 640 x 480 n care s creai un model de tip fagure, format din hexagoane. Dimensiunea recomandat a unui hexagon este de latur 40. Poziionarea hexagoanelor n cadrul imaginii rmne la latitudinea programatorului. 46) Problem rezolvat (apl112.html + apl113.php): Se citesc, prin intermediul unui

formular, coordonatele a dou puncte i un numr natural m, cuprins ntre 2 i 40. Punctele vor avea abscisa cuprins ntre 0 i 639 iar ordonata ntre 0 i 479. mprii segmentul respectiv n m pri congruente. Desenai segmentul, marcnd totodat prin cerculee punctele obinute prin mprirea n cele m pri congruente. Suportul matematic necesar rezolvrii: mprind segmentul n m pri congruente, proiecia lor pe axele de coordonate va consta de asemenea n segmente congruente: x0 hx y0 hy hy hy y1 hy hx hx hx x1

Fie segmentul dintre punctele de coordonate (x0,y0) i (x1,y1). Notm cu hx respectiv cu hy lungimile proieciilor segmentelor congruente care se obin, pe axa OX respectiv pe axa OY.
140

Avem: hx =

x1 x0 y y , respectiv hy = 1 0 . m m

Pe baza lor, coordonatele punctelor intermediare care se obin sunt: (x0+hx,y0+hy), (x0+2hx,y0+2hy), (x0+3hx,y0+3hy), ... (x0+(m-1)hx,y0+(m-1)hy) sau, pe scurt: ( x0 + i hx, y0 + i hy ) , cu i = 0, m dac dorim i capetele, sau doar cu i = 1, m 1 dac

dorim doar punctele intermediare.


apl112.html
<html><body> <form action="apl113.php" method="post"> <h3>Introdu coordonatele celor doua puncte intre care trasezi segmentul</h3> <table border="1" cellspacing="0" cellpadding="10"> <tr> <th align="center" rowspan="2" bgcolor="lightblue"> Punctul<br>A <td>x<sub>0</sub>= <td><input type="text" name="x0" size="4"> <tr> <td>y<sub>0</sub>= <td><input type="text" name="y0" size="4"> <tr> <th align="center" rowspan="2" bgcolor="yellow"> Punctul<br>B <td>x<sub>1</sub>= <td><input type="text" name="x1" size="4"> <tr> <td>y<sub>1</sub>= <td><input type="text" name="y1" size="4"><tr> <th align="center" bgcolor="lime"> Numarul de<br>segmente <td>m= <td><input type="text" name="m" size="4"> <tr><td colspan="3" align="center"> <input type="submit" value="Imparte segmentul"> </table> </form> </body></html>

apl113.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $m=$_POST['m']; $red=imagecolorallocate($im,255,0,0); imagesetthickness($im,2); $x0=$_POST['x0'];$y0=$_POST['y0']; $x1=$_POST['x1'];$y1=$_POST['y1']; $blue=imagecolorallocate($im,0,0,255); imageline($im,$x0,$y0,$x1,$y1,$blue); //calculam lungimile proiectiilor //segmentelor pe cele doua axe: $hx=($x1-$x0)/$m; $hy=($y1-$y0)/$m; //si desenam cerculete in punctele obtinute for($i=0;$i<=$m;$i++) imagefilledellipse($im,$x0+$i*$hx,$y0+$i*$hy,6,6,$red); imagepng($im); imagedestroy($im); ?>

141

46) Problem rezolvat (apl114.html + apl115.php): Se citesc, prin intermediul unui formular, coordonatele a trei puncte A, B i C i un numr natural m, cuprins ntre 2 i 40. Punctele au abscisa cuprins ntre 0 i 639 iar ordonata ntre 0 i 479. mprii ambele segmente, AB i BC n m pri congruente, dinspre A ctre B n cazul primului respectiv dinspre B nspre C n cazul celui de-al doilea. Unii primul punct obinut astfel de pe AB cu primul punct obinut astfel de pe BC, al doilea punct de pe AB cu al doilea punct de pe BC, .a.m.d.
apl114.html
<html><body> <form action="apl115.php" method="post"> <h3>Introdu coordonatele a 3 virfuri ale triunghiului</h3> <table border="1" cellspacing="0" cellpadding="10"> <tr> <th align="center" rowspan="2" bgcolor="lightblue"> VARFUL<br>A <td>x<sub>A</sub>= <td><input type="text" name="xa" size="4"> <tr> <td>y<sub>A</sub>= <td><input type="text" name="ya" size="4"> <tr> <th align="center" rowspan="2" bgcolor="yellow"> VARFUL<br>B <td>x<sub>B</sub>= <td><input type="text" name="xb" size="4"> <tr><td>y<sub>B</sub>= <td><input type="text" name="yb" size="4"><tr> <th align="center" rowspan="2" bgcolor="lime"> VARFUL<br>C <td>x<sub>C</sub>= <td><input type="text" name="xc" size="4"> <tr><td>y<sub>C</sub>= <td><input type="text" name="yc" size="4"> <tr> <th bgcolor="red">Numarul de segmente<td>m= <td><input type="text" name="m" size="4"> <tr><td colspan="3" align="center"> <input type="submit" value="Deseneaza"> </table> </form> </body></html>

apl115.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $m=$_POST['m']; $red=imagecolorallocate($im,255,0,0); $xa=$_POST['xa'];$ya=$_POST['ya']; $xb=$_POST['xb'];$yb=$_POST['yb']; $xc=$_POST['xc'];$yc=$_POST['yc']; $blue=imagecolorallocate($im,0,0,255); imageline($im,$x0,$y0,$x1,$y1,$blue); $hx1=($xb-$xa)/$m; $hy1=($yb-$ya)/$m; $hx2=($xc-$xb)/$m; $hy2=($yc-$yb)/$m; for($i=0;$i<=$m;$i++) imageline($im,$xa+$i*$hx1,$ya+$i*$hy1,$xb+$i*$hx2,$yb+$i*$hy2,$red); imagepng($im); imagedestroy($im); ?>
142

47) Se citesc, prin intermediul unui formular, coordonatele a trei puncte A, B i C i un numr natural m, cuprins ntre 2 i 40. Punctele au abscisa cuprins ntre 0 i 639 iar ordonata ntre 0 i 479. S se mpart att latura AB (dinspre A nspre B) ct i latura AC (dinspre A nspre C) n m pri congruente, i s se uneasc punctele obinute, formnd astfel n segmente paralele echidistante la BC. 48) Se citesc, prin intermediul unui formular, coordonatele a trei puncte A, B i C i un numr natural m, cuprins ntre 2 i 40. Punctele au abscisa cuprins ntre 0 i 639 iar ordonata ntre 0 i 479. S se mpart att latura BC n m pri congruente, i s se uneasc vrful A cu fiecare dintre punctele obinute. 49) Problem rezolvat (apl116.html + apl117.php): Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 15. S se deseneze fractalul arbore de nivel n, ntr-o imagine de dimensiuni 500x500. Segmentul iniial al fractalului se afl ntre coordonatele (250,490)-(250,240) (deci are lungimea de 250). n cadrul fiecrui nivel, capetele libere se ramific n dou segmente de lungime egal cu jumtate din lungimea segmentului de la pasul precedent, orientate cu

respectiv cu

fa de acesta.

Suportul matematic necesar rezolvrii: Acest tip de fractal se ncadreaz unei clase mai largi, i anume a fractalilor care se obin prin repetarea recurent a unui procedeu de desenare, la o scar mai mic i avnd alte orientri. n acest sens, mersul procedeului de calcul necesar desenrii sale este unul de tip divide et impera. n cazul de fa, vom lucra n coordonate polare, pe care le vom i trimite, de altfel, funciei recursive care realizeaz desenarea propriuzis. Schema recursiv este urmtoarea: - parametri funciei vor fi: (x0, y0), l, u, n. Primele dou reprezit punctul de plecare, l = lungimea segmentului de baz pe nivelul curent, u = unghiul pe care-l face segmentul de la pasul curent cu orizontala, n = pasul curent. - evoluia acestui fractal este urmtoarea:

nivelul 1

nivelul 2

nivelul 3

143

acest lucru se transpune prin urmtoarea schem recursiv:


nu se mai face nimic daca n = 0 - se calculeaza (x , y ) = celalalt capat al 1 1 segmentului dat de (x 0 , y 0 ), lungime l, unghi u fractal ( x0 , y0 , l , u , n ) = daca n 0 : - din capatul determinat, (x1 , y1 ) se apeleaza recursiv procedeul de desenare, prin : l l + fractal x , y , , u , n si fractal x , y , , u , n 1 1 1 1 2 4 2 4
apl116.html
<html><body> <form action="apl117.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr> <td>Nivelul de ramificare:<br>(Intre 1 si 15) <td><input type="text" name="n" size="4"> <tr> <td colspan="2" align="center"> <input type="submit" value="Deseneaza"> </table> </form> </body></html>

apl117.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(500,500); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,499,499,$y); $n=$_POST['n']; $blue=imagecolorallocate($im,0,0,255); $l=300; function arbore($x0,$y0,$l,$u,$n) { if($n==0) return; //declaram global atit variabila imagine cit //si cea care defineste culoarea albastru //pentru a le putea accesa din functie: global $im,$blue; //calculam coordonatele celuilalt capat //al segmentului: $x1=$x0+$l*cos($u); $y1=$y0-$l*sin($u); //il desenam: imageline($im,$x0,$y0,$x1,$y1,$blue); //apelam recursiv functia, pentru a ramifica //si pe nivelele urmatoare. Observati cum //sunt trimise mai departe coordonatele //celuilalt capat, din care ramificam, si //unghiuri deviate cu pi()/4 in stinga si //dreapta fata de unghiul segmentului curent arbore($x1,$y1,$l/2,$u-pi()/4,$n-1); arbore($x1,$y1,$l/2,$u+pi()/4,$n-1); } arbore(250,490,250,pi()/2,$n); imagepng($im); imagedestroy($im); ?>

144

49) Problem rezolvat (apl118.html + apl119.php): Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 10. S se deseneze fractalul lui Koch de nivel n, ntr-o imagine de dimensiuni 640x210. Segmentul iniial al fractalului se afl ntre coordonatele (10,200)-(630,200) (deci are lungimea de 620). Procedeul recursiv este ilustrat mai jos:
P0 P1 P0 PA PB

PC

P1

nivelul 1 Aadar :

nivelul 2

nivelul 3

- pe nivelul 1 se deseneaz pur i simplu un segment ntre punctele P0 i P1 - pe orice alt nivel n, se procedeaz astfel: se determin punctele intermediare PA, PB, PC , ca n figura de mai sus (mijloc) prin mprirea segmentului n 3 pri egale i construirea unui triunghi echilateral care are ca baz segmentul din mijloc se deseneaz 4 fractali de dimensiuni l/3 i de nivel cu 1 mai puin, dup cum urmeaz: - unul ce pleac din P0, sub acelai unghi ca i cel de pe nivelul curent; - altul ce pleac din PA, sub un unghi cu /3 mai mare dect cel al nivelului curent; - altul ce pleac din PB, sub un unghi cu /3 mai mic dect cel al nivelului curent; - n fine, altul ce pleac din PC, sub acelai unghi ca i cel de pe nivelul curent.
apl118.html
<html><body> <form action="apl119.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr> <td>Nivelul de ramificare:<br>(Intre 1 si 10) <td><input type="text" name="n" size="4"> <tr> <td colspan="2" align="center"> <input type="submit" value="Deseneaza"> </table> </form> </body></html>

apl119.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,210); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,640,210,$y); $n=$_POST['n']; $blue=imagecolorallocate($im,0,0,255);

145

function koch($x0,$y0,$l,$u,$n) { //daca nu suntem pe nivelul $n==1 (cel de //baza, cind fractalul se reduce la un segment if($n!=1) { //calculam coordonatele punctelor Pa, Pb, Pc $xa=$x0+$l/3*cos($u); $ya=$y0-$l/3*sin($u); $xb=$xa+$l/3*cos($u+pi()/3); $yb=$ya-$l/3*sin($u+pi()/3); $xc=$xb+$l/3*cos($u-pi()/3); $yc=$yb-$l/3*sin($u-pi()/3); //Si apelam recursiv desenarea fractalului //pe nivelele urmatoare: koch($x0,$y0,$l/3,$u,$n-1); koch($xa,$ya,$l/3,$u+pi()/3,$n-1); koch($xb,$yb,$l/3,$u-pi()/3,$n-1); koch($xc,$yc,$l/3,$u,$n-1); } else { //iar daca suntem pe nivelul 1, desenam pur si //simplu segmentul: global $im,$blue; $x1=$x0+$l*cos($u); $y1=$y0-$l*sin($u); imageline($im,$x0,$y0,$x1,$y1,$blue); } } koch(10,200,620,0,$n); imagepng($im); imagedestroy($im); ?>

49) Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 10. S se deseneze, ntr-o imagine de dimensiuni 640x480, o variant a fractalului lui Koch (cunoscut sub numele de fractalul lui Cesaro) obinut dup un procedeu similar: fiecare segment se nlocuiete tot cu 4 segmente congruente, cu deosebirea c cele oblice NU mai formeaz un triunghi echilateral, ci un triunghi isoscel ale crui unghiuri de la baz au 85 de grade (n figura de mai jos, este vorba de triunghiul PAPBPC). Segmentul iniial al fractalului se afl ntre coordonatele (10,470)(630,470) (deci are lungimea de 620). Procedeul recursiv este ilustrat mai jos:
PB

P0 nivelul 1

P1

P0

PA

PC

P1 nivelul 3

nivelul 2

Iat i o imagine a acestui fractal, pentru n = 8:

146

50) Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 8. S se deseneze, ntr-o imagine de dimensiuni 640x480, o variant a fractalului lui Koch obinut dup procedeul urmtor: fiecare segment se nlocuiete cu 5 segmente congruente, ntre care se formeaz unghiuri drepte, ca n schema de mai jos. Segmentul iniial al fractalului se afl ntre coordonatele (10,470)-(630,470) (deci are lungimea de 620). Procedeul recursiv este ilustrat mai jos:

nivelul 1

nivelul 2

nivelul 3
(am colorat diferit fractalii de pe nivelul anterior, pentru a-i diferenia)

Iat i o imagine a acestui fractal, pentru n = 6:

51) Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 8. S se deseneze, ntr-o imagine de dimensiuni 640x480, o variant a fractalului lui Koch obinut dup procedeul urmtor: fiecare segment se nlocuiete cu 7 segmente, dintre care 6 au lungimea egal cu 1/4 din lungimea celui iniial, iar unul are lungimea egal cu 1/2 din cel iniial. ntre segmente se formeaz unghiuri drepte, ca n schema de mai jos. Segmentul iniial al fractalului se afl ntre coordonatele (10,240)-(630,240) (deci are lungimea de 620). Procedeul recursiv este ilustrat mai jos:

nivelul 1

nivelul 2

nivelul 3
(am colorat diferit fractalii de pe nivelul anterior, pentru a-i diferenia)

147

Iat i o imagine a acestui fractal, pentru n = 7:

52) Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 19. S se deseneze, ntr-o imagine de dimensiuni 450x650, fractalul "C" al lui Levy, obinut dup procedeul urmtor: fiecare segment se nlocuiete cu alte 2 segmente, care sunt catetele triunghiului dreptunghic isoscel a crui ipotenuz ar fi fost segmentul eliminat, ca n schema de mai jos. Segmentul iniial al fractalului se afl ntre coordonatele (330,480)-(330,180) (deci are lungimea de 300). Procedeul recursiv este ilustrat mai jos:

Nivelul 1

Nivelul 2

Nivelul 3

Nivelul 4

Iat i o imagine a acestui fractal, pentru n = 19:

148

53) Problem rezolvat (apl120.html + apl121.php): Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 19. S se deseneze, ntr-o imagine de dimensiuni 640x480, fractalul dragonului. Procedeul su de obinere este foarte similar cel al fractalului precedent (curba "C" a lui Levy) doar c orientrile vrfurilor triunghiurilor dreptunghice alterneaz ntre segmentele alturate. Segmentul iniial al fractalului se afl ntre coordonatele (150,170)-(550,170) (deci are lungimea de 400). Procedeul recursiv este ilustrat mai jos:

Nivelul 1

Nivelul 2

Nivelul 3

Nivelul 4

Nivelul 5

Pentru implementarea optim a rezolvrii am mai introdus la subprogramul recursiv care face desenarea fractalului, nc un parametru, "$sens", n funcie de care la nivelul urmtor fractalul care are ordinul cu 1 mai mic se va desena "sub" respectiv "deasupra".

apl120.html
<html><body> <form action="apl121.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr> <td>Nivelul de ramificare:<br>(Intre 1 si 19) <td><input type="text" name="n" size="4"> <tr> <td colspan="2" align="center"> <input type="submit" value="Deseneaza"> </table> </form> </body></html>

apl121.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $n=$_POST['n']; $blue=imagecolorallocate($im,0,0,255); //spre deosebire de programele precedente, am mai introdus un parametru "sens". //In functie de el desenam "deasupra" respectiv "dedesubtul" liniei curente function dragon($x0,$y0,$l,$u,$sens,$n) { global $im,$blue; if($n!=1) { $l1=$l/sqrt(2); $xa=$x0+$l1*cos($u-$sens*pi()/4); $ya=$y0-$l1*sin($u-$sens*pi()/4); //La apelurile recursive, primul apel va avea sensul identic cu cel al nivelului in care //suntem, in schimb al doilea apel va avea sens contrar: dragon($x0,$y0,$l1,$u-$sens*pi()/4,1,$n-1); dragon($xa,$ya,$l1,$u+$sens*pi()/4,-1,$n-1); } else {//iar daca suntem pe nivelul 1, desenam pur si simplu segmentul: $x1=$x0+$l*cos($u); $y1=$y0-$l*sin($u); imageline($im,$x0,$y0,$x1,$y1,$blue);} } dragon(150,170,400,0,1,$n); imagepng($im); imagedestroy($im); ?>
149

Iat i dou imagini pentru acest fractal, cu n = 13, respectiv n = 19:

53) Problem rezolvat (apl122.html + apl123.php): Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 6. S se deseneze, ntr-o imagine de dimensiuni 700x700 fractalul covor al lui Sierpinski. Acest fractal se obine plecnd de la un ptrat, mprindu-l n nou ptrate egale. Se traseaz doar conturul celui din mijloc, iar celorlalte 8 ptrate li se aplic n mod recursiv acelai procedeu. Ptratul iniial va avea dou dintre colurile diagonal opuse la coordonatele (10,10)-(690,690) (deci latura de 680). Procedeul recursiv este ilustrat mai jos (segmentele punctate nu se vor desena):

Nivelul 1

Nivelul 2

Nivelul 3

Nivelul 4

apl122.html
<html><body> <form action="apl123.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr> <td>Nivelul de ramificare:<br>(Intre 1 si 6) <td><input type="text" name="n" size="4"> <tr> <td colspan="2" align="center"> <input type="submit" value="Deseneaza"> </table> </form> </body></html>

apl123.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(700,700); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,699,699,$y); $n=$_POST['n']; $blue=imagecolorallocate($im,0,0,255);

150

//functia recursiva care realizeaza desenarea va primi ca parametri coordonatele coltului //stinga sus al patratului, lungimea laturii sale precum si nivelul: function covor_sierpinski($x0,$y0,$l,$n) { global $im,$blue; if($n!=0) { $l1=$l/3; //desenam patratul din mijloc: imagerectangle($im,$x0+$l1,$y0+$l1,$x0+2*$l1,$y0+2*$l1,$blue); //si apelam recursiv procedeul pentru celelalte 8 patrate: covor_sierpinski($x0,$y0,$l1,$n-1); covor_sierpinski($x0+$l1,$y0,$l1,$n-1); covor_sierpinski($x0+2*$l1,$y0,$l1,$n-1); covor_sierpinski($x0,$y0+$l1,$l1,$n-1); covor_sierpinski($x0+2*$l1,$y0+$l1,$l1,$n-1); covor_sierpinski($x0,$y0+2*$l1,$l1,$n-1); covor_sierpinski($x0+$l1,$y0+2*$l1,$l1,$n-1); covor_sierpinski($x0+2*$l1,$y0+2*$l1,$l1,$n-1); } } imagerectangle($im,10,10,690,690,$blue); covor_sierpinski(10,10,680,$n); imagepng($im); imagedestroy($im); ?>

151

54) Se citete, prin intermediul unui cmp text al unui formular, un numr natural cuprins ntre 1 i 11. S se deseneze, ntr-o imagine de dimensiuni 700x600 fractalul triunghi al lui Sierpinski. Acest fractal se obine plecnd de la un triunghi (de preferin echilateral, ns procedeul poate fi aplicat oricrui fel de triunghi) n care trasm toate cele 3 linii mijlocii. Triunghiurilor care se formeaz, cu excepia celui care are ca laturi toate cele 3 linii mijlocii, li se aplic n mod recursiv exact acelai procedeu. Triunghiul iniial va avea vrfurile la coordonatele: (350,10), (10,589), (690,589). Procedeul recursiv este ilustrat mai jos:

Nivelul 1

Nivelul 2

Nivelul 3

Nivelul 4

Iat i o imagine a acestui fractal, pentru n = 7:

55) Problem rezolvat (apl124.php): Generarea fractalului de tip ferig, al lui Barnsley. Dei acest fractal se poate desena i printr-un procedeu de tipul celor descrise anterior (prin trasri de segmente, conform unui procedeu recurent) vom aborda o alt modalitate de descriere a sa, i anume IFS (Iterated Function System). Din punct de vedere matematic, un fractal IFS este definit de o mulime de transformri geometrice elementare (care n matematic se mai numesc lineare sau afine) care n limbajul de zi cu zi se traduc prin rotaii, aplatizri, deformri (de tipul dreptunghi paralelogram), scalri. Ceea ce este specific transformrilor utilizate la un fractal IFS este faptul c acestea trebuie s fie de tip contracie, adic distana dintre dou puncte crora li se aplic transformarea s se diminueze (sau cel puin, s nu creasc).
152

O transformare de tipul celor de mai sus se transcrie prin: x' = fx( x, y ) = a x + b y + e (*) y ' = fy (x, y ) = c x + d y + f unde (x,y) reprezint coordonatele punctului anterior, iar (x',y') reprezint coordonatele punctului curent. Procedeul fiind iterativ, coordonatele punctului curent vor deveni baz de plecare (deci coordonate anterioare) pentru calculul noilor coordonate la pasul urmtor. Fractalul ferig al lui Barnsley se bazeaz pe urmtoarele 4 transformri (n dreptul fiecreia vom scrie irul coeficienilor (a,b,c,d,e,f) care o definete (atenie la ordinea n care am scris coeficienii, care este cea din ecuaiile (*) de mai sus):
x' = fx0 ( x, y ) = 0 0) cu irul coeficienilor (0.00, 0.00, 0.00, 0.16, 0.00, 0.00 ) y ' = fy0 ( x, y ) = 0.16 y
x' = fx1 ( x, y ) = 0.20 x 0.26 y 1) cu irul coeficienilor (0.20, - 0.26, 0.23, 0.22, 0.00, 1.60) y ' = fy1 ( x, y ) = 0.23 x + 0.22 y + 1.60 x' = fx 2 ( x, y ) = 0.15 x + 0.28 y 2) cu irul coeficienilor (- 0.15, 0.28, 0.26, 0.24, 0.00, 0.44) y ' = fy 2 (x, y ) = 0.26 x + 0.24 y + 0.44 x' = fx3 ( x, y ) = 0.85 x + 0.04 y 3) cu irul coeficienilor (0.85, 0.04, - 0.04, 0.85, 0.00, 1.60) y ' = fy 3 ( x, y ) = 0.04 x + 0.85 y + 1.60

Procedeul de desenare pleac de la punctul de coordonate (0,0) pe care l itereaz ntr-una dintre cele 4 ecuaii de mai sus, aleas aleator, ns cu o anumit frecven, i anume: - prima dintre ecuaii se va folosi o dat din 100, deci probabilitatea sa va fi 0,01; - a doua dintre ecuaii se va folosi de 7 ori din 100, deci cu probabilitatea de 0,07; - a treia dintre ecuaii se va folosi tot de 7 ori din 100, deci tot cu probabilitatea de 0,07; - n fine, ultima dintre ecuaii se folosete n restul cazurilor, deci de 85 de ori din 100, cu probabilitatea de 0,85. Punctele astfel obinute reprezint imaginea fractalului. Prin urmare, datele necesare reprezentrii pot fi rezumate n urmtorul tabel:
a = coeficientul lui x din prima ecuaie a transf. transformarea 0 transformarea 1 transformarea 2 transformarea 3 b = coeficientul lui y din prima ecuaie a transf. c = coeficientul lui x din a doua ecuaie a transf. d = coeficientul lui y din a doua ecuaie a transf. e = termenul liber din prima ecuaie a transf. f = termenul liber p = probabilitatea cu din a doua care trebuie aleas ecuaie a transf. aceast transformare

0.00 0.20 -0.15 0.85

0.00 -0.26 0.28 0.04

0.00 0.23 0.26 -0.04

0.16 0.22 0.24 0.85

0.00 0.00 0.00 0.00

0.00 1.60 0.44 1.60

0.01 0.07 0.07 0.85

Pentru o reprezentare grafic sugestiv, e necesar s efectum cel puin 300.000 de iteraii.

153

n urma calculelor, coordonatele punctelor ce se vor determina vor fi delimitate de urmtoarele margini: x [-2.18, 2.66] i y [0.08, 10], deci punctele rmn n interiorul unui dreptunghi cu limea de 4.84 respectiv cu nlimea 9.92. Pentru a le putea reprezenta pe ecran, vom alege un factor de scalare egal cu 70, astfel, imaginea pe care o generm va avea dimensiunile de aproximativ 340 x 700. Formulele de reprezentare la scar vor fi (fie xmin=-2.18, xmax=2.66, ymin=0.08, ymax=10, scale=70): ximagine = (x-xmin)*scale yimagine = 700-(y-ymin)*scale (aceasta din urm se datoreaz orientrii negative a axei OY). Iat codul surs al programului:
apl124.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(340,700); $y=imagecolorallocate($im,255,255,210); imagefilledrectangle($im,0,0,339,699,$y); $gr=imagecolorallocate($im,0,128,0); //prin variabila de mai jos ne fixam numarul de puncte pe care le vom reprezenta: $npoints=300000; $f[0]=array( 0.00, 0.00, 0.00,0.16,0.00,0.00,0.01); $f[1]=array( 0.20,-0.26, 0.23,0.22,0.00,1.60,0.07); $f[2]=array(-0.15, 0.28, 0.26,0.24,0.00,0.44,0.07); $f[3]=array( 0.85, 0.04,-0.04,0.85,0.00,1.60,0.85); //calculam intr-un sir "prf" suma probabilitatilor, pentru a ne fi mai usor sa alegem in //mod aleator transformarea corespunzatoare: $s=0; for($i=0;$i<=3;$i++) { $s+=$f[$i][6]; $prf[$i]=$s;} //definim in $xold, $yold coordonatele punctului de plecare: $xold=$yold=0.0; $xmin=-2.18;$xmax=2.66;$ymin=0.08;$ymax=10;$scale=70; //si ne apucam de iterat: for($i=1;$i<=$npoints;$i++) {//nu vom folosi functia clasica rand(), deoarece algoritmul implementat de aceasta //genereaza numere pseudo-aleatoare ce devin periodice foarte repede, fata de nevoile //reprezentarii fractalului de fata. Vom folosi // functia mt_rand() - proprie limbajului //PHP, ce contine o reimplementare imbunatatita a // lui rand(). Folosirea sa este identica //cu a functiei rand(). //Asadar, mai jos calculam un numar aleator //cuprins intre 0 si 99, pe care-l impartim apoi //la 100, ca sa obtinem un numar cuprins intre //0.00 si 0.99, pe baza caruia alegem //transformarea curenta $aleat=mt_rand(0,99)/100; //determinam $k = indicele transformarii curente: $k=0; while($prf[$k]<$aleat) $k++; //calculam noile coordonate: $x=$f[$k][0]*$xold+$f[$k][1]*$yold+$f[$k][4]; $y=$f[$k][2]*$xold+$f[$k][3]*$yold+$f[$k][5]; $xold=$x;$yold=$y; //si le reprezentam, dupa ce le aducem la scara //imaginii noastre: $xim=(double)($x-$xmin)*$scale; $yim=700.0-(double)($y-$ymin)*$scale; imagesetpixel($im,$xim,$yim,$gr); } imagepng($im); imagedestroy($im); ?>
154

56) n cadrul aplicaiei anterioare am vzut faptul c fractalul ferig este perfect definit de tabelul n care am notat coeficienii celor 4 transformri afine precum i probabilitatea cu care trebuie aleas fiecare transformare. Totodat pentru fiecare reprezentare mai trebuie s precizm care sunt limitele coordonatelor care mrginesc fractalul (xmin, xmax, ymin, ymax) precum i scara la care facem reprezentarea. Generai ferigile i pentru urmtoarele dou seturi de date, ntr-o imagine de dimensiuni 340x700: a) setul I:
a = coeficientul lui x din prima ecuaie a transf. transformarea 0 transformarea 1 transformarea 2 transformarea 3 b = coeficientul lui y din prima ecuaie a transf. c = coeficientul lui x din a doua ecuaie a transf. d = coeficientul lui y din a doua ecuaie a transf. e = termenul liber din prima ecuaie a transf. f = termenul liber p = probabilitatea cu din a doua care trebuie aleas ecuaie a transf. aceast transformare

0.00 0.09 -0.09 0.85

0.00 -0.28 0.28 0.02

0.00 0.30 0.30 -0.02

0.25 0.11 0.09 0.83

0.00 0.00 0.00 0.00

-0.14 0.60 0.70 1.00

0.02 0.07 0.07 0.84

cu limitele care l mrginesc: xmin = -1.56, xmax = 1.56, ymin = -0.18, ymax = 5.80 i scara = 109 b) setul al II-lea:
a = coeficientul lui x din prima ecuaie a transf. transformarea 0 transformarea 1 transformarea 2 transformarea 3 b = coeficientul lui y din prima ecuaie a transf. c = coeficientul lui x din a doua ecuaie a transf. d = coeficientul lui y din a doua ecuaie a transf. e = termenul liber din prima ecuaie a transf. f = termenul liber p = probabilitatea cu din a doua care trebuie aleas ecuaie a transf. aceast transformare

0.00 0.20 -0.15 0.75

0.00 -0.26 0.28 0.04

0.00 0.23 0.26 -0.04

0.16 0.22 0.24 0.85

0.00 0.00 0.00 0.00

0.00 1.60 0.44 1.60

0.10 0.08 0.08 0.74

cu limitele care l mrginesc: xmin = -2.34, xmax = 2.62, ymin = 0, ymax = 10.22 i scara = 68. Iat i imaginile lor: a) Setul I: b) Setul II:

155

5. CONSIDERAII METODOLOGICE
5.1. Posibilitatea predrii limbajului PHP la clasa a XII-a; premise care faciliteaz introducerea sa n cadrul noilor programe colare. Analiza nsuirii sale de ctre elevi. Concluzii stabilite.

n zilele noastre, prin cuvntul "informatic" (termen care n Frana a fost consacrat oficial abia n 1967, reprezentnd din punct de vedere etimologic o contracie ntre "informaie" i "automatic") desemnm una dintre cele mai recent aprute tiine. Este vorba, mai precis, de domeniile tiinific, tehnologic i industrial, raportate la tratarea automat a informaiei de ctre maini precum calculatoare, console, terminale, roboi. Paradoxal, dac stm s ne gndim la toate ngrdirile epocii comuniste, n 1971, deci la doar 5 ani de la intrarea oficial a cuvntului "informatic" n vocabularul europenilor, Consiliul de Minitri al Romniei de la acea vreme decide nfiinarea liceelor cu profil informatic. Tot atunci sunt puse, deci, i bazele studiului informaticii n cadrul nvmntului preuniversitar romnesc. Dac la nceput informatica a fost considerat ca fiind nscut din matematic, de la apariia sa i pn n prezent lucrurile au evoluat ntr-un ritm inimaginabil de alert, n zilele noastre sunt cunoscute mai multe sub-ramuri ale sale. Ceea ce ne intereseaz n mod special, din punct de vedere al analizei de fa, este informatica sub aspectul studiului algoritmilor, a implementrilor acestora n limbaje de programare i a transpunerii n practic, prin programarea lor pe un calculator. Din acest punct de vedere, studiul informaticii n liceu are n prezent urmtoarea structur: - n clasa a IX-a se studiaz algoritmii elementari i implementarea lor ntr-un limbaj de programare; - n clasa a X-a se insist n special pe chestiuni mai strns legate de limbajul de programare (iruri de caractere, structuri ce pot ngloba mai multe date (de tip nregistrare), subprograme); - n clasa a XI-a se introduc cteva dintre metodele principale de programare (Backtracking, Divide et Impera, Alocare Dinamic i Structuri de Date, Teoria Grafurilor) Pn n anul colar 2006-2007 (inclusiv), n programa colar a clasei a XII-a era prevzut studiul bazelor de date, limbajul folosit fiind n special FoxPro. Acest limbaj a cunoscut o popularitate larg ntre anii 1990-2000, ns, o dat cu evoluia tehnicii de calcul i apariia altor instrumente, a nceput s se deprecieze. Dei Microsoft a continuat (i continu) s l menin, elabornd i versiuni Visual ale sale, n prezent nu mai este aa de folosit. Un alt inconvenient al su

156

este acela c permite manipularea bazelor de date i ntr-un mod mai puin convenional, folosind propriul limbaj, deci fr respectarea standardelor SQL. Pe de alt parte, aa cum am artat n introducerea capitolelor al II-lea i al III-lea, ncepnd cu 1995, reeaua Internet a cunoscut o dezvoltare exploziv, de unde a aprut i necesitatea dezvoltrii unor unelte de programare corespuztoare. Toate acestea au condus la impunerea unei schimbri, devenit efectiv din anul colar 2007-2008, cnd structura programei colare destinat claselor a XII-a a fost modificat, ngduind, din punctul de vedere al profesorului, o abordare mult mai permisiv, deoarece poate alege dintre modulele pe care le va preda. Unul dintre modulele ce pot fi alese i n sprijinul cruia vine lucrarea de fa, este cel denumit "Programare WEB". Dup experiena anului colar 2007-2008 de predare a acestui limbaj conform noilor programe i dup experiena anului colar 2006-2007, cnd am propus studiul unui curs opional de PHP, pe care elevii i l-au ales, voi face cteva observaii i voi ncerca s trag cteva concluzii. n primul rnd, studiul limbajului HTML n vreunul dintre anii colari precedeni poate fi de mare ajutor. n acest caz, n cadrul materiei capitolului al II-lea profesorul se poate ocupa mai amnunit de automatizarea paginilor web cu ajutorul script-urilor Java. De asemenea, datorit similitudinii foarte mari dintre C++ i PHP (i de asemenea i JavaScript), elevii care au studiat limbajul C++ au un avantaj foarte mare fa de cei care au studiat Pascal. Deoarece elevii mei au studiat n prealabil C++, nu m-am confruntat cu aceast din urm situaie. Un atu extraordinar al limbajului PHP const n acela c interfaa (att cea de intrare ct i cea de ieire) poate fi foarte mult mbuntit fa de cea a limbajului studiat n clasele IX-XI prin introducerea de elemente grafice i de culoare. Un alt element foarte atractiv al su const n funciile de programare grafic. Din pcate, acest capitol foarte spectaculos al informaticii nu este inclus nicieri n mod explicit, n nici una dintre programele colare, ci este trecut sub tcere. Personal, consider c includerea sa n cadrul programei obligatorie ar fi binevenit, nc din primul an de liceu, deoarece ar reprezenta n primul rnd un factor de atractivitate, iar n al doilea rnd ar familiariza elevii cu lucrul efectiv n coordonate carteziene, cu reprezentri grafice i cu proprieti ale acestora. Aadar, PHP are toate ansele de a fi un limbaj uor de nvat de ctre elevi. n mare parte, nsuirea sa se petrece ntr-o mare msur.

157

E necesar ca elevii s lucreze ct mai mult din punct de vedere practic, deci s implementeze pe calculator ct mai multe exemple, s testeze ct mai multe funcii i situaii. De asemenea, este foarte indicat reluarea problemelor clasice colreti (de clasa a IX-a, a X-a i a XI-a) cu mici precizri (acolo unde se poate, evident) care s ajute la nfrumusearea datelor de ieire (gen: numerele s fie afiate n tabele, anumite elemente s fie colorate, etc.). O serie de probleme special concepute n acest sens se gsesc n capitolul precedent (4). Avantajul cunoaterii limbajului PHP la terminarea liceului nu poate fi dect benefic, mergnd pn ntr-acolo nct poate chiar s constituie o meserie.

5.2. Posibiliti de predare ct mai atractive ale informaticii, fr a se ajunge la banalizare: propunere de curs opional Programare grafic ntr-un limbaj vizual

Unul dintre celelalte module prevzute de programa colar a clasei a XII-a const n "Programare Vizual". Din nou avem de-a face un subiect de actualitate, cu un grad de interes mare din partea elevilor, datorat elementelor vizuale ale interfeei i modului relativ simplu prin care acestea se pot programa respectiv corela. Dup cum am evideniat n paragraful precedent, programarea grafic este un capitol trecut sub tcere n cadrul programelor colare actuale. Dei n cadrul disciplinei "informatic" din clasa a XII-a este posibil ca acest capitol s poat fi atins, profesorul nu dispune, totui, de prea multe ore pentru a face acest lucru. Din acest motiv, propunerea cursului opional de fa i propune tratarea pe larg a acestei problematici. Adesea se face confuzie ntre "grafica pe calculator" i "programarea grafic". Pentru a realiza "grafic pe calculator" este nevoie, n general, de un pachet software specializat tratrii imaginilor (de exemplu Phtoshop) utilizatorul neavnd nevoie ctui de puin s cunoasc i s stpneasc vreun limbaj de programare. Un curs opional care s familiarizeze elevii cu un astfel de produs s-ar preta, poate, claselor care nu sunt de profil matematic-informatic. Un astfel de curs ar avea totui un anumit grad de banalitate, deoarece competenele pe care elevii le-ar putea dobndi n urma sa s-ar limita la simpla dobndire de deprinderi de utilizare a unui produs software.

158

Conceptul de "programare grafic", n schimb, se refer la manipularea i crearea imaginilor din cadrul unui limbaj de programare, utiliznd structuri algoritmice i tehnici de programare. Prin urmare, un curs care s abordeze problematica programrii grafice se adreseaz exclusiv unui programator. Cursul opional pe care l-am propus elevilor claselor a XII-a cu specializarea matematic-informatic va avea ca i suport de programare limbajul Microsoft Visual C++ 2008 Express Eddition (deci o platform foarte proaspt aprut!) versiune pe care Microsoft o pune n mod gratuit la dispoziia celor care doresc s o utilizeze n scopuri pur didactice. Cursul i propune tratarea programrii grafice n dou etape: ntr-o prim parte, cursul este axat pe familiarizarea elevilor cu obiectele grafice i cu operaiile de baz ce se pot efectua n cadrul unei imagini: accesarea la nivel de pixeli, atribute de culoare, coordonate carteziene, trasarea formelor geometrice de baz: segmente, cercuri, dreptunghiuri, elipse, afiarea unui text n cadrul unei imagini, afiarea unei imagini sau a unei poriuni din aceasta n cadrul altei imagini, operaii de decupare / redimensionare. n cea de-a doua parte a sa, cursul este centrat pe conexiunea interdisciplinar dintre informatic i matematic (mai precis geometrie analitic sau computaional). n aceast parte a cursului se urmrete exploatarea principalelor resurse matematice care pot conduce la reprezentri grafice. Astfel, o serie de formule i rezultate teoretice pot fi verificate vizual, ajutnd elevii s neleag esena fenomenelor i nu doar s se limiteze n a opera cu forme fr fundament. n aceast parte se va urmri atingerea unor obiective precum ar fi: reprezentarea grafic a unei figuri geometrice (triunghi, dreptunghi, patrulater, poligon, regulat) i a principalelor linii din aceasta (nlimi, bisectoare, mediane, mediatoare), a cercurilor nscrise, circumscrise, folosirea coordonatelor polare; reprezentarea grafic a unei funcii la o anumit scar (cu factori de scalare egali sau diferii pe OX respectiv pe OY); realizarea unor mici animaii care s ilustreze locuri geometrice; reprezentri grafice de fractali. n continuare voi prezenta o posibil planificare a materiei pentru acest curs opional:

159

Semestrul I: 18 sptmni
Nr. Unitatea de nvare crt.
1 Mediul de programare Visual C++ 2008 Express Edition

Competene specifice
- operarea sub mediul de programare Visual C++ - identificarea componentelor unei aplicaii - stabilirea proprietilor resurselor, modificarea aspectului acestora - asocierea de cod evenimentelor - identificarea elementelor unui obiect - adresarea datelor respectiv funciilor membru ale unui obiect i ale unei clase

Coninuturi
Crearea, salvarea i modificarea unui proiect Uneltele i ferestrele de baz ale mediului de programare Fereastra de design a unui form, ferestrele de proprieti, evenimente, cod surs Obiectele i clasele predefinite ale limbajului Vizualizarea unui obiect n cadrul ferestrei "Class Explorer" Modificarea membrilor unei clase Obiecte statice i obiecte de tip pointer - adresarea membrilor Controale de tip form, label, textbox, button, textarea, combobox, listbox, picturebox, progressbar

Nr. ore

Spt.

1,2,3

Structuri avansate de programare - obiecte i clase

4,5,6

Principalele tipuri de controale ale limbajului Visual C++

Casete de dialog standard ale limbajului Visual C++ Obiecte de tip bitmap

- identificarea principalelor tipuri de controale - modificarea aspectului unui control (proprieti) - modificarea comportamentului unui control (evenimente) - identificarea principalelor tipuri de casete de dialog - utilizarea casetelor de dialog n cadru unui program - familiarizarea cu obiectele grafice de tip bitmap - principalele funcii de manipulare ale unui bitmap

7,8,9

Casete de dialog de tipul MessageBox, Open, Save, FontSelection, ColorBox Declararea i iniializarea unui obiect de tip bitmap ncrcarea i salvarea unei imagini dintr-un fiier n bitmap respectiv din bitmap ntr-un fiier Redimensionarea, tierea, rotirea unei imagini sau a unei poriuni rectangulare din aceasta Accesarea unui bitmap la nivel de pixel Tratarea evenimentelor generate de aciunea mouse-ului Iniializarea i declararea unui obiect de tip graphics pornind de la un obiect deja existent Desenarea principalelor forme: linii, dreptunghiuri, cercuri, elipse, puncte Afiarea de text

10,11, 12

13,14, 15

Obiecte de tip graphics

- familiarizarea cu obiectele de tip graphics - familiarizarea cu principalele funcii de manipulare ale unui obiect de tip graphics

16,17, 18

160

Semestrul al II-lea: 17 sptmni


Nr. Unitatea de nvare crt.
1 Trecerea de la reperul cartezian la reprezentarea grafic ntr-un bitmap

Competene specifice
- familiarizarea cu particularitile reprezentrii grafice pe calculator - reprezentarea unui interval cartezian - alegerea centrului reperului - reprezentarea la scar - familiarizarea cu reprezentarea n coordonatele polare - familiarizarea cu tehnicile de reprezentare ale unei drepte i ale unui segment - utilizarea formulelor matematice adecvate

Coninuturi
Formule de trecere de la reperul cartezian la reprezentarea pe calculator: - alegerea centrului reperului - reprezentarea la scar Formule de reprezentare n coordonate polare Reprezentarea poligoanelor regulate Reprezentarea acelei poriuni de drepte vizibile n intervalul cartezian fixat Intersecia dintre dou drepte Intersecia dintre dou segmente mprirea unui segment n mai multe pri egale Reprezentarea fractalilor de tip linie Koch (stea, spirala), de tip Covor Sierpinski (triunghi, ptrat), de tip arbore Reprezentarea curbelor din puncte foarte apropiate sau din segmente foarte mici interconectate Linii importante n triunghi Cercul nscris ntr-un triunghi Cercul circumscris unui triunghi Crearea cadrelor din care este compus animaia Folosirea obiectului de tip Timer pentru controlul schimbrii cadrelor n vederea realizrii animaiei Reprezentri de locuri geometrice care implic un punct mobil pe o dreapt Reprezentri de locuri geometrice care implic un punct mobil pe un cerc Reprezentarea grafic a fractalului lui Mandelbrot Utilizarea unor palete de culori diverse n reprezentarea fractalului Mandelbrot Realizarea unui "Zoom" matematic ntr-o zon a fractalului

Nr. ore

Spt.

Reprezentarea grafic folosind coordonate polare Reprezentarea grafic a dreptelor i a segmentelor

2,3

4,5

Reprezentarea grafic a principalilor fractali recursivi Reprezentarea grafic a unei funcii matematice Rezolvri de triunghiuri cu reprezentare grafic

- familiarizarea cu modul de construcie a principalilor fractali recursivi - familiarizarea cu tehnicile de reprezentare a unei funcii matematice - familiarizarea cu tehnicile de reprezentare ale unui triunghi - utilizarea formulelor matematice adecvate - utilizarea cadrelor multiple - proiectarea pailor animaiei

6,7,8

5 6

9,10

11,12

Realizarea unei animaii folosind cadre multiple

13

Reprezentri animate ale unor locuri geometrice

- identificarea pailor reprezentrii - utilizarea formulelor matematice adecvate

14,15

Reprezentarea unui fractal complex: fractalul lui Mandelbrot

- familiarizarea cu modul de construcie a fractalului Mandelbrot - utilizarea formulelor matematice adecvate

16,17

161

S-ar putea să vă placă și