Sunteți pe pagina 1din 384

Ministerul Educaiei, Cercetrii i Tineretului

Vlad Tudor Huanu


Carmen Popescu

Manual de

PENTRU CLASA A XII-A

filiera teoretic, profil real, specializarea: matematic-informatic,


intensiv informatic

Aprobat prin ordinul MEdCT nr. 1561/83 din 23.07.2007

L&S Info-mat
Copyright 2007-2016 L&S INFO-MAT

Toate drepturile asupra acestei lucrri aparin editurii L&S INFO-MAT.


Reproducerea integral sau parial a textului din aceast carte este posibil
doar cu acordul n scris al editurii L&S INFO-MAT.

Manualul a fost aprobat prin Ordinul Ministrului Educaiei, Cercetrii i Tineretului


nr. 1561 / 83 din 23.07.2007 n urma evalurii calitative i este realizat n
conformitate cu programa analitic aprobat prin Ordin al ministrului Educaiei i
Cercetrii nr. 5959 din 22.12.2006.

Refeni tiinifici:
Prof. Gradul I Carmen Minc, Colegiul Naional Sf. Sava", Bucureti
Prof .Gradul I, Enciu Magdalena, Colegiul Naional Octav Onicescu, Bucureti

Tiparul executat la S.C. LuminaTipo S.R.L.


Str. Luigi Galvani nr. 20 bis, Sector 2, Bucureti,
office@luminatipo.com

Editura L&S INFO-MAT:


Adresa: Str. Stnjeneilor nr. 6, bl. 30, sc. A, et. 1, apt. 11, sector 4, Bucureti;
Mobil: 0722-573701; 027.731.947;
E-mail: office@ls-infomat.ro;
Web Site: www.ls-infomat.ro.
CUPRINS

Partea I. Baze de date 7


Capitolul 1. Proiectarea bazelor de date 7
1.1. Noiuni introductive 8
1.2. Normalizarea datelor 22
1.3. Implementarea modelului conceptual 29
1.4. Managementul de proiect 41
Teme de proiect 45

Partea a II-a. Programare WEB 47


Capitolul 2. Limbajul MySQL 47
2.1. Ce este i de ce nvm MySQL ? 48
2.2. Cum rulm MySQL pe propriul calculator ? 49
2.3. Crearea unei baze de date 50
2.4. Tabele. Noiuni elementare 51
2.5. Tipuri de date n MySQL 53
2.6. Operatori utilizai n MySQL 57
2.7. Funcii MySQL 62
2.8. Afiarea coloanelor care rezult n urma unui calcul 65
2.9. Valoarea NULL 66
2.10. Valori implicite 68
2.11. Cheie primar i cheie unic 69
2.12. Autoincrementare 71
2.13. Sortarea datelor 72
2.14. Filtrarea datelor 73
2.15. Actualizri ntr-un tabel 74
2.16. Funcii agregate 77
2.17. Utilizarea subinterogrilor 78
2.18. Gruparea datelor 80
2.19. Uniuni de tabele 82
2.20. Elemente care privesc securitatea bazelor de date 85
Probleme Propuse 86
4 Manual de Informatic pentru clasa a XII-a

Capitolul 3. Primii pai ctre construcia unui site 90


3.1. Ce este Internetul ? 91
3.2. Protocolul TCP/IP 92
3.3. Despre site-uri 94
3.4.Un program care ruleaz sub FTP 97
3.5. Cum scriem un fiier HTML ? 99
Teste recapitulative 103

Capitolul 4. HTML, CSS primele noiuni 104


4.1. Structura de baz a unei pagini HTML+CSS 105
4.2. Elemente HTML pentru afiarea textelor 109
4.3. Atribute CSS pentru font-uri 114
4.4. Atribute CSS pentru texte 115
4.5. Liste 117
4.6. Structura unui element HTML 120
4.7. Atribute de culoare i fond 122
4.8. Atribute pentru margini 125
4.9. Atribute pentru padding 125
4.10. Atribute pentru bordur 125
4.11. Elementul IMG 126
4.12. Tabele 128
4.13. Hiperlegturi (link-uri) 133
4.14. Hri imagine 140
4.15. Elementele BASE, META i SCRIPT 145
4.16. Cadre (FRAMESET, FRAME i IFRAME) 147
4.17. Elementul MARQUEE 152
4.18. Aezarea implicit n pagin a diverselor elemente 153
4.19. Alte modaliti de aezare n pagin a elementelor 155
4.20. Atributul z-index 157
4.21. Atributul display 159
4.22. Caractere HTML 160
4.23. Aspecte generale ale proiectrii interfeelor web 161
Probleme propuse 165

Capitolul 5. Limbajul PHP 169


5.1. Introducere 170
5.2. Formulare 172
5.3. Elementul TEXTAREA 176
5.4. Elementul SELECT 176
5.5. Constante. Variabile. Operatori 177
5.6. Instruciunile limbajului PHP 181
Cuprins 5

5.7. Funcii n PHP 184


5.8. Funcii matematice 187
5.9. Afiarea datelor - echo i print 188
5.10. Funcii pentru prelucrarea irurilor de caractere 189
5.11. Masive n PHP 192
5.12. Variabile cookie 195
5.13. Utilizarea n comun a limbajelor PHP i MySQL 197
5.14. Aplicaii 203
5.15. Proiectarea paginilor web 212
Probleme propuse 213
Teme de proiect 215

Partea a III-a. Programare orientat pe obiecte i


programare vizual 216

Capitolul 6. Iniiere n utilizarea limbajului Java 216


6.1. Cum instalm Java ? 217
6.2. Primul program 219
6.3. Conceptul de Main Virtual Java (JVM) 220
6.4. Tipuri de aplicaii Java 221
6.5. Comentarii 222
6.6. Afiarea irurilor de caractere 222
6.7. Tipuri de date 222
6.8. Operatori 225
6.9. Instruciuni 234
6.10. Masive 240
6.11. Citirea datelor de la tastatur 244
Probleme rezolvate 246
6.12. Date membru 248
6.13. Metode 248
6.14. Exemple de utilizare a metodelor 251
6.15. Suprancrcarea metodelor 252
Capitolul 7. Programare orientat pe obiecte 253
7.1. Principiile programrii orientate pe obiecte 254
7.2. Constructori 256
7.3. Date membru statice i metode statice 258
7.4. Cuvntul cheie this 259
7.5. Referine ctre obiecte 259
7.6. Masive de obiecte 261
7.7. Aplicaii ale noiunilor prezentate. Lucrul cu numere raionale 263
7.8. Studiul unor clase din limbajul Java 267
7.9. Extinderea claselor (motenirea) 276
7.10. Polimorfism 282
6 Manual de Informatic pentru clasa a XII-a

7.11. Clase abstracte 287


7.12. Interfee 290
7.13. Specificatori de acces (modificatori de acces) 293
7.14. Excepii (tratarea erorilor) 296
Probleme propuse 305

Capitolul 8. Programare vizual 311


8.1. Conceptele de baz ale programrii vizuale n Java 312
8.2. Studiul principalelor componente 326
8.3. Obiecte grafice. Clasa Graphics 351
8.4. Accesarea i prelucrarea datelor 356
Probleme propuse 363
Teme de proiect 366

Anexa 1. Instalarea programelor Apache, PHP i MySQL 367

Anexa 2. Dezvoltarea profesional n domeniul IT 369

Anexa 3. Caractere HTML 377

Indicaii / Rspunsuri 380


PARTEA I CAPITOLUL
Proiectarea bazelor de date

n acest prim capitol vei studia principiile generale ale proiectrii


bazelor de date, v vei familiariza cu diversele anomalii care pot invalida
bazele de date, precum i cu modalitile de evitare ale acestora.
De asemenea, se va defini modelul conceptual al unei baze de date.
n ultima parte a capitolului, vor fi prezentate etapele realizrii
unui proiect, avantajele lucrului n echip i vei nva cum
s pregtii i s susinei o prezentare n faa publicului.

Ce este modelul conceptual i care este rolul su ?


Ce este un ERD ?
Ce este o entitate i cum se reprezint ea ntr-un ERD ?
Ce este o instan ?
Ce sunt i cum se stabilesc atributele unei entiti ?
Cum se stabilesc relaii ntre entiti ?
Ce tipuri de relaii pot exista ntre entiti ?
Cum se reprezint relaiile n ERD ?
Normalizarea datelor
Cum se implementeaz modelul conceptual ?
Managementul de proiect

Cuvinte cheie: dat, informaie, cunotin, analiz, model


conceptual, entitate, instan, atribut, identificator unic, relaie,
normalizare, mapare, integritate, proiect, echip, prezentare
8 Manual de Informatic pentru clasa a XII-a

1.1. Noiuni introductive

1.1.1. Date. Informaii. Cunotine

Auzim adesea vorbindu-se despre era informaiilor sau societatea


informaional sau tehnologia informaiei, ns de multe ori cuvntul "informaie"
este folosit fr a-i nelege clar sensul, diferena dintre date, informaii sau
cunotine.
n general, coninutul gndirii umane opereaz cu urmtoarele concepte:
Date constau n material brut, fapte, simboluri, numere, cuvinte, poze
fr un neles de sine stttor, neintegrate ntr-un context, fr relaii cu
alte date sau obiecte. Ele se pot obine n urma unor experimente,
sondaje, etc.
Informaii prin prelucrarea datelor i gsirea relaiilor dintre acestea
se obin informaii care au un neles i sunt integrate ntr-un context.
Datele, organizate i prezentate ntr-un mod sistematic pentru a
sublinia sensul acestora, devin informaii. Pe scurt, informaiile sunt
date prelucrate. Informaiile se prezint sub form de rapoarte,
statistici, diagrame, etc.
Cunotine colecii de date, informaii, adevruri i principii nvate,
acumulate de-a lungul timpului. Informaiile despre un subiect, reinute
i nelese, ce pot fi folosite n luarea de decizii, care pot forma judeci
i opinii, devin cunotine. Cu alte cuvinte, cunotinele apar n
momentul utilizrii informaiei.

1.1.2. Colectarea i analizarea datelor. Modelul conceptual

Primul pas n realizarea unei aplicaii de baze de date este analiza datelor i
realizarea unei scheme conceptuale (model conceptual) ale acestora.
n aceast etap sunt analizate natura i modul de utilizare a datelor. Sunt
identificate datele care vor trebui memorate i procesate, se mpart n grupuri
logice i se identific relaiile care exist ntre aceste grupuri.
Analiza datelor este un proces uneori dificil, care necesit mult timp, ns
este o etap obligatorie. Fr o analiz atent a datelor i a modului de utilizare a
acestora, vom realiza o baz de date care, putem constata n final, c nu
ntrunete cerinele beneficiarului. Ideea de baz a analizei datelor i a construirii
modelului conceptual este "s msori de dou ori i s tai o singur dat".
Informaiile necesare realizrii modelului conceptual se obin folosind
metode convenionale precum intervievarea oamenilor din cadrul organizaiei i
studierea documentelor folosite.
Capitolul 1. Proiectarea bazelor de date 9

Odat obinute aceste informaii, ele trebuie reprezentate ntr-o form


convenional care s poat fi uor neleas de toat lumea. O astfel de
reprezentare este diagrama entiti-relaii, numit i harta relaiilor sau ERD-ul
(Entity Relationship Diagram). Aceste scheme sunt un instrument util care uureaz
comunicarea ntre specialitii care proiecteaz bazele de date i programatori, pe de
o parte i beneficiari, pe de alt parte. Acetia din urm pot nelege cu uurin o
astfel de schem, chiar dac nu sunt cunosctori n domeniul IT.
n cele ce urmeaz, vom prezenta principalele elemente care intr n
componena unui ERD precum i conveniile de reprezentare a acestora.

1.1.3. Entiti. Instane. Atribute. Identificator unic

O entitate este un lucru, obiect, persoan sau eveniment care are


semnificaie pentru afacerea modelat, despre care trebuie s colectm i s
memorm date. O entitate poate fi un lucru real, tangibil precum o cldire, o
persoan, poate fi o activitate precum o programare sau o operaie sau poate fi o
noiune abstract.
O entitate este reprezentat n ERD printr-un dreptunghi cu colurile
rotunjite. Numele entitii este ntotdeauna un substantiv la singular i se scrie n
partea de sus a dreptunghiului cu majuscule, ca n Fig. 1.1:

PROFESOR PACIENT ELEV

Figura 1.1. Exemple de entiti i modul de reprezentare

O entitate este de fapt o clas de obiecte i pentru orice entitate exist mai
multe instane ale sale. O instan a unei entiti este un obiect, o persoan, un
eveniment particular din clasa de obiecte care formeaz entitatea. De exemplu,
elevul X din clasa a IX-a A de la Liceul de Informatic din localitatea Y este o
instan a entitii ELEV.

Dup cum se vede, pentru a preciza o instan a unei entiti, trebuie s


specificm unele caracteristici ale acestui obiect, s-l descriem (s precizm de
exemplu numele, clasa, coala, etc.). Aadar, dup ce am identificat entitile
trebuie s descriem aceste entiti n termeni reali, adic s le stabilim atributele.
Un atribut este orice detaliu care servete la identificarea, clasificarea,
cuantificarea, sau exprimarea strii unei instane a unei entiti. Atributele sunt
informaii specifice ce trebuie cunoscute i memorate.
De exemplu, atributele entitii ELEV sunt numele, prenumele, adresa,
numrul de telefon, adresa de e-mail, data naterii, etc.
10 Manual de Informatic pentru clasa a XII-a

n cadrul unui ERD, atributele se vor scrie imediat


sub numele entitii, cu litere mici. Un atribut este un ELEV
substantiv la singular (vezi Fig. 1.2). # cnp
* nume
* prenume
* data_nasterii
* adresa
telefon
Figura 1.2. Exemplu e-mail
de entitate

Un atribut poate fi obligatoriu sau opional. Dac un atribut este


obligatoriu, pentru fiecare instan a entitii respective trebuie s avem o valoare
pentru acel atribut: de exemplu, este obligatoriu s cunoatem numele elevilor.
Pentru un atribut opional putem avea instane pentru care nu cunoatem valoarea
atributului respectiv. De exemplu, atributul e-mail al entitii ELEV este opional,
un elev putnd s nu aib adres de email. Un atribut obligatoriu este precedat n
ERD de un asterisc *, iar un atribut opional va fi precedat de un cercule o.

Atributele care definesc n mod unic instanele unei entiti se numesc


identificatori unici (UID). UID-ul unei entiti poate fi compus dintr-un singur atribut,
precum codul numeric personal ce poate fi un identificator unic pentru entitatea ELEV.
n alte situaii, identificatorul unic este compus dintr-o combinaie de dou sau mai
multe atribute. De exemplu, combinaia dintre titlu, numele autorului i data apariiei
poate forma unicul identificator al entitii CARTE. Oare combinaia titlu i nume autor
nu era suficient? Rspunsul este NU, deoarece pot exista mai multe volume scrise de
Mihai Eminescu avnd toate titlul Poezii, dar aprute la date diferite.
Atributele care fac parte din identificatorul unic al
unei entiti vor fi precedate de semnul diez # (vezi CARTE
Fig. 1.2 i Fig. 1.3).
# titlu
# autor
# data_aparitiei
* format
* numar_pagini
Figura 1.3. Alt exemplu
de entitate

Observaie ! Atributele din UID sunt ntotdeauna obligatorii, ns semnul # este


suficient, nu mai trebuie pus i un semn asterisc n faa acestor atribute.
Valorile unor atribute se pot modifica foarte des, ca de exemplu atributul
vrst. Spunem, n acest caz, c avem de a face cu un atribut volatil. Dac
valoarea unui atribut ns se modific foarte rar sau deloc (de exemplu data
naterii) acesta este un atribut non-volatil. Evident este de preferat s folosim
atribute non-volatile atunci cnd acest lucru este posibil.
Capitolul 1. Proiectarea bazelor de date 11

Identificai entitile pentru urmtoarele scenarii. Identificai apoi pentru


fiecare entitate atributele sale, stabilii opionalitatea acestora i precizai unicul
identificator al fiecrei entiti.
Indicaie. Subliniai substantivele care au semnificaie pentru afacerea descris.
Un substantiv va fi subliniat doar la prima sa apariie. Dintre aceste substantive vei
alege apoi entitile.
1. Pentru a se abona la diverse reviste, persoanele doritoare trebuie s
furnizeze numele, adresa i un numr de telefon. Fiecare revist este identificat
prin titlu, numrul volumului i data apariiei. Abonaii semneaz pentru abonare un
contract pe o anumit perioad de timp specificat prin data de nceput a
abonamentului i data final. Bineneles c o persoan se poate abona la mai
multe reviste n acelai timp.
2. Despre angajaii unei firme se cunoate numele, titlul, numrul de telefon
de la birou. Angajaii pot fi implicai ntr-o serie de proiecte ce se desfoar n
cadrul firmei. Despre fiecare proiect se cunoate numele, data la care a demarat
proiectul i se poate cunoate o dat la care se va finaliza proiectul. La fiecare
proiect lucreaz un singur angajat, ns un angajat poate fi implicat n mai multe
proiecte. Fiecare angajat are un manager, cu excepia directorului. Managerii pot fi
i ei implicai n proiecte.

1.1.4. Relaii ntre entiti

n lumea real, obiectele nu exist izolat. Percepem obiectele din lumea


real doar n conexiune cu alte obiecte, de exemplu vom spune 'pmntul se
nvrte n jurul soarelui', 'el este medic', etc.
Aadar, dup ce ai identificat care sunt entitile i atributele acestor entiti,
este timpul s punem n eviden relaiile care exist ntre aceste entiti, modul n
care acestea comunic ntre ele. O relaie este o asociere, legtur sau conexiune
existent ntre entiti i care are o semnificaie pentru afacerea modelat.
Orice relaie este bidirecional, legnd dou entiti sau o entitate cu ea nsi.
De exemplu, elevii studiaz mai multe materii, o materie e studiat de ctre elevi.
Orice relaie este caracterizat de urmtoarele elemente:
- numele relaiei;
- opionalitatea relaiei;
- gradul (cardinalitatea) relaiei.
12 Manual de Informatic pentru clasa a XII-a

S lum ca exemplu relaia existent ntre entitile JUCTOR i ECHIP.


Vom spune:
Un JUCTOR joac ntr-o ECHIP.
Numele relaiei este: joac.
Pentru a stabili opionalitatea relaiei trebuie s rspundem la urmtoarele
ntrebri: un juctor trebuie s joace ntr-o echip? Se poate ca un juctor s nu
joace n nicio echip?
Dac acceptm faptul c toi juctorii trebuie s joace ntr-o echip, relaia
este obligatorie sau mandatorie i vom spune c:
Un JUCTOR trebuie s joace ntr-o ECHIP.

Dac ns acceptm c exist juctori care nu joac n nicio echip (de


exemplu, li s-a terminat contractul i n momentul de fa nu mai joac la nicio
echip), atunci relaia este opional. n acest caz, vom spune c:
Un JUCTOR poate juca la o ECHIP.

Cardinalitatea relaiei este dat de numrul de instane ale entitii din


partea dreapt a relaiei care pot intra n relaie cu o instan a entitii din partea
stng a relaiei. Adic va trebui s rspundem la ntrebri de genul: la cte echipe
poate juca un juctor? Rspunsurile posibile sunt unul i numai unul sau unul
sau mai muli. Vom spune:
Un JUCTOR trebuie/poate s joace la o ECHIP i numai una.
sau
Un JUCTOR trebuie/poate s joace la una sau mai multe ECHIPE.

Cea mai realist variant a relaiei dintre JUCTOR i ECHIP este aadar:

Un JUCTOR poate s joace la o ECHIP i numai una.

Am precizat ns mai nainte c orice relaie este bidirecional. Relaia


dintre ECHIP i JUCTOR o putem enuna astfel:

La o ECHIP trebuie s joace unul sau mai muli JUCTORI.

1.1.4.1. Convenii de reprezentare a relaiilor

n cadrul diagramei entiti-relaii, o relaie va fi reprezentat printr-o linie ce


unete cele dou entiti. Deoarece o relaie este bidirecional, linia ce unete cele
dou entiti este compus din dou segmente distincte, cte unul pentru fiecare
entitate. Tipul segmentului ce pleac de la o entitate ne va indica opionalitatea
relaiei dintre aceast entitate i entitatea aflat n cealalt parte a relaiei. Dac
acest segment este continuu este vorba de o relaie obligatorie, o linie ntrerupt
indic o relaie opional.
Capitolul 1. Proiectarea bazelor de date 13

De exemplu, n Fig. 1.4 segmentul ce pleac de la entitatea JUCTOR, fiind


ntrerupt, nseamn c un juctor poate juca la o echip, adic relaia este
opional. Segmentul ce pleac dinspre entitatea ECHIP este continuu, deci la o
echip trebuie s joace juctori.

Figura 1.4. Reprezentarea relaiilor

Modul n care o linie se termin spre o entitate este important. Dac se


termin printr-o linie simpl, nseamn c o instan i numai una a acestei entiti
este n relaie cu o instan a celeilalte entiti. n exemplul anterior, linia de la
JUCATOR la ECHIPA se termin n partea dinspre ECHIPA cu o linie simpl, deci
un juctor joac la o echip i numai una.
Dac linia se termin cu trei linii (picior de cioar), nseamn c mai multe
instane ale entitii pot corespunde unei instane a celeilalte entiti. n exemplul
anterior, linia de la ECHIP la JUCTOR se termin cu piciorul de cioar,
nseamn c unei instane a entitii ECHIP i corespund mai multe instane ale
entitii JUCTOR, adic o echip are unul sau mai muli juctori.

Caracteristica relaiei Valoare Mod de reprezentare


Numele relaiei un verb se scrie deasupra relaiei
relaie obligatorie linie continu
(TREBUIE)
Opionalitatea
relaie opional linie ntrerupt
(POATE)
linie simpl
una i numai una
Cardinalitatea picior de cioar
una sau mai multe

Tabelul 1.1. Moduri de reprezentare a unei relaii

1.1.4.2. Tipuri de relaii

Variantele de relaii ce pot exista ntre dou entiti sunt prezentate mai jos:
- relaii one-to-one acest tip de relaie este destul de rar ntlnit
uneori, astfel de relaii pot fi modelate transformnd una dintre entiti
n atribut al celeilalte entiti.
- relaii one-to-many sunt cele mai ntlnite tipuri de relaii, ns i aici,
cazurile c) i d) prezentate n Fig. 1.6, sunt mai puin uzuale;
14 Manual de Informatic pentru clasa a XII-a

Figura 1.5. Exemple de relaii one-to-one

Figura 1.6. Exemple de relaii one-to-many

- relaii many-to-many aceste tipuri de relaii apar n prima faz a


proiectrii bazei de date, ns ele trebuie s fie ulterior eliminate. Fig. 1.7
prezint cteva exemple de astfel de relaii.

Figura 1.7. Exemple de relaii many-to-many


Capitolul 1. Proiectarea bazelor de date 15

1.1.5. Rezolvarea relaiilor many-to-many

Dup cum am precizat anterior, relaiile many-to-many pot aprea ntr-o


prim faz a proiectrii bazei de date, ns ele nu au voie s apar n schema final.
S considerm relaia dintre entitile STUDENT i CURS (vezi Fig. 1.8). Se
tie c orice curs se termin n general cu un examen. Unde vom memora nota
studentului la fiecare examen?

Figura 1.8. Exemplu de relaie many-to-many

Dac ncercm s introducem atributul nota la entitatea STUDENT, nu vom


ti crei materii i corespunde acea not, ntruct unei instane a entitii STUDENT
i corespund mai multe instane ale entitii CURS. Invers, dac ncercm s
memorm nota n cadrul entitii CURS, nu vom ti crui student i aparine acea
not.
Rezolvarea unei relaii many-to-many const introducerea unei noi entiti
numit entitate de intersecie, pe care o legm de entitile originale prin cte o
relaie one-to-many.
Paii n rezolvarea unei relaii many-to-many sunt urmtorii:
se gsete entitatea de intersecie - pentru exemplul nostru, vom introduce
entitatea INSCRIERE:

Figura 1.9. Rezolvarea relaiilor many-to-many, pasul 1


16 Manual de Informatic pentru clasa a XII-a

crearea noilor relaii:


o opionalitatea: relaiile care pleac din entitatea de intersecie sunt
ntotdeauna obligatorii n aceast parte. n partea dinspre entitile
originale, relaiile vor pstra opionalitatea relaiilor iniiale.
o cardinalitatea: ambele relaii sunt de tip one-to-many, iar partea cu
many va fi ntotdeauna nspre entitatea de intersecie.
o numele noilor relaii:

Figura 1.10. Rezolvarea relaiilor many-to-many, pasul 2

adugarea de atribute n cadrul entitii de intersecie, dac acestea exist.


n exemplul nostru ne poate interesa, s spunem, data la care s-a nscris un
student la un curs, data la care a finalizat cursul, precum i nota obinut la
sfritul cursului.

Figura 1.11. Rezolvarea relaiilor many-to-many, pasul 3


Capitolul 1. Proiectarea bazelor de date 17

stabilirea identificatorului unic pentru entitatea de intersecie: dac entitatea


de intersecie nu are un identificator unic propriu, atunci acesta se poate
forma din identificatorii unici ai entitilor iniiale, la care putem aduga
atribute ale entitii de intersecie.
n exemplul nostru, identificatorul unic al entitii de intersecie este format
din id-ul studentului, id-ul cursului i data nscrierii la curs.
Faptul c identificatorul unic al unei entiti preia identificatorul unic din alt
entitate cu care este legat este reprezentat grafic prin bararea relaiei
respective, nspre entitatea care preia UID-ul celeilalte entiti:

Figura 1.12. Rezolvarea relaiilor many-to-many, pasul 4

1. O baz de date va memora orarul unei universiti. Fiecare curs este parte a
unui modul, iar fiecrui curs i este asociat exact un profesor. La fiecare curs
particip mai muli studeni.
Fiecare poziie din orar corespunde unei zile a sptmnii i unei anumite
ore. Fiecare poziie din orar dureaz exact o or, dar uneori un curs poate dura mai
multe ore consecutive, ns nici un curs nu poate aprea n zile diferite sau la ore
diferite neconsecutive ale aceleiai zile.
Fiecare profesor i fiecare student pot avea mai multe ore de curs la care
particip n decursul unei sptmni.
18 Manual de Informatic pentru clasa a XII-a

Care dintre urmtoarele variante NU este o soluie posibil a acestei probleme ?


a) Se stabilete o relaie one-to-many ntre CURS i POZITIE_ORAR;
b) Se stabilete o relaie many-to-many ntre CURS i POZITIE_ORAR;
c) Pentru fiecare curs vom avea un atribut start care reine ora de ncepere
a cursului i un atribut durat care memoreaz numrul de poziii
consecutive din orar "ocupate" de acel curs;
d) Pentru fiecare curs vom avea dou atribute primul i ultimul care
memoreaz prima i respectiv ultima poziie din orar ocupat de acel
curs.

2. Fie urmtoarea hart a relaiilor:

Figura 1.13. Relaia propus pentru problema 2

Cum se citete corect relaia dintre CLIENT i MAINA?


a) Fiecare CLIENT poate s nchirieze o MAIN i numai una.
b) Fiecare CLIENT trebuie s nchirieze o MAIN i numai una.
c) Fiecare CLIENT poate s nchirieze una sau mai multe MAINI.
d) Fiecare CLIENT trebuie s nchirieze una sau mai multe MAINI.

3. Numele unei entiti este de obicei:


a) un verb; b) un substantiv ; c) un adverb; d) orice cuvnt.

4. Care dintre urmtoarele variante NU poate reprezenta un atribut al entitii


PANTOF?
a) culoare; b) mrime; c) model; d) clasa.

5. Care dintre urmtoarele fraze pot fi citite din schema de mai jos?

Figura 1.14. Relaia propus pentru problema 5


Capitolul 1. Proiectarea bazelor de date 19

a) Un student poate s urmeze mai multe cursuri.


b) Un curs poate fi urmat de mai muli studeni.
c) Un student trebuie s urmeze un singur curs.
d) Un curs trebuie s fie urmat de un student.

6. Ce semnificaie are piciorul de cioar ( ) n cadrul unui ERD?


a) relaia este obligatorie;
b) relaia este opional;
c) pot exista una sau mai multe instane ale entitii lng care apare
semnul n relaie cu o instan a celeilalte entiti;
d) niciuna din variantele anterioare.

1. Completai n tabelul urmtor, n prima coloan, cte un exemplu de entitate a


crui atribut este specificat n coloana a doua:

Entitate Atribut
culoare
nr_calorii
volum

Tabelul 1.2.

2. Citii, n ambele sensuri, urmtoarele relaii. Din ce atribute este compus UID-ul
fiecrei entiti?

Figura 1.15. Relaiile propuse pentru problema 2


20 Manual de Informatic pentru clasa a XII-a

3. Rezolvai urmtoarele relaii many-to-many:

Figura 1.16. Relaiile propuse pentru problema 3

4. Dai dou exemple de relaii one-to-many.

(vezi baremele de notare i de corectare de la pag. 380)

1. Reluai aplicaiile de la pagina 11 i stabilii relaiile dintre entitile de la fiecare


exerciiu. Rezolvai apoi eventualele relaii many-to-many. Verificai s nu existe
relaii redundante n schemele obinute.

Pentru scenariile de la punctele 2-5, determinai entitile, atributele acestora i


relaiile dintre entiti. Desenai harta relaiilor pentru fiecare exerciiu n parte.

2. O firm produce mai multe tipuri de maini, un model fiind caracterizat printr-un
nume, mrimea motorului i un sufix care indic gradul de lux al acesteia (de
exemplu XL, GL). Fiecare model este construit din mai multe pri, fiecare parte
putnd fi folosit pentru construirea mai multor modele de maini. Fiecare parte are
o descriere i un cod. Fiecare model de main este produs de exact o fabric a
firmei, fabric ce se poate gsi n una din rile UE.

O fabric poate produce mai multe modele de maini i mai multe tipuri de pri
componente. De asemenea, fiecare tip de parte component poate fi produs de o
singur fabric a firmei.
Capitolul 1. Proiectarea bazelor de date 21

3. O universitate are n componena sa mai multe faculti, fiecare facultate avnd


mai multe departamente. Fiecare departament ofer studenilor mai multe cursuri.
Un profesor poate lucra la un singur departament al unei singure faculti. Fiecare
curs are mai multe seciuni, iar o seciune poate s fac parte din mai multe
cursuri. Un profesor poate preda mai multe seciuni, din acelai curs sau din
cursuri diferite, dar o seciune poate fi predat de mai muli profesori.

4. La o facultate este nevoie s se memoreze date despre studeni, cursuri i


seciunile fiecrui curs. Fiecare student are un nume, un numr de identificare,
adresa de acas, adresa temporar, pentru cei care nu fac facultatea n localitatea
lor. Un student poate opta s urmeze un curs ntreg sau doar anumite seciuni ale
unui curs. De asemenea, el poate urma mai multe cursuri i/sau seciuni de curs
simultan. Un curs poate avea mai multe seciuni, dar o seciune poate fi parte a
mai multor cursuri.

5. Angajaii unei firme sunt redistribuii la diferitele departamente din cadrul firmei.
Dorim ca n baza de date s memorm, pentru fiecare angajat, departamentul la
care lucreaz acum, dar i departamentul la care a lucrat prima dat, la angajarea
n firm.
22 Manual de Informatic pentru clasa a XII-a

1.2. Normalizarea datelor

1.2.1. Ce este normalizarea?

Normalizarea este o tehnic de proiectare a bazelor de date prin care se


elimin (sau se evit) anumite anomalii i inconsistene ale datelor. O baz de date
bine proiectat nu permite ca datele s fie redundante, adic aceeai informaie s
se gseasc n locuri diferite sau s se memoreze n baza de date informaii
care se pot deduce pe baza altor informaii memorate n baza de date. Anomaliile
care pot s apar la o baz de date nenormalizat sunt urmtoarele:
- anomalii la actualizarea datelor nchipuii-v c la secretariatul colii
voastre sunt memorate ntr-o tabel informaiile despre toi elevii colii:
nume, adres, telefon, etc. De asemenea, la biblioteca colii exist fiele
voastre tot ntr-o tabel. Aceste fie conin numele, prenumele, adresa,
telefonul, data nscrierii la bibliotec, etc. Acum cteva zile v-ai schimbat
domiciliul. Noua adres trebuie modificat att la secretariat ct i n fia
de la bibliotec i n toate locurile n care aceast informaie apare. Dac
modificarea nu se produce n unul dintre aceste locuri (fie c ai uitat s
anunai, fie din alte motive), datele devin inconsistente.
Alt scenariu: la o bibliotec se nregistreaz ntr-o tabel urmtoarele
date despre cri: ISBN, titlu, autor, pre, subiect, editur i adresa
editurii. La un moment dat, o editur i schimb adresa. Bibliotecara va
trebui s modifice adresa editurii respective n nregistrrile corespun-
ztoare tuturor crilor din bibliotec aprute la respectiva editur. Dac
aceast modificare nu se face cu succes, unele dintre nregistrri
rmnnd cu vechea adres, apare din nou o inconsisten a datelor.
- anomalii de inserare n exemplul anterior, nu vom putea memora
adresa unei edituri, lucru inacceptabil dac dorim s avem informaii i
despre edituri a cror cri nu le avem n bibliotec, eventual de la care
dorim s facem comenzi.
- anomalii de tergere s presupunem c ntr-o tabel memorm
urmtoarele informaii: codul studentului, codul cursului i codul
profesorului. La un moment dat, niciun student nu mai dorete s
participe la un anume curs. tergnd toate nregistrrile corespunztoare
cursului, nu vom mai putea ti niciodat cine preda acel curs.
Conceptul de normalizare a bazelor de date a fost pentru prima dat introdus de
ctre Edgar Frank Codd . Formele normale ofer indicaii pe baza crora putei decide
1

dac un anumit ERD este bine proiectat, neexpus anomaliilor i inconsistenelor. n


principiu, normalizarea implic descompunerea unei entiti n dou sau mai multe
entiti, prin compunerea crora se pot obine exact aceleai informaii.

1
http://www.acm.org/classics/nov95/toc.html
Capitolul 1. Proiectarea bazelor de date 23

Formele normale se aplic fiecrei entiti n parte. O baz de date (sau un


ERD) se gsete ntr-o anumit form normal doar dac toate entitile se gsesc
n acea form normal.
Edgar Codd a definit primele trei forme normale 1NF, 2NF i 3NF. Ulterior,
s-au mai definit formele normale 4NF, 5NF i 6NF care ns sunt rar folosite n
proiectarea bazelor de date.

1.2.2. Prima form normal (1NF)

O entitate se gsete n prima form normal dac i numai dac:


- nu exist atribute cu valori multiple;
- nu exist atribute sau grupuri de atribute care se repet.

Cu alte cuvinte, toate atributele trebuie s fie atomice, adic s conin o


singur informaie.
Dac un atribut are valori multiple, sau un grup de atribute se repet, atunci
trebuie s creai o entitate suplimentar pe care s o legai de entitatea original
printr-o relaie de 1:m. n noua entitate vor fi introduse atributele sau grupurile de
atribute care se repet.
S considerm entitatea din Fig. 1.17, referitoare la notele elevilor unei
clase. Cteva observaii referitoare la aceast entitate: cte discipline studiaz un
elev? Cte perechi (disciplina, nota) va trebui s aib entitatea ELEV? S spunem
c tim exact numrul maxim de discipline pe care le poate studia un elev. Ce se
ntmpl dac n anul colar viitor acest numr de discipline va fi mai mare? n
plus, la o materie un elev poate avea mai multe note. Cte note? Cum memorm
aceste note? Le punem n cmpul corespunztor disciplinei cu virgul ntre ele?
Cum rezolvm aceast problem? Vom crea o nou entitate n care vom
introduce disciplina i nota la disciplina respectiv (vezi Fig. 1.18).
n acest fel, fiecrui elev i pot corespunde oricte note, iar la o disciplin
poate avea oricte note, singura restricie conform acestui model fiind c un elev
nu va putea primi n aceeai zi, la aceeai materie, mai multe note.
S considerm un alt exemplu. Pentru managementul unui proiect este
important s tim pentru fiecare membru al echipei care sunt abilitile de care dispune,
pentru a cunoate modul n care s atribuim sarcinile n cadrul grupului. ntr-o prim
etap, am proiectat o entitate ANGAJAT, care are un atribut abiliti, ca n Fig. 1.19.

ns se tie c fiecare angajat are mai multe abiliti pe care dorim s le


memorm. Aadar, atributul abiliti nu respect prima form normal. n
consecin, vom crea o nou entitate ABILITATE n care vom memora toate
abilitile fiecrui angajat (vezi Fig. 1.20).
24 Manual de Informatic pentru clasa a XII-a

Figura 1.17 Figura 1.18

Figura 1.19 Figura 1.20

1.2.3. A doua form normal (2NF)

O entitate se gsete n a doua form normal dac i numai dac se


gsete n prima form normal i n plus, orice atribut care nu face parte din UID
(Unique IDentifier) va depinde de ntregul UID, nu doar de o parte a acestuia.
De exemplu, dac memorm angajaii unui departament ntr-o entitate ca mai jos:

Figura 1.21. Exemplu de entitate

Se observ c data_nasterii i adresa sunt dou atribute care depind


doar de id-ul angajatului, nu de ntregul UID care este combinaia dintre atributele
id_dep i id_angajat. Aceast situaie se rezolv prin crearea unei noi entiti
ANGAJAT, pe care o legm de entitatea DEPARTAMENT printr-o relaie 1:m.
Capitolul 1. Proiectarea bazelor de date 25

Figura 1.22. Relaia ntre cele dou entiti

O situaie mai special este n cazul relaiilor barate, cnd trebuie inut
seama c UID-ul unei entiti este compus din atribute din entitatea respectiv,
plus un atribut sau mai multe provenite din relaia barat. S considerm urmtorul
exemplu:

Figura 1.23. Exemplu de relaie barat

Se observ c UID-ul entitii APARTAMENT este compus din combinaia a


trei atribute: numrul apartamentului, numrul blocului i strada. Deci, toate
atributele din entitatea APARTAMENT care nu fac parte din UID, trebuie s depind
de ntregul UID. Dar se tie c atributul cod_postal depinde doar de strada i de
numrul blocului, nu i de numrul apartamentului. Acest lucru ne spune c
atributul nu este memorat la locul potrivit. Deoarece depinde doar de combinaia
(strada, nr_bloc), nseamn c de fapt depinde de UID-ul entitii bloc.
Aadar, vom muta atributul cod_postal n entitatea BLOC.

Figura 1.24. Rezultatul modificrii efectuate

Observaie ! Dac o entitate se gsete n prima form normal i UID-ul su


este format dintr-un singur atribut, atunci ea se gsete automat n a doua
form normal.
26 Manual de Informatic pentru clasa a XII-a

1.2.4. A treia form normal (3NF)

O entitate se gsete n a treia form normal dac i numai dac se


gsete n a doua form normal i n plus niciun atribut care nu este parte a
UID-ului nu depinde de un alt atribut non-UID. Cu alte cuvinte, nu se accept
dependene tranzitive, adic un atribut s depind de UID n mod indirect.
Lum ca exemplu entitatea CARTE din Fig. 1.25. Atributul biografie_autor nu
depinde de ISBN ci de atributul autor. Nerezolvarea acestei situaii duce la
memorarea de date redundante, deoarece biografia unui autor va fi memorat
pentru fiecare carte scris de autorul respectiv.
Rezolvarea acestei situaii const n crearea unei noi entiti, s-i zicem
AUTOR, pe care o legm de entitatea CARTE printr-o relaie 1:m (vezi Fig. 1.26).

Figura 1.26. Introducerea unei noi entiti


Figura 1.25. Entitate
Iniial

Atenie! Acest model este corect doar dac se accept c o carte are un singur autor.
Lsm ca tem rezolvarea situaiei n care o carte poate avea mai muli autori. n
aceast situaie, apare o relaie many-to-many pe care trebuie s o rezolvai.

1. Care dintre urmtoarele enunuri NU este un exemplu de redundan?


a) O relaie ntre dou entiti care poate fi dedus din alt relaie.
b) O valoare dintr-o baz de date care poate fi obinut direct pe baza altei valori.
c) Dou atribute din baza de date care au aceeai valoare.
d) O valoare din baza de date care poate fi obinut efectund diferite
calcule asupra altor valori.
e) Niciuna dintre variantele anterioare.
Capitolul 1. Proiectarea bazelor de date 27

2. Care dintre urmtoarele cerine NU sunt necesare pentru ca o entitate s se


gseasc n a treia form normal?
a) Trebuie s se gseasc n a doua form normal.
b) Fiecare atribut care nu face parte din UID trebuie s depind de ntregul UID.
c) Nu trebuie s existe dependene tranzitive.
d) Niciuna dintre variantele anterioare.
3. Care este cea mai avansat form normal n care
se gsete entitatea alturat?
a) 1NF; b) 2NF;
c) 3NF; d) ERD-ul nu este normalizat.

Figura 1.27.
Entitatea propus

4. n ce form normal se gsete fiecare dintre urmtoarele entiti?


a) b) c)

5. Un magazin vinde o gam variat de pantofi de diferite mrimi i modele. Un


model este identificat printr-un cod. Fiecare model are o descriere i aceeai
descriere se poate aplica mai multor modele. Atributul vanzare_saptamanala
va memora numrul de pantofi de un anumit model i o anumit mrime vndui
sptmna anterioar (de exemplu, 25 de perechi, model 17, mrimea 39). Atributul
valoare_lunara_model reprezint valoarea total a pantofilor vndui pentru
fiecare model n parte, indiferent de model. Desenai un ERD n forma normal
3NF, coninnd toate aceste informaii.
6. Se d urmtoarea schem a unei baze de date existente ntr-o videotec.
Presupunnd c videoteca dispune de un singur exemplar din fiecare film video,
stabilii n ce form normal se gsete acest ERD. Dac el nu se gsete n forma
normal 3NF, facei modificrile necesare pentru aducerea sa la forma normal 3NF.

Figura 1.28.
Schema propus
28 Manual de Informatic pentru clasa a XII-a

7. Plecnd de la urmtoarea entitate, desenai un ERD n forma normal 3NF:

Figura 1.29. Entitatea propus pentru problema 7

8. Desenai ERD-ul pentru urmtorul scenariu i aducei-l n forma normal 3NF:


ntr-o cldire se gsesc mai multe birouri. Fiecare birou este identificat unic
printr-un numr. n fiecare birou se gsete un singur telefon. Un telefon poate fi de
dou tipuri: telefon interior (cu care nu se pot face apeluri n afara cldirii) i telefon
exterior, cu care se pot face apeluri att n interiorul cldirii ct i cu exteriorul.
Fiecare telefon are un numr unic. ntr-un birou pot lucra mai muli angajai, pentru
fiecare cunoscndu-se numele, prenumele, adresa, e-mail-ul, data naterii i data
angajrii. Se tie c un angajat poate lucra ntr-un singur birou.
9. Modificai ERD-ul de la problema anterioar n ipoteza c ntr-un birou pot exista
mai multe telefoane, folosite n comun de ctre toi angajaii care lucreaz n acel
birou.
10. Aducei modificrile necesare entitii alturate astfel nct s obinei un ERD
n forma normal 3NF. Entitatea reine informaii despre angajaii unei agenii de
plasare a forei de munc, care ofer personal cu norm ntreag sau cu program
redus, pentru diferite hoteluri din ntreaga ar. Se
memoreaz numrul de ore lucrate de fiecare angajat
n diferite hoteluri. Se tie c numrul de contract este
ntotdeauna dependent de codul hotelului dar nu i
invers.

Figura 1.30. Entitatea propus


pentru problema 10
Capitolul 1. Proiectarea bazelor de date 29

1.3. Implementarea modelului conceptual

1.3.1. Modele de baze de date

Bazele de date au fost concepute pentru stocarea volumelor mari de informaii


relativ omogene ntre care se pot stabili anumite relaii. O baz de date este deci o
colecie structurat de date aflate n interdependen, date care pot fi consultate
pentru a rspunde diferitelor interogri. nregistrrile returnate ca rspuns la o
interogare devin informaii care pot fi utilizate n luarea unor decizii ulterioare.
Sistemul complex de programe care permite descrierea, organizarea,
memorarea, regsirea, administrarea i securizarea informaiilor dintr-o baz de
date se numete sistemul de gestiune a bazelor de date (SGBD). Memorarea
datelor coninute de bazele de date se face pe suporturile de memorie intern sau
extern folosite de calculatoare. SGBD este un software special asociat bazelor de
date care asigur interfaa ntre o baz de date i utilizatorii ei, rezolvnd toate
cererile de acces la datele memorate.
Pentru orice baz de date poate fi compus o descriere a datelor i
obiectelor memorate, precum i relaiile existente ntre aceste obiecte. O astfel de
descriere se numete schema bazei de date.

Exist mai multe modele de baze de date, acestea difereniindu-se n funcie


de modul de organizare a schemei bazei de date.
Un model de baz de date nu este doar un mod de structurare a datelor, el
definete de asemenea un set de operaii care pot fi realizate cu datele respective.
Cele mai cunoscute modele de baze de date sunt urmtoarele:

Modelul tabelar toate datele sunt memorate sub forma unui singur
tabel, un tablou bidimensional de date.

Modelul ierarhic datele sunt organizate sub forma unor structuri


arborescente, exist deci o rdcin cu mai muli dependeni, care la rndul
lor pot avea ali dependeni. IMS (Information Management System) produs
de IBM este un exemplu de SGBD bazat pe acest tip de model.

Modelul reea este un model performant, dar complicat. O baz de date


de tip reea reprezint o colecie de noduri i legturi, fiecare nod putnd
fi legat de oricare altul. Legturile trebuie stabilite avnd tot timpul n
minte interogrile posibile i aciunile viitoare probabile.

Modelul relaional reprezint cel mai utilizat model de stocare a datelor,


n care datele sunt organizate sub form de tabele ntre care exist
diverse legturi.
30 Manual de Informatic pentru clasa a XII-a

Modelul obiectual, destinat s suporte modele de obiecte complexe


(organizare de tip heap cu referine ntre componente) este oarecum
asemntor reelei, iar prin faptul c pentru accesare direct, stocheaz
o hart a ierarhiilor i relaiilor claselor de obiecte, are ascendent i n
modelul ierarhic. Modelul obiectual se preteaz pentru nmagazinarea
informaiilor complexe: atribute descriptive asociate datelor multimedia,
documentelor, desenelor, arhivelor, etc.
Modelele hibride sunt mixturi ale modelelor prezentate anterior, din care
cel mai semnificativ este modelul relaional-obiectual, obinut prin
extensii ale modelului de organizare tabelar i izvort din tendina spre
universalitate a bazei de date (entiti complexe i de naturi diferite,
evolund n condiii eterogene).

1.3.2. Baze de date relaionale


Bazele de date relaionale au fost dezvoltate avnd n vedere n primul rnd
utilizatorii finali. Acest model are la baz teoria matematic a relaiilor, ceea ce a
fcut posibil tratarea algoritmic a proiectrii bazelor de date i problema
normalizrii datelor.
Modelul relaional este un model simplu, bazat pe algebra relaional, care a
fcut posibil dezvoltarea limbajelor relaionale sub forma unui software specializat
ce asist procesul de implementare a bazelor de date. Astfel de limbaje sunt
SQL-ul (Structured Query Language) i QBE (Query By Example).
n momentul de fa, exist multe sisteme performante de gestiune a bazelor
de date relaionale precum Oracle, DB2, MySQL, Informix, etc.
n cazul bazelor de date relaionale mari i foarte mari, s-au impus SGBD-uri
precum Oracle, DB2 i Informix. Acestea au la baz tehnologia client-server.
Transformarea modelului conceptual, a ERD-ului, n modelul fizic, adic n
baza de date propriu-zis, se numete mapare. Acest proces implic transformarea
fiecrui element al ERD-ului.
Prima etap a acestui proces const n crearea tabelelor bazei de date. Astfel:
fiecrei entiti i va corespunde cte un tabel. Spre deosebire de
entitate, un tabel va avea numele un substantiv la plural. De exemplu,
entitatea ANGAJAT se va transforma n tabela ANGAJAI, entitatea
ELEV, n tabela ELEVI, etc.
Fiecare atribut al unei entiti va deveni o coloan a tabelei. Fiecare
coloan va memora date de acelai tip.
Fiecare instan a unei entiti se va transforma ntr-un rnd (sau
nregistrare) al tabelului corespunztor.
Unicul identificator al entitii devine cheia primar a tabelei. Coloana
sau combinaia de coloane care identific n mod unic toate liniile unui
tabel se numete cheie primar.
Capitolul 1. Proiectarea bazelor de date 31

Deci, orice tabel are linii i coloane i conine datele organizate conform
anumitor structuri. n limbajul bazelor de date, coloanele se numesc cmpuri.
Fiecare coloan reprezint un cmp cu o denumire unic, de un anumit tip (ir de
caractere, numeric, dat calendaristic, etc.), avnd o dimensiune prestabilit.
Rndurile tabelei se numesc nregistrri.
Vom vedea pe parcursul urmtorului paragraf cum mapm relaiile dintre
entiti.

numele entitii la plural numele tabelei

atributul coloana

instana linia
Figura 1.31. Maparea entitilor

Informaiile despre o tabel a bazei de date vor fi prezentate folosind


diagramele de tabel care sunt nite tabele de forma celui din Tabelul 1.3, n care
vom nota numele coloanelor pe care le va avea tabela bazei de date, notm dac
o coloan face parte din cheia primar, caz n care vom scrie un pk (primary key)
n coloana a treia, sau dac face parte din cheia strin, caz n care vom scrie n
coloana a doua un fk (foreign key), iar n ultima coloan vom nota dac atributul
este opional sau obligatoriu. Pentru aceasta vom folosi aceleai simboluri ca i n
cazul ERD-ului. Asupra cheilor strine vom reveni n paragraful urmtor.
n tabelul 1.3 vedei diagrama tabelei CRI corespunztoare entitii CARTE:

Numele coloanei Tip cheie Opionalitatea

titlu Pk *

autor Pk *

data_apariiei *

format *

nr_pagini *

Tabelul 1.3. Exemplu de diagram de tabel

Se observ c deocamdat nu avem nicio cheie strin, deoarece cheia strin


provine din relaiile n care entitatea este implicat. Cum deocamdat aceast
entitate nu are nici o relaie cu nicio alt entitate, nu vom avea nicio cheie strin.
32 Manual de Informatic pentru clasa a XII-a

Completai diagramele de tabel pentru entitile de mai jos:

Figura 1.32. Entiti propuse ca exerciiu

1.3.3. Maparea relaiilor

1.3.3.1. Maparea relaiilor one-to-many

S ncepem cu un exemplu. Vom considera ERD-ul din Fig. 1.33:

Figura 1.33. Exemplu de ERD

S ne reamintim cum se citete relaia dintre cele dou entiti:


Fiecare JUCTOR poate juca ntr-o ECHIP i numai una.

La fiecare ECHIP trebuie s joace unul sau mai muli JUCTORI.

Observm c nu putem memora toi juctorii care joac la o echip n cadrul


tabelei ECHIPA, deoarece ar trebui s introducem o coloan cu valori multiple.
Invers ns, putem cu uurin s memorm, pentru fiecare juctor, echipa la care
joac, deoarece acesta nu poate juca dect la o singur echip.
Capitolul 1. Proiectarea bazelor de date 33

Oare cum putem memora echipa la care joac un juctor? Rspunsul este
destul de simplu. Vom memora pentru fiecare juctor codul echipei la care joac.
Adic diagrama de tabel corespunztoare entitii JUCTOR va fi urmtoarea:

Numele coloanei Tip cheie Opionalitatea


Nr_legitimatie Pk *
Nume *
Prenume *
Data_nasterii *
Adresa *
Telefon o
Email o
cod_echipa Fk o

Tabelul 1.4. Diagrama de tabel corespunztoare entitii JUCTOR

De pe tabela anterioar putei deduce nc un element important al maprii


relaiilor: dac relaia pe partea many este opional atunci i coloanele cheii strine
vor fi opionale. Ce nseamn acest lucru? Cum un juctor poate la un moment dat
s nu joace la nici o echip, cmpul cod_echip va rmne necompletat n dreptul
lui (va avea valoarea NULL). Dac ns relaia este obligatorie pe partea many,
atunci coloanele ce fac parte din cheia strin vor fi obligatorii.
n general, la maparea unei relaii de tip one-to-many vom introduce, n
tabela corespunztoare entitii de pe partea many a relaiei, cheia primar a
entitii de pe partea one a relaiei. Cmpurile astfel introduse se vor numi chei
strine (n englez, foreign key).
Aadar:
- cheia strin a unei tabele este cheia primar din tabela referin;
- cheia strin este ntotdeauna introdus n tabela corespunztoare
entitii din partea many a relaiei.

1.3.3.2. Maparea relaiilor one-to-one

Dndu-se dou entiti A i B legate ntre ele printr-o relaie one-to-one, este
evident c putem include cheia primar a lui A n cadrul tabelei B, dar putem
proceda la fel de bine i invers, incluznd cheia primar a tabelei B n cadrul
tabelei A, deoarece fiecrei instane a entitii A i corespunde cel mult o instan a
entitii B, dar i invers, oricrei instane a entitii B i corespunde cel mult o
instan a entitii A.

Pentru relaia din Fig. 1.34, de exemplu, putem memora - pentru fiecare
persoan, seria de paaport, dar i invers - pentru fiecare paaport, putem memora
cnp-ul deintorului.
34 Manual de Informatic pentru clasa a XII-a

Decizia depinde de specificul afacerii modelate. Dac, de exemplu, ne


intereseaz n primul rnd persoanele i abia apoi datele de pe paapoarte, atunci
vom adopta probabil prima variant, a memorrii seriei de paaport n cadrul
tabelei PERSOANE, iar dac ns baza de date este destinat evidenei
paapoartelor, atunci probabil vom adopta varianta a doua.

Figura 1.34. Exemplu de ERD

Uneori este convenabil s memorm cheia strin n ambele pri ale


relaiei, n exemplul nostru, pentru fiecare paaport s memorm cnp-ul persoanei
care l deine, dar i pentru fiecare persoan s memorm seria de paaport.

1.3.4. Maparea relaiilor barate

Relaiile barate se transform n urma maprii n cheie strin n tabela


aflat n partea many a relaiei, la fel ca la maparea oricrei relaii one-to-many.
Bara de pe relaie exprim faptul c acele coloane ce fac parte din cheia strin
vor deveni parte a cheii primare a tabelei din partea many a relaiei barate.
Pentru exemplul din Fig. 1.35, cheia primar a tabelei ATRIBUTE va fi
format din coloanele denumire_atribut i denumire_entitate, aceasta din
urm fiind de fapt cheie strin n tabela ATRIBUTE:

Figura 1.35. Maparea relaiilor barate

Vom avea diagramele de tabel:

Numele coloanei Tip cheie Opionalitatea


denumire Pk *
Tabelul 1.5. Diagrama de tabel ENTITI
Capitolul 1. Proiectarea bazelor de date 35

Numele coloanei Tip cheie Opionalitatea


denumire_atribut Pk *
denumire_entitate Pk, Fk *
opionalitate *
Tabelul 1.6. Diagrama de tabel ATRIBUTE

S considerm acum un exemplu n care exist mai multe relaii barate,


n cascad:

Figura 1.36. Relaii barate n cascad

Vom avea tabelele de mai jos:

Numele coloanei Tip cheie Opionalitatea


idA Pk *
C1 *
Tabelul 1.7. Diagrama de tabel pentru entitatea A

Numele coloanei Tip cheie Opionalitatea


idB Pk *
C2 *
idA Pk, Fk *
Tabelul 1.8. Diagrama de tabel pentru entitatea B

Numele coloanei Tip cheie Opionalitatea


idC Pk *
C3 *
idA Pk, Fk *
idB Pk, Fk *
Tabelul 1.9. Diagrama de tabel pentru entitatea C

Numele coloanei Tip cheie Opionalitatea


idD Pk *
C4 *
idA Fk *
Tabelul 1.10. Diagrama de tabel pentru entitatea D
36 Manual de Informatic pentru clasa a XII-a

1. Reluai exerciiile propuse pe parcursul paragrafelor anterioare i realizai


maparea ERD-urilor obinute.

2. Realizai maparea urmtoarei hri a relaiilor.

Figura 1.37. Harta relaiilor propus ca aplicaie

1.3.5. Operaii specifice prelucrrii bazelor de date

Orice sistem de gestiune a bazelor de date (SGBD) trebuie s asigure


urmtoarele funcii:

definirea structurii bazei de date;

ncrcarea datelor n baza de date (adugarea de noi nregistrri la


baza de date);

accesul la date pentru:


o interogare (afiarea datelor, sortarea lor, calcule statistice, etc.);
o tergere;
o modificare;
Capitolul 1. Proiectarea bazelor de date 37

ntreinerea bazei de date:


o refacerea bazei de date prin existena unor copii de siguran;
o repararea n caz de incident;
o colectarea i refolosirea spaiilor goale;

posibilitatea de reorganizare a bazei de date prin:


o restructurarea datelor;
o modificarea accesului la date;
securitatea datelor.

O parte din aceste operaii pot fi realizate cu ajutorul limbajului SQL, altele
cu ajutorul unor programe specializate, care sunt puse la dispoziia administra-
torului bazei de date de ctre sistemul de gestiune al bazelor de date.

1.3.6. Reguli de integritate

Detalierea caracteristicilor pe care trebuie s le prezinte un SGBD pentru a fi


considerat relaional a fost realizat de ctre E. F. Codd n 1985 sub forma a 13
reguli. Una dintre aceste reguli precizeaz c restriciile de integritate trebuie s
poat fi definite n limbajul utilizat de SGBD pentru definirea datelor.
Regulile de integritate garanteaz c datele introduse n baza de date sunt
corecte i valide. Aceasta nseamn c dac exist orice regul sau restricie
asupra unei entiti, atunci datele introduse n baza de date respect aceste
restricii.
Tipurile de reguli de integritate sunt urmtoarele:
Integritatea entitilor indic faptul c nici o coloan ce face parte
din cheia primar nu poate avea valoarea NULL. n plus, pentru fiecare
nregistrare, cheia primar trebuie s fie unic.
Integritatea de domeniu acest tip de reguli permite ca ntr-o
anumit coloan s se introduc doar valori dintr-un anumit domeniu.
De exemplu, putem impune ca salariul unui angajat s fie cuprins ntre
4500 i 5000 RON.
Integritatea referenial este o protecie care asigur ca fiecare
valoare a cheii strine s corespund unei valori a cheii primare din
tabela referit. De exemplu, referindu-ne la tabelele JUCTORI i
ECHIPE, corespunztoare ERD-ului din Fig. 1.33, cod este cheie
primar n tabela ECHIPE, iar n tabela JUCTORI, cod devine cheie
strin. Astfel, valoarea cmpului cod din cadrul tabelei JUCTORI
corespunztoare unui anumit juctor trebuie s se regseasc printre
valorile cmpului cod din tabela ECHIPE, altfel ar nsemna c juctorul
respectiv joac la o echip inexistent (vezi Fig. 1.38).
38 Manual de Informatic pentru clasa a XII-a

Figura 1.38. Exemplu de nclcare a integritii refereniale

Situaii de nclcare a integritii refereniale pot aprea:


la adugarea unei noi nregistrri n baza de date, se poate ncerca
introducerea unor valori invalide pentru cmpurile cheii strine;
la actualizarea bazei de date;
la tergerea unei nregistrri. De exemplu, se terge nregistrarea
corespunztoare unei anumite echipe (echipa se desfiineaz).
nregistrrile juctorilor care au jucat la acea echip vor nclca
integritatea referenial, deoarece se vor referi la o echip care nu mai
exist. Soluiile posibile sunt ca la tergerea unei echipe, toi juctorii
care au activat la acea echip s fie i ei teri din baza de date
(tergere n cascad), sau valoarea cmpului cod_echip pentru
acei juctori s fie setat la NULL, ceea ce nseamn c acei juctori
nu activeaz la nicio echip.

1.3.7. Programe de validare i de aciune

n realizarea modelului conceptual al unei baze de date se ine cont de


modul n care funcioneaz afacerea modelat, datele care trebuie s fie memorate,
relaiile dintre acestea, etc. Modul de utilizare a diferitelor date, modul n care
acestea sunt relaionate pot diferi de la o afacere la alta.
Regulile afacerii unei organizaii se refer n esen la procesele i fluxurile
tuturor datelor i activitilor zilnice din cadrul organizaiei.
Cum funcioneaz organizaia?
Care sunt activitile sale?
Capitolul 1. Proiectarea bazelor de date 39

Regulile afacerii acoper urmtoarele aspecte ale unei organizaii:


Orice tip de politici organizaionale de orice tip i de la orice nivel al
organizaiei.
Orice tip de formule de calcul (ca, de exemplu, modul de calcul al
ratelor pentru diverse mprumuturi, modul de calcul al salariilor, etc.).
Orice tip de reguli impuse de lege sau reguli interne ale organizaiei.
Regulile simple ale afacerii pot fi implementate n modelul bazei de date prin
intermediul relaiilor dintre entiti. Acest tip de reguli se numesc reguli structurale.
Alte reguli ale afacerii pot fi implementate folosind regulile de integritate despre
care am discutat n paragraful anterior. Exist totui reguli pentru implementarea
crora va trebui s scriem programe speciale folosind limbaje specializate specifice
SGBD-ului utilizat. Acest tip de reguli se numesc reguli procedurale.

1. Cnd mapai un ERD, care dintre urmtoarele afirmaii NU este adevrat?


a) Fiecare entitate este mapat ntr-o tabel.
b) Fiecare atribut este mapat ntr-o coloan a tabelei corespunztoare.
c) Fiecare entitate n parte este mapat ntr-o linie din tabelul corespunztor.
d) Fiecare relaie one-to-many se transform ntr-o cheie strin.

2. ntr-o tabel, o instan a unei entiti este mapat ca:


a) o relaie many-to-many; b) o linie din tabel;
c) o coloan din tabel; d) un atribut; e) un index.

3. Dou entiti A i B se gsesc ntr-o relaie one-to-one care este opional la


ambele capete. Care dintre urmtoarele variante este o soluie corect de mapare ?
a) Combinarea celor dou entiti A i B ntr-o singur relaie.
b) Crearea a dou tabele separate i includerea unei chei strine att n
tabela A ct i n tabela B.
c) Combinarea celor dou entiti A i B ntr-o singur tabel.
d) Utilizarea unei chei primare care s fie o combinaie a cheilor primare din A i B.

4. Referitor la ERD-ul din Fig. 1.39, care dintre afirmaiile de mai jos corespund
unei variante corecte de mapare?
a) Se preia cheia primar din tabela PERSOANE i se adaug ca i cheie
strin la tabela MASINI.
40 Manual de Informatic pentru clasa a XII-a

Figura 1.39. ERD propus pentru problema 4

b) Se preia cheia primar din tabela MASINI i se adaug ca i cheie strin


la tabela PERSOANE.
c) Se creeaz o singur tabel cu informaiile din ambele entiti.
d) Se preiau cheile primare din ambele tabele i se introduc ntr-o nou
tabel numit PROPRIETARI.
e) Oricare dintre variantele de mai sus este corect.

5. O baz de date conine urmtoarele tabele:


Tabela DEPARTAMENTE Tabela ANGAJATI Tabela ANGAJARI
DepNo Departament IdAngajat NumeAngajat IdAngajat DepNo
1 IT 1 Ionescu 1 1
2 Electric 2 Georgescu 3 2
3 Geografie 3 Vasilescu 4 1
4 Istorie 4 Marinescu 3 3
5 Business 5 Andreescu 1 2
2 5
Desenai ERD-ul din care s-au obinut prin mapare aceste tabele.

(vezi baremele de notare i de corectare de la pag. 380)


Capitolul 1. Proiectarea bazelor de date 41

1.4. Managementul de proiect

1.4.1. Ce este un proiect ?

Un proiect este o secven de aciuni intercorelate, care se deruleaz ntr-o


perioad de timp clar definit i delimitat, orientate ctre ndeplinirea unor
obiective cu caracter unic i precis.
Putem defini managementul de proiect ca fiind efortul planificrii,
organizrii i mobilizrii resurselor pentru un scop dat. Managementul de proiect
este de fapt un instrument, un set de metode i tehnici care ne ajut s atingem cu
eficacitate scopurile i obiectivele propuse.

1.4.2. Etape n realizarea unui proiect

Orice proiect trece printr-o serie ntreag de etape. Ceea ce este important
de reinut este faptul c orice proiect este un proces iterativ, n sensul c orice
etap poate fi repetat de mai multe ori, n funcie de necesitile de redefinire a
anumitor cerine.
Etapele principale pe care le parcurgem pentru realizarea unui proiect sunt
urmtoarele:
Definirea proiectului
o Validarea proiectului n aceast etap vor fi analizate toate documentele
prezente n propunerea de proiect. Aceast analiz va duce fie la
confirmarea i acceptarea proiectului, fie va duce la respingerea, sau
eventual regndirea acestuia, n cazul n care propunerea de proiect nu a
fost bine realizat, i resursele au fost subestimate.
o Definirea proiectului const n enunarea problemei, stabilirea scopului
proiectului, stabilirea unei liste a posibilelor soluii etc. Orice proiect propus
poate avea elemente pe care cel care l-a propus nu a considerat necesar
s le detalieze, ns echipa de proiect poate avea nevoie de informaii
suplimentare pentru a nelege corect enunul proiectului.
Organizarea proiectului
o Stabilirea obiectivelor
o Stabilirea grupului int - cnd ncercai s stabilii care este grupul int
al unui proiect trebuie s rspundei la urmtoarele ntrebri: Cine trebuie
s tie despre proiect? Cine va folosi acest proiect? Asupra cui vor avea
impact rezultatele proiectului? Cine finaneaz acest proiect? Cine aprob
acest proiect? Cine livreaz proiectul? Cine va trebui s fie instruit?
42 Manual de Informatic pentru clasa a XII-a

o Stabilirea cerinelor proiectului este un proces iterativ care poate


implica negocierea. Fiind conductorul proiectului, tii ce este posibil i ce
nu n ceea ce privete scopul proiectului, timpul alocat, costurile, cerinele
de calitate etc. Un proiect care nu ndeplinete cerinele utilizatorului este
din start un eec.
o Stabilirea infrastructurii proiectului infrastructura se refer la
elemente precum instrumente de comunicare n cadrul echipei (telefoane
mobile, PDA, laptop, etc.), spaiu de lucru pentru membrii echipei (birou),
echipamente de birou, laboratoare, etc.
o Stabilirea sistemului de calitate a proiectului
o Formarea echipei de proiect
Planificarea proiectului planul proiectului prezint desfurarea normal,
ideal a unui proiect. Acesta ofer reperele necesare evalurii situaiei
proiectului. Fr existena unui plan dinainte stabilit, exercitarea controlului
este practic imposibil.
Elaborarea proiectului n aceast etap se stabilesc detaliile tehnice i de
design, se revizuiesc schemele tehnice, se revizuiesc criteriile de cost i
performan. Aceast etap vizeaz conturarea unui model al aplicaiei. Se
proiecteaz bazele de date, se realizeaz interfeele aplicaiei (rapoarte,
ecrane, meniuri etc), se proiecteaz prelucrrile automate, etc.
Dezvoltarea proiectului
Implementarea proiectului const n instalarea produsului i testarea sa,
instruirea viitorilor utilizatori. Se testeaz produsul n condiii reale, i se
nltur eventualele erori depistate n funcionare. Tot n aceast faz
personalul implicat n proiect este redus. Se ncep activitile de publicitate.
Finalizarea proiectului se elaboreaz rapoartele finale, se elibereaz
personalul angajat n derularea proiectului.

1.4.3. Principiile lucrului n echip

Colaborarea nseamn mai ales implicarea oamenilor n crearea propriilor


soluii la problemele cu care se confrunt. n cadrul unui proces colaborativ,
oamenii au ocazia s afle punctul de vedere i perspectiva celorlali i s
gndeasc mpreun soluii la problemele comune.
Colaborarea este o art ! Suntei uneori pui n situaia de a vorbi i
colabora cu persoane pe care nu le cunoatei, cu care nu suntei de acord sau pe
care nu le agreai.
Mrimea echipei de proiect este un factor important care poate influena
modul de conducere al acesteia. ntr-o echip prea mare pot aprea probleme de
comunicare, dificulti n luarea deciziilor. n general, se accept c o echip pentru
a putea fi eficient nu trebuie s depeasc un numr de 10 persoane.
Capitolul 1. Proiectarea bazelor de date 43

n cazul proiectelor cu numr mare de persoane implicate, participanii la


proiect trebuie organizai n mai multe echipe satelit intercorelate, coordonate de o
echip principal al crei rol principal este s asigure o comunicare facil i
eficient ntre toate echipele satelit.
Fiecare membru al unei echipe de proiect trebuie s cunoasc ceea ce se
ateapt de la el. Trebuie stabilite de la nceput rezultatele ateptate de la fiecare
membru al echipei n parte, aciunile ce trebuie executate pentru obinerea
rezultatului, relaiile de subordonare n cadrul echipei, metodele de msurare a
performanei fiecrui membru al echipei.
Liderul echipei are n primul rnd rolul de a stabili, menine i proteja un
proces colaborativ care permite tuturor s participe nengrdit la munca grupului.

1.4.4. Pregtirea i susinerea unei prezentri

n momentul finalizrii unui proiect va trebui s prezentai rezultatul muncii


voastre n faa clientului. Susinerea unei prezentri n public este pentru oricine o
surs de stres. Muli oameni ar prefera s evite complet aceast problem, dar de
multe ori este imposibil de evitat. Indiferent c lucrm singuri sau n echip, vom
putea fi pui n situaia de a face o prezentare public.
Adevrul este c susinerea unei prezentri publice nu trebuie s fie un
motiv de stres. Att timp ct avei n minte cteva principii de baz, vorbitul n
public va deveni o experien plcut pentru voi.
Iat cteva principii de care trebuie s inei seama pentru a depi
dificultile legate de vorbitul n public:

Vorbitul n public NU este un motiv real de stres.


Muli oameni erau la nceput ngrozii de ideea de a vorbi n public. Le
tremurau genunchii, vocea, gndurile o luau razna. Totui, ei au nvat
s elimine definitiv teama de a vorbi n public.
Nu i propune s fi genial sau perfect, chiar dac aa i se pare c ar
trebui. i se poate ntmpla s greeti, i se poate ntmpla s uii
poriuni ntregi din ceea ce vroiai s spui, poi s nu glumeti deloc i
totui prezentarea ta s aib succes.
Totul depinde de cum defineti tu i auditorul tu succesul. Auditorul tu
nu ateapt de la tine s fi perfect. Cu ct ncerci mai tare s fi perfect cu
att mai mult vei adnci anxietatea pe care o ai i efectul va fi contrar
celui scontat. Ceea ce este important atunci cnd faci o prezentare n
faa unui public este s oferi ceva auditorului. Atta timp ct auditorul
rmne cu ceva de pe urma prezentrii, ei o vor considera un succes.
Nu ncerca s transmii prea multe informaii ntr-o prezentare. Nu
trebuie s transmii tone de informaii i detalii, ofer publicului doar
ceea ce el dorete cu adevrat. Studiile arat c oamenii i amintesc
doar foarte puine elemente din ceea ce vorbitorii prezint.
44 Manual de Informatic pentru clasa a XII-a

Nu ncerca s mulumeti pe toat lumea, acesta este un punct de


vedere nerealist.

Nu ncerca s imii ali prezentatori, e un lucru foarte dificil. ncearc s fi


tu nsui, e mult mai uor.

Nu ncerca s controlezi comportamentul auditorului. Dac oamenii sunt


agitai, nu ncerca s le controlezi comportamentul. Dac cineva
vorbete cu vecinul, citete ziarul sau chiar a adormit n timpul
prezentrii tale, ignor-l!
Nu te scuza. Auditorul nu are de unde s tie c ai uitat s spui ceva.
Vorbete cu ncredere, fi convins de ceea ce spui.
Organizeaz logic coninutul prezentrii. Orice prezentare va avea o
introducere, coninutul propriu-zis i o concluzie.

Utilizeaz materiale audio-vizuale ajuttoare, dac acestea sunt


necesare. O prezentare n PowerPoint, bine realizat, poate fi de un real
folos.
o Asigur-te din timp c ntregul echipament (calculator,
video-proiector, etc) funcioneaz.
o Nu bombarda auditorul cu efecte sonore sau cu animaii exagerate i
utilizeaz n mod echilibrat culorile.
o Include n prezentarea electronic doar cele mai importante idei.
o Nu ncrca slide-urile cu prea multe texte. n general, se admit 7-10
cuvinte pe linie i maximum 10 linii de text pe un slide.
o Prefer un grafic n locul textelor, dar nu exagera cu mai mult de
dou grafice pe un slide.

Pstreaz contactul vizual cu auditorul. ncearc n acest fel s faci


fiecare persoan din public s se simt implicat.

F scurte pauze. Nu alerga prin prezentare, d-i rgazul s respiri. D


timp audienei s reflecte la ceea ce ai spus.

Adaug puin umor prezentrii tale, dac acest lucru este posibil.
Pstreaz treaz interesul auditorului pe parcursul ntregii prezentri.

Nu ine minile n buzunar n timpul prezentrii !

Adopt o inut adecvat n ziua prezentrii. Atrage atenia auditorului


asupra a ceea ce spui, nu a mesajelor de pe tricou sau asupra bijuteriilor
pe care le pori !

n acest moment v-ai nsuit elementele de baz ale modelrii bazelor de


date. Ai vzut diverse situaii ce pot aprea pe parcursul crerii modelului
conceptual i cum s rezolvai anumite situaii problem.
Capitolul 1. Proiectarea bazelor de date 45

n acest subcapitol ai aflat cum se organizeaz un proiect, care sunt etapele


de realizare ale lui i cum s organizai munca ntr-o echip. De asemenea, tii
cum s pregtii i s facei o prezentare n faa unui public. Este momentul s
aplicai toate aceste cunotine!

Formai echipe de 2 - 4 elevi, alegei-v o tem de proiect, fie din temele


propuse n aceast seciune, fie una propus chiar de voi. Realizai modelul
conceptual al afacerii modelate. Atenie! Repartizai sarcinile n mod echitabil n
cadrul echipei de proiect.
Pregtii o prezentare a proiectului realizat, materialele vizuale (postere,
pliante, prezentarea PowerPoint), care s v ajute la susinerea prezentrii.
Putei chiar organiza mpreun cu cadrul didactic, un concurs la nivelul
clasei sau al colii, la care s invitai i ali profesori din coal.
Nu uitai s documentai fiecare presupunere pe care ai fcut-o n realizarea
proiectului!

Tema 1: Campionatul Naional de Fotbal. O baz de date memoreaz informaii


despre juctorii i cluburile din cele patru divizii din campionatul naional de fotbal.
Fiecare club de fotbal are un nume unic n ntregul campionat. Un club de fotbal
poate avea mai multe echipe n campionat. Pentru fiecare echip se cunoate
cpitanul su, care este unul dintre juctori.
Juctorii au asociat un identificator unic, un nume, nu neaprat unic i sunt
angajai la diferitele echipe. n baza de date se pstreaz i detalii privind nivelul
abilitilor (not cuprins ntre 1 i 10) fiecrui juctor pentru fiecare dintre poziii de
joc (portar, aprtor, mijloca, etc). De exemplu, juctorul Ionescu poate avea
nivelul 10 pe postul de portar, 7 pentru poziia de aprtor, etc.
Este important ca n baza de date s se memoreze un istoric al tuturor
juctorilor, la ce echipe au jucat, n ce perioad, etc.
Se va memora i un istoric al golurilor marcate de fiecare juctor de-a lungul
carierei. Pentru fiecare gol se va ti data, meciul n care a fost marcat, minutul, etc.

Tema 2: Firm de nchirieri de maini. Trebuie s proiectai baza de date a


unei firme care ofer spre nchiriere maini de diferite tipuri. Trebuie s pstrai
informaii despre mainile firmei, firmele cu care firma are contracte de colaborare
(de exemplu, garaje), mainile nchiriate, veniturile firmei i bineneles date despre
clienii firmei.
Mainile sunt descrise prin date precum: productorul, modelul, anul de
fabricaie, mrimea motorului, tipul de combustibil, numrul de pasageri, numrul
de nmatriculare, preul de cumprare, data cumprrii, preul de nchiriere i detalii
privind asigurarea mainii.
46 Manual de Informatic pentru clasa a XII-a

Toate reparaiile importante asupra mainilor firmei sunt fcute de firme cu


care colaboreaz. Unele firme solicit plata serviciilor de service imediat dup ce
reparaia a fost fcut, altele accept plata n rate a serviciilor. Trebuie inut
evidena clar a fiecrei maini, a celor nchiriate, a celor aflate n reparaii, etc.
Se pstreaz de asemenea evidena tuturor veniturilor i cheltuielilor firmei:
cumprarea de noi maini, nchirierea de maini, cheltuieli de reparaii, vnzarea
unor maini mai vechi din parcul auto (firma prefer s nu pstreze n parcul auto o
main mai mult de un an), taxe de asigurare a mainilor etc.
Firma deine un portofoliu de clieni destul de stabil. Pentru clienii privilegiai
ofer reduceri la nchirierea de maini. Aceti clieni au de asemenea posibilitatea
de a rezerva o main din timp. O main poate fi nchiriat pentru o perioad de
timp de la o zi la un an. Plata pentru nchirierea unei maini se poate face cash sau
cu credit card. Se accept orice tip de card.
Datele importante despre clieni precum numele, adresa, numrul de telefon,
seria permisului de conducere, etc. vor fi i ele memorate n baza de date.
Tema 3: Firm IT. Trebuie s proiectai baza de date a unei companii de
dimensiune medie din domeniul IT. Firma livreaz diferite produse clienilor si, de la
simple aplicaii create la cerere, pn la instalri de echipamente hardware i
software particularizat. Firma are ca angajai diveri experi, consultani i personal
auxiliar. ntregul personal este angajat pe termen nelimitat, nu exist angajai
temporari sau colaboratori. Compania este mprit n mai multe departamente,
fiecare departament fiind condus de ctre un angajat din cadrul departamentului
respectiv. Pentru un proiect care trebuie dezvoltat n cadrul firmei, se formeaz o
echip de persoane selectate din mai multe departamente. Managerul de proiect
este pe deplin i exclusiv responsabil de conducerea proiectului, independent de
ierarhia de conducere din cadrul firmei.
Tema 4: Spital. Un spital este format din mai multe secii, precum Pediatrie,
Oncologie, Dermatologie etc. n fiecare secie sunt internai mai muli pacieni, pe
baza recomandrii medicului de familie i a confirmrii fcute de ctre un specialist
al spitalului. La internare, sunt nregistrate datele personale ale pacienilor. O fi
separat ine evidena investigaiilor fcute pacientului pe toat perioada internrii,
rezultatele acestor investigaii, tratamentul aplicat pacientului i rezultatele obinute
n urma tratamentelor efectuate. Un pacient este repartizat unui anumit medic care
coordoneaz toate investigaiile i tratamentele aplicate pacientului, ns acesta
poate solicita i altor colegi s examineze pacientul su. Medicii sunt specialiti n
diverse ramuri ale medicinii, i pot avea n supraveghere mai muli pacieni, nu
neaprat toi din aceeai secie.
Tema 5: Editur. O editur editeaz cri tiinifice din diferite domenii. Crile
sunt scrise de autori specializai ntr-un anumit domeniu. Firma are angajai mai
muli editori care nu sunt neaprat specialiti n diferitele domenii, fiecare editor
fiind responsabil pentru mai multe publicaii. O carte acoper unul din domeniile n
care este specialist autorul, fiecare autor lucreaz cu un editor, dar poate avea
spre publicare o alt carte de care este responsabil un alt editor.
PARTEA A II-A CAPITOLUL
Limbajul MySQL

n acest capitol vei nva MySQL, limbaj de programare specializat


pentru gestiunea bazelor de date relaionale pe Internet. Cu ajutorul
programului EasyPHP, vei putea lucra uor pe calculatorul dvs.

Ce este i de ce nvm MySQL ?


Cum rulm MySQL pe propriul calculator ?
Cum crem o baz de date ?
Tabele noiuni elementare
Tipuri de date, operatori i funcii
Afiarea c oloanelor care rezult n urma unui calcul
Valoarea NULL. Valori implicite
Ce sunt cheile primare i cheile unice ?
Autoincrementare
Cum sortm i cum filtrm datele ?
Cum actualizm datele dintr-un tabel ?
Funcii agregate
Utilizarea subinterogrilor
Cum putem grupa datele ?
Ce sunt uniunile de tabele ?

Cuvinte cheie: tipuri de date, operatori, funcii, valoare implicit,


cheie primar, cheie unic, autoincrementare, sortare, filtrare,
actualizare, funcii agregate, subinterogri, grupare, uniune
48 Manual de Informatic pentru clasa a XII-a

2.1. Ce este i de ce nvm 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, aplicaii prin care cei care au creat un site au
posibilitatea s-i contorizeze numrul de vizitatori ai site-ului respectiv sau,
mai mult, contorizarea se poate extinde la nivel de pagin afiat. Pentru a
evita cu un vizitator, care a deschis de mai multe ori pagina respectiv, s
nu fie contorizat de mai multe ori, se va reine adresa IP a acestuia.
- Comer electronic, aplicaii prin care anumite firme i promoveaz i vnd
produsele de care dispun. n acest caz, bazele date vor reine, pe de o
parte, informaii despre produse, iar pe de alt parte, comenzile clienilor.
Avantajele comerului electronic sunt uriae pentru c nu implic cheltuieli
pentru spaiile de desfacere (magazine) i, teoretic, oferta se adreseaz
clienilor din toat lumea.
- Votul electronic, aplicaii prin care se poate afla prerea vizitatorilor
site-ului respectiv referitoare la tema supus votului. i aici este important ca
un vizitator s nu voteze de mai multe ori, motiv pentru care baza de date
reine adresa IP a vizitatorului.
- Aplicaii de comunicare - aplicaii prin care diveri vizitatori ai site-ului
respectiv dezbat o anumit problem, supus discuiei. n astfel de cazuri,
bazele de date vor reine informaii despre cei care scriu (de multe ori,
acetia, mai nti, trebuie s se nscrie n baza de date a site-ului) i
mesajele acestora.
Exist o mulime de alte aplicaii ale bazelor de date: site-urile diverselor
ziare, posturi de televiziune, bazele de date create i exploatate de motoarele de
cutare, etc. irul acestora este practic infinit. Iat motivul pentru care ne vom iniia
n crearea i exploatarea bazelor de date pe Internet.
Ce este SQL ? n practica crerii i utilizrii bazelor de date relaionale s-a
1

impus necesitatea existenei unui limbaj standard care permite efectuarea acestor
operaii. Astfel, a aprut SQL - Structured Query Language. Limbajul este
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, el este implementat de o mulime de SGBD-uri, de aceast dat
consacrate, cum ar fi: Microsoft Access, Oracle, Microsoft SQL Server
i, bineneles, MySQL.
Ce este MySQL ? MySQL este un limbaj specializat pentru gestiunea bazelor de
date relaionale pe Internet. Aa cum s-a mai spus, are la baz limbajul SQL.
MySQL gestioneaz baze de date care se gsesc pe server, iar comenzile pot fi
date cu ajutorul limbajului PHP, dar i cu alte limbaje, de exemplu Java.

Revedei Capitolul 1. Proiectarea bazelor de date deoarece st la baza tuturor noiunilor


1

prezentate aici!
Capitolul 2. Limbajul MySQL 49

Prin utilizarea pachetului EasyPHP putem s instalm MySQL pe calculatorul


nostru. Vedei Anexa 1! Exact n acest mod vom proceda pentru studiul
limbajului MySQL, adic vom crea baze de date pe calculatorul nostru.

2.2. Cum rulm MySQL pe propriul calculator ?


Mai nti, instalai pachetul EasyPHP, urmnd paii prezentai n Anexa 1.
Exist dou modaliti prin care se pot da comenzi MySQL pe calculatorul nostru.

A) Prin utilizarea unei ferestre MS-DOS. Pentru aceasta va trebui s


identificai programul cmd.exe care simuleaz sistemul de operare
amintit i s creai un shortcut ctre acesta. Pentru comoditatea
apelului, este indicat ca shortcut-ul s se gseasc pe Desktop. n
cazul nostru, va trebui ca fereastra CMD s fie deschis n subfolder-ul
bin, al folder-ului care conine MySQL. Executai clic cu butonul drept al mouse-ului
i selectai Properties. n edit-ul Start in, al ferestrei care apare, introducei
calea ctre subfolder-ul bin al folder-ului mysql. De exemplu, pe calculatorul pe
care experimentm utilizarea MySQL-ului, aceast cale este:
"C:\Program Files\EasyPHP1-8\mysql\bin"
Lansai n executare programul EasyPHP din meniu: Start, Programs, EasyPHP
i executai dublu-clic pe shortcut-ul ctre CMD. Dai comanda:
mysql -u root -p
i introducei parola aleas. S observm c MySQL afieaz prompter-ul mysql>
(vedei n figura de mai jos fereastra CMD):

Figura 2.1. Prompter-ul MySQL din fereastra CMD

De acum putem da comenzi MySQL!


Aceast modalitate de lucru prezint avantajul c orice eveniment are loc
numai ca urmare a unei comenzi date de la tastatur i pentru nceput, din
considerente pedagogice, este bine s procedm aa. Desigur, exist i
numeroase dezavantaje, cum ar fi faptul c de multe ori se pierde timpul tastnd,
pentru c n cazul unei comenzi greite aceasta trebuie reluat, .a.m.d.
50 Manual de Informatic pentru clasa a XII-a

B) Se poate utiliza i un ansamblu de script-uri PHP aflate n fiierul index.php


din folder-ul de phpmyadmin. Dai browser-ului pe care-l utilizai comanda:
http://localhost/phpmyadmin/. Va fi afiat o fereastr n care vi se va
cere parola (vezi Fig. 2.2.). De acum putei lucra cu MySQL prin utilizarea unui
mediu vizual.

Figura 2.2. Fereastra de


autentificare

Observaie ! Din considerente pedagogice i pentru generalitatea prezentrii, n


aceast carte vom folosi prima form, cea n care se lucreaz prin utilizarea unei
ferestre MS-DOS.

2.3. Crearea unei baze de date


n MySQL, pentru a crea o baz de date se d comanda:
CREATE DATABASE nume_baza;

n urma acestei comenzi, teoretic, se creeaz baza de date cu numele


indicat. n fapt, se creeaz un folder cu numele bazei de date n subfolder-ul data
al folder-ului MySQL: C:\Program Files\EasyPHP1-8\mysql\data. Dac
exist deja o baz de date cu acest nume, se refuz crearea uneia noi.
n cazul n care, dup deschiderea aplicaiei sau n timpul sesiunii de lucru,
se dorete lucrul cu o anumit baz de date, se d comada de mai jos:
USE nume_baza;
Pentru tergerea unei baze de date se utilizeaz comanda:
DROP DATABASE nume_baza
Uneori, din anumite motive, dorim o list a bazelor de date existente. n
acest caz, se utilizeaz comanda de mai jos:
SHOW DATABASES
Capitolul 2. Limbajul MySQL 51

2.4. Tabele. Noiuni elementare


ntr-un tabel coloanele sunt identificabile prin nume, iar rndurile, prin
valorile pe care le memoreaz. Toate datele dintr-o coloan au acelai tip. Un
tabel are un numr specificat de coloane, dar 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 .
1

O instruciune prin care se poate crea un tabel este prezentat mai jos, unde
2
ceea ce este trecut ntre paranteze drepte este considerat facultativ :
CREATE TABLE nume_tabel
( nume_coloana1 tip_data [specificatori],
nume_coloana2 tip_data [specificatori],
...
nume_coloanan tip_data [specificatori]
);

Specificatorii se refer la cheia primar, valori distincte, valori implicite,


autoincrementare, dac printre valorile reinute se poate gsi sau nu valoarea
NULL. Toate acestea sunt tratate separat.

Exemplul 2.1. Se creeaz un tabel cu 3 coloane: prima conine codul materialului


i poate reine cel mult 5 caractere, a doua conine denumirea materialului i poate
reine pn la 20 de caractere, iar ultima reine cantitatea din fiecare material (n
buci) i poate reine un numr natural cu maximum 3 cifre:

CREATE TABLE materiale


(cod char(5),
denumire char(20),
cantitate_buc INT(3)
);

Pentru introducerea rndurilor n tabel se utilizeaz comanda de mai jos,


unde se introduc, pe rnd, toate cmpurile unei linii, n ordinea n care au
fost declarate coloanele:
INSERT INTO nume_tabel VALUES (data1, data2...datan);

Exemplul 2.2. Se insereaz n tabel dou linii:


INSERT IMTO materiale VALUES(001, panouri,78);
INSERT IMTO materiale VALUES(007, placi,0);

1
Noiunea de tabel este prezentat pe scurt. O prezentare amnunit se gsete n
capitolul anterior, Proiectarea bazelor de date.
2
Specificatorii vor fi tratai separat. Tabelul astfel creat nu conine nicio nregistrare. Pentru
adugarea nregistrrilor utilizm alt instruciune MySQL.
52 Manual de Informatic pentru clasa a XII-a

n practica utilizrii bazelor de date, instruciunea anterioar este considerat ca


generatoare de erori, prin faptul c se poate grei ordinea de introducere a datelor,
iar efectul este acela c tabelul va conine date eronate. Din acest motiv, se
prefer forma de mai jos a instruciunii, dei este necesar s scriem mai mult

Se insereaz n tabel valori pentru coloanele indicate n ordinea n care au


fost declarate coloanele:
INSERT INTO nume_tabel (nume_coloana1,... nume_coloanak)
VALUES (data1,...datak);

Pentru a afia ntreg tabelul se utilizeaz comanda:


SELECT * FROM nume_tabel

Exemplul 2.3. Pentru tabelul creat anterior se d comanda:


SELECT * FROM materiale

Figura 2.3. Exemplu de tabel

Exist posibilitatea s afim numai anumite coloane ale tabelului, n


ordinea pe care o dorim, dac folosim instruciunea de mai jos:
SELECT nume_coloana1,... nume_coloanak FROM nume_tabel

S observm faptul c, atunci cnd afim un tabel, n capul su se trece


numele coloanelor din tabel. Dac dorim ca n capul de tabel s figureze alt
nume pentru o coloan, atunci, n instruciunea de mai sus, n loc de a scrie
numai numele coloanei, vom scrie numele coloanei urmat de cuvntul cheie
AS i de numele care dorim s fie afiat n capul de tabel. Astfel, utilizm
alias-uri pentru numele coloanelor.

Exemplul 2.4. Pentru tabelul de mai sus vom scrie:

SELECT cod AS codul, denumire AS nume, cantitate_buc AS cantitate


FROM materiale;

Putem vizualiza numele tabelelor existente n baza de date prin utilizarea


instruciunii urmtoare:
SHOW TABLES [FROM nume_baza]

n caz c am uitat care sunt coloanele dintr-un anumit tabel al bazei de date
i tipul acestora, putem utiliza instruciunea:
SHOW COLUMNS FROM nume_tabel
Capitolul 2. Limbajul MySQL 53

2.5. Tipuri de date n MySQL


Aa cum am vzut, coloanele au un anumit tip. Pn n prezent, am utilizat
cteva tipuri fr a oferi o prezentare unitar a acestora. Este momentul s-o facem
acum.
n linii mari, tipurile de date din MySQL se mpart n:
a) tipuri care rein iruri de caractere;
b) tipuri numerice;
c) tipuri care rein data, ora.

n continuare, vom prezenta detaliat pe fiecare n parte.

2.5.1. Tipuri de date care rein iruri de caractere

Tipurile care rein iruri de caractere sunt prezentate mai jos:

Tip Descriere
Un cmp de acest tip reine un ir de caractere de lungime
CHAR[(n)] n (fix). n caz c n nu este precizat, reine un caracter.
Ocup n octei.
Un cmp de acest tip reine iruri de cel mult 255 de
VARCHAR caractere. Un octet reine lungimea efectiv a irului.
Ocup n+1 octei.
TINYTEXT La fel ca mai sus.
Un cmp de acest tip reine iruri de cel mult 65535 de
TEXT caractere. Doi octei rein lungimea efectiv a irului. Ocup
n+2 octei, unde n este numrul de caractere al irului.
Un cmp de acest tip reine iruri de cel mult 16.777.215
MEDIUMTEXT caractere. Trei octei rein lungimea efectiv a irului.
Ocup n+3 octei.
Un cmp de acest tip reine iruri de cel mult
LONGTEXT 4.294.967.295 de caractere. Patru octei rein lungimea
efectiv a irului. Ocup n+4 octei.
Baza va reine un vector de iruri de caractere. Un cmp de
acest tip poate reine un singur ir de caractere din
ENUM
vector. De altfel, coloana reine indicele din ir. Vedei
exemplul 2.5!
Baza va reine un vector de iruri de caractere.. Un cmp
de acest tip poate reine unul sau mai multe iruri de
SET
caractere din vector. De altfel, se reine vectorul
caracteristic al irurilor. Vedei exemplul 2.6!
Tabelul 2.1. Tipuri de date care rein iruri de caractere
54 Manual de Informatic pentru clasa a XII-a

Exemplul 2.5. Se creeaz tabelul tstA care are dou coloane: prima reine un
ir de cel mult 65.535 de caractere i a doua, un ir din mulimea irurilor luni,
marti, miercuri. n tabel se insereaz 3 linii i, la sfrit, tabelul este afiat.
S observm c n cazul coloanelor de tip SET,
dac se ncearc memorarea unui ir inexistent
n definiia coloanei (n exemplu, irul joi),
atunci acea coloan va reine irul vid.

Figura 2.4.
Tabelul tstA

CREATE TABLE tstA


( v1 TEXT,
v2 ENUM (luni,marti,miercuri)
);

INSERT INTO tstA VALUES (un sir,miercuri);


INSERT INTO tstA VALUES (un sir,joi);
INSERT INTO tstA VALUES (alt sir,luni);

SELECT * FROM tstA;

Exemplul 2.6. Se creeaz tabelul tstB care conine dou coloane c1, de
lungime fix de 3 caractere i c2 de tip SET. Un element al coloanei poate reine o
submulime a mulimii {dimineata, pranz, seara}.
Pentru a vedea cum se introduce submulimea,
analizai cele trei instruciuni INSERT. n figura
alturat putei observa tabelul rezultat n urma
introducerii datelor.

Observai faptul c, la ultima inserare, se


ncearc introducerea unui ir, noaptea, care
nu este prezent n definiia tipului coloanei. Nu se
semnaleaz eroare, dar irul nu este introdus. Figura 2.5. Tabelul tstB
CREATE TABLE tstB
(c1 char(3),
c2 SET (dimineata, pranz, seara)
);

INSERT INTO tstB VALUES (abc,dimineata,seara);


INSERT INTO tstB VALUES (abc,seara,pranz);
INSERT INTO tstB VALUES (abc,seara);
INSERT INTO tstB VALUES (abc,seara,noaptea);

SELECT c1,c2 FROM tstB;


Capitolul 2. Limbajul MySQL 55

2.5.2. Tipuri de date numerice

Tipurile numerice se mpart la rndul lor n tipuri ntregi i tipuri reale.

Tipurile ntregi se gsesc n tabelul de mai jos:

Tip Descriere
Un cmp de acest tip ocup 1 octet. Reine numere ntregi
TINYINT cuprinse n intervalul [-128,127], iar dac este urmat de
UNSIGNED reine numere naturale cuprinse n intervalul [0,255].
Un cmp de acest tip ocup 2 octei. Reine numere ntregi
cuprinse n intervalul [-32768,32767], iar dac este urmat de
SMALLINT
UNSIGNED, reine numere naturale cuprinse n intervalul
[0,65535].
Un cmp de acest tip ocup 3 octeti. Reine numere ntregi
cuprinse n intervalul [-8.388.608, 8.388.607], iar dac
MEDIUMINT
este urmat de UNSIGNED, reine numere naturale cuprinse n
intervalul [0, 16.777.215].
Un cmp de acest tip ocup 4 octet.i Reine numere ntregi
cuprinse n intervalul [-2.147.483.648, 2.147.483.647], iar
INT
dac este urmat de UNSIGNED, reine numere naturale cuprinse
n intervalul [0, 4294967295].
Un cmp de acest tip ocup 8 octet.i Reine numere ntregi
cuprinse n intervalul [-9.223.372.036.854.775.808,
BIGINT 9.223.372.036.854.775.807], iar dac este urmat de
UNSIGNED, reine numere naturale cuprinse n intervalul [0,
18.446.744.073.709.551.615].

Tabelul 2.2. Tipuri de date numerice ntregi

Observaie ! Uneori vei folosi declaraii de tip de genul int(4). Aceasta


nseamn c n coloan se rezerv automat o lime de 4 caractere pentru
afiarea numerelor. De exemplu, dac numrul reinut este 1, atunci el este afiat
ca bbb1, unde prin b am notat blank-ul. Aceasta nu afecteaz valorile care pot fi
memorate. De exemplu, dac dorim s memorm numrul 12345, acesta va fi
memorat i se va afia 12345. Dar, astfel este afectat limea ntregii coloane.

Tipurile reale se gsesc n tabelul de mai jos:

Tip Descriere
FLOAT Ocup 4 octei.
DOUBLE Ocup 8 octei.
56 Manual de Informatic pentru clasa a XII-a

Numrul este stocat ca ir de caractere. Parametrul n


reprezint numrul de cifre nenule aflate naintea virgulei,
plus, dac este cazul, 1, pentru semnul -, iar d reprezint
numrul de zecimale. Dac numrul introdus are naintea
DECIMAL(n,d)
virgulei un numr de cifre +1 (pentru semn) mai mare dect
n, acesta este trunchiat, iar dac numrul de zecimale este
mai mare ca d, atunci se rein exact d zecimale. n acest din
urm caz, numrul se rotunjete la exact d zecimale.

Tabelul 2.3. Tipuri de date numerice reale

Exemplul 2.7. O coloan are tipul decimal(2,3):

Se introduce Se memoreaz i afieaz


1.1 1.100
23.4567 23.457
1 1.000
-5 -5.000
-15 -9.999

Tabelul 2.4. Cum se memoreaz i se afieaz diverse valori cu zecimale

2.5.3. Tipuri de date care rein anul, data i ora

n tabelul urmtor avei tipurile care rein anul, data i ora:

Tip Descriere
Un cmp de acest tip reine ani. O dat se introduce ca ir
de caractere. De exemplu, pentru anul 2001 se poate
YEAR
introduce 2001 sau 1, iar pentru anul 1989 se poate
introduce 1989 sau 89.
Un cmp de acest tip reine ora din zi - se introduce ca ir
TIME
de caractere sub forma hh:mm:ss.
Un cmp de acest tip reine data. Aceasta se introduce sub
DATE
forma yyyy-mm-dd. De exemplu, 1999-11-24.
Un cmp de acest tip reine date de forma dat i or. O
DATETIME dat se introduce ca ir de forma:
yyyy-mm-dd hh:mm:ss

Tabelul 2.5. Tipuri de date care rein anul, data i ora


Capitolul 2. Limbajul MySQL 57

2.6. Operatori utilizai n MySQL

ncepem prin a prezenta principalii operatori n ordinea cresctoare a


prioritii lor. Utilitatea operatorilor va fi evideniat n paragrafele urmtoare,
deocamdat doar i prezentm:

1. ||, OR, XOR


2. &&, AND
3. BETWEEN, CASE WHEN, THEN, ELSE
4. ==,>=,<=,<,>,!=,<>,IS,IS,LIKE,IN
5.|
6. &
7. <<, >>
8. -,+ (operatori binari)
9. *, /, DIV, %, MOD
10. ^
11. -,+ (operatori unari)
12. !, NOT

Pentru a putea testa un operator putei utiliza instruciunea


SELECT. De exemplu, dac dai comanda SELECT 1+1;, rezultatul se
1
vede n imaginea alturat .

Observaie foarte important ! n MySQL exist o valoare special, numit Null.


Semnificaia ei este valoare necunoscut. Modul n care este posibil ca un cmp
s rein respectiva valoare va fi prezentat ulterior. Deocamdat reinei faptul c,
dac Null este un operand, atunci rezultatul oricrei operaii care se efectueaz
cu Null este Null. Evident, dac operandul este Null, atunci el este
necunoscut, iar operaia va avea rezultat necunoscut, indiferent de cellalt operand
sau de tipul operaiei.

Exemplul 2.8. 1+NullNull sau Null=NullNull.

Operatorii se mpart, aa cum suntem deja obinuii din alte limbaje de programare,
n mai multe grupe. Acestea sunt prezentate n continuare.

2.6.1. Operatori aritmetici

Operatorii aritmetici acioneaz asupra tipurilor numerice i returneaz o


valoare de tip numeric. Pot fi analizai n Tabelul 2.6.

1
n cele ce urmeaz, pentru a evidenia rezultatul unei operaii, vom utiliza caracterul .
Spre exemplu, 1+1 2.
58 Manual de Informatic pentru clasa a XII-a

Operator Operaie Rezultat


2+3 1;
+ adunare
2 - 3 -1;
- scdere
* nmulire 3.5*26
/ mprire 5 / 2 2.5;
5 DIV 2=2;
DIV mprire ntreag -5 DIV 2 =-2
5 MOD 21
-5 MOD 2 -1
MOD sau % restul mpririi ntregi
5 % 2 1;
-5 % 2 -1
-, + Minus i plus, operatori unari --11

Tabelul 2.6. Operatori aritmetici

2.6.2. Operatori de comparare

Pot fi comparate dou valori numerice sau dou iruri. irurile se compar
lexicografic (ordinea din dicionar) i nu se face distincie ntre literele mari i cele
mici. Rezultatul este 1 pentru adevrat i 0 pentru fals.

Operator Operaie Rezultat


2 < 1 0;
< mai mic. 1 <2 0;
ab<b 1;
2 <=2 1;
<= mai mic sau egal
3>2 1
> mai mare b>ab 1

7>=7 1;
>= mai mare sau egal
7 XOR 8 0;
7=71
= egalitate
un=UN1
1<>21;
1!=21;
<> sau != diferit
1<>10
1!=10;

Tabelul 2.7. Operatori de comparare

Observaie ! Se pot compara i date de tipul TIME, DATE, etc. n fapt, o astfel de
comparare este lexicografic. Vedei exemplul 2.9!
Capitolul 2. Limbajul MySQL 59

Exemplul 2.9. Analizai operaiile de comparare de mai jos:


1:12:3<2:00:001, 1999-12-29= 1999-12-291.
1:12:3<13:00:000 - compararea s-a facut lexicografic, motiv pentru
care rezultatul este eronat.
01:12:3<13:00:001 pentru ca rezultatul s fie corect, chiar dac
compararea este lexicografic, trebuie ca orele, minutele, secundele s fie cu
acelai numr de cifre. De fapt, atunci cnd se memoreaz n baza de date o astfel
de valoare, operaia este fcut automat. Acesta este motivul pentru care
comparrile efectuate cu date memorate n baza de date sunt corecte.

2.6.3. Operatori logici

n MySQL se consider 2 valori logice: false, reprezentat de 0 i true


reprezentat de 1 i de orice valoare diferit de 0. Operatorii logici acioneaz
asupra valorilor logice i returneaz 1, pentru adevrat i 0, pentru fals.

Operator Operaie Rezultat


2 || 1 1;
sau logic, dac ambii operanzi sunt 0,
|| sau OR 0 || 1 1;
rezultatul este 0, altfel rezultatul este 1.
0 || 0 0;
i, dac ambii operanzi sunt diferii de 2 && 1 1;
&& sau 0, rezultatul este 1, altfel rezultatul este 2 && 0 0;
AND
0. 0 && 0 0;
NOT 30;
negare, dac operandul este 0,
NOT NOT 1=0;
rezultatul este 1, altfel rezultatul este 0.
NOT 0=1;
sau exclusiv, dac un operand este 0 i 7 XOR 0 1;
XOR altul diferit de 0, rezultatul este 1, altfel, 7 XOR 8 0;
rezultatul este 0. 0 XOR 0 0;

Tabelul 2.8. Operatori logici

2.6.4. Operatori logici pe bii

Se aplic tipurilor ntregi i acioneaz asupra tuturor biilor aflai pe poziii


corespondente.

Operator Operaie Rezultat


sau pe bii, dac ambii bii sunt 0,
| 2 | 1 3
rezultatul este 0, altfel rezultatul este 1.
i pe bii, dac ambii bii sunt 1,
& 2 & 1 0
rezultatul este 1, altfel rezultatul este 0.
60 Manual de Informatic pentru clasa a XII-a

sau exclusiv pe bii, dac biii sunt 10^39


^ diferii, rezultatul este 1, altfel rezultatul (1010
este 0. ^00111001)
negare, un bit 0 devine 1, un bit 1
~ ~0...011...10
devine 0.

Tabelul 2.9. Operatori logici pe bii

2.6.5. Operatori de deplasare

Se aplic tipurilor ntregi i acioneaz asupra tuturor biilor aflai pe poziii


corespondente.

Operator Operaie Rezultat


deplasare stnga, deplasare ctre stnga
a biilor operandului din stnga cu k poziii, 1<<24
<<
unde k este operandul din dreapta. Poziiile (1 trece n 100)
rmase libere se completeaz cu 0.
deplasare dreapta, deplasare ctre
4>>21
>> dreapta a biilor operandului din stnga cu k
(100 trece n 1)
poziii, unde k este operandul din dreapta.

Tabelul 2.10. Operatori de deplasare

2.6.6. Ali operatori

Operatorii IS NULL, IS NOT NULL testeaz dac o valoare este sau nu NULL
(sunt singurii operatori prin care se testeaz acest lucru)!

Exemplul 2.10. Analizai operaiile urmtoare: 1 IS NULL 0;, NULL IS


NULL 1;, 1 IS NOT NULL 1;, NULL IS NOT NULL 0;.

Operatorii IN, NOT IN testeaz apartenena unei valori la o mulime. Valoarea


poate fi de form numeric sau de un tip care reine un ir de caractere. Importana
mare pe care o au aceti operatori va rezulta studiind paragrafele urmtoare.

Exemplul 2.11. Analizai operaiile urmtoare: 1 IN(1,2,3,4) 1;,


5 IN(1,2,3,4) 0;, 1sir IN (1sir,2sir,3sir) 1;,
4sir IN (1sir,2sir,3sir) 0;.

Operatorul LIKE, NOT testeaz dac un ir de caractere ndeplinete anumite


condiii: dac este prefixat sau nu de un anumit subir, dac este postfixat sau nu
de acesta sau dac subirul se gsete n interior. Pentru substituirea unui numr
neprecizat de caractere necunoscute se utilizeaz caracterul %, iar pentru un
singur caracter neprecizat se utilizeaz caracterul _.
Capitolul 2. Limbajul MySQL 61

Exemplul 2.12. Analizai operaiile urmtoare:


popescu LIKE pop%1; (popescu este prefixat de subirul pop),
ponescu LIKE pop%0; (ponescu nu este prefixat de subirul pop),
ionescu LIKE %escu1 (ionescu este postfixat de subirul escu).

Operatorul BETWEEN min AND max testeaz dac o valoare se gsete ntre o
valoare minim i una maxim. n caz afirmativ returneaz 1, altfel, 0. Se poate
aplica i pentru date care rein iruri de caractere (ordinea lexicografic), dar i
pentru datele de timp.

Exemplul 2.13. Analizai operaiile urmtoare: 1 BETWEEN 0 AND 4 1;,


mama BETWEEN min AND lin 1;, 2 BETWEEN 2 AND 2 1;,
1 BETWEEN 2 AND 4 0;, 1999-10-31 BETWEEN 1989-12-10 AND
2000-01-011.

Operatorul CASE WHEN THEN ELSE. Poate fi aplicat n dou forme:

Forma 1. Se evalueaz v i dac produce valoarea vi se returneaz valoarea


vali, iar dac nicio condiie vi nu este ndeplinit, se returneaz valoarea valn+1:

CASE v
WHEN v1 THEN val1
[WHEN v2 THEN val2]
...
[WHEN vn THEN valn]
[ELSE valn+1]
END

Exemplul 2.14. Se afieaz doi:

CASE 2
WHEN 1 THEN unu
WHEN 2 THEN doi
WHEN 3 THEN trei
ELSE alta valoare
END;

Forma 2. n aceast form, dac este ndeplinit condiia i, se returneaz


valoarea vi,. Dac niciuna din condiiile vi nu este ndeplinit, se returneaz
valoarea vn+1:

CASE
WHEN conditie1 THEN v1
[WHEN conditie2 THEN v2]
...
[WHEN conditien THEN vn]
ELSE vn+1
END
62 Manual de Informatic pentru clasa a XII-a

Exemplul 2.14. Se afieaz adevarat:


CASE
WHEN 1<2 THEN adevarat
ELSE nu se poate
END;

2.7. Funcii MySQL

n MySQL exist o serie de funcii predefinite. ntruct astfel de funcii au fost


prezentate pentru limbajul studiat (Pascal sau C/C++), n acest paragraf vor fi
tratate pe scurt. Pot fi testate prin utilizarea instruciunii SELECT.

2.7.1. Cteva funcii matematice

Funcie Descriere Rezultat


ABS(-2) 2;
ABS(x) Modul de x.
CEIL(1.7) 2;
Cel mai mic ntreg mai mare sau
CEIL(x) CEIL(2)2;
egal cu x.
CEIL(-1.7)-1;
FLOOR(-1.7) -2
Cel mai mare ntreg mai mic sau
FLOOR(X) FLOOR(2) 2;
egal cu x.
FLOOR(1.7) 1;
EXP(x) ex EXP(1) 2.7182...
LOG(b,x) Logaritm n baza b din x. LOG(2,4) 2;
PI()3.141593
PI()
POW(x,y) xy POW(2,3)8
ROUND(2.3)2;
ROUND(x) Cel mai apropiat ntreg de x. ROUND(2.7)3;
ROUND(-2.8)-3;
SIN(x) Sinus de x. SIN(PI()/2)1;
COS(x) Cosinus de x. COS(0) 1
SIGN(2) 1;
Semnul lui x: -1, dac x<0, 0, dac
SIGN(x) SIGN(0) 0;
x=0, 1 dac x>0.
SIGN(-2) -1;
SQRT(x) Radical din x. SQRT(4) 2;

Tabelul 2.11. Funcii matematice


Capitolul 2. Limbajul MySQL 63

2.7.2. Cteva funcii care lucreaz asupra irurilor de caractere

Funcie Descriere Rezultat


LENGTH(abc) 3;
LENGTH(x) Lungimea irului x.
CONCAT(x1 CONCAT(ab,c)
,x2,..) Concateneaz irurile x1,x2,. abc
Caut dac y este subir pentru
INSTR(abc,b)2
x. n caz afirmativ, returneaz
INSTR(x,y) INSTR(abc,d)0
indicele de nceput (indicii ncep
cu 1), altfel returneaz 0.
Returneaz subirul din x care
SUBSTRING(x, SUBSTRING(abc,2,1)
p,l) ncepe n poziia p i are b
lungimea l.
RTRIM(x) Returneaz irul fr blank-urile
RTRIM(un )un
din dreapta.
LTRIM(x) Returneaz irul fr blank-urile LTRIM( un) un
din stnga.
TRIM(x) Returneaz irul fr blank-urile
TRIM( un )un
din stnga i din dreapta.
Returneaz irul scris cu litere
UPPER(x) UPPER(Un) UN
mari.
Returneaz irul scris cu litere
LOWER(x) LOWER(Un) un
mici.
Returneaz indicele apariiei
FIND_IN SET
irului x n irul de iruri FIND_IN_SET
(x,s1,s2,
s1,s2,...,sn. Dac x nu (b,a,b,c) 2
..sn)
este gsit, returneaz 0.
Convertete numrul real x la
FORMAT(x,d) un ir cu d zecimale. Pentru FORMAT(1.789,2)
ultima zecimal se face, dac 1.79
este cazul, rotunjirea.
Compar lexicografic irurile x
i y. Dac x<y returneaz -1, STRCMP(ma,mama)
STRCMP(x,y)
dac x=y returneaz 1, iar dac -1
x>y, returneaz 1.

Tabelul 2.12. Funcii care lucreaz asupra irurilor de caractere

2.7.3. Cteva funcii care lucreaz asupra datei i orei

Funcie Descriere Rezultat


Returneaz data i ora sub forma
NOW()
yyyy-mm-dd hh:mm:ss.
64 Manual de Informatic pentru clasa a XII-a

Dac x este de tipul DATA, YEAR(NOW())


YEAR(x)
afieaz anul extras din x. returneaz anul curent.
DAY(NOW())returneaz
DAY(X) Ca mai sus, extrage ziua.
ziua curent.
MONTH(NOW())
MONTH(x) Ca mai sus, extrage luna.
returneaz luna curent.
TIME(NOW())
TIME(x) Ca mai sus, extrage ora.
returneaz ora curent.
HOUR(NOW())
Ca mai sus, extrage ora ca
HOUR(x) returneaz ora curent
numr ntre 0 i 23.
ca numr ntre 0 i 23.
MINUTE(NOW())
MINUTE Ca mai sus, extrage minutul. returneaz minutul
curent
x i y sunt de tip DATETIME sau
DATEDIFF DATEDIFF(NOW(),
(x,y) DATE. Calculeaz diferena n zile 1989-12-21)
dintre x i y.
Calculeaz data care se obine
dac la valoarea data se adun DATE_ADD(NOW(),
DATE_ADD
nr, unde x specific ce este nr: INTERVAL, 10 DAY)
(data,INTERV
AL,nr, x) YEAR - ani, DAY - zile, Se obine data care va fi
MONTH - luni. peste 10 zile.

DATE_SUB(NOW(),
DATE_SUB
(data,INTERV La fel ca mai sus, numai c se INTERVAL, 10 DAY)
obine data diferen. Se obine data care a
AL,nr, x)
fost acum 10 zile.

Tabelul 2.13. Funcii care lucreaz asupra datei i orei

2.7.4. Dou funcii speciale

Funcia IF are forma de mai jos, unde expresie1 este de un tip ntreg. Dac
expresie1 este nenul, atunci se returneaz expresie2, altfel se returneaz
expresie3. Atenie: dac expresie1 este de tip real, se rotunjete la cel mai
apropiat ntreg. Dac, de exemplu, acesta este 0.41, atunci se rotunjete la 0, prin
urmare, rezultatul va fi altul...
IF(expresie1,expresie2,expresie3)
Exemplul 2.15. Analizai exemplele urmtoare: IF (1>2, adevarat,
fals) adevarat, IF (0.45, nu,da) da;.

Funcia IFNULL are forma de mai jos. Dac expresie1 nu este NULL, returneaz
expresie1,, altfel returneaz expresie2.
IFNULL(expresie1, expresie2)
Capitolul 2. Limbajul MySQL 65

Exemplul 2.16. Analizai exemplele urmtoare: IFNULL (0,este null)


0, IFNULL (NULL,este NULL) este NULL.

2.8. Afiarea coloanelor care rezult n urma unui calcul

O regul elementar n crearea i utilizarea bazelor de date spune c


acestea vor reine numai date care nu rezult n urma unui calcul.
Nerespectarea ei conduce la baze de date care ocup mult spaiu. Acum vom
nva s afim datele care rezult n urma unui calcul.

Exemplul 2.17. Privii tabelul din Fig. 2.6, numit prod, care reine produsele
existente ntr-un depozit. Pentru fiecare produs se cunoate cantitatea (cant) i
preul unitar (pret_unitar), preul unui exemplar din produsul respectiv. S
presupunem c dorim ca, pe lng informaiile afiate, s aflm valoarea total
pentru fiecare produs n parte. Valoarea se obine ca produs ntre cantitate i preul
unitar.

Figura 2.6. Tabelul prod

Pentru aceasta, atunci cnd afim tabelul, vom crea o nou coloan sub forma:
expresie AS nume_coloana, unde expresie calculeaz valorile din coloana
respectiv, iar nume_coloana va fi numele ei. Iat cum se afieaz noul tabel,
prezentat mai jos:

Figura 2.7.
Tabelul rezultat

SELECT den, cant, pret_unitar,


cant*pret_unitar AS valoare FROM prod;

Exemplul 2.18. Se d tabelul alturat, numit persoane.


Se cere s se separe numele de prenume i s se
afieze datele ca mai jos:

Figura 2.8. Tabelul


persoane
Figura 2.9.
Tabelul dorit
66 Manual de Informatic pentru clasa a XII-a

Rezolvare. Se utilizeaz funcii care opereaz asupra irurilor de caractere:


SELECT SUBSTRING(nume,1,INSTR(nume, )-1)
AS prenume
SUBSTRING(nume, 1+INSTR(nume, ),LENGTH(nume)) AS nume
FROM persoane;

Exemplul 2.19. Se consider tabelul din Fig. 2.10, numit pers, care cuprinde
numele i data naterii pentru dou persoane:

Figura 2.10. Tabelul


pers

Se cere s se afieze numele i vrsta


fiecrei persoane.
Figura 2.11.
Tabelul dorit

Rezolvare. Se utilizeaz funcii care opereaz asupra cmpurilor de tip DATE i


DATETIME.

SELECT nume, YEAR(NOW())-YEAR(data_n) AS varsta FROM pers;

Exemplul 2.20. Se consider un tabel, numit numar,


alctuit dintr-o singur coloan, c de tip INT. Se cere s
se listeze acea coloan i o alta, numit paritate,
care s conin dou valori: par dac numrul din c
este par i impar, n caz contrar (vezi figura alturat).

SELECT c, IF(C MOD 2, impar,par) AS


paritate FROM numar;
Figura 2.12.
Tabelul rezultat

2.9. Valoarea NULL

n MySQL, aa cum s-a artat, exist o valoare special, numit NULL.


Semnificaia ei este nicio valoare.

Atunci cnd definim o coloan se poate trece specificatorul NULL. Oricum,


se asum implicit, NULL. De altfel, acest lucru poate fi testat. Creai un tabel, de
exemplu, cu o coloan de un anumit tip, fr a specifica NULL sau NOT NULL i
apoi dai comanda SHOW COLUMNS FROM nume_tabel; i analizai tabelul
afiat! Exerciiu!
Capitolul 2. Limbajul MySQL 67

a) Atunci cnd o coloan are trecut specificatorul NULL sau nu s-a trecut nimic i
la introducerea unui rnd, pentru coloana respectiv, nu este trecut o valoare
pentru acel cmp, acolo se va memora valoarea special NULL.

b) Atunci cnd o coloan are trecut specificatorul NOT NULL i la introducerea


unui rnd, n coloana respectiv, nu este trecut o valoare, acolo se va memora:
- 0, dac coloana este de tip numeric;
- irul vid, dac coloana este de un tip care permite reinerea de iruri;
- indicele 0 din ir, dac coloana este de tip ENUM i aceasta are ca efect
afiarea primului ir al enumerrii;
- mulimea vid, dac coloana este de tip SET.

Analizai exemplele urmtoare i verificai, de fiecare dat, tabelul afiat.

Exemplul 2.21. Rulai secvena de mai jos i se va afia


tabelul alturat:
CREATE TABLE testnull
(c1 INT NULL,
c2 INT NOT NULL);
Figura 2.13.
INSERT INTO testnull (c2) VALUES (10); Tabelul rezultat
INSERT INTO testnull (c1) VALUES (7);

SELECT * FROM testnull;

Exemplul 2.22. Se creeaz tabelul alturat, n care


coloanele rein iruri de caractere:
CREATE TABLE testnull1
(c1 TEXT NULL,
c2 TEXT NOT NULL); Figura 2.14.
INSERT INTO testnull1(c1) VALUES (Un sir); Tabelul rezultat
INSERT INTO testnull1(c2) VALUES (Alt sir);

SELECT * FROM testnull1;

Exemplul 2.23. Se creeaz tabelul din figura alturat, n


care coloanele rein date de tip ENUM:

CREATE TABLE testnull2


( c1 ENUM(sir1,sir2,sir3) NULL,
c2 ENUM(sir1,sir2,sir3) NOT NULL); Figura 2.15.
Tabelul rezultat
INSERT INTO testnull2(c1) VALUES (sir2);
INSERT INTO testnull2(c2) VALUES (sir1);

SELECT * FROM testnull2;


68 Manual de Informatic pentru clasa a XII-a

Exemplul 2.24. Se creeaz tabelul alturat, n care


coloanele rein date de tip SET.
CREATE TABLE testnull3
( c1 SET(sir1,sir2,sir3) NULL,
c2 SET(sir1,sir2,sir3) NOT NULL); Figura 2.16.
Tabelul rezultat
INSERT INTO testnull2(c1) VALUES (sir1,sir2);
INSERT INTO testnull2(c2) VALUES (sir3);
SELECT * FROM testnull3;

Aa cum am artat, semnificaia lui NULL este nicio valoare. De asemenea, am


nvat c o operaie n care un operand este NULL, va avea rezultatul NULL. Acest
fapt este util, pentru c, n caz contrar s-ar putea ajunge la rezultate false.

Exemplul 2.25. Tabelul alturat


elev prezint numele, nota la
englez i nota la francez
pentru doi elevi. Unul dintre ei,
nu are not la francez (NULL). Figura 2.17. Tabelul elev

Se cere s se calculeze mediile celor doi


elevi. Scriem interogarea:
SELECT nume,
(engleza+franceza)/2 AS media;
Figura 2.18. Rezultatul interogrii
S observm c pentru elevul cruia nu i se cunoate nota la francez, nu i
se cunoate nici media. Logic vorbind, aa este corect. Dac nu se cunoate o
not, nu se cunoate nici media deoarece n-ar fi normal ca pentru acest elev s se
afieze media 10...

2.10. Valori implicite


n practic, nu ntotdeauna se cunosc datele n totalitate. n astfel de cazuri,
atunci cnd pentru un anumit rnd nu se cunoate un cmp, fie acesta va reine
NULL, fie va reine o valoare implicit, convenabil aleas. De exemplu, dac la un
examen de admitere un elev nu se prezint la o prob, se poate lua decizia ca, la
acea prob, elevul s primeasc nota 1.
Pentru ca un cmp, n absena datelor s aib o valoare implicit, se
folosete specificatorul DEFAULT:
DEFAULT valoare_implicita

Facem observaia c pot lua valori implicite cmpurile cu lungime fix. De


exemplu, un cmp declarat CHAR(20) poate lua o valoare implicit, dar unul
declarat TEXT nu poate lua o astfel de valoare.
Capitolul 2. Limbajul MySQL 69

Exemplul 2.26. n tabelul urmtor, se rein numele i oraul de domiciliu pentru


mai multe persoane:

Figura 2.19.
Tabelul propus

Dac oraul de domiciliu nu este cunoscut, se prefer, n locul valorii NULL, s fie
afiat irul necunoscut:

CREATE TABLE pers_oras


(nume CHAR (25),
domiciliu CHAR(30) DEFAULT necunoscut);

INSERT into pers_oras (nume) VALUES (Gulagea Constantin);


INSERT into pers_oras VALUES (Ionescu Mihai, Galati );

SELECT * FROM pers_oras;

2.11. Cheie primar i cheie unic

A) Cheia primar este constituit dintr-un cmp (sau mai multe cmpuri) i trebuie
s ndeplineasc simultan condiiile:
a) Valorile reinute de coloana care alctuiete cheia primar trebuie s fie
distincte. n cazul n care cheia este alctuit din mai multe coloane, pentru a
avea dou chei distincte, este necesar ca acestea s fie diferite pentru cel
puin o coloan dintre ele. Tentativa de a nscrie n tabel o nregistrare care are
cheia primar identic cu alta, existent n tabel, este sancionat cu eroare.
b) Cmpul (cmpurile) care alctuiete (alctuiesc) cheia primar trebuie s
aib o lungime fix. De exemplu, nu poate fi cheie primar un cmp de tip TEXT.

Raiunea existenei cheii primare este dat de accesul foarte rapid la


nregistrarea de cheie dat. Trebuie tiut c nregistrrile unui tabel se rein n
ordinea introducerii lor. Atunci cnd, de exemplu, un cmp este declarat cheie
primar, se construiete un tabel auxiliar, invizibil pentru utilizator, n care pentru
fiecare valoare din cmpul cheie primar se reine poziia rndului care are acea
cheie. n acel tabel, cheile sunt n ordine cresctoare (dac este vorba de iruri de
caractere, acestea se rein n ordine lexicografic, ca mai jos). Pornind de la cheie,
n tabelul invizibil se identific rapid rndul cu acea cheie. n acest caz, se
folosete cutarea binar, algoritm studiat la informatic (revedei) i, dup cum
tii, o astfel de cutare se face n O(log(n)). Din acel rnd se afl poziia
nregistrrii cu acea cheie din tabelul iniial. De aici, accesul la nregistrare este
imediat. Cutarea clasic se efectueaz n O(n).
70 Manual de Informatic pentru clasa a XII-a

Exemplul 2.27. Presupunem c tabelul principal are drept cheie primar cmpul
"Nume":

Tabel principal Tabel invizibil


Nume Vrst nlime (cm) Nume Poziie
Ion 15 173 Ana 3
Maria 17 159 Cristian 4
Ana 21 159 Ion 1
Cristian 12 171 Maria 2
Mihai 18 182 Mihai 5

Pentru a preciza c o anumit coloan este cheie primar se folosete, atunci cnd
se descrie coloana, specificatorul PRIMARY KEY.

Exemplul 2.28. Se creeaz un tabel n care prima coloan este cheie primar:
CREATE TABLE ex_cheie_primara_un_camp
(c1 INT PRIMARY KEY,
c2 TEXT
);

Dac cheia primar este alctuit din mai multe cmpuri, dup descrierea
coloanelor, se utilizeaz specificatorul PRIMARY KEY sub forma:
PRIMARY KEY(nume_col1, nume_col2,...)

Exemplul 2.29. n tabelul urmtor cu trei coloane, coloanele c1 i c2 alctuiesc


cheia primar:
CREATE TABLE cheie_primara_doua_campuri
(c1 INT,
c2 CHAR(10),
c3 TEXT,
PRIMARY KEY(c1,c2)
);

B) Cheie unic - se poate cere ca o coloan (sau mai multe) s conin numai
valori distincte. Pentru aceasta se va utiliza specificatorul UNIQUE KEY. n acest
caz, dac n coloana respectiv se va ncerca o inserare cu o valoare care exist
deja, se va semnala eroare.
Observaie ! i n acest caz, nu este permis s solicitm valori distincte pentru o
coloan de un tip de lungime variabil (cum ar fi, de exemplu, tipul TEXT).
Exemplul 2.30. Se creeaz un tabel n care n ambele coloane vor fi numai valori
distincte:
CREATE TABLE distincte
( c1 INT UNIQUE KEY,
c2 char(10) UNIQUE KEY
);
Capitolul 2. Limbajul MySQL 71

2.12. Autoincrementare

Cu siguran, ai vzut o mulime de tabele n care rndurile sunt


numerotate. Mai jos, avei un astfel de tabel, cu numele unor persoane:

Figura 2.20. Tabelul cu


numr de ordine

Este incomod, ca la introducerea fiecrui rnd s se specifice numrul de


ordine pentru rndul respectiv. Din acest motiv, s-a pus la dispoziia clienilor un
mecanism prin care incrementarea se face automat.

Pentru ca o coloan s rein numerele de ordine al rndurilor respective,


este necesar ca, la definirea ei, s se utilizeze specificatorul AUTO_INCREMENT.
Pentru a putea utiliza acest specificator, este necesar s fie ndeplinite condiiile:
a) coloana s fie de un tip ntreg;
b) coloana s rein numai valori distincte - pentru a determina aceasta,
coloana trebuie s fie declarat ca fiind cheie primar sau cu cheie unic.
Exemplul 2.31. Iat cum am creat tabelul din Fig. 2.20, numit auto:
CREATE TABLE auto
(nr_ord INT UNIQUE KEY AUTO_INCREMENT,
nume CHAR(20)
);
INSERT INTO auto (nume) VALUES(Marius Oprean);
INSERT INTO auto (nume) VALUES(Mihai Minca);

Exist i posibilitatea s se introduc valori dorite n coloana declarat cu


autoincrementare. n acest caz, la urmtoarele introduceri, valorile implicite vor fi
obinute pornind de la valoarea introdus.
Exemplul 2.32. Analizai tabelul alturat,
obinut din cel anterior, la care s-au mai fcut
inserrile de mai jos:
Figura 2.21. Tabel
modificat

INSERT INTO auto VALUES(7,Doru Cran);


INSERT INTO auto (nume) VALUES(Dan Bitu);
72 Manual de Informatic pentru clasa a XII-a

2.13. Sortarea datelor

Uneori este necesar ca datele s fie afiate sortate


dup valorile unei coloane sau dup valorile mai
multor coloane. Dac acestea sunt de tip ir de
caractere, ele pot fi sortate n ordine lexicografic.
Alturat avei un tabel, numit sortare, pe care
vom exersa modul de afiare a datelor sortate dup
anumite criterii.
Figura 2.22. Tabel sortare

Exemplul 2.33. Datele sunt afiate sortate cresctor,


dup valorile existente n coloana nume. S
observm c sortarea cresctoare este cea implicit,
pentru a o obine nu este necesar s o specificm:
SELECT * FROM sortare ORDER BY nume;

Figura 2.23. Tabelul sortat cresctor

Exemplul 2.34. Pentru a sorta datele descresctor,


se folosete specificatorul DESC. Mai jos, am sortat
datele descresctor dup valorile cmpului
data_n (data naterii):

SELECT * FROM sortare ORDER BY


data_n DESC;
Figura 2.24. Tabelul sortat
descresctor dup data naterii

Exist posibilitatea s sortm datele (cresctor sau descresctor) dup valorile


existente n mai multe coloane. Practic, mai nti se sorteaz datele dup prima
coloan specificat, apoi, pstrnd aceast ordine, dup a doua coloan, .a.m.d.
Exemplul 2.35. Datele sunt sortate cresctor
dup valorile existente n coloana nume, apoi,
pstrnd aceast ordine, descresctor dup
valorile din coloana data_n.

SELECT * FROM sortare ORDER BY nume,


data_n DESC;
Figura 2.25. Tabelul sortat cresctor
dup ambele coloane

Observaie ! Avem dou persoane cu numele Mihai. Mai nti este afiat
persoana nscut n 1980, apoi cea nscut n 1975 (sortate descresctor dup
cmpul data_n).
Capitolul 2. Limbajul MySQL 73

Exemplul 2.36. Exist posibilitatea s afim


numai un numr dorit de rnduri. Pentru aceasta
se folosete clauza LIMIT, ca mai jos:
SELECT * FROM sortare ORDER BY nume
LIMIT 3;
Figura 2.26. Afiarea unor rnduri din tabel

2.14. Filtrarea datelor

Uneori nu suntem interesai s fie afiate toate liniile tabelului, ci numai


unele, care ndeplinesc anumite condiii. O astfel de operaie se numete
filtrare. Pentru a realiza operaia de filtrare se ataeaz instruciunii SELECT, la
sfrit, clauza WHERE condiie. n acest fel, sunt selectate numai liniile pentru
care condiia din clauza WHERE este ndeplinit. n cazul n care datele se cer
sortate, clauza ORDER BY se va trece dup WHERE.

Exemplul 2.37. Se consider un tabel precum cel de mai jos, n care se prezint
situaia colar a elevilor unei clase:
CREATE TABLE elevi
( nume TEXT,
matematica INT, engleza INT, informatica INT);

Figura 2.27. Tabelul elevi

1. Afiai numele elevilor care au la matematic note


mai mari sau egale cu 8.
SELECT nume FROM elevi Figura 2.28.
WHERE matematica>=8; Exemplu de filtrare

2. La fel ca mai sus, numai c se cere ca numele


elevilor s fie afiate n ordine alfabetic.
SELECT nume FROM elevi
Figura 2.29.
WHERE matematica>=8 Exemplu de filtrare
ORDER BY nume;
74 Manual de Informatic pentru clasa a XII-a

3. Se cere s se afieze numele elevilor care au promovat la fiecare materie i


media general pe care acetia o au.
SELECT nume, (matematica+engleza+informatica)/3 AS media
FROM elevi
WHERE matematica>4 AND engleza>4 AND informatica>4;

Figura 2.30.
Exemplu de filtrare

Observaie ! Filtrarea datelor este un caz considerat particular al unui concept cu


mult mai general, interogarea! De obicei, interogm o baz de date cu ajutorul
instruciunii SELECT.

2.15. Actualizri ntr-un tabel

n general, prin actualizarea unui tabel nelegem modificarea datelor


reinute de acesta i/sau modificarea structurii sau numelui tabelului.

A) Prin actualizarea datelor dintr-un tabel nelegem operaii precum inserarea


unor linii, modificarea valorilor unor cmpuri i tergerea unor rnduri.

A1) Pentru inserare, putem utiliza instruciunile de mai jos:

1. INSERT INTO nume_tabel [(nume_col1, nume_col2..)


VALUES(expresie1, expresie2...)

Aceast instruciune a fost deja prezentat, nu vom mai reveni asupra ei.
2. INSERT INTO [DISTINCT} nume_tabel [(nume_col1, nume_col2..)
SELECT ....

ntr-un tabel se pot insera linii dintr-un alt tabel. Pentru aceasta se folosete
instruciunea de mai sus (vezi Exemplul 2.38, pct. 1). Dac se dorete inserarea
numai a liniilor distincte din tabelul surs, utilizai specificatorul DISTINCT.

A2) Pentru a modifica valorile reinute de un cmp sau mai multe, se utilizeaz
instruciunea de mai jos (vezi Exemplul 2.38, pct. 2):

UPDATE nume_tabel
SET coloana1=expresie1,
...
coloanak=expresiek
[WHERE conditie];
Capitolul 2. Limbajul MySQL 75

n urma executrii acestei comenzi, pentru fiecare rnd din tabel care
ndeplinete condiia din WHERE, se actualizeaz coloanele indicate de SET cu
expresiile corespunztoare.

Observaie ! n absena clauzei WHERE sunt afectate toate rndurile din tabel.

A3) tergerea unui rnd sau a mai multor rnduri se face cu instruciunea de mai
jos (vezi Exemplul 2.38, pct. 3 i pct. 4):
DELETE FROM nume_tabel
[WHERE conditie]

Observaie ! n absena clauzei WHERE sunt terse toate rndurile din tabel.

B) Modificri ale numelui tabelului sau a structurii acestuia.

B1) Pentru a modifica numele unui tabel se utilizeaz instruciunea:

RENAME TABLE nume_vechi TO nume_nou

B2) Pentru tergerea unei coloane, chiar dac conine date, se utilizeaz
instruciunea:
ALTER TABLE nume_tabel
DROP COLUMN nume_coloana

B3) Pentru adugarea unei coloane cu un tip de date, se utilizeaz instruciunea:

ALTER TABLE nume_tabel


ADD nume_col tip;

Exemplul 2.38. Fie tabelele de mai jos, ambele cu aceleai coloane, de acelai tip:

Figura 2.31. Tabelul prs Figura 2.32. Tabelul prs1

1. Se cere s se insereze n tabelul prs, acele


persoane din prs1 care sunt din Craiova.
Alturat, vedei tabelul prs actualizat.

INSERT INTO prs (nume, oras)


SELECT nume, oras FROM prs1 WHERE
oras=craiova;
Figura 2.33.
Tabelul prs actualizat
76 Manual de Informatic pentru clasa a XII-a

2. S-a observat c Ioana i Florin sunt de fapt


din braila. Corectai datele din tabel! Alturat avei
afiat tabelul cu datele actualizate.

UPDATE prs
SET oras=braila
WHERE nume IN (ioana, florin); Figura 2.34. Tabelul actualizat

3. tergei din tabelul prs nregistrarea n care


numele este Mirela (vezi figura alturat):

DELETE FROM prs


WHERE nume=Mirela; Figura 2.35.

4. Creai un nou tabel prs2, cu aceeai structur


ca i prs, care s conin numai persoanele din
prs care sunt din Braila i Ploiesti.

CREATE TABLE prs2 AS


SELECT nume, oras FROM prs Figura 2.36. Tabelul nou prs2
WHERE nume IN (braila, ploiesti);

Exemplul 2.39. n tabelul alturat, prs, exist


mai multe nregistrri identice. Se cere s se
elimine duplicatele.

a) Crem un alt tabel, de manevr, numit mand,


care conine aceleai nregistrri cu prs, doar c
au fost eliminate duplicatele:
CREATE mand AS
SELECT distinct nume, oras FROM prs;
Figura 2.37. Tabelul prs
b) tergem tabelul prs: DROP TABLE prs;

c) Redenumim tabelul mand ca prs i-l afim


pe prs:
RENAME TABLE mans TO PRD;
SELECT * FROM prs; Figura 2.38.
Tabelul rezultat

Observaie! Mare atenie cnd efectuai astfel de operaii. n cazurile reale, n care
tabelele au mii de rnduri, se pot produce pierderi de date. Din acest motiv, nainte
de a actualiza un tabel, este bine s-i creai o copie de siguran pe care, dup ce
ai rezolvat problema, s-o tergei.
Capitolul 2. Limbajul MySQL 77

2.16. Funcii agregate


Toate calculele fcute pn n prezent au avut ca operanzi doar cmpurile
unui aceluiai rnd. ntrebarea este: se pot efectua calcule cu valorile reinute de o
coloan? Rspunsul este afirmativ. Pentru astfel de calcule se utilizeaz
aa-numitele funcii agregate. n cele ce urmeaz, prezentm aceste funcii, iar
pentru exemplificare utilizm tabelul elevi, tabel pe care l-am creat n paragraful
2.14. Funciile agregate sunt prezentate n tabelul de mai jos:

Nume funcie Ce realizeaz


Sub forma COUNT(*), afieaz numrul de linii ale tabelului.
COUNT() Sub forma COUNT(nume_coloana), numr valorile, din
coloana de nume dat, care nu sunt NULL.
Sub forma MIN(nume_coloana), calculeaz cea mai mic
MIN()
valoare din coloan. Valorile NULL sunt ignorate.
Sub forma MAX(nume_coloana), calculeaz cea mai mare
MAX()
valoare din coloan. Valorile NULL sunt ignorate.
Sub forma SUM(nume_coloana), calculeaz suma valorilor
SUM()
dintr-o coloan. Valorile NULL sunt ignorate.
Sub forma AVG(nume_coloana), calculeaz media aritmetic
AVG()
a valorilor dintr-o coloan. Valorile NULL sunt ignorate.

Tabelul 2.14. Funcii agregate

Exemplul 2.40. Ci elevi sunt n tabel?


SELECT COUNT(*)
Figura 2.39.
AS numar_elevi FROM elevi;

Exemplul 2.41. Care este numrul de note la


englez? Se afieaz 4, pentru c un elev nu are
not la aceast disciplin (NULL).
SELECT COUNT(engleza) AS Figura 2.40.
numar_note_engleza FROM elevi;

Exemplul 2.42. Care este media notelor la informatic?


SELECT AVG(informatica) AS
media_note_informatica FROM elevi;
Figura 2.41.
Exemplul 2.43. Ci elevi au nota 10 la englez?
SELECT COUNT(engleza) AS elevi_de_zece FROM
elevi
WHERE engleza=10;
Figura 2.42.
78 Manual de Informatic pentru clasa a XII-a

Exemplul 2.44. Ci elevi au media general peste 8?

SELECT COUNT(nume) AS elevi_peste_8


WHERE (matematica+engleza+informatica)/3>8;
Figura 2.43. Rezultat

2.17. Utilizarea subinterogrilor

Aa cum am artat, filtrrile sunt cazuri particulare de interogri. n general,


orice rezultat care este obinut cu ajutorul unei instruciuni SELECT este o
interogare. La modul general, o interogare poate returna:
A) o coloan, eventual cu un singur rnd;
B) mai multe coloane - n acest caz se poate spune c interogarea
returneaz un tabel.
Problema care se pune n continuare este urmtoarea: pot fi utilizate datele
returnate de o interogare pentru a efectua o nou interogare? Rspunsul este, n
general afirmativ i este valabil ncepnd cu versiunea MySQL incorporat n
versiunea EasyPHP 1.8. n aceste cazuri, prima interogare care se efectueaz
este interogarea subordonat. Rezultatul ei este utilizat pentru a efectua o nou
interogare. Vom considera, pe rnd, cazurile n care interogarea subordonat
returneaz o valoare, o coloan i un tabel (mai multe coloane). Toate exemplele
care urmeaz vor avea ca baz de plecare tabelul elevi, utilizat i n paragrafele
anterioare.

A) Interogarea subordonat returneaz o coloan cu un singur rnd

Exemplul 2.45. Se cere s se determine numele elevilor care au cea mai mare
not la matematic.

Figura 2.44.
Rezultatul dorit

Practic, ar trebui s vedem care este cea mai mare not la matematic, o prim
interogare, problem pe care o rezolvm utiliznd funcia agregat MAX(), apoi
ntr-o nou interogare, aflm numele elevilor care au aceast not. n acest caz,
interogarea subordonat returneaz o valoare, cea maxim.
SELECT nume, matematica FROM elevi
WHERE matematica=(SELECT MAX(matematica) FROM elevi);

Mai nti, se execut interogarea subordonat, apoi cea care o subordoneaz. n


acest caz, interogarea subordonat calculeaz nota maxim obinut la
matematic (s observm c aceasta nu este n mod obligatoriu 10), iar cealalt
interogare returneaz numele elevilor cu aceast not.
Capitolul 2. Limbajul MySQL 79

Exemplul 2.46. Se cer numele elevilor care au cea mai mare medie la obiectele
matematic i informatic. Vom proceda n acelai mod. n primul rnd, selectm
media maxim la obiectele amintite, apoi numele elevilor cu aceast medie.
SELECT nume, (matematica+informatica)/2 AS media FROM elevi
WHERE (matematica+informatica)/2=
(SELECT MAX((matematica+informatica)/2) FROM elevi);

Figura 2.45.
Rezultatul obinut

Exemplul 2.47. Se cer numele elevilor i media general, unde media general a
lor este strict mai mare dect media elevilor din tabel. Se cere, de asemenea, ca
elevii s fie ordonai n ordinea cresctoare a mediilor.

Interogarea subordonat calculeaz media general a elevilor, iar prima interogare


afieaz elevii care au media general peste aceasta.
SELECT nume, (matematica+informatica+engleza)/3 AS media FROM elevi
where (matematica+engleza+informatica)/3>
(SELECT AVG((matematica+engleza+informatica)/3) FROM elevi)
ORDER BY media DESC;

Figura 2.46.
Rezultatul obinut

Exemplul 2.48. Care este numele elevilor care au aceeai not la matematic ca
i elevul Popescu Marius? n acest caz, interogarea subordonat returneaz
nota la matematic a elevului Popescu Marius, iar interogarea care o
subordoneaz returneaz numele elevilor care au aceast not:
SELECT nume FROM elevi WHERE matematica=
(SELECT matematica FROM elevi
WHERE nume=Popescu Marius); Figura 2.47.
Rezultatul obinut

B) Interogarea subordonat returneaz un tabel

n acest caz, tabelul returnat de interogarea subordonat trebuie s aib un


nume. Acesta se d cu ajutorul clauzei AS. De asemenea, interogarea care
subordoneaz adreseaz cmpurile tabelului, pornind de la numele su, urmat de
. i de numele coloanei.

Exemplul 2.49. Care este media general la matematic i la informatic a elevilor


care au cel puin 8 la una dintre discipline?
80 Manual de Informatic pentru clasa a XII-a

Tabelul returnat de interogarea subordonat conine notele la matematic i


la informatic ale elevilor care au cel puin 8 la una dintre aceste discipline. Acest
tabel se numete virtual. Interogarea principal calculeaz mediile la matematic i
informatic ale acestor elevi.
SELECT AVG(virtual.matematica) AS medie_mate,
AVG(virtual.informatica) AS medie_info FROM
(SELECT matematica, informatica FROM elevi
WHERE matematica>=8 OR informatica>=8) AS virtual;

Figura 2.48.
Rezultatul obinut

2.18. Gruparea datelor

Datele dintr-un tabel pot fi grupate n funcie de valorile dintr-o anumit


coloan. De exemplu, datele din tabelul din Fig. 2.49 pot fi grupate dup valorile
din coloana data. Astfel, un grup este alctuit din rndurile de tabel
corespunztoare datei 2006-03-15, altul, corespunztoare datei 2006-03-16,
..., altul corespunztor unei date necunoscute (NULL). Prelucrrile datelor din
fiecare grup se fac cu ajutorul funciilor agregate, aa cum suntem deja obinuii.
Pentru a grupa datele din tabel dup valorile unei coloane se utilizeaz clauza
GROUP BY nume_coloana, adugat dup numele tabelului. Exemplele care
urmeaz v vor lmuri!

Exemplul 2.50. Se consider tabelul


vanzari cu structura de mai jos
care conine data vnzrii, numele
produsului vndut i valoarea
vnzrii din produsul respectiv:

CREATE TABLE vanzari


( data DATE,
produs CHAR(15),
valoare INT);

Figura 2.49.
Tabelul vanzari

ntrebri:

1. Care este numrul de vnzri din fiecare zi? Grupm datele dup dat i
numrm vnzrile pentru fiecare grup.
Capitolul 2. Limbajul MySQL 81

SELECT data, COUNT(*) AS numar_vanzari FROM vanzari


GROUP BY data;

Figura 2.50. Numrul de


vnzri din fiecare zi

2. Care este suma vnzrilor zilnice? Grupm datele dup dat i nsumm
vnzrile pentru fiecare dat n parte:
SELECT data, SUM(valoare) AS
suma_vanzari FROM vanzari
GROUP BY data;

Figura 2.51. Suma


vnzrilor zilnice

3. Care este numrul de vnzri i suma vnzrilor n fiecare zi (se va afia un


singur tabel)?
SELECT data, COUNT(*) AS nr_vanzari, SUM(valoare) AS suma_incasata
FROM vanzari GROUP BY data;

Figura 2.52. Numrul de


vnzri i suma ncasat
din fiecare zi

4. Care este data n care am am vnzri n valoare maxim, cte vnzri au fost
i care este suma ncasat?

Ar trebui s obinem un tabel care s conin data i suma vnzrilor zilnice, apoi,
din aceasta s selectm vnzarea maxim i, apoi, data la care s-a efectuat
vnzarea zilnic. n MySQL, n varianta de care dispunem, nu este permis mai
mult de o interogare cu subordonata sa. Din acest motiv, vom crea un tabel de
manevr (manevra) care conine data i suma vnzrilor zilnice (ca la punctul 2).
Apoi din acesta, utiliznd o interogare cu subinterogare, vom extrage datele cerute.
n final, vom terge tabelul manevra.
CREATE TABLE manevra AS
SELECT data, SUM(valoare) AS vanzare
FROM vanzari GROUP BY data;

Pentru prob, afim tabelul manevra.


SELECT * FROM manevra;
Figura 2.53. Tabelul manevra
82 Manual de Informatic pentru clasa a XII-a

Pornind de la manevra, obinem datele cerute.


SELECT data, vanzare FROM manevra
WHERE vanzare=
(SELECT MAX(vanzare) FROM manevra);

tergem tabelul manevra: Figura 2.54. Rezultatul final


DROP TABLE manevra;

2.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 fiecrui tabel din uniune. Pentru tabelele care
alctuiesc uniunea se pot utiliza 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. n aceste cazuri, adresarea unei coloane a tabelului se face
sub forma: alias_nume.nume_col.

Avantajele utilizrii alias-urilor sunt:


- se pot asigura nume scurte pentru tabele, gen A, B,..., etc.
- n cazul auto-uniunilor, caz care este prezentat n actualul paragraf, un
singur tabel poate avea alias-uri diferite, fapt care permite anumite
interogri speciale ca i cum am avea mai multe tabele: A, B, etc. n astfel
de cazuri, atunci cnd ne referim la o coloan, pentru a nu se crea
confuzie, trebuie precizat tabelul, cum ar fi de exemplu: A.nume_col,
B.nume_col, etc.

1) O prim form de realizare a unei uniuni este utilizarea instruciunii SELECT n


care la clauza FROM se trec, pe rnd, toate tabelele care o alctuiesc, iar legtura
este precizat cu ajutorul clauzei WHERE. Vezi exemplele 2.51, pct. 1.a), 4, 5.
2) Atunci cnd uniunea este alctuit din dou tabele, se poate preciza o
legtur de tip INNER sub forma de mai jos. n astfel de cazuri, se afieaz datele
din tabel1 i din tabel2, pentru care este ndeplinit condiia din ON. O astfel de
uniune se mai numete i uniune interioar. Vezi exemplul 2.51, pct. 1.b)!
nume_tabel1 [AS...]INNER JOIN nume_tabel2 [AS...]
ON conditia de uniune

3) Atunci cnd uniunea este alctuit din dou tabele, se poate preciza o
legtur de tip LEFT OUTER sub forma de mai jos. n astfel de cazuri, se afieaz
toate datele din tabel1, iar datele din tabel2 se afieaz numai dac este
Capitolul 2. Limbajul MySQL 83
ndeplinit condiia din ON, altfel, n locul lor se afieaz valoarea implicit (NULL,
de cele mai multe ori). O astfel de uniune se mai numete i uniune exterioar
stnga. Vezi exemplul 2.51, pct. 2.
nume_tabel1 [AS...]LEFT JOIN nume_tabel2 [AS...]
ON conditia de uniune

4) Atunci cnd uniunea este alctuit din dou tabele, se poate preciza o
legtur de tip RIGHT OUTER sub forma de mai jos. n astfel de cazuri, se afieaz
toate datele din tabel2, iar datele din tabel1 se afieaz numai dac este
ndeplinit condiia din ON, altfel, n locul lor se afieaz valoarea implicit (NULL,
de cele mai multe ori). O astfel de uniune se mai numete i uniune exterioar
dreapta. Vezi exemplul 2.51, pct. 3.
nume_tabel1 [AS...]LEFT JOIN nume_tabel2 [AS...]
ON conditia de uniune

Exemplul 2.51. Privii tabelele de mai jos, numite "produse" (cel din stnga) i
"date_produse" (cel din dreapta). Logic, legtura dintre ele este dat de
coloanele "cod", din fiecare tabel. Astfel, pentru un cod dat, din tabelul "produse"
se poate extrage cantitatea existent ntr-un magazin dintr-un anumit produs i
denumirea produsului, productorul su din tabelul "date_produse".

Figura 2.55. Cele dou tabele propuse ca exemplu

1. Pentru fiecare produs existent n magazin,


care este trecut n tabelul "date_produse", s
se afieze denumirea i cantitatea. Pentru a
rezolva aceast problem, vom utiliza dou forme
de interogare i ambele dau acelai rezultat.
a)
Figura 2.56.
SELECT B.denumire, A.cantitate Rezultatul interogrilor
FROM produse AS A, date_produse AS B
WHERE A.cod=B.cod;

b)
SELECT B.denumire, A.cantitate
FROM produse AS A INNER JOIN date_produse AS B
ON A.cod=B.cod;
84 Manual de Informatic pentru clasa a XII-a

2. La fel ca la punctul anterior, numai c se vor


trece datele existente pentru toate produsele din
tabelul produse:

SELECT B.denumire, A.cantitate


FROM produse AS A LEFT OUTER JOIN
date_produse AS B
ON A.cod=B.cod; Figura 2.57. Rezultat

3. La fel ca mai sus, numai c se vor trece datele


existente pentru toate produsele din tabelul
date_produse:

SELECT B.denumire, A.cantitate


FROM produse AS A RIGHT OUTER JOIN
date_produse AS B
ON A.cod=B.cod; Figura 2.58. Rezultat

4. O problem serioas care apare n cerinele de acest tip este dat de faptul c
nu ntotdeauna, orice cod din primul tabel, n exemplu produse, se afl printre
codurile din al doilea tabel, n exemplu, date_produse. Se cere s afim
codurile din tabelul produse care nu se regsesc ntre codurile din tabelul
date_produse. Analizai interogarea de mai jos, este i un exemplu de utilizare
a operatorului NOT IN:
SELECT cod FROM produse Figura 2.59.
WHERE
cod NOT IN (SELECT cod FROM date_produse);

5. Selectai codurile de produse din tabelul date_produse care nu


1
se regsesc printre codurile din tabelul produse .
SELECT cod FROM date_produse
WHERE Figura 2.60.
cod NOT IN (SELECT cod FROM produse);

Auto-uniuni. Se pot obine rezultate interesante


dac cele dou tabele sunt, de fapt, unul i acelai,
dar au aliasuri diferite i se consider unite printr-o
coloan.

Exemplul 2.52. n tabelul alturat, numit st_or


(referitor la localitile din care provin studenii unei
grupe dintr-o facultate), care sunt persoanele care
locuiesc n acelai ora cu Ioana? Figura 2.61. Tabelul st_or

1
n cazul n care considerm tabelul produse drept tabel tat i tabelul date_produse
drept tabel fiu, pentru a fi respectat integritatea referenial, ar trebui ca mulimea acestor
coduri s fie vid.
Capitolul 2. Limbajul MySQL 85

Privim acelai tabel ca pe dou tabele diferite legate prin cmpul


oras. Unul dintre tabele are numele A i al doilea are numele B.
Interogarea const n afiarea tuturor numelor din B care au
aceeai valoare n cmpul oras cu nregistrarea din A care,
pentru cmpul nume, reine Ioana.
Figura 2.62.
SELECT B.nume Rezultatul interogrii
FROM st_or AS A INNER JOIN st_or AS B
ON A.oras=B.oras AND
A.nume=Ioana;

Observaie ! Evident, aceeai problem poate fi rezolvat prin utilizarea


mecanismului subinterogrilor. Exerciiu!

2.20. Elemente care privesc securitatea bazelor de date

Asigurarea securitii bazelor de date este o problem extrem de serioas.


Paragraful are numai rolul de a v iniia n aceast activitate. n realitate, problema
este cu mult mai complex.

Sistemul de privilegii MySQL. O prim problem care apare este de a


securiza, pe ct posibil, bazele de date. Din acest punct de vedere, n afara
administratorului, exist posibilitatea ca la bazele de date s aib acces i alte
persoane, identificabile prin nume i parole. Totui, aceste persoane au acces
numai la anumite operaii cu bazele de date. Pentru ca o astfel de persoan (care
nu este utilizator) s acceseze baza de date este necesar ca administratorul s
introduc numele ei, parola i operaiile pe care le poate efectua. Astfel,
administratorul va utiliza instruciunea MySQL numit GRANT, a crei form
simplificat o prezentm mai jos:
GRANT operaii
ON nume_baz
TO nume_utilizator IDENTIFIED BY parola;

Operaiile permise sunt: SELECT, UPDATE, INSERT, INDEX, ALTER, CREATE,


DROP i trebuie s fie separate prin virgule. Atunci cnd accesul utilizatorului este
permis pentru orice baz de date, se utilizeaz *.*.

Exemplul 5.70. De acum, utilizatorul lavinia cu parola puful are acces la


operaii de tip SELECT i INSERT pentru orice baz de date.
GRANT SELECT, INSERT
ON *.*
TO lavinia IDENTIFIED BY puful
86 Manual de Informatic pentru clasa a XII-a

Pentru a revoca unele drepturi ale unui utilizator sau chiar toate,
administratorul folosete instruciunea REVOKE. Pentru a revoca toate operaiile
permise, se utilizeaz ALL.

REVOKE operaii
ON nume_baz
FROM nume_utilizator

Exerciiu. Acordai drepturi unor utilizatori, verificai dac le au, revocai anumite
drepturi i verificai apoi dac le mai au.

1. Materiale. O firm dispune de mai multe depozite. n fiecare depozit exist


mai multe materiale. Pentru fiecare material se cunoate preul i cantitatea. Se
cere s se rspund la ntrebrile de mai jos. Tabelul se numete materiale.

Figura 2.63.
Tabelul materiale

1.1. Care sunt materialele existente ntr-un anumit depozit (n exemplu,


Depozit 2) ?
1.2. Care sunt depozitele n care exist un anumit material (n exemplu,
material 3? Se presupune c numele materialului poate fi precedat de blank-uri.
1.3. Care este valoarea total a tuturor materialelor din depozite?
1.4. Care este valoarea total a materialelor din fiecare depozit?
1.5. Presupunem c material 1 se scumpete cu 10%. Actualizai datele din
tabel.
1.6. S se tearg un anumit material (material 2) din tabel.

2. mprumuturi. Exist persoane care au credite, n acelai timp, la mai multe


bnci. O astfel de situaie este prezentat n tabelul de mai jos, numit
imprumuturi. Se cere s se rspund la urmtoarele ntrebri:
Capitolul 2. Limbajul MySQL 87

Figura 2.64.
Tabelul imprumuturi

2.1. Care sunt persoanele care au mprumutat de la Banca 1?


2.2. Care este suma mprumutat de fiecare banc populaiei?
2.3. Afiai, pentru fiecare persoan, numrul mprumuturilor pe care le-a efectuat.
2.4. Care sunt persoanele care au mprumutat o sum maxim i care este
aceast sum?
2.5. Care sunt persoanele care au mprumutat bani cel puin de la o banc la
care a mprumutat i Ionescu Grigore?

3. Proprietari, proprieti. Se d un tabel (proprietari), n care pentru


fiecare persoan se cunoate codul (cod) i numele (nume). Se d i un alt tabel
(proprietati) n care se cunoate codul proprietarului (cod_proprietar),
tipul proprietii (tip_p) i valoarea proprietii (valoare):

Figura 2.65. Tabelul


proprietari

Figura 2.66. Tabelul proprietati


3.1. Afiai, pentru fiecare proprietar care are cel puin o proprietate, numrul
proprietilor.
3.2. Afiai numele proprietarilor care nu au proprieti.
3.3. Afiai codurile proprietarilor din tabelul proprietati care nu au
corespondent n tabelul proprietari.
3.4. Afiai valoarea proprietilor pe care le are fiecare proprietar. Datele vor fi
afiate n ordinea descresctoare a proprietilor.

4. Prietenii. Se dau dou tabele (baieti i fete) n care pentru fiecare


persoan se cunoate codul (cod), numele (nume) i vrsta (varsta). De
asemenea, mai exist un tabel, numit prietenii, n care sunt reinute relaiile
dintre biei i fete.
88 Manual de Informatic pentru clasa a XII-a

Figura 2.67. Tabelul baieti Figura 2.68. Tabelul fete


4.1 Care sunt prietenele lui Mihai, cel care are 18 ani?
Observaie ! Se presupune c exist un singur biat
Mihai care are 18 ani.
4.2 Afiai numele fetelor care nu au prieten.
4.3 Pentru fiecare biat care are cel puin o prieten,
afiai numele prietenelor pe care acesta le are.
4.4 Afiai numele unei fete cu un numr maxim de
prieteni i numrul prietenilor ei.
4.5 Afiai media de vrst a bieilor i a fetelor.
Figura 2.69.
Tabelul prietenii
5. Angajai. O firm dorete s rein ntr-o baz de date un tabel referitor la
angajai. Motivul este dat de faptul c se vrea obinerea rapid a rspunsurilor la
ntrebrile de mai jos. Ce date va reine tabelul? Cum obinem rspunsul la ntrebri?
5.1 Care sunt numele angajailor (n ordine alfabetic)?
5.2 Care sunt angajaii cu vrsta sub 30 de ani?
5.3 Realizai o list a femeilor angajate i o alta a brbailor angajai.
5.4 Realizai o list a angajailor care au studii superioare.
5.5 Care sunt angajatele care sunt n concediu de maternitate?
5.6 Care sunt angajaii cu o vechime n meseria pe care o practic la firm de sub
trei ani?
5.7 Care sunt angajaii care au salariul minim pe economie?
5.8 Care sunt angajaii care au salariul brut mai mare dect cel minim, dar mai
mic dect 1000 de lei?
5.9 Care sunt angajaii care ies la pensie anul urmtor?
5.10 Care sunt angajaii care au copii i ci copii au?
5.11 Mine este Sfnta Maria. Care este lista srbatoritelor?
5.12 Gsii angajaii care i srbtoresc mine ziua de natere!
6. Cheltuieli / Venituri. George este o persoan creia i place s-i in
evidena veniturilor i cheltuielilor. El are un tabel cu urmtoarele cmpuri: Data,
Cheltuiala/Venit, Suma cheltuit sau ncasat, Explicaii (Text). S presupunem c
George i-a completat tabelul cteva luni, n fiecare zi. Fiecare sum cheltuit sau
ncasat este nregistrat pe o linie a tabelului. Se cere:
6.1 Care sunt veniturile totale ale lui George i care sunt cheltuielile sale pe toat
perioada ct a inut evidena?
Capitolul 2. Limbajul MySQL 89

6.2 A reuit George s economiseasc o sum de bani n aceast perioad sau


a fost nevoit s se mprumute? Care este suma economisit sau mprumutat?
6.3 n care lun George a cheltuit cea mai mare sum?
6.4 n care lun George a avut cele mai mari ncasri?
6.5 Care este luna n care George a economisit cea mai mare sum?
6.6 Creai un tabel care s conin toate veniturile lui George pe ntreaga
perioad i un altul care s conin toate cheltuieliule n aceeai perioad.
6.7 Creai un tabel care s conin, pentru fiecare lun n parte, suma ncasrilor
i suma cheltuielilor.
7. Biblioteca. Ioana s-a angajat la o bibliotec i dorete s in evidena
crilor pe calculator.
7.1 Ioana dorete, n primul rnd, s in evidena titlurilor pe care le are la
bibliotec. Pentru aceasta, Ioana codific toate titlurile i reine pentru fiecare
titlul, editura i autorul.
7.2 Pentru a ine evidena numrului de exemplare din fiecare titlu, existente n
gestiune, este nevoie de un alt tabel, numit Nr Exemplare. Creai-l!.
7.3 Care este legtura ntre cele dou tabele?
7.4 n continuare, trebuie creat un tabel, numit Cititori, care conine
persoanele care mprumut cri de la bibliotec (Nume, Adresa, Nr. telefon)
nainte de a mprumuta o carte, cititorul este nscris n acest tabel. Creai-l!.
7.5 De asemenea, trebuie creat un tabel (Imprumuturi) n care, pentru fiecare
carte mprumutat, este scris o nregistrare care conine numele cititorului i codul
crii (o nregistrare conine un singur exemplar dintr-un titlu). Creai-l!
7.6 Se cere o situaie n care sunt afiai cititorii care au mprumutat o carte de
mai mult de dou sptmni.
7.7 Cte exemplare sunt mprumutate din fiecare carte?
7.8 Cte exemplare sunt mprumutate din cartea care are codul x?
7.9 Pentru fiecare carte mprumutat, se cere codul crii, tilul i numrul
exemplarelor aflate la cititori.
7.10 Un cititor solicit un anumit titlu. Ioana vrea s vad dac exist exemplare
nemprumutate din acesta.
8. Problem pentru lucrul n colectiv! Gril. Scriei o gril cu 18 itemi (18
ntrebri la care rspunsul corect este unul singur, ales dintre 4 rspunsuri). n final
se va afia nota obinut de cel care este testat prin utilizarea acestei grile. Fiecare
rspuns corect este punctat cu 0.5 puncte i un punct se acord din oficiu. Desigur,
dac este necesar, itemii vor fi nsoii de imagini. Problema va fi rezolvat de
echipe diferite, pe diverse domenii: informatic, matematic, biologie, limbi strine,
chimie, istorie, .a.m.d. Un set de astfel de probleme va fi util elevilor din toat ara!
9. Problem pentru lucrul n colectiv! Magazin. Creai un site prin care o firm
vinde calculatoare i diverese componente de calculatoare. Comenzile se pot face
prin intermediul site-ului i ele sunt stocate n baza de date. Se cere s se
efectueze validarea datelor de intrare. De asemenea, reprezentanii firmelor pot
extrage din baza de date comenzile dintr-o anumit zi i pot memora date
referitoare la expedierea produselor.
(pentru verificare, rezolvrile se gsesc la pag. 381)
CAPITOLUL
Primii pai ctre construcia unui site

n acest capitol recapitulm noiunile referitoare la Internet care


au fost studiate la Tehnologia Informaiei i a Comunicaiilor. De asemenea,
vom nva s instalm i s utilizm un program FTP prin intermediul cruia
vom putea transfera fiiere ntre calculatorul personal i server.

Ce este Internet-ul ?
Protocolul TCP / IP
Ce trebuie s tim despre site-uri ?
Un program FTP
Cum scriem un fiier HTML?

Cuvinte cheie: pagin web, site web, host, ISP,


protocol, TCP/IP, DNS, URL, FTP, SMTP,
client, server, proxy, HTML, browser
Capitolul 3. Primi pai ctre construcia unui site 91

3.1. Ce este Internet-ul ?

Prin Internet nelegem totalitatea calculatoarelor,


aflate oriunde n lume, care comunic ntre ele.

Spunem c dou calculatoare comunic dac ntre ele are loc un


schimb de date. Convenim s numim host (n romn, gazd)
un calculator care particip la schimbul de date.

Reeaua Internet conine calculatoare de mare vitez, care comunic prin


fibr optic i/sau prin satelit i au rolul de a transmite rapid informaia, oriunde n
lume. Anumite firme, numite ISP (Internet Service Provider, pe scurt
provider), dispun de calculatoare performante, numite server-e, legate la
unul dintre calculatoarele cu rol de transmitere a informaiei. Provider-ul ofer,
contra cost sau din alte raiuni, diverilor clieni posibilitatea cuplrii propriilor PC-uri
la server, adic accesul la Internet. Provider-ul ofer i alte servicii, cum ar fi
webhosting-ul (spaiu pe hard-disc pentru gzduirea paginilor web, conturi
pentru e-mail, precum i soft specializat pentru manipularea acestora).

Pentru a accesa Internet-ul de la un oarecare calculator, acesta trebuie


s fie conectat la server-ul unui provider. Exist mai multe variante de
conectare. Precizm faptul c modalitile de conectare sunt prezentate n
ordinea cresctoare a vitezei de transmisie a datelor. Nu vom prezenta
vitezele de transmisie, deoarece acestea sunt ntr-o continu cretere,
mrginindu-ne numai la a preciza faptul c rata (viteza) de transfer
(Transfer Rate) a datelor se exprim n Mbps (mega bii pe secund).

Principalele tipuri de conexiuni la Internet

1) Conectare prin intermediul cablului telefonic. Practic, calculatorul se


conecteaz temporar la un server, prin intermediul unui dispozitiv numit modem.
Prin formarea unui numr de telefon de acces, se obine conexiunea cu acesta.
Ct timp calculatorul este conectat, nu se mai poate utiliza telefonul.
2) Conectare prin ISDN (Integrated Services Digital Network) este
un serviciu pus la dispoziie de firma de telefonie fix. i aici, conexiunea este
temporar, deci se pltete n funcie de timpul n care suntem conectai. Fa de
modalitatea anterioar, n afara vitezei mai mari pentru schimbul de date, aceasta
prezint avantajul c se poate utiliza n acelai timp i telefonul.
3) Conectare prin intermediul liniilor telefonice nchiriate. n acest caz,
conexiunea este permanent. Practic, utilizatorul face un contract cu furnizorul de
telefonie fix, care monteaz o linie telefonic ntre calculatoarele utilizatorului i
server-ul provider-ului.
4) Conectare prin cablu TV (coaxial). Conectarea permite transmisia datelor i
recepia programelor TV n acelai timp.
92 Manual de Informatic pentru clasa a XII-a

5) Conectare prin fibr optic. Mediul fizic prin care sunt transferate datele este
fibra optic, obinnd o rat de transfer mult mai ridicat dect cele anterioare.

6) Conectare prin cablu UTP (Unshielded Twisted Pair) - una dintre cele mai
frecvente conexiuni la Internet. Principiul de baz este simplu: mai multe PC-uri
se interconecteaz prin intermediul unui hub/switch, formnd o reea local.
Aceast reea de calculatoare se conecteaz, la rndul ei, printr-o conexiune
rapid (de exemplu, prin fibr optic), cu provider-ul de Internet.

7) Conectare prin unde electro-magnetice terestre sau prin satelit. Aceste


tehnologii sunt numite wireless (fr fir). n acest caz, echipamentele sunt mult
mai costisitoare i necesit operaii complexe de instalare.

n linii mari, putem considera c Internet-ul ofer urmtoarele servicii:

World Wide Web (www) - putem crea i vizita diverse pagini web;
E-mail - serviciu de pot electronic;
Chat - modalitate prin care doi sau mai muli utilizatori pot discuta n
acelai timp.

Bineneles, acestea trei sunt doar baza de la care pornesc o multitudine de alte
servicii, cum ar fi: e-commerce (comer pe Internet), e-banking (management
financiar, pli on-line), diverse tipuri de liste de discuii (forum, newsgroup), etc.

3.2. Protocolul TCP/IP

Pentru ca dou sau mai multe calculatoare s poat comunica este necesar
s existe un protocol, adic un ansamblu de norme care trebuie respectate de
calculatoare (de programale care ruleaz pe ele) pentru ca schimbul de date s
aib 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 c le-a recepionat;

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 mai mic de memorie. Prin
urmare, transmiterea lor dureaz mai puin. Invers, la destinaie sunt
decompresate prin utilizarea acelorai algoritmi matematici.
Capitolul 3. Primi pai ctre construcia unui site 93

identificarea erorilor care pot interveni n transmiterea datelor. Problema


este urmtoarea: de unde tie calculatorul care a recepionat date
dac acestea sunt corecte? i aici exist mai muli algoritmi care permit
identificarea i corectarea erorilor.

Pe Internet se folosete protocolul TCP/IP (Transmission Control


Protocol/Internet Protocol). Protocolul este, de fapt, numele comun
al unei familii de protocoale utilizate pentru transferul datelor n reea. n
continuare vom prezenta pe scurt cteva dintre protocoalele din familia
TCP/IP.

Orice calculator conectat la Internet are o adres, numit adres IP


(Internet Protocol Adress). O adres IP este alctuit din 4 numere ntre 0
i 255. Prin urmare, o astfel de adres ocup 4 octei. Cum transmisia datelor se
face ntre dou calculatoare, datele se transmit de la o adres IP la alta.

Protocolul IP (Internet Protocol) reglementeaz transmiterea


datelelor de la o adres IP la alta. Datele sunt transmise divizate n pachete
(packets). Fiecare pachet conine IP-ul expeditorului i IP-ul destinatarului.

Prin protocolul TCP (Transmission Control Protocol) se verific


corectitudinea transmisiei.

n Internet se pot accesa anumite resurse, fiiere de orice tip (html,


imagine, date, etc). Orice resurs are, aa cum tim, o anumit adres, numit
adresa URL (Uniform Resource Locator). De exemplu, dac adresa unui site
este http://www.exemplu.ro, ea este o adres URL. De fapt, este adresa
fiierului index, care are adresa complet
http://www.exemplu.ro/index.html,

n cazul n care fiierul index are extensia html. De asemenea, un fiier imagine,
s spunem iepure.jpg, aflat n folder-ul img al site-ului din exemplu, are
adresa URL:
http://www.exemplu.ro/img/iepure.jpg.

DNS (Domain Name System) asigur legtura dintre adresa URL a unui
site i adresa IP a acestuia. Practic, n edit-ul browser-ului se tasteaz
adresa URL, acesta o transmite, dar prin algoritmul impus de acest protocol
se gsete adresa IP asociat. Transferul datelor se efectueaz, aa cum
s-a artat, utiliznd adresa IP gsit.

FTP (File Transfer Protocol) are rolul de a reglementa transferul


fiierelor ntre dou calculatoare. Exist programe specializate care, prin
utilizarea acestui protocol, transfer fiiere. De regul, utilizarea lor se
face n situaia n care o persoan gestioneaz un site web aflat pe un
alt calculator (server). Atunci cnd aceasta actualizeaz site-ul, transfer
fiiere ctre server.
94 Manual de Informatic pentru clasa a XII-a

SMTP (Simple Mail Transfer Protocol) are rolul de a reglementa


transferul e-mail-urilor.

Din cele prezentate pn n acest moment, rezult c fiecare calculator care


particip la schimbul de date pe Internet are o adres IP permanent. n realitate
nu este chiar aa Unele calculatoare au ntr-adevr o adres IP permanent,
ns altele nu. S prezentm dou cazuri:

1) Ne conectm de la PC-ul de acas, prin linie telefonic, la Internet. n acest


caz, calculatorul nostru se numete client, iar cel al provider-ului server. Provider-ul
dispune de o mulime de adrese IP care urmeaz s fie alocate. Calculatorului
nostru i se aloc, automat, o adres IP care este disponibil n acel moment. Un
astfel de server ruleaz un soft special, care utilizeaz protocolul DHCP (Dynamic
Host Configuration Protocol). Dup nchiderea conexiunii, acea adres IP
se va putea aloca altui client.

2) Dispunem de o reea de calculatoare i dorim ca de pe fiecare calculator din


reea s putem accesa Internet-ul. n acest caz, se obinuiete ca un calculator al
reelei, numit server proxy, s fie cuplat la Internet printr-o linie nchiriat
(aceasta asigur o vitez de transfer suficient de mare). Toate celelalte
calculatoare ale reelei acceseaz Internet-ul prin intermediul su. Evident, pe
server-ul proxy trebuie s existe un soft specializat. Toate calculatoarele din reea
au i ele adrese IP, dar interne, nerecunoscute dect n reeaua local, nu i pe
Internet, dar server-ul proxy utilizeaz o adres IP recunoscut pe Internet.

3.3. Despre site-uri

Dac o persoan (sau societate comercial), care are acces la Internet,


dorete s aib un site, va apela la serviciile unei firme specializate (numit
provider). Provider-ul dispune (sau a nchiriat la rndul lui) de unul sau
mai multe calculatoare extrem de performante, cuplate la Internet prin linii
care permit transferul rapid al datelor i care ruleaz programe specializate,
numite server-e i pune la dispoziie:

spaiu pe hard-disc-ul server-ului de cel puin 10Mb;


o adres de Internet (de exemplu, www.adresa.ro ).
1

n spaiul rezervat, persoana (firma) pune mai multe fiiere care conin, de
regul, fiiere HTML (Hyper Text Markup Language), dar i alte fiiere
(gif, jpeg, doc). Prin aceste fiiere se poate descrie activitatea firmei, se
poate face comer electronic, se poate prezenta o anumit tem, etc).

Avei posibilitatea ca site-ul s aib asociat o adresa URL oferit gratuit de provider sau
1

s cumprai o astfel de adres.


Capitolul 3. Primi pai ctre construcia unui site 95

Pentru a putea vizita o pagin, este necesar un program specializat, numit


generic browser. Acesta trebuie s se gseasc pe calculatorul celui care
dorete s viziteze pagina respectiv i, n linii mari, are funciile:

1. permite utilizatorului s introduc adresa URL a paginii respective i


transmite cererea ctre server, pentru ca acesta s-i furnizeze fiierul
HTML care conine codul respectivei pagini, dar i fiierele care rein
imaginile din pagin (cu extensia jpeg, gif, etc).

2. dup ce primete codul HTML al paginii respective, interpreteaz


comenzile pe care le conine i l afieaz.

Evident, coninutul site-ului poate fi accesat de pe orice alt calculator


conectat la Internet.

Terminologie. Calculatorul pe care se gsete site-ul se numete, aa cum am


precizat, server, iar calculatoarele care acceseaz coninutul site-ului se
numesc, n acest caz, client. Un astfel de model de transmisie a datelor poart
denumirea de client-server (vezi Fig. 3.1).

Server

Cerere Rspuns
Rspuns
Cerere

Cerere Rspuns

Client 3
Client 1

Client 2

Figura 3.1. Exemplu de model de tip client-server

ntrebrile fireti n acest moment sunt este: ce software este necesar s


existe pe calculatorul client i ce software trebuie s existe pe server?
96 Manual de Informatic pentru clasa a XII-a

3.3.1. Software-ul necesar pentru calculatorul client

Orice calculator client trebuie s dispun de un browser, cu ajutorul cruia


s se poat vizualiza fiierele HTML. Exist mai multe programe de tip browser,
cum ar fi: Internet Explorer, Firefox, Mozilla, Opera, Netscape,
fiecare dintre acestea avnd mai multe versiuni. Din pcate, ntre acestea exist
anumite diferene atunci cnd afieaz fiierele HTML. Evident, exist multe puncte
comune. Este recomandabil, ca atunci cnd scriem codul necesar unei pagini web,
s utilizm specificaiile de HTML standard i, mai ales, s testm pagina utiliznd
ct mai multe tipuri de browser-e.
Pentru a gestiona un site web, aflat evident pe server, utilizatorul are nevoie
de un program FTP prin care s poat efectua mai multe operaii asupra spaiului
rezervat pe server: transfer sau tergere de fiiere i creare, modificare sau
tergere de folder-e.

3.3.2. Software-ul necesar pentru calculatorul server

n primul rnd, pe server trebuie s se gseasc un program care rspunde


cererilor browser-rui aflat, aa cum s-a spus, pe calculatorul client. Un astfel de
program se numete program de tip server.
Atunci cnd, de exemplu, dorim s vizualizm o anumit pagin, tastm
adresa URL n edit-ul browser-ului i apsm tasta Enter sau efectum clic pe
butonul GO. Browser-ul emite o cerere ctre server pentru ca acesta s-i trimit
fiierul respectv. Evident, dac este posibil, server-ul va furniza browser-ului fiierul
solicitat. Cererea efectuat de browser i rspunsul server-ului se fac prin
respectarea unui anumit protocol. Acest proticol se numete HTTP (Hyper Text
Transfer Protocol). Prin urmare, un program de tip server rspunde cererilor
care se conformeaz protocolului HTTP.

Exist mai multe programe de tip server, cel mai popular fiind Apache, care
lucreaz pe server-e cu sistemul de operare Linux, dar i pentru cele cu sistemul
de operare Windows. El este dezvoltat de Apache Software Foundation i
1
este de tip open source . Un alt program de tip server este Microsoft IIS
(Microsoft Internet Information Services), destinat sistemelor de
operare de tip Windows.

Facultativ, pe server se gsesc programele PHP i MySQL. Bineneles,


nchirierea unui spaiu pe un server care deine aceste programe este mai scump.
PHP-ul permite ca paginile web sa fie personalizate, iar cu ajutorul MySQL-ului se
pot crea baze de date pe Internet. De asemenea, cu ajutorul PHP-ului se pot da
comenzi MySQL-ului pentru crearea i actualizarea bazelor de date.

Termenul descrie accesul gratuit la codul surs al unui produs software, care este
1

disponibil spre a fi copiat, modificat i personalizat de ctre oricine, fr a fi impuse drepturi


intelectuale restrictive asupra programului.
Capitolul 3. Primi pai ctre construcia unui site 97

Observaie. Putei s obinei gratuit spaiu pe server i adresa URL pentru site-ul
dvs., pentru c exist firme care ofer aceasta utilizatorilor. Cutai cu Google! Din
pcate, este puin probabil s gsii gratuit un server care are PHP i MySQL.
Oricum, chiar i n aceste condiii, se pot crea site-uri reuite utiliznd doar limbajul
HTML. Dac dorii un site care s conin PHP i MySQL, limbaje care vor fi
prezentate n aceast carte, atunci trebuie s pltii acest serviciu suplimentar.

Modalitatea de instalare a programelor Apache, PHP i MySQL este detaliat


n Anexa 1, care se gsete la pag. 370.

3.4. Un program care lucreaz sub FTP

S presupunem c am obinut un anumit spaiu pe un server, avem o adres


URL pentru site i acum vrem s-l construim i s-l putem ntreine. Problema care
se pune n continuare este transferul fiierelor de pe calculatorul personal (client)
ctre server i invers. n aceast carte vom utiliza un program care lucreaz sub
protocolul FTP i anume WS_FTP95. Acest program poate fi descrcat de pe
pagina web
www.uottawa.ca/help/ws_ftpe.html,
iar dac aceast adres nu mai este actual, identificai o nou locaie de unde
poate fi download-at (cu Google, textul ws_ftp95 download).

Dup ce ai instalat programul, va aprea o cutie de dialog n care trebuie s


introducei datele de identificare. Am presupus c adresa URL a site-ului este:
www.invatare.b0x.com (vezi Fig. 3.2).

Figura 3.2.
Fereastra de introducere a
datelor de identificare

Dac introducerea datelor de identificare s-a fcut n mod corect, automat


programul va afia coninutul fiierelor din site n cadrul din partea dreapt i a unui
folder de pe propriul calculator n stnga. De aici i modalitatea de lucru: vom avea
pe hard-disc un folder care reine fiierele care trebuie s fie transferate pe site.
Acesta este folder-ul (n exemplu, PTest) care este afiat de programul FTP
(vezi Fig. 3.3). Pe server avem dou fiiere, iar cel care ne intereseaz iniial este
index.html.
98 Manual de Informatic pentru clasa a XII-a

Trecerea unui fiier de pe propriul calculator pe site se face prin operaia


Drag and Drop (se mut cursorul grafic asupra sa, apsm butonul stng i-l
tragem ctre panoul din dreapta) sau selectm fiierul i-l transferm cu ajutorul
butonului sgeat. Analog, se poate muta un fiier de pe site pe calculatorul nostru.

Figura 3.3. Fereastra programului WS_FTP95

tergerea unui fiier sau folder se face cu butonul Delete.


Crearea unui folder (director) se face prin apsarea butonului MkDir.
Apsarea sgeii are ca efect trecerea n folder-ul printe.

Schimbarea unitii de disc pe propriul calculator se face prin


executarea unui clic asupra numelui ei (vezi fig. alturat).

Figura 3.4. Lista unitilor de disc


de pe calculatorul client

Dup cum observai, este foarte simplu s lucrm cu un program FTP.


Pentru transfer, bifai butonul ASCII. Vei fi scutii astfel de anumite erori
care pot aprea la executare.
Capitolul 3. Primi pai ctre construcia unui site 99

3.5. Cum scriem un fiier HTML ?

Presupunem c avem un site web i putem s transferm fiiere de la


calculatorul nostru ctre el i invers. tim c, pentru a scrie o pagin web, trebuie
s cunoatem limbajul HTML (HyperText Markup Language). Acesta este
prezentat detaliat n Capitolul 4.

ntrebarea la care rspundem n acest moment este urmtoarea: cum se


scrie codul HTML?

Browser-ul poate afia un fiier HTML aflat pe calculatorul nostru. Un astfel


de fiier are una dintre extensiile: htm sau html. Putei cuta cu Find un
astfel de fiier i executai dublu clic pe icon-ul su. Imediat va fi apelat
browser-ul, iar acesta va afia fiierul.

Mai tim c, atunci cnd browser-ul afieaz un astfel de fiier, putem vedea
codul su surs (din meniul View, apelm comanda Source). Automat, se
va lansa programul NOTEPAD care realizeaz aceasta.

De aici rezult i modul n care vom scrie astfel de fiiere:

a) Vizualizm cu My Computer folder-ul unde dorim s se gseasc fiierul.

b) Apelm la meniul flotant (clic cu butonul drept al mouse-ului) i alegem New


i Text Document. Programul NOTEPAD va crea un fiier fr coninut, cu
extensia txt.

c) Modificm numele i extensia fiierului. La fel, atunci cnd cursorul grafic se


gsete deasupra icon-ului su, apsm butonul drept al mouse-ului i
alegem Rename. Vom scrie un nume dorit de noi, iar extensia va fi html.
Fie numele su primul.html. ntruct extensia html este asociat
browser-ului (Internet Explorer, la noi), fiierul va avea de aceast dat
icon-ul browser-ului (vezi Fig. 3.4).

Figura 3.4.
Exemplu de fiier HTML

d) Executarea unui dublu clic asupra icon-ului are ca efect lansarea browser-ului
care va afia fiierul. Evident, n aceast faz, coninutul su este vid.

e) Apelai din meniu View i Source. Programul NOTEPAD va ncrca codul


HTML al fiierului (coninutul este vid), deschiznd-ul astfel pentru editare.
100 Manual de Informatic pentru clasa a XII-a

f) Scriei un text la alegerea dvs. Exemplu: Acesta este primul text.


Salvai-l!

g) n fereastra browser-ului apsai butonul Refresh. Prin aceast operaie am


comandat rencrcarea fiierului, ntruct i-am schimbat coninutul. Textul va
fi afiat de browser:

Figura 3.5. Vizualizarea fiierului prin browser

Observaii

Procednd astfel, putem scrie uor cod HTML. Din cnd n cnd, vizualizm
efectul modificrilor i identificm eventualele erori.

Dup cum v putei da seama, operaia de scriere a codului nu presupune


accesul la Internet.

Validatoare HTML

Am vzut cum se scrie, n mod clasic, codul HTML. Dac dorim, n scrierea
codului se pot utiliza diverse validatoare (programe specializate) HTML. Care este
rostul lor?

Validatoarele HTML lucreaz la fel de uor ca NOTEPAD-ul. Ele scriu


direct fiiere cu una din extensiile htm sau html.

Apsarea unui buton al validatorului are ca efect lansarea browser-ului


care afieaz fiierul (procednd astfel, lucrm mai eficient).

Putem valida fiierele HTML (adic verificm corectitudinea din punct de


vedere sintactic - la identificarea unei erori, ne este indicat locaia sa).
Capitolul 3. Primi pai ctre construcia unui site 101

De ce este util operaia de validare a fiierelor HTML?

Trebuie urmrit modul n care procedeaz browser-ul atunci cnd codul


HTML nu este corect. Browser-ul va afia ceea ce distinge din cod, deci nu va
semnala eroarea. Uneori, o eroare poate trece neobservat deoarece browser-ul
de care dispunem trece peste ea. Dar, cum nu exist un singur program de tip
browser, un alt tip ar putea afia informaia incorect.

Un exemplu de astfel de validator, gratuit, este CSE HTML Validator


Lite, care poate fi descrcat de pe pagina:
www.htmlvalidator.com/lite.

Nimeni nu v oprete s cutai i alte validatoare HTML. Folosii motorul de


cutare GOOGLE!

Comentarii n documentul HTML

Un document HTML poate conine comentarii. Un comentariu arat ca mai


jos i poate fi aezat oriunde n document. Evident, comentariile nu sunt afiate de
ctre browser.
<!-- Un comentariu -->

<!-- Un comentariu
pe mai multe linii -->

n cazul unor pagini complexe, cu multe elemente, comentariile sunt extrem


de utile pentru realizatorul site-ului. Indicnd printr-un comentariu o anumit
poriune din fiier, el va ti mult mai uor locaia codului respectiv pentru a
efectua modificarea.

Prin Internet nelegem totalitatea calculatoarelor, aflate oriunde n lume,


care comunic ntre ele. Pentru a comunica ele pot fi conectate printr-una dintre
formele de mai jos:

cablul telefonic;
ISDN (Integrated Services Digital Network);
linii telefonice nchiriate;
cablu TV (coaxial);
cablu UTP (Unshielded Twisted Pair);
fibr optic;
unde electro-magnetice terestre sau prin satelit.
102 Manual de Informatic pentru clasa a XII-a

Pentru ca dou sau mai multe calculatoare s poat comunica este necesar
s existe un protocol, adic un ansamblu de norme care trebuie respectate de
ctre calculatoare (de programale care ruleaz pe ele) pentru ca schimbul de date
s aib loc.

Protocolul TCP/IP (Transmission Control Protocol/Internet


Protocol) este numele comun al unei familii de protocoale utilizate pentru
transferul datelor n reeaua Internet. Dintre acestea, cele mai importante sunt:
Orice calculator conectat la Internet are o adres, numit IP, alctuit din 4
numere ntre 0 i 255. Protocolul IP (Internet Protocol) este
rspunztor de transmiterea datelor de la o adres IP la alta. Datele sunt
transmise divizate n pachete (packets). Fiecare pachet conine IP-ul
expeditorului i IP-ul destinatarului.
Prin protocolul TCP (Transmission Control Protocol) se verific
corectitudinea transmisiei.
DNS (Domain Name System) asigur legtura dintre adresa URL a unui
site i adresa IP a acestuia.
FTP (File Transfer Protocol) are rolul de a reglementa transferul
fiierelor ntre dou calculatoare.
SMTP (Simple Mail Transfer Protocol) are rolul de a reglementa
transferul e-mail-urilor.
n cazul site-urilor web folosim urmtoarea terminologie: calculatorul pe care
se gsete site-ul se numete server, iar calculatoarele care acceseaz
coninutul site-ului se numesc clieni. Acest model de transmisie a datelor se
numete client-server.
1. Pe calculatorul client trebuie s avem instalat un browser, program cu
ajutorul cruia s putem vizualiza fiiere HTML. Exist mai multe programe de tip
browser, cum ar fi: Internet Explorer, Firefox, Mozilla, Opera sau
Netscape. n cazul n care o persoan gestioneaz un site, aflat evident, pe
sever, atunci aceasta trebuie s dispun pe calculatorul su de un program FTP
prin care s transfere fiiere pe server, stearg fiiere aflate pe acesta, s creeze
i s tearg folder-e de pe server. n aceast carte folosim programul ws_ftp95.
2. Pe server trebuie s avem instalat un program specializat care s rspund
cererilor browser-rului. Un astfel de program se numete program de tip server. Cel
mai des utilizat este Apache. Conversaia ntre browser i programul de tip server
respect protocolul HTTP (Hyper Text Transfer Protocol). De asemenea,
pentru a studia materia din aceast carte trebuie s avem instalate PHP i MySQL.
Toate acestea se gsesc n pachetul EasyPHP care trebuie descrcat i instalat pe
calculatorul nostru.

Fiierele HTML pot fi scrise cu ajutorul programului NOTEPAD, dar se pot


folosi i validatoare HTML. Acestea din urm pot fi descrcate de pe Internet.
Capitolul 3. Primi pai ctre construcia unui site 103

1. Stabilii legturile logice dintre protocoale (stnga) i ce reglementeaz ele


(dreapta):

1. DNS a) transfer de fiiere


2. HTTP b) controlul transmisiei
3. TCP c) legtura dintre URL i IP
4. FTP d) dialogul ntre client i server

2. Stabilii legtura dintre coloanele din stnga i cele din dreapta:

1. server a) program FTP


2. client b) Apache

3. Stabilii legtura dintre coloanele din stnga i cele din dreapta:

1. server a) MySQL
2. client b) browser

4. Vizualizai codul HTML al unei pagini web aleas de dvs. Multe putei nva
privind modul n care au fcut alii...

5. Creai-v un site gratuit. Reinei adresa, numele de autentificare (user ID) i


parola. Acest site l vei utiliza pentru teste.

6. Creai un fiier pe hard-disc-ul dvs. un director numit PTest. Folder-ul va


conine un fiier numit index.html, iar n interiorul fiierului, textul: Asteptati
sa invat in capitolul urmator HTML.

7. Upload-ai fiierul pe site (adic trecei fiierul de pe calculatorul dvs. pe server).


Verificai operaia prin afiarea fiierului de ctre browser.

8. Creai pe site-ul dvs. dou folder-e: Images i Personal. n viitor, primul va


reine fiierele imagine, iar al doilea, fiierele HTML auxiliare.

9. Lucrare de tip referat. ntocmii un referat despre un validator HTML.

10. Lucrare de tip referat. ntocmii un referat despre un program FTP.

(pentru verificare, rezolvrile exerciiilor 1-3 se gsesc la pag. 383)


CAPITOLUL
HTML, CSS primele noiuni

n acest capitol vom nva s crem pagini Web utiliznd limbajele


HTML i CSS, eseniale n dezvoltarea oricrei aplicaii hipermedia.

Care este structura de baz a unei pagini HTML+CSS ?


Elemente HTML pentru afiarea textelor
Atribute CSS pentru font-uri i texte
Cum realizm o list ?
Care este structura unui element HTML ?
Atribute de culoare i fond
Atribute pentru margini, padding i bordur
Cum introducem o imagine ?
Dar un tabel ?
Hiperlegturi (link-uri)
Hri imagine
Ce rol au elementele BASE, META, SCRIPT ?
Ce sunt cadrele ? La ce folosesc ?
Care sunt modalitile de aezare n pagin a elementelor ?
Caractere HTML
Aspecte generale ale proiectrii interfeelor web

Cuvinte cheie: HTML, CSS, element, tag, atribut, id, class, stil,
list, tabel, hiperlegtur, download, hart imagine, cadru,
bordur, margine, estur, etichet, proiectare
Capitolul 4 HTML, CSS - primele noiuni 105

n cele ce urmeaz vom nva s crem pagini web utiliznd limbajul HTML.
Pentru aceasta, vom recapitula cunotinele dobndite la orele de Tehnologia
Informaiei i a Comunicrii, dar vom nva si multe lucruri noi. Desigur, o pagin
astfel creat, poate arta foarte bine, dar, din pcate, lucrnd numai cu HTML-ul,
textele i imaginile nu pot fi personalizate pe ct am dori, iar tehnicile prin care
putem crea animaie aproape c lipsesc. De asemenea, server-ul ofer vizitatorului
o pagin care nu ine cont i de preferinele acestuia i nu-i ofer posibilitatea s
scrie date pe site. Cu toate acestea, pentru a crea pagini web, studiul limbajului
HTML este indispensabil, iar neajunsurile artate pot fi eliminate studiind acest
capitol.

4.1. Structura de baz a unei pagini HTML+CSS

Mai jos, putei observa o pagin aa cum este scris n Notepad i aa cum
este afiat de browser-ul Internet Explorer:

a) n Notepad b) n Internet Explorer

Figura 4.1. Exemplu de pagin web

Din analiza exemplului de mai sus, observm c:

pagina ncepe cu tag -ul <HTML> i se termin cu tag-ul </HTML>;


1

pagina conine un antet (HEAD) i corpul propriu-zis (BODY);


antetul este cuprins ntre etichetele <HEAD> i </HEAD>;
corpul este coninut ntre etichetele <BODY> i </BODY>.

Opional, antetul poate conine titlul paginii cuprins ntre tag-urile <TITLE> i
</TITLE>. Titlul apare pe bara de titlu a ferestrei afiat de Explorer
(pentru noi, acesta este "Exemplul 1").

Termenul tag provine din limba englez i semnific etichet. n acest manual vom folosi
1

ambii termeni: element si tag.


106 Manual de Informatic pentru clasa a XII-a

Dvs. ai studiat cteva noiuni despre HTML n clasa a-IX-a. Acum trebuie
s le recapitulm, dar i s le prezentm ntr-o form nou, utiliznd limbajul CSS
(Cascading Style Sheets), limbaj recunoscut de ctre browser.

Conform CSS, vom imagina elementele HTML ca avnd form


dreptungiular. Pentru fiecare element HTML se poate selecta dimensiunea lui,
culoarea, mrimea i stilul de scriere a font-ului, culoarea de fond, culorile
marginilor... i, dup cum vom vedea, chiar poziia n document. A stabili toate
acestea pentru un element sau pentru toate elementele de acelai tip (de exemplu,
toate paragrafele) nseamn a stabili un stil. Un fiier HTML + CSS poate conine
mai multe stiluri. Modul n care se stabilesc stilurile va fi tratat n amnunt,
deocamdat ne mrginim s exemplificm modul n care se pot preciza stilurile
ntr-un fiier HTML.

A) Prin utilizarea elementului <STYLE>...</STYLE>, care va fi coninut de antet. n


interiorul su se pot descrie stiluri pentru un grup de elemente, de exemplu P,
pentru paragrafe sau pentru un singur element de un tip oarecare.

A1. Toate elementele de un anumit tip au acelai stil.

Exemplul 4.1. Paragraful are nlimea de 4 cm, limea de 3 cm, font-ul cu


mrimea de 20 de puncte, culoarea de fond - galben, culoarea textului - rou, iar
scrisul italic. Oricte paragrafe ar conine documentul, toate vor avea acelai stil.

<HTML>
<HEAD>
<STYLE>
P {font-size:20pt; color:Red;
background:yellow; font-style:italic;
width:3cm; height:4 cm;}
</STYLE>
</HEAD>
<BODY>
<P> Acesta este primul exemplu de
pagina...</P>
</BODY>
</HTML>
Figura 2.2. Pagina rezultat
pentru Exemplul 4.1.

A2. Stilul este aplicat unui element, care este identificat prin intermediul atributului
id al acestuia.

Exemplul 4.2. Formm un stil cu numele P1. Elementul care va avea acest stil va
trebui s conin atributul id care s aib valoarea P1. Observai c, n exemplu,
sunt dou paragrafe. Numai unul dintre ele are asociat un stil, celalat se scrie aa
cum am vzut deja
Capitolul 4 HTML, CSS - primele noiuni 107

<HTML>
<HEAD>
<STYLE>
#P1 {font-size:20pt; color:red;
background:YELLOW; font-style:italic;
width:3cm; height:4 cm;}
</STYLE>
</HEAD>
<BODY>
<P id="P1"> Un paragraf care are
atasat un stil </P>
<P> alt paragraf </P>
</BODY>
</HTML> Figura 4.3. Pagina rezultat
pentru Exemplul 4.2.

A3. Stilul este aplicat unui element sau mai multor elemente, care sunt identificate
prin intermediul atributului class.

Exemplul 4.3. Se descrie clasa Stil, iar efectul este cel din exemplul anterior:

<HTML>
<HEAD>
<STYLE>
.Stil {font-size:20pt; color:red;
background:yellow;
font-style:italic;
width=3cm; height:4 cm;}
</STYLE>
</HEAD>
<BODY>
<P class="Stil"> Un paragraf care are atasat un stil </P>
<P> alt paragraf </P>
</BODY>
</HTML>

Important ! Exist posibilitatea ca stilurile s fie memorate ntr-un fiier text (creat,
de exemplu, cu programul Notepad), cu extensia .css. Codul HTML l va apela
utiliznd tag-ul LINK.

Elementul LINK reprezint o modalitate prin care definim legtura ntre cele
dou fiiere (css i html). Acesta are urmtoarele atribute:

rel - definete tipul de fiier css;


type - indic browser-ului n ce limbaj este scris codul;
href - se specific locaia fiierului (dac fiierul css nu se gsete n
aceiai locaie cu cel html, se scrie adresa complet a sa).
108 Manual de Informatic pentru clasa a XII-a

Exemplul 4.4. Relund exemplul anterior, formm un fiier text cu numele


unstil.css, care va conine definiia stilului:

.Stil {font-size:20pt;
color:red;
background:yellow;
font-style:italic;
width=3cm;
height:4 cm;}

n aceste condiii, fiierul HTML devine:

<HTML>
<HEAD>
<LINK rel="stylesheet" type="text/css" href="unstil.css">
</HEAD>
<BODY>
<P class="Stil"> Un paragraf care are atasat un stil </P>
<P> alt paragraf </P>
</BODY>
</HTML>

B) Exist posibilitatea s scriem un stil pentru un anumit element, prin utilizarea


atributului style. Cu ajutorul acestui atribut, putem defini ad-hoc orice stil.

Exemplul 4.5. Testai codul surs de mai jos:

<HTML>
<HEAD>
</HEAD>
<BODY>
<P style="font-size:20pt; color:Red; background:yellow;
font-style:italic; width=3cm; height:4cm;">
Un paragraf care are
atasat un stil </P>
<P> alt paragraf </P>
</BODY>
</HTML>

Din cele prezentate, rezult c un element HTML are atributele: id, class i
style, iar acestea pot fi utilizate n funcie de necesitate.
Capitolul 4 HTML, CSS - primele noiuni 109

4.2. Elemente HTML pentru afiarea textelor

Elementul P are rolul de a permite introducerea unui paragraf. Pentru a-l


folosi, utilizm tag-urile:
<P atribute> coninut paragraf </P>

Observaii !

Atunci cnd sunt afiate, paragrafele sunt separate printr-o linie vid.
Tag-ul </P> poate s lipseasc, nu este obligatoriu! Un nou paragraf poate
fi depistat prin tag-ul <P>.

n Notepad, WordPad sau Word, paragrafele se separ prin tastarea unui


Enter. n schimb, n HTML, Enter-ul nu are nici un efect. Vedei n
exemplul anterior, al doilea paragraf (aa cum a fost tastat n Notepad). El
conine un Enter (de fapt, n Notepad, sunt dou paragrafe). Acesta a fost
ignorat de Explorer.

Fr o alt comand, un rnd al unui paragraf are limea ferestrei afiat


de browser. De exemplu, dac micorm fereastra browser-ului, acelai
paragraf va ocupa mai multe rnduri.

Dac dou cuvinte ale unui paragraf sunt separate prin mai multe spaii,
browser-ul afieaz doar un singur spaiu.

Elementul &nbsp

Cteodat, avem nevoie s prevenim trecerea unui cuvnt pe linia


urmtoare. Folosim elementul &nbsp pentru a evita acest lucru, prin scrierea sa
naintea cuvntului de interes. n cazul n care nu ncape pe linie, se coboar i
cuvntul precedent pe linia urmtoare.

Exemplul 4.6. Testai forma de mai jos:

<P>Acest paragraf a fost afisat


de Internet&nbspExplorer.</P>

n figura alturat se observ faptul c


browser-ul a fost forat s treac cuvntul
Internet pe rndul urmtor.

Figura 4.4. Exemplu de utilizare


a elementului &nbsp
110 Manual de Informatic pentru clasa a XII-a

n continuare, vom prezenta cele mai importante elemente de formatare


ale textului.

Elementul BR - are ca efect forarea afirii a ceea ce urmeaz pe rndul


urmtor. Pentru a-l utiliza, se folosete un singur tag: <BR>.

Exemplul 4.7. Paragraful urmtor este afiat pe


dou rnduri:
<P> Mama merge <BR> la piata </P>

Figura 4.5. Exemplu de utilizare


a elementului <BR>

Tag-ul <BR> nu creeaz un alt paragraf. Nu uitai, ntre dou paragrafe se


las o linie vid. n cazul etichetei <BR>, rndul urmtor nu este separat de
rndul curent prin linie vid.

Elementul B - are rolul de a determina browser-ul s afieze ngroat (bold)


textul cuprins ntre cele dou tag-uri ale sale: <B> i </B>.

Exemplul 4.8. Cuvintele trebuie i ai sunt afiate ngroat:

<P> Ceea ce-ti <B>trebuie</B> vei gasi in ceea


ce <B>ai</B>! </P>

Figura 4.6. Exemplu de utilizare


a elementului <B>

Elementul I - are rolul de a determina browser-ul s afieze nclinat (italic) textul


cuprins ntre cele dou tag-uri ale sale: <I> i </I>.

Exemplul 4.9. Cuvintele trebuie i ai sunt afiate nclinat:

<P> Ceea ce-ti <I>trebuie</I> vei gasi in ceea


ce <I>ai</I>! </P>

Figura 4.7. Exemplu de utilizare


a elementului <I>
Capitolul 4 HTML, CSS - primele noiuni 111

Elementul U - are rolul de a determina browser-ul s afieze subliniat textul


cuprins ntre cele dou tag-uri ale sale: <U> i </U>.

Exemplul 4.10. Cuvintele trebuie i ai sunt afiate subliniat:

<P> Ceea ce-ti <U>trebuie</U> vei gasi in ceea


ce <U>ai</U>! </P>

Figura 4.8. Exemplu de utilizare


a elementului <U>

Elementul S - are rolul de a determina browser-ul s afieze tiat textul cuprins


ntre cele dou tag-uri ale sale: <S> i </S>.

Exemplul 4.11. Cuvintele trebuie i ai sunt afiate tiat:

<P> Ceea ce-ti <S>trebuie</S> vei gasi in ceea


ce <S>ai</S>! </P>

Figura 4.9. Exemplu de utilizare


a elementului <S>

Elementul BIG - are rolul de a comanda browser-ului ca textul cuprins ntre


tag-urile <BIG> i </BIG> s fie scris mai mare dect restul textului.

Exemplul 4.12. Textul elementul BIG este scris mrit:

<P>Un paragraf care foloseste <BIG>elementul BIG</BIG> !</P>

Figura 4.10. Exemplu


de utilizare a
elementului <BIG>

Atenie ! Elementul BIG nu este suportat de toate browser-ele, deci este de


preferat utilizarea tag-ului FONT. De exemplu:

<P>Exemplu de <FONT size="+1">text marit</FONT> !</P>


112 Manual de Informatic pentru clasa a XII-a

Elementul SMALL - are rolul de a comanda browser-ului ca textul cuprins ntre


tag-urile <SMALL> i </SMALL> s fie scris mai mic dect restul textului.

Exemplul 4.13. Textul elementul SMALL este scris micorat:

<P>Un paragraf care foloseste


<SMALL>elementul SMALL</SMALL> !</P>

Figura 4.11. Exemplu


de utilizare a
elementului <SMALL>

Elementul TT - are rolul de a comanda browser-ului ca textul cuprins ntre


tag-urile <TT> i </TT> s fie scris monospaiat (adic toate caracterele ocup
aceeai lungime de spaiu, precum font-ul Courier New).

Exemplul 4.14. Textul elementul TT este scris monospaiat:

<P>Un paragraf care foloseste <TT>elementul TT</TT> !</P>

Figura 4.12. Exemplu


de utilizare a
elementului <TT>

Elementul DEL - are rolul de a comanda browser-ului ca textul cuprins ntre


tag-urile <DEL> i </DEL> s fie scris tiat, pentru a arta c a fost ters
(pstrndu-l, totui, n document pentru a nu mai antrena i alte modificri
ale acestuia).

Exemplul 4.15. Textul elementul DEL este scris tiat:

<P>Un paragraf care foloseste <DEL>elementul DEL</DEL> !</P>

Figura 4.13. Exemplu


de utilizare a
elementului <DEL>

Elementul SUP - are rolul de a comanda browser-ului ca textul cuprins ntre


tag-urile <SUP> i </SUP> s fie scris mai sus (ca o putere, exponent).
Capitolul 4 HTML, CSS - primele noiuni 113

Exemplul 4.16. Textul x*ln(x) este scris ca o putere:

<P> 3<SUP>x*ln(x)</SUP> </P>

Figura 4.14. Exemplu de utilizare a


elementului <SUP>

Elementul SUB - are rolul de a comanda browser-ului ca textul cuprins ntre


tag-urile <SUB> i </SUB> s fie scris mai jos (ca un indice).

Exemplul 4.17. Textul i,j este scris ca un indice:

<P> a<SUB>i,j</SUB> </P>

Figura 4.15. Exemplu de utilizare a


elementului <SUB>

Elementele H1, H2, ..., H6


Pentru scrierea titlurilor se utilizeaz elementele H1, H2, ..., H6. Fiecare titlu
este scris ntre tag-urile:
<H1> </H1>, <H2> </H2>, , <H6> </H6>.

Mrimea difer: pentru <H1> titlul este scris utiliznd font-ul de dimensiune
maxim, iar pentru <H6> dimensiunea este minim.

Exemplul 4.18. Mai jos, observai


cum este scris un titlu:
<H1>Despre lenesi...</H1>
<P>Lenesul gaseste in orice
sarbatoare un prilej sa nu
munceasca !</P>

Figura 4.16. Exemplu de utilizare a


elementului <H1>

Atenie !

Titlurile trebuie s fie folosite n ordine ierarhic.


n general, un document HTML trebuie s aib exact un element H1, pentru a
indica titlul principal al paginii.
Motoarele de cutare pot utiliza informaiile din aceste titluri, deci ele trebuie
s sintetizeze ct mai bine coninutul textului.
114 Manual de Informatic pentru clasa a XII-a

4.3. Atribute CSS pentru font-uri

n continuare vor fi prezentate principalele atribute CSS care pot fi utilizate,


n cadrul unui stil, pentru a personaliza fontul cu care se va afia textul.

A) font-style poate lua valorile:

normal italic

B) font-variant poate lua valorile:

normal small-caps
C) font-weight poate lua valorile:

normal bold

100 900

D) font-size mrimea. Exist mai multe modaliti de a indica dimensiunea


font-ului. Cea mai simpl este de a o indica n puncte:

10pt 15pt 20pt


E) font grupeaz primele patru atribute, deci dac l folosim putem renuna la
acestea. Nu conteaz ordinea n care sunt scrise...

Exemplul 4.19. Mai jos, am descris un stil pentru


paragrafe care are ca rezultat pagina din Figura 4.17:
<HTML>
<HEAD>
<STYLE>
P { font:italic bold 15pt; }
</STYLE>
Figura 4.17. Exemplu de
</HEAD>
paragraf personalizat cu
<BODY> <P>Un exemplu...</P> </BODY> ajutorul atributului font
</HTML>
Capitolul 4 HTML, CSS - primele noiuni 115

F) font-family are rolul de a stabili o familie de font-uri cu care vor fi afiate


textele. V dai seama c nu se poate ti dac cel care viziteaz pagina are pe
calculatorul su instalat sau nu un anumit font. Din acest motiv se trec, n ordine,
familiile de font-uri care vor fi utilizate. La vizualizarea documentului, se verific
dac exist un font din prima familie. n caz afirmativ, se afieaz textul cu un font
din prima familie. Dac un astfel de font nu exist, se caut dac exist un font din
a doua familie, .a.m.d.
Exemple de valori: times, courier, arial, etc.

Este recomandabil ca ultima valoare din list s fie una dintre valorile de mai
jos. Ele nu specific o familie de font-uri, ci mai degrab un stil de scriere. El va fi
folosit atunci cnd nici una din familiile de font-uri nu a fost gsit, caz n care
browser-ul caut un font apropiat de ultima valoare:

serif sans-serif

cursive monospace

Exemplul 4.20. Analizai stilul de mai jos:


P { font-size:20pt;
font-family:courier, monospace; }

4.4. Atribute CSS pentru texte

Limbajul CSS permite stilizarea la nivel de text prin intermediul unor atribute
care sunt detaliate n cele ce urmeaz.

A) text-decoration poate lua valorile: underline (cu o linie sub el),


overline (cu o linie peste el), line-through (taiat n interior) i none (fr
nicio linie, clasic).

underline overline

line-through none
116 Manual de Informatic pentru clasa a XII-a

Exemplul 4.21. Putem s folosim i combinaii ntre aceste variante, precum cea
de mai jos. Efectul poate fi observat n Figura 4.18.
<HTML>
<HEAD>
<STYLE>
P {text-decoration: underline overline;}
</STYLE>
</HEAD>
<BODY>
<P>Un exemplu ...</P> Figura 4.18. Exemplu de
paragraf personalizat cu
</BODY>
atributul text-decoration
</HTML>

B) text-align alinierea textului poate lua valorile de mai jos:

left right

center justify

Figura 4.19. Exemple de aliniere a textului

C) text-indent este folosit pentru indentarea textelor. Primul rnd al


textului va ncepe mai n dreapta cu o valoare precizat.

Exemplul 4.22. Pentru a obine indentarea din figura alturat, am folosit stilul de
mai jos:
P {text-indent:1cm;}

Figura 4.20. Exemplu de indentare


aplicat unui paragraf
Capitolul 4 HTML, CSS - primele noiuni 117

D) line-height - nlimea liniei atributul este folosit pentru a stabili distana


dintre rndurile unui paragraf.

Exemplul 4.23. Am format dou stiluri pe care le-am aplicat apoi celor dou
paragrafe (vezi Figura 4.21):
<HTML>
<HEAD>
<STYLE>
#unu {font-size: 15pt; line-height: 0.5cm;}
#doi {font-size: 15pt; line-height: 1cm;}
</STYLE>
</HEAD>
<BODY>
<P id="unu">Acest text a fost scris pentru a exemplifica
spatierea intre randuri.</P>
<P id="doi">Acest text a fost scris pentru a exemplifica
spatierea intre randuri.</P>
</BODY>
</HTML>

Figura 4.21. Exemple de


paragrafe cu linii de
nlime diferit

4.5. Liste
n HTML, exist posibilitatea ca anumite enunuri s fie numerotate sau
marcate ntr-un anumit fel. O astfel de organizare poart denumirea de list.

Astfel, n HTML se pot descrie trei tipuri de liste:

liste ordonate, n care elementele sunt numerotate;


liste neordonate, n care elementele sunt marcate de aa natur nct
nu se sugereaz o anumit ordine a lor;
liste de tip definiie.

n continuare, putei observa un exemplu pentru fiecare tip de list:


118 Manual de Informatic pentru clasa a XII-a

1. Bloc Bloc Bloc


2. Vila Vila Multe etaje, zeci de familii
3. Casa Casa Vila
Unu sau doua etaje, cel mult 5 familii
Casa
N-are etaje, o familie
a) List ordonat; b) List neordonat; c) List de tip definiie.

Pentru a forma astfel de liste, avem nevoie de cteva elemente HTML care
vor fi detaliate n cele ce urmeaz.

Elementul OL (Ordered Lists) - creeaz o list ordonat. Elementele listei


sunt trecute ntre tag-urile <OL> i </OL>.

Elementul LI (List Item) - descrie un element al listei. Tag-ul obligatoriu este


cel de nceput <LI>, cel de sfrit fiind facultativ: </LI>.

Exemplul 4.24. Privii lista ordonat de mai jos:


<P>Cine nu ... nu castiga!</P>
<OL>
<LI> pierde
<LI> risca
<LI> ajunge
</OL>

Figura 4.22. Exemplu


de list ordonat

Elementul OL are atributul type. Valorile pe care le poate lua acest atribut,
precum i modul n care arat lista, se pot observa n continuare:

a. pierde i. pierde 1. pierde


b. risca ii. risca 2. risca
c. ajunge iii. ajunge 3. ajunge
<OL tyle="a"> <OL tyle="i"> <OL tyle="1">

A. pierde I. pierde
B. risca II. risca
C. ajunge III. ajunge
<OL tyle="A"> <OL tyle="I">
Capitolul 4 HTML, CSS - primele noiuni 119

Elementul UL (Unordered Lists) - descrie o list neordonat. Elementele


listei sunt cuprinse ntre tag-urile <UL> i </UL>.

Exemplul 4.25. Privii lista neordonat de mai jos:


<P>Periferice esentiale:</P>
<UL>
<LI> monitor
<LI> tastatura
<LI> mouse
</UL>
Figura 4.23. Exemplu
de list neordonat

Elementul UL are atributul type. Valorile pe care le poate lua acest atribut,
precum i modul n care arat lista se observ n continuare:

<UL type="circle"> <UL type="square"> <UL type="disc">

Observaii !

Desigur, putem construi liste imbricate, aa cum se poate observa cu


uurin din exemplul urmtor:

Exemplul 4.26. Analizai lista de mai jos:


<P><U>Echipa castigatoare:</U></P>
<UL type="square">
<LI>Jucatori:
<OL type="1">
<LI> George
<LI> Lavinia
<LI> Mihai
</OL>
<LI>Rezerve:
<OL type="1">
<LI> Cristian
<LI> Flavius
</OL>
</UL> Figura 4.24. Exemplu
de liste imbricate

Pentru a lsa un rnd liber, putem marca un paragraf prin <P> </P> sau...
numai prin <P>.
120 Manual de Informatic pentru clasa a XII-a

Elementul DL (Definition Lists) - are rolul de a descrie o list de definiii,


delimitat de tag-urile <DL> i </DL>.

Elementul DT (Definition Term) - definete termenul din list care trebuie


descris. Se utilizeaz tag-ul <DT>.

Elementul DD (Definition Description) - are rolul de a reine descrierea


termenului. Se utilizeaz tag-ul <DD>.

Exemplul 4.27. Privii lista de definiii de mai jos:


<DL>
<DT>to elapse <DD>a trece, a se scurge
<DT>I've never seen <DD> n-am (mai) vazut (niciodata)
</DL>

Figura 4.25. Exemplu


de list de definiii

4.6. Structura unui element HTML


n general, un element HTML, P, OL, H6, etc. este alctuit sub form de cutie
(box), cu structura urmtoare:

Coninut

estur (padding)

Bordur (border)

Margine (margin)

Figura 4.26. Structura unui element HTML


Capitolul 4 HTML, CSS - primele noiuni 121

Marginea (margin) nu este vizibil de vizitatorul paginii. Rostul ei este de


a pstra distana dintre cutie i celelalte elemente.

Bordura (border) n cazul n care creatorul paginii dorete, aceasta


poate fi fcut vizibil (de exemplu i se stabilete o alt culoare).

estura (padding) poate fi dimensionat, dar nu poate fi fcut vizibil


printr-o culoare distinct. Vom prefera termenul de padding.

Coninutul este dat de text i/sau imagine.

Observaii !

n ansamblu, prile unor elemente de acelai tip pot fi dimensionate. Vedei


paragrafele urmtoare!

n general, pentru majoritatea elementelor se poate trece spaiul ocupat de


acestea: limea (width) i nlimea (height). nlimea i limea cutiei
include bordura, dar nu include marginile. n cazul n care coninutul nu
ncape n cutie, nu se respect nlimea i limea dat de aceste atribute.

n continuare, vom da exemple de elemente pentru care a fost scris un stil. n


acest mod, v putei face de la nceput o idee despre puterea limbajului CSS. De
multe ori, putem face ca un element s arate cu totul altfel dect arat n forma
implicit. n paragrafele urmtoare vor fi prezentate toate atributele, dar acum, v
prezentm cteva elemente HTML cu nfiare neobinuit.

Exemplul 4.28. Am creat un stil pentru un element H1. Bordura are culoare
distinct, iar textul este aliniat la stnga. Faptul c exist un spaiu ntre bordur i
text confirm existena padding-ului (de 0.5 cm).

H1 {border:solid 10pt red;


background-color:green;
padding:0.5cm 0.5cm 0.5cm 0.5cm;
text-align:left; width:3cm;}
...
<H1>Un element H1</H1>
Figura 4.27. Exemplu
de element H1 stilizat

Exemplul 4.29. Am creat un stil pentru paragrafe. n acest


caz, bordura are o form special. Fontul utilizat este din
famila "Arial", scris ngroat (bold) i nclinat (italic).
Textul este aliniat la centru (center):

Figura 4.28. Exemplu


de paragraf stilizat
122 Manual de Informatic pentru clasa a XII-a

P {border:groove 1cm red;


background-color:yellow;
padding: 1cm 1cm 1cm 1cm;
width:5cm; height:5cm;
text-align:right;
font-family:arial;
font-weight:bold;
font-style:italic;}
...
<P> Un exemplu de paragraf </P>

Exemplul 4.30. O list pentru care s-a stabilit dimensiunea font-ului, culoarea de
fond, culoarea, etc.:
OL {font-size:20pt;
font-weight:bold;
color:black;
background-color:blue;}
...
<OL>
<LI> masina
<LI> bicicleta
</OL>
Figura 4.29. Exemplu
de list stilizat

4.7. Atribute de culoare i fond

n general, o culoare poate fi recunoscut prin numele ei ("red", "green",


"gray", ...) sau prin valorile RGB (Red, Green, Blue). Putei alege culoarea n
Paint (opiunea Edit Colors), dup care trecei valorile n HTML. Este de preferat
a doua variant, pentru c prima este depreciat conform noilor standarde HTML.

A) color specific culoarea textului.

Exemplul 4.31. Mai jos, am setat o culoare pentru textul paragrafelor:

P {font-size:40pt;
color:RGB(12,56,23);}

Observaie ! Background-ul acoper suprafaa coninutului i a padding-ului.

B) background-image pentru fundal se poate folosi chiar i o imagine. Dac


imaginea este mai mic dect suprafaa care trebuie afiat, atunci ea este
multiplicat astfel nct s acopere ntreaga suprafa.
Capitolul 4 HTML, CSS - primele noiuni 123

Exemplul 4.32. Se stabilete imaginea ca fundal pentru ntreg documentul (body).


De asemenea, paragrafele vor avea textul de culoare alb, de 40 de puncte.
<HTTML>
<HEAD>
<STYLE>
P {font-size:40pt; color:RGB(255,255,255);}
body {background-image:url(c:\Catelus\1.jpg);}
</STYLE>
</HEAD>
<BODY>
<P> Un exemplu
de catelus </P>
</BODY>
</HTML>
Figura 4.30. Exemplu
de pagin cu o imagine
pe fundal

C) background-color stabilete culoarea fundalului. Uneori este trecut i n


cazul n care pe fundal avem o imagine, pentru c este posibil ca, dintr-un motiv
sau altul, imaginea s nu apar.

Exemplul 4.33. Paragrafele se scriu cu alb, pe fond rou:


P {font-size:12pt;
color:RGB(255,255,255);
background-color:RGB(255,0,0);}
sau
P {font-size:12pt; color:white;
background-color:red;}
Figura 4.31. Un paragraf
cu fundalul rou i textul alb
Exemplul 4.34. Pentru body se alege o imagine pentru fundal, iar dac aceasta
nu apare, ca msur de siguran, s-a ales culoarea neagr:
body {background-image:url(c:\Catelus\1.jpg);
background-color:black;}

D) background-repeat am vzut faptul c, dac o imagine este mai mic


dect spaiul necesar pentru un element, atunci aceasta se repet att pe
orizontal ct i pe vertical pn cnd se umple acest spaiu.
Exist posibilitatea s controlm aceast repetare prin valorile pe care le
atam acestui atribut:
repeat repetarea se face att pe orizontal ct i pe vertical;
repeat-x repetarea se face numai pe orizontal;
repeat-y repetarea se face numai pe vertical;
no-repeat imaginea nu se repet.
124 Manual de Informatic pentru clasa a XII-a

E) background-attachment poate lua dou valori: fixed i scroll


(valoare implicit). n cazul n care pe fundal se gsete o imagine, efectul este
deosebit. Dac valoarea este fixed, atunci defileaz numai obiectele care se
gsesc pe fundal (imaginea rmnnd fix), iar dac valoarea este scroll, atunci
defileaz i imaginea.

Exemplul 4.35. Analizai paginile de mai jos:

body {background-repeat:fixed;}

body {background-repeat:scroll;}

Figura 4.32. Exemple de pagini cu fundal fix sau mobil

F) background-position dac pe fundal se afieaz o imagine, atunci i se


poate preciza poziia n raport cu fereastra. Exist mai multe posibiliti de
precizare a poziiei:
procentual: de exemplu, 33% 50% (la 1/3 de partea stng a ferestrei i la
1/2 din nlimea ei);
n valori absolute: de exemplu, 2cm 3cm (la 2 cm de partea stng a
ferestrei i la 3 cm de partea de sus);
mixt: de exemplu, 2cm 50% (la 2 cm de partea stng a ferestrei i la
jumtate raportat la nlime);
numai o valoare caz n care se refer numai la alinierea pe orizontal n
raport cu marginea din stnga a ferestrei;
prin cuvinte cheie: left (stnga), right (dreapta), top (sus) i bottom
(jos) de exemplu:
body {background-position: left bottom;} (n stnga-jos).
Exemplul 2.36. Mai jos, a fost creat un stil care definete o singur imagine pe
fundal, la mijlocul ferestrei, care nu defileaz (rmne fix):
body {background-image: url(c:\Catelus\1.jpg);
background-repeat: no-repeat;
background-position: 50% 50%;
background-attachment: fixed;}
G) background o singur caracteristic pentru toate celelalte. Se trec, n
ordine, toate valorile pentru background-image, background-repeat, ...
Capitolul 4 HTML, CSS - primele noiuni 125

4.8. Atribute pentru margini

Fiecare element poate avea margini. Rolul lor este de a o separa de alte
elemente. Iat cum se pot stabili marginile:
A) Margin-left mrimea marginii din stnga;
B) Margin-right mrimea marginii din dreapta;
C) Margin-top mrimea marginii de deasupra;
D) Margin-bottom mrimea marginii de dedesupt;
E) Margin toate marginile n ordinea: sus, drepta, jos i stnga.

Exemplul 4.37. Pentru elementele de tip paragraf, a fost realizat un stil care
definete marginile acestuia (fereastra este micrat, pentru a evidenia marginile):
P {font-size:15pt;
margin-left:1cm;
margin-right:2cm; top
margin-top:3cm;}

Figura 4.33. Un paragraf left right


cu margini modificate

4.9. Atribute pentru padding


Padding-ul poate fi doar dimensionat, dar nu i se poate aplica o culoare
distinct: Padding-top partea de sus; Padding-left partea din stnga;
Padding-bottom partea de jos; Padding-right partea din dreapta;
Padding - toate marginile, n ordinea: sus, dreapta, jos i stnga.

4.10. Atribute pentru bordur


Mai nti, putem stabili dimensiunile bordurii: Border-top-width partea
de sus, Border-left-width partea din stnga, Border-bottom-width
partea de jos i Border-right-width partea din dreapta.

Border-width le nlocuiete pe primele 4. Se trec valorile n ordinea: sus,


dreapta, jos i stnga. Dac se trece o singur valoare, aceasta va fi ataat
tuturor marginilor.
126 Manual de Informatic pentru clasa a XII-a

Observaie ! Pentru grosimea bordurii se mai pot folosi valorile: thin (subire),
medium (medie) sau thick (groas).

Border-color culoarea bordurii. Se pot folosi maximum 4 culori, n ordinea:


sus, dreapta, jos i stnga. Dac se trece o singur culoare, aceasta va fi ataat
tuturor marginilor.
Border-style se trece n mod obligatoriu. Contrar, bordura nu este vizibil.
Valorile mai importante pe care le poate lua acest parametru se pot observa n
figura de mai jos:

solid double groove

ridge inset outset


Figura 4.34. Diverse tipuri de borduri

Border-top-style stilul bordurii n partea de sus;


Border-right-style stilul bordurii n partea dreapt;
Border-bottom-style stilul bordurii n partea de jos;
Border-left-style stilul bordurii n partea stng.

4.11. Elementul IMG

Ce farmec are o pagin dac nu conine una sau mai multe imagini?

Elementul IMG - se utilizeaz pentru a ataa unei pagini o imagine. Vom folosi
tag-ul <IMG>. Forma general a acestui element este: <IMG atribute>.

Atributele lui sunt:

src - identific fiierul care conine imaginea respectiv (poate fi de tipul:


jpg, gif, etc.).
Capitolul 4 HTML, CSS - primele noiuni 127

Observaie ! n aceast etap nvm s crem paginile pe propriul calculator,


fr a fi conectai la Internet. Prin urmare, fiierul care conine imaginea se va gsi
ntr-un folder oarecare (n exemplul urmtor, el se gsete n acelai folder n care
gsim i fiierul cu extensia htm (cel care conine pagina). Din acest motiv, sursa
nu conine i calea, dar, dac este cazul, calea poate fi introdus.

ALT="nume" exist posibilitatea ca imaginea s nu se poat ncrca.


Pentru astfel de situaii este folosit parametrul ALT, unde nume conine un
text (alternativ) care va fi afiat n locul imaginii.

Exemplul 4.38. Fie tag-ul IMG urmtor:


<IMG src="C:/Eric.jpg", alt="Eric">
Dac imaginea este gsit, se face afiarea ca n figura din
dreapta, altfel se afieaz ce se vede mai jos:

Figura 4.35
Figura 4.36. Exemplu de pagin
care conine o imagine

Exerciiu ! Luai o imagine oarecare i facei diverse exerciii de afiare a ei,


utiliznd cunotinele de CSS prezentate n paragrafele 4.7, 4.8 i 4.9. Spre
exemplu, analizai codul de mai jos (vezi i Figura 4.37):
<HTML>
<HEAD>
<STYLE> IMG {width:3cm; height:4cm;}</STYLE>
</HEAD>
<BODY>
<P> Acest paragraf este scris pentru a verifica modul de
aliniere pe orizontala in cazul unui element IMG, care este
de tip INLINE
<IMG src="Eric.jpg",
alt="Eric">, deci se
insereaza exact ca
un cuvant intr-un
paragraf</P>
<P> Paragraful este un
element de tip BLOC,
asa ca se insereaza
pe o linie noua!
</BODY>
</HTML>

Figura 4.37. Exemplu


de pagin web
128 Manual de Informatic pentru clasa a XII-a

4.12. Tabele

n cadrul unei pagini web se pot introduce i tabele, extrem de utile pentru
evidenierea unor date sau, pur i simplu, pentru a delimita spaiul paginii. Desigur,
tabelul rezultat poate fi privit n mod clasic, cu linii i coloane, aa cum suntem
obinuii, dar poate fi folosit i n alte scopuri, cum ar fi: aliniarea imaginilor
(elemente de tip IMG n raport cu textul) sau scrierea n coloane. Din acest motiv,
n sens larg, prin tabel vom nelege o grupare n linii i coloane a mai multor
elemente HTML.

Elementul TABLE - descrie un tabel, utiliznd etichetele:


<TABLE> i </TABLE>.

Elementul TR - descrie o linie a tabelului, care ncepe cu <TR> i se termin


atunci cnd este ntlnit un nou <TR>. Opional, se poate folosi i tag-ul </TR>
pentru a nchide linia curent.

Elemenul TD - descrie o celul a tabelului. Se utilizeaz tag-urile <TD> i,


opional, </TD>.

Exemplul 4.39. Mai jos, putei observa un prim tabel, cu dou linii, aa cum este
descris i aa cum apare afiat (vezi Fig. 4.38):
<TABLE border="5">
<TR>
<TD> Un text </TD>
<TD> Un text cu mult mai lung!</TD>
</TR>
<TR>
<TD> Text </TD>
<TD> Text </TD>
</TR>
</TABLE>

Figura 4.38.
Exemplu de tabel

n continuare, prezentm cteva atribute ale elementului TABLE.

Border definete grosimea liniilor (n pixeli) care nconjoar tabelul. Pe


pagina urmtoare (n Fig. 4.39), putei observa cum arat acelai tabel, n
care atributul Border lipsete. Simpla trecere a acestui atribut, fr a
preciza numrul de pixeli, are ca efect crearea unui chenar standard.
Capitolul 4 HTML, CSS - primele noiuni 129

Iat tabelul, fr atributul Border:

Figura 4.39. Exemplu


de tabel fr chenar

Observaii !

n absena altor formatri, toate celulele unei coloane


au limea impus de cel mai lung coninut al uneia
dintre ele! n situaia n care reducem dimensiunile
ferestrei browser-ului, textul va fi dispus modificat,
pentru ca tabelul s ncap n totalitate. Dincolo de
aceast limit, fereastra nu mai poate fi micorat.

Figura 4.40. Efectul redimensionrii


ferestrei browser-ului

n cazul n care o linie conine mai multe celule dect


restul liniilor, automat toate liniile vor avea acelai
numr maxim de celule:

<TABLE BORDER="5">
<TR>
<TD> O noua celula </TD>
<TD>Un text </TD>
<TD> Un text cu mult mai lung!
</TD>
</TR>
<TR>
<TD> Text </TD>
<TD> Text </TD>
</TR> Figura 4.41. Exemplu de tabel n care
</TABLE> dou linii au un numr diferit de celule

Un tabel poate conine i una sau mai multe imagini, aa cum se vede mai
jos, unde imaginea este coninut de o celul a tabelului:

<TABLE BORDER="5">
<TR>
<TD><IMG SRC="BP1.jpg"></TD>
<TD>Un text cu mult mai lung!
</TD></TR>
<TR><TD>Text</TD><TD>Txt</TD>
</TR>
</TABLE> Figura 4.42. Exemplu de tabel care
conine o imagine
130 Manual de Informatic pentru clasa a XII-a

cellspacing - determin spaiul, n pixeli, dintre celule.

Exemplul 4.40. n figura alturat, este


prezentat un tabel cu cellspacing="10".

Figura 4.43.
Exemplu de tabel

cellpadding determin, n pixeli, spaiul lsat n fiecare celul a


tabelului ntre text (imagine) i marginile celulei.

Exemplul 4.41. Acelai tabel, din exemplul


anterior, cu cellpadding = "15".

Figura 4.44.
Exemplu de tabel

Atenie! Pentru ultimele dou atribute, se poate alege o valoare procentual, astfel
nct marginile s aib dimensiunea procentual, n raport cu dimensiunea
disponibil total (lime i nlime).

rules definete modul n care vor fi trasate liniile care separ celulele
tabelului. Poate lua valorile:

None Rows Cols All

Figura 4.45. Exemple de trasare a liniilor separatoare

frame - definete prile care vor fi trasate din chenarul care nconjoar
tabelul. Atributul poate lua valorile:

Above Below Hsides

Vsides Lhs Rhs

Figura 4.46. Exemple de variante de trasare a chenarului unui tabel


Capitolul 4 HTML, CSS - primele noiuni 131

Iat i cteva atribute ale elementului TD:

colspan="nr" - insereaz n dreapta celulei, nr-1 celule al cror


coninut este vid, dar pot fi folosite pentru afiarea valorii reinute de celula
care are acest parametru. Efect secundar: pentru pstrarea formei
dreptunghiulare, toate celelalte linii vor avea, n dreapta, cte o celul al
crei coninut este vid.

Exemplul 4.42. Considerm tabelul de mai jos:

<TABLE BORDER="5">
<TR> <TD> T11</TD> <TD> T12 </TD>
<TD> T13</TD> </TR>
<TR> <TD> T21</TD> <TD> T22 </TD>
<TD> T23</TD> </TR>
<TR> <TD> T31</TD> <TD> T32 </TD>
<TD> T33</TD> </TR>
</TABLE>
Figura 4.47. Tabelul iniial

care arat ca n Fig. 4.47. A doua celul din linia


1 va conine parametrul colspan:
<TD colspan="2"> T12 </TD>.
n figura alturat, putei observa efectul!

Figura 4.48. Efectul obinut

Pentru a evita o astfel de situaie, neplcut, linia respectiv va conine o


celul n minus, ca n exemplul urmtor. n plus, textul coninut de celula cu acest
parametru va fi aliniat n centru, pentru a vedea cum se poate folosi spaiul astfel
obinut:
<TABLE BORDER="5">
<TR> <TD> T11</TD>
<TD colspan="2"
align="center">T12 </TD></TR>
<TR> <TD> T21</TD> <TD> T22 </TD>
<TD> T23</TD></TR>
<TR> <TD> T31</TD> <TD> T32 </TD>
<TD> T33</TD></TR>
</TABLE>
Figura 4.49. Ajustarea tabelului

rowspan="nr" - insereaz pe urmtoarele nr-1 linii, n aceeai coloan,


cte o celul al crei coninut este vid. Efect secundar: pentru pstrarea
formei dreptunghiulare, toate liniile vor conine cte o celul n plus.
132 Manual de Informatic pentru clasa a XII-a

Exemplul 4.43. Considerm tabelul de mai jos:


<TABLE BORDER="5">
<TR> <TD> T11</TD>
<TD rowspan="2" align="center">
T12</TD> <TD>T13</TD></TR>
<TR> <TD> T21</TD> <TD> T22 </TD>
<TD> T23</TD></TR>
<TR> <TD>T31</TD><TD>T32</TD>
<TD>T33</TD></TR>
</TABLE> Figura 4.50. Exemplu de tabel

Pentru a corecta acest dezavantaj, urmtoarele nr-1 linii vor conine cte o
celul mai puin. Relum exemplul:
<TABLE BORDER="5">
<TR> <TD>T11</TD>
<TD rowspan="2" align="center">
T12</TD> <TD>T13</TD></TR>
<TR> <TD>T21</TD><TD>T22</TD></TR>
<TR> <TD>T31</TD><TD>T32</TD>
<TD>T33</TD></TR>
</TABLE>

Figura 4.51. Ajustarea tabelului

Exemplul 4.44. Vom extinde celula T12 i n dreapta i n jos (cei doi parametri
pot fi folosii i simultan). Textul va fi scris n centrul ptratului astfel format (vezi
Fig. 4.52):
<TABLE BORDER="5">
<TR> <TD>T11</TD>
<TD rowspan="2" colspan="2"
valign="middle" align="center">
T12</TD></TR>
<TR> <TD>T21</TD></TR>
<TR> <TD>T31</TD> <TD>T32</TD>
<TD>T33</TD></TR>
</TABLE>
Figura 4.52. Extinderea unei celule

Elementul CAPTION - are rolul de a permite scrierea titlului unui tabel. Titlul se
scrie ntre cele dou tag-uri, <CAPTION> i </CAPTION>. Cele dou etichete
trebuie s se gseasc imediat dup <TABLE>.

Exemplul 4.45. Mai jos am introdus un titlu pentru un tabel oarecare:


<TABLE>
<CAPTION> Un titlu </CAPTION>
...
Capitolul 4 HTML, CSS - primele noiuni 133

Elementul CAPTION are atributul align. Cele patru valori pe care le poate
lua i efectul lor, le putei observa mai jos:

top bottom left right

Figura 4.53. Exemple de tipuri de aliniere a titlului unui tabel

1. S se realizeze tabelul de mai jos. Acesta este un caz clasic de tabel. n afara
tabelului propriu-zis, trebuie s utilizm limbajul CSS pentru capul de tabel i
alinierea din coloana a doua.

Figura 4.54. Tabelul propus pentru exerciiul 1


Rezolvare. Mai jos este prezentat codul surs:
<HTML>
<HEAD>
<STYLE>
.Stil {font-size:20pt; background:yellow;
font-style:bold; text-align:"center";}
.Stil1 {text-align:"center";}
</STYLE>
</HEAD>
<BODY>
<TABLE border="5">
<TR class="Stil">
<TD> <B> Nume tip </B> </TD>
<TD> <B> Numar octeti </B> </TD>
<TD> <B> Valoare </B> </TD>
</TR>
134 Manual de Informatic pentru clasa a XII-a

<TR>
<TD> <B> float </B> </TD>
<TD class="Stil1"> 4 </TD>
<TD> 3.4*10 <SUP> -38</SUP> si 3.4*10 <SUP> 38</SUP> </TD>
</TR>
<TR>
<TD> <B>double</B> </TD>
<TD class="Stil1"> 8 </TD>
<TD> 1.7*10 <SUP>-308</SUP> si 1.7*10 <SUP>308</SUP> </TD>
</TR>
<TR>
<TD> <B>long double</B> </TD>
<TD class="Stil1"> 10 </TD>
<TD>3.4*10<SUP>-4932</SUP> si 3.4*10<SUP>4932</SUP> </TD>
</TR>
</TABLE>
</BODY>
</HTML>

2. Formai o pagin web care s conin un text oarecare, scris n stnga unei
imagini (vezi Fig. 4.55).

Rezolvare. Aparent, ar fi o problem


de aliniere n dreapta a unei imagini. n
realitate, mascat, avem un tablel cu o
singur linie i dou coloane. n prima
se gseste un text, n a doua o
imagine. Evident, dac se invereaz
coninutul celor dou coloane, obinem
efectul alinierii la stnga a imaginii.
<HTML>
<HEAD>
<STYLE>
P {width:3cm; height:4cm;} Figura 4.55. Pagina web propus
IMG {width:3cm; height:4cm;} pentru exerciiul 2
</STYLE>
</HEAD>
<BODY>
<TABLE>
<TR>
<TD><P>Un text; Un text; Un text; Un text; Un text;
Un text; Un text; Un text; Un text; Un text;
Un text; Un text; Un text; Un text; Un text;</P></TD>
<TD> <IMG src="Eric.jpg", alt="Eric"> </TD>
</TR>
</TABLE>
</BODY>
</HTML>
Capitolul 4 HTML, CSS - primele noiuni 135

3. Se cere s se scrie un text n dou coloane, precum n imaginea de mai jos:

Figura 4.56. Pagina web pentru exerciiul 3

Rezolvare. n fapt, vom construi un tabel cu dou linii i dou coloane. Cele dou
elemente de pe prima linie sunt unite i conin titlul. n cele dou coloane se scriu
mai multe paragrafe. Dup cum tii deja, limea coloanelor depinde de mrimea
ferestrei browser-ului, dar, mai ales, de coninutul lor. Din acest motiv, s-a forat
prin CSS ca paragrafele s aib limea de 4 cm. n rest, analizai modul n care
s-a realizat pagina respectiv:
<HTML>
<HEAD>
<STYLE>
P { width:4cm; }
H2 {text-align:"center"}
</STYLE>
</HEAD>
<BODY>
<TABLE>
<TR><TD colspan="2"><H2>Scrierea pe coloane</H2></TD></TR>
<TR>
<TD>
<P>Un text scris pe doua coloane.</P>
<P>Formam un tabel cu o singura linie si doua
celule de date.</P></TD>
<TD>
<P>Trebuie sa ne asiguram ca textul este impartit de asa
natura astfel incat sa ocupe aproximativ acelasi spatiu
in cele doua coloane.</TD></TR>
</TABLE>
</BODY>
</HTML>
136 Manual de Informatic pentru clasa a XII-a

4.13. Hiperlegturi 1 (link-uri)

Elementul A (ancor) - nceputul unei ancore este marcat prin <a>, iar sfritul
su prin </a>. O ancor conine adresa URL a unei resurse oarecare aflat pe un
server i un text lmuritor (sau o imagine) asupra legturii. Practic, se afieaz,
subliniat, doar textul lmuritor.

Ideea de baz este urmtoarea: dac se execut clic pe acest text lmuritor,
resursa indicat este adus pe calculatorul vizitatorului, opional sau nu i este
lansat programul care prelucreaz resursa respectiv.

Cel mai important atribut al unei ancore este href 2 (calea ctre legtur,
referina). Numeroasele exemple care vor fi date n acest paragraf v vor
lmuri asupra modului de utilizare a acestui atribut.

4.13.1. Legturi ctre alte pagini

O legtur ctre un fiier HTML este afiat de browser cu o alt culoare i


este subliniat. Cnd este deasupra ei, cursorul grafic ia forma unei mini,
indicndu-ne astfel c este o legtur pe care o putem utiliza.

Exemplul 4.47. Mai jos, putei observa modul n care am scris un paragraf care
conine o legtur. Dac se execut dublu-clic asupra ei, de pe server este adus
fiierul index care va fi afiat de browser.
<P>Pentru mai multe informatii,<BR>
<A href="http://www.nasa.gov"> vizitati site-ul NASA</A> !
</P>

Figura 4.57. Exemplu de paragraf care


conine o hiperlegtur

De asemenea, o legtur poate fi creat i cu ajutorul unei imagini (nu


numai cu ajutorul unui text).

Exemplul 4.48. Analizai codul de mai jos:


<A href="http://www.nasa.gov"> <IMG src="Racheta1.bmp"></A>

Termenul este o traducere a celui din limba englez, hyperlink. Din comoditate, este
1

utilizat forma prescurtat a acestuia: legtur (link).


2
Denumirea atributului este un acronim pentru Hypertext REFerence.
Capitolul 4 HTML, CSS - primele noiuni 137

4.13.2. Operaia download

Uneori, este necesar ca utilizatorul paginii noastre s poat descrca, dac


dorete, anumite fiiere. Descrcarea fiierelor poart numele de download-are,
termen care provine din limba englez.

Exemplul 4.49. Considerm o pagin care va conine legtura ctre fiierul care
trebuie download-at (bpro2003.zip). Iat cum am construit ancora:
<A href="http://www.unsite.ro/personal/bpro2003.zip">
Programa la informatica </A>

Dup ce vizitatorul execut un clic pe legtur, va aprea o cutie de dialog


precum cea de mai jos:

Figura 4.58. Cutia de dialog File Download

Prin ea, vizitatorul poate comanda ca dup descrcare, fiierul s fie


automat deschis (Open) cu un program care are asociat respectiva extensie (n
exemplu WinRAR, pentru a-l dezarhiva) sau s fie salvat pe hard, urmnd a fi
utilizat mai trziu, prin comanda Save.

Exemplul 4.50. Presupunem c utilizatorul are pe calculatorul de pe care


acceseaz pagina, plac de sunet i boxe, iar placa de suet este instalat. De
asemenea, presupunem c acesta are instalat un program de redare a sunetelor,
cum ar fi celebrul Winamp i c site-ul conine fiierul Trumpet1.wav. Se pune
problema ca, atunci cnd viziteaz pagina noastr, s poat asculta, la propria
comand, anumite mesaje audio.
<A href="http://www.unsite.ro/personal/Trumpet1.wav">
Sunetul unei trompete </A>
138 Manual de Informatic pentru clasa a XII-a

La executarea unui clic pe legtur, se download-eaz fiierul


Trompet1.wav i este lansat n executare programul Winamp care realizeaz
redarea sunetelor (n particular, sunetul unei trompete).

Figura 4.59. Legtur ctre


un fiier audio

Exemplul 4.51. Similar exemplului anterior, presupunem c avem n C:\ fiierul


video Party-1.avi. Considerm c pentru extensia .avi avem asociat
programul implicit, adic Windows Media Player. Pentru a apela fiierul, vom
utiliza ancora de mai jos:
<A href="C:/Party-1.avi">
Imagini si sunete (fisier avi) </A>

Figura 4.60. Legtur ctre


un fiier video

Efectul este c se lanseaz programul amintit i red fiierul.

4.13.3. Legturi relative la document

Uneori, documentele HTML sunt lungi i pot fi greu parcurse de vizitator.


Desigur, utilizatorul le poate parcurge cu ajutorul barelor de defilare. Exist
posibilitatea ca, n anumite cazuri, s-l scutim de acest efort. Pentru aceasta, vom
proceda astfel:

n punctele de unde dorim s fie vizualizat documentul, crem ancore cu


nume. Numele unei ancore l vom da prin atributul id.

Exemple:

<A id="top"></A> (am aezat-o n partea de sus a documentului).


<A id="mijloc"></A> (am "aezat-o la mijlocul documentului).

n punctele de unde dorim ca utilizatorul s poat vizualiza imediat


documentul ncepnd de la o anumit ancor definit anterior crem, tot cu
ajutorul unei ancore, o hiperlegtur.

Exemple:
<A href="#top"> in top </A> <BR> (salt n partea de sus a documentului).

<A href="#mijloc"> la mijloc </A> <BR> (salt la mijlocul documentului).


Capitolul 4 HTML, CSS - primele noiuni 139

Pentru a vedea pe viu cum funcioneaz acest mecanism, este necesar ca


fiierul s fie suficient de mare, astfel nct zona care conine ancora
destinaie s nu fie vizibil n momentul trimiterii.

Exist posibilitatea ca alte pagini ctre care se face trimitere s fie


vizualizate ncepnd dintr-un anumit punct, care conine o anume ancor.

Exemplul 4.52. Un alt fiier HTML conine o ancor ctre fiierul anterior (numit
lung.html):

<A href="c:\lung.html#mijloc"> Salt la fisierul HTML


"lung.html", la mijloc </A>

Figura 4.61. Exemplu de hiperlegatur spre o pagin cu ancor relativ

Observaie ! Exist cri sau documentaii scrise utiliznd HTML-ul. n loc s avem
un cost ridicat al tipririi ei pe hrtie, se prefer scrierea ei n format HTML i
livrarea ei ctre cititor pe un CD. Acesta va citi cartea direct pe calculator. V dai
seama. c, n astfel de cazuri, referinele relative la document devin extrem de
importante. Acest procedeu este des utilizat i n cazul documentaiilor on-line,
oferite pe Internet.

4.13.4. Trimiterea automat a unui e-mail

Dorim ca o persoan s ne poat trimite un e-mail, direct din pagina noastr.


Ea nu va avea dect s execute un clic pe respectiva legtur i, imediat, se va
lansa programul de trimitere a e-mail-ului, iar adresa noastr va fi trecut automat
n cmpul destinatarului (To).

Exemplul 4.53. Pentru a obine acest efect, pentru atributul href se va completa
mailto, urmat de : i de adresa de e-mail:

<ADDRESS><A href="mailto:eu@unsite.ro"> Puteti sa-mi scrieti


Puteti sa-mi scrieti </A></ADDRESS>

Observaie ! n ultimul timp, acest procedeu este mai puin folosit. Anumite
motoare de cutare, identific cuvntul cheie mailto i extrag adresa de e-mail.
Ulterior, aceast adres este utilizat pentru a trimite mesaje publicitare nedorite
(spam). Din acest motiv, este bine s scriei adresa fr acest atribut, iar cei
interesai, cu un efort suplimentar, o copiaz i v trimit e-mailul.
140 Manual de Informatic pentru clasa a XII-a

4.14. Hri imagine

Poate ai ntlnit pe anumite site-uri o hart. Dac se execut click pe o


anumit regiune a ei, se afieaz anumite informaii, specifice regiunii respectve,
dac se ewxecut click pe alt poriune se afieaz alte informaii, .a.m.d. n acest
caz s-a folosit procedeul hart-imagine. Un alt exemplu de folosire a aceluiai
procedeu: a pagin web n care se prezint un anumit tip de mobil. Dac se d
click pe imaginea ce reprezint un scaun, se afieaz preul scaunui, dac se d
click pe imaginea ce reprezint masa se afieaz preiul mesei, etc. Cum s-au
obinut aceste efecte?.

Problema este urmtoarea: se d o imagine i se cere ca, prin executarea


unui clic asupra unei anumite pari a ei, s se efectueze una dintre operaiile
prezentate n paragraful anterior, prin executarea unui clic n alt parte a ei, s se
efectueze o alt operaie de acelai tip, .a.m.d. Cu alte cuvinte, trebuie s se
creeze un meniu care s se prezinte sub form de imagine.

Privii imaginea alturat.


Ea cuprinde 4 regiuni marcate.
Una sub form de dreptunghi, alta
sub form de cerc i dou sub
form de poligoane. Dorim ca
atunci cnd executm clic pe una
din aceste regiuni, s se execute
o anumit operaie.

Browser-ul va afia poza


fr a evidenia aceste zone, dar
atunci cnd cursorul grafic trece
deasupra unei astfel de zone, el
va lua forma unei mini i, aa
cum am spus, executarea unui
clic determin efectuarea unei
operaii specifice zonei, de Figura 4.62. Exemplu de imagine
exemplu vizualizarea unei pagini. care cuprinde patru zone marcate

4.14.1. Cum se introduce n HTML o hart imagine ?

Mai jos, putei observa modul n care au fost scrise zonele din imaginea
anterioar (cinele):

<HTML>
<BODY>
<IMG src="c:/web/caini3.jpg" usemap="#caine">
Capitolul 4 HTML, CSS - primele noiuni 141

<MAP NAME="caine">
<AREA SHAPE=RECT COORDS="25,14,90,44" HREF="patrat.htm">
<AREA SHAPE=CIRCLE COORDS="36,70,23" HREF="cerc.htm">
<AREA SHAPE=POLY COORDS="185,39,193,37,204,36,221,34,244,
47,246,47,247,50,248,57,257,62,262,64,269,67,264,73,259,81,
249,82,232,78,230,79,223,87,212,87,184,80,183,66,184,57,185,
41,186,35" HREF="cap.htm">
<AREA SHAPE=POLY COORDS="116,106,112,116,110,121,110,126,
107,128,104,132,104,141,104,147,104,152,99,156,95,163,97,165,
99,165,99,169,99,180,97,188,97,193,103,192,111,190,116,192,11
9,192,119,184,123,174,123,166,126,156,128,153,131,148,132,144
,132,142,132,139,134,138,138,135,138,128,143,125,150,121,150,
117,150,115,152,113,152,110,116,106" HREF="picior.htm">
</MAP>
</BODY>
</HTML>

Din analiza exemplului de mai sus, observm c trebuie s utilizm


urmtoarele elemente:

Elementul MAP - cu acesta descriem o hart, utiliznd dou tag-uri: <MAP> i


</MAP>. ntre ele se gsete descrierea diverselor zone care alctuiesc harta.
Elementul are urmtorul atribut:

name - numele hrii. El trebuie trecut n atributul usemap al elementului IMG


care descrie imaginea folosit ca o hart:
<IMG src="c:/web/caini3.jpg" usemap="#caine">

Elementul AREA - are rolul de a descrie o zon din hart pentru care, la
executarea unui clic, se produce un anumit efect. Acest element utilizeaz tag-ul
<AREA atribute>. Principalele atribute ale elementului AREA sunt:

shape descrie tipul regiunii respective;


href adresa fiierului html sau a unei alte resurse (la fel ca la ancore).

Dup cum tim, fiecare imagine este alctuit din pixeli. Fiecare pixel este
caracterizat de dou coordonate (x,y), n sistemul de axe de mai jos:

0,0
X

Figura 4.63. Sistemul de coordonate


asociat unei imagini Y
142 Manual de Informatic pentru clasa a XII-a

Atributul SHAPE poate lua valorile:

RECT COORDS="X1,Y1,X2,Y2" dreptunghi, unde X1,Y1 reprezint


coordonatele colului din stnga-sus i X2,Y2 sunt coordonatele colului
din dreapta-jos.
CIRCLE COORDS="X1,Y1,R" cerc, unde X1,Y1 reprezint
coordonatele centrului, iar R raza cercului.
POLY COORDS="X1,Y1, X2,Y2, ..., Xn,Yn" poligon, unde
X1,Y1, X2,Y2, ... reprezint coordonatele vrfurilor.
x2,y2
x1,y1
x4,y4
x1,y1
x1,y1
R x3,y3

x2,y2
xn,yn

RECT CIRCLE POLY

Figura 4.64. Coordonatele celor trei forme ale atributului SHAPE

Totui, cum au fost obinute coordonatele punctelor? Dac pentru dreptunghi


sau cerc aceste coordonate pot fi gsite relativ uor (de exemplu, Paint-ul
afieaz coordonatele cursorului), n cazul poligoanelor nchise, problema devine
serioas! Din acest motiv, s-au realizat mai multe programe prin care coordonatele
se obin automat.

4.14.2. Programul Map This!

Programul Map This! este destinat obinerii automate


a coordonatelor punctelor care definesc regiunile, pentru o
imagine cu extensia .gif sau .jpeg. Practic, se ncarc
o imagine ntr-unul dintre formatele enumerate anterior i se
traseaz, cu mouse-ul, regiunile pe ea. Imaginea arat precum
cea din Fig. 4.62 (cinele). Dup ce regiunile au fost trasate, se
salveaz sub form de fiier HTML coordonatele astfel obinute.

Programul este freeware i poate fi obinut de pe


Internet. Cutai-l cu GOOGLE!

El tie mai multe dect ce este prezentat n acest


paragraf, dar noi ne vom limita doar la ceea ce este strict
necesar!
Figura 4.65. Programul
Map This!
Capitolul 4 HTML, CSS - primele noiuni 143

1) Dup apelul programului, se ncarc imaginea. Apelai File i New. Va


aprea o cutie de tip Open, cu ajutorul creia putei selecta fiierul dorit
(.jpeg sau .gif).

2) Pentru a putea lucra uor cu imaginea, putei folosi Zoom in (mrete


imaginea) sau Zoom out (o micoreaz).

Figura 4.66. Butoane de marire i


micorare a imaginii
Zoom in Zoom out

3) Pentru a trasa un dreptunghi, selectai butonul alturat. Apoi,


selectai dreptunghiul dorit (ca n Paint), de la colul din stnga-sus,
ctre colul din dreapta-jos.

n exemplu, am selectat un dreptunghi care include


cuvntul PETS.

Figura 4.67. Selectarea unei forme


dreptunghiulare

4) Pentru a trasa un cerc, apsai butonul alturat. Apoi, selectai cercul


dorit.

n exemplu, ncadrm n cercuri capetele celor doi:

Figura 4.68. Trasarea unor


forme circulare

5) Pentru a trasa un poligon oarecare, apsai butonul alturat i trasai


poligonul. Executai un clic n punctul de unde dorii s ncepei
trasarea. Apoi deplasai cursorul pe prima latur, apoi executai un
click, deplasai cursorul pe a doua latur, executai un clic, .a.m.d. n final,
executai un dublu-clic i figura se va nchide.

n exemplu, am ncadrat n poligon celul. Atenie:


pentru a obine o ct mai fin ncadrare, trasai laturi mici
pentru poligon.

Figura 4.69. Trasarea unei


forme poligonale
144 Manual de Informatic pentru clasa a XII-a

6) Dup ce am ncadrat toate regiunile care ne intereseaz, putem trece la


scrierea referinei (link-ului) pentru fiecare dintre ele. Din meniu, apelai
View i Area List. Va aprea o list, aa cum este cea de mai jos.
ntruct am selectat 4 regiuni, lista are
4 elemente. Selectarea unui element al
ei (n exemplul 1) are ca efect faptul c
zona care i corespunde va aprea n
imagine cu o culoare diferit, pentru a
le putea distinge. Figura 4.70. Lista Area List

Un dublu-clic n list, pe reprezentarea unei anumite regiuni, are ca efect


scrierea link-ului respectiv.

n exemplul urmtor, comandm


browser-ului ncrcarea unui anumit fiier
HTML (o pagin). Procedai la fel pentru
fiecare regiune n parte. Dup ce ai
terminat aceast operaie, trecei la pasul
urmtor. Spre exemplu, pentru zona 3
(Area #3), avem:

Figura 4.71. Fereastra de


setri a une zone

7) Urmeaz salvarea hrii. Apelai File i Save As. Selectai


CSIM. Salvai sub form de fiier HTML.

Exist posibilitatea s salvai ntr-un fiier HTML deja scris (acesta va conine
src-ul cu imaginea). Dac salvai ntr-un fiier diferit, putei apoi s-l
deschidei, s selectai descrierea (ntre <MAP> i </MAP>) i s o includei n
fiierul dvs. De acum, putei folosi fr probleme hri imagine.

n final, cteva amnunte de lucru:


tergerea unei regiuni. Apsai butonul alturat i aezai cursorul grafic
deasupra ei. Apoi, apsai butonul drept al mouse-ului. Din meniul flotant
care va aprea, selectai Delete Area.

tergerea unui punct al liniei poligonale. Atunci punct ters


cnd cursorul grafic staioneaz asupra sa, cursorul ia
form de cruce. Dac se apas butonul drept i se
selecteaz Delete Point, punctul va fi ters i, deci,
ignorat pentru poligon. Figura 4.72

Exerciiu de tip referat! ntocnii un referat despre programul Map This! sau un
altul cu acelai rol. Este foarte important s nvai s v autoducumentai. Nu
ntotdeauna, pentru orice tem, vei gsi o carte care s-o trateze!
Capitolul 4. HTML, CSS primele noiuni 145

4.15. Elementele BASE, META i SCRIPT


Vom prezenta n continuare cteva elemente eseniale care pot fi scrise n
cadrul antetului (HEAD), extrem de utile n foarte multe situaii.

Elementul BASE - are forma general <BASE href="adresa"> i are rolul de


a preciza o adres de baz pentru resurse, iar celelalte adrese se obin adugnd
dup adresa de baz o adres specific. Tag-ul <BASE> se va scrie n antetul
paginii, adic n HEAD.
Exemplul 4.54. Pe calculatorul meu, am cteva imagini n folder-ul C:\LaMare
(1.jpg, 2.jpg, etc.). Valoarea folder-ului va fi trecut n BASE (href). De acum,
pot scrie adresa pe scurt (1.jpg).
<HEAD>
<BASE href="C:/LaMare/">
...
<BODY>
...
<IMG src="1.jpg">

Observaii !

Practic, se formeaz C:/LaMare/1.jpg.


V dai seama c n acest mod pot scrie i o adres de internet:
<BASE href = "http://www.paginamea.ro/">, etc.

Elementul META - este folosit pentru a furniza informaii motoarelor de


cutare. Unele dintre ele viziteaz doar antetul pentru a obine informaii.
Informaiile coninute de acest element nu sunt afiate de browser, dar este
important s-l folosim pentru ca informaiile coninute n site-ul nostru s fie
accesibile. Tag-ul <META> se gsete n antet (HEAD).

Observaie ! n antet se pot gsi mai multe elemente META.

Atributele elementului META sunt:

Atributul NAME pentru el se pot utiliza cteva cuvinte cheie care vor fi
prezentate n cele ce urmeaz.
Atributul CONTENT are un coninut variabil n funcie de valoarea trecut
pentru NAME.

Cum utilizm cele dou atribute ?


Pentru a specifica autorul unui document:
<META NAME="Author" CONTENT="Mihai Popescu">
146 Manual de Informatic pentru clasa a XII-a

Pentru a specifica titlul unui document:


<META NAME="TITLE" CONTENT="Cresterea albinelor">

Pentru a specifica cuvintele cheie dup care s fie regsit site-ul dvs. V dai
seama de importana acestora...
<META NAME="KEYWORDS" CONTENT="albine, matca, trantor,
stup, polen, miere">

Important ! Trebuie s trecei forma scurt a unui cuvnt. De exemplu, dac


trec "stup", motoarele vor furniza adresa site-ului, chiar dac o persoan
caut dup cuvntul cheie "stupi".

Pentru a specifica limba n care este scris site-ul (este util n cazul cutrilor
avansate). n exemplu, site-ul este scris n limba romn:
<META NAME="LANGUAGE" CONTENT="RO">

Pentru a specifica textul pe care l va afia un motor de cutare, la listarea


paginilor. Dac acesta nu este trecut, motorul va afia primele linii din
pagin, ceea ce nu e foarte relevant.
<META NAME="DESCRIPTION" CONTENT="Acest site este
dedicat modalitatilor de crestere a albinelor">

Observaii importante !

Exist i alte atribute ale elementului META, dar acetia doi sunt suficieni.
Majoritatea motoarelor de cutare se bazeaz n principal pe acetia:
Description i Keywords.

Optimizarea site-urilor pentru motoarele de cutare (SEO Search


Engine Optimization) reprezint o unealt indispensabil pentru a fi
eficient pe Internet. Exist firme specializate care se ocup strict de aceast
problem, iar preurile sunt mari
La nceput, cei care au realizat motoarele de cutare au vrut s ajute
programatorii web prin utilizarea tag-urilor META, pentru a evidenia mai uor
i mai bine coninutul paginilor. Apoi, anumite persoane au folosit acest lucru
pentru a obine un avantaj i au introdus cuvinte care nu aveau nici o
legtur direct cu paginile respective, ci doar pentru a fi listai mai bine.
Aadar, tag-urile META nu mai erau utile, ci doar o unealt pentru spam
(informaie nedorit). De aceea, unele motoare au renunat definitiv la ele,
iar altele, dimpotriv, pun paginile la sfritul listei dac elementele cheie din
META nu se regsesc n coninutul paginii. n concluzie, reinei:

Folosii tag-urile META cu grij i nu introducei cuvinte ce nu sunt


incluse i n fiierul HTML. Nu repetai cuvintele!
Capitolul 4. HTML, CSS primele noiuni 147

Elementul SCRIPT - este folosit pentru introducerea anumitor secvene de


program n cadrul paginilor web. Exist mai multe limbaje (numite de scriptare)
care permit scrierea acestor secvene, cum ar fi JavaScript sau VBScript.
Programa nu include studiul acestor limbaje.

4.16. Cadre (FRAMESET, FRAME i IFRAME)


Exist oare posibilitatea ca aceeai fereastr a browser-ului s afieze mai
multe fiiere HTML (sau alte resurse) simultan? Rspunsul este afirmativ.

Exemplul 4.55. Privii imaginea din Fig.4.73: fereastra este mprit n 4 pri:
dou dintre ele afieaz dou fiiere HTML, iar celelalte dou afieaz dou imagini.
Blocurile n care a fost mprit fereastra poart denumirea de cadre (frame-uri).

Figura 4.73. Exemplu de pagin web mprit n cadre

Cum s-a obinut acest efect? nainte de a prezenta sistematic noiunile, ca s


v facei o idee, privii fiierul HTML de mai jos:
<HTML>
<HEAD>
</HEAD>
<FRAMESET rows="30%, 70%">
<FRAME scrolling="yes" src="c:/test.html">
<FRAMESET cols="30%,30%, 40%">
<FRAME scrolling="yes" src="c:/poze/cladire.jpg">
<FRAME scrolling="yes" src="c:/poze/birou.jpg">
<FRAME scrolling="yes" src="c:/c1.html">
</FRAMESET>
</FRAMESET>
</HTML>
148 Manual de Informatic pentru clasa a XII-a

Elementul FRAMESET - are rolul de a mpri fereastra n mai multe cadre. n


fiierul HTML el nlocuiete <BODY>. Pentru a-l folosi, vom utiliza dou etichetele:
<FRAMESET atribute> i </FRAMESET>.

Vom studia cteva atribute ale acestui element:


Rows descrie liniile n care este mprit fereastra;
Cols descrie coloanele n care este mprit fereastra.

Observaie ! n exemplul dat iniial, fereastra este mprit n dou linii. Apoi, a
doua linie este mprit n trei coloane.

Probabil c v vei ntreba: de ce a fost mprit a doua linie n trei coloane


i nu prima? Observai cum se nchid tag-urile <FRAMESET> i </FRAMESET>.
Iniial, avem dou linii. Prima linie conine un element FRAME i a doua un element
FRAMESET. Acesta din urm declar 3 coloane, deci ntre tag-urile lui se vor gsi 3
elemente FRAME:
<FRAMESET rows="30%, 70%">
<FRAME ...>
<FRAMESET cols="30%,30%, 40%">
<FRAME ...>
<FRAME ...>
<FRAME ...>
</FRAMESET> Figura 4.74. Schema
</FRAMESET> paginii obinute

Exemplul 4.56. Dou linii, iar prima linie este mprit n trei coloane. Prima linie
conine un FRAMESET, a doua un FRAME:

<FRAMESET rows="30%, 70%">


-<FRAMESET cols="30%,30%, 40%">
<FRAME ...>
<FRAME ...>
<FRAME ...>
-</FRAMESET>
<FRAME ...> Figura 4.75. Schema
</FRAMESET> paginii obinute

Pentru a stabili dimensiunile liniilor (coloanelor), exist mai multe modaliti:

1) Procentual, ca n exemplele date:

<FRAMESET rows="30%, 70%"> Avem 2 linii. Prima linie ocup 30% din
nlimea ferestrei, iar a doua, 70%.

<FRAMESET cols="30%,30%, 40%"> Avem 3 coloane. Prima coloan ocup


30% din limea ferestrei, a doua 30%, iar a treia 40%.
Capitolul 4. HTML, CSS primele noiuni 149

2) Proporional:

<FRAMESET cols="1*, 2*, 3*">. 1+2+3=6. Prima coloan ocup 1/6 din
lime, a doua 2/6=1/3 din lime, iar a treia 3/6=1/2 din lime.

3) Mixt:

<FRAMESET cols="50%*, 1*, 2*, 200"> Prima coloan ocup 50% din
lime, iar ultima 200 de pixeli. Ce a rmas se mparte proporional ntre coloanele
2 i 3, deci coloana 2 ocup 1/3 i coloana 3, 2/3.

Observaie ! n cazul n care valorile sunt incoerente, nu s-au dat norme privind
modul n care trebuie procedat. Prin urmare, fiecare tip de browser va proceda
n modul su specific. ncercai...

Elementul FRAME - este utilizat pentru a preciza coninutul unui anumit cadru.
Se utilizeaz un singur tag: <FRAME atribute>. Iat principalele proprieti:

src adresa fiierului HTML sau a imaginii utilizate.

de exemplu, cadrul afieaz un fiier HTML:

<FRAME src="c:/test.html">

sau cadrul afieaz o imagine:


<FRAME src="c:/poze/birou.jpg">

marginheight marginile, n pixeli sau procent %, fa de partea de sus


(top) i cea de jos (bottom);

marginwidth marginile, n pixeli sau procent %, fa de partea din stnga


(left) i cea din dreapta (right).

Sus i jos marginea este de 100 pixeli, iar n stnga i dreapta este
de 150 pixeli:

<FRAME marginwidth=150 marginheight=100


src="c:/poze/cladire.jpg">

frameborder - poate lua dou valori: 1 (valoare implicit) sau 0. Dac


valoarea luat de acest atribut este 0, atunci cadrul nu mai este separat de
celelalte printr-un chenar.

Observaie ! Dac vrem s nu se traseze chenarul separator ntre dou cadre,


trebuie ca amndou s aib valoarea 0 pentru acest atribut. E logic, nu?

scrolling trateaz prezena barei de scroll (defilare). Atributul poate


lua una dintre cele trei valori:
150 Manual de Informatic pentru clasa a XII-a

1) auto valoarea implicit. Bara de scroll este prezent numai dac


este cazul (ce trebuie afiat n cadru ocup o suprafa mai mare
dect cea a cadrului);
2) yes - bara de scroll este ntotdeauna prezent;

3) no bara de scroll nu este n nici un caz afiat.

noresize prezena sa cere browser-ului s nu permit vizitatorului


paginii respective s redimensioneze cadrul. Dac este prezent pentru un
cadru, atunci nu pot fi redimensionate nici cadrele nvecinate.

name are rolul de a atribui un nume elementului FRAME.

Probabil c v vei ntreba: la ce folosete numele unui cadru? Ei bine, rolul

? este uria. Mai precis, dintr-un cadru, se poate comanda coninutul oricrui
cadru (inclusiv al cadrului curent).

Exemplul 4.57. Browser-ul afieaz dou cadre. Primul dintre ele conine link-urile
pentru capitolele unei cri. Al doilea, iniial, afieaz paragrafele primului capitol.
La comanda vizitatorului paginii respective, se pot afia, n al doilea cadru,
paragrafele oricrui alt capitol.

Figura 4.76. Pagina propus pentru Exemplul 4.57

Iat fiierul HTML iniial, cel care creeaz cadrele i n care unul dintre ele
este numit cpt:

<HTML>
<HEAD>
</HEAD>
<FRAMESET cols="30%*, 70%">
<FRAME src="c:/ancore.html">
<FRAME name="cpt" src="c:/c1.html">
</FRAMESET>
</HTML>

Primul cadru afieaz urmtorul fiier HTML:


Capitolul 4. HTML, CSS primele noiuni 151

<HTML>
<HEAD>
</HEAD>
<BODY>
<A href="c:/c1.html" target="cpt"> Capitolul 1 </A> </br>
<A href="c:/c2.html" target="cpt"> Capitolul 2 </A> </br>
<A href="c:/c3.html" target="cpt"> Capitolul 3 </A>
</BODY>
</HTML>

Fiierul de mai sus conine trei ancore. Pentru fiecare ancor s-a folosit un atribut
nou, numit target. Acesta are rolul de a preciza inta, adic numele cadrului
care va afia fiierul HTML cerut.

Observaie ! n absena atributului target, fiierul va fi afiat n cadrul care


conine ancora!

Elementul IFRAME - permite crearea unui cadru n corpul (BODY) documentului.


Cu alte cuvinte, cadrele se pot folosi i n mod clasic. Pentru a-l descrie, se
folosesc etichetele <IFRAME atribute> i </IFRAME>.

Exemplul 4.58. Mai jos, un cadru coninut


de un document afieaz un fiier HTML:
<HTML>
<HEAD></HEAD>
<BODY>
<P>Acesta este un paragraf</P>
<IFRAME SRC="C:/c1.html">
</IFRAME>
</BODY> Figura 4.77. Exemplu de pagin cu un
</HTML> cadru n interiorul corpului documentului

Atributele elementului <IFRAME> sunt:


name numele, am vzut care este rolul lui;
frameborder poate lua valoarea 0 sau 1, la fel ca pentru elementul
FRAME;
src adresa fiierului HTML sau a imaginii utilizate;
scrolling la fel ca orice cadru.

Elementul NOFRAMES - este cuprins ntre tag-urile <NOFRAMES> i


</NOFRAMES>. n cazul n care browser-ul vizitatorului x nu poate afia cadre, se
utilizeaz pentru a scrie tag-urile HTML alternative. Ce-i drept, acest lucru se
ntmpl din ce n ce mai rar (fabricanii de soft s-au adaptat cerinelor). De regul,
n acest caz, se vor utiliza <BODY> i cteva ancore (cte una pentru fiecare cadru).
152 Manual de Informatic pentru clasa a XII-a

4.17. Elementul MARQUEE


Acesta creeaz un bloc n care elementele introduse ntre etichetele
<MARQUEE> i </MARQUEE> se mic ntr-o anumit direcie. Acest efect se
numete Scrolling Display i poate fi util la afiarea anunurilor (publicitare):

Figura 4.78. Efect obinut cu ajutorul elementului MARQUEE

Codul pentru a obine animaia de mai sus este:


<MARQUEE>Salut! Uite masina mea! <IMG src="Masina.jpg">
</MARQUEE>

Se observ c elementul este la nivel de text, imaginea fiind aliniat cu textul


introdus. Oricum, trebuie folosit cu grij i cu gust pentru c poate obosi vizitatorul
cu prea mult micare...

Cele mai importante atribute ale acestui element sunt:

Direction direcia de micare a blocului ("Left" sau "Right").


Valuarea implicit este dinspre stnga ("Left").
Behavior tipul de scroll aplicat. Poate lua valorile:

Scroll valoare implicit - coninutul se mic de la o margine la


alta i apoi reapare;
Slide cnd se atinge marginea opus (cea indicat de atributul
Direction), micarea se oprete;
Alternate coninutul se mic alternativ ntre cele dou margini i
este ntotdeauna vizibil.
Scrolldelay timpul de tranziie al elementelor de la o poziie la alta (n
milisecunde, valoarea implicit este de "85"). Astfel, stabilim viteza cu care
se deruleaz animaia: cu ct aceast valoare este mai mare, cu att vom
avea o tranziie mai lent a coninutului.
De exemplu: <MARQUEE Scrolldelay="500"> (jumtate de secund).
Capitolul 4. HTML, CSS primele noiuni 153

Scrollamount se seteaz numrul de pixeli cu care se mut coninutul


blocului, la fiecare pas. O valoare mai mare implic o vitez mrit de
micare. Valoarea implicit este "6".
De exemplu: <MARQUEE Scrollamount="10">.

Loop numrul de cicluri pe care s le efectueze coninutul. Implicit,


valoarea este "INFINITE" (la nesfrit). O problem ar fi faptul c dup
terminarea ultimului ciclu, coninutul dispare. Se poate rezolva ns cu
atributul Behavior, specificnd ca la ultimul ciclu s se opreasc atunci
cnd atinge marginea respectiv (cu "Slide"):
De exemplu:
<MARQUE Loop="3" Behavior="Slide">Salutare!</MARQUEE>.

4.18. Aezarea implicit n pagin a diverselor


elemente

O ntrebare foarte important: cum aranjeaz browser-ul n pagin diversele


elemente (imagini, paragrafe, tabele, etc.)? V dai seama de importana ei: orice
creator de pagini web dorete s amplaseze elementele care alctuiesc o pagina
ntr-un anumit fel...

n HTML, exist dou tipuri de elemente: elemente la nivel de bloc i


elemente la nivel de text (inline).

A) Elementele la nivel de bloc sunt aezate pe rnd nou. Exemple de


elemente la nivel de bloc: P (paragraf), TABLE (tabel), TR (linie de tabel)
H1..H6, OL, LI, UL (liste), DL, DT, DD (itemi din liste).

B) Elemente la nivel de text (inline). Acestea se scriu pe linia curent, n


continuare. Exemple de elemente la nivel de text: B (bold), I (italic), IMG
(imagini), DEL, DFN, etc.

Exemplul 4.59. Analizai codul surs de mai jos:


<HTML>
<HEAD>
<STYLE>
IMG {width:3cm;
height:4 cm;}
</STYLE>
</HEAD>
154 Manual de Informatic pentru clasa a XII-a

<BODY>
<P> Acest paragraf este scris pentru a verifica
modul de aliniere pe orizontala in cazul unui
element IMG, care este de tip INLINE
<IMG src="Eric.jpg", alt="Eric">,
deci se insereaza exact ca un cuvant intr-un paragraf</P>
<P> Paragraful este un element de tip BLOC, asa ca se
insereaza pe o linie noua!</P>
</BODY>
</HTML>

Figura 4.79. Pagina web obinut


Capitolul 4. HTML, CSS primele noiuni 155

4.19. Alte modaliti de aezare n pagin a


elementelor

n CSS exist posibilitatea s se aeze elementele n poziiile dorite (alta


dect cea n cazul fluxului normal). Aceast posibilitate este dorit de mult timp de
ctre creatorii de pagini WEB. O astfel de aezare se poate face prin utilizarea
atributului position, care poate lua mai multe valori:

static implicit aezarea se face n flux normal;

absolute aezare n poziii absolute exist, totui, anumite nuane,


motiv pentru care vom da mai multe exemple pentru a v lmuri.

Exemplul 4.60. Un paragraf i un tabel sunt aezate n flux


normal. O celul a tabelului conine o imagine:
<P> Un text oarecare
<TABLE border=3>
<TR>
<TD> A11 </TD>
<TD id="Tata">
<IMG src="c:\Poze\cladire.jpg"></TD></TR>
<TR>
<TD> A21 </TD> <TD> A22 </TD></TR> Figura 4.80. Pagina web
</TABLE>

Exemplul 4.61. Adugm componentei IMG un stil, prin care-i precizm poziia.
Poziia este dat n pixeli prin atributele top i left. n acest caz, deplasarea este
dat fa de colul din stnga-sus al ferestrei:
<STYLE>
IMG {position:absolute; left:30; top:50;}
</STYLE>
...
<P> Un text oarecare
<TABLE border=3>
<TR>
<TD>A11</TD>
<TD id="Tata">
<IMG src="c:\Poze\cladire.jpg"></TD></TR>
<TR>
<TD>A21</TD> <TD>A22</TD></TR> Figura 4.81. Pagina web
</TABLE>

Pare simplu, nu-i aa? n realitate, lucrurile sunt puin mai complicate.
Aceasta se ntmpl atunci cnd elementul printe este poziionat n flux normal.
156 Manual de Informatic pentru clasa a XII-a

Exemplul 4.62. Elementul printe al lui IMG este


elementul TD (nu TABLE). Poziionm absolut i
elementul TD. Observm c, n acest caz, elementul
apare n afara tabelului, iar IMG este poziionat
relativ fa de TD (vezi Fig. 4.82).

<STYLE>
IMG { position: absolute;
left:30; top:50; }
#Parinte_TD { position:absolute;
top:100; left:100; }
</STYLE>
...
<P> Un text oarecare
<TABLE border="3">
Figura 4.82. Pagina web
<TR>
<TD> A11 </TD>
<TD id="Parinte_TD">
<IMG src="c:\Poze\cladire.jpg"> A21 </TD> </TR>
<TR>
<TD>A21</TD> <TD>A22</TD> </TR>
</TABLE>
...

Ideea de baz este urmtoarea: dac un element este poziionat absolut i dac
printele su, printele printelui, .... sunt poziionate n flux normal, atunci
elementul este poziionat n raport de colul din stnga-sus al ferestrei. Dac
parintele este poziionat absolut, atunci elementul este poziionat relativ fa
de printe.

Exemplul 4.63. De aceast dat, poziionm absolut


tabelul i imaginea. Aa cum era de ateptat, imaginea
se aliniaz n raport de colul tabelului.
<STYLE>
IMG { position: absolute;
left:30px; top:50px; }
TABLE { position:absolute;
top:100px; left:100px; }
</STYLE>
</HEAD>
<BODY>
<P> Un text oarecare
<TABLE border=3> Figura 4.83. Pagina web
...

Observaie ! Pentru poziionarea absolut, orice element poziionat n flux normal


se consider c se afl la coordonatele (0,0) fa de printele su. Cu aceast
constatare, un element este poziionat, de fapt, relativ fa de printe.
Capitolul 4. HTML, CSS primele noiuni 157

relative spre deosebire de poziionarea absolut, n cazul poziionrii


relative, un element este poziionat n raport de elementul printe, chiar i n
cazul n care acesta din urm este pozionat n flux normal.

Exemplul 4.64. Mai jos, elementul IMG este poziionat


relativ fa de elementul printe (TD):

<HTML>
<HEAD>
<STYLE>
IMG { position: relative;
left:30px; top:50px; }
</STYLE>
</HEAD>
<BODY>
<P> Un text oarecare
<TABLE border="3"> Figura 4.84. Pagina web
<TR>
<TD>A11</TD>
<TD id="Parinte_TD">
<IMG src="c:\Poze\cladire.jpg"> A21 </TD> </TR>
<TR> <TD>A21</TD>
<TD>A22</TD> </TR>
</TABLE>
</BODY>
</HTML>

Observaie ! Atributele pot lua i valori negative.

4.20. Atributul z-index

Din studiul mecanismului de poziionare a elementelor s-a putut distinge


faptul c exist posibilitatea ca anumite elemente s fie afiate suprapus. Pe de o
parte, dac nu dorim ca acest lucru s se ntmple, trebuie s fim ateni la scrierea
coordonatelor, dar, pe de alt parte, putem face ca aceast posibilitate s lucreze
n interesul nostru. Mai mult, prin intermediul atributului z-index, putem controla
ordinea de afiare a elementelor suprapuse.

Exemplul 4.65. Un tabel are culoarea de fond galben, un altul are culoarea
albastr, iar n rest sunt identice. Primul tabel reine pentru z-index, 1, iar al
doilea, 2. Cele dou tabele sunt afiate parial suprapus, dar deasupra se gsete
cel care pentru z-index reine 2 (vezi Fig. 4.85.a). Dac se inverseaz valorile
reinute de z-index pentru cele dou tabele, atunci tabelele sunt afiate n ordine
invers (vezi Fig. 4.85.b).
158 Manual de Informatic pentru clasa a XII-a

a) b)

Figura 4.85. Ordinea tabelelor n funcie de atributul z-index

<HTML>
<HEAD>
<STYLE>
#tabel1 { position: absolute; top:100; left:100;
background-color:blue;
z-index:1; }
#tabel2 { position: absolute; top:120; left:120;
background-color:yellow;
z-index:2; }
</STYLE>
</HEAD>
<BODY>
<TABLE id="tabel1" border="3">
<TR>
<TD> A11 </TD>
<TD> <IMG src="c:\Poze\cladire.jpg"> A21 </TD>
</TR>
<TR>
<TD> A21 </TD> <TD> A22 </TD>
</TR>
</TABLE>
<TABLE id="tabel2" border="3">
<TR>
<TD> A11 </TD>
<TD> <IMG src="c:\Poze\cladire.jpg"> A21 </TD>
</TR>
<TR>
<TD> A21 </TD> <TD> A22 </TD>
</TR>
</TABLE>
</BODY>
</HTML>
Capitolul 4. HTML, CSS primele noiuni 159

4.21. Atributul display

Am nvat faptul c n HTML exist elemente de tip bloc (block), care se


afieaz la nceput de rnd i singure pe linie i elemente de tip text (inline) care
se afieaz n continuarea rndului curent.

Exist posibilitatea de a schimba modul implicit de afiare, prin utilizarea


atributului diplay. Acesta poate lua urmtoarele valori:

Block elementele se afieaz la nceput de rnd.

Exemplul 4.66. Un element de tip bold va fi afiat block,


dei, implicit, se afieaz inline:

<HTML>
<HEAD>
<STYLE>
B { display:block; }
</STYLE>
</HEAD> Figura 4.86. Element de tip bold
<BODY> afiat la nceput de rnd
<P> Un <B>text</B> oarecare</P>
</BODY>
</HTML>

Inline elementele se afieaz n continuarea rndului curent.

Exemplul 4.67. Implicit, paragrafele se afieaz la nceput de rnd (block). De


aceast dat, se afieaz inline:

<HTML>
<HEAD>
<STYLE>
P { display:inline; }
</STYLE>
</HEAD> Figura 4.87. Element de tip paragraf afiat
<BODY> n continuarea randului curent
<P> Un text oarecare </P>
<P> Alt text oarecare </P>
</BODY>
</HTML>

none elementul (elementele) nu se va afia.


160 Manual de Informatic pentru clasa a XII-a

4.22. Caractere HTML

n HTML exist posibilitatea de introducere a caracterelor prin codul lor.


Astfel, putem folosi i caractere care nu se obin direct de la tastatur, cum ar fi:
semne matematice, litere greceti, litere specifice limbii romne, etc.

Exemplul 4.68. Pentru texte n limba romn, putem introduce diacritice:

"Mama merge la pia" Mama merge la pia&#355;&#259;


"ara mea este Romnia" &#354;ara mea este Rom&#226;nia
"O oprl" O &#351;op&#226;rl&#259;

Exemplul 4.69. Pentru texte (formule) matematice:

"Aria cercului este R " Aria cercului este &#960R;<SUP>2</SUP>


2

"sin(t) " sin(&#969;t)

Exemplul 4.70. Pentru semne speciale (se pot lsa mai multe spaii ntre cuvinte):

" Nu mai copiai..." &#169; Nu mai copia&#355;i...


"Mama merge!" mama&#160;&#160;&#160;merge

Observaie ! Prin folosirea spaiului, browser-ul nu va pune cele dou cuvinte pe


linii diferite!

Exemplul 4.71. Evitarea confuziei de caractere pe care o poate face browser-ul


(caracterul "<" are un anumit sens n HTML).
Se afieaz ntr-un paragraf, "m<v": <P> m&#60;V </P>.

Mai multe caractere putei gsi n Anexa 3.

Aplicaie. Realizai pagina web de mai jos:

Figura 4.88. Pagin cu


caractere romneti
Capitolul 4. HTML, CSS primele noiuni 161

4.23. Aspecte generale ale proiectrii


interfeelor web
Problema la care ncercm s rspundem n acest paragraf este urmtoarea:
cum este bine s arate o pagin web? V dai seama c, la aceast ntrebare, nu
se poate da un rspuns precis, dar se pot prezenta anumite reguli de care este
bine s inei cont. Cel mai important este coninutul paginii, care trebuie s fie
actualizat frecvent - el este cel care determin ca respectiva pagin s fie vizitat!

Haidei s pornim de la un exemplu simplu: tim noiunile de baz ale


limbajului HTML i un fotograf profesionist apeleaz la noi pentru un site care s-i
descrie simplu i la obiect activitatea. Deoarece clientul nostru nu este i nici nu
este necesar s fie familiarizat cu elementele tehnice, trebuie s-l ntrebm ce
informaii dorete s fie incluse pe site. n mod evident, acesta ne va spune c
dorete s-i prezinte lucrrile anterioare (portofoliul), datele de contact, eventual o
scurt descriere a sa i a echipamentului pe care-l utilizeaz i onorariul pentru
diversele servicii pe care le ofer. Reinem toate informaiile amintite anterior i i
cerem, de asemenea, o serie de fotografii pe care le consider reprezentative.

S trecem la treab! n primul rnd, informaiile trebuie s fie bine


structurate, pentru ca vizitatorul s nu piard timp la identificarea acestora. Din
prima discuie cu clientul, am obinut structura site-ului ne trebuie o pagin
separat pentru fiecare categorie:
1. descrierea fotografului i a activitii pe care o profeseaz;
2. portofoliul care cuprinde o serie de fotografii de la diverse evenimente;
3. datele tehnice privitoare la dispozitivele fotografice, la studio, etc.;
4. preurile n funcie de serviciile oferite;
5. datele de contact (telefon fix, mobil, e-mail, adresa studioului, etc.);

Pentru a nu plictisi potenialii vizitatori, pe pagina principal a site-ului (index-ul)


vom introduce prima categorie de informaii, care vor oferi o prezentare general
a activitii clientului. De asemenea, accesul la celelalte pagini trebuie s fie facil,
de unde rezult necesitatea unui meniu format din hiperlegturi ctre acestea.

Site-ul web trebuie s urmreasc un anumit tipar, pentru a oferi unitate i


continuitate interfeei. Rezult c toate paginile trebuie s aib pri comune, cum
ar fi un antet, aceeai culoare de fond, acelai font, etc., iar meniul menionat
anterior trebuie s fie prezent pe fiecare pagin. Multe ar putea fi spuse aici de
exemplu, avei grij s:

evitai culorile stridente sau nepotrivite, animaiile n exces i mesajele


prin care i se explic vizitatorului c, apelnd la serviciile oferite, a dat
norocul peste el;
162 Manual de Informatic pentru clasa a XII-a

verificai din cnd n cnd dac link-urile externe (care sunt binevenite)
spre paginile web indicate de acestea mai exist sau nu;
nu utilizai diverse efecte vizuale sau sonore, doar pentru a arta
vizitatorlui ce grozav este echipa care a creat site-ul important este ca
ele s aib sens n contextul paginii.
Ar fi dificil de prezentat modul de implementare complet al unui site web
pentru c necesit o multitudine de linii de cod i ferestre. Pur didactic, prezentm
o variant mult simplificat a site-ului (pagina de contact), n figura de mai jos:

Figura 4.89. Exemplu simplu de site web

Titlul Daniel Andone fotograf profesionist (element H2), poza din colul din
dreapta-sus, meniul (tabel cu cinci coloane), culoarea de fond i zona de text (n
figur, un tabel cu patru linii) se repet pe fiecare pagin a site-ului, pentru a oferi
continuitate navigrii. Practic, putem avea patru pagini aproape identice, singura
diferen fiind textul din zona de culoare alb.
Observaie ! Tabelul care conine informaiile poate fi nlocuit cu un cadru de tip
IFRAME sau, de ce nu, toat pagina poate fi structurat cu ajutorul frame-urilor.

Binenteles, acest exemplu este rudimentar i trebuie luat ca atare. Dvs.


putei realiza pagini mult mai complexe, utiliznd noiunile prezentate n cadrul
acestui capitol.
Capitolul 4. HTML, CSS primele noiuni 163

Un ultim pas, foarte important, pe care-l avei de fcut este testarea cu


atenie a documentului realizat. Nimic nu este mai deranjant dect o pagin care
nu poate fi deschis sau o imagine care nu poate fi afiat denot lips de
profesionalism din partea realizatorului. Bineneles, nimeni nu este prefect!

Codul surs pe care l-ai implementat trebuie s fie bogat n comentarii ct


mai sugestive, pentru c, de cele mai multe ori, persoana care realizeaz site-ul
web nu este i cel care-l ntreine n mod curent. V dai seama ct de dificil ar fi
s caute prin sute de linii de cod sau s incerce s neleag mecanismul dezvoltat
de dvs.

Se pot realiza minuni prin utilizarea programelor profesioniste de prelucrare


a imaginilor, cum ar fi Adobe Photoshop sau Corel. De asemenea, o animaie
haioas dezvoltat cu programul Adobe (Macromedia) Flash poate s capteze
atenia vizitatorilor n mod favorabil. Merit mcar o ncercare

Poi fi un excelent programator web, dar dac nu ai o anumit nclinaie


artistic, nu vor iei din minile tale pagini frumoase. Apeleaz, dac este cazul,
la persoane care au aceast nclinaie artistic.

Pentru a crea o pagin web, avem nevoie de limbajul HTML care ne permite
introducerea elementelor de baz, iar cu ajutorul CSS-ului, acestea pot fi persona-
lizate din punct de vedere al aspectului sau a poziiei n cadrul documentului.

Mai jos, sunt prezentate principalele elemente HTML:

Nume element(e) Descriere

<HTML> i </HTML> indic nceputul i sfritul documentului web

<HEAD> i </HEAD> indic nceputul i sfritul antetului

<BODY> i </BODY> indic nceputul i sfritul corpului paginii

<STYLE> i </STYLE> n interiorul lor, se descriu stilurile pentru elemente

<TITLE> i </TITLE> n interiorul lor, se introduce titlul paginii web

<P> i </P> indic nceputul i sfritul unui paragraf


<BR> foreaz trecerea pe linia urmtoare
164 Manual de Informatic pentru clasa a XII-a

&nbsp evit trecerea unui cuvnt pe linia urmtoare

<B> i </B> textul din interiorul lor este scris ngroat

<I> i </I> textul din interiorul lor este scris nclinat

<U> i </U> textul din interiorul lor este scris subliniat

<S> i </S> textul din interiorul lor este scris tiat

<TT> i </TT> textul din interiorul lor este scris monospaiat

<SUP> i </SUP> textul din interiorul lor este scris ca exponent

<SUB> i </SUB> textul din interiorul lor este scris ca indice


<H1> i <H/1>, ,
definesc titluri de diferite dimensiuni
<H6> i </H6>
<OL> i </OL> descriu o list ordonat

<UL> i </UL> descriu o list neordonat

<LI> i </LI> descriu un element al listei

<DL>, <DT> i <DD> introduc o list de definiii

<IMG src=""> introduce imaginea indicat prin parametrul src

<TABLE> i </TABLE> indic nceputul i sfritul unui tabel

<TR> i </TR> indic nceputul i sfritul unei linii din tabel

<TD> i </TD> indic nceputul i sfritul unei coloane din tabel

<A href=""> i </A> hiperlegtur spre resursa indicat de atributul href

<MAP> i <AREA> descriu o hart imagine i o zon din ea


<BASE href=""> definete adresa de baz pentru resurse
<META> furnizeaz diverse informaii motoarelor de cutare

<FRAMESET> i </F> mparte pagina n mai multe cadre

<FRAME> i </FRAME> precizeaz coninutul unui cadru


<IFRAME> i </IFRAME> creeaz un cadru n corpul documentului
<NOFRAME> i </N> coninut alternativ al unui cadru
<MARQUEE> i </M> definete un bloc care defileaz coninutul su

Tabelul 4.1. Principalele elemente HTML


Capitolul 4. HTML, CSS primele noiuni 165

Fiecare element poate fi personalizat prin intermediul limbajului CSS,


definind stilul corespunztor ntre tag-urile <STYLE> i </STYLE>. Putem defini o
clas de stiluri (atributul class) sau un stil individual (atributul id).

Pentru un element, putem defini poziia sa n cadrul paginii web:


- aezare implicit: la nivel de bloc (block) sau la nivel de text (inline);

- prin CSS, cu ajutorul atributului position, care poate lua valorile:


static implicit aezarea se face n flux normal;
absolute aezare n poziii absolute;
relative n raport cu elementul printe;

- definirea ordinii de afiare prin intermediul atributului z-index.

Modul implicit de afiare (block sau inline) se poate modifica prin


utilizarea atributului display, pus la dispoziie de limbajul CSS.

La proiectarea unei interfee web, inei minte c o structur bine definit,


bazat pe simplitate i care s ofere accesul rapid la informaie poate fi cheia
succesului. De asemenea, ncercai s-i dai o form ct mai elegant i cu
bun gust!

1. Cum se scrie pagina


din figura alturat?

Figura 4.90.
Pagina propus
166 Manual de Informatic pentru clasa a XII-a

2. Cum trebuie procedat pentru ca


o pagin s arate ca alturat?

Figura 4.91. Pagina


propus ca exerciiu

3. Cum realizm tabelul


alturat?

Figura 4.92. Pagina


propus

4. Presupunem c dorii s prezentai un calculator.


Pagina va cuprinde att fotografia calculatorului ct i un
nume pentru el (vezi Fig. 4.93). Atunci cnd vizitatorul
execut clic, fie pe imagine, fie pe text, trebuie ca
browser-ul s afieze o alt pagin cu detalii tehnice i
explicaii suplimentare. Testul l vei face pe calculatorul
dvs. (dar nimeni nu v oprete s-l punei i pe site).

Figura 4.93. Exemplu


de pagin

5. Punei pe pagin o astfel de imagine (din Yahoo) i un


mesaj. Dac vizitatorul paginii execut clic, fie pe mesaj, fie pe
imagine, va fi apelat programul de e-mail i va putea s v
scrie, fr s mai completeze adresa!

Figura 4.94. Exemplu


pentru exerciiul 5

6. Dorii ca vizitatorii site-ului dvs. s poat download-a o documentaie pe care o


avei acolo sub forma unui fiier word (extensia .doc). Cum trebuie s procedai?

7. Presupunem c trebuie s realizai o prezentare a animalelor domestice. Pagina


principal va arta ca n Fig. 4.95:
Capitolul 4. HTML, CSS primele noiuni 167

Figura 4.95. Pagina principal a prezentrii

Un alt fiier HTML (s-l numim lung.html) va reine, unul dup altul,
textele despre fiecare animal n parte. Se cere ca, atunci cnd vizitatorul execut
clic pe Continuare, pentru un anumit animal, s apar direct textul cores-
punztor n fereastra care afieaz textele. Mai jos, putei observa ce se afieaz
atunci cnd acesta execut clic pe Continuare la descrierea cinelui:

Figura 4.96. Descrierea cinelui din pagina lung.html

8. Cum trebuie procedat ca o ancor s arate ca mai jos (culoarea este roie)?

Figura 4.97.
Ancora propus

9. Dorii s creai un site cu mai multe imagini grupate pe teme (flori, case, etc).
Pentru aceasta, pagina principal va conine dou cadre, aa cum se vede n
Fig. 4.98. n primul dintre ele, avei ancore ctre documentele HTML care conin
imaginile dintr-o anumit categorie. n al doilea cadru, vei afia fiierul dorit de
utilizator. Imaginile trebuie s fie aliniate n partea de jos.

Figura 4.98. Site-ul propus pentru problema 9


168 Manual de Informatic pentru clasa a XII-a

10. La fel ca la problema anterioar, numai c imaginile trebuie s arate ca n


figura de mai jos:

Figura 4.99. Exemple de imagini pentru problema 10

11. Lucru n echip. Prin utilizarea cunotinelor dobndite pn n acest moment,


realizai un site pe o tem la alegere. Formai grupe de 2-4 elevi care s-i mpart
atribuiile: un elev s se ocupe cu design-ul site-ului i unul, doi sau trei elevi s
caute documentaie despre tema propus (text, imagini sugestive, etc.). Unul dintre
elevi, pe lng atribuiile sale, va avea rolul de coordonator al proiectului, iar un
altul, se va ocupa la final de testarea site-ului realizat.

Posibile teme:

Sistemul nostru solar: descrierea fiecrei planete, elemente de teorie


din astronomie, etc.
Echipa de fotbal favorit: informaii despre fiecare juctor, o list cu
titlurile ctigate, meciuri importante, etc.
Clasa noastr. Adunai cteva informaii despre fiecare elev i realizai
un site despre clasa voastr. Fii inventivi! Se pot realiza clasamente dup
o mulime de criterii sau putei descrie anumite evenimente amuzante care
s-au petrecut n trecutul vostru.
tiina nainte de toate!. Prezentai un om de tiin important: biografia
sa, poze, lucrri importante i citate (de exemplu, putei alege dintre:
Albert Einstein, Sir Isaac Newton, Gregor Mendel, Marie Curie, etc.).
Istorie. Realizai o pagin web despre ziua n care Romnia a devenit un
stat independent, n urma btliei de la Plevna.
Geografie. Prezentai n detaliu, sub forma unui site web, gruprile
muntoase din ara noastr, specificnd informaii semnificative despre
fiecare n parte.
Biologie. Creai un site care s prezinte ntr-o form amuzant evoluia
omului pe Pmnt!
CAPITOLUL
Limbajul PHP

n acest capitol studiem limbajul PHP. Dup ce-l vom parcurge, vom ti s
trimitem date de pe calculatorul client ctre server i vom ti s le prelucrm
pe server. Vom cunoate cum s personalizm paginile web, n funcie de
persoana care le acceseaz, dar adevrata for a limbajului se va
vedea atunci cnd l vom folosi la un loc cu limbajul MySQL.

Introducere
Cum realizm un formular ?
Constante, variabile, operatori
Care sunt instruciunile limbajului PHP ?
Funcii PHP
Funcii matematice
Cum afim datele ?
Funcii pentru prelucrarea irurilor de caractere
Masive n PHP
Ce sunt variabilele cookie ? Cum le folosim ?
Utilizarea n comun a limbajelor PHP i MySQL
Aplicaii

Cuvinte cheie: formulare, input, submit, radio, checkbox,


password, textarea, select, constante, variabile, operatori,
echo, print, instruciuni, funcii, masive, cookie, securitate
170 Manual de Informatic pentru clasa a XII-a

5.1. Introducere

Numele limbajului era iniial un acronim pentru Personal Home Page i a fost
inventat n 1994 de Rasmus Lerdof, care dorea s-i contorizeze vizitatorii paginii
sale de Internet. Astzi, se cosider c PHP este un limbaj de scriptare nglobat n
HTML. Documentaia oficial a limbajului se gsete pe site-ul www.php.net.

Script-urile scrise n acest limbaj se utilizeaz pe partea de server.

Limbajul PHP este asemntor limbajului C.


Script-urile scrise n acest limbaj ruleaz i trebuie s se gseasc pe
server. n linii mari, ele au rolul de a prelucra datele pe care le trimite
utilizatorul de pe propriul calculator i de a transmite ctre browser
rezultatele prelucrrilor.
Nu toate site-urile permit utilizarea limbajului PHP. Din acest motiv,
dac v intereseaz s-l utilizai, trebuie s studiai cu atenie oferta de
site-uri a firmei la care apelai (provider-ul).
n ceea ce ne privete, pentru a nva limbajul PHP vom utiliza pachetul EasyPHP
(vezi Anexa 1) care ne permite s rulm PHP pe propriul calculator. Nu uitai,
nainte de orice, lansai n executare programul EasyPHP din meniul Start/Programs!

Practic, orice script PHP va fi memorat n subfolder-ul www al folder-ului


EasyPHP1-8 din Program Files i va fi apelat din browser prin
http://localhost.numescript.
Orice script PHP va avea extensia php.

n situaia n care rulai pe un site real, dup ce creai i testai script-urile pe


propriul calculator, cu EasyPHP, le putei transfera pe server cu ajutorul unui
program FTP.

Orice script PHP este cuprins ntre:

<?php
...
?>

Exemplul 5.1. Script-ul de mai jos


afieaz un mesaj. l vom memora n www
sub numele de "primul.php". Apelul i
rezultatul se pot observa alturat.
<?php
echo "eu sunt primul script php";
?> Figura 5.1. Rezultatul
Capitolul 5. Limbajul PHP 171

Observaie foarte important! Atunci cnd se apeleaz un script, el este rulat pe


server. Acesta va efectua operaiile pe care le are programate i eventual, va scrie
ceva (de exemplu, ca n exemplul urmtor, cu "echo"). Rezultatul (adic ce este
scris) este returnat ctre browser, iar acesta l va trata ca pe un fiier html.

Exemplul 5.2. Rulm script-ul de mai jos


care conine cteva elemente de
formatare. Rezultatul l vedem n figura
alturat:

<?php
echo "eu sunt <B>primul</B><BR>
script<B>php</B>";
?>
Figura 5.2. Rezultatul rulrii

Exemplul 5.3. Acelai script poate fi apelat i ca un link, aa cum observai mai jos
(fiierul html putnd fi plasat oriunde):
<HTML>
<HEAD></HEAD>
<BODY>
<P> Un text oarecare!
<A href="http://localhost/primul.php">Apeleaza</A>
</BODY>
</HTML>

Exemplul 5.4. Script-urile PHP pot conine direct elemente de HTML, pe lng
secvena propriu-zis, PHP. Scriei script-ul urmtor n www i apelai-l. Vei vedea
c se afieaz coninutul unei variabile PHP (variabilele PHP vor fi tratate separat).
La apel se afieaz "Bine ati venit domnule Ion Popescu!".

<HTML>
<HEAD>
</HEAD>
<BODY>
<P> Bine ati venit domnule
<?php
$nume=" Ion Popescu!";
echo ($nume);
?>
</BODY>
</HTML>
172 Manual de Informatic pentru clasa a XII-a

5.2. Formulare

De la nceput trebuie spus c formularele sunt elemente ale limbajului HTML.


Un formular este o grupare de componente HTML care permit trimiterea datelor i a
comenzilor ctre server. Pe server, comenzile sau datele sunt recepionate de un
script PHP care rspunde comenzilor i prelucreaz datele.

Un formular se descrie ntre tag-urile <FORM action script> i </FORM>.


Prin script nelegem numele script-ului care se ruleaz atunci cnd datele,
comenzile sosesc pe server. ntre cele dou tag-uri se insereaz diferite
componente care permit introducerea datelor sau trimiterea comenzilor.

Elementul INPUT este un element HTML de o mare complexitate. Poate fi de


diverse tipuri (type): de la un buton de validare, la unul radio, un edit, etc. Dup
cum sugereaz i numele, rolul elementului INPUT este de a permite utilizatorului
s introduc date sau comenzi n pagina vizualizat de browser. Un element
INPUT se descrie cu tag-ul urmtor (form simplificat):

<INPUT name="nume" type="tip"


value="valoare"
align="tip_aliniere">
unde valoare exprim valoarea afiat de element.

5.2.1. Tipul submit

Are aspectul unui buton. La apsarea lui, datele sunt transmise ctre server,
de unde, evident, rspunde un script care are rolul de a le prelucra.
Exemplu 5.5. Nu se transmit date, dar la apsarea butonului de tip submit se
lanseaz un script care afieaz un mesaj:
<HTML>
<HEAD>
</HEAD>
<BODY>
<FORM action="http://localhost/exemplu.php">
<INPUT type="submit" value="Primul exemplu de apel PHP">
</FORM>
</BODY>
</HTML>

Alturat, observai cum este afiat sursa


HTML de ctre browser:

Figura 5.3. Fiierul HTML


Capitolul 5. Limbajul PHP 173

Iat i script-ul PHP:


<?php
echo ("Ai apasat, am raspuns"); Figura 5.4. Mesajul afiat
?>

n urma rulrii, browser-ul afieaz mesajul (vezi Fig. 5.4).

5.2.2. Tipul text

Este sub forma unui edit i permite utilizatorului s introduc date. Acestea
se trimit ctre browser la apsarea unui buton de tip submit. Pentru ca datele s
fie recuperate de ctre script-ul de pe server, trebuie ca tag-ul <form> s conin
parametrul method ="post".

Atunci cnd browser-ul execut o cerere ctre server, trimite i valorile


reinute de cele dou input-uri de tip text. Variabila $_POST este un vector
1
asociativ care reine toate valorile astfel transmise. Valoarea transmis de input-ul
de tip text numit a se recupereaz prin $_POST[a], cea transmis de input-ul
de tip text b se recupereaz prin $_POST[b]. Aceast modalitate de
transmitere i recepionare a parametrilor este general i trebuie reinut.
Exemplul 5.6. Vizitatorul trimite dou valori numerice
a i b. Script-ul PHP returneaz suma lor:
<HTML>
<HEAD> Figura 5.5. Exemplu
</HEAD> de formular
<BODY>
<FORM action="http://localhost/exemplu.php" method ="post">
<INPUT type="text" name="a"><BR>
<INPUT type="text" name="b"><BR>
<INPUT type="submit" value="Suma?">
</FORM>
</BODY>
</HTML>

Sursa este vizualizat de ctre browser, aa


cum putei observa n Fig. 5.5. Script-ul PHP
care afieaz suma celor dou numere este:
<?php
// recuperarea datelor
$a=$_POST['a'];
$b=$_POST['b'];
echo $a+$b; Figura 5.6. Rezultatul retransmis spre browser
?>
n PHP, variabilele ncep cu caracterul $.

Vectorii asociativi sunt tratai n cadrul acestui capitol.


1
174 Manual de Informatic pentru clasa a XII-a

5.2.3. Tipul radio

Tipul radio (butoane radio) se utilizeaz n cazul n care utilizatorul trebuie s


aleag o singur opiune dintre mai multe posibile. Pentru fiecare buton radio se
ataeaz cte un element input de tip radio. Pentru a avea un comportament de
grup, n sensul c se poate bifa un singur buton, toate butoanele trebuie s aib un
singur nume, n exemplul de mai jos, Buton. Opional, pentru un buton se poate
folosi opiunea checked i efectul este acela c de la nceput butonul este bifat.
La apsarea butonului submit, butonul bifat va trimite valoarea ataat lui.

Exemplul 5.7. Utilizatorul trebuie s bifeze un singur buton


radio, iar pe server se va ti, n funcie de valoarea primit,
care buton a fost apsat:
<HTML> Figura 5.7. Formular
<HEAD> cu butoane radio
</HEAD>
<BODY>
<FORM action="http://localhost/exemplu.php"
method ="post">
<P> Cumpar ziarul ...
<BR><BR>
<INPUT name="Buton" TYPE="radio" value=1 checked> zilnic <BR>
<INPUT name="Buton" TYPE="radio" value=2> saptamanal <BR>
<INPUT name="Buton" TYPE="radio" value=3> lunar<BR><BR>
<INPUT type="submit" value="Trimite">
</FORM>
</BODY>
</HTML>

Script-ul PHP i rezultatul afiat:


<?php
$b=$_POST['Buton']; Figura 5.8. Afiarea
echo $b; rezultatului
?>

5.2.4. Tipul checkbox

Acest tip se utilizeaz pentru ca n fereastra browser-ului s fie afiate


butoane de marcare. Aceste butoane sunt utilizate pentru a permite utilizatorului s
marcheze una, niciuna sau mai multe opiuni. De reinut: n acest caz, se transmit
ctre server doar valorile butoanelor marcate.

Exemplul 5.8. n continuare, observai modul n care facem ca browser-ul s


afieze butoanele de marcare i script-ul PHP care depisteaz butoanele marcate:
Capitolul 5. Limbajul PHP 175

<FORM
action="http://localhost/exemplu.php"
method="post">
<P> Urmaresc postul tv </P>
<INPUT NAME="buton1" TYPE="checkbox"
value=1 checked> Realitatea <BR>
<INPUT NAME="buton2" TYPE="checkbox"
value=2> Antena 3 <BR>
<INPUT NAME="buton3" TYPE="checkbox"
value=3> Protv <BR><BR>
<INPUT type="submit" value="GO">
</FORM>

Figura 5.9. Formularul


<?php
foreach ($_POST AS $i=>$nume)
if ($i=="buton1") echo "Realitatea"."<BR>";
else
if ($i=="buton2") echo "Antena 3" ."<BR>";
else
if ($i=="buton3") echo "Protv";

Figura 5.10. Rezultatul

5.2.5. Tipul password

Componentele vizuale de acest tip se utilizeaz pentru introducerea


parolelor, att de necesare, de exemplu, pentru a avea acces la un site. Sunt
asemntoare cu cele de tip text, numai c, pentru fiecare caracter al parolei se
afieaz cte un *. Desigur, ctre server, datele sunt transmise corect.

Exemplul 5.9. Se introduce o parol, iar script-ul


care o primete o afieaz:

<FORM
action="http://localhost/exemplu.php"
method="post">
<P> Introduceti parola </P> Figura 5.11. Formularul
<INPUT NAME="parola" TYPE="password" <BR>
<INPUT type="submit" value="GO">
</FORM>

<?php
echo $_POST['parola'];
?>
Figura 5.12. Rezultatul
176 Manual de Informatic pentru clasa a XII-a

5.3. Elementul TEXTAREA


Elementul TEXTAREA se utilizeaz pentru a introduce un text mai lung. El
poate fi folosit n interiorul unui formular i, la apsarea butonului submit,
coninutul su este transmis ctre server. De remarcat este c pentru un element
TEXTAREA se pot preciza numrul de linii (rows) i de coloane (cols) pe care
acesta s le afieze.
Exemplul 5.10.
<FORM action="http://localhost/exemplu.php" method="post">
<P>Adaugati comentariul dv.!</P>
<TEXTAREA name="textul" rows="10"
cols="20></TEXTAREA><BR><BR>
<INPUT type="submit" value="Scrie">
</FORM>
Iat i script-ul PHP care afieaz irul trimis:
<?php
echo $_POST['textul'];
?>

Figura 5.13. Rezultatul Figura 5.14. Formularul

5.4. Elementul SELECT


Elementul SELECT se utilizeaz pentru ca browser-ul s
afieze o list. Fiecare opiune din list este marcata de un
element OPTION. Dac este introdus ntr-un formular, ctre
server se va transmite opiunea selectat.
Figura 5.15.

Exemplul 5.11. Mai jos este prezentat formularul care afieaz lista din figura de
mai sus i script-ul PHP care afieaz opinea selectat din formular:
<FORM action="http://localhost/testare.php" method="post">
<SELECT name="lista">
<OPTION value="optiunea 1"> Optiunea 1 </OPTION>
<OPTION value="optiunea 2"> Optiunea 2 </OPTION>
Capitolul 5. Limbajul PHP 177

<OPTION value="optiunea 3"> Optiunea 3 </OPTION>


</SELECT><BR>
<INPUT type="submit" value="GO">
</FORM>
Scriptul PHP este:
<?php
$v=$_POST["lista"];
echo $v;
?>

5.5. Constante. Variabile. Operatori

5.5.1. Constante

n PHP se pot defini constante cu ajutorul funciei define. Forma general


a acesteia este:
define("nume_constanta", valoare).
Exemplul 5.12. n script-ul urmtor se definete constanta e i se probeaz dac
este recunoscut. La apel, se afieaz 5.42:
<?php
define( "e", 2.71);
echo (e+e);
?>

5.5.2. Variabile

n PHP numele unei variabile ncepe cu $. n continuare, trebuie s fie o liter


sau o liniu de subliniere. n rest, putei folosi i cifre.
Nu este necesar ca variabilele s fie declarate de la nceput. Ele se definesc
atunci cnd sunt folosite. Mai mult, i schimb tipul n funcie de valoarea
reinut.
Exemplul 5.13. Analizai script-ul urmtor: iniial, variabila $x reine 1. Apoi, i se
atribuie un ir de caractere. Operaia este posibil i n urma ei se reine irul, aa
cum rezult din valoarea afiat:
<?php
$x=1;
$y="Un sir";
$x=$y;
echo ($x);
?>
178 Manual de Informatic pentru clasa a XII-a

n PHP este posibil i adresarea indirect, aa cum rezult din exemplele


urmtoare.

Exemplul 5.14. Se afieaz 3. Didactic, putem stabili ceea ce se afieaz, astfel:


$$x = $($x) = $y = 3.
<?php
$x="y";
$y=3;
echo ($$x);
?>

Exemplul 5.15. Se afieaz "Un sir". Astfel, avem:


$$$z = $$($z) = $$y= $($y) = $x = "Un sir".
<?php
$x="Un sir";
$y="x";
$z="y";
echo ($$$z);
?>

5.5.3. Operatori

Muli dintre operatorii limbajului PHP sunt cunoscui din C++. Acesta este
motivul pentru care vom prezenta doar anumite particulariti specifice limbajului.
Pentru nceput, prezentm, n ordine descresctoare, prioritatea operatorilor:

1. !, ++, --, (int), (double), (string);


2. *, %, /;
3. <. <=, >, >=;
4. ==, !=, ===, !=== ;
5. &;
6. ^;
7 &&;
8. ?:;
9. =, +=, -=, /=. *=, %=, &=, |=, ^=;
10. And;
11. Xor;
12. Or;
13 ,.
Capitolul 5. Limbajul PHP 179

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.

Exemplul 5.16. Conversia unui numr real ctre un ntreg are ca efect eliminarea
zecimalelor. Script-ul urmtor afieaz valoarea 7:
<?php
$x=1;
$y=7.5;
$x=(int)$y;
echo ($x);
?>

Exemplul 5.17. Conversia unui ir ctre un ntreg reuete chiar dac irul conine
i caractere nenumerice! Caracterele numerice trebuie s ocupe primele poziii! n
exemplul urmtor, n urma conversiei, x va reine 2 i y va reine 3. Se afieaz
suma, adic 5.
<?php
$x=" 2 siruri";
$y="3siruri";
$x=(int)$x;
$y=(int)$y;
echo ($x+$y);
?>

Observaie ! Uneori, conversiile se realizeaz implicit (fr utilizarea operatorului


de conversie explicit).

Exemplul 5.18. Script-ul urmtor afieaz -1.76:


<?php
$x="-2.76"; // sir
echo (1+$x);
?>
Exemplul 5.19. Se afieaz -1:
<?php
$x="-2.76"; // sir
$y="1.76";
echo ($x+$y);
?>
Exemplul 5.20. Se afieaz ... tot 1:
<?php
$x="-2.76 tren";
$y="1.76masina";
echo ($x+$y);
?>
180 Manual de Informatic pentru clasa a XII-a

Dup efectuarea unei operaii cu un operator din grupele 3 sau 4, se obine


o valoare logic: true (1) sau false (0).

Operatorul === se refer la egalitate ca valoare i ca tip, spre deosebire de


== care se refer la egalitate doar ca valoare. Exemplele urmtoare v vor
convinge.

Exemplul 5.21. Script-ul urmtor afieaz egali ca valoare:


<?php
$x="3";
$y=3;
if ($x===$y) echo(" egali ca valoare si tip");
else
if ($x==$y) echo ("egali ca valoare");
else echo "inegali ca valoare";
?>

nlocuii n script-ul anterior primele dou atribuiri cu atribuirile de mai jos. Vei
observa c se afieaz numai egali ca valoare. Aceasta demonstreaz c,
dei valorile logice au rein 1 sau 0, ele rmn, de fapt, valori logice!
$x=2>1;
$y=1;

Observaie ! Se poate deduce cu uurin rolul operatorului !==. Operaia pe care


o efectueaz returneaz true, dac este diferen ntre tip sau valoare i false,
n caz contrar.

Este permis atribuirea multipl.

Exemplul 5.22. Script-ul urmtor afieaz un sir:

<?php
$x=1;
$y=-2;
$z="un sir";
$x=$y=$z;
echo ($x);
?>

Diferena dintre || i Or, && i And, ^ i Xor este doar de prioritate!


Capitolul 5. Limbajul PHP 181

5.6. Instruciunile limbajului PHP

Instruciunile PHP sunt asemntoare celor din C/C++. Din acest motiv, ne
vom limita la o scurt prezentare a lor i la cteva exemple de utilizare. Pentru
exemplificare, vom folosi urmtorul document HTML care trimite o valoare x ctre
server. Pe server se va gsi un script, numit index.php, care rspunde
trimind o valoare ctre browser.

<HTML>
<HEAD>
</HEAD>
<BODY>
<FORM action="http://localhost" method="post">
<INPUT type="text" name="x"> <BR><BR>
<INPUT type="submit" value="GO">
</FORM>
</BODY>
</HTML>

5.6.1. Instruciunea expresie

Se folosete pentru diverse calcule sau atribuiri.


Exemplul 5.23. Analizai instruciunea: $x=$y*$y+1;.

5.6.2. Instruciunea IF

Aceast instruciune are forma general:

if (expresie) instructiune1
else instructiune2

Dac expresie produce la evaluare o valoare diferit de 0 (true), se execut


instructiune1, altfel se execut instructiune2.

Exemplul 5.24. Dac valoarea este n intervalul [1,2], se transmite ctre browser
valoarea (x+1)/2, altfel se transmite valoarea (x-1)/2:

<?php
if ($x>=1 && $x<=2) $v=($x+1)/2;
else $v=($x-1)/2;
echo ($v);
?>
182 Manual de Informatic pentru clasa a XII-a

5.6.3. Instruciunea compus

Atunci cnd dorim ca mai multe instruciuni s fie interpretate ca una singur,
instruciunile se trec ntre "{" i "}". Instruciunea switch are forma general:
switch (expresie)
{
case exp1: secventa instructiuni1; break;
case exp2: secventa instructiuni2; break;
...
case expn: secventa instructiunin; break;
[default: secventa instructiunin+1];
}
unde expresie are semnificaia: expresie de tip ntreg, expi sunt expresii
constante de tip ntreg, iar instruciunii, o secven oarecare de instruciuni.

Principiul de executare este:


se evalueaz expresia;
dac aceasta produce o valoare egal cu cea produs de expi, se
execut, n ordine, instruciunii i se trece la instruciunea
urmtoare, altfel se execut numai secvena instruciunin+1.

Observaie ! Alternativa default este facultativ. n absen, n cazul n care nu


exist coinciden de valori, se trece la instruciunea urmtoare.
Exemplul 5.25. Dac valoarea transmis pentru x este 1, 2, 3, 4, atunci valoarea
respectiv este retransmis ctre utilizator alfabetic, altfel, se va transmite un mesaj
oarecare.
<?php
switch ($x)
{
case (1): echo(unu); break;
case (2): echo(doi); break;
case (3): echo(trei); break;
case (4): echo(patru); break;
default : echo (Nu este 1, 2, 3 sau 4);
}
?>

5.6.4. Instruciunea FOR

Instruciunea for are forma general:


for(expresieiniializare;expresietest;expresieincrementare) instruciune
Capitolul 5. Limbajul PHP 183

Dup cum se vede, ntre paranteze se gsesc 3 expresii:


Expresieinitializare se folosete, de regul, pentru iniializarea variabilei de
ciclare.
Expresietest se folosete pentru a testa dac se execut instruciunea
subordonat - dac expresia produce la evaluare o valoare diferit de 0
(true), instruciunea subordonat for se execut.
Expresieincrementare se folosete pentru incrementarea variabilei de
ciclare.
Principiul de executare este:

P1. Se evalueaz expresieiniializare.


P2. Se evalueaz expresiatest. n cazul n care aceasta produce o valoare
diferit de 0, se execut instruciunea subordonat for; apoi se trece la P3,
altfel se trece la instruciunea urmtoare (se termin executarea instruciunii for).
P3. Se evalueaz expresia de incrementare i se revine la P2.
Exemplul 5.26. Se calculeaz suma ptratelor primelor x numere naturale (x este
numr natural):
<?php
$s=0;
for ($i=1;$i<=$x;$i++) $s+=$i*$i;
echo($s);
?>

5.6.5. Instruciunea WHILE

Instruciunea while are forma general:


while (expresie) instructiune
Principiul de executare este urmtorul:

P1. Se evalueaz expresia;


P2. Dac valoarea produs de aceasta este diferit de 0, se execut instruciu-
nea subordonat, apoi se revine la P1, altfel se trece la instruciunea urmtoare.
Exemplul 5.27. Se calculeaz suma de la exemplul anterior:
<?
$s=0; $i=1;
while ($i<=$x)
{ $s+=$i*$i;
$i++;
}
echo($s);
?>

Observaie ! Script-ul ofer i un exemplu de instruciune compus.


184 Manual de Informatic pentru clasa a XII-a

5.6.6. Instruciunea DO WHILE

Forma general a acestei instruciuni este urmtoarea:


do
instructiune
while(expresie);

Principiul de executare este urmtorul:


P1. Se execut instruciunea subordonat;
P2. Se evalueaz expresia. n cazul n care valoarea produs la evaluare este
0 (false), executarea instruciunii do se termin, altfel se trece la P1.

Exemplul 5.28. Se calculeaz suma ptratelor primelor x numere naturale (x este


natural):
<?php
$s=0; $i=1;
do
{
$s+=$i*$i;
$i++;
} while ($i<=$x);
echo($s);
?>

5.7. Funcii n PHP


n PHP se pot crea funcii fr prea mari diferene fa de ce tim din C/C++.

Exemplul 5.29. Mai jos este prezentat un script care utilizeaz o funcie pentru a
calcula aria unui triunghi, pe care apoi o afieaz:
<?php
function aria_t($b, $h)
{ return $b*$h/2; }

$x=3;
$y=8;
echo(aria_t($x,$y));
?>

Pentru a ntoarce rezultate se utilizeaz, aa cum suntem deja obinuii,


return. Forma general este: return expresie.

Transmiterea parametrilor se face prin valoare i prin referin.


Capitolul 5. Limbajul PHP 185

A) Dac un parametru este transmis prin valoare, atunci valoarea sa rmne


neschimbat dup executarea funciei. Prin valoare se pot transmite att valori, ct
i coninutul unor variabile.
Exemplul 5.30. Script-ul urmtor afieaz 5, chiar dac n funcie s-a ncercat
modificarea valorii transmise:
<?php
function f($x)
{ $x++; }
$x=5;
f($x);
echo($x);
?>
Exemplul 5.31. Script-ul urmtor exemplific faptul c o funcie poate fi apelat
att printr-o valoare care este coninutul unei variabile, ct i printr-o valoare
oarecare. Se afieaz 3 i 7, deci 37.
<?php
function f($x)
{ echo($x); }
$x=3;
echo(f($x));
echo (f(7));
?>

B) Dac un parametru este transmis prin referin atunci, n corpul funciei, se


poate modifica valoarea sa. Evident, un parametru transmis prin valoare trebuie s
fie o variabil. Pentru a transmite un parametru prin referin, el trebuie precedat
de caracterul &.
Exemplul 5.32. n script-ul urmtor, se modific valoarea parametrului transmis
prin referin. Se va afia 6, nu 5, ct era valoarea iniial a variabilei $x:
<?php
function f(&$x)
{ $x++; }
$x=5;
f($x);
echo($x);
?>

O variabil se numete global dac a fost definit n afara oricrei funcii.


Implicit, ea nu poate fi adresat din corpul unei funcii. Totui, exist o
posibilitate de a face acest lucru: atam cuvntul global naintea acestei
variabile!
Exemplul 5.33. Funcia din script-ul urmtor returneaz 3. Aceasta arat c a fost
recunoscut variabila global $x. n absena cuvntului global, aceast valoare
nu ar fi putut fi returnat:
186 Manual de Informatic pentru clasa a XII-a

<?php
function f()
{ global $x;
return $x;
}
$x=3;
echo(f());
?>

Variabilele locale sunt variabile create n corpul unei funcii sau cele create
prin transmiterea parametrilor formali (din antetul funciilor). Ele nu sunt
recunoscute n afara funciilor. Nimic nou...

n PHP, funciile pot fi i recursive.

Exemplul 5.34. Script-ul de mai jos calculeaz n! prin utilizarea unei funcii
recursive:
<?php
function fact($n)
{ if ($n==0) return 1;
else return $n*fact($n-1);
}
echo(fact(4));
?>
Desigur, atunci cnd scriem un script mai complicat, cu multe funcii, este necesar
s dispunem de un mecanism prin care s putem include funcii pe care le-am
scris mai demult, sau pe care le-am primit de undeva...

Includerea unor funcii, dar nu numai, se realizeaz prin funcia


require("nume_fisier").
Funciile trebuie s se gseasc pe site, ntr-un fiier text. Observai faptul
c textul funciei (funciilor inserate) trebuie s fie ncadrat ntre <? i ?>.
Exemplul 5.35. Funcia afis() se gsete n fiierul functia.ex, aflat pe site.
Script-ul care o utilizeaz conine require():
<?php
function afis()
{ echo("Eu sunt functia inserata"); }
?>
<?
require("functia.ex");
afis();
?>

Pe lng faptul c putem s scriem diverse funcii, limbajul PHP este


nzestrat cu numeroase alte funcii. Cele mai importante vor fi tratate pe parcurs.
Capitolul 5. Limbajul PHP 187

5.8. Funcii matematice

Multe dintre funciile prezentate le-ai ntlnit dac ai studiat limbajul C/C++.
Tabelul urmtor le prezint succint:

Funcia Ce realizeaz Exemple


abs(-7)=7;
abs(numar) Returneaz modulul
abs(-2.23)=2.23;
numrului.
abs(2.3)=2.3
Sinusul, cosinusul i
sin(x), cos(x), tangenta unui unghi.
tan(x) Argumentul x este dat
n radiani
Returneaz ex .
.
exp(x)

pow(x,y) Returneaz xy.

Returneaz log10 ( x) ,
log10(x), log(x)
respectiv log 2 ( x) .
Returneaz maximul,
max(x1, x2,... xn),
minimul dintr-un ir de
min(x1, x2,... xn)
argumente numerice.
Returneaz cel mai mic
ceil(4.3)=5,
ceil(x) ntreg mai mare sau
ceil(-4.3)=-4
egal cu x.
Returneaz ntregul
round(4.3)=4,
round(x) rezultat prin rotunjirea
round(4.7)=5.
lui x.
Returneaz cel mai
floor(4.3)=4,
floor(x) mare ntreg mai mic sau
floor(-4.3)=-5
egal cu x.
Returneaz o valoare
rand(1,10) poate
ntreag aleatoare ntre
rand(min,max) returna orice valoare
valorile ntregi min i
ntreag din [1,10].
max (inclusiv).
pi() Returneaz numrul .
Returneaz rdcina
sqrt(x) sqrt(4)=2;
ptrat a lui x.

Tabelul 5.1. Funcii matematice


188 Manual de Informatic pentru clasa a XII-a

5.9. Afiarea datelor - echo i print

Pentru a afia datele pe browser se folosesc echo i print. Acestea nu


sunt funcii n accepiunea clasic a cuvntului, dei pot fi utilizate asemenea
funciilor. Ele sunt construcii speciale PHP. Ambele afieaz iruri de caractere.

A) echo datorit simplitii, a fost utilizat de multe ori pn acum. Pentru c


poate fi utilizat n multe feluri, o vom prezenta prin exemple i vom renuna la
prezentarea formei generale.

Exemplul 5.36. Afim un ir de caractere folosind parantezele rotunde (apel ca n


cazul funciilor):
echo("Un mesaj");

Exemplul 5.37. Afim un ir de caractere fr s utilizm parantezele rotunde.


Pentru c este permis o astfel de utilizare, spunem c echo nu este funcie, ci
construcie special.
echo "Un mesaj";

Exemplul 5.38. n cazul n care nu se folosesc paranteze, se pot afia mai multe
iruri de caractere:
echo "Un mesaj ", "Alt mesaj";

Exemplul 5.39. Putem afia i coninutul unor variabile, aa cum rezult din
exemplul urmtor:
<?php
$x=6;
echo ("Am $x mere"); // sau echo "Am $x mere";
?>

B) print se utilizeaz la fel ca echo, dar, dac utilizm paranteze, se poate


folosi valoarea ntoars: true, dac irul a fost expediat sau false, n caz contrar.

Exemplul 5.40. Privii exemplul de mai jos:


print ("Un exemplu");
<?php
$x=6;
$y=8;
print ("Ana are $x mere si <BR> $y pere");
?>

Observaie ! <BR> se utilizeaz pentru salt la linie nou! Vezi HTML...


Capitolul 5. Limbajul PHP 189

Observaii foarte importante !


1. n loc de se pot folosi i . Diferena este dat de faptul c, n cazul folosirii
, dac irul de caractere conine numele unei variabile, nu se afieaz coninutul
variabilei, ci se afieaz numele variabilei.

Exemplul 5.41. Dac comanda este echo Am $x mere se va afia


Am $x mere.

2. Nu se pot folosi incluse ntre i nici incluse ntre .

Exemplul 5.42. Secvenele de mai jos sunt incorecte:


echo " Am o multime de prieteni";
echo Am 'o multime' de prieteni;

3. n schimb, putem include ntre caracterele .

Exemplul 5.43. Instruciunea urmtoare


echo " Am 'o multime' de prieteni";
afieaz
Am o multime de prieteni.

4. n schimb, putem include ntre caracterele .

Exemplul 5.44. Instruciunea urmtoare


echo Am o multime de prieteni;
afieaz
Am o multime de prieteni.

5.10. Funcii pentru prelucrarea irurilor de caractere

n PHP exist un set puternic de funcii, asemntoare celor din C++, care
lucreaz cu iruri de caractere. De asemenea, exist i un operator de
concatenare a irurilor.

irurile se memoreaz ca o succesiune de caractere ASCII. Putem adresa


fiecare caracter al irului, aa cum suntem obinuii, prin indicele su. Primul
caracter are indicele 0.

Exemplul 5.45. n secvena urmtoare, se afieaz caracterul U:


$sir="Un exemplu";
echo ($sir[0]);
190 Manual de Informatic pentru clasa a XII-a

Operatorul de concatenare a irurilor este punctul.

Exemplul 5.46. Se afieaz "Ana are 9 mere!". Observai faptul c valoarea


numeric a fost convertit implicit ctre ir.
$x=9;
$sir="Ana ". "are ". $x. " mere!";
echo $sir;

Funcia strlen(sir) returneaz lungimea irului (numrul de caractere


ale irului).

Exemplul 5.47. n secvena de mai jos se afieaz 10 (se numr i blank-ul):


$sir="Un exemplu";
echo strlen($sir);

funcia strpos(sir1, sir2, [poz_start]) caut dac sir2 este


subir al lui sir1. n caz afirmativ, returneaz poziia de nceput a acestuia,
altfel returneaz false. Al treilea parametru specific funciei indicele
caracterului de unde s nceap cutarea. Dac nu este completat, cutarea
ncepe din poziia 0.

Exemplul 5.48. La executarea secvenei urmtoare, se afieaz 5:


$sir="Un exemplu";
echo (strpos($sir, "em"));

Funcia se utilizeaz i pentru a testa dac un ir include sau nu un anumit


subir. Dac subirul este gsit, se returneaz poziia de nceput a acestuia
n subir, dac nu, se returneaz false. Dup cum tim, valoarea lui false
este, de fapt, 0. Ce ne facem n cazul n care subirul se gsete i ncepe
n poziia 0? Cum facem distincia ntre acest caz i cel n care subirul nu
este gsit? Privii secvena din exemplul de mai jos, care rezolv corect
problema i subliniaz importana operatorului ===.

Exemplul 5.49. Secvena este urmtoarea:


<?php
$sir="Un exemplu";
$gasit=strpos($sir, "U");
if ($gasit===false) echo ("Nu este");
else echo ("Este");
?>

Valoarea ntoars de funcie este reinut de variabila $gasit. Pentru a face


distincie ntre false i 0, se folosete 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.
Capitolul 5. Limbajul PHP 191

Funcia strstr(sir1,sir2) returneaz sir1 din poziia n care a fost


gsit sir2, dac sir2 este subir pentru sir1 sau false, n caz contrar.

Exemplul 5.50. n secvena urmtoare se afieaz exemplu:


$sir="Un exemplu";
$gasit=strstr($sir, "ex");
if ($gasit===false) echo ("Nu este in sir");
else echo ($gasit);

Funcia strcmp(sir1,sir2) compar lexicografic (alfabetic) sir1 cu


sir2. Valoarea returnat este:
<0, dac sir1 < sir2;
>0, dac sir1 > sir2;
0, dac sir1 = sir2.

Exemplul 5.51. Privii comparaiile de mai jos:


strcmp ("mama", "tata"); returneaz un rezultat <0.
strcmp ("ab", "a"); returneaz un rezultat >0.
strcmp ("abc", "abc"); returneaz 0.

Observaie ! Comparaia face distincie ntre literele mari i cele mici!


Funcia substr(sir,ind,[lung]) returneaz subirul irului sir, care
ncepe n poziia ind i are lungimea lung. Dac parametrul lung este
absent, se returneaz irul care ncepe n poziia ind i ine pn la
sfritul irului sir.

Exemplul 5.52. Dup executarea secvenei, se afieaz exemplu:


$sir="Un exemplu";
echo (substr($sir,3));

Exemplul 5.53. Dup executarea secvenei, se afieaz ex:


$sir="Un exemplu";
echo (substr($sir,3,2));
Funcia substr_replace(sir1, sir2, ind, [lung]) returneaz 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 sir2.

Exemplul 5.54. Secvena urmtoare afieaz Un templu:


$sir="Un exemplu";
echo (substr_replace($sir,"t",3,2));
Funcia strtoupper(sir) returneaz irul convertit n litere mari, iar funcia
strtolower(sir) returneaz irul convertit n litere mici.
192 Manual de Informatic pentru clasa a XII-a

5.11. Masive n PHP

n PHP exist o libertate extraordinar de lucru cu masive. ncepem prin a


spune c masivele nu se declar.

Exemplul 5.55. n script-ul urmtor, se creeaz i se afieaz un vector cu 5


componente:
<?php
for ($i=0;$i<5;$i++) $x[$i]=$i;
for ($i=0;$i<5;$i++) echo( "$x[$i] <BR>" );
?>

Exemplul 5.56. Se creeaz i se afieaz o matrice cu 5 linii i 5 coloane.


Elementele din linia i i coloana j rein valorile i+j.
<?php
for ($i=0;$i<5;$i++)
for ($j=0;$j<5;$j++) $mat[$i][$j]=$i+$j;
for ($i=0;$i<5;$i++)
{ for ($j=0;$j<5;$j++) echo($mat[$i][$j]." ");
echo("<BR>");
}
?>

n PHP, indicii pot fi iruri de caractere.

Exemplul 5.57. Probai script-ul urmtor, unde un vector de indici nume de


persoane, reine numerele lor de telefon. Acesta este un tablou asociativ:
<?php
$x["Ioana"]="0724xxx";
$x["Valentina"]="031xxx";
$x["Paul"]="0211xxx";
$x["Cristian"]="0232xxx";
print $x["Ioana"]."<BR>";
print $x["Valentina"]."<BR>";
print $x["Paul"]."<BR>";
print $x["Cristian"]."<BR>";
?>

Faptul c exist posibilitatea utilizrii unor astfel de indici creeaz, pe lng


avantaje, probleme. Imaginai-v c vrei s parcurgei i s listai un astfel de
vector. Care este numrul componentelor? S zicem c pe acesta l reinem ntr-o
variabil, dar ce valori ia variabila de ciclare?

Funcia count(nume_vector) returneaz numrul de componente ale


vectorului.
Capitolul 5. Limbajul PHP 193

Exemplul 5.58. Pentru vectorul din script-ul anterior, cu ajutorul expresiei


echo(count($x));, se afieaz 4.

Instruciunea de mai jos are rolul de a ne permite o parcurgere uoar a unui


vector cu numele vector, cu variabila de ciclare indice, n care citirea se
face n variabila variabila:
foreach(vector as indice=>variabila).

Exemplul 5.59. Se creeaz un vector i se parcurge cu foreach(...), afind


rezultatele parcurgerii:
<?php
$x["Ioana"]="0724xxx";
$x["Valentina"]="031xxx";
$x["Paul"]="0211xxx";
$x["Cristian"]="0232xxx";
foreach($x as $i=>$nume)
echo($i." ".$nume."<BR>" );
?> Figura 5.16.
Rezultatul script-ului
Iat ce se afieaz (Fig. 5.16)!

Exist i alte funcii care permit accesarea cu uurin a elementelor


vectorului. Ideea de la care se pleac este urmtoarea: exist un pointer care
ntotdeauna este asupra unui element al vectorului.

Funcia current(vector); returneaz valoarea reinut de elementul din


vector asupra cruia se gsete pointer-ul.

Funcia key(vector); returneaz indicele elementului din vector asupra


cruia se gsete pointer-ul.

Funcia next(vector); deplaseaz pointer-ul pe elementul urmtor din


vector i returneaz valoarea reinut de acesta.

Funcia prev(vector); deplaseaz pointer-ul pe elementul anterior al


vectorului i returneaz valoarea reinut de acesta.

Exemplul 5.60. Analizai script-ul de mai jos:


<?php
$x["Ioana"]="0724xxx";
$x["Valentina"]="031xxx";
$x["Paul"]="0211xxx";
$x["Cristian"]="0232xxx";
echo(current($x)." ".key($x)."<BR>");
echo(next($x)." ".key($x)."<BR>"); Figura 5.17.
echo(prev($x)." ".key($x)."<BR>"); Rezultatul script-ului
echo(count($x)."<BR>");
?>
194 Manual de Informatic pentru clasa a XII-a

Dac, n general, sortarea unui vector (tablou) se poate efectua cu ajutorul


unui algoritm oarecare de sortare, n cazul unui tablou asociativ, cum lesne v
putei da seama, problema este mai complicat. Din acest motiv, PHP-ul pune la
dispoziia programatorilor funcii specifice.

Exemplul 5.61. Pentru a testa modul n care acestea efectueaz sortarea, vom
folosi script-ul urmtor, n care linia metoda de sortare se va nlocui cu
funcia respectiv:
<?php
$x["Ioana"]="0724xxx";
$x["Valentina"]="031xxx";
$x["Paul"]="0211xxx";
$x["Cristian"]="0232xxx";\
foreach($x as $i=>$nume) echo($i." ".$nume."<BR>");
//metoda de sortare
?>
Funcia Asort(vector) sorteaz cresctor vectorul
dup valoarea reinut de fiecare element. Rezultatul
este prezentat n figura alturat.

Figura 5.18.

Funcia Arsort(vector) sorteaz descresctor


vectorul dup valoarea reinut de fiecare element.
Rezultatul este prezentat alturat.

Figura 5.19.

Funcia Ksort(vector) sorteaz cresctor vectorul


dup indici (vezi figura alturat).

Figura 5.20.

Funcia Krsort(vector) sorteaz descresctor


vectorul dup indici. Rezultatul este cel alturat.

Figura 5.21.

Funciile sort() i rsort() sorteaz cresctor, respectiv


descresctor, un masiv de indici 0, 1, ..., n. n cazul n care
avem un masiv asociativ, vechile valori ale indicilor se pierd
(vezi figura alturat).
Figura 5.22.
Capitolul 5. Limbajul PHP 195

5.12. Variabile cookie

Atunci cnd utilizarea Internet-ului a luat amploare, s-a pus urmtoarea


problem: cum trebuie procedat pentru ca server-ul s utilizeaze anumite opiuni
ale utilizatorului, astfel nct, atunci cnd acesta intr pe site, s nu mai piard
timpul selectndu-le din nou? Mai mult, dac se dispune de astfel de informaii,
pagina afiat pentru un anumit utilizator ar putea fi personalizat. Problema a fost
rezolvat de cei de la firma Netscape n anul 1994.

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 fiiere, 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_variabila, valoare, data_expirare)

Exemplul 5.62. n script-ul de mai jos, se creeaz o variabil cookie numit


copac. Variabila reine valoarea verde i expir ntr-o or.
<?php
// creeaza o variabila cookie
setcookie("copac", "verde", time()+3600);
?>

Observaii !

1. Nu pot exista simultan mai mult de 20 de variabile cookie. Dac se creeaz una
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 datei curente (de exemplu, time()-1).

Pentru a citi o variabil cookie se utilizeaz coninutul unui masiv asociativ,


numit $HTTP_COOKIE_VARS. Fiecare component a sa, de indice numele
variabilei cookie, reine valoarea variabilei cookie.
Exemplul 5.63. n script-ul de mai jos se afieaz valoarea variabilei cookie creat
de script-ul anterior:
<?php
// afiseaza verde
echo $HTTP_COOKIE_VARS["copac"];
?>

Analizai i exemplele urmtoare


196 Manual de Informatic pentru clasa a XII-a

Exemplul 5.64. n script-ul de mai jos se creeaz 20 de variabile cookie numite


V1, V2, ..., V20 care rein respectiv 1, 2, ..., 20:
<?php
for ($i=1;$i<=20;$i++)
setcookie("V".$i, $i, time()+10000);
echo "OK complet"
?>

Exemplul 5.65. n script-ul de mai jos se afieaz coninutul variabilelor cookie


existente pe calculatorul vizitatorului:
<?php
foreach($HTTP_COOKIE_VARS as $i=>$nume)
echo $i." ".$nume."<BR>";
?>

Exemplul 5.66. Script-urile 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 nume, se cere numele vizitatorului. Acesta
va introduce numele i va apsa butonul insereaza (vezi Fig. 5.23). Dac
respectivul vizitator, reintr pe acel site, reapelnd script-ul, acesta va identifica
variabila cookie nume, va prelua numele memorat i, n loc ca vizitatorului s i se
cear din nou numele, se va afia mesajul (vezi Fig. 5.24).

Figura 5.24.
Figura 5.23.

<?php
$gasit=0;
// se cauta daca exista variabila cookie nume
foreach($HTTP_COOKIE_VARS as $i=>$v)
if($i=="nume")
$gasit=1;
//daca exista se afiseaza un mesaj
if ($gasit==1)
echo " Bine ati venit pe site-ul nostru domnule:
".$HTTP_COOKIE_VARS["nume"];
// daca nu exista, se afiseaza cele necesare pentru
// identificare si se creeaza variabila nume
else
echo "<FORM action='cc.php' method ='post'>"."Nume<BR>".
"<input name='Nume' type='text'>;". "<BR>".
"<INPUT type='submit', value='insereaza'>";
?>
Capitolul 5. Limbajul PHP 197

5.13. Utilizarea n comun a limbajelor PHP i MySQL

5.13.1. Crearea unei baze de date

n acest paragraf prezentm modul n care se utilizeaz mpreun PHP i


MySQL. Vom presupune c server-ul care gzduiete site-ul dispune de soft-ul
necesar. Desigur, prezentarea aplicaiilor se va face n continuare pe propriul
calculator, prin utilizarea pachetului EasyPHP. Orice script PHP va fi scris n folder-ul
www, inclus n folder-ul EasyPHP1-8 (versiunea pe care o aveam n momentul
scrierii crii pe calculatorul nostru).

Orice script PHP care lucreaz cu MySQL trebuie s se conecteze la acesta.


Pentru conectare, se utilizeaz funcia mysql_connect() sub forma:
resursa mysql_connect(nume_gazda,nume_utilizator,
parola)

n cazul nostru, numele gazdei este localhost, iar numele utilizatorului i


parola sunt cele utilizate n Partea 1, Capitolul 2, atunci cnd am nvat s utilizm
MySQL de la consol. n cazul n care conectarea a reuit se returneaz resursa,
altfel, se returneaz FALSE.

Pentru a da o comand MySQL dintr-un script PHP se utilizeaz funcia


mysql_query(), care primete instruciunea sub forma unui ir de
caractere. i aici, n caz c operaia a reuit, se returneaz o valoare diferit
de 0, altfel se returneaz 0.
resursa mysql_query(instructiune_mysql)

Exemplul 5.67. Se cere s se scrie un script, cre_baza.php, care creeaz baza


de date, numit baza. Practic, script-ul va realiza conexiunea la MySQL, dup care
va da comanda de creare a bazei de date. n ambele operaii, n caz de nereuit,
se va da un mesaj de eroare lmuritor.
<?php
// conectarea la MySQL
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{ echo "Nu s-a realizat conectarea la MySQL "; exit; }
// crearea bazei de date numita baza
$rezultat=mysql_query("CREATE DATABASE baza");
if (!$rezultat)
echo "nu s-a reusit crearea bazei de date";
?>

Pentru a rula script-ul, se d urmtoarea comand browser-ului:


http://localhost/cre_baza.php
198 Manual de Informatic pentru clasa a XII-a

Dac dorim ca mesajele de eroare s ne ajute mai mult n depanare, vom


utiliza dou funcii MySQL.

Funcia string mysqlerrno() returneaz codul numeric al ultimei erori.


Lista parametrilor este vid.
Funcia string mysqlerror() returneaz mesajul asociat ultimei erori.
i n cazul ei, lista parametrilor este vid.

Exemplul 5.68. nlocuii ultimul echo din scriptul anterior cu:


echo mysql_errno().":".mysql_error();

n cazul n care vei rula din nou script-ul, va aprea o eroare care se
datoreaz faptului c se ncearc crearea unei baze de date care exist deja. Iat
cum este afiat eroarea n acest caz:
1007: Cant create database baza; database exists

Observaie ! n perioada de nceput, este recomandabil s utilizai n paralel i


fereastra MS-DOS pentru a lucra cu MySQL, ca n Capitolul 2. De fiecare dat vei
testa dac operaia a reuit. De exemplu, dup ce ai creat baza de date, numit
baza, dai comanda USE baza i dac nu apare eroare, nseamn c baza de
date a fost creat.

5.13.2. Accesul la o baz de date i crearea unui tabel


n baza de date

Pentru a avea acces la o baz de date, se utilizeaz funcia de mai jos, care
returneaz, aa cum suntem obinuii, o valoare diferit de 0 n caz de
reuit i 0, n caz contrar.
bool mysql_select_db(nume_baza)
Dup realizarea accesului, putem crea tabelul prin utilizarea instruciunii
mysql_query().

Exemplul 5.69. Se cere s se scrie un script, cre_tabel.php, prin care s se


creeze un tabel, numit vizitatori, care reine, pentru fiecare persoan trecut
n tabel, numele, vrsta i adresa de e-mail.

<?php
// conectarea la MySQL
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{ echo "Nu s-a realizat conectarea la MySQL "; exit;}
// conectarea la baza de date
$baza=mysql_select_db("baza");
Capitolul 5. Limbajul PHP 199

if (!$baza)
{ echo mysql_errno().":".mysql_error(); exit;}
// crearea tabelului
$interogare="CREATE TABLE vizitatori (nume CHAR(30), varsta
INT, email CHAR(20) PRIMARY KEY)";
$rezultat=mysql_query($interogare);
if (!$rezultat)
echo mysql_errno().":".mysql_error();
?>

Testai script-ul apelnd: http://localhost/cre_tabel.php.

n toate operaiile pe care le vom face de acum nainte cu aceast baz de


date vom avea nevoie, n mod evident, de conectarea la MySQL i accesul la baza
de date. Pentru ca s nu repetm aceast secven, se scrie script-ul de mai jos,
numit conectare.php():
<?php
// conectarea la MySQL
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{echo "Nu s-a realizat conectarea la MySQL "; exit;}
// conectarea la baza de date
$baza=mysql_select_db("baza");
if (!$baza)
{echo mysql_errno().":".mysql_error(); exit;}
?>

Pentru ca un script s includ un altul i s-l execute se folosete funcia


MySQL de mai jos, care are ca parametru numele script-ului care urmeaz
s fie inclus:
require_once(nume_script);

Exemple de utilizare ale acestui script vei gsi n paragrafele urmtoare.

5.13.3. Inserarea liniilor n tabel

Am creat o baz de date, numit baza, cu un tabel, numit vizitatori.


Rmne s introducem date n acest tabel. Vom presupune c fiecare utilizator al
bazei de date se autonregistreaz, scriind datele n nite edit-uri afiate de pagin.
Problema se rezolv n dou pri.

A) Se creeaz o pagin, s-o numim i_date.php, care conine edit-urile prin care
se introduc datele i butonul la apsarea cruia datele sunt transmise ctre server.
Modul de creare a unei astfel de pagini a fost descris, prin urmare prezentm
numai codul ei i tabelul pe care-l afieaz. La apsarea butonului insereaz se
apeleaz script-ul insereaza.php aflat pe server (n cazul nostru, n folder-ul
www). Pagina va fi apelat prin comanda urmtoare:
200 Manual de Informatic pentru clasa a XII-a

http://localhost/cre_tabel.php.

Codul surs pentru pagina i_date.php este:

<HTML>
<HEAD> </HEAD>
<BODY>
<FORM action="insereaza.php"
method ="post">
Nume<BR>
<INPUT name="nume" type="text">; <BR>
Varsta <BR>
<INPUT name="varsta" type="text">; <BR>
Adresa e-mail <BR> Figura 5.25.
<INPUT name="email" type="text">; <BR> Pagina i_date.php
<INPUT type="submit", value="insereaza">
</FORM>
</BODY>
</HTML>

B) Dup ce vizitatorul paginii respective i completeaz datele i apas butonul


insereaza, acestea sunt transmise ctre server i sunt preluate de ctre script-ul
insereaza.php. Acesta preia datele i le introduce n tabelul vizitatori.
<?php
require_once("conectare.php");
$nume= $_POST['nume'];
$varsta= $_POST['varsta'];
$email= $_POST['email'];
$cerere="INSERT INTO vizitatori (nume,varsta,email)
VALUES('$nume',$varsta,'$email')";
$rezultat=mysql_query($cerere);
if (!$rezultat)
echo mysql_errno().":".mysql_error();
?>

Observaii !

1. Pentru cmpurile nume i email datele sunt de tip ir de caractere. Ele sunt
memorate de variabilele $nume i $email. Pentru a le introduce ca iruri, vom
trece variabilele ntre apostrofuri: $nume, $email.

2. Dup introducerea unui rnd, testai dac acesta a fost sau nu introdus n
fereastra MS-DOS: SELECT * FROM vizitatori.

Este foarte important ca datele introduse s fie validate. Astfel, numele


trebuie s fie nevid, varsta trebuie s fie o valoare numeric mai mare sau egal
ca 10 i mai mic sau egal cu 90 i adresa de e-mail trebuie s conin caracterul
@. Vom rescrie script-ul, de aceast dat cu validri.
Capitolul 5. Limbajul PHP 201

Observaie ! Atunci cnd se depisteaz o eroare, se afieaz un mesaj lmuritor i


se reafieaz formularul de introducere a datelor!
<?php
require_once("conectare.php");
$nume= $_POST['nume'];
if (strcmp($nume,"")==0)
{echo "Nu ati scris numele";
require_once("i_date.php");
exit;
}
$varsta= $_POST['varsta'];
if (!is_numeric($varsta) || $varsta<10 ||$varsta>90)
{echo "Varsta incorecta";
require_once("i_date.php");
exit;
}
$email= $_POST['email'];
if (!strpos($email,"@"))
{
echo "Adresa de e-mail gresita";
require_once("i_date.php");
exit;
}
$cerere="INSERT INTO vizitatori (nume,varsta,email)
VALUES('$nume',$varsta,'$email')";
$rezultat=mysql_query($cerere);
if (!$rezultat)
echo mysql_errno().":".mysql_error();
?>

5.13.4. Afiarea unui tabel

n acest paragraf vom arta modul n care se listeaz rezultatul unei


interogri. Dup cum am vzut, o interogare se realizeaz cu mysql_query().
Ea returneaz o valoare care, n cazul n care interogarea a reuit, este diferit de
0. n cazul n care rezultatul unei interogri este alctuit din mai multe rnduri, ca
de exemplu n cazul listrii unui tabel, nu se afieaz direct rezultatul, aa cum
suntem obinuii. n astfel de cazuri, pornind de la valoarea returnat de
mysql_query(), se afieaz tabelul rnd cu rnd.

Funcia mysql_fetch_array() returneaz un rnd al unei interogri (n


cazul de fa, al unui tabel) sub forma unui tablou asociativ. Dup returnarea
rndului, automat se trece la rndul urmtor.
array mysql_fetch_array(resursa)
Pornind de la tabloul asociativ returnat, se poate accesa orice cmp al
interogrii.
202 Manual de Informatic pentru clasa a XII-a

Exemplul 5.70. Analizai script-ul


urmtor, unde se afieaz datele
introduse n tabel. Rezultatul l putei
observa n figura alturat.
<?php
require_once("conectare.php"); Figura 5.26.
$cerere="SELECT * FROM vizitatori"; Rezultatul obinut
$rezultat=mysql_query($cerere);
if (!$rezultat)
echo mysql_errno().":".mysql_error();
// pentru fiecare rand al tabelului
while($rand=mysql_fetch_array($rezultat))
echo $rand["nume"]." ".$rand["varsta"]." ".
$rand["email"]."<BR>";
?>

Desigur, datorit formei inestetice,


aceast afiare a tabelului nu ne
convine. Din acest motiv, vom afia
tabelul, aa cum l observai alturat.
Pentru aceasta, vom rescrie script-ul
afisare_tabel:

<?php Figura 5.27.


require_once("conectare.php"); Rezultat estetic
$cerere="SELECT * FROM vizitatori";
// in urma interogarii, se returneaza tabelul
$rezultat=mysql_query($cerere);
if (!$rezultat)
{ echo mysql_errno().":".mysql_error(); exit; }
// afisam datele sub forma unui tabel
echo "<TABLE BORDER=5>";
// afisam capul de tabel
Echo "<TR><TD align='center'>
<STRONG>Nume<TD><STRONG>Varsta<TD><STRONG>Adresa e-mail";
// Pentru fiecare rand al tabelului
while($rand=mysql_fetch_array($rezultat))
{ echo "<TR>";
echo "<TD>".$rand["nume"].
"<TD align='right'>".$rand["varsta"]."<TD>".
"<A href=mailto:".$rand["email"].">".$rand["email"]."</A>";
echo "</TR>";
}
echo "</TABLE>";
?>

Apelai script-ul prin: http://localhost/afisare_tabel.php.


Capitolul 5. Limbajul PHP 203

5.14. Aplicaii

5.14.1. Inscrierea pe un site

n unele site-uri se cere ca, n prealabil, vizitatorii respectivului site s se


nscrie n baza de date a acestuia. De regul, utilizatorului i se cere ID-ul
(nickname-ul) i parola. Acestea sunt memorate ntr-un tabel i de cte ori utilizatorul
dorete s acceseze din nou site-ul, ele sunt cerute pentru identificare. Accesul la
site se realizeaz numai atunci cnd ID-ul i parola se regsesc n baza de date.

A) Pentru nceput, este necesar ca s se creeze o baz de date, de exemplu,


inscrisi, care conine un singur tabel, parole. Script-ul urmtor, btab.php,
realizeaz cele de mai sus:
<?php
// conectarea la MySQL
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{ echo "Nu s-a realizat conectarea la MySQL "; exit; }
// crearea bazei de date numita baza
$rezultat=mysql_query("CREATE DATABASE inscrisi");
if (!$rezultat)
{ echo "nu s-a reusit crearea bazei de date";
exit;
}
$baza=mysql_select_db("inscrisi");
$interogare="CREATE TABLE parole ( nume CHAR(30) PRIMARY
KEY, parola CHAR(10))";
$rezultat=mysql_query($interogare);
if (!$rezultat)
echo mysql_errno().":".mysql_error();
?>

n cele ce urmeaz, vom presupune c am rulat script-ul btab.php, deci


baza de date i tabelul sunt create.

B) Dac un vizitator acceseaz site-ul, este afiat pagina alturat, n care i se


cere, fie s se identifice, n cazul n care este nscris deja, fie s se nscrie, n caz
contrar.

Figura 5.28.
Pagina principal
204 Manual de Informatic pentru clasa a XII-a

Pentru a realiza pagina respectiv, se folosete un simplu fiier HTML (sau


PHP), vedei mai jos (index.php). n fapt, acesta conine dou ancore, ctre cele
dou script-uri PHP: identificare.php sau inscriere.php. Vizitatorul poate
opta pentru oricare dintre ele.
<HTML>
<BODY>
<H2> Bine ati venit pe site-ul...</H2>
<A href="http://localhost/identificare.php"> Identificare
</A><BR><BR>
<A href="http://localhost/inscriere.php"> Inscriere </A>
</BODY>
</HTML>

C) Dac utilizatorul opteaz pentru nscriere, atunci


este rulat script-ul urmtor (inscriere.php), care
afieaz fereastra alturat. Vizitatorului i se cere s
introduc numele (ID-ul) i parola. Atunci cnd se
introduce parola, se afieaz * pentru fiecare caracter
introdus. Pentru a evita introducerea greit a parolei,
aceasta trebuie s fie introdus de dou ori.

Dup introducerea datelor, vizitatorul va apsa butonul


inscrie-te. Efectul va fi acela de trimitere a datelor
ctre server i de apel al script-ului inscrie.php.
Figura 5.29.
<HTML> Pagina inscriere.php
<BODY>
<FORM action="inscrie.php" method ="post">
Nume<BR>
<input name="nume" type="text">; <BR>
Parola <BR>
<input name="parola1" type="password">; <BR>
Reintroduceti parola <BR>
<input name="parola2" type="password">; <BR>
<INPUT type="submit", value="inscrie-te!">
</FORM>
</BODY>
</HTML>

C1) Script-ul inscrie.php valideaz datele i, n caz c acestea sunt valide, le


nscrie n tabelul parole:
- se testeaz dac numele este nevid;
- dac cele dou parole coincid;
- dac nu mai exist un vizitator cu aceeai parol (parola este cheie primar).

n cazul n care una dintre aceste condiii nu este ndeplinit, se afieaz un mesaj
de eroare corespunztor i se reafieaz formularul de introducere a datelor.
Capitolul 5. Limbajul PHP 205

<?php
// conectare la mysql
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{ echo "Nu s-a realizat conectarea la MySQL "; exit; }
// declarare baza folosita
$baza=mysql_select_db("inscrisi");
//Citirea numelui - trebuie sa fie nevid
$nume= $_POST['nume'];
if (strcmp($nume,"")==0)
{echo "Nu ati scris numele";
require_once("inscriere.php");
exit;
}
// citirea parolelor - trebuie sa fie identice
$parola1= $_POST['parola1'];
$parola2= $_POST['parola2'];
if (strcmp($parola1,$parola2)!=0)
{echo "parola incorecta";
require_once("inscriere.php");
exit;}
// se incearca inscrierea in tabel
$cerere="INSERT INTO parole (nume,parola)
VALUES('$nume','$parola1')";
$rezultat=mysql_query($cerere);
if (!$rezultat)
{ echo "Nume existent in baza de date";
require_once("inscriere.php");
}
else echo "OK! Ati fost introdus in baza noastra de date";
?>

D) n cazul n care vizitatorul este deja nscris, va


apela script-ul identificare.php prin intermediul
ancorei respective. Acesta va cere numele i parola,
iar la apsarea butonului Conecteaza-ma va
trimite datele ctre server. Acestea sunt preluate de
script-ul verif.php.
<HTML>
<BODY>
<FORM action="verif.php" method ="post"> Figura 5.30. Pagina
Nume<BR> identificare.php
<input name="nume" type="text">; <BR>
Parola <BR>
<input name="parola" type="password">; <BR>
<INPUT type="submit", value="Conecteaza-ma">
</FORM>
</BODY>
</HTML>
206 Manual de Informatic pentru clasa a XII-a

D1) Se testeaz dac n tabelul parole exist nregistrarea cu ID-ul i parola


introdus de utilizator. n caz c exist, se ruleaz, de exemplu, un script php, n
acest caz, rezultat.php, altfel se cere ca datele s fie reintroduse:

<?php
// conectare la mysql
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{ echo "Nu s-a realizat conectarea la MySQL "; exit; }
// declarare baza folosita
$baza=mysql_select_db("inscrisi");

// citirea numelui si parolei


$nume= $_POST['nume'];
$parola= $_POST['parola'];

// selectez, daca exista in tabel, randul corespunzator


$cerere="SELECT nume FROM parole
WHERE nume='$nume' AND parola='$parola'";
$rezultat=mysql_query($cerere);
$rand=mysql_fetch_array($rezultat);
//echo $rand['nume'];
if ($rand["nume"]!=$nume)
{echo "Numele si/sau parola sunt eronate";
require_once("identificare.php");
}
else require_once("rezultat.php"); ;
?>

Fiierul rezultat.php este:

<HTML>
<BODY>
<H1> pagina ce ar trebui afisata
</BODY>
</HTML>

5.14.2. Determinarea adresei IP i a browser-ului utilizatorului

Uneori se dorete obinerea unor informaii despre vizitatorii unui site. Astfel,
se poate afla adresa IP a vizitatorului, browser-ul utilizat de acesta sau sistemul de
operare pe care acesta l utilizeaz. Toate acestea pot fi stocate n baze de date.
Informaiile astfel dobndite sunt extrem de importante pentru aplicaii precum:

- Aplicaii prin care vizitatorii voteaz rspunsul la o anumit ntrebare. Pentru


a evita ca un vizitator s voteze de mai multe ori ntr-o zi, ntr-un tabel se va
memora adresa IP a acestuia. De la o anumit adres IP se poate vota o
singur dat sau o singur dat pe zi, caz n care se va reine i ziua votrii.
Capitolul 5. Limbajul PHP 207

- Aplicaii prin care se contorizeaz vizitatorii unui site. Dac o persoan


viziteaz site-ul ntr-o zi de mai multe ori, dar cu aceeai adres IP, aceasta
este numrat ca vizitator o singur dat.
- Determinarea browser-ului are i ea mai multe utilizri. Se tie c, din
pcate, diferite browser-e afieaz uneori diferit acelai fiier download-at de
pe server. Pentru a nu mai avea astfel de probleme, dac se cunoate
browser-ul utilizatorului, atunci server-ul expediaz ctre calculatorul
vizitatorului fiierul corespunztor.
- Informaii precum cele de mai sus pot fi folosite de site-urile care
monitorizeaz vizitele la diferite alte site-uri i ntocmesc clasamentul
acestora n funcie de numrul de vizitatori.

n acest paragraf vom nva s determinm adresa IP i browser-ul vizitatorului.

$_SERVER este o variabil predefinit de tip masiv asociativ. Cu ajutorul ei,


script-ul PHP poate accesa o mulime de informaii. Pentru a afla adresa IP a
vizitatorului se utilizeaz $_SERVER["REMOTE_ADDR"] i pentru a afla informaii
despre browser se utilizeaz $_SERVER["HTTP_USER_AGENT"]. n acest din urm
caz, dac irul obinut conine subirul MSIE 6.0, atunci browser-ul utilizator este
Microsoft Internet Explorer versiunea 6.0, dac conine subirul Netscape,
atunci browser-ul este de tip Netscape, etc.

Exemplul 5.71. Mai multe informaii putei obine analiznd script-ul urmtor care
afieaz browser-ul utilizatorului i adresa IP a acestuia (vezi figura de mai jos):

Figura 5.31. Rezultatele script-ului propus ca exemplu

<?php
$brw = $_SERVER["HTTP_USER_AGENT"];
echo " Informatia generala: ".$brw. "<BR>";

// determinare browser
if(strstr($brw,"MSIE 5.0"))
$brw = "Microsoft Internet Explorer v5.0";
else
if(strstr($brw,"MSIE 5.5"))
$brw = "Microsoft Internet Explorer v5.5";
else
if(strstr($brw,"MSIE 6.0"))
$brw = "Microsoft Internet Explorer v6.0";
else
if ( strstr($brw, "Netscape"))
$brws = "Netscape";
208 Manual de Informatic pentru clasa a XII-a

else
if ( strstr($brw, "Firefox"))
$brws = "Firefox";
else
if ( strstr($brw, "Mozilla"))
$brws = "Mozilla";
else
if ( strstr($brw, "Opera"))
$brws = "Opera";
else
$brw = "Browser necunoscut";
echo " Browser ".$brw. "<BR>";
// adresa IP
$ip = $_SERVER["REMOTE_ADDR"];
echo " Adresa IP ".$ip;
?>

1. Creai un contor pentru un site care s numere vizitatorii site-ului respectiv. Un


vizitator cu o anumit adres IP se numr o singur dat ntr-o zi, indiferent de
numrul de vizite ale site-ului pe care acesta le efectueaz.

2. Creai un site care afieaz o anumit ntrebare, la care vizitatorii sunt invitai s
rspund alegnd o opiune dintre mai multe, afiate cu ajutorul unor butoane
radio. Un vizitator cu o anumit adres IP poate vota o singur dat ntr-o zi. n
situaia n care acesta ncearc s voteze de mai multe ori, se va afia un mesaj
prin care acesta este anunat c a votat deja.

Observaie ! n ambele cazuri vei crea o baz de date cu un singur tabel, care
reine adresa IP a vizitatorului i (eventual) data efecturii vizitei respective.

5.14.3. Cum se creeaz un forum ?

De cte ori n-am vzut sau am scris n diverse forum-uri... Unele sunt pe
marginea unor articole din ziare, altele au scopuri precise, cu discuii pe anumite
teme (limbaje de programare, politic, literatur, etc.).

n cele ce urmeaz ne propunem s crem un forum mult simplificat, n care


cei care doresc scriu mesaje, iar toi ceilali le citesc. De ce avem nevoie pentru a
realiza un astfel de forum?

A) n primul rnd, este necesar o baz de date, s-o numim forum i un tabel, s-l
numim mesaje. Un rnd al tabelului va conine un mesaj. n acest sens, va exista
un numr de ordine pentru mesajul respectiv (nr), id-ul celui care a scris mesajul
(id), titlul mesajului (titlu) i textul propriu-zis al acestuia (textul). Script-ul urmtor,
s-l numim f1.php, creeaz baza de date i tabelul. Iniial, tabelul este vid.
Capitolul 5. Limbajul PHP 209

<?php
// conectarea la MySQL
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{ echo "Nu s-a realizat conectarea la MySQL "; exit; }
// crearea bazei de date numita baza
$rezultat=mysql_query("CREATE DATABASE forum");
if (!$rezultat)
{ echo "nu s-a reusit crearea bazei de date";
exit;
}
$baza=mysql_select_db("forum");
$interogare="CREATE TABLE mesaje(nr INT UNIQUE KEY
AUTO_INCREMENT, id CHAR(20), titlu CHAR(100),
textul LONGTEXT)";
$rezultat=mysql_query($interogare);
if (!$rezultat)
echo mysql_errno().":".mysql_error();
?>

B) Acum este necesar un script prin


care utilizatorul scrie un mesaj. Practic,
acesta trebuie s introduc mesajul,
adic informaiile cerute de tabel i la
apsarea butonului Adauga mesajul
s fie trimis ctre server.

<HTML>
<HEAD> </HEAD>
<BODY>
<FORM action="insereaza.php"
method ="post"> ID <BR>
<INPUT name="id"
type="text">;
<BR> Titlu <BR>
<INPUT name="titlu"
type="text">;
<BR><BR> Mesajul dv <BR>
<TEXTAREA name="mesajul" Figura 5.32. Pagina care
rows="10" cols="30"></TEXTAREA> conine formularul
<BR>
<INPUT type="submit", value="Adauga mesajul">
</FORM>
</BODY>
</HTML>

C) Pe server, informaiile transmise de ctre cel care a scris mesajul sunt preluate
de ctre script-ul insereaza.php. Practic, se verific dac fiecare cmp n parte
este nevid, dup care mesajul este memorat n tabel.
210 Manual de Informatic pentru clasa a XII-a

<?php
// conectarea la MySQL
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql) echo "Nu s-a realizat conectarea la MySQL ";
// conectarea la baza de date
$baza=mysql_select_db("Forum");
if (!$baza) echo mysql_errno().":".mysql_error();
$id= $_POST['id'];
if (strcmp($id,"")==0)
{ echo "Nu ati introdus ID-ul";
require_once("f2.php"); exit; }
$titlu= $_POST['titlu'];
if (strcmp($titlu,"")==0)
{ echo "Nu ati scris titlul";
require_once("f2.php"); exit; }
$mesajul= $_POST['mesajul'];
if (strcmp($mesajul,"")==0)
{ echo "Nu ati scris mesajul";
require_once("f2.php"); exit; }
$cerere="INSERT INTO mesaje (id,titlu,textul)
VALUES('$id','$titlu','$mesajul')";
$rezultat=mysql_query($cerere);
if (!$rezultat) echo mysql_errno().":".mysql_error();
?>

D) O persoan care dorete s vizualizeze mesajele scrise de alii, va apela


script-ul urmtor, f3.php. Practic, acesta afieaz tabelul mesajelor. Dup cum
observai, pentru un mesaj, nu este afiat textul propriu-zis:

Figura 5.33. Pagina care


conine tabelul mesajelor

Pentru a-l vizualiza pe acesta, va trebui s se execute clic pe titlul mesajului. De aici
rezult c titlul va trebui afiat ca un link. Aici intervine ceva interesant. Atunci cnd
se execut clic, se va apela un alt script, f4.php, care va afia mesajul cerut.
Problema este c va trebui s fie cunoscut numrul curent al mesajului respectiv.
Prin urmare, este necesar un link care s transmit i un parametru. Este necesar
un apel de forma: f4.php?nr_mesaj. De exemplu, dac numrul mesajului este
3, vom scrie: f4.php?3. n rest, script-ul f3 afieaz datele ntr-un tabel, aa cum
suntem deja obinuii.
<?php
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{echo "Nu s-a realizat conectarea la MySQL "; exit;}
//conectarea la baza de date
$baza=mysql_select_db("forum");
Capitolul 5. Limbajul PHP 211

if (!$baza)
{echo mysql_errno().":".mysql_error(); exit;}
$cerere="SELECT * FROM mesaje";
// in urma interogarii, se returneaza tabelul
$rezultat=mysql_query($cerere);
if (!$rezultat)
{ echo mysql_errno().":".mysql_error(); exit;}
echo "<TABLE BORDER=5>";
// afisam capul de tabel
echo "<TR> <TD align='left'><STRONG>nr.curent
<TD align='center'><STRONG>ID<TD><STRONG>Titlu mesaj";
while($rand=mysql_fetch_array($rezultat))
{ echo "<TR>";
echo "<TD align='right'>".$rand["nr"].
"<TD>".$rand["id"].<TD>"."<A
href=http://localhost/f4.php?".$rand["nr"].
">".$rand["titlu"]."</A>";
echo "</TR>";
}
echo "</TABLE>";
?>

E) Script-ul de mai jos, f4.php, apelat de f3.php, primete ca parametru de


intrare numrul mesajului. Practic, apeleaz MySQL-ul, deschide baza de date i
afieaz corpul mesajului (textul propriu-zis al acestuia), indentificndu-l cu ajutorul
unei interogri.
<?php
$nr= $_SERVER["QUERY_STRING"];
$msql=mysql_connect("localhost","root","parolamea");
if(!$msql)
{echo "Nu s-a realizat conectarea la MySQL"; exit;}
// conectarea la baza de date
$baza=mysql_select_db("forum");
if (!$baza) {echo mysql_errno().":".mysql_error(); exit;}
$cerere="SELECT textul FROM mesaje WHERE nr=$nr";
// in urma interogarii, se returneaza tabelul
$rezultat=mysql_query($cerere);
$rand=mysql_fetch_array($rezultat); echo $rand["textul"];
?>

1. Adugai script-ului f3.php o secven n urma creia, la apsarea unui buton,


s se poat introduce un mesaj (practic, s fie apelat script-ul f2.php).
2. Reproiectai aplicaia astfel nct s existe posibilitatea unui rspuns la un
mesaj.
212 Manual de Informatic pentru clasa a XII-a

5.15. Proiectarea paginilor web


n acest moment, putei spune c avei cunotine solide astfel nct s putei
dezvolta o aplicaie hipermedia. Definirea modelului conceptual v ajut la etapa
de proiectare a unei baze de date, normalizarea acesteia asigur robustee i
siguran, iar prin intermediul limbajului MySQL o putei implementa. Limbajele
HTML i CSS ofer nenumrate posibiliti de realizare a interfeei cu utilizatorul
final, iar PHP-ul, accesul la baza de date stocat pe server.
Observaie ! Recitii Capitolul 1 pentru a v reaminti noiunile fundamentale care
privesc proiectarea bazelor de date!
O planificare riguroas a proiectului este imperativ i de cele mai multe ori,
ducerea la bun sfrit a acestuia necesit o ntreag echip care s lucreze
coordonat. Astfel, n cazul n care nu realizai proiectul singur, trebuie s formai o
echip care s-i distribuie sarcinile ct mai eficient, n funcie de aptitudini. Putei
revedea subcapitolul 1.4. din Partea I, care descrie managementul de proiect.
Nimeni nu pleac la drum fr un plan bine pus la punct. De aceea, nainte
de toate, trebuie s fixai clar toate etapele pe care trebuie s le parcurgei.
1. Trebuie s tii cui i se adreseaz site-ul pe care dorii s-l dezvoltai i
bineneles, discutai cu beneficiarul acestuia pentru a obine toate
informaiile de care avei nevoie. n funcie de datele pe care acesta
dorete s le cunoasc despre vizitatorii site-ului sau pe cele care vrea s
le rein n urma interaciunii cu acetia, putei realiza modelul conceptual
al bazei de date.
2. Analizai cu atenie modelul conceptual, iar dac este cazul, utilizai
tehnica de normalizare a datelor pentru a preveni eventualele anomalii.
3. Utiliznd modelul relaional al bazelor de date, implementai modelul con-
ceptual, iar cu ajutorul limbajului MySQL, creai baza de date!
4. Interfaa grafic cu utilizatorul trebuie s fie bine structurat, simplu de
utilizat, iar datele de intrare i cele de ieire trebuie alese corespunztor, n
funcie de particularitile proiectului (revedei paragraful 4.23).
Nu uitai ! Realizarea interfeei grafice reprezint o etap esenial pentru
c paginile web sunt unicul loc unde utilizatorul interacioneaz n mod
direct cu aplicaia dvs. Upload-ai pe server fiierele html astfel formate i
testai-le cu atenie!
5. Realizai formularele care asigur colectarea i trimiterea datelor ctre
server. Multe aplicaii hipermedia conin formulare care au cmpuri
opionale, permind colectarea unor informaii suplimentare despre
utilizatori.
6. Creai script-urile PHP care s prelucreze datele introduse de utilizator i
care s rspund comenzilor recepionate.
7. La final, testai aplicaia pentru a elimina anumite erori care pot aprea!
Capitolul 5. Limbajul PHP 213

De multe ori, codurile surs pot avea sute de linii de cod, la care trebuie s
adugai comentarii sugestive pentru a putea vizualiza rapid seciuni din
cadrul acestora.
Corectitudinea datelor introduse de ctre utilizatori trebuie s fie asigurat
prin mesajele ajuttoare sau de eroare care trebuie s se regseasc n
cadrul paginilor web se evit astfel introducerea unor informaii eronate n
baza de date.
Cu ajutorul variabilelor cookie, putei oferi posibilitatea personalizrii site-ului,
n funcie de preferinele utilizatorului (de exemplu: diverse teme care au la
baz cte un stil vezi CSS; afiarea informaiilor de interes list cu
diverse categorii, etc.).
Nicio aplicaie nu poate fi considerat n totalitate terminat, ea fiind
deschis la eventuale mbuntiri. De asemenea, pentru a fi asigurat
succesul site-ului web, actualizai frecvent informaiile pentru a ine la curent
vizitatorii fideli!
Important ! Pentru ca posesorul site-ului s poat vizualiza informaiile reinute n
baza de date, realizai o interfa (o pagin web) special, stabilind de comun
acord care date trebuie s fie afiate n respectivele rapoarte, grafice, etc.

1. Care dintre afirmaiile de mai jos sunt adevrate i care sunt false?
a) Un script PHP este executat de ctre browser.
b) PHP-ul se instaleaz pe server.
c) Un fiier HTML poate conine un script PHP.
d) Formularele se descriu n HTML.
2. Variant simplificat de test online. Reluai problema 1. Vei crea o pagin
HTML care afieaz problema i ofer vizitatorului ca, acolo unde consider c
rspunsul este adevrat, s bifeze un buton de marcare. Datele se trimit ctre server.
Pe server, rspunde un script PHP care, acolo unde vizitatorul a rspuns corect,
afieaz OK, iar unde nu a rspuns corect, afieaz rspunsul corect i o explicaie.
3. Dintre afirmaiile de mai jos, una singur este fals. Care este?
a) Funciile PHP admit parametri transferai prin referin.
b) Funciile apelate de un script PHP trebuie s fie coninute de acesta.
c) Funciile PHP admit parametri transferai prin valoare.
d) n PHP nu este necesar s declarm tipul unei variabile.
4. Cum se testeaz online problema 3 (vedei problema 2)?
214 Manual de Informatic pentru clasa a XII-a

5. Validarea datelor. Scriei un fiier HTML care conine un formular prin


intermediul cruia se pot trimite ctre server numele vizitatorului i vrsta sa. Pe
server, se va gsi un script care testeaz dac numele este alfabetic i dac vrsta
este ntre 5 i 90 de ani. Dac aceste condiii sunt ndeplinite, browser-ul va afia
OK, altfel se vor afia mesaje de eroare corespunztoare.
6. Semnalarea erorilor gsite la validare. Se cere s se scrie un formular prin
care vizitatorul trimite ctre server un numr ntreg din intervalul [1,10] i un
script PHP care verific valoarea introdus. n cazul n care valoarea introdus este
corect, se va afia OK, altfel se va da un mesaj de eroare, dup care se va afia
din nou formularul (vezi figurile de mai jos).

a) Formular iniial b) Mesaj de eroare

Figura 5.34. Figuri propuse pentru problema 6

7. Verificare parol. Se cere s se scrie un formular prin care i se cere


vizitatorului s introduc o parol. Pe server rspunde un script PHP care verific
parola. n caz de coinciden, se va afia o pagin HTML, la alegerea dvs., iar altfel
se va afia un mesaj de eroare.
8. Imagini la alegere. S se creeze un formular care conine o list. Vizitatorul
selecteaz, dup nume, o anumit fotografie i trimite selecia sa ctre server.
Acolo, un script PHP afieaz imaginea, dar i lista, pentru ca vizitatorul s poat
selecta o alt imagine.
9. Afiarea unui tabel atunci cnd nu se cunosc de la nceput datele. S se
creeze un formular care trimite 4 valori ctre server. Acolo se va gsi un script care
afieaz cele 4 valori sub forma unui tabel. Vedei mai jos.

a) Formular iniial b) Tabelul obinut

Figura 5.34. Pagini propuse pentru problema 9

(pentru verificare, rezolvrile se gsesc la pag. 383)


Capitolul 5. Limbajul PHP 215

Formai echipe de 2 - 4 elevi, alegei-v o tem de proiect, fie din temele


propuse n aceast seciune, fie una propus chiar de voi.
Atenie! Repartizai sarcinile n mod echitabil n cadrul echipei de proiect.
Putei chiar organiza mpreun cu cadrul didactic, un concurs la nivelul clasei
sau al colii, la care s invitai i ali profesori din coal.
Nu uitai s documentai fiecare presupunere pe care ai fcut-o n realizarea
proiectului!

1. eful clasei. Este de preferat ca orice clas s aib ales un elev care s se
ocupe de problemele administrative. Dac avei sau nu unul, este momentul unui
nou scrutin! Nominalizai-v un numr de 4-5 elevi care s candideze pentru acest
titlu i realizai o aplicaie hipermedia care s permit sistemul votului electronic.
Bineneles, problema poate fi extins: fiecare candidat s aib o pagin
separat, unde s poat s-i fac o campanie electoral ct mai interesant,
rezultatele pariale sau finale s poat fi vizualizate on-line, etc.
Mult succes!

2. Forum. Fie c este vorba de maini sau calculatoare, probleme personale sau
profesionale, tuturor ne place s discutm pe Internet! Preri sunt multe i de
multe ori ne place s ne amuzm sau s deschidem un nou topic pe forum, n
sperana c mcar virtual s ne facem auzii. Realizai un astfel de site web!

3. Vnzare/Cumprare. Toat lumea a auzit de succesul site-ului E-bay,


recunsocut la nivel mondial n lumea comerului electronic. Chiar dac nu att de
complex, realizai i voi un site care s permit:
posibilitatea crerii unui cont care s identifice unic fiecare vizitator;
introducerea anunurilor de tip vnzare/cumprare;
vizualizarea produselor existente n funcie de categorie, pre, etc.;
afiarea unor rapoarte care s evidenieze cele mai vndute produse,
preferinele obiectelor cumprate n funcie de vrst, etc.;
trimiterea unor mesaje ntre utilizatori simularea unei csue potale.
PARTEA A III-A CAPITOLUL
Iniiere n utilizarea limbajului Java

n acest capitol vom nva s scriem programe n limbajul Java. Mai jos
sunt prezentate principalele noiuni pe care le vei studia:

Cum instalm Java ?


Primul program
Conceptul de Main Virtual Java
Care sunt tipurile de aplicaii Java ?
Cum introducem comentariile ?
Afiarea irurilor de caractere
Tipuri de date
Operatori
Instruciuni
Masive
Citirea datelor de la tastatur
Date membru
Metode
Exemple de utilizare a metodelor
Suprancrcarea metodelor

Cuvinte cheie: instalare, main virtual, stand-alone, applet,


servlet, date, operatori, instruciuni, masive,
date membru, metode, suprancrcare
Capitolul 6. Iniiere n utilizarea limbajului Java 217

Dup studiul acestui capitol, vom putea scrie programe la nivelul celor scrise
1
n anii trecui n Pascal sau C/C++ . Limbajul Java este exclusiv orientat ctre
programarea pe obiecte. Pentru a fi uor de neles, n aceast prim parte, vom
recurge la un mic artificiu: programul va fi n ntregime coninut ntr-o clas, iar
variabilele (datele membru) i funciile (metodele) vor fi statice .
2

6.1. Cum instalm Java ?

Pentru a lucra n Java, utilizm software-ul pus la dispoziie de firma Sun,


creatoarea limbajului. n cele ce urmeaz, considerm c lucrm sub sistemul de
operare Windows 2000 i calculatorul are acces la Internet.

A. ncepem prin a download-a softul. Adresa este: http:\\java.sun.com.


Evident, vom alege o versiune recent pentru sistemul Windows.
B. Pentru c software-ul pus la dispoziie de firma Sun lucreaz prin
comenzi date de la tastatur (ca n MS-DOS) va trebui s folosim, ca i
n cazul pachetului EasyPHP, programul CMD.exe. Pentru a utiliza cu
uurin acest program, vom crea pe Desktop un shortcut ctre el
(vedei alturat).
C. Va trebui ca fereastra CMD
s fie deschis n subfolder-ul
bin al folder-ului care conine
softul download-at i instalat.
Executai clic cu butonul
drept al mouse-ului i
selectai Properties.
La apariia cutiei alturate,
introducei calea folder-ului
amintit n edit-ul Start in.

Figura 6.1. Cutia de dialog


CMD.exe Properties

D. ntruct, n perioada de iniiere, programele noastre se vor gsi n


folder-ul bin, pentru a lucra mai uor, este recomandabil s crem pe
Desktop i un shortcut ctre acest folder.

Totui, programele pe care le vom putea realiza dup studiul acestui capitol nu vor utiliza
1

fiiere. Acestea vor fi tratate n capitolul urmtor.


n acest capitol, din considerente pedagogice, noiunile de clas, dat membru static i
2

metod static nu vor fi explicate, ci doar aplicate n mod mecanic. n capitolul urmtor, se
va reveni asupra acestor noiuni.
218 Manual de Informatic pentru clasa a XII-a

E. Dei de la instalare, mediul Java ar trebui, implicit, s lucreze n folder-ul bin,


este bine ca dvs. s-l setai corespunztor. n acest scop, vom folosi variabila de
sistem CLASSPATH (calea ctre clase) care este iniializat cu respectiva cale.
Pentru aceasta, vom respecta urmtorii pai:
1. Din meniul Start, apelai Settings, Control Panel i System..
2. Va aprea o cutie de dialog n care selectai Advanced i Environment
Variables...:

Figura 6.2. Cutia de dialog System Properties

3. n cutia de dialog de mai jos, apsai New:

Figura 6.3. Cutia de dialog Environment Variables

4. n cutia de dialog din figura alturat, introducei numele variabilei de


sistem (CLASSPATH), apoi calea ctre folder-ul bin. Atenie! Calea
trebuie s corespund locului unde avei instalat mediul Java pe
calculatorul dvs. Apoi, apsai OK!

Figura 6.4. Cutia de dialog New User Variable


Capitolul 6. Iniiere n utilizarea limbajului Java 219

6.2. Primul program

De acum putem scrie primul program. Trebuie s tim c mediul Java, pus
la dispoziie de firma Sun, nu ne ofer un editor de text. Din acest motiv, textul
programului va fi introdus cu ajutorul NOTEPAD-ului, dar va trebui s fim ateni ca
extensia fiierului text astfel obinut s fie .java.

Nu uitai ! Pentru nceput, fiierul text care conine programul trebuie s se


gseasc n folder-ul bin.

Pentru a introduce i rula un program, vom respecta paii urmtori:


A. Vom deschide shortcut-ul ctre bin din meniul flotant, vom alege New i Text
Document, apoi schimbm numele fiierului n prima.java. Fiierul cu acest
nume va fi deschis din meniul flotant asociat, cu Open with... i Notepad.
Apoi, se introduce programul de mai jos, care afieaz mesajul Acesta este
primul program Java i salvm programul:

class prima {
public static void main(String[] args) {
System.out.println("Acesta este primul program Java");}
}

Este obligatoriu ca numele clasei s coincid cu numele fiierului. n


exemplu, clasa se numete prima, iar fiierul este prima.java.
Este obligatoriu ca extensia fiierului text s fie .java !

B. Din fereastra CMD, apelm compilatorul Java prin comanda:


javac prima.java

n urma acestei comenzi, se va crea fiierul prima.class. Acest fiier conine


programul compilat. Verificai existena lui n bin!

C. Pentru a executa programul astfel compilat, vom da comanda:


java prima
Iat cum arat acum fereastra CMD:

Figura 6.5.
Fereastra CMD dup
rularea programului
220 Manual de Informatic pentru clasa a XII-a

Perfect ! Dac ai reuit s rulai acest prim program, ai fcut un pas important.
nseamn c ai instalat corect mediul i de acum putei lucra linitit. Sunt muli cei
care se mpotmolesc n acest punct i din acest motiv, renun

S aruncm o privire asupra programului:

Orice program este inclus ntr-o clas. Noiunea de clas aparine


programrii orientate pe obiecte i va fi explicat pe larg. n exemplu, clasa
se numete prima.
Aa cum s-a precizat, numele clasei trebuie s coincid cu numele fiierului
text surs (cel creat cu NOTEPAD), numai c acesta din urm trebuie s aib
extensia .java.
Orice program are o metod (funcie main()) i executarea sa ncepe cu
instruciunile acestei metode.
n exemplu, programul afieaz un ir de caractere. Instruciunea (apelul de
metod) care afieaz acest ir de caractere este
system.out.println().
Dup afiare, cursorul sare pe rndul urmtor.
n Java, n locul termenului deja consacrat funcie, vom folosi pe acela de
metod.
Este obligatoriu ca metoda main() s conin anumii parametri de intrare:
String[] args. Asupra semnificaiei acestor parametri revenim n capitolul
urmtor.
Elementele public i static sunt modificatori. Prezena lor n antetul
metodei main() este obligatorie. i asupra lor vom reveni.
void este tipul metodei main(). Semnificaia este cea din C++, adic
metoda nu returneaz nici o valoare.
n Java, se face distincie ntre literele mari i cele mici. De exemplu, Mama
i mama sunt identificatori diferii.

6.3. Conceptul de Main Virtual Java (JVM)

Una dintre cerinele care au stat la baza crerii limbajului Java a fost aceea
de a obine un limbaj portabil. Aceasta nseamn c un program scris pe un anumit
calculator, pe care ruleaz un anumit sistem de operare, s poat rula fr
modificri i pe un alt calculator, pe care ruleaz alt sistem de operare. De
exemplu, s se poat scrie un program care s fie rulat pe Windows i pe Linux.
Pentru a rezolva aceast problem, cei de la Sun au recurs la urmtorul procedeu:
Capitolul 6. Iniiere n utilizarea limbajului Java 221

Fiecare utilizator al unui sistem de operare poate download-a mediul specific


acelui sistem de operare. De aceast lucru v-ai convins atunci cnd ai
download-at mediul pentru Windows.
Mediul specific pentru un anumit sistem de operare conine un compilator
special creat pentru el, care preia programul din fiierul surs i l traduce
ntr-un cod anume, numit byte-code. Compilatorul este programul javac,
iar fiierul compilat are extensia .class.
Programele n byte-code sunt rulate pe aa numita Main Virtual Java
(JVM). Maina virtual Java este un suport software care trebuie s fie
instalat pe calculatoarele care ruleaz astfel de fiiere. Cnd ai instalat
Java, implicit ai instalat i maina virtual Java. De altfel, maina virtual
Java poate fi instalat i n absena mediului de dezvoltare Java.
Un fiier n byte-code (extensia .class) poate fi rulat pe orice calculator,
indiferent de sistemul de operare pe care-l are, dac are instalat maina
virtual Java. Practic, se ia prima instruciune din fiierul byte-code, este
tradus n instruciuni ale calculatorului pe care ruleaz aplicaia i acestea
din urm sunt executate; se ia o a doua instruciune din byte-code care se
traduce i se ruleaz, .a.m.d.
Se poate observa c Java are i un compilator care traduce sursa n
byte-code (javac.exe) dar i un interpreter care traduce i execut
fiecare instruciune din byte-code n instruciuni ale calculatorului pe care se
execut aplicaia.
Observaie ! Datorit faptului c Java este nzestrat cu interpreter (ia o
instruciune, o traduce i o execut, apoi alt instruciune, o traduce i o execut,
...), programele se execut mai lent. Acest fapt este compensat de procesoarele
din ce n ce mai performante, dar i de performanele interpreter-ului.

6.4. Tipuri de aplicaii Java

n Java exist trei tipuri de aplicaii:

1. Aplicaii de sine stttoare (stand-alone). Acestea sunt precum aplicaiile


studiate n Pascal sau C++: se ruleaz pe un anumit calculator.
2. Aplicaii care se ruleaz pe partea de client (applet-uri). Un applet este
alctuit dintr-unul sau mai multe fiiere cu extensia .class i este utilizat n cadrul
paginilor web. Practic, el este ataat textului HTML, la fel cum se ataeaz o
imagine, iar fiierele care-l alctuiesc se transfer pe site. El este adus pe
calculatorul clientului atunci cnd se apeleaz pagina respectiv i este executat
prin intermediul browser-ului.
3. Aplicaii care se execut pe partea de server (servlet-uri).
222 Manual de Informatic pentru clasa a XII-a

6.5. Comentarii

n Java, se pot introduce comentarii oriunde dorim, la fel ca i n cazul


limbajului C++. Ele sunt de dou feluri:
1. Comentariile la nivel de linie: // tot ce urmeaz dup ele, pe linia celor
dou caractere, este considerat comentariu.
2. Comentarii pe mai multe linii se gsesc ntre /* i */.

Exemplul 6.1. Cod surs care conine comentarii:


class prima { // un comentariu
public static void main(String[] args) {
/* Acesta
este alt comentariu */
System.out.println("Acesta este primul program Java");
}
}

6.6. Afiarea irurilor de caractere

Pentru afiarea datelor vom utiliza dou metode:


1. System.out.print(sir_de_caractere);
2. System.out.println(sir_de_caractere);

Ambele metode afieaz irul de caractere cutat. Diferena dintre ele este
dat de faptul c dup afiare: n primul caz, cursorul rmne pe rndul curent
(dup ultimul caracter scris), iar n cazul al doilea, dup ce s-a scris irul de
caractere, cursorul trece pe linia urmtoare.

6.7. Tipuri de date

n teoria clasic a limbajelor de programare, prin tip de date se nelege:


o mulime de valori;
o mulime de operaii definite pe mulimea valorilor.

Limbajul Java extinde noiunea de tip de date, la aceea de tip. Aici se


lucreaz cu clase, care descriu ntr-o unic structur att date ct i metode
(funcii). Obiectele sunt instanieri ale claselor, deci fiecare obiect conine att date
Capitolul 6. Iniiere n utilizarea limbajului Java 223
ct i metode. Asupra acestor probleme vom reveni, dar reinei faptul c, n Java,
prin tip vom nelege o clas, iar un obiect are un anumit tip dac rezult ca
instaniere a unei clase.
Totui, limbajul Java utilizeaz i tipuri n sens clasic, vezi prima definiie.
Pentru a nu se crea confuzii, aceste tipuri se numesc tipuri primitive. Astfel, avem
tipuri de date primitive i tipuri referin.

6.7.1. Tipurile de date primitive

a) Tipuri ntregi

Octei
Tip Numere ntregi din intervalul
ocupai
byte 1 [-128,127]
short 2 [-32768,32768]
int 4 [-2147483648, +2147483647]
long 8 [-9223372036854775808,9223372036854775807]

Tabelul 6.1. Tipuri de date ntregi

Exemplul 6.2. Declarm i afim mai multe variabile de tip ntreg:


short t=32767;
byte z=-128, x=15;
int a=100000;

b) Tipuri reale

Tip Octei ocupai Modulul valorilor ntre


float 4 [3.410-38, 3.41038]
double 8 [1.710-308,1.710308]

Tabelul 6.2. Tipuri de date reale

Pentru iniializarea tipurilor reale se folosesc literali.

Observaie ! Pentru tipul real float, literalii trebuie urmai n mod obligatoriu de
litera f. Excepie fac literalii care reprezint valori ntregi.

Exemplul 6.3. Privii iniializrile de mai jos:


1. float a=3,b=2.5f,c=-7,d=3E2f,g=-2.4E-2f; Valorile cu care am
iniializat variabilele sunt: 3, 2, 2.5, -7, 3102, -2.410-2.
Aceleai valori se folosesc pentru a iniializa variabile de tip double:
2. double a=3,b=2.5,c=-7,d=3E2,g=-2.4E-2;
224 Manual de Informatic pentru clasa a XII-a

c) Tipul char
O variabil de tipul char reine un caracter. n Pascal, C/C++, caracterele
sunt reinute prin utilizarea codului ASCII. n Java, codul utilizat pentru
memorarea caracterelor este Unicode i, n acest cod, un caracter ocup 2 octei.

Exemplul 6.4. Mai jos, putei observa declaraia a trei variabile de tip char:
char a='m', b='\u006d', c=109;
System.out.println(a); System.out.println(b);
System.out.println(c);

Toate variabilele rein caracterul m. Prima dat, caracterul este declarat n


mod clasic, iar a doua oar, este declarat prin codul su n hexa i a treia oar este
declarat n zecimal. Cele afirmate sunt probate prin afiare, pentru c se afieaz
de trei ori m.
Caracterele se pot declara sub form de coduri escape:

Caracter Semnificaie
\\ backslash
\n newline
\' apostrof
\ ghilimele
\r carriage return
\t tab
\f salt la pagin nou

Tabelul 6.3. Tipuri de caractere sub form escape

Exemplul 6.5. Privii declaraiile de mai jos:


1. char a='\''; am declarat caracterul apostrof. Dac am ncerca s
declarm acest caracter prin char a='''; primim eroare de sintax.
2. char b='\n'; am declarat caracterul newline. Dac se afieaz acest
caracter, cursorul sare pe linia urmtoare.
3. char c='\\'; am declarat caracterul backslash. Dac am ncerca s
declarm acest caracter prin char a='\'; primim eroare de sintax.

d) Tipul boolean
O variabil de acest tip poate reine la un moment dat, una din cele dou
valori: false (fals) sau true (adevrat).
Exemplul 6.6. Se declar, se iniializeaz i se afieaz coninutul unei variabile
de tip boolean:
boolean c=true; System.out.println(c);
Observaie ! Metodele System.out.print() i System.out.println()
permit afiarea tuturor tipurilor primitive.
Capitolul 6. Iniiere n utilizarea limbajului Java 225

6.7.2. Tipul referin

O variabil de tip referin reine o referin (adres) ctre un obiect. Cu


ajutorul referinei, putem accesa datele membru i metodele obiectului. Numele
tipului unei astfel de variabile coincide cu numele clasei. Cum obiectele sunt
instanieri ale claselor i cum putem proiecta o infinitate de clase, nseamn c
exist o infinitate de tipuri referin. Prin abuz de limbaj, vom spune despre o
variabil care poate reine o referin ctre un anumit obiect c este de tip
referin. Orice variabil de tip referin poate reine valoarea null. Ea are
semnificaia de nici o referin.

6.7.3. Observaii importante

Cu ajutorul celor dou metode:


System.out.print() i System.out.println(),
putem afia coninuturile variabilelor de un tip primitiv. Mai avem de precizat dou
lucruri eseniale:
a. Dac n corpul unei metode, n exemplu main(), se gsete o variabil
neiniializat i se ncearc afiarea coninutului pe care l are, tentativa este
sancionat prin eroare de sintax. Vedei mai jos:
int i; System.out.println(i);
b. Avem posibilitatea de a afia mai multe variabile pe aceeai linie. Aceasta se
obine prin convertirea coninutului variabilelor n iruri de caractere i
concatenarea irurilor cu ajutorul operatorului +. Vedei exemplul de mai jos
care afieaz pe o linie a=2 b=4.5:
int a=2; float b=4.5f;
System.out.println("a="+a+" b="+b);

6.8. Operatori
n acest paragraf vor fi prezentai operatorii utilizai n Java.

6.8.1. Operatori aritmetici


Exist urmtorii operatori aritmetici:
- minus (unar, adic acioneaz asupra unui singur operand);
+ plus (unar);
+ (binar), pentru adunare;
226 Manual de Informatic pentru clasa a XII-a

- (binar), pentru scdere;


* (binar), are semnificaia de nmulire;
/ (binar), pentru mprire;
% (binar) restul mpririi ntregi.

Observaii !
Operatorul '/' (mprire) acioneaz n mod diferit n funcie de operanzi:
a) dac ambii sunt de tip ntreg, rezultatul este ntreg i are semnificaia de
mprire ntreag. Cu toate acestea, rezultatul este corect (din punct de
vedere matematic) numai dac valorile care se mpart sunt pozitive.
b) dac cel puin un operand este de unul din tipurile reale rezultatul este
real (se efectueaz mprirea obinuit).
Operatorul '%' acioneaz numai asupra operanzilor de tip ntreg. Rezultatul
obinut este corect din punct de vedere matematic numai dac ambii
operanzi sunt numere naturale.
n cazul n care se mpart dou valori ntregi se procedeaz astfel:
se face mprirea ntreag a celor dou valori care sunt
considerate n modul;
semnul ctului se stabilete dup regula semnelor (+ cu + rezult
+, + cu -, rezult -), etc.
n cazul operatorului '%', se face mprirea ca anterior (se obine
C), iar restul se obine dup formula R=D-C.
se pot utiliza oricte perechi de paranteze rotunde, pentru a
impune ca anumite operaii s se fac prioritar.

Exemplul 6.7. Fie declaraia: int a=10;. Atunci expresia 4*a/3 este de tip int
i la evaluare se obine 13. S-a nmulit 4 cu coninutul variabilei a (10) i s-a
obinut 40. Apoi, 40/3=13 (a fost efectuat mprirea ntreag). n aceleai
condiii, expresia 4*(a/3) are ca rezultat numrul 12. La nceput s-a efectuat
a/3 i s-a obinut 3, apoi 4*3=12. Iat un exemplu n care se observ faptul c
una este o expresie la matematic, i alta n Java.
Exemplul 6.8. Fie declaraia: float a=10;. Expresia 4*(a/3) are rezultatul
13.3333, la fel ca expresia 4*a/3. De aceast dat, s-a efectuat mprirea a
dou numere reale.
Exemplul 6.9. Fie declaraia: int a= -10;. Atunci expresia a%3 are ca rezultat
numrul -1.
Exemplul 6.10. Fie declaraia: int a=-10;. Atunci expresia a*-3 are ca rezultat
numrul 30.
Capitolul 6. Iniiere n utilizarea limbajului Java 227

Exemplul 6.11. Fie declaraiile: int a=10; char b=2; float c=5;. Atunci
expresia: a+b+c are rezultatul 17.0.

n exemple, apare o problem foarte important: care este tipul rezultatului,


n cazul n care o expresie aritmetic are operanzi de mai multe tipuri? Problema
de mai sus se numete problema conversiilor aritmetice implicite (dup cum
vom vedea, conversiile se pot face i explicit).

Regula general este: se convertete unul din operanzi ctre tipul


celuilalt (mai cuprinztor). De exemplu, dac unul din operanzi este de tip int,
iar cellalt de tip float, rezultatul va fi de tip float.

Observaie ! Fr o conversie prealabil, operatorii aritmetici nu acioneaz


asupra variabilelor de tip char. De exemplu, secvena char x=1; x=x+1; este
eronat din punct de vedere sintactic.

6.8.2. Operatori relaionali

n Java exist urmtorii operatori relaionali:


< (mai mic);
<= (mai mic sau egal);
> (mai mare);
>= (mai mare sau egal).

ntruct n Java exist valorile logice true i false, rezultatul unei operaii
logice este una dintre aceste valori.
Exemplul 6.12. Analizai expresiile de mai jos:
3>5 - expresia ia valoarea false;
3<5 - expresia ia valoarea true;
3+7>=11-1 - expresia ia valoarea true (este posibil s scriem astfel de expresii,
ntruct operatorii relaionali au o prioritate mai mic dect operatorul aditiv).

6.8.3. Operatori de egalitate

Operatorii de egalitate sunt:


== pentru egalitate;
!= pentru inegalitate.

Ca i operatorii relaionali, expresiile de acest tip returneaz 0 sau 1, n


funcie de modul n care este respectat sau nu egalitatea (inegalitatea).

Exemplul 6.13. Expresiile: 3==3 are ca rezultat true; 3!=3 are ca rezultat false.
228 Manual de Informatic pentru clasa a XII-a

6.8.4. Operatorii de incrementare i decrementare

Aceti operatori sunt unari i au rolul de a incrementa (adun 1) sau de a


decrementa (scad 1) coninutul unei variabile. Operatorii sunt:
++ pentru incrementare;
-- pentru decrementare.
Operatorii pot fi prefixai (aplicai n faa operandului) sau postfixai (aplicai
dup operand). Exemplu: fie a o variabil de tip int.
Operatorul de incrementare prefixat aplicat variabilei a este ++a.
Operatorul de incrementare postfixat aplicat variabilei a este a++.
Operatorul de decrementare prefixat aplicat variabilei a este -a.
Operatorul de decrementare postfixat aplicat variabilei a este a--.
Care este diferena ntre efectul unui operator aplicat prefixat sau postfixat?
S ne gndim la faptul c pot fi expresii care conin i ali operatori n afara celor
de incrementare (decrementare).

Dac operatorul este prefixat, variabila este incrementat (decrementat)


nainte ca valoarea reinut de ea s intre n calcul.

Dac operatorul este postfixat, variabila este incrementat (decrementat)


dup ce valoarea reinut de ea intr n calcul.

Exemplul 6.14. Fie a o variabil de tip int care reine valoarea 1. n urma evalurii
expresiei 1+a++ se obine valoarea 2, dar dup evaluare, a va reine valoarea 2
(variabila a fost incrementat dup ce valoarea reinut de ea a intrat n calcul).

Exemplul 6.15. La fel ca n cazul anterior, expresia 1-++a produce valoarea -1


(variabila a fost nti incrementat, s-a obinut 2, apoi s-a efectuat 1-2).

6.8.5. Operatori logici

Exist trei tipuri de operatori logici care acioneaz asupra datelor de tip
boolean:
! negare logic;
&& i logic;
|| sau logic.

Aceti operatori se aplic oricrei variabile i constante de tip logic.


Operatorul negare logic acioneaz astfel: dac operandul este o valoare
true, rezultatul este false, altfel rezultatul este true.
Operatorul i logic (binar) acioneaz astfel: dac ambii operanzi sunt true
rezultatul este true, altfel el este false.
Capitolul 6. Iniiere n utilizarea limbajului Java 229

Operatorul sau logic (binar) acioneaz astfel: dac cel puin unul din
operanzi este true, rezultatul este true, altfel rezultatul este false.

Exemplul 6.16. n condiiile: boolean a=true, b=false;


!a returneaz false;
a||b returneaz true;
a&&b returneaz false;
Operatorii logici binari garanteaz modul n care se trateaz operanzii - nti
cel din stnga, apoi (dac este cazul) cei din dreapta. Astfel, dac operandul din
stnga este true, operatorul sau logic nu mai acioneaz asupra operandului din
dreapta (este clar c rezultatul este true). Tot aa, dac operandul din stnga
este false, operatorul i logic nu mai evalueaz operandul din dreapta (oricum
rezultatul este false). Observaia este foarte important pentru cazul n care al
doilea argument este funcie (metod) de tip boolean.

6.8.6. Operatori logici pe bii

Limbajul Java este dotat cu un set de operatori care permit accesul la bit.
Acetia sunt:
<<, >>, >>> operatori de deplasare;
& i pe bii;
| sau pe bii;
^ sau exclusiv pe bii;
~ negare pe bii (operator unar).

Aceti operatori acioneaz numai asupra operanzilor de tip ntreg.

Operatorul << este binar. El are rolul de a deplasa ctre stnga coninutul tuturor
biilor operandului din stnga sa, cu un numr de poziii egal cu valoarea reinut
de al doilea operand. Poziiile rmase libere (n dreapta) vor reine valoarea 0.
Dac al doilea operand reine valoarea m, o astfel de deplasare este echivalent cu
nmulirea cu 2m (evident, dac m este mai mic dect numrul de bii rezervat
primului operand).
Operatorul >> este binar. El are rolul de a deplasa ctre dreapta coninutul tuturor
biilor operandului din stnga cu un numr de poziii egal cu valoarea reinut de al
doilea operand. Atenie: n poziiile din stnga, rmase libere dup deplasare, se
copiaz coninutul bitului de semn (acesta reine 1 n cazul numerelor negative i
0, n cazul numerelor pozitive). Dac operandul din stnga este un ntreg pozitiv,
poziiile rmase libere (n stnga) vor reine valoarea 0. n cazul ntregilor pozitivi,
dac al doilea operand reine valoarea m, o astfel de deplasare este echivalent cu
mprirea ntreag cu 2m.
Operatorul >>> acioneaz la fel ca i operatorul >>, dar diferena este dat de
faptul c poziiile rmase libere din dreapta vor reine 0.
230 Manual de Informatic pentru clasa a XII-a

Atenie ! Operatorii de deplasare sunt utilizai doar pentru evaluarea expresiilor,


operanzii, chiar dac sunt variabile, rmn nemodificai! Desigur, valorile astfel
obinute pot fi atribuite. Aceasta nseamn de fapt acces la bit.
n cazul operatorilor binari &, ^, |, rezultatul se obine aplicnd pentru fiecare
pereche de bii aflai pe aceeai poziie regulile din tabelul urmtor:

OP1 OP2 OP1&OP2 OP1^OP2 OP1|OP2


0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 0 1
Tabelul 6.4. Rezultatele operatorilor binari

Operatorul ~ (negare pe bii) are rolul de a inversa coninutul biilor (dac un


bit conine 0 va conine 1 i invers).
Exemplul 6.17. Dac a este de tip int i reine 3, iar b este de acelai tip i reine
1, atunci:
a&b returneaz 1;
a|b returneaz 3;
a^b returneaz 2;
a<<2 returneaz 6;
a>>1 returneaz 1;
~a returneaz -4.

6.8.7. Operatori de atribuire

n Java atribuirea este operator, dar dup cum vom vedea, este i
instruciune. n plus, avem mai muli operatori de atribuire. Operatorul '=' se
folosete ntr-o expresie de forma:
v=expresie
Aici, v este o variabil.

Principiul de executare este urmtorul:


se evalueaz expresia;
variabilei v i se atribuie valoarea obinut (dac este cazul se
efectueaz conversia respectiv).

Se pot efectua i atribuiri multiple de forma:


v=v1=v2=...=vn=expresie,
unde v, v1, v2, ..., vn sunt variabile.
Capitolul 6. Iniiere n utilizarea limbajului Java 231

n acest caz, principiul de executare este urmtorul:

se evalueaz expresia;
valoarea obinut este atribuit variabilei vn (eventual convertit, dac
este cazul);
coninutul variabilei vn este atribuit variabilei vn-1 (eventual se
efectueaz conversia necesar);
...
coninutul variabilei v1 este atribuit variabilei v (eventual se efectueaz
conversia necesar).
Acest operator se asociaz de la dreapta la stnga. Ce am prezentat anterior
evideniaz acest lucru.
Pentru atribuiri se mai pot utiliza i operatorii: *=, /=, %=, +=, -=, <<=,
>>=, &>, ^=, |=.

O atribuire de forma: v op=expresie, are acelai rezultat ca


v=v op expresie
(diferena este c n primul caz se genereaz un cod main eficient).

Observaie! Am vzut c atribuirea este un operator care figureaz ntr-o expresie.


Ca orice expresie, aceasta are o valoare rezultat n urma evalurii. n cazul
atribuirilor, valoarea rezultat este valoarea atribuit variabilei care este prima din
stnga, (ntr-un ir de atribuiri, eventual dup conversie).
Exemplul 6.18. Fie declaraiile: int a=5, b=3; float c;. n urma atribuirii
c=a/b, c va conine valoarea real 1.0. Este normal s fie aa ntruct expresia
a/b este de tip int (se efectueaz mprirea ntreag i se obine 1), apoi
aceast valoare este atribuit variabilei c (dup ce este convertit).

Exemplul 6.19. Fie declaraiile: int a,b; float c; i expresia c=a=b=1.


Dup evaluare, a reine 1, b reine 1, c reine 1.0, iar valoarea rezultat n urma
evalurii este 1.0 (real).

Exemplul 6.20. Fie declaraia: int a=3; i expresia a*=2. n urma evalurii, a
reine valoarea 6, iar expresia va produce valoarea de tip int 6.

Observaie foarte important ! Sunt permise doar atribuiri n care tipul variabilei
creia i se atribuie coninutul unei variabile de alt tip, conine, printre valorile
permise, cele ale tipului variabilei care este atribuit.

Exemplul 6.21. Fie declaraiile: long a=2; int b=3;


a=b; // corect
b=a; // incorect
232 Manual de Informatic pentru clasa a XII-a

Exemplul 6.22. Fie declaraiile: char a=2; int b=3;


b=a; //corect
a=b; //incorect

Exemplul 6.23. Fie declaraiile: float a=2; int b=3;


a=b; //corect
b=a; //incorect

Exemplul 6.24. Fie declaraiile: float a=2; double b=3;


b=a; //corect
a=b; //incorect

Observaie ! Dup cum observai, aici apare o diferen fa de C/C++. Java, ca


i Pascal-ul, ncearc s te fereasc de erori ascunse, rezultate n urma
conversiilor implicite.

6.8.8. Operatorul condiional

Se folosete n expresii de genul:


exp1?exp2:exp3

Cerina este ca exp1 s fie de tipul boolean. Principiul de executare este urmtorul:
se evalueaz exp1;
dac aceasta produce true, se evalueaz exp2 i exp3 este ignorat
(nu se evalueaz);
altfel, se evalueaz exp3 i exp2 este ignorat.

n ansamblu, expresia este de tipul lui exp2 sau exp3 i produce valoarea
exp2 sau exp3 (n funcie de cea care se evalueaz).

Exemplul 6.25. Variabila c ia valoarea 5 (valoarea maxim).


int a=1, b=5, c;
c=a>b?a:b;

Exemplul 6.26. Se afieaz valoarea 5.


int a=1, b=5, c;
System.out.println(a>b?a:b);

Exemplul 6.27. Variabila h ia valoarea 9. Aici se observ c nu este obligatoriu ca


exp2 i exp3 s aib acelai tip:
int a=1, b=5; float d=9,h;
h=a>b?a:d;
Capitolul 6. Iniiere n utilizarea limbajului Java 233

6.8.9. Operatorul de conversie explicit

De multe ori, vrem ca unul sau mai muli operanzi s intre n calcul convertii
aa cum dorim (nu implicit). Pentru aceasta, naintea operandului se trece ntre
paranteze tipul su.

Exemplul 6.28. Variabila a ia valoarea 9. Iat c, dei implicit conversia nu poate fi


realizat, n acest mod s-a efectuat fr probleme.
int a=1; double d=9.6;
a=(int)d;

Exemplul 6.29. Se afieaz 0.5. Iat c, dei operanzii sunt ntregi i rezultatul ar
trebui s fie 0, prin utilizarea operatorului de conversie explicit se obine rezultatul
corect.
int a=3, b=6;
System.out.println((float) a/b);

6.8.10. Prioritatea (precedena) operatorilor

Operatorii au o anumit prioritate (preceden). Mai jos, sunt prezentai


operatorii n ordinea descresctoare a prioritii:

1) (), . , []
2) ++, --, +(unar),(unar),!, new, operatorul de conversie explicit
3) *, /, %
4) +, - (privii ca operatori binari)
5) <<, >>, >>>
6) <, <=, >, >=
7) ==, !=
8) &
9) ^
10) |
11) &&
12) ||
13) ?:
14) =, +=, etc (operatori de atribuire)
234 Manual de Informatic pentru clasa a XII-a

6.9. Instruciuni

6.9.1. Instruciunea vid

Instruciunea nu face nimic, dar are sens n programul Java, dup cum va
rezulta din studiul altor instruciuni. Instruciunea vid se marcheaz prin ;.

6.9.2. Instruciunea compus

Se utilizeaz atunci cnd se dorete ca mai multe instruciuni s fie


considerate ca o singur instruciune.

Exemplul 6.30. Mai jos, putei observa o instruciune compus care subordoneaz
mai multe instruciuni vide.
{
;
;
;
}

6.9.3. Instruciunile de incrementare i de decrementare

Se utilizeaz pentru a incrementa sau decrementa o anumit variabil.

Exemplul 6.31. Diverse incrementri/decrementri: a++; ++a; a--; --a;.

Observaie ! Exist o diferen ntre operatorii de incrementare (decrementare) i


instruciunea de incrementare (decrementare). Instruciunea de incrementare
(decrementare) conine numai un operator de incrementare (decrementare), dar de
exemplu, b=++a+1 este o instruciune (atribuire, vezi mai jos) care conine i un
operator de incrementare.

6.9.4. Instruciunea de atribuire

Conine o expresie prin care unei variabile i se atribuie o alt expresie (aflat
n dreapta operatorului de atribuire).
Exemplul 6.32. Analizai atribuirile urmtoare:
a) int a, b=6;
a=b+5; // dup atribuire a reine 11.
Capitolul 6. Iniiere n utilizarea limbajului Java 235

b) int a, b=6;
a=++b+5; // dup atribuire a reine 12.
c) int a=1, b=6;
a+=b; // dup atribuire a reine 7.
d) a=b=c=1; // a, b, c sunt de tip int.

Exemplul 6.33. Iat o atribuire multipl. Iniial, c ia valoarea 1, apoi b=c, atunci
b=1, apoi a=b, deci a=1. Dup atribuire a, b, i c rein 1.

Observaii !
Nu sunt permise atribuiri de genul: ++a=b+5;.
Exist o diferen ntre operatorul de atribuire i instruciunea de atribuire.
De exemplu, a=b=c=1 este o instruciune de atribuire, dar conine 3
operatori (de atribuire). Practic, o instruciune de atribuire conine cel puin
un operator de atribuire.

6.9.5. Instruciunea IF

Aceast instruciune are dou forme:

Forma 1.
if (expresie de tip boolean) instruciune1 else instruciune2

Principiul de executare este urmtorul:

se evalueaz expresia;
dac valoarea produs de aceasta este true, se execut
instruciune1;
dac valoarea produs este false se execut instruciune2.

Forma 2.
if (expresie de tip boolean) instruciune

Principiul de executare este urmtorul:

se evalueaz expresia;
dac valoarea produs de aceasta este true, se execut
instruciunea subordonat, altfel se trece la cea urmtoare.

Exemplul 6.34. Se afieaz cea mai mare valoare dintre valorile reinute de
variabilele a i b:
if (a>b) System.out.println(a);
else System.out.println(b);
236 Manual de Informatic pentru clasa a XII-a

Exemplul 6.35. Se rezolv ecuaia ax+b=0, unde pentru valorile lui a i b sunt
reinute variabilele cu acelai nume.
if (a!=0)
{ x=-b/a;
System.out.println(x); }
else
if (b==0) System.out.println("infinitate de solutii");
else System.out.println("nu are solutie");

6.9.6. Instruciunea WHILE

Forma general a acestei instruciuni este:


while (expresie de tip boolean) instruciune

Principiul de executare este urmtorul:

Se evalueaz expresia;
Dac valoarea produs de aceasta este true, se execut instruciunea
subordonat, apoi se revine la evaluarea expresiei, altfel se trece la
instruciunea urmtoare.

Exemplul 6.36. Pentru n>0, numr natural, s se calculeze suma cifrelor sale
(pentru n=213, se va afia 6):
int n=213,s=0;
while (n!=0)
{ s+=n%10;
n/=10;
}
System.out.println(s);

6.9.7. Instruciunea DO WHILE

Forma general a acestei instruciuni este urmtoarea:


do
instruciune
while(expresie);

Principiul de executare este urmtorul:

Se execut instruciunea subordonat;


Se evalueaz expresia. n cazul n care valoarea produs la evaluare
este false, executarea instruciunii do while se termin, altfel se
trece la pasul anterior.
Capitolul 6. Iniiere n utilizarea limbajului Java 237

Observaie ! Secvena se execut cel puin o dat, dup care se pune problema
dac s se repete sau nu (prin evaluarea expresiei logice).

Exemplul 6.37. Se d un numr natural n, mai mare sau egal cu 1. S se


calculeze suma primelor n numere naturale nenule.
int n=10,s=0,i=1;
do
{ s=s+i;
i=i+1;
} while (i<=n);
System.out.println(s);

6.9.8. Instruciunea FOR

Instruciunea FOR are forma general:


for(expresieiniializare;expresietest;expresieincrementare)
instruciune

Dup cum se vede, ntre paranteze se gsesc 3 expresii:


Expresieinitializare se folosete de regul pentru iniializarea variabilei de
ciclare. Este de remarcat faptul c n cadrul acestei expresii (cu rol special)
este posibil chiar s declarm variabila de ciclare (cu valoare iniial).
Expresietest este de tip boolean i se folosete pentru a testa dac se
execut instruciunea subordonat - dac expresia produce la evaluare
true, instruciunea subordonat for se execut.
Expresieincrementare se folosete pentru incrementarea variabilei de ciclare.

Principiul de executare este:


P1. Se evalueaz expresieiniializare (un caz special este cnd aceasta
conine i declaraia variabilei de ciclare);
P2. Se evalueaz expresietest. n cazul n care aceasta produce true, se
execut instruciunea subordonat for; apoi se trece la P3, altfel se trece la
instruciunea urmtoare (se termin executarea instruciunii for).
P3. Se evalueaz expresia de incrementare i se revine la P2.
Observaie ! Toate expresiile pot fi vide. n concluzie, expresiile de mai sus au
rolul precizat n mod normal - dar nu obligatoriu i nici restrictiv. De exemplu, dac
expresietest este vid, se execut un ciclu infinit for(;;) instruciune.

Exemplul 6.38. Se afieaz numerele, 10, 9, ..., 1, fiecare pe cte un rnd.


Observai faptul c variabila i a fost declarat n cadrul ciclului for.
for (int i=10;i>=1;i--) System.out.println(i);
238 Manual de Informatic pentru clasa a XII-a

Exemplul 6.39. Se afieaz alfabetul, de la a la z i pentru fiecare caracter se


afieaz i codul su:
for (char c='a';c<='z';c++)
System.out.println(c+" "+(int)c);

6.9.9. Instruciunea BREAK

Are rolul de a fora ieirea dintr-un ciclu. n cazul n care exist cicluri
imbricate (un ciclu n interiorul altui ciclu), foreaz doar ieirea din primul ciclu
(vezi secvena urmtoare, unde for-ul dup j se execut doar pentru j=1). Se
folosete pentru instruciunile for, while, do while i n particular, pentru
switch (cazul va fi studiat separat).

Exemplul 6.40. Analizai secvena de mai jos: Se afieaz:


for (int i=1;i<=4;i++) 1 1
for (int j=1;j<=4;j++) 2 1
if (j==2) break; 3 1
else System.out.println(i+" "+j); 4 1

6.9.10. Instruciunea CONTINUE

Instruciunea este folosit n cazul ciclurilor (for, while, do while) i are


rolul de a determina ca, dup executarea ei, s se sar direct la testul condiiei de
continuare. Astfel, se ignor instruciunile care i urmeaz n secvena care se
repet.

Exemplul 6.41. Secvena urmtoare afieaz: 1, 3, 4. Dac i ia valoarea 2,


atunci se execut continue i se sare peste apelul metodei de afiare.
for (int i=1;i<=4;i++)
{ if (i==2) continue;
System.out.println (i);}

6.9.11. Instruciunea SWITCH

Instruciunea are forma particular:


switch (expresie)
{ case exp1: secven instruciuni1; break;
case exp2: secven instruciuni2; break;
.................................
case expn: secven instruciunin; break;
[default: secven instruciunin+1];
}
Capitolul 6. Iniiere n utilizarea limbajului Java 239

unde:
expresie are semnificaia: expresie de tip ntreg (sau char);
expi : sunt expresii constante de tip ntreg (sau char);
instruciunii reprezint o secven oarecare de instruciuni.

Principiul de executare este:


se evalueaz expresia;
dac aceasta produce o valoare egal cu cea produs de expi, se
execut n ordine instruciunii i se trece la instruciunea urmtoare,
altfel se execut numai secvena instruciunin+1.

Observaie ! Alternativa default este facultativ. n absen, n cazul n care nu


exist coinciden de valori, se trece la instruciunea urmtoare.

Exemplul 6.42. Secvena care urmeaz probeaz instruciunea switch. Se va


afia 1:
int i =1;
switch(i)
{ case 1: System.out.println(1);break;
case 2: System.out.println(2);break;
default: System.out.println("altceva");
}

Observaie ! Am prezentat o form simplificat a instruciunii switch, mai precis,


cea corespunztoare programrii structurate. n absena instruciunii break, n
cazul n care exist egalitate ntre expresie i expi se execut secvena
corespunztoare i, pe rnd, toate secvenele care urmeaz, .a.m.d.

Exemplul 6.43. Secvena care urmeaz afieaz: 2, altceva:


int i =2;
switch(i)
{ case 1: System.out.println(1);
case 2: System.out.println(2);
default: System.out.println("altceva");
}

Observaie ! n forma general, instruciunea switch are rolul de a stabili mai


multe puncte de intrare ntr-o secven de instruciuni, n funcie de valoarea pe
care o reine expresie.

6.9.12. Instruciunea apel metod (funcie)

Aceasta va fi tratat la momentul potrivit. Pentru moment, putem da ca


exemplu doar System.out.print() sau System.out.println().
240 Manual de Informatic pentru clasa a XII-a

6.9.13. Instruciunea de declarare a variabilelor

Pn n prezent, am ntlnit-o de multe ori. Ea poate fi plasat oriunde n


corpul unei metode (funcii).

Exemplul 6.44. Instruciunea int x=2,y.

6.10. Masive

n Java exist un mecanism excepional de lucru cu masive (vectori,


matrice, etc). Din motive didactice, pentru nceput, vom prezenta declararea
masivelor n doi pai:

Pasul 1. Se declar o variabil care poate reine o referin (adres) ctre vector,
matrice, etc.
Exemplul 6.45. Analizai declaraiile de mai jos:
a) int[] V; am declarat o variabil referin ctre un vector cu componente de
tip int. O declaraie echivalent poate fi fcut prin: int V[];.
b) int[][] Mat; am declarat o variabil referin ctre o matrice cu
componente de tip int.
c) float[] V, V1; am declarat dou variabile referin ctre vectori, numite
V, respectiv V1. Ambii vectori au componente de tip float.
d) float Mat[][],Mat1[][]; am declarat dou variabile de tip referin
ctre matrice. Cele dou variabile se numesc Mat i Mat1.

Pasul 2. Alocm spaiu n memorie pentru masiv (vector, matrice). Adresa


vectorului va fi reinut n variabila V.

Exemplul 6.46. Urmrii exemplele de mai jos:


a) V=new int[4];. Am alocat spaiu n memorie pentru un vector cu 4
componente de tip int (practic am creat vectorul). Referina ctre el va fi reinut
n V i pornind de la aceast variabil putem accesa V.
b) Mat=new int [4][3];. Am alocat spaiu n memorie pentru o matrice cu 4
linii i 3 coloane cu componente de tip int.

Prima component a unui vector are indicele 0, a doua indicele 1 .a.m.d.


Tot aa, liniile unei matrice se numeroteaz ncepnd cu 0, coloanele unei
matrice se numeroteaz ncepnd cu 0.
Capitolul 6. Iniiere n utilizarea limbajului Java 241

O component a unui vector se adreseaz pornind de la referin i scriind


indicele ntre paranteze drepte (exemplu V[3]). O component a unei
matrice se adreseaz pornind de la referin si scriind ntre paranteze
ptrate fiecare din cei doi indici (exemplu Mat[2][1]).

Exemplul 6.47. n secvena urmtoare se creeaz un vector, se iniializeaz


fiecare component a lui i se afieaz:
int[] V; // sau int V[];
V=new int[4]; int i;
for (i=0;i<4;i++) V[i]=i+1;
for (i=0;i<4;i++) System.out.println(V[i]);

Schema alturat reflect


modul n care arat vectorul, V 1 2 3 4
dup ce i-am iniializat 0 1 2 3
componentele.
referina
Figura 6.6. Vectorul dup
ce a fost iniializat

Vectorii se pot declara i aa cum se vede mai jos, gata iniializai. n urma
unei astfel de declaraii se poate lucra direct cu ei, exact ca anterior.
int[] V={1,2,3,4}; int i;
for (i=0;i<4;i++) V[i]=i+1;
for (i=0;i<4;i++) System.out.println(V[i]);

Exemplul 6.48. n secvena urmtoare se creeaz o matrice, se iniializeaz


fiecare component a ei i se afieaz:
int[][] Mat;
int i,j;
Mat=new int [4][3];
for (i=0;i<4;i++)
for (j=0;j<3;j++) Mat[i][j]=i+j;
for (i=0;i<4;i++)
{ for (j=0;j<3;j++) System.out.print(Mat[i][j]+" ");
System.out.println();
}

Ca i vectorii, matricele se pot declara i aa cum se vede mai jos, gata


iniializate. n urma unei astfel de declaraii se poate lucra direct cu ele, exact
ca anterior.

int[][] Mat={{1,2,3,4},{3,4,5,6}};
int i,j;
for (i=0;i<2;i++)
{ for (j=0;j<3;j++) System.out.print(Mat[i][j]+" ");
System.out.println();
}
242 Manual de Informatic pentru clasa a XII-a

Declararea unui masiv se poate face i ntr-un singur pas, ca mai jos:
float[] V=new float[4];

De vreme ce numele masivului (V, Mat, n exemplele date) reine o referin


ctre masiv, nseamn c unei astfel de variabile i se poate atribui o referin
ctre alt masiv, ceea ce este echivalent cu faptul c atribuirea funcioneaz
n cazul masivelor ca n cazul variabilelor de unul din tipurile de date primitive.
Totui, exist o diferen esenial: se atribuie doar referina, nu coninutul
masivului, care rmne nemodificat. Masivul care nu mai este referit va fi
ters, automat (fr ca, n acest scop, s fie scris o secven special).

Exemplul 6.49. Avem doi vectori, V i V1. Cei doi vectori sunt creai i iniializai.
Dup aceasta, se interschimb referinele ctre cei doi vectori i, n vederea
probrii operaiilor efectuate, se afieaz.
float[] V=new float[4], V1=new float[3], Man;
int i;
for (i=0;i<4;i++) V[i]=i+1;
for (i=0;i<3;i++) V1[i]=9;
Man=V1;
V1=V;
V=Man;
for (i=0;i<4;i++) System.out.println(V1[i]);
for (i=0;i<3;i++) System.out.println(V[i]);

Grafic, interschimbarea de mai sus se poate prezenta astfel:


dup crearea i iniializarea celor doi vectori:

V 1 2 3 4
0 1 2 3

V1 9 9 9
0 1 2
Figura 6.7. Pasul nti

dup efectuarea instruciunii Man=V1;, vom avea:

V 1 2 3 4
0 1 2 3

V1 9 9 9
0 1 2

Man

Figura 6.8. Pasul al doilea


Capitolul 6. Iniiere n utilizarea limbajului Java 243

dup efectuarea instruciunii V1=V; , vom avea:

V 1 2 3 4
0 1 2 3

V1 9 9 9
0 1 2

Man

Figura 6.9. Pasul al treilea

dup efectuarea instruciunii V=Man; , vom avea:

V 1 2 3 4
0 1 2 3

V1 9 9 9
0 1 2
Figura 6.10. Ultimul pas

O alt utilizare de excepie a acestui mecanism este aceea prin care se


declar un masiv exact cu numrul de componente dorit i nu un numr de
componente mare, care se presupune c indiferent de intrare, nu poate fi
depit (ca n Pascal, C/C++). Aceasta conduce la economie de memorie.
int n;
// se citeste n;
V=new int [n];
Dei din punct de vedere teoretic nu se poate explica n acest moment,
numrul de componente ale unui vector (masiv unidimensional) este returnat
de data membru (vom nva despre date membru) length, apelat ca mai
jos. n urma executrii acestei secvene se afieaz 10.
int[] vector=new int[10];
System.out.println(vector.length);
O matrice poate fi privit (i, de fapt asta i este) ca un vector de vectori. Fie
declaraia int Mat[][]=new int [4][5]. Putem spune c avem un
vector cu 4 componente. Fiecare component este la rndul ei, un vector cu
5 componente. Atunci, length, aplicat matricei, reine 4, i aplicat, de
exemplu, componentei de indice 2 returneaz 5. La executarea secvenei de
mai jos se afieaz 4 i 5.
int Mat[][]=new int [4][5];
System.out.println(Mat.length);
System.out.println(Mat[2].length);
244 Manual de Informatic pentru clasa a XII-a

n cazul matricelor (sau, n general, masivelor de dimensiune mai mare sau


egal cu 2) exist posibilitatea ca liniile s aib lungime diferit. Cu alte
cuvinte, o component a vectorului de vectori (matricea) poate avea un
numr de componente, alt component, alt numr de componente. n
secvena urmtoare am declarat o matrice cu 2 linii. Prima linie are 3
componente, a doua linie are dou componente. n final, se afieaz
coninutul unui element al matricei.
int Mat[][]=new int [2][];
Mat[0]=new int[3];
Mat[1]=new int[2];
Mat[0][0]=1; Mat[0][1]=2; Mat[1][0]=3;
System.out.println(Mat[0][1]);

V dai seama ct economie de memorie se face?

Aplicaie ! Secvena urmtoare creeaz, iniializeaz i afieaz o


matrice triunghiular. Alturat putei observa rezultatul rulrii. Este
ceva faptul c pentru a reine o matrice triunghiular se reine exact
att ct este necesar!
int[] vector=new int[10]; Figura 6.11.
int Mat[][]=new int [4][]; Rezultatul rulrii
int i, j, k=1;
for (i=0;i<4;i++)
{ Mat[i]=new int[i+1]; // declararea este instructiune
for (j=0;j<=i;j++) Mat[i][j]=k++;
}
for (i=0;i<4;i++)
{ for (j=0;j<Mat[i].length;j++) System.out.print(Mat[i][j]);
System.out.println();
}

6.11. Citirea datelor de la tastatur


Limbajul Java conine o mulime de faciliti, dar pentru nceptori exist o
real dificultate n a citi date de la tastatur. Ca s le nelegem cu adevrat, sunt
necesare cunotine avansate de Java. i nu putem atepta pn atunci, pentru
c este relativ dificil s prezini materia, mai ales la nivel de liceu, fr a putea citi
ceva de la tastatur. Pentru a rezolva aceast problem, s-a recurs, ca de altfel i
n alte cursuri de Java, la prezentarea unei clase prin care s putem realiza citirea
de la tastaur a irurilor de caractere.
Vom prezenta aceast clas referindu-ne doar la utilizarea ei. Ulterior, vom
prezenta modul n care a fost realizat. Clasa pe care o vom folosi se numete
cin i este urmtoarea:
Capitolul 6. Iniiere n utilizarea limbajului Java 245

import java.io.*;
public class cin {
static String linie ()
{ String sir = ""; char ch;
try
{ while ((ch = (char)System.in.read()) != 13)
sir = sir+ch;
}
catch (IOException e) {} try { System.in.read(); }
catch (IOException e) {}
return sir;
}
}
Textul de mai sus l vom introduce n fiierul cin.java. Apoi, l compilm cu
javac cin.java. n urma compilrii rezult fiierul cin.class. Acest fiier va fi
utilizat de orice program care folosete o metod din clasa cin. Dac fiierele
cin.java i cin.class se vor gsi n folder-ul bin, atunci, fr nici o problem,
utilizm aceste metode ca i cum ar fi ale limbajului Java (practic, orice program
care apeleaz clasele respective le gseste n bin).
Metoda linie() are rolul de a citi un ir de caractere introdus de la tastatur.
Rezultatul este de tip referin la String, adic referin ctre irul de
caractere citit. irul este citit cacter cu cacter. Atunci cnd utilizatorul apas
enter, se genereaz, de fapt, 2 caractere. Primul dintre ele este depistat de
metod. Pentru a elimina caracterul rezidual, se mai citeste un caracter.
Exemplul 6.50. Programul urmtor citete i afieaz o linie introdus de la
tastatur:
class test {
public static void main(String[] args) {
String l=cin.linie();
System.out.println(l);
}
}
Dac dorim s citim numai un caracter, vom utiliza metoda charAt(nr),
care returneaz caracterul aflat pe poziia nr a irului de caractere. Atenie:
primul caracter al irului are indicele 0.
Exemplul 6.51. n programul urmtor se citete i se afieaz un caracter.
Observai modul de utilizare al metodei charAt().
class test {
public static void main(String[] args) {
String l=cin.linie();
char c=l.charAt(0);
System.out.println(c);
}
}
246 Manual de Informatic pentru clasa a XII-a

Dac dorim s citim numere, este sarcina noastr s convertim rezultatul


ctre tipul dorit. Vom utiliza metode ale unor clase, numite nfurtoare,
clase care vor fi prezentate la momentul potrivit.

Metoda Integer.parseInt(sir) returneaz irul convertit ctre int.

Exemplul 6.52. Se citesc dou numere naturale a i b i se afieaz suma lor:


class test {
public static void main(String[] args) {
System.out.print("a=");
int a=Integer.parseInt(cin.linie());
System.out.print("b=");
int b=Integer.parseInt(cin.linie());
System.out.println(a+b);
}
}
Metoda Long.parseLong(sir) returneaz irul convertit ctre long.
Metoda Float.parseFloat(sir) returneaz irul convertit ctre float.

Metoda Double.parseDouble(sir) returneaz irul convertit ctre


float.

Observaie ! Nu trebuie s v ngrijorai c nu ai neles toate noiunile prezentate.


Pentru moment, luai-le ca atare. Toate vor fi studiate n amnunt. S ne mulumim
cu faptul c putem citi i afia un ir de caractere.

ntruct cunoatem deja operatorii i instruciunile i putem citi date cu


ajutorul clasei cin, de acum putem s scriem mici programe. Toate instruciunile
se vor gsi n main().

1. Se citesc dou numere reale. Se cere s se afieze numrul cel mai mare
dintre ele (calculul maximului).
class test {
public static void main(String[] args) {
System.out.print("a=");
double a=Double.parseDouble(cin.linie());
System.out.print("b=");
double b=Double.parseDouble(cin.linie());
if (a>b) System.out.println(a);
else System.out.println(b);
}
}
Capitolul 6. Iniiere n utilizarea limbajului Java 247

2. Se citete n, numr natural mai mare dect 0. S se calculeze 1+2+...n.


class prima {
public static void main(String[] args) {
System.out.print("n=");
int i,s=0,n=Integer.parseInt(cin.Token());
for (i=1;i<=n;i++) s+=i;
System.out.println("Suma este " +s);
}
}

Observai modul n care se afieaz, mai nti, irul n=, si apoi se


ateapt introducerea lui n.

Prin expresia: "Suma este " +s se convertete mai nti tipul int ctre
String (obiect care reine un ir de caractere), apoi cele dou se
concateneaz. n final, se afieaz irul astfel obinut.

Aceasta nseamn c pentru a converti o valoare numeric, a, ctre ir, se


poate face irul sum ntre irul vid i a: +a. De reinut!

3. Se citete n i un vector cu n componente numere reale. S se afieze


coninutul componentelor vectorului sortate cresctor. Se va utiliza metoda bulelor.
class test {
public static void main(String[] args) {
System.out.print("n=");
int n=Integer.parseInt(cin.linie()),i;
double man; boolean gasit;
double V[]=new double[n];
for (i=0;i<n;i++)
{ System.out.print("V["+i+"]=");
V[i]=Double.parseDouble(cin.linie());}
do
{ gasit=false;
for (i=0;i<n-1;i++)
if (V[i]>V[i+1])
{ man=V[i]; V[i]=V[i+1]; V[i+1]=man;
gasit=true;}
} while (gasit==true);
for (i=0;i<n;i++) System.out.println(V[i]);
}
}

4. Mai jos putei observa o secven simpl prin care se pot inversa liniile i i j
ale unei matrice cu n linii i m coloane (i,j<n).
int Man[]; Man=A[i]; A[i]=A[j]; A[j]=Man;
248 Manual de Informatic pentru clasa a XII-a

6.12. Date membru


n Java, exist posibiltatea de a declara variabile vizibile la nivel de clas,
aa cum se vede n programul de mai jos, unde se citesc coninuturile numerice a
dou astfel de variabile i se afieaz suma lor. Ele sunt, de fapt, variabile globale
la nivel de clas. Ca s respectm terminologia consacrat, le vom numi date
membru (ale clasei care conine main()). Pentru moment, pentru a putea lucra ca
acest mod este obligatoriu ca datele membru s fie precedate de modificatorul
static. Justificrile celor prezentate acum vor fi date ulterior.
class test {
static int a,b;
public static void main(String[] args) {
a=Integer.parseInt(cin.linie());
b=Integer.parseInt(cin.linie());
System.out.println(a+b);}
}
Orice dat membru (variabil) a clasei este iniializat automat, la pornirea
programului. Astfel, datele numerice sunt iniializate cu 0, datele de tip boolean cu
false, datele de tip caracter cu caracterul de cod 0, datele de tip referin cu
null (nu conin nici o adres).

6.13. Metode
n esen, o metod este alctuit din:
Antet - acesta conine mai multe informaii importante necesare
compilatorului, numele metodei, lista parametrilor formali, tipul metodei
i, eventual, modificatori.
Corpul metodei - acesta cuprinde instruciunile metodei.
Exemplul 6.53. n Fig. 6.12, putei observa metoda suma() ce are rolul de a
calcula suma a dou numere naturale. n schema ataat, putei identifica
elementele constitutive ale ei:
Numele metodei se utilizeaz pentru a o identifica atunci cnd metoda
este apelat.
Lista parametrilor formali parametrii formali sunt valorile pe care
metoda le primete la apel. n exemplu, lista este format din doi
parametri formali, x i y, ambii de tipul int.
Tipul metodei sau altfel spus, precizeaz natura rezultatului. n
exemplu, metoda returneaz o valoare ntreag (de tip int), dar pot fi
metode de alt tip, cum ar fi float double, etc. Exist i metode care
nu returneaz nimic, caz n care tipul metodei este void.
Capitolul 6. Iniiere n utilizarea limbajului Java 249

Modificator Tipul Numele Lista


metodei metodei parametrilor
formali

static int suma(int x, int y)


{ return x+y;
Corpul }
metodei
Figura 6.12. Exemplu de metod
Corpul metodei este sub forma unei instruciuni compuse. n
exemplu, acesta conine o singur instruciune, return, prin care se
calculeaz i se returneaz suma parametrilor formali.
Modificator static.
Mai jos, putei observa modul n care se apeleaz metoda suma():
public class test {
static int suma(int x, int y) {return x+y;}
public static void main(String[] args) {
System.out.println(suma(2,3));
int x=2, y=5;
System.out.println(suma(x,y)); System.out.println(suma(3,y));}
}

Metodele care sunt de orice alt tip n afara tipului void, trebuie s returneze
o valoare din tipul respectiv. Returnarea valorii se face prin utilizarea
instruciunii return. n exemplu, metoda suma() prin return x+y;
returneaz suma celor doi parametrii primii.
Mai jos putei observa modul n care se apeleaz o metod de tip void:
public class test {
static void met()
{ System.out.println("Eu sunt o metoda de tip void"); }
public static void main(String[] args) { met(); }
}
Parametrii care figuraz n apelul unei metode se numesc parametri efectivi.
De exemplu, n apelul suma(2,3), parametrii efectivi sunt valorile 2 i 3. n
apelul suma(x,y) parametrii efectivi sunt coninuturile variabilelor x i y.
Metodele se pot apela una pe alta, indiferent de poziia pe care o ocup
definiia lor n cadrul clasei.
Exemplul 6.54. n exemplul de mai jos, metoda met1() apeleaz metoda met(),
dei aceasta din urm este definit, n cadrul clasei, dup ea.
class test {
static void met1()
{ System.out.println("Met1"); met(); }
250 Manual de Informatic pentru clasa a XII-a

static void met() {System.out.println("Met");}


public static void main(String[] args)
{met1();}
}

n Java, parametrii se transmit numai prin valoare. Aceasta nseamn c


parametrul efectiv, chiar dac este variabil, rmne nemodificat.
Exemplul 6.55. Privii exemplul urmtor:
public class test {
static void exemplu(double x)
{ x=3.7; }
public static void main(String[] args) {
double x=5; exemplu(x); System.out.println(x);
}
}
n main() avem o variabil x, de tip double, iniializat cu 5. Apelm
metoda de tip void exemplu(). n metod, lui x i se atribuie alt valoare (3.7).
Dup executarea metodei, se revine n main() i se afieaz x. Valoarea afiat
este cea iniial, 5. Coninutul variabilei x din main() a rmas nemodificat.

Am artat faptul c numele unui masiv este o referin ctre masiv ce se


gsete n memorie. n acest caz, transmiterea unei referine ctre un masiv
ca parametru al unei metode are ca efect posibilitatea modificrii
coninuturilor componentelor masivului.

Observaie ! ntruct masivele conin i data membru length, dac o metod


primete ca parametru o referin ctre masiv, atunci nu mai este necesar ca, n alte
limbaje de programare, s transmitem i numrul de componente ale masivului.

Exemplul 6.56. Metoda exemplu() calculeaz suma numerelor reinute de un


vector i face ca fiecare component a vectorului s rein valoarea 1. n
programul principal se iniializeaz vectorul, apoi se probeaz efectul metodei.
public class test {
static int exemplu(int[] t )
{ int s=0,i;
for (i=0;i<t.length;i++) s+=t[i];
for (i=0;i<t.length;i++) t[i]=1;
return s;
}
public static void main(String[] args) {
int[] v=new int [5]; int i;
for (i=0;i<5;i++) v[i]=Integer.parseInt(cin.linie());
System.out.println(exemplu(v));
for (i=0;i<v.length;i++) System.out.print(v[i]+" ");
}
}
Capitolul 6. Iniiere n utilizarea limbajului Java 251

6.14. Exemple de utilizare a metodelor

1. Se citesc dou numere ntregi m i n. Se cere s se tipreasc cel mai mare


divizor comun i cel mai mic multiplu comun al lor.
Rezolvare. Presupunem cunoscut algoritmul care determin cel mai mare divizor
comun pentru dou numere. Cel mai mic multiplu comun al dou numere se poate
determina mprind produsul lor la cel mai mare divizor comun al lor. Prin urmare,
scriem o metod cmmdc cu doi parametri formali m i n, care ntoarce o valoare
ntreag - cel mai mare divizor comun al lor.
public class test {
static int cmmdc(int m, int n)
{ while (m!=n)
if (m>n) m-=n;
else n-=m;
return m; }
public static void main(String[] args) {
int m=Integer.parseInt(cin.linie());
int n=Integer.parseInt(cin.linie());
int cm=cmmdc(m,n);
System.out.println(cm);}
}

2. Superpalindrom. Un numr natural este palindrom dac citit de la stnga la


dreapta i de la dreapta la stnga rmne nemodificat. De exemplu, numrul
12321 este palindrom. Un numr natural este superpalindrom dac este palindrom
att el ct i ptratul su. Scriei un program care listeaz toate numerele cu
aceast proprietate aflate ntre doi intregi m i n.
Rezolvare. Modul n care testm dac un numr este palindrom este acum lmurit.
Mai mult, avem i metoda. Nu trebuie dect s o folosim:
public class test {
static boolean palin(int i)
{ int isalv=i,iinv=0;
while (i!=0)
{ iinv=iinv*10+i%10; i=i/10; }
return isalv==iinv;
}
public static void main(String[] args) {
int m=Integer.parseInt(cin.linie());
int n=Integer.parseInt(cin.linie());
for(int i=m;i<n;i++)
if (palin(i))
if (palin(i*i)) System.out.println(i+" "+i*i);
}
}

n Java metodele pot fi recursive, deci o metod se poate autoapela.


252 Manual de Informatic pentru clasa a XII-a

3. S se calculeze recursiv n!. Pentru a scrie o metod recursiv care efectueaz


acelai calcul, vom porni de la o definiie recursiv a lui n!. Aceasta este:
public class test {
static int fact(int n)
{ if (n==0) return 1;
else return n*fact(n-1); }
public static void main(String[] args) {
System.out.println(fact(3)); }
}

6.15. Suprancrcarea metodelor


n Java, metodele pot fi suprancrcate. Aceasta nseamn c putem avea
dou sau mai multe metode cu acelai nume, dar care difer prin tipul i/sau
numrul parametrilor.

Exemplul 6.57. Privii programul de mai jos, care conine dou metode cu acelai
nume, cu acelai numr de parametri (1), dar de tip diferit (int, respectiv float):
public class test {
static void eu_sunt(int n)
{ System.out.println("Parametru de tip int "+ n); }
static void eu_sunt(double n)
{ System.out.println("Parametru de tip double "+n ); }
public static void main(String[] args) {
eu_sunt(3);
eu_sunt(-2.7); }
}

Faptul c metodele pot fi suprancrcate are consecine uriae n


programare. Dac n cazul programrii clasice (neorientate pe obiecte) se poate
programa i n absena acestei faciliti, n cazul programrii orientate pe obiecte,
facilitatea devine esenial, aa cum va rezulta din capitolele urmtoare.

Un exemplu este chiar metoda println(), att de utilizat pn n acest


moment. Ea afieaz orice i-am transmite ca parametru: o valoare de tip
int, o valoare de tip float, un caracter sau un ir de caractere. De fapt,
exist mai multe metode println() care difer doar prin tipul parametrului.

Sugestie ! Pentru a v obinui cu programarea n Java, putei rezolva orice


problem din manualele pentru clasele a X-a i a XI-a care nu necesit utilizarea
fiierelor.
CAPITOLUL
Programare orientat pe obiecte

n acest capitol vom studia n detaliu programarea orientat


pe obiecte, utiliznd limbajul de programare Java. Mai jos sunt
prezentate principalele noiuni pe care le vei nva:

Care sunt principiile programrii orientate pe obiecte ?


Ce este un constructor ?
Date membru statice i metode statice
Cuvntul cheie This
Referine ctre obiecte
Masive de obiecte
Aplicaii. Lucrul cu numere raionale
Studiul unor clase din limbajul Java
Extinderea claselor (motenirea)
Ce este polimorfismul ?
Clase abstracte
Interfee
Specificatori de acces (modificatori de acces)
Excepii (tratarea erorilor)

Cuvinte cheie: ncapsulare, motenire, polimorfism, constructor,


static, nestatic, legare, this, referin, masiv, math, string, clas
nfurtoare, abstract, interfa, specificator de acces, excepie
254 Manual de Informatic pentru clasa a XII-a

7.1. Principiile programrii orientate pe obiecte

Atunci cnd ne referim la programarea orientat pe obiecte, se mai pot folosi


i denumirile: programare obiectual, programare orientat spre obiect sau pe
scurt, OOP - Object Oriented Programming.

n linii mari, se poate spune c OOP reunete trei principii fundamentale:


ncapsulare, motenire i polimorfism.
1. Prin ncapsulare nelegem mecanismul prin care datele (variabilele) i funciile
(numite n acest caz i metode) sunt plasate mpreun, ntr-o unic structur,
numit clas. Clasa generalizeaz noiunea de tip de dat. Fiind dat un tip de
dat, putem avea variabile care sunt de acel tip, adic acele variabile pot reine
numai date care respect cerinele tipului.

Exemplul 7.1. Dac trebuie s reinem un numr real, putem alege tipul double i
s definim o variabil de acest tip.

Fiind dat o clas, putem obine obiecte rezultate prin instanierea acelei
clase. Pe lng datele proprii, un obiect conine i metode, adic funcii care permit
lucrul cu datele reinute de obiectul respectiv, dar i cu date din afara obiectului.

Exemplul 7.2. La matematic v-ai ntlnit cu numere complexe! Ele sunt de


forma: z=x+iy, unde x,y. Prin urmare, pentru fiecare numr complex ar trebui
s reinem dou valori reale, pentru x i pentru y. Decidem c n acest caz, pentru
a le reine, avem nevoie de dou variabile de tip double.
Privii programul de mai jos care conine dou clase: Complex i test:
class Complex {
// date membru
double x,y;
// metoda
void afis()
{ System.out.println(x+" "+y); }
}
public class test {
public static void main(String[] args) {
// declar un numar complex
Complex z1;
z1= new Complex (); // Complex z1=new Complex();
// Datelor membru li se atribuie valori
z1.x=3;
z1.y=-4.7;
// Afisez datele membru
z1.afis();
}
}
Capitolul 7. Programare orientat pe obiecte 255

S analizm programul:

clasa Complex:

1. Clasa conine dou date membru, x i y, ambele de tip double.


2. Clasa conine o metod care are rolul de a afia ntr-un mod convenabil
datele membru ale clasei.
clasa test - metoda main():
1. Complex z1;- variabila z1 este de tip Complex. Prin urmare, ea poate reine
o referin (adres) ctre un obiect de tip Complex.
2. z1=new Complex(); - se creeaz un obiect de tip Complex i referina ctre
el este reinut de z1.
3. z1.x=3; z1.y=-4.7; - datelor membru x i y ale obiectului a crui
referin este reinut de z1 li se atribuie respectiv, valorile 3 i 4.7.
4. z1.afis(); - se afieaz numrul complex reinut de obiectul referit de z1.

Foarte important !

A) La baza programrii pe obiecte st noiunea de clas. Clasa ncorporeaz att


date membru, ct i metode. A defini o clas nseamn a crea un tip (n sensul
extins). Un obiect rezult ca instaniere a unei clase. Obiectul va avea ca tip
numele clasei respective. Pentru a putea accesa datele membru i metodele clasei
respective se utilizeaz variabile de tip referin ctre obiectele clasei respective.
B) Odat definit clasa, putem crea obiecte de tipul clasei respective. ntr-o form
simplificat (mai precis, n absena unui constructor), crearea unui obiect de tipul
unei clase se face prin construcia de mai jos, unde v este o variabil referin
ctre obiectele clasei respective.
Nume_clasa v=new Nume_Clasa()
C) Un constructor al unei clase este o metod special a clasei respective care
are rolul de a aloca n memorie spaiul necesar obiectului dar i de a iniializa
datele membru ale acestuia. Orice clas are un constructor implicit (adic o
metod pe care nu a scris-o cel care a creat clasa).
D) Operatorul new are dublu rol:
- apeleaz constructorul clasei respective;
- returneaz referina (adresa) la care a fost creat obiectul respectiv.

Exemplul 7.3. Complex z=new Complex(); - z reine o referin ctre


obiectul creat prin new:

z
Figura 7.1. x y
256 Manual de Informatic pentru clasa a XII-a

E) Accesul la variabilele interne ale obiectului se realizeaz prin numele


obiectului, urmat de operatorul . i numele variabilei.

Exemplul 7.4. n exemplu, Z va reine numrul x+2i, iar aceste valori vor fi afiate:
z1.x=1;
z1.y=2;
System.out.println(z1.x);
System.out.println(z2.y);

F) O clas poate conine una sau mai multe metode. Apelul unei metode de
acest tip se face prin numele variabilei care reine referina ctre obiect, urmat de
. i de numele metodei.
Exemplul 7.5. z1.afis().
G) Datele membru ale unei clase sunt iniializate implicit cu valoarea 0, dac sunt
de un tip numeric, sau cu caracterul de cod 0, dac sunt de tip char, sau cu null
dac sunt de tip referin.
2. Prin motenire se nelege acea proprietate a claselor prin care o clas poate
prelua datele i metodele unei (unor) clase anterior realizate. n Java, acest
mecanism mai este cunoscut sub numele de "extinderea claselor". Evident, clasei
nou construite i se pot aduga noi date i metode! Prin acest procedeu, se preia
soft deja implementat i acesta se dezvolt. Avantajul uria al acestui mecanism
este c persoana care preia un anumit soft trebuie s cunoasc doar documentaia
de utilizare a acestuia. Extinderea claselor face obiectul unui paragraf separat.
3. Polimorfismul este legat de motenire. n linii mari, prin polimorfism nelegem
posibilitatea ca att clasa care este motenit, ct i motenitoarea, s poat
utiliza metode cu acelai nume, dar diferite. Fie mai multe clase C0, C1, ..., Cn, unde
C1 motenete pe C0, C2 pe C1, ..., Cn pe Cn-1. Toate aceste clase redefinesc o
metod: f. Exist posibilitatea ca, n timpul executrii programului, s se ruleze
o metod f sau alta, tot f, n funcie de tipul datelor care intervin. Procedeul este
cu mult mai complex i va face obiectul unui paragraf separat.

7.2. Constructori
Aa cum am artat, orice clas are un constructor implicit. Rolul lui este de a
aloca spaiu n memorie pentru obiect. Constructorul este apelat de operatorul
new. Acesta din urm are i rolul de a returna referina ctre obiect, referin care
este memorat de o variabil de tip referin ctre obiect.

Exemplul 7.6. Unei clase i se pot crea proprii constructori, aa cum rezult din
exemplul urmtor, unde clasei prezentate n paragraful precedent i s-au adugat
doi constructori:
Capitolul 7. Programare orientat pe obiecte 257

class Complex {
// date membru
double x,y;
// Constructor 1
Complex (double x1)
{ x=x1;
}
// Constructor 2
Complex (double x1, double y1)
{ x=x1;
y=y1;
}
// metoda
void afis()
{ System.out.println(x+" "+y);
}
}
public class test {
public static void main(String[] args) {
Complex z1 = new Complex (2,3), z2 = new Complex (1);
z1.afis();
z2.afis();
}
}

Primul constructor are un singur parametru i se folosete pentru declaraii


de numere complexe care au partea imaginar 0. Al doilea constructor se
utilizeaz pentru a declara numere complexe cu parte real i parte imaginar. n
ambele cazuri nu mai este nevoie ca datele membru s fie iniializate.

De reinut !

A) Un constructor nu are tip.

B) Un constructor are ntotdeauna numele clasei creia i aparine.

C) Dac unei clase i se ataeaz un constructor, altul dect cel implicit, atunci nu
se mai poate instania un obiect prin utilizarea constructorului implicit. De exemplu,
pentru clasa definit n acest paragraf o instruciune de genul Complex z=new
Complex() d eroare de sintax.

D) Unei clase i se pot ataa mai muli constructori, dup cum ai vzut i n
exemplu. Ei trebuie s difere prin numrul parametrilor i /sau tipul parametrilor, cu
alte cuvinte, ca i metodele, acetia sunt suprancrcai.
258 Manual de Informatic pentru clasa a XII-a

7.3. Date membru statice i metode statice

Att datele membru ct i metodele unei clase pot fi statice. Aceasta


nseamn c datele i metodele declarate statice pot fi apelate, aa cum suntem
deja obinuii, pornind de la un obiect al clasei respective, dar i pornind de la
numele clasei, aa cum observai n exemplul urmtor.

Exemplul 7.7. Clasa Matematica conine o dat membru iniializat (Pi). De


asemenea, ea mai conine dou metode: Patrat() i Cub() prin care se
calculeaz x2 i x3. Se calculeaz i afieaz aria unui cerc n dou feluri:
apelnd data membru i metoda pornind de la numele clasei (Matematica);
apelnd data membru i metoda pornind de la numele unui obiect al clasei
Matematica.
class Matematica {
static double Pi=3.1415;
static double Patrat (double x)
{ return x*x; }
static double Cub (double x)
{ return x*x*x; }
}
public class Clasa1 {
public static void main(String[] args) {
int Raza=3;
double Aria=Matematica.Pi*Matematica.Patrat(Raza);
System.out.println(Aria);
//altfel
Matematica ob=new Matematica();
Aria=ob.Pi*ob.Patrat(Raza);
System.out.println(Aria);
}
}

Foarte important !
A) Datele membru statice i metodele statice nu sunt memorate de fiecare obiect
al clasei respective. Ele sunt memorate o singur dat, n cadrul clasei respective.
B) Sunt clase care au date membru i/sau metode statice i nestatice.

Observaie ! O clas indispensabil, este clasa Math, care este prezentat n


aceast carte. Ea conine o mulime de metode matematice care se utilizeaz
mult n orice limbaj de programare. Clasa Matematica, din exemplu, este
construit pe aceleai principii ca i clasa Math.
Capitolul 7. Programare orientat pe obiecte 259

7.4. Cuvntul cheie this


n interiorul claselor se poate utiliza cuvntul cheie this. Semnificaia sa
este: referin ctre obiectul curent. Iat una dintre aplicaiile sale:

Dac o metod (sau un constructor) are o variabil cu un anumit nume, de


exemplu x, i dac, clasa are o dat membru cu acelai nume, pentru exemplul
nostru tot x, atunci pentru a nu se crea confuzie, data membru va fi adresat prin
this.x, iar variabila din metod (sau constructor) prin x.

Exemplul 7.8. Pentru clasa Complex cei doi constructori ar putea fi scrii i aa:
Complex (double x)
{ this.x=x; }
Complex (double x, double y)
{ this.x=x; this.y=y;}

7.5. Referine ctre obiecte


Metodele pot avea parametri de tip referin la obiecte i pot returna referine
ctre obiecte. Evident, referinele sunt transmise prin valoare. Dar, pornind de la
ele, se poate accesa obiectul ca i cnd ar fi transmis prin referin.
Exemplul 7.9. Adugm clasei Complex metoda Complex adun(Complex
z);. Metoda returneaz o referin ctre un obiect de tip Complex care reine
numrul complex rezultat ca sum ntre numrul reinut de obiectul curent i
numrul complex transmis ca parametru:

class Complex {
double x,y;

Complex (double x)
{ this.x=x; }

Complex (double x, double y)


{ this.x=x; this.y=y; }

void afis()
{ System.out.println(x+" "+y); }

Complex adun(Complex z)
{ return new Complex (x+z.x,y+z.y); }
}
260 Manual de Informatic pentru clasa a XII-a

public class test {


public static void main(String[] args) {
Complex z1 = new Complex (2,3);
Complex z2 =new Complex(3,4);
Complex z=z1.adun(z2);
z.afis();
}
}
Programul afieaz suma numerelor complexe reinute z1 i z2, adic
numrul complex z=5+7i, afiat ca: 5 7. Observai faptul c variabila care reine
referina ctre obiectul sum a fost iniializat cu ajutorul metodei adun() a
obiectului z1.

Observaie ! Clasele pot conine variabile de tip referin la propriile obiecte (sau
la obiectele altei clase).
Exemplul 7.10. List liniar simplu nlnuit. Pornind de la aceast observaie,
construim o list liniar simplu nlnuit. Privii programul urmtor care creeaz i
afieaz o list liniar simplu nlnuit:
class Nod {
int info;
Nod adr_urm;
}

public class Lista {


static Nod v=null; // nu este obligatorie iniializarea
static void adaug(int nr)
{ Nod c=new Nod();
c.info=nr;
c.adr_urm=v;
v=c;
}

static void afis()


{ Nod c=v;
while (c!=null)
{ System.out.println(c.info);
c=c.adr_urm; }
}
public static void main(String[] args) {
for (int i=1;i<=9;i++) adaug(i);
afis();
}
}

Un nod reine o informaie oarecare, s-o numim info i s presupunem c


este de tip int i o referin ctre nodul urmtor (adr_urm). Evident, referina este
ctre obiecte ale aceleiai clase. Clasa respectiv am numit-o Nod.
Capitolul 7. Programare orientat pe obiecte 261

Clasa care construiete lista (Lista) conine o dat membru de tip static
de tip referin ctre un obiect al clasei Nod. De asemenea, clasa conine i dou
metode adaug() i afis().

Metoda adaug() are rolul de a aduga un nod listei liniare. Ea primete ca


argument numrul care trebuie reinut de info. Observai cum s-a procedat:
s-a creat un nou obiect al clasei Nod, iar referina ctre el este reinut de c.
Data membru a acestui obiect, info, este iniializat cu valoarea primit ca
parametru de metod, iar adr_urm cu referina ctre nodul anterior, este
reinut de v. n final, v reine referina ctre ultimul nod creat. n acest fel,
lista va reine nodurile n ordinea invers crerii lor. Am preferat acest
algoritm pentru simplitatea lui.
Metoda afis() listeaz valorile reinute de data membru info a fiecrui nod.

O problem de terminologie. Am vzut c metodele pot ntoarce referine ctre


obiecte. De asemenea, parametrii metodelor pot fi de tip referin ctre obiecte.
Prin abuz de limbaj, pentru a nu complica exprimarea, vom spune uneori, c
metodele ntorc obiecte, vom vorbi despre obiectul (obiectele) primit ca parametru
de o metod. ns, acestea trebuie nelese ca referine ctre obiecte.

Garbage Collector. Pe parcursul rulrii unui program se pot aloca multe obiecte,
iar altele devin inutile, adic nu mai exist referin ctre ele. Dac numrul obiectelor
alocate este foarte mare, este posibil ca programul s nu mai dispun de suficient
memorie i, prin urmare, executarea sa s nu mai poat continua. Pentru a rezolva
aceast problem, programele java conin o secven (fir de executare), numit
Garbage Collector, care intervine automat (fr ca programul nostru s conin
instruciuni scrise special n acest scop) i elibereaz memoria ocupat de obiectele
nereferite. Aceasta poate duce uneori, la o ncetinire a executrii programelor.
Momentul n care intervine Garbage Collector nu este stabilit de programator. Cu
alte cuvinte, n Java nu vom folosi destructori, existeni n alte limbaje de
programare, cum ar fi C++.

7.6. Masive de obiecte


ntrebarea este: se pot crea masive care rein obiecte? De exemplu, putem
s crem un vector care reine obiecte de tipul Complex? Rspunsul este
afirmativ! Elementele unui masiv pot reine referine ctre obiecte.
Exemplul 7.11. n programul urmtor se creeaz i se afieaz un
vector cu componente de tip Complex (vezi figura alturat):

Figura 7.2. Rezultat


262 Manual de Informatic pentru clasa a XII-a

class Complex {
double x,y;
Complex (double x)
{ this.x=x; }
Complex (double x, double y)
{ this.x=x; this.y=y; }
void afis()
{ System.out.println(x+" "+y);}
Complex adun(Complex z)
{ return new Complex (x+z.x,y+z.y); }
}
public class test {
public static void main(String[] args) {
Complex[] V=new Complex[3];
for (int i=0;i<3;i++) V[i]=new Complex(i+1,i+2);
for (int i=0;i<3;i++) V[i].afis();
}
}
Pentru a nelege modul n care a fost construit vectorul de obiecte rezultate
ca instane ale clasei Complex, analizai figura urmtoare:

V[0] V[1] V[2]

1 2 afis() 2 3 afis() 3 4 afis()


x y x y x y

Figura 7.3. Construcia vectorului de obiecte

Analizai i exemplele care sunt prezentate n continuare!

Exemplul 7.12. n secvena urmtoare, V1 reine o referin ctre un vector cu 10


componente care pot reine referine ctre obiecte ale clasei Complex. Se
instaniaz un obiect al clasei Complex i referina sa este atribuit lui V1[2].
Ultimele trei instruciuni au rolul de a proba cele prezentate:
Complex[] V1 =new Complex[10];
V1[2]=new Complex(10,11);
V1[2].afis();

Exemplul 7.13. n secvena urmtoare, V1 reine o referin ctre o matrice cu 8


linii i 5 coloane. Fiecare component a matricei poate reine o referin ctre un
obiect al clasei Complex. Se instaniaz un obiect al clasei Complex i referina
sa este atribuit lui V1[2][3].
Capitolul 7. Programare orientat pe obiecte 263

Complex[][] V1 =new Complex[8][5];


V1[2][3]=new Complex(10,11);
V1[2][3].afis();

Exemplul 7.14. V1 reine o referin ctre o matrice cu 5 linii i un numr


neprecizat de coloane. Un element al matricei va reine o referin ctre un obiect
al clasei Complex. Linia de indice 3, va avea 6 elemente. Elementul aflat n linia
de indice 3 i coloana de indice 4 va reine o referin ctre un obiect al clasei
Complex. Apoi, se probeaz...
Complex[][] V1=new Complex[5][];
V1[3]=new Complex[6];
V1[3][4]=new Complex(100,200);
V1[3][4].afis();

7.7. Aplicaii ale noiunilor prezentate. Lucrul cu


numere raionale
Este momentul s nvm s crem clase i apoi s le utilizm. nainte de a
prezenta aplicaiile precizm c, dac lucrm n folder-ul bin, aa cum am lucrat
pn acum, putem compila o clas oarecare fr ca ea s conin metoda main().
Fiierul obinut (are extensia .class) se va gsi n bin (dac cel cu extensia .java
este tot acolo). Orice alt clas care conine main() din bin, poate folosi clasa
compilat, fr a o mai declara ntr-un fel. De altfel, aceast problem va fi tratat pe
larg n acest capitol.

Aplicaia 7.1. S se creeze o clas cu ajutorul creia s se poat lucra uor cu


numere raionale. Un numr raional q este de forma m/n cu m i n numere ntregi i n
diferit de 0.
Clasa va avea dou date membru, m i n, ambele tip int.
Constructorul clasei este Rational(int m,int n). Obiectul este creat numai
dac n0. Datorit faptului c un numr raional poate fi reinut n mai multe feluri
(de exemplu, 2/3=4/6=8/12) se va reine numrul simplificat (pentru exemplul
dat, m=2 i n=3, chiar dac introducem 8 i 12). Pentru a putea realiza
simplificarea fraciei, m i n se mpart la cel mai mare divizor comun al lor.
Clasa va dispune de o metod static int cmmdc(int m, int n),
apelat de constructor, prin care se calculeaz cel mai mare divizor comun al
valorilor reinute de datele membru m i n.
Metoda Rational add(Rational r) creeaz un obiect al clasei
Rational care este rezultatul adunrii dintre obiectul curent i obiectul a crui
referin a fost primit ca parametru i returneaz referina ctre el. Faptul c a
fost apelat constructorul cu datele membru ale obiectului sum are ca efect
faptul c obiectul care reine suma este deja simplificat (m i n au fost mprite
la cmmdc al lor).
264 Manual de Informatic pentru clasa a XII-a

Metoda Rational sub(Rational r) creeaz un obiect al clasei


Rational care este rezultatul scderii dintre obiectul curent i obiectul a
crui referin a fost primit ca parametru i returneaz referina ctre el.
Metoda Rational mul(Rational r) creeaz un obiect al clasei
Rational care este rezultatul nmulirii dintre obiectul curent i obiectul a
crui referin a fost primit ca parametru i returneaz referina ctre el.
Metoda Rational div(Rational r) creeaz un obiect al clasei
Rational care este rezultatul mpririi dintre obiectul curent i obiectul a
crui referin a fost primit ca parametru i returneaz referina ctre el.
Metoda boolean maiMare (Ratioanal r) compar obiectul curent cu
obiectul a crui referin a fost primit ca parametru i returneaz true
dac obiectul curent este strict mai mare dect cel a crui referin a fost
transmis ca parametru i false, n caz contrar.
Metoda boolean maiMic (Ratioanal r) compar obiectul curent cu
obiectul a crui referin a fost primit ca parametru i returneaz true
dac obiectul curent este strict mai mic dect cel a crui referin a fost
transmis ca parametru i false, n caz contrar.
Metoda boolean egal (Ratioanal r) compar obiectul curent cu
obiectul a crui referin a fost primit ca parametru i returneaz true
dac obiectul curent este egal cu cel a crui referin a fost transmis ca
parametru i false n caz contrar.

Mai jos putei observa modul n care arat clasa Rational:


class Rational {
int m,n;
static int cmmdc(int m, int n)
{ if (n!=0) return cmmdc(n, m%n);
else return m; }
Rational (int m, int n)
{ if (n!=0)
{ int d=cmmdc(m,n);
this.m=m/d; this.n=n/d; }
else System.out.println("Numitorul este nul"); }
Rational add(Rational r)
{ return new Rational (m*r.n+r.m*n, n*r.n); }
Rational sub(Rational r)
{ return new Rational (m*r.n-r.m*n, n*r.n); }
Rational mul(Rational r)
{ return new Rational (m*r.m,n*r.n); }
Rational div(Rational r)
{ if (r.m!=0) return new Rational (m*r.n,n*r.m);
else return new Rational (0,1); }
Capitolul 7. Programare orientat pe obiecte 265

boolean maiMare(Rational r)
{ return (double) m/n > (double)r.m/r.n; }
boolean maiMic(Rational r)
{ return (double) m/n < (double)r.m/r.n; }
boolean egal(Rational r)
{ return (double) m/n == (double)r.m/r.n; }
}

n continuare, ne propunem s rezolvm cteva aplicaii n care intervin


numere raionale.

Aplicaia 7.2. Se citesc dou numere raionale q1 i q2 (0). Se cere s se afieze


q1+q2, q1-q2, q1*q2, q1/q2. Rezultatele vor fi tot dou numere raionale.

Rezolvare. Variabila q3 este de tip referin ctre un obiect al clasei Rational.


Dup fiecare operaie, ea va reine referina ctre obiectul rezultat n urma operaiei.
class I {
public static void main(String[] args) {
int m=Integer.parseInt(cin.Token());
int n=Integer.parseInt(cin.Token());
Rational q1=new Rational (m,n);
m=Integer.parseInt(cin.Token());
n=Integer.parseInt(cin.Token());
Rational q2=new Rational (m,n);
Rational q3=q1.add(q2);
System.out.println("Suma="+q3.m+"/"+q3.n );
q3=q1.sub(q2);
System.out.println("Diferenta="+q3.m+"/"+q3.n );
q3=q1.mul(q2);
System.out.println("Produsul="+q3.m+"/"+q3.n );
q3=q1.div(q2);
System.out.println("Catul="+q3.m+"/"+q3.n );
}
}

Aplicaia 7.3. Se citesc k numere raionale. Se cere s se afieze suma lor sub
form de numr raional.

Rezolvare. Obiectul s va reine iniial o referin ctre un numr raional nul (m=0,
n=1). Se citesc pe rnd cele k numere raionale. Pentru fiecare numr raional citit, se
construiete obiectul suma ntre s i obiectul care reine numrul raional, iar referina
ctre el este atribuit lui s. n final, se afieaz datele membru ale obiectului s.
class I {
public static void main(String[] args) {
System.out.print("k=");
int k=Integer.parseInt(cin.Token());
Rational s=new Rational(0,1);
266 Manual de Informatic pentru clasa a XII-a

for (int i=0;i<k;i++)


{ System.out.print("m=");
int m=Integer.parseInt(cin.Token());
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
Rational q=new Rational (m,n);
s=s.add(q);
}
System.out.println("Suma="+s.m+"/"+s.n );
}
}

Aplicaia 7.4. Se citete un vector cu k componente numere raionale (obiecte


ale clasei Rational). Se cere s se afieze vectorul sortat cresctor.

Rezolvare. Dup citirea vectorului vom utiliza metoda de sortare prin


interschimbare. Pentru comparare se utilizeaz metoda maiMare().
class I {
public static void main(String[] args) {
System.out.print("k=");
int k=Integer.parseInt(cin.Token());
Rational [] V=new Rational [k];
for (int i=0;i<k;i++)
{ System.out.print("V["+i+"].m=");
int m=Integer.parseInt(cin.Token());
System.out.print("V["+i+"].n=");
int n=Integer.parseInt(cin.Token());
V[i]=new Rational(m,n);
}
boolean gasit;
Rational man;
do
{ gasit=false;
for (int i=0;i<k-1;i++ )
if (V[i].maiMare(V[i+1]))
{ man=V[i];
V[i]=V[i+1];
V[i+1]=man;
gasit=true;
}
} while (gasit);
for (int i=0;i<k;i++)
System.out.println("V["+i+"].m=" + V[i].m +
" V["+i+"].n="+V[i].n);
}
}
Capitolul 7. Programare orientat pe obiecte 267

7.8. Studiul unor clase din limbajul Java

Pn n prezent am nvat s construim i s utilizm clasele. Desigur, a


fost doar un nceput, ntruct studiul claselor va continua i n capitolul urmtor.
Totui, este foarte important s cunoatem i s folosim clasele mai importante cu
care limbajul Java este nzestrat. Pachetul java.lang conine mai multe clase
care alctuiesc nucleul aplicaiilor Java. Din acest motiv, pentru utilizarea lor nu
mai este necesar folosirea directivei import.

7.8.1. Clasa Math

Clasa Math face parte din pachetul java.lang i conine mai multe
metode statice prin care se calculeaz valorile mai multor funcii clasice din
matematic (logaritmice, exponeniale, trigonometrice, etc):

Metoda Ce calculeaz ?
long abs(long x) Modul din x (|x|).
double abs(double x) ...
int abs(int x) ...
float abs(float x) ...
int abs(int x) ...
double acos(double x) arccos(x)
double asin(double x) arcsin(x)
Cel mai mic ntreg mai mare sau
double ceil(double x)
egal cu x.
Cel mai mare ntreg mai mic sau
double floor(double x)
egal cu x ([x], parte ntreag din x).
double cos(double x) cos(x)
double sin(double x) sin(x)
double tan(double x) tg(x)
double pow(double a, double b) ab
double sqrt(double x) Radical din x.
long round(double x) Cel mai apropiat ntreg de x.
int round (float x) ...
Numr aleator (ntmpltor) din
double random()
intervalul [0,1).
double max(double x, double y) max{x,y}
float max(float x, float y) ...
int max(int x, int y) ...
long max(long x, long y) ...
double min(double x, double y) min{x,y}
float min(float x, float y) ...
long min(long x, long y) ...
268 Manual de Informatic pentru clasa a XII-a

int min(int x, int y) ...


double exp(double x) ex
double log (double x) Logaritm natural din x (ln(x)).
double E Constanta e.
double PI Constanta .

Tabelul 7.1. Metodele clasei Math

Exemplul 7.15. Analizai apelurile de mai jos:


Math.ceil(2.35) returneaz 3;
Math.ceil(-2.35) returneaz -2;
Math.floor(2.35) returneaz 2;
Math.floor(-2.35) returneaz -3;
Math.round(2.35) returneaz 2;
Math.round(-2.35) returneaz -2;
Math.round(2.55) returneaz 3;
Math.round(-2.55) returneaz -3;
Math.round(-2.5) returneaz -2;
Math.round(2.5) returneaz 3.
Exemplul 7.16. Programul de mai jos afieaz o valoare natural aleatoare din
intervalul [1.101]. Math.random() returneaz o valoare aleatoare n intervalul
[0,1), Math.random()*100 returneaz o valoare real din intervalul [0,100),
Math.ceil(Math.random()*100) returneaz o valoare ntreag din intervalul
[0,100], iar 1+Math.ceil(Math.random()*100) returneaz o valoare natural
din intervalul [1,101].
public static void main(String[] args) {
System.out.println(1+Math.ceil(Math.random()*100));
}

7.8.2. Clasa String

7.8.2.1. Constructorii i lungimea unui ir de caractere

Un obiect al clasei String reine un ir de caractere. Pn acum am lucrat


cu obiecte ale clasei String, dar acum este momentul ca aceast clas s fie
prezentat n mod sistematic. Clasa este nzestrat cu doi constructori:
String(); - iniializeaz un obiect String care reine irul vid.

Exemplul 7.17. Secvena de mai jos afieaz "un sir":


String s = new String ();
s="Un sir";
System.out.println(s);
Capitolul 7. Programare orientat pe obiecte 269

String (String s); - iniializeaz un obiect String care reine un ir de


caractere dat.
Exemplul 7.18. Secvena de mai jos afieaz "un sir".
String s =new String ("Un sir");
System.out.println(s);

int length() - ntoarce numrul de caractere din ir.

Exemplul 7.19. Secvena de mai jos afieaz "6":


String s =new String ("Un sir");
System.out.println(s.length());

n Java nu este permis adresarea unui caracter al irului prin indice, pentru
exemplul precedent, s[k]. n schimb, avem metoda de mai jos, unde primul
caracter al irului are indicele 0, al doilea are indicele 1, .a.m.d.

char charAt(int i) returneaz caracterul de pe poziia i.

Exemplul 7.20. Pentru irul s, din exemplul precedent, instruciunea afieaz n:


System.out.println(s.charAt(1));

7.8.2.2. Compararea irurilor de caractere

irurile de caractere reinute de obiectele clasei String pot fi comparate din


punct de vedere lexicografic (ordinea din dicionar). Pentru aceasta, clasa String
conine mai multe metode.

int compareTo (String s) compar irul de caractere reinut de


obiectul curent cu irul de caractere reinut de s. Metoda returneaz:
o valoare negativ, dac irul reinut de obiectul curent este situat, n
ordine lexicografic, naintea irului reinut de obiectul s;
0, dac irurile reinute de cele dou obiecte coincid;
o valoare pozitiv, dac irul reinut de obiectul curent este situat, n
ordine lexicografic, dup irul reinut de obiectul s.

Exemplul 7.21. Secvena afieaz -2, 0, 2:


String s =new String ("abc");
String s1=new String("cd");
System.out.println(s.compareTo(s1)+ " "
+s.compareTo(s)+" "+s1.compareTo(s));

int compareToIgnoreCase(String s) la fel precum compareTo(),


numai c nu se face diferena ntre literele mari i cele mici.
270 Manual de Informatic pentru clasa a XII-a

Exemplul 7.22. Secvena de mai jos afieaz 0:


String s =new String ("AB");
String s1=new String("ab");
System.out.println(s.compareToIgnoreCase("ab"));

boolean equals(String s) returneaz true dac irurile de caractere


reinute de obiectul curent i cel transmis ca parametru sunt identice.
boolean equalsIgnoreCase(String s) la fel ca mai sus numai c nu
se face distincie ntre literele mari i cele mici.

7.8.2.3. Subiruri

Vom nelege prin subir al un ir de caractere, mai multe caractere


consecutive ale acestuia. De exemplu, text are ca subir ex.

boolean startsWith(String s) returneaz true dac irul reinut


de s precede irul reinut de obiectul curent.

boolean endsWith(String s) returneaz true dac irul reinut de


s se afl la sfritul irului reinut de obiectul curent.

Exemplul 7.23. Cu ajutorul metodelor startsWidth() i endsWith(), secvena


de mai jos afieaz de dou ori true:
String s =new String ("123");
String s1=new String("12");
String s3=new String("23");
System.out.println(s.startsWith(s1));
System.out.println(s.endsWith(s3));

boolean regionMatches(int i1,String s,int i2,int l)


compar dou subiruri de lungime l. Primul subir este al obiectului curent
i ncepe de pe poziia i1, al doilea subir este al irului s i ncepe pe poziia
i2. n caz de egalitate, metoda returneaz true, contrar returneaz false.

Exemplul 7.24. Secvena de mai jos afieaz irul 567 coincid:


if (s.regionMatches(4, s1, 2, 3))
System.out.println("567 coincid");

String substring (int index) metoda returneaz subirul irului


curent care este ntre poziia index i sfritul irului.

Exemplul 7.25. Secvena de mai jos afieaz 456789:


String s =new String ("123456789");
System.out.println(s.substring(3));
Capitolul 7. Programare orientat pe obiecte 271

String substring (int index, int sf) metoda returneaz


subirul irului curent care este ntre poziia index i sf-1.

Exemplul 7.26. Secvena de mai jos afieaz 45:


String s =new String ("123456789");
System.out.println(s.substring(3,5));

String replace(char c1, char c2) metoda returneaz irul


obinut dac se nlocuiesc, n irul reinut de obiectul curent, toate apariiile
caracterului c1 cu caracterul c2.

Exemplul 7.27. Secvena de mai jos afieaz tata:


String s =new String ("mama");
System.out.println(s.replace('m','t'));

String replaceAll(String s1,String s2) metoda returneaz


irul obinut dac se nlocuiesc, n irul reinut de obiectul curent, toate
apariiile subirului s1 cu subirul s2.

Exemplul 7.28. Secvena de mai jos afieaz *** doi *** doi trei:
String s =new String ("unu doi unu doi trei");
System.out.println(s.replaceAll("unu","***" ));

String replaceFirst (String s1, String s2) la fel ca mai


sus, doar c se nlocuiete numai prima apariie a subirului.
Exemplul 7.29. Secvena de mai jos afieaz *** doi unu doi trei:
String s =new String ("unu doi unu doi trei");
System.out.println(s.replaceFirst("unu","***" ));

String trim() ntoarce subirul irului reinut de obiectul curent, subir


obinut prin eliminarea spaiilor (blank-urilor de la nceput i de la sfrit).

int indexOf (String s) returneaz indicele primei apariii a subirului


s n irul reinut de obiectul curent. n cazul n care s nu este gsit ca subir
al irului referit de obiectul curent, metoda returneaz -1.

Exemplul 7.30. Secvena de mai jos afieaz 4:


String s1=new String("un exemplu");
String s2=new String("xe");
System.out.println(s1.indexOf(s2));

7.8.2.4. Concatenarea irurilor de caractere

Aa cum deja tim, n Java irurile de caractere pot fi concatenate cu


ajutorul operatorului +.
272 Manual de Informatic pentru clasa a XII-a

Exemplul 7.31. Secvena urmtoare afieaz Un sir Alt sir:


String s =new String ("Un sir" );
String s1 = new String(" Alt sir");
s=s+s1;
System.out.println(s);

Acelai lucru este afiat i de secvena de mai jos:


String s =new String ("Un sir "+"Alt sir" );
System.out.println(s);

Observaie ! Dup cum observai, concatenarea irurilor nu este comutativ, deci


nseamn c prezint importan ordinea n care irurile sunt puse n expresie.

Metoda String concat(String s) returneaz irul obinut prin


concatenarea irului reinut de obiectul curent cu s.

Exemplul 7.32. Secvena urmtoare afieaz Un sir Alt sir:


String s =new String ("Un sir ");
String s1 =new String ("Alt sir");
System.out.println(s.concat(s1));

7.8.2.5. Parametrii metodei main()

Acum suntem n msur s analizm parametrii metodei main():


public static void main(String[] args).
Antetul conine un vector cu elemente de tip String. n exemplu, numele
vectorului este args.

1. Cte elemente are vectorul? Acest numr se poate afla uor, ca la orice vector:
args.length.
2. Unde se introduc irurile de caractere primite ca parametri de ctre main()?
Aceste iruri se introduc pe linia de comand a programului Java i sunt separate
prin spaii.
Exerciiu! Programul de mai jos calculeaz suma valorilor introduse ca parametri.
Evident, mai nti acestea sunt convertite ctre int. Exemple de utilizare:
a) Dac apelul este java t 3 4 se va afia 7.
b) Dac apelul este java t 1 2 3 4 se va afia 10.

class t {
public static void main(String[] args) {
int s=0;
for (int i=0;i<args.length;i++)
s+=Integer.parseInt(args[i]);
System.out.println("suma argumentelor este ="+s); }
}
Capitolul 7. Programare orientat pe obiecte 273

n continuare, prezentm dou aplicaii ale clasei String.

Aplicaia 7.5. S se citeasc de la tastatur un ir de caractere, apoi s se afieze.

Rezolvare. Vom utiliza clasa cin (cea pe care am folosit-o i pn acum) pentru
toate exerciiile din acest paragraf.
public static void main(String[] args) {
String s =new String ();
s=cin.linie();
System.out.println(s);
}

Aplicaia 7.6. Se citesc dou iruri de caractere.


S se listeze indicele fiecrei apariii a primului ir
citit ca subir al celui de-al doilea ir citit. Iat cum
arat executarea programului (figura alturat).

Figura 7.4. Rezultatul

Rezolvare. Ideea este urmtoarea: dup ce subirul a fost identificat, se afieaz


poziia de nceput, apoi se extrage din ir subirul de nceput ce conine inclusiv
prima apariie a subirului, dup care procedeul se repet pn cnd subirul
cutat nu mai este gsit. O problem aparte este dat de faptul c trebuie, de
fiecare dat, s afim poziia de nceput a subirului n irul iniial i nu n irul
rmas. Din acest motiv, utilizm mai multe variabile: poz - poziia de nceput a
subirului n irul rmas; ind - suma lungimilor irurilor extrase. De fiecare dat se
va afia ca indice de apariie a subirului, ind+poz.
public static void main(String[] args) {
String subsir =new String (cin.linie());
String sir =new String (cin.linie());
int poz=0, ind=0, lsubs=subsir.length();
while (poz!=-1)
{ poz=sir.indexOf(subsir);
if (poz!=-1)
{ System.out.println(ind+poz);
ind+=poz+lsubs;
sir=sir.substring(poz+lsubs); }
}
}

2.8.3. Clase nfurtoare int Integer


short - Short
Pentru fiecare tip primitiv s-a construit cte o long Long
byte Byte
clas nfurtoare. Un obiect al clasei nfurtoare
char Character
poate reine o valoare a tipului primitiv. Alturat, putei float Float
observa corespondena ntre numele tipurilor primitive i double Double
numele claselor nfurtoare. boolean Boolean
274 Manual de Informatic pentru clasa a XII-a

Fiecare clas nfurtoare este nzestrat cu o metod constructor.

Exemplul 7.33. Analizai liniile de mai jos:


int n=4;
Integer nr=new Integer(n);
Double x=new Double (-12.34);
Character c=new Character ('e');
Boolean este=new Boolean(true);

Constructorii acestor clase sunt suprancrcai, n sensul c exist i


constructori care au ca parametru de intrare referine ctre obiecte de tip
String.

Exemplul 7.34. Analizai liniile de mai jos:


Integer nr=new Integer("10");
Double x=new Double ("-12.34");
Boolean este=new Boolean("true");

Fiecare clas nfurtoare conine o metod care returneaz valoarea


reinut de obiectul instaniat de ea.

Exemplul 7.35. Se extrag valorile reinute de obiectele create n primele exemple:


int n1=nr.intValue();
double x1=x.doubleValue();
char c1=c.charValue();
boolean este1=este.booleanValue();

Fiecare clas care reine o valoare numeric conine cte o metod static
(atenie la apel!) pentru conversia ctre un tip primitiv a unui obiect de tip
String. Astfel avem:
a) int parseInt(String s); // in Integer
De exemplu: int t=Integer.parseInt("10");
b) parseFloat(String S); // in Float
De exemplu: float b=Float.parseFloat("-12.34");
c) double parseDouble (String s) // in Double
De exemplu: double b=Double.parseDouble("-12.34");
d) parseLong(String s); // in Long
De exemplu: long t=Long.parseLong("1000");
e) parseByte(String s) // in Byte
De exemplu: byte x=Byte.parseByte("12");

Dac irul de caractere nu poate fi convertit ctre valoarea numeric de tipul


dorit, se genereaz o excepie n urma creia executarea programului se
ntrerupe.
Capitolul 7. Programare orientat pe obiecte 275

Conversia invers, de la un tip primitiv ctre un ir se poate realiza uor, aa


cum am mai ntlnit de multe ori concatennd un ir (eventual vid) cu o
valoare numeric.
Exemplul 7.36. Secvena urmtoare afieaz irul 10:
int i=10;
String s=new String(i+"");
System.out.println(s);

Clasele nfurtoare conin constantele MIN_VALUE i MAX_VALUE care


rein cea mai mic i cea mai mare valoare a tipului respectiv. n cazul
variabilelor de un tip real (float, double) MIN_VALUE are semnificaia de
cea mai mic valoare pozitiv care poate fi reinut de tipul respectiv.
Exemplul 7.37. Privii liniile de mai jos:
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
System.out.println(Double.MAX_VALUE);
Figura 7.5. Rezultatul

Clasele nfurtoare ale tipurilor reale (double, float) conin constanta


NaN (Not a Number). Valoarea NaN se obine dac, ntr-o expresie de tip
real, se mparte 0 la 0, sau se extrage radical (indice 2) dintr-o valoare
negativ, sau se aplic logaritmul unui numr negativ, etc.

Exemplul 7.38. Secvena de mai jos afieaz NaN:


double x=0,y=0,z;
z=x/y;
System.out.println(z);

Exemplul 7.39. Secvena de mai jos afieaz NaN:


int x=-2;
System.out.println(Math.sqrt(x));

Clasele nfurtoare ale tipurilor reale (double, float) conin metodele


boolean isNaN (double e), respectiv boolean isNaN (float e). Cele
dou metode returneaz true dac se obine NaN.

Exemplul 7.40. Secvena de mai jos afieaz: "Ambii operanzi sunt 0":
int x=0; double y=0;
if (Double.isNaN(x/y))
System.out.println("Ambii operanzi sunt 0");

Exemplul 7.41. Secvena afieaz: "Radical dintr-un numar negativ":


if (Double.isNaN(Math.sqrt(x)))
System.out.println("Radical dintr-un numar negativ");
276 Manual de Informatic pentru clasa a XII-a

Observaie ! Comparrile precum cele de mai jos nu au efect. De exemplu,


secvena nu afieaz nici un mesaj:
if (Math.sqrt(x)==Double.NaN)
System.out.println("Radical din numar negativ");

Clasele nfurtoare ale tipurilor reale (double, float) conin constantele


POSITIVE_INFINITY, NEGATIVE_INFINITY. Constanta POSITIVE_INFINITY
se obine dac, ntr-o expresie de tip real, se mparte o valoare pozitiv la 0,
iar constanta NEGATIVE_INFINITY se obine dac, ntr-o expresie de tip
real, se mparte la 0 o valoare negativ.
double x=2;
System.out.println(x/0);
x=-2;
System.out.println(x/0); Figura 7.6. Rezultatul

Observaie ! Dac expresia este de tip ntreg, atunci se genereaz o excepie


(excepiile vor fi studiate separat), iar programul este ntrerupt, ca n secvena de
mai jos:
int x=2;
System.out.println(x/0);

Clasele nfurtoare ale tipurilor reale (double, float) conin metoda


boolean boolean isInfinite(double) (sau float) prin care se
testeaz dac s-a obinut una din constantele de mai sus.

Exemplul 7.42. Secvena de mai jos afieaz "Impartire la 0":


double x=2;
if (Double.isInfinite(x/0))
System.out.println("Impartire la 0");

7.9. Extinderea claselor (motenirea)

1. Pornind de la o clas dat se poate crea o alt clas, care o extinde


(motenete) pe aceasta. Noua clas va avea toate datele membru i toate
metodele clasei de la care s-a pornit, crora li se pot aduga noi date membru
i/sau noi metode. n Java, clasa care este extins se numete superclas, iar
noua clas se numete subclas.
Exemplul 7.43. Analizai codul de mai jos:
class C1
{ int x,y; }
Capitolul 7. Programare orientat pe obiecte 277

class C2 extends C1
{ int z;
void afis()
{ System.out.println(x+" "+ y+" "+z); }
}
public class C {
public static void main(String[] args) {
C2 ref= new C2();
ref.x=3;
ref.y=4;
ref.z=5;
ref.afis();
}
}

Aici s-a extins clasa C1. Ea conine dou date membru x i y, ambele de tip int.
n exemplul dat, C1 este superclas.
Noua clas C2 va conine datele membru ale clasei C1 (n exemplu x i y) dar i o
nou dat membru (z, de tip int). De asemenea, clasa C2 conine i metoda
afis(), care are rolul de a afia coninutul datelor membru ale unui obiect. n
exemplu, clasa c2 este subclas. Programul creeaz un obiect al clasei C2, numit
ref, i iniializeaz datele membru i le afieaz.

2. Pentru a marca faptul c o clas extinde o alt clas se folosete cuvntul


extends (n exemplu, class C2 extends C1).

3. Iniializarea unui obiect al subclasei are ca efect apelul, n aceast ordine, al


constructorului superclasei i apelul constructorului subclasei. Este normal s fie
aa, pentru c subclasa include datele membru i metodele superclasei.
Exemplul 7.44. Analizai programul de mai jos, n care fiecare clas conine cte
un constructor:
class Unu{
Unu () { System.out.println("Constructor 1"); }
}
class Doi extends Unu
{ Doi() { System.out.println("Constructor 2"); };
}
public class C {
public static void main(String[] args) {
Doi x=new Doi();
}
}

Programul afieaz:
Constructor 1
Constructor 2
278 Manual de Informatic pentru clasa a XII-a

4. Exist posibilitatea ca anumite date membru sau metode s aib acelai nume
att n superclas ct i n subclas. n astfel de cazuri, implicit, la ntlnirea
numelui datei membru (sau metodei) se apeleaz data membru (metoda) a
subclasei. n cazul n care se dorete ca s fie apelat data membru (metoda) a
superclasei, se utilizeaz cuvntul cheie super. El are semnificaia de obiect
curent al superclasei. n exemplul de mai jos, x este dat membru att a
superclasei ct i a subclasei.
Exemplul 7.45. Programul urmtor va afia 1 2 3:
class C1
{ int x=1,y; }
class C2 extends C1
{ int x;
void afis()
{ System.out.println(super.x+" "+ y+" "+x); }
}
class C {
public static void main(String[] args) {
C2 pt= new C2();
pt.x=3;
pt.y=2;
pt.afis();
}
}

Observaie ! Cuvntul cheie super nu poate fi folosit n afara clasei.


5. n cazul n care superclasa este nzestrat cu un constructor care primete
parametri, atunci este obligatoriu ca acesta s fie apelat de constructorul subclasei.
De ce? Aa cum am artat, constructorul subclasei apeleaz automat constructorul
superclasei. n cazul n care apelul nu este explicit, este apelat constructorul
implicit (fr parametri) al superclasei. Ori, am nvat faptul c, n condiiile
existenei unui constructor cu parametri, nu mai este posibil s apelm
constructorul implicit, pentru c apare eroare. Mai mult, prima instruciune a
constructorului subclasei trebuie s fie apelul constructorului superclasei. Apelul
constructorului superclasei se face prin:
super (lista_parametri).
Exemplul 7.46. Analizai programul urmtor, n care clasa Elev conine numele i
prenumele unui elev, iar clasa Olimpic extinde clasa Elev i conine n plus o
dat membru, materia la care elevul este olimpic i o metod prin care se afieaz
numele, prenumele elevului i materia respectiv.
class Elev
{ String nume, prenume;
Elev (String nume, String prenume)
{ this.nume=new String(nume);
this.prenume=new String(prenume); }
}
Capitolul 7. Programare orientat pe obiecte 279

class Olimpic extends Elev


{ String materia;
Olimpic(String nume, String prenume, String materia)
{ super(nume,prenume); // apel constructor al superclasei
this.materia=new String(materia);}
void afis()
{ System.out.println(nume+" "+prenume+" "+materia); }
}
public class test {
public static void main(String[] args) {
//primul mod de creare a unui obiect olimpic
Olimpic A=new Olimpic("Pascu", "Marius", "informatica");
//al doilea mod de creare a unui obiect olimpic
String n=new String("Grosu");
String p=new String("Bogdan");
String mat=new String("matematica");
Olimpic B=new Olimpic(n,p,mat); A.afis(); B.afis();
}
}
6. n Java, o clas poate extinde (moteni) o singur superclas. Nu exist un
mecanism de motenire multipl, aa precum exist n alte limbaje. Din acest
motiv, ierarhia claselor are o structur arborescent.

7.9.1. Un exemplu de extindere a unei clase

Fie clasa Complex, de mai jos. Are dou date membru, x i y, care rein
partea real i partea imaginar a unui numr complex. De asemenea, clasa este
nzestrat cu un constructor i metoda afis(), care afieaz numrul complex
reinut de obiect.
class Complex
{ double x,y;
Complex (double x, double y)
{ this.x=x;
this.y=y; }
void afis() { System.out.println(x+" "+y); }
}
Clasa este extins la o alta, Complex_op, care conine i metode prin care
se efectueaz operaiile de mai jos cu numere complexe:
z 1 + z 2 = x 1 + i y1 + x 2 + i y 2 = x 1 + x 2 + i (y1 + y 2 ).
z 1 z 2 = x 1 + i y1 x 2 i y 2 = x 1 x 2 + i (y1 y 2 ).
z 1 z 2 = (x 1 + i y1 )(x 2 + i y 2 ) = x 1 x 2 y1 y 2 + i (x 1 y 2 + x 2 y1 ).
z1 x + i y1
= 1
( x + i y1 ) ( x 2 i y 2 ) x1 x 2 + y 1 y 2 + i( x 2 y1 x1 y 2 )
= 1 =
z2 x2 + i y 2 (x2 + i y 2 ) (x2 i y 2 ) x 22 + y 22
280 Manual de Informatic pentru clasa a XII-a

Iat ce conine, n plus, clasa Complex_op:

Doi constructori. Primul dintre ei accept partea real i partea imaginar a


unui numr complex. Al doilea, accept numai partea real (numr real
inclus evident n mulimea numerelor complexe).
Metodele add, sub, mul, div - efectueaz operaiile de adunare, respectiv
scdere, nmulire, mprire a dou numere complexe. Ele returneaz
numrul complex rezultat n urma operaiei.
class Complex_op extends Complex
{
Complex_op (double x, double y)
{ super(x,y); }
Complex_op (double x)
{ super(x,0); }
Complex_op add(Complex_op z)
{ Complex_op t=new Complex_op (x+z.x,y+z.y);
return t; }
Complex_op sub(Complex_op z)
{ Complex_op t=new Complex_op (x-z.x,y-z.y);
return t; }
Complex_op mul(Complex_op z)
{ Complex_op t=new Complex_op (x*z.x-y*z.y, x*z.y+z.x*y);
return t; }
Complex_op div(Complex_op z)
{ double num=z.x*z.x+z.y*z.y;
Complex_op t;
if (num!=0)
t=new Complex_op ((x*z.x+y*z.y)/num,(z.x*y-x*z.y)/num);
else t=new Complex_op(0,0);
return t;
}
}

n continuare, sunt prezentate exemple de lucru cu numerele complexe.

Exemplul 7.47. S se creeze dou obiecte de tip Complex_op i s se afieze


suma, diferena, produsul i ctul lor.
public class test {
public static void main(String[] args) {
// instantiez z si il afisez
Complex_op z=new Complex_op(2,3);
z.afis();
// instantiez z1 si il afisez
Complex_op z1= new Complex_op(10);
z1.afis();
Capitolul 7. Programare orientat pe obiecte 281

// Afisez suma dintre z si z1


z.add(z1).afis();
// Afisez diferenta dintre z si z1
z.sub(z1).afis();
// Afisez produsul dintre z si z1
z.mul(z1).afis();
// Afisez catul dintre z si z1
z.div(z1).afis();
}
}

Exemplul 7.48. Se citesc a i b dou numere reale care reprezint partea real i
partea complex a numrului z=a+b*i i n, un numr natural mai mare sau egal
cu 1. Se cere s se afieze zn.
public class test {
public static void main(String[] args) {
System.out.print("a=");
double a=Double.parseDouble(cin.Token());
System.out.print("b=");
double b=Double.parseDouble(cin.Token());
Complex_op z= new Complex_op(a,b);
z.afis();
// initializez produsul cu 1;
Complex_op P= new Complex_op(1);
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
for (int i=0;i<n;i++) P=P.mul(z);
P.afis();
}
}

Exemplul 7.49. S se extind clasa Complex_op, la o alta numit Cmpl, care s


conin, n plus, o metod prin care returneaz modulul numrului complex i o alt
metod boolean care returneaz true, n cazul n care numrul este real (y are
valoarea 0).

Rezolvare. ntruct constructorii nu se motenesc, a fost necesar rescrierea lor:


class Cmpl extends Complex_op
{
Cmpl (double x, double y)
{ super(x,y); }
Cmpl (double x)
{ super(x,0); }
double modul()
{ return Math.sqrt(x*x+y*y);}
boolean real()
{ return y==0; }
}
282 Manual de Informatic pentru clasa a XII-a

Exemplul 7.50. Se citete un vector de numere complexe. Se cere s se sorteze


cresctor elementele vectorului n funcie de modulul lor.

Rezolvare. Datorit faptului c avem nevoie de modulul numerelor complexe, vom


apela la ultima clas creat: Cmpl. Observai ierarhia acestor clase: la baz este
Complex, apoi Complex_op, iar ultima este Cmpl. Programul utilizeaz i metoda
Afis(), care aparine clasei complex.
public class test {
public static void main(String[] args) {
System.out.print("n=");
int n=Integer.parseInt(cin.linie());
Cmpl[] V=new Cmpl[n];
for (int i=0;i<n;i++)
{ System.out.print("V["+i+"].x=");
double x=Double.parseDouble(cin.linie());
System.out.print ("V["+i+"].y=");
double y=Double.parseDouble(cin.linie());
V[i]=new Cmpl(x,y);
}
boolean gasit;
Cmpl man;
do
{ gasit=false;
for (int i=0;i<n-1;i++)
if (V[i].modul()>V[i+1].modul())
{ man=V[i];
V[i]=V[i+1];
V[i+1]=man;
gasit=true;
}
} while (gasit);
for (int i=0;i<n;i++) V[i].afis();
}
}

7.10. Polimorfism

Prin polimorfism vom nelege posibilitatea ca att superclasa, ct i


subclasa s aib metode cu acelai nume (metodele pot fi redefinite).

Dei, n aparen, nelegerea polimorfismului nu este dificil, n realitate,


apar anumite probleme pe care ne propunem s le rezolvm n acest paragraf. Mai
mult, polimorfismul reprezint unul din punctele cheie ale programrii orientate pe
obiecte i este un instrument puternic de programare.
Capitolul 7. Programare orientat pe obiecte 283

Fie B o clas care extinde o clas A. Prin urmare, toate datele membru i
metodele clasei A se regsesc i n clasa B. Am mai nvat faptul c o metod a
clasei A poate fi redefinit, adic n clasa B scriem o metod cu acelai nume (n
exemplu, void tip()). Vom trata dou cazuri, cazul n care metodele sunt
nestatice i cazul n care metodele sunt statice.
I) Metodele i datele membru sunt nestatice.

Exemplul 7.51. Fie O un obiect al clasei A i O1 un obiect al clasei B. Vedei


exemplul urmtor, al crui rezultat l putei observa n Fig. 7.7:
class A
{ int i=1;
void tip() { System.out.println("clasa A"); }
}
class B extends A
{ void tip() { System.out.println("clasa B"); }
}
Figura 7.7.
public class test { Rezultatul
public static void main(String[] args) {
// Cazul 1
A O=new A(); O.tip();
// Cazul 2
B O1=new B(); O1.tip();
// Cazul 3
A O2=new B(); O2.tip();
}
}

n cazul 1 se apeleaz metoda tip() a clasei A. Se va afia clasa A i


valoarea 1 (pentru i). Este normal s fie aa, obiectul este al clasei A,
referina este ctre un obiect al clasei A.
n cazul 2 se apeleaz metoda tip() a clasei B. Se va afia clasa B i
valoarea 2 (pentru i). Este normal s fie aa, obiectul este al clasei B,
referina este ctre un obiect al clasei B.
n cazul 3, acesta este cazul interesant pe care-l studiem n acest
moment, se va apela metoda tip() a clasei B, prin urmare se va afia
clasa B i valoarea 1 (pentru i). S observm c obiectul este al clasei
B, dar variabila care reine referina ctre el este o referin ctre obiecte
ale clasei A. Cu toate c a fost apelat metoda clasei B, a fost afiat
coninutul variabilei i a clasei A.
Foarte important ! n cazul unei metode a superclasei, redefinit n subclas,
dou elemente prezint importan: tipul variabilei referin (ctre obiecte ale
superclasei sau ctre obiecte ale subclasei) i tipul obiectului creat (al
superclasei sau al subclasei). Se disting, astfel dou cazuri:
284 Manual de Informatic pentru clasa a XII-a

A) tipul referinei i tipul obiectului creat coincid (sunt fie ale superclasei, fie
ale subclasei). n acest caz este apelat metoda care este din tipul comun. De
asemenea, se afieaz variabila care aparine obiectului de tip comun. Vezi,
mai sus, cazurile 1 i 2.
B) tipul referinei este al superclasei, iar tipul obiectului creat este al subclasei
(invers nu este posibil, aa cum am artat). n acest caz, dac metoda
redefinit este nestatic, Java ia n considerare tipul obiectului creat i deci,
va fi apelat metoda subclasei. Vezi, mai sus, cazul 3. n schimb, se obine
accesul la data membru a superclasei.
II) Metodele i datele membru sunt statice.

Exemplul 7.52. Relum problema pentru acest caz. Vedei programul de mai jos,
iar rezultatul afiat de el, n Fig. 7.8. n cazurile 1 i 2 comportamentul este acelai,
dar n cazul 3 este apelat metoda superclasei, deci se afieaz clasa A.
Observai faptul c, n acest caz, comportamentul este diferit.
class A
{ static int i=1;
static void tip() { System.out.println("clasa A"); }
}

class B extends A
{ static int i=2;
static void tip() { System.out.println("clasa B"); }
}
public class test {
public static void main(String[] args)
{ // Cazul 1
System.out.println("Cazul 1");
A O=new A(); O.tip();
System.out.println(O.i);
// Cazul 2
System.out.println("Cazul 2"); Figura 7.8.
B O1=new B(); O1.tip(); Rezultatul
System.out.println(O1.i);
// Cazul 3
System.out.println("Cazul 3");
A O2=new B(); O2.tip();
System.out.println(O2.i);
}
}

n terminologia programrii orientate pe obiecte vei ntlni termenul de


legare (static, dinamic). Care este semnificaia lui? Pornind de la referina ctre
obiect, se apeleaz o metod redefinit. Am vzut c, n unele cazuri se apeleaz
metoda superclasei, n altele, se apeleaz metoda subclasei. Cu alte cuvinte, se
apeleaz (leag) o metod sau alta. Aceasta este semnificaia termenului de
legare (adic apel al unei metode sau alta).
Capitolul 7. Programare orientat pe obiecte 285

Legarea este static dac nainte de executarea programului se poate ti


care metod este apelat i este dinamic dac numai n momentul
executrii se decide metoda care va fi apelat. n Java este permis i
legarea dinamic.
Privii exemplul de mai jos, n care legarea dinamic este evident.
Exemplul 7.53. Dac se introduce 0 se afieaz clasa A, iar dac se introduce o
valoare diferit de 0 se afieaz clasa B:
class A
{ int i=1;
void tip() { System.out.println("clasa A"); }
}
class B extends A
{ void tip() { System.out.println("clasa B"); }
}
public class Clasa1 {
public static void main(String[] args) {
A x;
int n=Integer.parseInt(cin.Token());
if (n==0) x=new A();
else x=new B();
x.tip();
}
}

7.10.1. Un exemplu de polimorfism

S se creeze o clas numit Muncitor. Clasa va conine data membru


ore_lucrate i un constructor prin care acesteia i se atribuie o valoare. De
asemenea, clasa conine o metod nestatic salariu() prin care se calculeaz
suma ctigat de acesta (se obine ca produs ntre numrul orelor lucrate i suma
ncasat pentru o or lucrat, n exemplu 2 lei). Dintre muncitori, se selecteaz
eful de echip, care are n subordine mai muli muncitori. Se tie c eful de
echip primete mai mult pentru o or lucrat (n exemplu, 5 lei). Se construiete
clasa Sef_echipa, care este subclas a clasei Muncitor. Metoda salariu()
este redefinit. Dintre efii de echip, unii sunt selectai pentru a urma o coal de
maitri. Dup ce devin maitri, au n subordine mai muli efi de echip. S se
construiasc clasa Maistru, care are ca superclas clasa Sef_echipa. Un
maistru primete pe or mai mult dect un ef de echip (n exemplu 10 lei), deci
metoda salariu() este redefinit. Se cere s se scrie un program care citete un
numr natural n ntre 1 i 3. Dac n este 1, se construiete un obiect al clasei
muncitor, dac n este 2, se construiete un obiect al clasei sef_echipa, iar
dac n este 3, se construiete un obiect al clasei Maistru. De asemenea, se
citete numrul de ore lucrat de persoana respectiv. n final, se va afia salariul
ncasat de persoana citit.
286 Manual de Informatic pentru clasa a XII-a

class Muncitor
{ int ore_lucrate;
Muncitor(int ore_lucrate)
{ this.ore_lucrate=ore_lucrate; }
double salariu()
{ return ore_lucrate * 2; }
}

class Sef_echipa extends Muncitor


{ Sef_echipa(int ore_lucrate)
{ super(ore_lucrate); }
double salariu()
{ return ore_lucrate * 5; }
}

class Maistru extends Sef_echipa


{ Maistru(int ore_lucrate)
{ super(ore_lucrate); }
double salariu()
{ return ore_lucrate * 10; }
}

public class test {


public static void main(String[] args) {
Muncitor x=null;
int tip=Integer.parseInt(cin.Token());
int ore=Integer.parseInt(cin.Token());
switch (tip)
{ case 1: x=new Muncitor(ore); break;
case 2: x=new Sef_echipa(ore); break;
case 3: x=new Maistru(ore); break;
}
System.out.println(x.salariu());
}
}

Observaii !

Exemplul dat se refer la polimorfism i la legarea dinamic. Metoda salariu


este prezent n toate cazurile. Este rulat o metod sau alta n funcie de
valoarea citit, prin urmare avem legare dinamic.

Exist multe alte metode de rezolvare ale acestei probleme. Judecnd dup
problema n sine, ar rezulta c utilizarea polimorfismului poate fi evitat. Aa
este, dar n cazul programelor complexe (de exemplu, n programarea
vizual), utilizarea lui se dovedete extrem de util.
Capitolul 7. Programare orientat pe obiecte 287

7.11. Clase abstracte


Limbajul Java pune la dispoziia programatorilor un mecanism care se
dovedete uneori extrem de eficient i anume clasele abstracte.
O clas abstract conine date membru (nu n mod obligatoriu) i mai multe
metode, dar unele pot fi, la rndul lor abstracte. Pentru o metod abstract, n
clas se trece doar prin antetul ei. Metodele abstracte urmeaz s fie redefinite n
subclase. Orice clas abstract trebuie s fie precedat de cuvntul cheie
abstract i orice metod abstract din cadrul ei trebuie i ea s fie precedat de
acelai cuvnt cheie. Clasele abstracte nu se folosesc direct, adic nu se
instaniaz obiecte ale lor, ci se utilizeaz doar pentru a fi extinse (sunt prin
definiie superclase).
Exemplul 7.54. n programul de mai jos clasa Ex este abstract. Conine dou
metode abstracte, afis1() i afis2(), dar i o metod decid(), care n funcie
de un parametru apeleaz una dintre cele dou metode abstracte. Pentru a putea
folosi clasa Ex, o extindem obinnd astfel clasa Ex1. n clasa Ex1, redefinim cele
dou metode. Totui, clasa Ex1 nu redefinete metoda decid(), deci orice obiect
al ei va folosi metoda din clasa abstract. Acest mecanism, permite ca n clasa
abstract s existe un anumit motor (metod) care apeleaz alte metode care
urmeaz a fi redefinite. Programul de mai jos apeleaz mai nti Afis 1 i apoi
Afis 2:
abstract class Ex
{ abstract void afis1();
abstract void afis2();
void decid(int b)
{ if (b>0) afis1();
else afis2();
}
}
class Ex1 extends Ex
{ void afis1()
{ System.out.println("Afis 1"); }
void afis2()
{ System.out.println("Afis 2"); }
}
public class test {
public static void main(String[] args) {
Ex1 a=new Ex1();
a.decid(1);
a.decid(-1);
}
}
288 Manual de Informatic pentru clasa a XII-a

7.11.1. Un exemplu de clas abstract

Cei care au studiat backtracking n variant iterativ, standardizat, au vzut


faptul c exist o unic metod care apeleaz mai multe metode care au acelai
nume, parametri i acelai rol. A rezolva o problem sau alta nseamn a rescrie
metodele specifice (init(), succesor(), .a.m.d.) dar motorul (metoda
back()) rmne aceeai. De aici i ideea: o clas abstract (Bkt) va reine
metoda back(), care nu este abstract, iar celelalte metode sunt abstracte. A
rezolva o problem nseamn a crea o subclas n care redefinim metodele
necesare (init(), succesor(), valid(),...) conform cerinelor problemei.
Exemplul 7.55. Programul de mai jos, utilizeaz clasa bkt, pentru a o extinde n
vederea rezolvrii problemei particulare de generare a tuturor permutrilor mulimii
{1,2,...,n}, pentru n citit.
abstract class Bkt
{ int[] st; int n;
abstract void init(int k);
abstract boolean am_Succesor (int k);
abstract boolean e_Valid(int k);
abstract boolean solutie(int k);
abstract void tipar();
void back()
{ boolean AS;
int k=1;
st=new int[n+1];
init(k);
while (k>0)
{ do { } while ((AS=am_Succesor(k)) && !e_Valid(k));
if (AS)
if (solutie(k)) tipar();
else {k++;init(k);}
else k--; }
}
}
class Permut extends Bkt {
Permut (int n)
{ this.n=n; }
void init(int k)
{ st[k]=0; }
boolean am_Succesor (int k)
{ boolean rasp=false;
if (st[k]<n) { st[k]++; rasp=true; }
return rasp; }
Capitolul 7. Programare orientat pe obiecte 289

boolean e_Valid(int k)
{ boolean rasp=true;
for (int i=1;i<k;i++)
if (st[i]==st[k]) rasp=false;
return rasp; }
boolean solutie(int k)
{ return k==n; }
void tipar()
{ for (int i=1;i<=n;i++) System.out.print(st[i]);
System.out.println(); }
}
public class test {
public static void main(String[] args) {
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
Permut x=new Permut(n);
x.back();
}
}

Exerciiu ! Se cere s se rezolve problema celor n dame. Folosind clasele


anterioare i polimorfismul, problema devine foarte uoar. Obinem clasa Dame
care extinde clasa Permut. O singur metod trebuie redefinit, metoda boolean
e_Valid(int k).
class Dame extends Permut
{ Dame (int n)
{ super(n); }
boolean e_Valid(int k)
{ boolean rasp=true;
for (int i=1;i<k;i++)
if ((st[i]==st[k]) ||
(Math.abs(st[k]-st[i])==Math.abs(k-i)))
rasp=false;
return rasp;
}
}

Iar programul este asemntor celui anterior:


public class test {
public static void main(String[] args) {
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
Bkt x=new Dame(n);
x.back();
}
}
290 Manual de Informatic pentru clasa a XII-a

7.12. Interfee
Prin interfa vom nelege un proiect de clas. O interfa poate conine
doar constante i antete de metode. Ele sunt acceptate de limbaj i se
presupune c ulterior, interfeele vor fi implementate de una sau mai multe clase. O
interfa arat ca o clas, numai c, n locul cuvntului class, se folosete
cuvntul interface. Atunci cnd scriem o clas care implementeaz o anumit
interfa, se folosete cuvntul cheie implements, ca n exemplul de mai jos. O
interfa poate fi implementat de una sau mai multe clase.

Exemplul 7.56. Mai jos, avem o interfa numit InterfA. Interfaa este
implementat de dou clase, A i B. n main() probm toate acestea prin crearea
a dou obiecte, unul care instaniaz clasa A, altul care instaniaz clasa B.
Programul afieaz:
Afis din clasa A=6 5
Afis din clasa B=7 5
iar codul este:
interface InterfA {
int i=5;
void afis();
}
class A implements InterfA{
int i=6;
public void afis()
{ System.out.println("Afis din clasa A="+i+" "+InterfA.i);}
}
class B implements InterfA {
int i=7;
public void afis()
{ System.out.println("Afis din clasa B="+i+" "+InterfA.i); }
}
public class test {
public static void main(String[] args) {
A x=new A(); x.afis();
B y=new B(); y.afis(); }
}

Mai observm c:

Constantele declarate n interfa (n exemplu constanta i, cu valoarea 5) se


apeleaz prin numele interfeei, urmat de . i de numele constantei.
Constantele pot fi redefinite de date membru (n exemplu de i cu valoarea 6 i
i cu valoarea 7). Att constanta ct i redefinirile ei pot fi apelate simultan.
Capitolul 7. Programare orientat pe obiecte 291

Variabila de tip referin ctre interfa poate memora o referin ctre orice
clas care implementeaz respectiva interfa. Mai mult, legarea este
dinamic, aa cum rezult din exemplul urmtor.

Exemplul 7.57. Pentru clasele implementate anterior, se poate obine acelai efect
dac main() se scrie astfel:
public static void main(String[] args) {
int tip=Integer.parseInt(cin.Token());
if (tip==1) { interfA x=new A(); x.afis(); }
else { interfA y=new B(); y.afis(); }
}

Interfaa poate extinde mai multe interfee.

Exemplul 7.58. S observm c o clas poate extinde o singur clas, dar o


interfa poate extinde mai multe interfee, ca mai jos:
interface A { void metA(); }
interface B { void metB(); }
interface C { void metC(); }
interface Extinsa extends A,B,C
{ void MetE(); }

A implementa o interfa extins nseamn a implementa toate metodele


interfeelor care au stat la baza extinderii, plus metodele a cror antet se
gsete n interfaa extins.

Exemplul 7.59. Mai jos se implementeaz clasa Extinsa:


class Ex implements Extinsa {
public void metA() {System.out.println("metA");}
public void metB() {System.out.println("metB");}
public void metC() {System.out.println("metC");}
public void metE() {System.out.println("metE");}
}
public class test {
public static void main(String[] args) {
Ex x=new Ex();
x.metA(); x.metB(); x.metC(); x.metE();
}
}

4. O clas poate implementa oricte interfee.

Exemplul 7.60. Analizai programul urmtor:


interface A { void metA(); }
interface B { void metB(); }
interface C { void metC(); }
292 Manual de Informatic pentru clasa a XII-a

class Ex implements A,B,C {


public void metA() { System.out.println("metA"); }
public void metB() { System.out.println("metB"); }
public void metC() { System.out.println("metC"); }
}
public class test {
public static void main(String[] args) {
Ex x=new Ex(); x.metA(); x.metB(); x.metC(); }
}
n multe programe se solicit citirea unui numr natural. Aceasta se poate
face prin afiarea unui mesaj, apoi urmeaz citirea propriu-zis a acestuia.
Pentru a permite ca programul s rmn aproape neschimbat atunci cnd
citim un numr natural ntr-un fel sau altul, metoda care citete se va gsi
ntr-o interfa, care este implementat diferit de mai multe clase.

Exemplul 7.61. n acest exemplu interfaa CitScriu conine antetul unei metode
de citire a unui numr natural. Dou clase, IO1 i IO2 implementeaz aceast
interfa. Clasa Suma este nzestrat cu un constructor care are ca parametru o
referin ctre obiectul care efectueaz citirea i o metod, afis(), care citete
dou numere naturale i afieaz suma lor. Rulai programul i prin crearea
obiectului Suma, cu ajutorul instruciunii: Suma s=new Suma (new IO2());.
interface CitScriu {
int citeste(); }
class IO1 implements CitScriu {
public int citeste()
{ System.out.print("Introduceti valoarea ");
return Integer.parseInt(cin.linie()); }
}
class IO2 implements CitScriu {
public int citeste()
{ System.out.print("Tastati valoarea dorita ");
return Integer.parseInt(cin.linie());}
}
class Suma {
CitScriu x;
Suma(CitScriu x) { this.x=x; }
void afis()
{ int n=x.citeste(); n+=x.citeste();
System.out.println("Suma este "+n); }
}
public class test {
public static void main(String[] args) {
Suma s=new Suma (new IO1()); s.afis();
}
}
Capitolul 7. Programare orientat pe obiecte 293

7.13. Specificatori de acces (modificatori de acces)

Forma general prin care o clas este definit se poate observa mai jos. Tot
ce este trecut ntre paranteze drepte este opional.
[<Modificatori clasa>] class <nume clasa> [extends <nume
clasa>] implements [lista interfete]
{ [...] }
Pn acum, nu am prezentat modificatorii de clas. Acetia sunt: public,
abstract i final i se folosesc n aceast ordine.
1. Modificatorul public. Dac este trecut acest modificator, atunci clasa
respectiv poate fi accesat de orice cod Java care acceseaz pachetul n care se
gsete acea clas. Dac acest modificator este absent, atunci clasa poate fi
accesat doar din pachetul n care se gsete. Clasele publice trebuie scrise n
fiiere care le poart numele i au extensia .java.
Observaie foarte important ! n cazul n care la crearea clasei nu se folosete
clauza package (nu se realizeaz un pachet), se consider c respectiva clas
face parte dintr-un pachet fr nume. Pachetul fr nume este alctuit din
totalitatea claselor fr clauza package care se gsesc ntr-un folder. Din acest
motiv, ct timp am lucrat numai cu clase aflate n folder-ul bin, nu a fost nevoie ca
acestea s conin clauza package.
2. Modificatorul abstract - marcheaz o clas abstract (revedei clasele
abstracte). n absen, se consider c respectiva clas nu este abstract.
3. Modificatorul final este trecut atunci cnd nu se dorete ca respectiva clas
s fie extins (derivat, motenit), caz n care aceast operaie este interzis.
n rest, am nvat faptul c o clas poate extinde o singur clas, dar poate
implementa mai multe interfee (vedei: extends, implements).

Pentru definirea datelor membru n Java, avem forma general:


[<Modificatori>] <tip data>
<Nume data membru1>[=valoare]
[Nume data membru2][=valoare]...

Modificatorii sunt:
1. public - data membru poate fi accesat de oriunde este accesibil (deci i
din afara pachetului) i poate fi motenit;
2. protected - data membru poate fi accesat de codul aflat n acelai pachet
i poate fi motenit;
3. private - data membru poate fi accesat numai din clasa n care se afl i
nu este motenit (sau dac vrei, este motenit, dar nu poate fi accesat din
clasa care o motenete, ceea ce este acelai lucru);
294 Manual de Informatic pentru clasa a XII-a

4. modificatorul implicit (package) are efect n absena modificatorilor de mai


sus. Data poate fi accesat de cod din acelai pachet i poate fi motenit numai
de clase ale aceluiai pachet;
5. final data membru este considerat constant, deci nu poate fi modificat;
6. static - data membru nu este memorat de fiecare obiect al clasei respec-
tive (modificatorul a mai fost prezentat).

Modificatorii public, protected, private i cel implicit (package) se


numesc modificatori de acces. Evident, o definiie de dat membru va conine
numai unul din cei trei modificatori sau, n absena lor, se consider c avem
modificatorul implicit.

Pentru declararea unei metode se utilizeaz forma general:


[<Modificatori>] <Tip metoda> <Nume> (<lista parametri>)
[throws <TipClasa1>[<TipClasa2>]...]]<metoda>
Modificatorii sunt prezentai mai jos, iar clauza throws va fi studiat n capitolul
care trateaz excepiile.
1. Modificatorii de acces - au aceeai semnificaie ca la datele membru.
2. final - specific faptul c ntr-o clas derivat, metoda nu poate fi redefinit.
3. static - are ca efect faptul c metoda nu este reinut de fiecare obiect al
clasei respective. Acest modificator a fost prezentat.

7.13.1. Exemple de utilizare a modificatorilor

Exemplul 7.62. Modificatorii sunt abseni. Clasa poate fi accesat din interiorul
pachetului, poate fi derivat, data membru i poate fi motenit ca i metoda
met(). De asemenea, data membru i metoda pot fi accesate de date aflate n
acelai pachet.
class A
{ int i=2;
void met() {System.out.println(Test);}
};
Exemplul 7.63. Clasa test trebuie s se gseasc n fiierul test.java (deoarece
este public). Pentru ea nu se pot crea subclase (pentru c are modificatorul final).
Data membru i este static, adic nu se regsete n fiecare obiect al clasei
respective, iar metoda este nestatic, deci se regsete n fiecare obiect al clasei
respective.
public final class test
{ static int i=2;
void met() {System.out.println("Test"); }
};
Capitolul 7. Programare orientat pe obiecte 295

n aceste condiii, definiia clasei de mai jos este eronat, chiar dac se gsete n
acelai pachet cu clasa test.
class B extends test {}

Exemplul 7.64. Fie clasele de mai jos:


class A
{ private int i=2;
void met() { System.out.println("Test"); }
void metp() { System.out.println(i); }
};
class B extends A
{ void met1() { System.out.println("Test1"); }
}

n aceste condiii, dac n clasa de mai jos, aflat n acelai pachet, se nlocuiesc
cele trei puncte cu instruciunile urmtoare, atunci:
public class test {
public static void main(String[] args) {
A x=new A();
... }
}
a) System.out.println(x.i); - avem eroare, deoarece i are modificatorul
private, deci nu poate fi accesat din afara clasei;
b) x.met(); - se afieaz Test pentru c metoda nu este privat;
c) B y=new B(); y.met1(); - se afieaz Test1;
d) B y=new B(); y.met(); - se afieaz Test;
e) x.metp(); - se afieaz 2. Dei i este privat, el este afiat de met() care
are acces la datele private ale propriei clase.

Exemplul 7.65. Fie clasa de mai jos. Atunci:


class A
{ final int i=2;
final void met() {System.out.println("Test");}
void metp() { System.out.println(i);}
}

a) Clasa urmtoare, aflat n acelai pachet, este eronat pentru c data membru
i este cu modificatorul final, este deci considerat constant i prin urmare nu i
se poate modifica valoarea:
public class test {
public static void main(String[] args) {
A x=new A(); x.i=4; }
}
296 Manual de Informatic pentru clasa a XII-a

b) Clasa urmtoare, aflat n acelai pachet, este eronat pentru c extinde clasa
A i redefinete o metod care conine modificatorul final:
class B extends A
{ void met()
{ System.out.println("Test1"); }
}

c) Clasa urmtoare, aflat n acelai pachet, este corect pentru c, dei extinde
clasa A, redefinete o metod care nu are modificatorul final:
class B extends A
{ void metp()
{ System.out.println("Test2"); }
}

7.14. Excepii (tratarea erorilor)


Prin excepie vom nelege o situaie nedorit n care poate ajunge un
program n timpul rulrii. Exist nenumrate exemple de excepii:
se dorete citirea unui numr natural, dar din greeal, utilizatorul introduce
un caracter;
datele introduse pentru diverse cmpuri nu sunt n plaja de valori admis
pentru cmpul respectiv;
un vector are n componente (indicii sunt de la 0 la n-1) i se ncearc, de
exemplu, s se atribuie o valoare componentei de indice n;
se ncearc deschiderea unui fiier inexistent;
...

Pentru a rezolva astfel de situaii, n Java exist un mecanism extrem de


bine pus la punct (mecanism de tratare a excepiilor).

7.14.1. Mecanismul de tratare a excepiilor

Pentru a prezenta acest mecanism vom porni de la un exemplu extrem de


simplu, att de simplu nct ar putea fi tratat fr probleme i n absena acestuia.

Exemplul 7.66. S se citeasc i s se afieze un numr natural 1n5. Practic,


problema se reduce la citirea unui ntreg i afiarea lui. Dar, n timpul executrii,
din greeal, se poate introduce o valoare numeric care nu este ntre aceste
valori. Cum procedm, altfel dect n mod clasic?
Capitolul 7. Programare orientat pe obiecte 297

Privii exemplul urmtor, n care dac numrul citit este ntre 1 i 5, acesta
este afiat, altfel se afieaz mesajul 1<=n<=5:
class Eroare extends Exception
{ void afis()
{ System.out.println("1<=n<=5"); }
}
class t {
public static int citesc() throws Eroare
{ int n=Integer.parseInt(cin.linie());
if (n>=1 && n<=5) return n;
else throw new Eroare();
}
public static void main(String[] args) {
try
{ int numar=citesc();
System.out.println(numar);}
catch (Eroare er) {er.afis();}
}
}
a) Clasa Eroare extinde clasa Exception (este obligatoriu s fie precizat
aceast extensie. Ea conine o singur metod, void afis(), care are rolul de a
afia mesajul de eroare.
b) La sfritul antetului metodei int citesc() se gsete cuvntul cheie
throws, urmat de numele clasei care trateaz eroarea respectiv. Prin aceasta se
anun c respectiva metod poate ntoarce fie un ntreg (n caz de introducere
reuit a datelor, fie o referin ctre un obiect al clasei Eroare (n caz de
introducere nereuit a datelor). Iat deci, c n acest caz, metodele pot ntoarce
i date de alt tip dect cel dat de tipul metodei! Acest aspect este esenial.
Instruciunea throw returneaz referina ctre un obiect al clasei Eroare.
c) Utilizarea metodei citesc() se face, n mod obligatoriu, cu ajutorul
instruciunii try (ncearc). Secvena n care poate aprea excepia, se gsete n
instruciunea compus subordonat lui try (n exemplu int numar=citesc()).
Dac citirea reuete, programul i ncheie executarea, altfel, se verific dac
obiectul ntors de metod este de tip Eroare (vezi clauza catch). n caz afirmativ,
se execut metoda afis() a acestui obiect (er este referina ctre obiect).
n sintez, putem afirma:
clauza throws are rolul de a specifica faptul c o metod poate ntoarce i
referine ctre obiectele altor clase (dac extind clasa Exception). Dac
sunt mai multe clase, atunci numele acestora sunt separate prin virgul.
instruciunea throw - returneaz referina ctre unul din obiectele claselor
trecute dup clauza throws.
instruciunea try are forma general (ceea ce este trecut ntre paranteze
drepte este facultativ):
298 Manual de Informatic pentru clasa a XII-a

try { secvena de instruciuni care pot conduce ctre excepii }


catch (ER1 ob1) { secvena care trateaz excepia cu clasa Er1 }
[ catch (ER2 ob2) { secvena care trateaz excepia cu clasa Er2 }
catch (ER3 ob3) { secvena care trateaz excepia cu clasa Er2 }
...
catch (ERn obn) { secvena care trateaz excepia cu clasa Ern } ]
[ finally { secvena se execut indiferent dac a fost eroare sau nu}]

Exemplul 7.67. Extindem, ce-i drept, n mod artificial exemplul anterior. Pentru
cele dou excepii (n<1 i n>5) vom utiliza dou metode diferite aflate n clase
diferite (Eroare1 i Eroare2). n acest caz metodele sunt de tip constructor, deci
corpurile catch sunt vide.
class Eroare1 extends Exception
{ Eroare1() { System.out.println("1<=n");}
}
class Eroare2 extends Exception
{ Eroare2() { System.out.println("n<=5"); }
}
class t {
public static int citesc() throws Eroare1,Eroare2
{ int n=Integer.parseInt(cin.linie());
if (n<1) throw new Eroare1();
else
if (n>5) throw new Eroare2();
else return n;
}
public static void main(String[] args) {
try
{ int numar=citesc();
System.out.println(numar); }
catch (Eroare1 er1) {}
catch (Eroare2 er2) {}
}
}

Una dintre raiunile existenei unui mecanism de tratare a excepiilor este


dat de faptul c, n anumite cazuri, excepia poate fi tratat n mod
corespunztor, dup care secvena se poate relua (fr ca programul s-i
ncheie executarea).

Exemplul 7.68. Revenim asupra exemplului dat, n care se citesc numere naturale
din intervalul [1,5]. Programul urmtor citete i afieaz un vector cu 3 astfel de
componente. n momentul n care s-a introdus un numr greit citirea se reia.
Programul i ncheie executarea atunci cnd au fost citite toate cele 3 componente
ale vectorului.
Capitolul 7. Programare orientat pe obiecte 299

class Eroare extends Exception


{ void afis()
{ System.out.println("1<=n<=5");
}
}
class e {
public static int citesc() throws Eroare
{ int n=Integer.parseInt(cin.linie());
if (n>=1 && n<=5) return n;
else throw new Eroare();
}
public static void main(String[] args) {
int[] V=new int[3];
for (int i=0;i<3;i++)
try { V[i]=citesc(); }
catch (Eroare er) { er.afis(); i--; }
System.out.println("Am citit");
for (int i=0;i<3;i++)
System.out.print(V[i]+" ");
}
}

Dac clasa care trateaz excepia extinde clasa Exception, atunci este
obligatoriu ca apelul metodei ce poate returna o excepie s se fac n
construcia try, ca n exemplul anterior, sau metoda care apeleaz o astfel
de metod s conin n antet clauza throws.

Exemplul 7.69. Dac n metoda main() de mai sus, am avea V[]=citesc(),


fr construcia try, atunci am primi eroare de compilare.

Exemplul 7.70. citesc() poate fi apelat ca mai jos, unde metoda main()
conine clauza throws. Oricum, n acest caz, dac numrul nu este n intervalul
[1.5], excepia este tratat printr-un mesaj implicit n care se precizeaz numele
clasei creia i aparine obiectul returnat.
public static void main(String[] args) throws Eroare {
System.out.println(citesc()); }

Clasa Exception conine (printre altele):

un constructor implicit (fr parametru): Exception();


un constructor cu parametru de tip String: Exception(String mes);
o metod care returneaz mesajul mes, primit de constructor: String
getMessage().

Exemplul 7.71. n aceste condiii, programul din exemplul 7.68 poate fi scris i ca
mai jos (mai simplu):
300 Manual de Informatic pentru clasa a XII-a

class e {
public static int citesc() throws Exception
{ int n=Integer.parseInt(cin.linie());
if (n>=1 && n<=5) return n;
else throw new Exception("1<=n<=5");
}
public static void main(String[] args) {
int[] V=new int[3];
for (int i=0;i<3;i++)
try { V[i]=citesc();}
catch (Exception er)
{i--; System.out.println(er.getMessage()); }
System.out.println("Am citit");
for (int i=0;i<3;i++)
System.out.print(V[i]+" "); }
}

Uneori, este deranjant faptul c instruciunea capabil s produc o excepie


trebuie pus automat sub try, iar clasa creia i aparine trebuie s conin clauza
throws. Mai mult, chiar n Java exist metode care pot produce excepii, dar care
pot fi folosite fr try. De exemplu, metoda parseInt a clasei Integer. Privii
programul urmtor, n care dac irul de caractere introdus poate fi convertit ctre
un ntreg se afieaz numrul, altfel programul se termin cu excepie. i toate
acestea fr try...
class e {
public static void main(String[] args) {
int n=Integer.parseInt(cin.linie()); }
}

S analizm antetul complet al metodei parseInt:


public static int parseInt(String s)
throws NumberFormatException

Observm c, n cazul n care apare o excepie, se apeleaz la clasa


NumberFormatException. De aici, putem deduce o prim observaie: dac
dorim ca programul nostru s furnizeze un mesaj n caz de excepie, putem
proceda ca mai jos, adic s folosim construcia try, i n caz c se returneaz un
obiect al clasei NumberFormatException, s afim un mesaj de eroare lmuritor.
class e {
public static void main(String[] args) {
System.out.print("n="); int n=1;
try { n=Integer.parseInt(cin.linie());}
catch (NumberFormatException e)
{ System.out.println("Valoare nenumerica"); }
System.out.println(n);
}
}
Capitolul 7. Programare orientat pe obiecte 301

Mai mult, citirea se poate efectua pn cnd valoarea introdus este corect, ca n
programul urmtor:
class e {
public static void main(String[] args) {
int i=1, n=1;
while (i==1)
{ System.out.print("n=");
try
{ n=Integer.parseInt(cin.Token()); i=0; }
catch (NumberFormatException e)
{ System.out.println ("Valoare nenumerica"); }
}
System.out.println(n);
}
}

Dac n secvena subordonat lui try se depisteaz o excepie, se


abandoneaz executarea tuturor instruciunilor. n exemplu, aceasta implic
faptul c i rmne 1, deci se reia secvena subordonat lui while. Dac nu
a aprut excepia, i devine 0 i prin urmare, executarea lui while este
considerat ncheiat.

Dac nu l-am fi declarat de la nceput pe n cu valoare iniial, oricare ar fi


ea, programul ar fi semnalat eroare la compilare, pentru c se ajunge la
afiarea lui. Ori, n Java, nu este permis afiarea coninutului unei variabile
neiniializate.

Totui, nu se rezolv problema pus: cum este posibil ca parseInt s


poat fi folosit fr construcia try?

Obiectele claselor care extind clasa RuntimeException sau Error pot fi


apelate fr ca antetul lor s conin clauza throws, ca mai jos:

class Eroare extends RuntimeException


{ void afis()
{ System.out.println("1<=n<=5");}
}
class e {
public static int citesc() // fara throws
{ int n=Integer.parseInt(cin.linie());
if (n>=1 && n<=5) return n;
else throw new Eroare();
}
public static void main(String[] args) {
...
}
}

Pot exista urmtoarele cazuri:


302 Manual de Informatic pentru clasa a XII-a

a) Dac n main() avem secvena de mai jos, atunci distingem dou cazuri:
int numar=citesc();
a1) Se introduce un numr ntre 1 i 5 - programul nu genereaz excepie i
totul este OK!
a2) Se introduce un numr n afara intervalului. Va fi afiat o excepie ntr-un
format implicit i nu se va afia mesajul "1<=n<=5".
b) Dac n main() avem secvena:
try
{ int numar=citesc();
System.out.println(numar); }
catch (Eroare er) { er.afis(); }

b1) Se introduce un numr ntre 1 i 5 - programul nu genereaz excepie i


totul este OK!
b2) Se introduce un numr n afara intervalului. Va fi afiat excepia cu
mesajul "1<=n<=5".

7.14.2. Metodele care pot returna, n caz de excepii, obiecte


ale unor alte clase

Privii antetul metodei parseInt a clasei Integer. Din considerente


didactice, pn acum antetul nu a fost prezentat integral. n cazul n care se
ntlnete o excepie, se returneaz un obiect al clasei NumberFormatException:
public static int parseInt(String s)
throws NumberFormatException
Exemplul 7.72. Aceasta poate ajuta programatorul s gestioneze situaia, ca n
exemplul de mai jos, unde se citete o variabil ntreag care este afiat. n cazul
n care valoarea introdus nu este corect, se reia citirea.
class e {
public static void main(String[] args) {
int i=0;
while (i==0)
try
{ int numar=Integer.parseInt(cin.Token());
System.out.println(numar);
i=1; }
catch (NumberFormatException e)
{ System.out.println("Numar eronat"); }
}
}
Capitolul 7. Programare orientat pe obiecte 303

Iat i antetul complet al metodelor parseFloat i parseDouble:


1. public static double parseDouble(String s)
throws NumberFormatException
2. public static float parseFloat(String s)
throws NumberFormatException

n cazul mpririi la 0 pentru tipuri ntregi, se returneaz un obiect al clasei


ArithmeticException.

Exemplul 7.73. Vedei codul de mai jos:


class t {
public static void main(String[] args) {
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
System.out.print("m=");
int m=Integer.parseInt(cin.Token());
try { System.out.println(n/m); }
catch (ArithmeticException e)
{ System.out.println ("Impartire la 0 "); }
}
}

n cazul n care se ncearc s se atribuie o valoare unei componente


inexistente a unui vector, se returneaz pentru tipuri ntregi un obiect al
clasei ArrayIndexOutOfBoundsException.

Exemplul 7.74. Vedei codul de mai jos:


class t {
public static void main(String[] args) {
int []v=new int[3];
System.out.print("indice=");
int indice=Integer.parseInt(cin.Token());
try { v[indice]=1; }
catch (ArrayIndexOutOfBoundsException e)
{ System.out.println ("Eroare indice"); }
}
}

Observaie foarte important ! Clasele ArrayIndexOutOfBoundsException,


ArithmeticException ca i multe altele de acest tip, sunt rezultate n urma
unor derivri ale clasei Exception. Cum un parametru de tip referin ctre un
obiect al superclasei poate reine referine ctre obiectele subclaselor sale, atunci
putem scrie clauza catch de forma:
catch (Exception e) {...}
304 Manual de Informatic pentru clasa a XII-a

7.14.3. Exemple de tratare a excepiilor

Exemplul 7.75. Validare pentru numere reale. S se scrie un program care


citete n, numr natural i n numere reale. Se cere s se calculeze suma
numerelor citite. Dac un numr real se introduce greit (nu respect formatul de
numr real) se reia citirea lui.
Metoda parseDouble, a clasei Double, returneaz fie un numr de format
double, fie un obiect al clasei NumberFormatException.
class e {
public static void main(String[] args) {
double s=0;
System.out.print("n=");
int n=Integer.parseInt(cin.linie());
for (int i=0;i<n;i++)
try { double x=Double.parseDouble(cin.linie());s+=x; }
catch (NumberFormatException e)
{ System.out.println("Numar eronat");i--; }
System.out.println("S="+s);
}
}
Exemplul 7.76. Validare alfabetic. Se citete un ir de caractere alctuit din mai
multe cuvinte separate prin blank-uri. Dac irul citit conine numai literele
alfabetului (mici sau mari) sau blank-uri, acesta se va afia, altfel se va tipri
mesajul sir nealfabetic.
Metoda citSir() citete irul i l valideaz. Dac irul este valid, el este
returnat, altfel se returneaz un obiect al clasei Nealfabetic. n main() se
testeaz dac a fost returnat irul (try), caz n care acesta este afiat, sau a fost
returnat un obiect al clasei Nealfabetic, caz n care se afieaz mesajul de
eroare sir nealfabetic prin utilizarea metodei mesaj() a obiectului.
class Nealfabetic extends RuntimeException {
String mesaj()
{ return "sir nealfabetic"; }
}
class e {
static String citSir()
{ String sir=new String(cin.linie());
boolean gasit=false;
for (int i=0;i<sir.length();i++)
if ( (sir.charAt(i)<'A' || sir.charAt(i)>'Z') &&
(sir.charAt(i)<'a' || sir.charAt(i)>'z') &&
sir.charAt(i)!=' ') gasit=true;
if (gasit) throw new Nealfabetic();
else return sir;
}
Capitolul 7. Programare orientat pe obiecte 305

public static void main(String[] args) {


boolean corect=false;
System.out.print("Tastati sirul ");
String s="";
try { s=citSir(); System.out.println(s); }
catch (Nealfabetic e) { System.out.println(e.mesaj()); }
}
}

Exerciiile 1. i 2. se refer la clasa de mai jos, care se gsete deja compilat n


directorul bin:
class a {
int a=1;
int a()
{ int a=2;
return a; }
}

1. Care dintre programele de mai jos este corect din punct de vedere sintactic?

a) b)
class ex { class ex {
public static void public static void
main(String[] args) { main(String[] args) {
a a=new a(); } a x=new a; }
} }

c) d)
class ex { class ex {
public static void public static void
main(String[] args) { main(String[] args) {
x a=new a(); } a x=new (); }
} }

2. Fiind dat x, o variabil care reine o referin ctre un obiect al clasei a, care
dintre instruciunile de mai jos afieaz valoarea 2?

a) System.out.println(x.a);
b) System.out.println(x.a.a);
c) System.out.println(x.a());
d) Nici una dintre instruciunile de mai sus nu afieaz valoarea 2.
306 Manual de Informatic pentru clasa a XII-a

3. Fiind dat clasa de mai jos, ce afieaz instruciunea aflat n main():


A.M(3.5)?
class A {
static void M(int x) {System.out.println(1);}
static void M(float x) {System.out.println(2);}
static void M(double x) {System.out.println(3);}
static void M(char x) {System.out.println(4);}
}
a) 1; b) 2; c) 3; d) 4.

4. Ce afieaz programul urmtor?


class A {
int a,b;
A(int a, int b)
{ this.a=a;
this.b=b; }
A (int x) {b=x;}
void Afis() {System.out.print (a+" "+b);}
}
class ex {
public static void main(String[] args) {
A x=new A(3);
x.Afis(); }
}
a) Eroare; b) 3 0; c) 0 0; d) 0 3.

5. Creai o clas numit Lista, care opereaz cu liste liniare simplu nlnuite. Un
element al listei liniare simplu nlnuite este descris de clasa Nod:
class Nod
{ Nod adr_urm;
int nr; }
Clasa Lista va conine:
Data membru v - adresa primului nod al listei. n cazul n care lista este nul,
v reine null.
Metoda void adaug (int nr) - adaug la sfritul listei un nod care va
reine valoarea numeric nr, primit de metod ca parametru.
Metoda void afis() - care afieaz valorile reinute de noduri.

6. Adugai clasei Lista o metod void stergP() care permite tergerea


primului nod introdus.
7. Adugai clasei Lista o metod void stergU() care permite tergerea
ultimului nod introdus.
Capitolul 7. Programare orientat pe obiecte 307

8. Adugai clasei Lista o metod void adaugI(int nr) care permite ca la


nceputul listei s se adauge un nod care s conin valoarea nr, primit de
metod ca parametru.
9. Scriei un program care creeaz o list liniar simplu nlnuit. Programul va
utiliza clasa Lista, creat anterior. Numerele se citesc de la tastatur i se vor
gsi n list n ordinea n care au fost introduse. irul de numere se consider
ncheiat atunci cnd se citete numrul 0 (acesta nu este introdus n list).
10. Realizai o clas numit Stiva, care opereaz cu stive alocate ca liste liniare
simplu nlnuite. Un element al listei este descris de clasa Nod:
class Nod
{ Nod adr_prec;
int nr; }
Clasa Stiva va conine urmtoarele:
Data membru varf - reine adresa ultimului nod introdus n stiv.
Metoda void push(int nr) - adaug un nod stivei i acesta va reine
valoarea numeric nr, primit de metod ca parametru.
Metoda int pop() - extrage un nod din stiv i returneaz valoarea pe care
acesta o reinea. Dac stiva este vid, returneaz -1.

11. Scriei un program care s citeasc 0<a<b, numere naturale i s afieze un


numr aleator n intervalul [a,b].
12. Scriei un program care citete x, numr real, i n>0, numr natural i
calculeaz P=sin(x)*sin(2x)*...sin(n*x). Se presupune c x reprezint o
valoare exprimat n radiani.
13. Se citete de la tastatur un ir de caractere. irul conine cel puin 10
caractere. Se cere s se afieze numai primele 10 caractere din ir.
14. Se citete de la tastatur un ir de caractere. Dac irul are mai mult de 4
caractere s se afieze numai primele 4, altfel se va afia irul citit.
15. Scriei o clas, numit Afis, care conine metoda String aNum(int
lung, String s) metod ce are rolul de a ntoarce irul reinut de s, pe
lungimea lung. Dac numrul de caractere ale irului este mai mare dect lung,
se ntoarce subirul format din primele lung caractere ale irului, altfel se ntoarce
un ir pe lungimea lung, ir alctuit din caracterele irului iniial la care se adaug
un numr corespunztor de blank-uri. Exemple pentru lung=5:
irul: Mihai - se returneaz Mihai.
irul: tastatura - se returneaz tasta.
irul: aer - se returneaz aer .
Observaie ! O astfel de metod este util pentru afiarea unui ir de caractere pe
o anumit lungime.
308 Manual de Informatic pentru clasa a XII-a

16. Scriei un program care citete n, numr natural i n iruri de caractere.


Programul va afia pe cte o linie, primele 5 caractere ale fiecrui ir citit. Dac
irul are mai puin de 5 caractere, se va afia irul, urmat de un numr de blank-uri
astfel nct lungimea total afiat s fie de 5 caractere.
17. Adugai clasei Afis metoda String num(int lung, int v) care
are rolul de a returna irul de lungime lung, alctuit din irul obinut din convertirea
ntregului v n ir i n cazul n care acest ir are lungimea mai mic dect lung, el
va fi precedat de un numr corespunztor de blank-uri. n situaia n care lungimea
irului obinut din conversia numrului este mai mare dect lung, metoda va
returna un mesaj de eroare. Exemple pentru lung=3:
Numrul 125 - se returneaz 125.
Numrul 1 - se returneaz 1.
irul: 3152 - se returneaz "Numarul nu poate fi afisat";
18. Scriei un program care citete n, numr natural i n numere naturale.
Programul va afia, pe cte o linie, fiecare dintre cele n numere naturale citite.
Numerele se vor afia pe 5 caractere i vor fi aliniate la dreapta.
Exemplu: n=3, numerele citite sunt: 12234, 45, 4. Se va afia:
12234
45
4
Observaie ! n practic, irurile alctuite din caractere se afieaz aliniate la
stnga, iar valorile numerice se afieaz aliniate la dreapta.
19. Adugai clasei Afis metoda String num(int lung, int zec,
double v) care returneaz irul rezultat din conversia unui numr real (indiferent
de numrul de zecimale). irul are lungimea lung, numrul este afiat aliniat la
dreapta i va avea zec zecimale. n ipoteza n care numrul nu poate fi afiat prin
utilizarea a lung caractere, se va returna un mesaj de eroare.
Num(5,2,23.3456) returneaz 23.34;
Num(5,2,3.3456) returneaz 3.34;
Num(5,2,-9) returneaz -9.00;
Num(5,2,123) returneaz Numarul nu poate fi afisat.
20. Scriei un program care citete n, numr natural i n numere reale. Programul
va afia pe cte o linie fiecare numr citit. Numerele se vor afia pe 8 caractere,
vor fi aliniate la dreapta i vor avea obligatoriu dou zecimale (indiferent de
numrul de zecimale pe care l au).
21. S se extind clasa cin. Noua clas se va numi Cit i va conine metodele:
static int Intreg() // citete i returneaz un numr ntreg;
static double Real() // citete i returneaz un numr real;
static char Caracter() // citete i returneaz un caracter;
static String Sir() // citete i returneaz un ir de caractere.
Capitolul 7. Programare orientat pe obiecte 309

22. Utilizai noua clas ntr-un program care citete i afieaz un numr ntreg,
unul real i un caracter.
23. Fiind dat clasa de mai jos (Baza), scriei o clas (Lista) care creeaz o
list liniar simplu nlnuit n care elementele sunt obiectele clasei Baza.
Evident, elementele acestei liste nu au nici o alt informaie, n afara celei de
adres.
class Baza { Baza adr_urm; }
Lista va conine:
Baza v; - data membru; reine vrful listei;
Baza varf() - returneaz vrful listei liniare (adresa primului element);
void adaug (Baza Nod) - adaug la sfritul listei un element.
24. Creai clasa Int, care s extind clasa Baza i s conin n plus:
int val; - dat membru;
Int (int val) - constructor;
int valoare() - returneaz valoarea reinut de val.
25. Scriei un program care creeaz o list liniar simplu nlnuit cu n elemente
(n citit de la tastatur) de tip Int. Valorile reinute de obiectele de tip Int sunt, de
asemenea, citite de la tastatur. Lista va fi construit cu ajutorul clasei Lista.
26. Scriei un program care creeaz o list liniar simplu nlnuit cu n elemente
(n citit de la tastatur) de tip String. irurile de caractere reinute de obiectele de
tip Sir sunt, de asemenea, citite de la tastatur. Lista va fi construit cu ajutorul
clasei Lista.

Testele de la 27 la 30 se refer la clasele urmtoare. De fiecare dat,


instruciunea (sau setul de instruciuni) la care se refer ntrebarea va fi scris n
locul liniei lips (punctat):
class A
{ int x=1;
void met() {System.out.println("Clasa A");}
}
class B extends A
{ int x=2;
void met() {System.out.println("Clasa B");}
}
class C extends B
{ int x=3;
void met() {System.out.println("Clasa C");}
}
public class test {
public static void main(String[] args) {
...
}
}
310 Manual de Informatic pentru clasa a XII-a

27. Ce se afieaz n urma executrii secvenei: A x=new B();x.met(); ?


a) Clasa A; b) Clasa B; c) Clasa C; d) EROARE.
28. Ce se tiprete n urma executrii secvenei:
A x=new B(); System.out.println(x.x); ?
a) 1; b) 2; c) 3; d) EROARE.
29. Ce se afieaz n urma executrii secvenei de mai jos?
B x=(A)new B(); x.met();
a) Clasa A; b) Clasa B; c) Clasa C; d) EROARE.

30. Ce se tiprete n urma executrii secvenei: B x=new C(); x.met(); ?


a) Clasa A; b) Clasa B; c) Clasa C; d) EROARE.
31. Utiliznd polimorfismul, scriei un program care citete un numr natural n i
dac este prim, afiai succesorul su n mulimea numerelor prime, dac este
impar (fr a fi prim) afiai succesorul su n mulimea numerelor impare, iar dac
este par, afiai succesorul su n mulimea numerelor pare. Exemple: n=7 se
afieaz 11; n=21 se afieaz 23; n=8 se afieaz 10.
32. Se citesc n, numr natural i n numere reale. Se cere s se afieze suma
numerelor citite. Pentru citirea numerelor, programul va utiliza mecanismul
excepiilor (n caz de introducere greit a datelor - care nu corespund formatului de
numr real, se va afia un mesaj corespunztor i se va relua citirea numerelor).
33. La fel ca mai sus numai c cele n numere citite trebuie s fie mai mici dect
10. De asemenea, se va folosi mecanismul excepiilor att pentru formatul real, ct
i pentru valorile admise.
34. Scriei un program care citete dou numere reale a i b i afieaz rezultatul
mpririi lui a la b. Dac ambele numere sunt 0, se va afia un mesaj lmuritor,
dac numai b este 0, se va tipri alt mesaj lmuritor, iar dac mprirea se poate
face, se va afia rezultatul mpririi. Evident, programul va utiliza mecanismul
excepiilor i metode ale claselor nfurtoare (de revzut!).
35. La fel ca mai sus numai c se vor utiliza excepiile i la citirea numerelor a i b,
iar n caz c mprirea nu se poate efectua se va repeta citirea numerelor a i b.

(pentru verificare, rezolvrile se gsesc la pag. 384)


CAPITOLUL
Programare vizual

Prin studierea acestui capitol vom nva s scriem propriile programe utiliznd
programarea vizual. Astzi, activitatea de programare este de neconceput n
absena ei. De asemenea, studiul acestui capitol reprezint o excelent
recapitulare a OOP. V vei da seama c, n absena OOP, este
foarte greu s realizezi un astfel de program. Pentru toate
programele pe care le realizai, nu uitai s proiectai
interfee frumoase i uor de neles pentru utilizatori.

Concepte de baz ale programrii vizuale n Java

Studiul principalelor componente

Obiecte grafice. Clasa Graphics

Accesarea i prelucrarea datelor

Cuvinte cheie: fereastr, container, component, poziionare,


gestionare, meniu, accelerator, cutie de dialog, culoare,
bar de unelte, imagine, date, flux, JDBC
312 Manual de Informatic pentru clasa a XII-a

8.1. Conceptele de baz ale programrii vizuale n Java

Pentru a nelege conceptele care stau la baza programrii vizuale vom porni
de la un exemplu arhicunoscut n programarea clasic.

Exemplul 8.1. Rezolvarea ecuaiei de gradul 2. Am putut observa, atunci cnd


am rezolvat n mod clasic problema, c programul obinut este ct se poate de
neprietenos si inestetic. n plus, un program clasic ndeprteaz un eventual
utilizator neinformatician al programului. Acesta are impresia c are nevoie de
multe cunotine pentru utilizarea programului.

Figura 3.1. Interfaa grafic cu utilizatorul i cutia de dialog cu rezultatele

Rulai programul urmtor i testai-l! n primul rnd vei observa c interfaa


cu utilizatorul este una prietenoas. Este evident pentru oricine c trebuie
introdui coeficienii i c, pentru a obine rezultatul, trebuie apsat butonul
Rezultat. n fapt, interfaa grafic cu utilizatorul este, dac vrei, ambalajul
programului, pentru c acesta conine, ascuns, algoritmul clasic de rezolvare.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame implements ActionListener
{ JTextField a,b,c,r; JButton but;
public Fer(String titlu) {
super(titlu);
setSize(210,200); setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
//a
x.setLayout(new FlowLayout ());
JLabel et1=new JLabel ("a="); x.add(et1);
a=new JTextField(15); x.add(a);
//b
JLabel et2=new JLabel ("b="); x.add(et2);
b=new JTextField(15); x.add(b);
Capitolul 8. Programare vizual 313

//c
JLabel et3=new JLabel ("c="); x.add(et3);
c=new JTextField(15); x.add(c);
//butonul
but=new JButton("Rezultat"); x.add(but);
but.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ double aR=0,bR=0,cR=0, er=0;
try // incerc sa-l citesc pe A
{ aR=Double.parseDouble(a.getText()); }
catch (NumberFormatException exc)
{ er=1;
JOptionPane.showMessageDialog(this,
"a este introdus gresit");
}
try // incerc sa-l citesc pe B
{ bR=Double.parseDouble(b.getText()); }
catch (NumberFormatException exc)
{ er=1;
JOptionPane.showMessageDialog(this,
"b este introdus gresit");
}
try // incerc sa-l citesc pe c
{ cR=Double.parseDouble(c.getText()); }
catch (NumberFormatException exc)
{ er=1;
JOptionPane.showMessageDialog(this,
"c este introdus gresit");
}
if (er==0)// daca a b c sunt corecte rezolvarea ecuatiei
if (aR!=0)
if (bR*bR-4*aR*cR<0)
JOptionPane.showMessageDialog(this,
"Nu are solutii reale");
else
JOptionPane.showMessageDialog(this,
"x1="+(-bR+Math.sqrt(bR*bR-4*aR*cR))/(2*aR)+"\n"+
"x2="+(-bR-Math.sqrt(bR*bR-4*aR*cR))/(2*aR));
else
if(bR!=0)
JOptionPane.showMessageDialog(this, "x1="+-cR/bR);
else
if(cR!=0)
JOptionPane.showMessageDialog(this, "NU are solutii");
else JOptionPane.showMessageDialog(this,
"Infinitate de solutii");
}
}
314 Manual de Informatic pentru clasa a XII-a

public class baza {


public static void main(String args[]) {
Fer fp=new Fer("Ecuatia de gradul 2");
}
}

La baza programrii vizuale st noiunea de fereastr. Fereastra va conine


mai multe componente vizuale cum ar fi edit-uri, butoane, imagini, etc. Asupra lor
utilizatorul poate acioana cu mouse-ul sau prin intermediul tastaturii. n programul
nostru, fereastra iniial afieaz trei etichete a=0, b=0, c=0 i trei edit-uri care
permit introducerea coeficienilor a, b, c.

Unele componente trebuie s rspund unor evenimente. Un exemplu de


eveniment este, executarea unui clic cu mouse-ul asupra unei componente. n
programul nostru, executarea unui clic asupra butonului Rezultat lanseaz o
metod, numit actionPerformed, care valideaz datele de intrare (verific
corectitudinea lor). n caz c acestea sunt valide (corecte), calculeaz rdcinile
ecuaiei, altfel afieaz mesaje de informare. Afiarea mesajelor de eroare i a
rezultatelor se face cu ajutorul unor cutii de dialog de informare.

O fereastr i, n general, orice component este un obiect al unei clase.


Pentru a putea realiza un program care utilizeaz programarea vizual, trebuie s
putem rspunde ntrebrilor urmtoare:

1. Cum putem stabili caracteristicile ferestrei?


2. Care este mecanismul prin care unei ferestre i se ataeaz alte componente?
3. Care este mecanismul prin care componentele rspund evenimentelor?
4. Cum se stabilete modul n care arat o component?
5. Cum putem scrie un program care s ruleze independent de rezoluia
monitorului?
6. Care este mecanismul prin care poziionm diversele componente n cadrul
ferestrei?

La toate aceste ntrebri vom rspunde n acest paragraf !

8.1.1. Prima fereastr

O fereastr este un obiect al clasei JFrame. Clasa


JFrame este reinut n pachetul javax.swing.

Exemplul 8.2. n continuare, putei observa un program


care afieaz o fereastr:

Figura 8.2.
Exemplu de fereastr
Capitolul 8. Programare vizual 315

import javax.swing.*;
public class pv {
public static void main(String args[])
{
JFrame fer=new JFrame("Prima mea fereastra");
fer.setSize(200,300);
fer.setLocation(300,400);
fer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fer.setVisible(true);
}
}

S observm c fereastra conine meniul implicit, poate fi maximizat,


minimizat (adus pe bara de task-uri), dar poate fi i nchis.

Din analiza programului, deducem cteva metode pe care le are clasa


JFrame:

JFrame() - constructor. Dac o fereastr este creat printr-un astfel de


constructor ea apare fr titlu.

JFrame(String titlu) - constructor. Construiete o fereastr care


afieaz un anumit titlu (n exemplu, Prima mea fereastra).

void setSize(int width, int height) - stabilete limea i


nlimea ferestrei.

void setLocation (int x, int y) - stabilete poziia unde va fi


afiat colul din stnga sus al ferestrei (i implicit poziia ferestrei), n raport
cu colul din stnga sus al ecranului. Parametrul x precizeaz distana pe
orizontal a colului ferestrei, iar y distana pe vertical a acestuia (ambele
sunt date n pixeli).

void setDefaultCloseOperation(int a) - stabilete ce se ntmpl


atunci cnd se nchide fereastra (s-a pstrat acel buton x). Parametrii sunt
constante de tip ntreg ale clasei. Cea mai important constant este
EXIT_ON_CLOSE i prin ea, se cere nchiderea ferestrei i ncheierea
executrii programului.

void setResizable(boolean ac) - dac parametrul este false nu


se pot modifica dimensiunile ferestrei.

setVisible(boolean x) - stabilete dac fereastra este vizibil (apare


pe ecran) sau nu (dei exist, nu este afiat).

n programul care rezolv ecuaia de gradul de 2, fereastra este un obiect al


clasei Fer. Analizai cum am descris modul n care trebuie s arate fereastra.
316 Manual de Informatic pentru clasa a XII-a

8.1.2. Mecanismul prin care se ataeaz componente ferestrei.


Clasa Container

Foarte important ! Pentru ca unei ferestre (obiect de tip JFrame) s i se poat


ataa alte componente (cum ar fi butoanele, liste, etc. care sunt obiecte de alte
tipuri), este necesar ca aceasta s conin o referin ctre o structur special,
care la rndul ei va reine referine ctre obiectele (componentele) care sunt
ataate ferestrei. Structura care reine referinele ctre obiectele care se afl pe
fereastr este un obiect al clasei Container.

Alturat putem observa ierarhia Object


claselor din care a rezultat clasa Component
JFrame. Prin urmare, un obiect Container
de tip JFrame sau dintr-o Window
subclas a lui JFrame conine java.awt.Frame
javax.swing.JFrame
datele membru i metodele
clasei Container.

Accesul la container-ul unei ferestre se face utiliznd o metod a clasei


JFrame, numit getContentPane().
Container getContentPane() - returneaz o referin ctre
container-ul ferestrei. Pornind de la aceast referin, putem realiza dou
lucruri:
1. Putem aduga ferestrei componentele dorite. Pentru aceasta se folosete
metoda add() a clasei Container:

Component add(Component comp) - adaug o component ferestrei.


Important: toate componentele sunt derivate din clasa Component. Prin
urmare, parametrul comp poate reine referine ctre componente de orice tip.
2. Putem spune cum s fie aranjate n fereastr componentele adugate.
Important: Mecanismul din Java care rezolv aceast problem presupune
existena unor aa numii gestionari de poziionare. Gestionarii de poziionare
sunt obiecte ale unor clase specifice. Ei aranjeaz automat componentele unui
container. Pentru a ataa unui container un gestionar de poziionare, se
utilizeaz metoda clasei Container numit setLayout():

void setLayout(LayoutManager gest) - ataeaz unui container


un gestionar de poziionare. LayoutManager - este o interfa. Toi
gestionarii de poziionare pe care i vom studia ntr-un paragraf separat au
rezultat ca urmare a implementrii acestei interfee. Aceasta nseamn c
metoda poate fi utilizat pentru ataarea oricrui gestionar de poziionare.
Observaie ! Pentru nceput, vom folosi gestionarul de poziionare FlowLayout, care
are un constructor fr parametri. Pe scurt, acesta aeaz componentele n
fereastr, pe linie, una dup alta. Dac o linie s-a umplut, se trece la linia urmtoare.
Capitolul 8. Programare vizual 317

Clasa Container se gsete n pachetul java.awt.

Exemplul 8.3. Programul care urmeaz afieaz


dou butoane! Apsarea butoanelor nu are nici un
efect.
import java.awt.*;
import javax.swing.*;
class Fer extends JFrame
{ public Fer(String titlu) { Figura 8.3. Fereastr
super(titlu); cu dou butoane
setSize(200,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
JButton A=new JButton("Buton 1"); x.add(A);
JButton B=new JButton("Buton 2"); x.add(B);
setVisible(true); }
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Doua butoane"); }
}

Observaie ! Butoanele ataate sunt componente de tip JButton, care au un


constructor de tip JButton(String s). irul s va aprea pe suprafaa butonului.
Exerciiu ! Analizai, n programul care rezolv ecuaia de gradul 2, modul n care
am ataat ferestrei principale componentele vizuale (etichetele, edit-urile i butonul).

8.1.3. Un mecanism prin care butoanele rspund


evenimentului de apsare

Pn n prezent tim s construim o fereastr, tim s-i atam unul sau mai
multe butoane, dar nu tim s facem de aa manier nct la apsarea butonului
(click pe suprafaa lui) s aib loc o anumit aciune. Este exact ce ne propunem
s prezentm n acest paragraf.

n Java exist o interfa numit ActionListener, asculttorul de


evenimente de tip ActionEvent. Un exemplu de eveniment de tip ActionEvent
este apsarea unui buton. Interfaa conine antetul unei singure metode:
actionPerformed(ActionEvent e).

Pentru ca o component s poat rspunde la un eveniment de tipul


ActionEvent, trebuie s implementeze clasa ActionListener. Aceasta
nseamn c:
1. Clasa care include componenta (fereastra) trebuie s conin clauza
implements ActionListener.
318 Manual de Informatic pentru clasa a XII-a

2. S fie implementat metoda actionPerformed(). Aceast metod se va


executa automat atunci cnd este apsat butonul. Prin urmare, implementarea ei
va scrie codul necesar aciunii dorite.

ActionEvent este o clas care conine metoda:

String getActionCommand() - returneaz irul de caractere asociat


componentei care a transmis evenimentul. Metoda poate fi utilizat pentru a
depista componenta care a transmis evenimentul.

Exemplul 8.4. Extindem programul prezentat n paragraful anterior. Cnd se


apas un buton, n fereastra CMD va aprea irul reinut de butonul apsat:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame implements ActionListener
{
public Fer(String titlu) {
super(titlu);
setSize(200,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
JButton A=new JButton("Buton 1");
x.add(A);
JButton B=new JButton("Buton 2");
x.add(B);
A.addActionListener(this);
B.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ if( e.getActionCommand().compareTo("Buton 1")==0)
System.out.println("Ai apasat Buton 1");
else System.out.println("Ai apasat Buton 2");
}
}

public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Doua butoane"); }
}

Exerciiu ! Analizai, n programul care rezolv ecuaia de gradul 2, modul n care


s-a implementat metoda actionPerformed(). Vei observa modul de citire a
coeficienilor. Acetia sunt introdui sub forma unor iruri de caractere, se preiau
din edit-uri i se ncearc convertirea lor ctre un tip real. n cazul n care conversia
reuete, se presupune c au fost introdui corect. Altfel, se va da mesaj de
eroare. Atenie ! Validarea datelor de intrare este esenial.
Capitolul 8. Programare vizual 319

8.1.4. Componente: elemente de design

Prin component vom nelege un obiect care are o reprezentare grafic.


Exemple de componente: butoane, liste, edit-uri, etichete (am preferat denumirea
lor din cursul de Tehnologia Informaiei). Dac o component este obiect,
nseamn c o component rezult n urma instanierii unei clase. Fiecare tip de
component pe care o vom studia rezult n urma instanierii unei clase specifice
ei. De exemplu, un buton rezult n urma instanierii clasei JButton, o etichet
rezult n urma instanierii clasei JLabel, un edit rezult n urma instanierii clasei
JtextField, .a.m.d.

Important ! Clasele tuturor componentelor enumerate mai sus sunt subclase ale
clasei JComponent. Aceasta nseamn c putem folosi metodele clasei
JComponent pentru orice component.

Observaie ! Clasa JComponent este descendent, dar nu direct, a unei alte clase
numit Component. Atunci cnd prezentm unele metode ale clasei JComponent,
care sunt motenite de la clasa Component nu vom mai face referire la acest lucru,
ci le vom trata ca fcnd parte din clasa JComponent.

n continuare, prezentm cteva metode ale clasei JComponent:

void setBackground(Color c) - metoda stabilete culoarea de fond


a componentei. S observm c parametrul ei este de tip Color.
void setForeground(Color c) - seteaz culoarea caracterelor (n
cazul n care componenta conine un text).

Clasa Color conine anumite constante care indic culoarea i mai multe
metode prin care se poate stabili o culoare. Exemple de constante de
culoare: black, red, white, yellow, etc. De asemenea, clasa conine
constructorul Color(float r, float g, float b) prin care se poate
forma o culoare n sistemul RGB(Red, Green, Blue), sistem studiat la
tehnologia informaiei.

setFont(Font f) seteaz font-ul cu care se scrie, stilul su i mrimea.


Parametrul este un obiect al clasei Font.
Clasa Font are, printre altele, constructorul:
Font(String nume, int stil, int marime).
unde:
nume - este numele font-ului;
stil - stilul. Valorile uzuale sunt: Font.ITALIC (italic), Font.BOLD
(bold), Font.PLAIN (clasic). Se pot folosi i sume, cum ar fi pentru italic
i bold: Font.ITALIC+Font.BOLD.
marime - mrimea font-ului.
320 Manual de Informatic pentru clasa a XII-a

Exemplul 8.5. Butonul (Apasa) va avea fondul de culoare roie, va conine text
scris cu verde, se va utiliza font-ul Arial, de mrime 20 i este scris nclinat i
ngroat (italic i bold). S observm faptul c dimensiunea butonului este stabilit
automat, n funcie de mrimea textului pe care l conine.
JButton A=new JButton("Apasa");
A.setBackground(Color.red);
A.setFont(new Font("Arial",Font.ITALIC+Font.BOLD, 20));
A.setForeground(Color.GREEN);

void setToolTipText(String text); - metoda seteaz un ir de


caractere care va fi afiat atunci cnd cursorul mouse-ului staioneaz
asupra componentei. irul are rolul unui mesaj lmuritor despre funcia
respectivei componente.

Exemplul 8.6. Privii liniile de cod de mai jos:


JButton B=new JButton("Buton 2");
B.setToolTipText("Eu sunt butonul 2");
Figura 8.4. Mesaj lmuritor

void setEnabled(boolean v) - Face ca o component s fie activat (v


reine true) sau nu (v reine false). O component dezactivat nu mai
rspunde comenzilor i are un aspect specific prin care utilizatorul este
anunat c aceasta este dezactivat.

Exemplul 8.7. n imaginea alturat butonul 1


este dezactivat i butonul 2 este activat.
Figura 8.5. Exemplu de
buton dezactivat

void setVisible(boolean v) - dac parametrul reine true,


componenta este vizibil, altfel ea este invizibil.

8.1.5. Independena programelor de rezoluie

Se tie c programele trebuie s ruleze independent de rezoluia monitorului.


O clas care face posibil acest lucru este clasa ToolKit. n acest sens, cele mai
importante metode ale ei sunt:

public static Toolkit getDefaultToolkit() - returneaz un


obiect Toolkit (conine date despre setrile curente);
Dimension getScreenSize() - returneaz o referin ctre un obiect de
tip Dimension care conine lungimea (width) i nlimea (height) n
pixeli a ecranului.

Exemplul 8.8. Programul urmtor creeaz o fereastr care iniial, ocup ntreg
ecranul:
Capitolul 8. Programare vizual 321

import java.awt.*;
import javax.swing.*;
class Fer extends Jframe {
public Fer(String titlu)
{ super(titlu);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Toolkit ec=Toolkit.getDefaultToolkit();
Dimension dim = ec.getScreenSize();
int i = dim.height;
int l = dim.width;
setSize(dim.width, dim.height);
setVisible(true);
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Fereastra pe intreg ecranul");
}
}

8.1.6. Poziionarea componentelor

Pentru a aeza componentele n poziia dorit, putem s utilizm


poziionarea absolut (dar este nerecomandat pentru c programul trebuie s
ruleze corect pe o diversitate de platforme) sau unul dintre gestionarii de
poziionare existeni. Cum facem acest lucru? Vei vedea n paragraful acesta!
Oricum, trebuie s tii c mecanismul este puin mai complicat dect cel cu care
ai fost obinuii n ipoteza c ai studiat programarea vizual (de exemplu, n
Borland Delphi sau Borland Builder).

Nu uitai ! Programele Java trebuie s funcioneze pe orice platform!

8.1.6.1. Poziionarea absolut

Pentru a utiliza poziionarea absolut a componentelor trebuie s lucrm n


absena unui gestionar de poziionare, iar coordonatele sunt date n pixeli. Pentru
aceasta trebuie s cunoatem urmtoarele:

1. Secvena de mai jos se utilizeaz pentru a lucra n absena unui gestionar de


poziionare:
Container x=getContentPane();
x.setLayout(null);

2. n poziionarea absolut componentele trebuie dimensionate i poziionate,


altfel nu sunt vizibile. Testai...
322 Manual de Informatic pentru clasa a XII-a

Pentru dimensionarea componentelor, se utilizeaz urmtoarele metode ale


clasei JComponent:

setBounds(int x, int y, int lat, int inal); metoda poziioneaz


i dimensioneaz componenta. Parametrii x i y dau poziia componentei
raportat la colul din stnga-sus al componentei care o gzduiete, iar lat
i lung o dimensioneaz.

Metoda de mai sus poate fi nlocuit cu urmtoarele dou metode:

setLocation(int x, int y) - metod care are rolul de poziionare;

setSize(int lat, int lung) - metod care are rolul de dimensionare.

Exemplul 8.9. Utilizm poziionarea absolut i aezm un buton n fereastr:


Container x=getContentPane();
x.setLayout(null);
JButton A=new JButton ("Exemplu");
A.setBounds(10,10, 100, 40);

8.1.6.2. Gestionarul de poziionare FlowLayout


.
Componentele sunt afiate pe linii, n
ordinea n care au fost declarate. Pe fiecare
linie ele sunt afiate de la stnga la dreapta
(attea cte ncap).

Exemplul 8.10. n continuare, putei observa


cum a fost creat fereastra alturat:
class Fer extends JFrame { Figura 8.6. Exemplu de
public Fer(String titlu) poziionare a componentelor
{
super(titlu);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,150);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
JButton A=new JButton("Buton 1"); x.add(A);
JButton B=new JButton("Buton 2"); x.add(B);
JButton C=new JButton("Buton 3"); x.add(C);
JButton D=new JButton("Buton 4"); x.add(D);
JButton E=new JButton("Buton 5"); x.add(E);
JButton F=new JButton("Buton 6"); x.add(F);
JButton G=new JButton("Buton 7"); x.add(G);
setVisible(true);
}
}
Capitolul 8. Programare vizual 323

Clasa FlowLayout conine constante de aliniere pe linie, din care mai


importante sunt: CENTER, aliniere n centru, opiune implicit, LEFT, la stnga i
RIGHT, la dreapta.

Clasa FlowLayout este nzestrat cu 3 constructori:

a) FlowLayout() - distana ntre rnduri este de 5 uniti, distana pe orizontal


ntre componente este de 5 uniti i componentele sunt aliniate pe linie la centru
(CENTER).
b) FlowLayout(int aliniere) - se cere explicit ca alinierea s fie ntr-un
anumit fel (CENTER, RIGHT, LEFT, acestea sunt constante ale clasei FlowLayout).
c) FlowLayout(int aliniere,int dist_oriz,int dist_vert) - se
specific i distana pe orizontal ntre componente i distana pe vertical dintre ele.

Exemplul 8.11. Privii exemplele de utilizare a constructorilor de mai jos:

FlowLayout (FlowLayout.LEFT) FlowLayout (FlowLayout.RIGHT,15,8)

Figura 8.7. Exemple de utilizare a constructorilor

De reinut !

1. Dimensionarea componentelor i poziionarea lor este fcut automat de ctre


gestionar.
2. Metodele utilizate n poziionarea absolut pentru poziionarea i dimensionarea
componentelor (setBounds(), setLocation(), setSize()) dei sunt acceptate la
compilare, nu au nici un efect.
3. Exist totui o metod care dimensioneaz componentele i este acceptat de
gestionarul FlowLayout. Ea aparine clasei JComponent:

setPreferredSize(Dimension dim). Clasa Dimension are construc-


torul Dimension(int lat, int inalt) prin care se specific limea,
respectiv nlimea componentei.

Exemplul 8.12. Prin utilizarea gestionarului FlowLayout se adaug unei ferestre


dou butoane, primul de dimensiune stabilit, al doilea de dimensiune implicit:
324 Manual de Informatic pentru clasa a XII-a

Container x=getContentPane();
x.setLayout(new FlowLayout());
JButton A=new JButton ("Buton 1");
A.setPreferredSize(new Dimension(100,100));
JButton B=new JButton ("Buton 2");
x.add(A);
x.add(B);
Figura 8.8. Exemplu de
fereastr cu dou butoane

3.1.6.3. Gestionarul de poziionare GridLayout

Clasa GridLayout aranjeaz componentele ntr-o alt logic. Ideea de


baz este aceea c se mparte suprafaa ferestrei n mai multe dreptunghiuri de
suprafa egal i n fiecare dreptunghi astfel obinut se aeaz o component
care este de cele mai multe ori extins ca suprafa, astfel nct s ocupe ntreaga
suprafa a dreptunghiului care i revine. Pentru a nelege modul de aranjare a
componentelor vom prezenta pe scurt cei trei constructori ai clasei:
a) GridLayout() - dac avem n componente care trebuie aezate, suprafaa
ferestrei este mprit ntr-o singur linie i n coloane. Fiecare component este
aezat ntr-un dreptunghi, iar componentele sunt fr spaiu ntre ele.

b) GridLayout(int nr_linii, int nr_coloane) - suprafaa este


mprit n nr_linii nr_coloane dreptunghiuri. Fiecare dreptunghi reine o
component (vezi figura de mai jos).

Figura 8.9.
GridLayout(3,3)

c) GridLayout(int nr_linii, int nr_col, int sp_o, int sp_v) -


se procedeaz ca anterior, numai c se trec i spaiile pe orizontal i pe vertical
ntre dreptunghiurile generate.

Figura 8.10.
GridLayout(3,3,5,8)

Pentru GridLayout, metoda setPreferredSize() nu are niciun efect.


Capitolul 8. Programare vizual 325

8.1.6.4. Gestionarul de poziionare BorderLayout

Clasa BorderLayout mparte suprafaa ferestrei n 5 pri: nord (NORTH),


sud (SOUTH), est (EAST), vest (WEST) i centru (CENTER). n fiecare parte se poate
aeza o component.
Exemplul 8.13. Mai jos putei observa cum am obinut aezarea componentelor ca
n fereastra din figura alturat:
x.setLayout(new BorderLayout ());
JButton A=new JButton("Buton 1");
x.add(A,BorderLayout.SOUTH);
JButton B=new JButton("Buton 2");
x.add(B,BorderLayout.NORTH);
JButton C=new JButton("Buton 3");
x.add(C,BorderLayout.WEST);
JButton D=new JButton("Buton 4");
x.add(D,BorderLayout.EAST); Figura 8.11. Exemplu de
aezare a componentelor
JButton E=new JButton("Buton 5");
x.add(E,BorderLayout.CENTER);

De reinut !

1. Pentru adugarea unei componente container-ului se folosete metoda add


cu 2 parametri, al doilea fiind cel care precizeaz poziia n care este adugat
componenta. Vezi mai sus!

2. Componentele sunt extinse pentru a ocupa ntreaga suprafa alocat. Vedei


figura de mai sus.

3. Dac lipsete componenta din nord, sau cea din sud, spaiul este ocupat de
linia din centru.

4. Dac lipsete componenta din centru, spaiul este lsat liber. Dac lipsete
componenta din est, sau cea din vest, spaiul este ocupat de componenta din
centru.

5. Metoda setPreferredSize() are efect parial. Astfel rezult: dac este


aplicat unei componente din nord sau din sud, se ia n considerare numai
nlimea transmis de metod. Dac este aplicat unei componente din est, vest,
sau centru se ia n considerare numai limea componentei.
326 Manual de Informatic pentru clasa a XII-a

8.2. Studiul principalelor componente

8.2.1. Componente de tip JButton

Cu ajutorul componentelor de acest tip se creeaz butoane. n general, prin


apsarea unui buton se dau anumite comenzi programului. Vom prezenta cele mai
importante metode (constructori):

JButton() - creeaz un buton fr text, fr imagine asociat.


JButton(String text) - creeaz un buton care afieaz un text.
JButton(Icon icon) - creeaz un buton care reine o imagine de
mici dimensiuni.

Exemplul 8.14. Liniile de mai jos formeaz butonul alturat:


Icon icon = new ImageIcon("om.gif");
JButton A=new JButton(icon);
Figura 8.12.
Exemplu de buton

JButton(String text,Icon icon) - creeaz un buton cu text i imagine.

Exemplul 8.15. Liniile de mai jos formeaz butonul alturat:


Icon icon = new ImageIcon("om.gif");
JButton A=new JButton( "Java...",icon);

Figura 8.13. Exemplu de


buton cu text i imagine

metoda setVerticalTextPosition(constanta) seteaz poziia pe


vertical a textului n raport cu imaginea: deasupra (JButton.TOP),
dedesubt (JButton.BOTTOM), n centru (JButton.CENTER).

metoda setHorizontalTextPosition(constanta) seteaz poziia pe


orizontal a textului n raport cu imaginea: stnga (JButton.LEFT),
dreapta (JButton.RIGHT), n centru (JButton.CENTER).

Exemplul 8.16. Liniile de mai jos formeaz butonul alturat:


Icon icon = new ImageIcon("om.gif");
JButton A=new JButton( "Java...",icon);
A.setVerticalTextPosition(JButton.TOP);
A.setHorizontalTextPosition(JButton.CENTER);

Mrimea imaginii determin mrimea butonului ! Figura 8.14. Exemplu


Capitolul 8. Programare vizual 327

8.2.2. Componente de tip JLabel

Componentele de acest tip se utilizeaz pentru a afia texte i imagini, cu rol


lmuritor. Clasa este nzestrat cu urmtoarele metode mai importante:

JLabel(String S) - se utilizeaz pentru a afia un ir de caractere.

Exemplul 8.17. Dac constructorul ferestrei conine secvena de mai jos, atunci
pe fereastr apare ce se vede n figura alturat:
Container x=getContentPane();
x.setLayout(new BorderLayout ()); Figura 8.15.
JLabel A=new JLabel ("Un text"); Exemplu
x.add(A);

JLabel(Icon image) - se utilizeaz pentru a afia o imagine.

Exemplul 8.18. La fel ca mai sus, numai c pe fereastr se afieaz o imagine:


Container x=getContentPane();
x.setLayout(new BorderLayout ());
Icon icon = new ImageIcon("idee.gif");
JLabel A=new JLabel (icon);
x.add(A); Figura 8.16.
Exemplu

JLabel(String text, Icon icon, int horizontalAlignment)


afieaz o imagine i un text. Ansamblul (imagine + text) se aliniaz pe
orizontal, conform ultimului parametru (CENTER, LEFT, RIGHT).
setVerticalTextPosition(c), setHorizontalTextPosition(c)
pot fi folosite i la JLabel la fel ca la Jbutton:
Exemplul 8.19. Se va afia ce se vede alturat:
Container x=getContentPane(); Figura 8.17.
x.setLayout(new GridLayout()); Exemplu
Icon icon = new ImageIcon("idee.gif");
JLabel A=new JLabel
("Asta era!!!",icon,JLabel.CENTER);
A.setHorizontalTextPosition(Jlabel.CENTER);
A.setVerticalTextPosition(JLabel.TOP);
x.add(A);

8.2.3. Componente de tip JPanel

Componentele JPanel (paneluri) sunt de tip container, adic au rolul de a


conine pe suprafaa lor alte componente, avnd n general un rol de grupare, dar i
unul de poziionare a componentelor. Clasa este nzestrat cu urmtoarele metode:
328 Manual de Informatic pentru clasa a XII-a

JPanel() - constructor, obiectul rezultat are gestionarul de poziionare


FlowLayout().
JPanel(LayoutManager layout) - constructor, obiectul rezultat are
gestionarul de poziionare transmis ca parametru.
setLayout(LayoutManager layout); - seteaz gestionarul de
poziionare.
add(Component c) - adaug o component obiectului.

Exemplul 8.20. Fereastra programului


urmtor conine o component de tip
JPanel. Pe ea sunt ataate 3 butoane. La
apsarea unui buton, componenta de tip
JPanel va avea culoarea afiat de buton.
Figura 8.18.
import java.awt.*; Fereastra programului
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame implements ActionListener
{ JPanel panel;
public Fer(String titlu) {
super(titlu); setSize(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
panel=new JPanel();
JButton A=new JButton("Rosu");
panel.add(A); A.addActionListener(this);
JButton B=new JButton("Galben");
panel.add(B); B.addActionListener(this);
JButton C=new JButton("Albastru");
panel.add(C); C.addActionListener(this);
x.add(panel);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ String culoare=e.getActionCommand();
if (culoare.compareTo("Rosu")==0)
panel.setBackground(Color.red);
else
if (culoare.compareTo("Galben")==0)
panel.setBackground(Color.yellow);
else panel.setBackground(Color.blue);
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Fereastra cu panel"); }
}
Capitolul 8. Programare vizual 329

8.2.4. Componente de tip JTextField

Componentele de tip JTextField (edit-uri) sunt utilizate pentru ca


utilizatorul s introduc sau s afieze iruri de caractere de la tastatur, iruri pe
care programul urmeaz s le prelucreze. Cele mai importante metode ale acestui
obiect sunt:
JTextField(int nr) - creeaz un edit vid, dar care are o lime
suficient pentru a vizualiza simultan nr caractere. irul de caractere
introdus poate avea orice lungime.

Figura 8.19. Un edit vid

JTextField(String s) - creeaz un edit care iniial afieaz un ir de


caractere.
Figura 8.20. Un edit cu text iniial

JTextField(String S, int nr) - creeaz un edit care iniial


afieaz un ir de caractere i care are o lime suficient pentru a afia
simultan un numr de nr caractere.
String getText() - returneaz irul de caractere reinut de edit la un
moment dat.
void setText(String s) - are rolul de a determina ca edit-ul s
conin irul de caractere specificat.
Exemplul 8.21. Programul urmtor afieaz
fereastra din figura alturat. Utilizatorul
introduce un ir de caractere i, la apsarea
butonului se afieaz, n fereastra CMD,
textul introdus de acesta.
import java.awt.*; Figura 8.21. Fereastra programului
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame implements ActionListener
{ JTextField txt;
public Fer(String titlu) {
super(titlu); setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
JLabel et=new JLabel ("Numele dv:"); x.add(et);
txt=new JTextField(15); x.add(txt);
JButton but=new JButton("Ce-am introdus?"); x.add(but);
but.addActionListener(this);
setVisible(true);
}
330 Manual de Informatic pentru clasa a XII-a

public void actionPerformed (ActionEvent e)


{ System.out.println(txt.getText()); }
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Exemplu de edit");
}
}

3.2.5. Componente de tip JComboBox

Obiectele clasei JComboBox sunt aa numitele liste, din care utilizatorul poate
selecta o anumit opiune (unic). Principalele metode ale clasei JComboBox sunt:

JComboBox () constructor.
void addItem(Object s) - adaug listei o opiune. Cum clasa Object
este la baza ierarhiei de clase Java, parametrul efectiv poate fi o referin
ctre orice obiect, inclusiv ctre tipul des utilizat String.
Object getSelectedItem() returneaz irul de caractere corespun-
ztor opiunii selectate.
int getItemCount() - returneaz numrul de opiuni.
int getSelectedIndex() - returneaz indexul opiunii selectate.
Object getItemAt(int ind) - returneaz obiectul reinut de item-ul
de indice ind (dac trebuie s obinem un obiect de tip String, atunci
convertii ctre String prin operatorul de conversie).
Exemplul 8.22. Programul urmtor afieaz
o list. Selectai din list o opiune i apsai
butonul. n fereastra CMD va fi afiat opiunea
selectat:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; Figura 8.22. Fereastra programului

class Fer extends JFrame implements ActionListener


{ JComboBox lista;
public Fer(String titlu) {
super(titlu); setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
JLabel et=new JLabel ("Selectati materia preferata:");
x.add(et);
lista=new JComboBox();
lista.addItem("Matematica");
Capitolul 8. Programare vizual 331

lista.addItem("Informatica");
lista.addItem("Engleza");
lista.addItem("Alta materie");
x.add(lista);
JButton but=new JButton("Ce-am selectat?");
x.add(but);
but.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ System.out.println(lista.getSelectedItem()); }
}

public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Exemplu de lista");
}
}

3.2.6. Componente de tip JCheckBox i JRadioButton.


Gruparea lor
Obiectele clasei JCheckBox sunt aa-numitele butoane de validare.
Fereastra poate conine unul sau mai multe astfel de butoane. Principalele metode
ale acestei clase sunt:
JCheckBox(String s) - creeaz un buton de validare care conine irul
de caractere transmis ca parametru.
JCheckBox(String s, boolean v) - creeaz un buton de validare care
conine irul de caractere transmis ca parametru i care este marcat sau nu n
funcie de valoarea pe care o reine parametrul v, respectiv true sau false.
JCheckBox(String s, Icon f) - creeaz un buton de validare care
conine irul de caractere transmis ca parametru i o imagine.
boolean isSelected() - returneaz true dac butonul a fost selectat i
false n caz contrar.
String getText() - returneaz irul de caractere reinut de buton.

Exemplul 8.23. Programul urmtor afieaz mai multe


butoane de validare, din care unul (cel care afieaz
Informatica) este selectat de la nceput! La apsarea
butonului Ce-am selectat? este afiat selecia fcut.

import java.awt.*;
import java.awt.event.*; Figura 8.23.
import javax.swing.*; Fereastra programului
332 Manual de Informatic pentru clasa a XII-a

class Fer extends JFrame implements ActionListener


{ JCheckBox b1,b2,b3,b4;
public Fer(String titlu) {
super(titlu); setSize(150,200);
Container x=getContentPane();
x.setLayout(new FlowLayout (FlowLayout.LEFT));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel et=new JLabel ("Selectati");
x.add(et);
b1=new JCheckBox("Matematica");x.add(b1);
b2=new JCheckBox("Informatica",true);x.add(b2);
b3=new JCheckBox("Engleza"); x.add(b3);
b4=new JCheckBox("Biologie");x.add(b4);
JButton but=new JButton("Ce-am selectat?");
x.add(but);
but.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ if (b1.isSelected()) System.out.println(b1.getText());
if (b2.isSelected()) System.out.println(b2.getText());
if (b3.isSelected()) System.out.println(b3.getText());
if (b4.isSelected()) System.out.println(b4.getText());
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Validare"); }
}

Obiectele de tip JRadioButton sunt asemntoare cu cele de tip


JCheckBox, negrupate au acelai comportament, numai c arat ca nite
butoane radio.
Butoanele pot fi grupate, adic pot fi toate tratate ca un ntreg. Un exemplu
convingtor este dat de necesitatea gruprii butoanelor radio (unde, la un moment
dat, numai un singur buton poate fi selectat). Pentru a grupa butoanele se
folosete un obiect al clasei ButtonGroup. Cele mai importante metode ale
acestei clase sunt:

ButtonGroup() - constructor;
void add(AbstractButton b) - adaug un buton grupului (clasa
AbstractButton este superclas pentru JButton, JRadioButton,
JCheckBox).
Enumeration getElements(); - returneaz un pointer la grupul de
butoane.
int getButtonCount() - returneaz numrul de butoane din grup.
Capitolul 8. Programare vizual 333

Exemplul 8.24. Privii programul de mai jos:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class Fer extends JFrame implements ActionListener
{ ButtonGroup grup;
public Fer(String titlu) {
super(titlu); setSize(150,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout (FlowLayout.LEFT));
JLabel et=new JLabel ("Selectati"); x.add(et);
JRadioButton b1=new JRadioButton("Matematica");x.add(b1);
JRadioButton b2=new JRadioButton("Informatica",true);
x.add(b2);
JRadioButton b3=new JRadioButton("Engleza"); x.add(b3);
JRadioButton b4=new JRadioButton("Biologie");x.add(b4);
JButton but=new JButton("Ce-am selectat?"); x.add(but);
but.addActionListener(this);
grup = new ButtonGroup();
grup.add(b1);grup.add(b2);
grup.add(b3);grup.add(b4);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ Enumeration en=grup.getElements();
while (en.hasMoreElements())
{ JRadioButton b=(JRadioButton)en.nextElement();
if(b.isSelected()) System.out.println(b.getText());
}
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Validare"); }
}

3.2.7. Meniuri

n Java, meniurile se construiesc prin utilizarea obiectelor mai multor clase.

A) Clasa JMenuBar - obiectele acestei clase se utilizeaz pentru a obine meniuri


clasice, aflate n partea de sus a ferestrei. Cele mai importante metode ale acestei
clase sunt:
JMenuBar() - constructor;
add(JMenu) - adaug meniului componente de tip JMenu, vedei n
continuare.
334 Manual de Informatic pentru clasa a XII-a

B) Clasa JMenu - obiectele acestei clase au rolul de a nscrie n meniu anumite


opiuni, care la rndul lor pot conine alte opiuni. Cele mai importante metode ale
acestei clase sunt:
JMenu(String s) - constructor. Obiectul va afia irul s.
add(JMenuItem meniu) - adaug o component de tip JMenuItem
(vedei mai jos clasa JMenuItem;).
add (Component c) - adaug o alt component (de un tip derivat din
tipul Component).

C) Clasa JMenuItem - o astfel de component care apare n meniu, arat ca o


opiune i are rolul unui buton, adic selectat, conduce la o anumit aciune. Cele
mai importante metode ale acestei clase sunt:

JMenuItem(String s) - constructor, opiunea afieaz irul s;


JMenuItem(Icon ic) - constructor, opiunea afieaz o mic imagine;
JMenuItem(String s, Icon ic) - constructor, opiunea afieaz un
ir de caractere i o mic imagine.
Exemplul 8.25. Programul urmtor construiete un
meniu clasic. Pentru fiecare opiune selectat, se
afieaz n fereastra CMD irul generat de opiune.
import java.awt.*;
Figura 8.24.
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame implements ActionListener
{ TextArea t;
public Fer(String titlu) {
super(titlu);
setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Bara meniu
JMenuBar bara = new JMenuBar();
// Creez meniul principal
JMenu meniu1 = new JMenu("Operatii 1");
bara.add(meniu1);
JMenu meniu2 = new JMenu("Operatii 2");
bara.add(meniu2);
// adaug itemi pentru fiecare optiune din meniul principal
JMenuItem item11 = new JMenuItem("OP 11");
item11.addActionListener(this);
meniu1.add(item11);
JMenuItem item12 = new JMenuItem("OP 12");
item12.addActionListener(this);
meniu1.add(item12);
JMenuItem item21 = new JMenuItem("OP 21");
Capitolul 8. Programare vizual 335

item21.addActionListener(this);
meniu2.add(item21);
setJMenuBar(bara);
Container x=getContentPane();
x.setLayout(new GridLayout ());
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ System.out.println(e.getActionCommand()); }
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Fereastra cu meniu"); }
}

Observaie ! Metoda clasei JFrame setJMenuBar(JMenuBar b) are rolul de a


ataa bara de meniu ferestrei.

Meniurile pot conine i submeniuri. Pentru


aceasta, unei componente de tip JMenu i se adaug, pe
lng alte componente de tip JMenuItem, o alt
component, tot de tip JMenu. Acesteia din urm i se
adaug componente de tip JMenuItem.

Exemplul 8.26. Pentru a obine meniul alturat,


adugai programului de mai sus secvena urmtoare:
//submeniuri
JMenu altele = new JMenu("Altele"); Figura 8.25.
meniu1.add(altele); Exemplu de meniu
JMenuItem item131 = new JMenuItem("OP 131");
altele.add(item131);
item131.addActionListener(this);
JMenuItem item132 = new JMenuItem("OP 132");
altele.add(item132);
item132.addActionListener(this);

Evident, procedeul se poate repeta pentru a obine oricte submeniuri dorii.

Acceleratori. n multe aplicaii, anumite opiuni din meniuri sunt nzestrate cu


acceleratori (shortcut-uri de meniu) prin care o anumit comand se poate obine
fie din meniu, fie dintr-o combinaie de taste. i n Java se pot crea acceleratori i
acest mecanism este prezentat n continuare. Metoda:
void setAccelerator(KeyStroke keyStroke)
are rolul de a ataa unui obiect de tip JMenuItem un accelerator, adic de a
invoca aciunea specific acestuia atunci cnd utilizatorul a apsat fie o tast, fie o
combinaie de taste. n primul caz (o tast), se folosete metoda:
static KeyStroke getKeyStroke(char keyChar),
336 Manual de Informatic pentru clasa a XII-a

iar n al doilea caz, metoda:


static KeyStroke getKeyStroke(int keyCode, int modifiers)

Cum obinem parametrii pentru a doua metod getKeyStroke()?


Primul parametru este o constant a clasei KeyEvent. Iat cteva astfel de
constante: static int VK_1 (tasta 1), static int VK_2 (tasta 2),
static int VK_F1 (tasta F1), static int VK_V (tasta V), .a.m.d.
Al doilea parametru este o constant a clasei ActionEvent: SHIFT_MASK,
(codul 1), CTRL_MASK (codul 2), META_MASK (codul 4), ALT_MASK (codul 8).
Exemplul 8.27. n primul program de la nceputul
paragrafului, pentru item21 dorim s avem un
accelerator, adic s obinem acelai efect prin
apsarea combinaiei de taste ALT+2 ca i n cazul n
care operm selecia din meniu:
JMenuItem item21 = new JMenuItem("OP 21"); Figura 8.26.
item21.setAccelerator(KeyStroke.getKeyStroke Exemplu de meniu
(KeyEvent.VK_2, ActionEvent.ALT_MASK));
item21.addActionListener(this);

n acest caz, dac apsm ALT+2, obinem acelai efect ca atunci cnd
operm selecia din meniu. Dac dorim s obinem o combinaie din trei taste, de
exemplu CTRL+ALT+2, vom folosi (datorit codificrii din ActionEvent):
getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK
+ ActionEvent.CTRL_MASK));

8.2.8. Cutii (casete) de dialog predefinite

Cutiile de dialog predefinite sunt extrem de utile pentru introducerea sau


afiarea unor date. Pentru a putea folosi astfel de cutii, vom utiliza clasa
JOptionPane care conine mai multe metode statice care le afieaz. Cutiile
sunt predefinite, coninnd automat anumite componente (nu mai este necesar ca
acestea s fie create de programator).

8.2.8.1. Cutii de dialog de intrare

Iat cteva metode prin care putem apela astfel de cutii:

public static String showInputDialog(Object mes) creeaz i


afieaz n centrul ecranului o cutie de dialog care afieaz mesajul transmis
ca parametru. n cazul n care utilizatorul apas Cancel, se returneaz
pointer-ul null, motiv pentru care trebuie tratat aceast excepie.
Capitolul 8. Programare vizual 337

Exemplul 8.28. Privii secvena de mai jos:


try { String intr = JOptionPane.showInputDialog("a=");
if (intr.length()==0) System.out.println("Intr vida");
else System.out.println(intr);
}
catch(NullPointerException exc)
{ System.out.println("S-a apasat Cancel"); }

Figura 8.26. Exemplu


de cutie de dialog

public static String showInputDialog(Object mes, Object


val) - la fel ca mai sus, numai c edit-ul memoreaz de la nceput valoarea
transmis de al doilea parametru (valoare iniial). n exemplul de mai jos,
valoarea iniial afiat este 0:
String intr = JOptionPane.showInputDialog("a=","0");
public static String showInputDialog(Component par,
Object mes) - ca mai sus, numai c se afieaz o cutie de dialog care are
o component printe. n exemplul urmtor, afiarea se face cu ajutorul
clasei care descrie fereastra principal, deci printele este this (acest obiect):
String intr = JOptionPane.showInputDialog(this,"a=");
public static String showInputDialog(Component par,
Object mes, Object val) - ca mai sus, numai c se afieaz o cutie
de dialog n care edit-ul reine i o valoare iniial.

8.2.8.2. Cutii de dialog pentru afiarea mesajelor (de informare)

Astfel de cutii de dialog se utilizeaz pentru a transmite utilizatorului anumite


mesaje de eroare, sau rezultate.
public static void showMessageDialog(Component par,
Object mes) - afieaz o cutie de dialog cu un mesaj dorit.

Exemplul 8.29. Secvena de mai jos afieaz


ferestra alturat:
int a=125;
JOptionPane.showMessageDialog(this,
"a="+a);

Figura 8.27. Exemplu


338 Manual de Informatic pentru clasa a XII-a

8.2.8.3. Cutii de dialog de confirmare

O astfel de cutie de dialog afieaz trei butoane: Yes, No i Cancel.

public static int showConfirmDialog(Component par,Object


mes); - metoda returneaz un ntreg a crui valoare este dat de butonul
pe care-l apas utilizatorul: 0 pentru Yes, 1 pentru No sau 2 pentru Cancel.

Observaie ! De fapt, se returneaz indicele butonului apsat: Yes are 0 pentru


c este primul buton, No are 1 pentru c este al doilea buton, iar Cancel are 2
deoarece este al treilea buton.

Exemplul 8.30. Secvena urmtoare testeaz, prin afiare, valorile returnate de


showConfirmDialog():

Figura 8.28. Exemplu


int a=125;
int rasp= JOptionPane.showConfirmDialog(this,"a="+a+"?");
System.out.println(rasp);

8.2.9. Componente de tip JTextArea

Componentele de acest tip permit utilizatorului s introduc text pe mai multe


linii. Se poate utiliza un singur font, de o singur mrime! Un astfel de text, cu un
singur font, care nu permite s fie formatat se numete text plan.

Cele mai importante metode ale clasei sunt:

JTextArea() - constructor.
void append(String S) - adaug la sfritul irului reinut de
component un alt ir.
void insert(String s, int pozitie) - insereaz n text,
ncepnd de la pozitie un ir de caractere. Dac pozitie depete
indicele ultimului caracter, atunci inserarea se face la sfritul irului reinut
de component.
void replaceRange(String str, int start, int end) -
nlocuiete irul dintre indicii start i end cu irul transmis ca parametru.
Evident, dac acesta din urm este vid, se terge ntreg textul.
setFont(Font f) - seteaz fontul utilizat.
Capitolul 8. Programare vizual 339

String getText() - returneaz irul de caractere coninut de


component (inclusiv dac el conine newline, altfel spus, mai multe
paragrafe).
void setText(String s) - determin ca obiectul de tip JTextArea s
rein irul s.
void setBackground(Color c) - seteaz culoarea de fond a
suprafeei care afieaz literele.
String getSelectedText() - returneaz irul de caractere selectat.

void selectAll() - selecteaz ntreg textul reinut de component.


int getSelectionStart() - returneaz indicele primului caracter selectat.

int getSelectionEnd() - returneaz indicele ultimului caracter selectat.

void setLineWrap(boolean v) - dac reine true, seteaz obiectul ca


textul scris fr newline (adic un singur paragraf) s se afieze pe mai
multe rnduri (n cazul n care nu ncape pe lime). Dac reine false,
acesta este afiat pe o singur linie, chiar dac, la un moment dat, nu este
toat vizibil.

Obiectele de tip JTextArea nu se afieaz pe fereastr n mod direct, ci


prin intermediul altor obiecte de tip JScrollPane, asemntoare obiectelor de tip
JPanel, dar care permit ataarea unor bare de scroll, aa cum se vede mai jos:
JScrollPane panel = new JScrollPane(t);
panel.setVerticalScrollBarPolicy(JScrollPane.
VERTICAL_SCROLLBAR_ALWAYS);
panel.setHorizontalScrollBarPolicy(JScrollPane.
HORIZONTAL_SCROLLBAR_ALWAYS);

Exemplul 8.29. Programul urmtor afieaz o


component de tip JTextArea i un meniu.
Utilizatorul introduce un text la alegerea sa.
Textul poate fi salvat cu ajutorul meniului
(File i Save) i poate fi recuperat tot cu
ajutorul meniului (File i Open). Pentru
simplificarea programului, fiierul n care se
salveaz este ntotdeauna test.txt. nainte
de a studia programul, recomand o scurt
recapitulare a lucrului cu fiiere.
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*; Figura 8.29. Exemplu
import javax.swing.*;
340 Manual de Informatic pentru clasa a XII-a

class Fer extends JFrame implements ActionListener


{ JTextArea t;
public Fer(String titlu) {
super(titlu); setSize(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new GridLayout());
JMenuBar bara = new JMenuBar();
JMenu meniu1 = new JMenu("File");
bara.add(meniu1);
JMenuItem item11 = new JMenuItem("Open");
item11.addActionListener(this); meniu1.add(item11);
JMenuItem item12 = new JMenuItem("Save");
item12.addActionListener(this); meniu1.add(item12);
setJMenuBar(bara);
t=new JTextArea(); t.setLineWrap(true);
JScrollPane panel = new JScrollPane(t);
panel.setVerticalScrollBarPolicy
(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
panel.setHorizontalScrollBarPolicy
(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
x.add(panel);
setVisible(true);
}
void scriuFisier() throws IOException
{ FileOutputStream f=new FileOutputStream("test.txt");
PrintStream fchar=new PrintStream (f);
StringTokenizer tok=new StringTokenizer(t.getText(),"\n");
while (tok.hasMoreTokens())
fchar.println(tok.nextToken());
fchar.close();
}
void citFisier() throws IOException
{ FileInputStream f=new FileInputStream("test.txt");
InputStreamReader fchar=new InputStreamReader (f);
BufferedReader buf = new BufferedReader(fchar);
t.setText(""); String linie;
while ((linie=buf.readLine() )!=null)
t.append(linie+"\n");
}
public void actionPerformed (ActionEvent e)
{ if( e.getActionCommand().compareTo("Save")==0)
// Daca s-a selectat Save
{ try {scriuFisier(); }
catch (Exception excp) {} }
else
// Daca s-a selectat Open
{ try {citFisier(); }
catch (Exception excp) {} }
}
}
Capitolul 8. Programare vizual 341

public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Fereastra din care pot introduce textul");}
}

8.2.10. Cutii de tip Open / Save

Astfel de cutii se utilizeaz n operaiile de ncrcare i salvare a fiierelor.


Cu ajutorul lor se selecteaz fiierele i folder-ele necesare acestor operaii. Ele
pot fi obinute cu metodele clasei JFileChooser(). Cele mai importante metode
ale acestei clase sunt:
JFileChooser() - constructor;
int showOpenDialog(Component fer_parinte) - afieaz o cutie de
dialog de tip Open, aa cum este cea de mai jos:

Figura 8.30. Cutie de tip Open


Valoarea returnat este 0, dac s-a apsat butonul Open sau este 1 dac
s-a apsat butonul Close. Rolul ei este ca, atunci cnd a fost selectat un
anumit fiier i s-a apsat Open, obiectul de tip JFileChooser s conin
date despre fiierul selectat.
int showSaveDialog(Component fer_parinte) - afieaz o cutie de
dialog de tip Save, asemntoare cu cutia precedent. Valoarea returnat
este 0 dac s-a apsat butonul Save i 1 dac s-a apsat butonul Cancel.
Ca i cutia precedent (de tip Open), rolul ei este ca obiectul de tip
JFileChooser s conin date despre fiierul salvat.

Atenie ! Cutia de tip Open nu deschide fiierul, iar cutia de tip Save nu-l salveaz.
Rolul lor este de a obine informaiile necesare deschiderii i salvrii fiierelor.
File getSelectedFile() - metoda returneaz, att n cazul salvrii,
ct i n cazul deschiderii fiierelor, date despre fiierul selectat (furnizate de
showOpenDialog() i showSaveDialog()). Pentru a putea accesa
aceste informaii, trebuie s studiem cteva metode ale tipului File.
342 Manual de Informatic pentru clasa a XII-a

void addChoosableFileFilter(Filter x); - metoda se utilizeaz


pentru a aduga un filtru cutiilor de tip Open i Save. Despre filtre vom
nva n cadrul acestui paragraf.
setCurrentDirectory(File f) - seteaz cutia astfel nct s se
deschid ntr-un anumit folder.
Clasa File. Cele mai importante metode ale acestei clase sunt:
File() - constructor;
File(String nume) - construiete un obiect care conine numele unui
fiier (folder).
boolean isDirectory() - returneaz true dac fiierul reinut de obiect
este folder (director) sau false, n caz contrar.
String getName() - returneaz numele fiierului.
String getPath() - returneaz numele ntreg al fiierului, inclusiv calea
ctre el.
Filtre. n partea de jos a cutiilor de tip Open sau Save se gsete o list (File
Name). Dac programul nostru nu conine un filtru, implicit se afieaz doar
opiunea All Files, adic cutiile vizualizeaz toate folder-ele i toate fiierele,
indiferent de tipul lor. n cazul n care dorim ca programul s conin filtre, adic s
se vizualizeze doar fiierele de un anumit tip (sau tipuri), vom utiliza clasa
FileFilter.

Clasa FileFilter este abstract. Pentru a crea un filtru este necesar s


rescriem dou metode ale sale:
public String getDescription() - trebuie s returneze un ir de
caractere care va fi afiat de lista File of Type, list coninut de cutiile
Open i Save.
public boolean accept(File f) - metod care returneaz true
pentru un fiier care, fie are o extensie dorit, fie este de tip folder, altfel
returneaz false. Dac metoda returneaz true, fiierul este aflat de
cutiile Open/Save, altfel acesta nu este afiat.

Exemplul 8.30. Programul de mai jos este un editor


primitiv de fiiere text. El nu conine n meniu dect dou
opiuni: Open i Save. Oricare dintre ele are ca efect
afiarea cutiilor respective i salvarea sau deschiderea cu
afiare a unui fiier cu una din extensiile .java i .txt.
Afiarea fiierului se face cu ajutorul unei componente de
tip JTextArea.
import java.io.*;
import java.util.*;
import java.awt.*; Figura 8.31. Rezultat
Capitolul 8. Programare vizual 343

import java.awt.event.*;
import javax.swing.*;
class Filtre extends javax.swing.filechooser.FileFilter {
public boolean accept(File f) {
if (f.isDirectory()) {return true;}
String nume_fis = f.getName();
return nume_fis.endsWith(".java") || nume_fis.endsWith(".txt");
}
public String getDescription() {
return "*.java" + " "+"*.txt";}
}
class Fer extends JFrame implements ActionListener
{ JTextArea t;
public Fer(String titlu) {
super(titlu); setSize(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new GridLayout());
JMenuBar bara = new JMenuBar();
JMenu meniu1 = new JMenu("File"); bara.add(meniu1);
JMenuItem item11 = new JMenuItem("Open");
item11.addActionListener(this); meniu1.add(item11);
JMenuItem item12 = new JMenuItem("Save");
item12.addActionListener(this); meniu1.add(item12);
setJMenuBar(bara);
t=new JTextArea(); t.setLineWrap(true);
JScrollPane panel = new JScrollPane(t);
panel.setVerticalScrollBarPolicy
(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
panel.setHorizontalScrollBarPolicy
(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
x.add(panel); setVisible(true);
}
void scriuFisier(String nume) throws IOException
{FileOutputStream f=new FileOutputStream(nume);
PrintStream fchar=new PrintStream (f);
StringTokenizer tok=new StringTokenizer(t.getText(),"\n");
while (tok.hasMoreTokens()) fchar.println(tok.nextToken());
fchar.close();
}
void citFisier(String nume) throws IOException
{ FileInputStream f=new FileInputStream(nume);
InputStreamReader fchar=new InputStreamReader (f);
BufferedReader buf = new BufferedReader(fchar);
t.setText("");
String linie;
while ((linie=buf.readLine() )!=null)
t.append(linie+"\n");
}
344 Manual de Informatic pentru clasa a XII-a

public void actionPerformed (ActionEvent e)


{ if( e.getActionCommand().compareTo("Open")==0)
{ JFileChooser c_op = new JFileChooser();
c_op.addChoosableFileFilter(new Filtre());
int valRet = c_op.showOpenDialog(this);
if (valRet==0)
{ File f=c_op.getSelectedFile();
{ try { citFisier(f.getPath()); }
catch (Exception excp) {}
}
}
}
else
{ JFileChooser c_save = new JFileChooser();
c_save.addChoosableFileFilter(new Filtre());
int valRet = c_save.showSaveDialog(this);
if (valRet==0)
{ File f=c_save.getSelectedFile();
{ try { scriuFisier(f.getPath()); }
catch (Exception excp) {} }
}
}
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Fereastra din care pot introduce textul"); }
}

8.2.11. Componente de tip JColorChooser

n programarea vizual culorile au un rol fundamental. Pentru a uura


selectarea culorilor, Java pune la dispoziia programatorilor clasa JColorChooser.
n linii mari, aceast clas permite afiarea unui panou prin care se selecteaz
uor culorile (fie direct, fie folosind sistemul RGB, fie folosind sistemul HSL). Iat
cele mai importante metode ale acestei clase:
JColorChooser() - constructor. n panoul culorilor este automat selectat
culoarea alb;
JColorChooser(Color c) - constructor. n panoul culorilor este
automat selectat culoarea transmis ca parametru;
static Color showColorDialog (Component parinte, String mes,
Color c) - lanseaz, modal, o cutie de dialog care conine panoul culorilor.
Dup cum observai, metoda returneaz culoarea selectat (dac se apas
butonul OK, iar dac se apas Cancel se returneaz null). Parametrii sunt:
parinte (fereastra printe), mes (mesaj ce se afieaz pe bara de titlu a
cutiei) i c (culoarea iniial setat n cutie). Utilizarea acestei metode este cel
mai simplu mecanism prin care utilizatorul poate selecta culoarea.
Capitolul 8. Programare vizual 345

Color getColor() - returneaz culoarea selectat n cutie.

Exemplul 8.31. Din fereastra principal,


la apsarea unui buton se afieaz o cutie
de dialog specific pentru selectarea
culorii. Culoarea selectat va fi culoarea
de fond a ferestrei principale.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame
implements ActionListener {
Container x;
public Fer(String titlu) {
super(titlu);
setSize(200,100);
x=getContentPane(); Figura 8.32. Cutia de dialog
x.setLayout(new FlowLayout ());
JButton A=new JButton("Alta culoare");
x.add(A); A.addActionListener(this); setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ Color c=JColorChooser.showDialog
(this, "Alege culoarea",Color.red);
if (c!=null) x.setBackground(c);
}
}
public class pv1 {
public static void main(String args[]) {
Fer fp=new Fer("Schimbarea culorii ferestrei");
fp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
}

8.2.12. Componente de tip JToolBar (bar de unelte)

O astfel de component creeaz o bar cu unelte. Pe ea se aeaz


numeroase alte componente, ntocmai ca pe un panel. De regul se gsete n
partea de sus a ferestrei, dar ntotdeauna sub meniu.
Clasa JToolBar conine urmtoarele metode mai importante:
JToolBar() - constructor, creeaz o bar de unelte poziionat orizontal;
JToolBar(int orientare) - creeaz o bar de unelte orientat fie
orizontal, orientare va avea valoarea JToolBar.HORIZONTAL, fie
vertical, orientare va avea valoarea JToolBar.VERTICAL. Diferena
de orientare afecteaz modul n care sunt aezate pe ea diferitele
componente (pe orizontal sau pe vertical).
346 Manual de Informatic pentru clasa a XII-a

Component add(Component comp) - adaug o component;


void addSeparator() - adaug un separator (spaiu liber) ntre
componente.
Exemplul 8.32. Mai jos putei observa
programul care afieaz o fereastr
cu o bar de unelte i n rest, un panel
(component de tip JPanel):
import java.awt.*;
import javax.swing.*; Figura 8.33. Rezultat

class Fer extends JFrame


{ public Fer(String titlu) {
super(titlu); setSize(600,800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
JToolBar bara=new JToolBar();
bara.setBackground(Color.red);
bara.setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel panel=new JPanel();
panel.setBackground(Color.yellow);
JComboBox lista=new JComboBox ();
x.setLayout(new BorderLayout());
x.add(bara,BorderLayout.NORTH);
x.add(panel,BorderLayout.CENTER);
JButton A=new JButton("buton 1"); bara.add(A);
A.setPreferredSize(new Dimension (70,30));
JButton B=new JButton("buton 2");
B.setPreferredSize(new Dimension (70,30)); bara.add(B);
bara.addSeparator();
lista.addItem("Optiunea 1");
lista.addItem("Optiunea 2");
bara.add(lista);
lista.setPreferredSize(new Dimension (100,30));
setVisible(true);
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Bara cu unelte");
fp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Observaii !
1. Pentru a poziiona bara orizontal se prefer gestionarul GridLayout i bara
se aeaz n nord.
Capitolul 8. Programare vizual 347

2. n aceste condiii, panelul s-a aranjat n centru. Cum celelalte trei componente
lipsesc, componenta din centru ocup toat linia din mijloc, iar linia din mijloc
ocup i partea de sud!
3. Pentru bar se prefer gestionarul FlowLayout (FlowLayout.LEFT) care
aranjeaz componentele pe bar de la dreapta la stnga, dar aliniate stnga!
4. Pentru a ne asigura c butoanele i lista au aceeai nlime, am preferat
dimensionarea lor prin setPreferredSize().
5. ntre cele dou butoane i list a fost introdus un separator. Observai-l n
imaginea de pe pagina anterioar!

8.2.13. Componente de tip JTable

Cu ajutorul componentelor de acest tip se creeaz tabele. n continuare


prezentm cele mai importante metode ale acestui tip.
JTable(Object[][] celule, object[] cap_t) - constructor.
Parametrul celule este o matrice de referine ctre obiectele afiate de
celulele tabelului, iar cap_t este un vector de referine ctre obiectele
afiate de capul de tabel. Numrul coloanelor matricei de referine celule
trebuie s coincid cu numrul elementelor vectorului de referine cap_t i
reprezint numrul coloanelor din tabel.
nainte de a da primul exemplu de tabel, trebuie precizat c aceast
component se plaseaz, de obicei, pe o component de tip JScrollPane.
public void setPreferredScrollableViewportSize(Dimension dim)
are rolul de a preciza dimensiunea tabelului i faptul c acesta trebuie s
conin o bara de scroll vertical (dac tabelul are suficiente linii astfel nct
s nu ncap n totalitate n spaiul generat de dim).
Exemplul 8.33. Tabelul alturat a fost
obinut cu secvena de mai jos:
class Fer extends JFrame
{ public Fer(String titlu) { Figura 8.34. Tabelul rezultat
super(titlu); setSize(600,800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object[][] date = { {"x(0,0)", "x(0,1)","x(0,2)"},
{"x(1,0)", "x(1,1)","x(1,2)"} };
String[] cap_tabel={"Coloana 1","Coloana 2","Coloana 3"};
Container x=getContentPane();
x.setLayout(new FlowLayout());
JTable table = new JTable(date, cap_tabel);
JScrollPane panel = new JScrollPane(table);
table.setPreferredScrollableViewportSize(new Dimension(200,30));
x.add(panel);setVisible(true);
}
}
348 Manual de Informatic pentru clasa a XII-a

Observaie ! Dac dorim, putem inversa ordinea coloanelor n tabel prin drag and
drop. ncercai!
Tabelul este de fapt format din dou componente: tabelul propriu-zis (de tip
JTable) i capul de tabel (de tip JTableHeader).

JTableHeader getTableHeader() - metoda returneaz o referin


ctre capul de tabel.
Imediat ce crem un tabel ne punem problema culorilor de fond i de scriere,
att pentru capul de tabel ct i pentru tabelul propriu-zis. Dac ambele sunt
componente, atunci putem utiliza metodele clasei JComponent:
setBackground(), setForeground() i setColor().
Exemplul 8.34. Adugai exemplului anterior secvena de mai jos i vei obine
efectul scontat!
// pentru tabel
table.setFont(new Font("Arial",Font.ITALIC, 10));
table.setBackground(Color.GREEN);
table.setForeground(Color.RED);
// pentru capul de tabel
JTableHeader cap= table.getTableHeader();
cap.setFont(new Font("Arial",Font.BOLD, 12));
cap.setBackground(Color.YELLOW);
cap.setForeground(Color.RED);

Observai faptul c fiecare celul a tabelului este editabil. Aceasta


nseamn c dac executm clic pe celula respectiv, ea se comport ca un
edit oarecare. De aici, rezult c un tabel poate fi folosit i pentru
introducerea datelor, nu doar pentru afiarea lor!
Object getValueAt(int linie, int coloana) ntoarce o referin
ctre obiectul memorat de celula respectiv;
void setValueAt(Object ref, int linie, int coloana) -
memoreaz referina ctre obiect n linia i coloana dat de indicii transmii.
JTable(int n_linii, int n_coloane) - este un alt constructor al
tabelului, n care se creeaz un tabel cu n_linii i n_coloane. Liniile
sunt numerotate ncepnd de la 0. De asemenea, coloanele sunt
numerotate ncepnd de la 0.

Exemplul 8.35. Programul urmtor creeaz un tabel fr date cu 2 linii i 4


coloane. Utilizatorul introduce date n fiecare celul a tabelului. La apsarea
butonului se afieaz, n fereastra CMD, valorile reinute de fiecare celul. Observai
c numele coloanelor a fost dat automat.

Figura 8.35.
Tabelul rezultat
Capitolul 8. Programare vizual 349

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
class Fer extends JFrame implements ActionListener
{
JTable table;
public Fer(String titlu) {
super(titlu);setSize(600,800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout());
table = new JTable(3, 4);
JScrollPane panel = new JScrollPane(table);
table.setPreferredScrollableViewportSize
(new Dimension(200, 30));
x.add(panel);
JButton A=new JButton("Afiseaza"); x.add(A);
A.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ if (table.getCellEditor() != null)
table.getCellEditor().stopCellEditing();
for (int i=0;i<2;i++)
for (int j=0;j<4;j++)
System.out.println(i+" "+j+" "+table.getValueAt(i,j));
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Tabel");
}
}

S urmrim metoda actionPerformed(). Ce rost are acel if? Atunci


cnd se scriu datele ntr-o celul, pn nu s-a trecut la celula urmtoare (clic pe
suprafaa ei), data coninut de ea nu este memorat i prin urmare, la afiare va
aprea null (obiectul null). Pentru a evita aceasta, s-a utilizat metoda
getCellEditor() a clasei JTable.

TableCellEditor getCellEditor() - metoda returneaz o referin


ctre un obiect dac o celul a tabelului este sub editare i null n caz
contrar. TableCellEditor este o interfa care, evident, este
implementat. Fr a intra n amnunte, interfaa conine antetul metodei
stopCellEditing(), metod care are rolul de a stopa editarea i, prin
urmare, de memorare a tuturor datelor introduse n tabel.
350 Manual de Informatic pentru clasa a XII-a

n continuare, vedem cum putem proiecta capul de tabel. Clasa JTable


conine metodele:

TableColumnModel getColumnModel(). TableColumnModel este o


interfa implementat de o anumit clas (DefaultTableColumnModel).
Prin urmare, putem utiliza metodele clasei pornind de la referina ntoars de
metod. Cu ajutorul lor proiectm capul de tabel.

TableColumn getColumn(int index) - returneaz o referin ctre


un obiect TableColumn. Un astfel de obiect conine toate atributele unei
coloane a tabelului. Iat cteva metode, mai importante ale acestui obiect:
void setHeaderValue(Object ob) - seteaz obiectul afiat de
coloana respectiv (numele coloanei).
setPreferredWidth(int lat) - seteaz limea coloanei.

setResizable(boolean v); - n mod normal, marginile unei coloane


se pot deplasa astfel nct limea coloanei poate fi stabilit i de utilizator.
Dac metoda primete ca parametru valoarea false, marginile nu mai pot fi
stabilite de utilizator.
Exemplul 8.36. Secvena de mai jos ne arat
cum putem construi un tabel precum cel alturat,
care conine numele coloanelor, dar n care,
primei coloane nu i se poate modifica limea
(implicit, i celeilalte coloane).
table = new JTable(6, 2); Figura 8.36.
TableColumnModel mColoane=table.getColumnModel(); Tabelul rezultat
TableColumn coloana=mColoane.getColumn(0);
coloana.setHeaderValue("Coloana 1");
coloana.setPreferredWidth(150);
coloana.setResizable(false);
coloana=mColoane.getColumn(1);
coloana.setHeaderValue("Coloana 2");
JScrollPane panel = new JScrollPane(table);
table.setPreferredScrollableViewportSize
(new Dimension(200,80));

Alte metode ale clasei JTable:


void setGridColor(Color c) - seteaz culoarea liniilor care separ
celulele tabelului.
void setRowHeight(int inalt) - seteaz nlimea liniilor tabelului
(n pixeli).
void setSelectionBackground(Color c) - seteaz culoarea liniei
selectate (atunci cnd se execut clic pe o celul, se selecteaz ntreaga
linie).
Capitolul 8. Programare vizual 351

void setSelectionForeground(Color c) - seteaz culoarea cu


care se scrie n linia selectat (mai puin celula n care se editeaz).
setIntercellSpacing(Dimension dim) - seteaz spaiile ntre linii
i coloane. Aceasta nu afecteaz liniile separatoare dintre celule (vecine), ci
numai spaiul dintre prile lor editabile. Primul parametru pentru dim este
pentru linii, al doilea parametru este pentru coloane.
void setShowHorizontalLines(boolean v) - dac parametrul este
false, atunci nu mai sunt trasate liniile orizontale ale tabelului.
setShowGrid(boolean v) - dac parametrul este false, atunci nu
mai sunt trasate liniile orizontale i verticale ale tabelului.

8.3. Obiecte grafice. Clasa Graphics

8.3.1. Afiarea imaginilor

Pentru a afia o imagine aflat ntr-un fiier, vom scrie o clas care extinde
clasa Canvas. Obiectele clasei Canvas conin o metod numit
paint(Graphics ecr). Aceast metod este apelat automat atunci cnd
componenta respectiv este afiat i are rolul de a desena componenta.
Observai c metoda paint() primete ca parametru o referin ctre un obiect al
clasei Graphics i, pornind de la ea, putem apela toate metodele acestei clase,
cu ajutorul crora putem afia imaginea, putem scrie n mod grafic sau desena.
n programul urmtor, clasa care construiete componenta ce afieaz
imaginea se numete Imagine. Clasa Imagine conine:

1. O referin ctre un obiect de tip Image. Un astfel de obiect poate reine o


imagine citit. Referina este utilizat n metoda paint() pentru a afia imaginea
respectiv.
2. Un constructor care citete imaginea stabilete mrimea componentei
(setSize()) i culoarea de fundal (setBackground()). Pentru citirea imaginii
se utilizeaz metoda clasei Toolkit numit getImage():

Image getImage(String fisier), unde parametrul reprezint calea


ctre fiierul respectiv.
3. Metoda paint() (redefinit, pentru a avea acces). Metoda deseneaz
imaginea i folosete metoda drawImage() a clasei Graphics):

drawImage(image im, int a, int b, int latime, int


inaltime, this), unde:
352 Manual de Informatic pentru clasa a XII-a

a,b - coordonatele relative (fa de colul din stnga-sus al componentei


care afieaz imaginea; n exemplu Imagine) ale colului din stnga sus
al dreptunghiului care conine imaginea.
latime, inaltime - limea i nlimea dreptunghiului care conine
imaginea.
this - obiectul curent (cel al clasei Imagine). Nu tratm semnificaia
general a acestui parametru.

Observaii !

Metoda poate redimensiona imaginea citit (o mrete sau o micoreaz)


prin valorile transmise pentru latime i inaltime.
Fiierul imagine se gsete n Bin (folder-ul curent), dar i putem ataa o
cale.
Exemplul urmtor conine o component care afieaz desenul n centrul ei.
Desigur, imaginea putea acoperi ntreaga suprafa a componentei Imagine,
dar din considerente didactice, pentru a distinge ntreaga suprafa unde am
fi putut desena, am preferat s folosim setBackground().

Exemplul 8.37. Programul de mai jos construiete o


fereastr care afieaz o imagine:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Imagine extends Canvas
{ Image im;
Imagine()
{ Toolkit ec=Toolkit.getDefaultToolkit(); Figura 8.37.
im=ec.getImage("calculator.jpg"); Fereastra obinut
setSize(300,300);
setBackground(Color.YELLOW);
}
public void paint (Graphics ecr)
{ ecr.drawImage(im,50,50,200,200,this); }
}
class Fer extends JFrame
{ Imagine p=new Imagine();
public Fer(String titlu) {
super(titlu);setSize(150,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
x.add(p);
setVisible(true);
}
}
Capitolul 8. Programare vizual 353

public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Imagine"); }
}

8.3.2. Cum scriem ?

nainte de parcurgerea acestui paragraf, revedei 8.3.1., Afiarea


imaginilor. Ai putut observa acolo c metoda Paint primete ca referin un
obiect al clasei Graphics. Putem utiliza metodele acestui obiect pentru a desena
ceva sau pentru a ncrca o imagine care se gsete ntr-un fiier. Cele mai
importante metode ale acestei clase sunt:

void setFont (Font f) - seteaz obiectul pentru ca scrierea grafic s


se realizeze cu un anumit font;

void setColor(Color c) - seteaz culoarea de scriere (desenare);

drawString(String str, int x, int y) - scrie pe ecran un ir de


caractere. irul este scris cu font-ul i culoarea setate la un moment dat.
Parametrii x i y reprezint coordonatele colului din stnga sus al irului de
caractere afiat.
Exemplul 8.38. Iat cum arat metoda
Paint() pentru a putea scrie dou iruri
de caractere cu font-uri i culori diferite:
Figura 8.38. Rezultat
public void paint (Graphics ecr)
{ Font f=new Font("Arial",Font.ITALIC+Font.BOLD, 11);
ecr.setFont(f);
ecr.setColor(Color.red);
ecr.drawString("Un exemplu de scriere",20, 30);
ecr.setColor(Color.black);
Font f1=new Font("CourierNew",Font.BOLD, 14);
ecr.setFont(f1);
ecr.drawString("Scriu cu alta culoare si alt font",20,50);
}

8.3.3. Cum desenm ?

drawLine(int x1, int y1, int x2, int y2) - deseneaz o linie
(segment) ntre punctele de coordonate (x1,y1) i (x2,y2).

drawRect(int x,int y,int latime,int inaltime) - deseneaz


un dreptunghi pentru care colul din stnga sus are coordonatele (x,y) i
de lime i nlime date.
354 Manual de Informatic pentru clasa a XII-a

drawRoundRect(int x,int y,int latime,


lat
int inaltime,int lat,int inal) -
inal
deseneaz un dreptunghi care are colurile
rotunjite, (vedei figura alturat).

Figura 8.39. Dreptunghi


cu colurile rontunjite

void fillRect(int x, int y, int latime, int inaltime), la


fel ca drawRect(), numai c dreptunghiul este colorat n interior.

void fillRoundRect(int x,int y,int latime,int inaltime,


int lat,int inal) - la fel ca drawRoundRect(), numai c dreptun-
ghiul rotunjit este colorat n interior.

void drawPolygon(int[] X, int[] Y, int nr) - deseneaz un


poligon care are nr vrfuri. Coordonatele x ale punctelor se gsesc n
vectorul X, iar coordonatele y ale punctelor se gsesc n vectorul Y. Practic,
primul punct are coordonatele (X[0],Y[0]), al doilea punct are
coordonatele (X[1],Y[1]), .a.m.d. n final, pentru a obine poligonul se
unesc printr-un segment primul i ultimul punct. Poligonul este oarecare,
deci poate fi i neconvex.

Exemplul 8.39. Analizai secvena de mai jos:


ecr.setColor(Color.black);
int[] X= {10, 100,25, 80};
int[] Y= {10, 100,75, 30};
ecr.drawPolygon(X, Y, 4);

void fillPolygon(int[] X, int[] Y, int nr) - la fel ca mai


sus, numai c poligonul este colorat n interior.

void drawPolyline(int[] X, int[] Y, int nr) - la fel ca mai


sus, numai c nu se mai unete primul punct cu ultimul punct. Astfel se
obine o succesiune de segmente.

void drawOval(int x, int y, int latime, int inaltime) -


deseneaz un oval. Coordonatele x i y sunt ale colului din stnga sus al
dreptunghiului circumscris ovalului, iar latime i inaltime sunt limea i
nlimea acelui dreptunghi.

fillOval(int x, int y, int latime, int inaltime) - la fel ca


mai sus, numai c ovalul este colorat n interior.
Capitolul 8. Programare vizual 355

drawArc(int x, int y, int latime, int inaltime, int u1,


int u2) - traseaz un arc. Arcul este o poriune dintr-un oval i primii 4
parametri sunt ai ovalului cruia i aparine arcul. Ultimii doi parametri sunt:
unghiul de unde pornete arcul i numrul de grade al arcului. Unghiurile
sunt date n grade.

90

180 0

Figura 8.40. Un cerc i


gradele sale 270

fillArc(int x, int y, int latime, int inaltime, int u1,


int u2) - la fel ca drawArc, numai c se consider sectorul (nu numai
arcul) i acesta este colorat. De exemplu, n cazul n care latime i
inaltime rein aceeai valoare, ovalul este de fapt un cerc. n acest caz
avem un sector de cerc.

drawImage(image im, int a, int b, int latime, int


inaltime, this), unde:
a,b sunt coordonatele relative (fa de componenta creat, vezi
setSize()) ale colului din stnga-sus al dreptunghiului care conine
imaginea.
latime, inaltime - limea i nlimea dreptunghiului care conine
imaginea.
this - obiectul curent (cel al clasei Imagine). Nu tratm semnificaia
general a acestui parametru.

Observaie ! Metoda a mai fost folosit atunci cnd am afiat o imagine!


356 Manual de Informatic pentru clasa a XII-a

8.4. Accesarea i prelucrarea datelor

8.4.1. Citiri i scrieri utiliznd dispozitive standard i fiiere

n Java, fiierele sunt abordate pornind de la noiunea de flux. Prin flux vom
nelege o cale pe care o urmeaz datele pentru a ajunge de la surs la destinaie.
Putem imagina un flux ca o osea pe care circul maini. Astfel, n Java, datele ar
fi mainile care circul pe osea.
Exist dou tipuri de fluxuri:
A) Fluxuri de intrare - de la surs (un fiier), ctre destinaie (programul), unde
datele sunt prelucrate:

program fiier
Sursa Destinatie
Figura 8.41. Schema fluxului de intrare

B) Fluxuri de ieire - de la surs (programul) ctre destinaie (fiier), unde se


rein rezultatele:

fiier program
Sursa Destinatie
Figura 8.42. Schema fluxului de ieire
Observaie ! Clasele pe care le studiem n acest paragraf se gsesc n pachetul
java.IO.

Pentru a lucra cu fiiere text, vom utiliza fluxuri de caractere.


A) Fluxuri de intrare - se folosesc pentru citirea fiierelor text.

Pentru a transforma un flux de octei ntr-un flux de caractere, vom utiliza


constructorul clasei InputStreamReader (care extinde clasa Reader):
public InputStreamReader(InputStream in)
ntruct clasa FileInputStream extinde clasa InputStream, parametrul in (de
tip InputSTream) poate fi o referin ctre un obiect al clasei FileInputStream.

Pentru a putea lucra cu uurin cu caracterele, vom utiliza clasa


BufferedReader care permite ataarea fluxului de caractere al unei memorii,
numit buffer. Practic, buffer-ul permite memorarea mai multor caractere citite,
care urmeaz s fie prelucrate. Constructorul clasei BufferedReader este:

public BufferedReader(Reader in1).


Capitolul 8. Programare vizual 357

ntruct clasa InputStreamReader extinde clasa Reader, parametrul in1 poate


fi o referin ctre un obiect al clasei InputStreamReader.

Clasa BufferedReader conine metoda readLine() care citete din


fiier (flux) o ntreag linie de caractere:

public String readLine()


throws IOException

Acestea fiind spuse, putei analiza programul de mai jos care afieaz toate
liniile unui fiier text.
Exemplul 8.40. Dac creai cu NOTEPAD un fiier cu mai multe linii, numit in.txt,
programul l afieaz:
import java.io.*;
public class f {
public static void main (String[ ] args) throws IOException
{ FileInputStream f=new FileInputStream("in.txt");
InputStreamReader fchar=new InputStreamReader (f);
BufferedReader buf = new BufferedReader(fchar);
String linie;
while ((linie=buf.readLine())!=null)
System.out.println(linie);
fchar.close();
}
}

B) Fluxuri de ieire - se folosesc pentru scrierea fiierelor text.

Clasa FileOutputStream creeaz un flux de ieire ctre un fiier al crui nume


este transmis ca parametru. Ea extinde clasa OutputStream i are constructorul:
public FileOutputStream(String nume)
throws FileNotFoundException

Clasa PrintStream conine mai multe metode print i println care


funcioneaz exact ca System.out.print() i System.out.print(). Practic,
valoarea care este scris n fiier este mai nti convertit ctre tipul String, aa
cum suntem deja obinuii. Clasa este nzestrat cu constructorul:
public PrintStream(OutputStream out)

Exemplul 8.41. Programul de mai jos creeaz un fiier text (numit out.txt) care
conine 3 linii, iar fiecare linie conine cte un ir de caractere:
import java.io.*;
public class f {
public static void main (String[ ] args) throws IOException
{ FileOutputStream f=new FileOutputStream("out.txt");
PrintStream fchar=new PrintStream (f);
fchar.println("O linie");
358 Manual de Informatic pentru clasa a XII-a

fchar.println("Alta linie");
fchar.print("A treia linie");
fchar.close();
}
}

8.4.2. Instalarea soft-ului pentru lucrul cu bazele de date

Java are implementat un mecanism excepional de lucru cu bazele de date.


Pe lng faptul c, aa cum tim, Java poate rula pe orice sistem de operare,
exist posibilitatea ca, prin utilizarea acestui limbaj s putem lucra cu orice baz de
date care are la baz SQL.

Limbajul Java conine o interfa standard numit JDBC (Java DataBase


Connectivity), care ofer accesul la bazele de date accesabile prin SQL.
Clasele i interfeele (n sens OOP) care alctuiesc JDBC se gsesc n pachetul
java.sql. Cu ajutorul acestei interfee, dintr-un program Java, se pot transmite
comenzi SQL ctre baza de date.

Pentru a accesa o baz de date construit cu un anumit SGBD este necesar


s ncrcm clasa care conine metodele de acces la acel tip de baze de date. n
aceast carte ne referim la bazele de date realizate n MySQL, prin urmare, va fi
necesar ncrcarea clasei care conine metodele de acces la bazele de date
MySQL. Numele acestei clase este com.mysql.jdbc.Driver.

Clasa respectiv nu este coninut n mediul de dezvoltare Java. Pentru a o


folosi ea trebuie download-at. Cutai pe internet arhiva mysql-connector-
java-3.1.6. Dup download-are, dezarhivai-o ntr-un folder cu nume la alegerea
dvs. n exemplu, acest folder este fdex. Pentru a avea acces la ea, calea ctre
acest folder trebuie trecut n variabila de mediu CLASSPATH (aceasta poate
conine mai multe ci separate prin ;). Variabila CLASSPATH poate fi accesat din
Start, Settings, Control Panel, System, Advanced, Environment
Variables, dublu-clic pe CLASSPATH. n edit-ul afiat, trecei calea ctre ce ai
download-at, n exemplu C:/fdex/mysql-connector-java-3.1.6. Revedei
modul n care am instalat Java pentru c i acolo am utilizat variabila CLASSPATH.

8.4.3. Lucrul cu baze de date

Acum, c am instalat software-ul necesar, putem prezenta modul n care


lucrm cu bazele date MySQL. Tot ce prezentm aici, poate fi observat n
programul aflat la sfritul acestui paragraf.
Capitolul 8. Programare vizual 359

1. ncrcarea clasei care acceseaz bazele de date. Pentru MySQL, aceast


clas este com.mysql.jdbc.Driver. Pentru aceasta vom utiliza o metod a
clasei Class: forName(String nume_clasa). Dac operaia eueaz, inseamn
c nu am rezolvat corect problema instalrii soft-ului, tratat n paragraful anterior.
2. Conectarea la MySQL se realizeaz cu metoda de mai jos a clasei
DriverManager. Ea are trei parametri, adresa URL acolo unde lucreaz MySQL,
numelele utilizatorului (user) i parola de acces (password). n cazul nostru, ne
conectm la bazele de date aflate pe propriul calculator, deci adresa URL are un
format specific: jdbc:mysql://localhost/?". Foarte important ! n cazul nostru,
conectarea nu se poate realiza dac nu este pornit programul EasyPHP.
Connection getConnection
(String url, String user, String password)

Pentru a efectua o operaie cu bazele de date, cu comenzi SQL, mai precis cele din
MySQL, mai nti, trebuie s crem un obiect Statement care transmite comanda
ctre MySQL (SGBD, n general). Aceasta se realizeaz cu ajutorul metodei
Statement createStatement() a interfeei Connection (nu uitai c am
ncrcat clasa care implementeaz interfeele din JDBC).

Pornind de la acest obiect, se pot aplica metode specifice care transmit comenzi
MySQL. n acest manual, vom utiliza dou astfel de metode n care irul primit ca
parametru este o instruciune (comanda SQL).
a) int executeUpdate(String sql) - trimite o comand de punere la zi a
bazei de date. Se folosete pentru instruciuni MySQL precum CREATE
DATABASE, USE, CREATE TABLE, INSERT

b) ResultSet executeQuery (String sql) - trimite o comand de


interogare a bazei de date. Imaginai rezultatul sub forma unui vector n care
fiecare component reine un rnd al rezultatului interogrii. Metoda boolean
next() returneaz urmtoarea component din vector. Dac nu s-a ajuns la
sfrit, se returneaz true.

Informaiile de pe coloane, asociate unui rnd al interogrii pot fi accesate cu


ajutorul metodei:
String getString (String nume_camp).

n cele ce urmeaz vom exemplifica cteva operaii executate n baza de


date i existente n programul de mai jos.
3. Crearea unei baze de date
...executeUpdate ("CREATE DATABASE baza_de_date");

4. Accesul la o baz de date


...executeUpdate ("USE baza_de_date");
360 Manual de Informatic pentru clasa a XII-a

5. Crearea unui tabel


instr.executeUpdate
("CREATE TABLE tbl (camp1 char(10), camp2 int(4))");

6. Popularea cu date a unui tabel. Observai c apostrofurile sunt trecute sub


forma de cod escape:
instr.executeUpdate
("INSERT INTO tbl (camp1,camp2) VALUES(\'valoare1\', 100)");

7. Afiarea unui tabel (interogare)


rez.executeQuery(" SELECT * from tbl");
while (rez.next())
System.out.println(rez.getString("camp1")+
" "+rez.getString("camp2"));

n afara celor prezentate, este nevoie s tim doar MySQL. Oricum, noiunile
prezentate aici nu trebuie reinute dect n principiu, pentru c oricnd se poate
consulta o documentaie. Esenial este s tii s consultai o documentaie i s-o
aplicai n programele pe care le realizai.

Iat i programul care creeaz o baz de date, n ea formeaz un tabel pe care l


populeaz cu dou linii. n final, se afieaz cele dou linii ale tabelului:
import java.sql.*;
import java.io.*;
public class test
{ static Connection cnc=null;
static Statement instr=null;
static ResultSet rez=null;
static String URL="jdbc:mysql://localhost/?";
static String USER="root";
static String PAROLA="parolamea";
public static void main(String[] args)
{
// incarcarea clasei care acceseaza baza de date
try { Class.forName("com.mysql.jdbc.Driver").newInstance();
System.out.println("OK ");
}
catch (Exception ex)
{ System.out.println ("Nu gasesc clasa");}

// Conectarea la MySQL
try { cnc=DriverManager.getConnection(URL, USER, PAROLA );
System.out.println ("M-am conectat la MySQL");
}
catch (SQLException ex)
{ System.out.println ("Nu m-am conectat la MySQL "); }
Capitolul 8. Programare vizual 361

// Crearea unei baze de date


try {
instr= cnc.createStatement();
instr.executeUpdate ( "CREATE DATABASE baza_de_date" );
System.out.println ("am creat baza de date");
}
catch (SQLException e)
{ System.out.println ("nu am creat baza de date"); }
// Accesul la o baza de date
try { instr= cnc.createStatement();
instr.executeUpdate ( "USE baza_de_date" );
System.out.println ("utilizez baza de date");
}
catch (SQLException e)
{ System.out.println ("nu utilizez baza de date");}
// Crearea unui tabel in baza de date
try {
instr= cnc.createStatement();
instr.executeUpdate
("CREATE TABLE tbl (camp1 char(10), camp2 int(4))");
System.out.println ("am creat tabelul");
}
catch (SQLException e)
{System.out.println ("nu am creat tabelul");}
// Popularea unui tabel cu date
try { instr= cnc.createStatement();
instr.executeUpdate
("INSERT INTO tbl (camp1,camp2) VALUES(\'valoare1\', 100)");
instr.executeUpdate
("INSERT INTO tbl (camp1,camp2) VALUES(\'valoare2\', 15)");
System.out.println("Date adaugate");
}
catch (SQLException e)
{ System.out.println ("nu inserare"); }
// Interogare de afisare a unui tabel
try { instr= cnc.createStatement();
rez=instr.executeQuery(" SELECT * from tbl");
while (rez.next())
System.out.println(rez.getString("camp1")+
" "+rez.getString("camp2"));
}
catch (SQLException e) {}
}
}
362 Manual de Informatic pentru clasa a XII-a

ntrebare. Care este modalitatea prin care putem afia elegant rezultatele
interogrii unei baze de date?

Rspuns. S nu uitm c am studiat o component care permite afiarea elegant


a unui tabel i anume componenta de tip JTable. n continuare, prezentm un
program care afieaz datele din tabelul tbl al bazei de date construite n cadrul
exemplului anterior:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
import java.sql.*;
import java.io.*;
Figura 8.43. Fereastra
class Fer extends JFrame programului propus
{ static Connection cnc=null;
static Statement instr=null;
static ResultSet rez=null;
static String URL="jdbc:mysql://localhost/?";
static String USER="root";
static String PAROLA="parolamea";
static String nr_linii;
static Object[][] linii_date;
public Fer(String titlu) {
super(titlu);
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// incarcarea clasei care acceseaza baza de date
try
{Class.forName("com.mysql.jdbc.Driver").newInstance();}
catch (Exception ex)
{System.out.println ("Nu gasesc clasa");}
// Conectarea la MySQL
try {cnc=DriverManager.getConnection(URL, USER, PAROLA);}
catch (SQLException ex)
{System.out.println ("Nu m-am conectat la MySQL ");}
//Accesul la o baza de date
try { instr= cnc.createStatement();
instr.executeUpdate ( "USE baza_de_date" );
// gasesc numarul de linii din tabel
rez=instr.executeQuery(" SELECT COUNT(*) AS numar
FROM tbl;");
rez.next();
nr_linii=rez.getString("numar");
// masivul care retine liniile care vor fi afisate
linii_date=new Object[Integer.parseInt(nr_linii)][2];
int i=0;
rez=instr.executeQuery(" SELECT * from tbl");
Capitolul 8. Programare vizual 363

while (rez.next())
{ linii_date[i][0]=rez.getString("camp1");
linii_date[i][1]=rez.getString("camp2"); i++; }
}
catch (SQLException e)
{System.out.println("erori in utilizarea bazei de date");}
String[] cap_tabel = {"Camp 1", "Camp 2"};
Container x=getContentPane();
x.setLayout(new FlowLayout());
JTable table = new JTable(linii_date, cap_tabel);
JScrollPane panel = new JScrollPane(table);
table.setPreferredScrollableViewportSize
(new Dimension(200, 30));
x.add(panel); setVisible(true);
}
}
public class baza {
public static void main(String args[]) {
Fer fp=new Fer("Tabel"); }
}
Exerciiu ! Nu uitai c n celulele unei componente de tip JTable utilizatorul
poate introduce date (celulele sunt editabile). Scriei un program care actualizeaz
o baz de date pornind de la datele introduse de utilizator ntr-un tabel.
Observaie ! Cu programele Java care ruleaz pe calculatorul nostru se poate
lucra cu bazele de date care se afl pe server! Este ceva...

1. Stabilii corespondena dintre elementele din stnga i cele din dreapta:


1) gestionar de poziionare; a) ataeaz componente;
2) container; b) rspunde la evenimente;
3) asculttor de evenimente. c) poziioneaz componentele.

2. Stabilii corespondena dintre coloanele din stnga i cele din dreapta:


1) JPanel; a) mesaj lmuritor;
2) JButton; b) d o comand;
3) JTextField; c) mai multe iruri;
4) JLabel; d) selecteaz o singur opiune;
5) JComboBox; e) grupeaz mai multe componente;
6) JTextArea; f) pentru selecii multiple;
7) JcheckBox. g) citete un ir de caractere.
364 Manual de Informatic pentru clasa a XII-a

3. Scriei un program n care o fereastr afieaz un buton. La apsarea


butonului, programul va afia n fereastra CMD rezoluia ecranului.
4. Scriei un program n care o fereastr afieaz dou butoane: Buton 1 i
Buton 2. tiind c metoda boolean isEnabled() a clasei JComponent
returneaz true dac butonul este activ i false, n caz contrar. Facei n aa fel
nct, la apsarea primului buton, dac al doilea buton este activ s devin inactiv
i invers, dac este inactiv s devin activ.

Figura 8.44. Fereastra propus

Indicaie ! Pentru a face un buton activ/inactiv se folosete metoda


setEnabled(true/false).

5. Cum se poate ca o fereastr s afieze cinci


butoane, precum cea de mai jos?

Figura 8.45.
Fereastra propus

6. Se tie c pentru a citi o parol se utilizeaz o


component de tip JPasswordField (clas care are ca superclas pe
JTextField). Se tie de asemenea, c pentru o component de tip
JPasswordField, metoda getText() este depreciat i n locul ei se utilizeaz
metoda: char[] getPassword(). Se cere ca programul dvs. s citeasc o
parol i s afieze OK dac parola introdus este irul Mama i NO, n caz
contrar.

Figura 8.46. Exemplu

7. Realizai un program n care ntr-un edit s se poat


introduce numere prin apsarea unor butoane, ca
alturat. Extindei apoi programul pentru simularea unui
calculator de buzunar.

Figura 8.47. Exemplu

8. S se scrie un program care conine trei metode prin care se determin dac
un numr natural n citit este prim sau nu. Prima dintre ele testeaz toi divizorii
numrului de la 2 la n-1, a doua divizorii de la 2 la n / 2 , a treia de la 2 la n.
Capitolul 8. Programare vizual 365

Pentru citirea numrului, fereastra va conine o etichet i un edit, pentru


selectarea algoritmului se va utiliza o list, iar dup introducerea numrului i
selectarea algoritmului, un buton va declana prelucrarea corespunztoare.
9. Programul dvs. va efectua o copie a unui fiier text. Numele fiierului care se
copiaz va fi introdus ntr-un edit, iar numele fiierului destinaie n alt edit.
10. Scriei un program care genereaz un fiier text cu n numere naturale.
Valoarea lui n va fi introdus cu ajutorul unui edit.

11. Scriei un program care creeaz, pornind de la fiierul anterior, un altul care
conine aceleai numere, dar sortate cresctor. Se vor implementa mai muli
algoritmi de sortare, iar selecia celui care va sorta fiierul se va face cu ajutorul
unei liste aflat pe fereastra principal.
12. Scriei un program care citete dou numere reale. Programul va putea afia
suma, diferena, produsul i ctul lor. Operaia care se efectueaz se va selecta
dintr-un meniu. Rezultatul va fi afiat cu ajutorul unor cutii de dialog predefinite.
13. Creai un fiier text n care fiecare linie s conin numele unei persoane i
vrsta ei. Datele se introduc secvenial. Pentru a le introduce, o fereastr va avea
ataate dou edit-uri (unul pentru nume i altul pentru vrst) i un buton. La
apsarea butonului se va efectua validarea datelor (alfabetic pentru nume i un
numr natural ntre 1 i 99 pentru vrst).

14. Adugai o list ferestrei de la problema precedent din care s se poat


selecta mai multe opiuni, n urma crora programul va putea afia:
a) media vrstelor persoanelor a cror date au fost trecute n fiier;
b) numrul de persoane care au datele trecute n fiier.
15. Scriei un program care afieaz i actualizeaz fiierul creat la problema 13.
Pentru a realiza operaiile propuse se va utiliza o component de tip JTextArea,
iar operaiile Open, Save i Save As se vor selecta dintr-un meniu.

16. Scriei un program care genereaz un fiier text care conine cel puin
10.000 numere naturale aleatoare. Apoi, scriei un alt program care sorteaz
fiierul prin utilizarea mai multor metode de sortare. Metoda de sortare se va
selecta dintr-o list. La fiecare sortare, se va estima timpul rmas prin utilizarea
unei componente de tip JProgressBar.

17. Scriei un program n care o component de tip JTextArea afieaz un text


preluat dintr-un fiier text dat. Se cere s se seteze font-ul i mrimea lui prin
selectarea lor din dou liste.
18. Scriei un program n care se creeaz i se actualizeaz un fiier text. Textul
se introduce cu ajutorul unei componente de tip JTextArea. Pentru deschiderea
fiierului i salvarea lui, se utilizeaz cutii de dialog de tip Open / Save apelabile
dintr-un meniu.
366 Manual de Informatic pentru clasa a XII-a

19. Completai programul anterior astfel nct culoarea suprafeei componentei de


tip JTextArea s poat fi selectat cu ajutorul unei componente de tip
JColorChooser, apelabil cu ajutorul unui buton aflat pe bara de unelte. De
asemenea, fontul va fi selectat dintr-o list, iar mrimea lui cu ajutorul unei
componente de tip JSpinner, ambele aflate pe bara cu unelte (component de tip
JToolBar).

20. Realizai un scurt referat despre tipul de aplicaie Java numit applet.

(pentru verificare, rezolvrile se gsesc la pag. 384)

Urmtoarele aplicaii se vor realiza n colective formate din cte 5 elevi.


Fiecare problem rezolvat va fi nsoit de documentaie. Dup ce o echip
rezolv o problem, pred documentaia unei alte echipe, care pe baza ei va
prezenta aplicaia n faa clasei. Este esenial ca documentaia s fie clar, astfel
nct pe baza ei oricine s poat rula aplicaia.
O echip poate fi alctuit din:
- 1 proiectant al bazelor de date (dac este cazul);
- 1 designer;
- 3 programatori.
1. X i 0. Toat lumea cunoate acest joc, asta e sigur! Realizai o interfa
grafic prin care s poat fi jucat de ctre dou persoane. Ca idee:
trebuie s avei o comand care s permit resetarea jocului;
s se indice momentul n care unul dintre juctori a ctigat runda;
alternativ, s se afieze numele juctorului care este la mutare;
s fie disponibil un top al celor mai iscusii utilizatori, etc.
2. Dame. Scriei un program care afieaz toate soluiile pentru problema celor n
dame. n exemplu, se consider n=8. Dup afiarea unei soluii, pentru a fi afiat
urmtoarea soluie, se va apsa un buton. Pentru afiare, vei utiliza o component
de tip JTable.

3. Refacei proiectele de la finalul prii a doua, realiznd interfee grafice n Java


care s permit accesul la informaiile reinute n bazele de date corespunztoare.

4. Alegei o baz de date pe care a-i studiat-o pe parcursul acestui manual i


realizai o aplicaie complet, care s permit accesul fie prin intermediul
Internetului, fie printr-un program implementat n Java.
ANEXA 1
Instalarea programelor Apache, PHP i MySQL

Vom instala programele amintite pe calculatorul nostru, avnd, astfel,


posibilitatea s le studiem far s fim conectai la Internet. n ipoteza n care am
nvat s le folosim i dorim s construim un site web, atunci vom nchiria spaiu
pe server i acolo vom transfera script-urile realizate pe propriul calculator.
Toate programele amintite se gsesc n pachetul EasyPHP, iar instalarea
lor se reduce la instalarea lui, care este, de altfel, gratuit. Pachetul conine:
Apache, PHP, MySQL i PhpMyAdmin (ultimul conine script-uri PHP prin care se
faciliteaz lucrul cu MySQL). Adresa de unde poate fi descrcat pachetul este:
http://www.easyphp.org/telechargements.php3.

1. Se download-eaz un executabil care, apelat, va instala programele din pachet


(alegei opiunile implicite). Executabilul download-at de noi este easyphp1-
8_setup.exe. n urma rulrii acestuia, se creeaz n Programa Files folder-ul
EasyPHP1-8 care conine programele din pachet.
2. Pentru a configura PhpMyAdmin se procedeaz astfel:
2.1. n folder-ul EasyPHP1-8 se gsete directorul phpmyadmin. Acesta se
copiaz n folder-ul www (tot din EasyPHP1-8).
2.2. n phpmyadmin se gsete fiierul config.inc.php. Se execut dublu
clic asupra sa i n acest fel, datorit extensiei sale, este apelat browser-ul
(Internet Explorer) care l deschide. Pentru c dorim s-l modificm, trebuie
s vizualizm sursa sa (fiierul aa cum este, nu interpretat de ctre browser). Prin
urmare, din meniul browser-ului vom selecta View i Source. Astfel, va fi apelat
programul Notepad care afieaz sursa.
2.2.1. Cu opiunea Find, cutai linia cfg['Servers'][$i]['auth_type'].
Observai c dup acest ir de caractere gsii =config. n loc de =config
vei scrie =cookie.
2.2.2. Cutai irul $cfg['blowfish_secret']. Dup acest ir se gsete
=. nlocuii = cu un ir de caractere la alegerea dvs., de exemplu =vlad.
2.2.3. Salvai modificrile.
2.2.4. Apelai adresa http://localhost/phpmyadmin. n acest fel este
apelat fiierul index din directorul phpmyadmin (index.php). Trebuie s apar
ce vedei n figura urmtoare:
368 Manual de Informatic pentru clasa a XII-a

Numele de utilizator este


root. Fr a introduce
parola, apsai butonul
Autentificare. Se va
afia ce vedei alturat:

Figura A1.1. Pagina de


autentificare pentru
phpmyadmin

2.2.5. Execuai dublu-clic pe link-ul Schimbare parola i adugai parola


dorit (vezi Fig. A1.3).

Figura A1.2. Pagina de administrare phpMyAdmin

Din acest moment, phpMyadmin se


poate apela prin
http://localhost/phpmyadmin.
Desigur, de fiecare dat se va
intoduce parola pe care ai hotart
s o avei.

Figura A1.3. Pagina de schimbare a parolei


Observaii !
1) De acum, am instalat pe calculatorul nostru software-ul de server.
2) Programele amintite pot fi instalate i separat, dar mult mai complicat. Avnd n
vedere scopul nostru exclusiv didactic, pachetul EasyPHP este soluia ideal.
3) Pentru a utiliza acest software, introducei fiierul index n subfolder-ul www
al pachetului i apelai-l din browser prin http://localhost. Indexul poate
avea extensia html sau php. nainte de a efectua astfel de apeluri, trebuie lansat
programul EasyPHP. Deschiderea lui se va face din meniul Start/Programs.
ANEXA 2
Dezvoltarea profesional n domeniul IT

Un om este suma aciunilor sale, a ceea ce a fcut i a ceea ce poate face


Mahatma Gandhi

Pe parcursul acestei anexe vei nva urmtoarele:

care sunt etapele planificrii carierei

cum s v evaluai aptitudinile i interesele

cum s aflai care sunt meseriile care vi se potrivesc

cum s scriei un curriculum vitae

cum s v pregtii pentru un interviu de angajare

Te afli n faa unui pas important din viaa ta, acela n care eti pus s decizi,
dac nc nu ai fcut-o, un drum spre viitoarea ta carier.
Stabilirea planurilor pentru viitor este o sarcin dificil n societatea noastr.
Procesul de autocunoatere i dezvluie alternativele de succes, i extinde paleta
opiunilor. Aa poi avea convingerea c te afli pe drumul cel bun.

Principalii pai pe care trebuie s i avei n vedere pentru a avea succes n


planificarea viitoarei voastre cariere sunt, pe scurt, urmtorii:

1. Identificarea principalelor dumneavoastr aptitudini i interese.

2. Identificarea meseriilor de interes.

3. Evaluarea posibilelor cariere.

4. Crearea curriculumului vitae i a portofoliului personal.

5. Pregtirea i susinerea interviului de angajare.

6. Stabilirea unui plan de dezvoltare profesional.


370 Manual de Informatic pentru clasa a XII-a

A2.1. Evaluarea aptitudinilor i intereselor

n domeniul IT, ca n orice domeniu de activitate de altfel, exist att de


multe ocupaii i posibile cariere, nct i poi pune ntrebarea "cum s-mi aleg
oare cariera care mi se potrivete cel mai bine?"
n cele ce urmeaz, vei nva cum s identificai acele meserii n care
abilitile voastre s fie importante i care s se potriveasc cel mai bine cu
preferinele dvs.
Oricine tie ct de importante sunt abilitile n obinerea sau pstrarea unui
serviciu. Angajatorii urmresc n CV-ul tu abilitile relevante pentru postul
solicitat. Ei vor cere detalii despre aceste abiliti n timpul interviului.
Dar nu numai att. Nu este destul s ai anumite abiliti, trebuie s i i plac
s le foloseti. De exemplu, poi avea foarte bune abiliti de comunicare dar totui
nu-i face mare plcere s vorbeti n public sau n faa unor persoane necunoscute.
Exist un adevr destul de greu de acceptat de muli oameni, pe care-l
realizeaz doar atunci cnd este deja trziu... Dac ceea ce facem nu ni se
potrivete, orict de mult ne strduim i orict de mare ar fi salariul, nu vom putea fi
dect un profesionist mediocru, lipsit de satisfacie profesional.

A2.2. Identificarea meseriilor de interes

Acum este timpul s ncepei munca de explorare. Este momentul s


adunai informaii din ct mai multe surse de informaii posibile i s aflai
denumirile posibilelor meserii, care sunt cerinele pentru aceste meserii i orice alte
informaii de acest gen.
Care sunt sursele de informare? Exist multe posibiliti de informare, precum:
Ziare i site-uri web anunurile de angajare din ziare i de pe internet
pot fi o surs important de informare. n acest mod, putei afla care sunt
cele mai cerute meserii de pe pia, care sunt cerinele pe care angajatorii
le solicit viitorilor angajai, etc. Nu uitai ns c ceea ce este acum "la
mod" pe pia s-ar putea ca n 4-5 ani, cnd probabil vei intra pe piaa
muncii, s nu mai fie tot att de cutat.
Ageniile de plasare a forei de munc angajaii acestor agenii v pot
consilia n cutarea unui loc de munc potrivit calificrilor i deprinderilor
voastre. Tot aici putei afla informaii utile despre tendina de pe pia sau
despre cererea de for de munc.
Persoane care lucreaz n domeniu probabil c pe cele mai bune
informaii despre o meserie le aflai de la persoane care au aceast
meserie. Vei cunoate de la acetia nu doar cerinele meseriei, dar putei
Anexa 2. Dezvoltarea profesional n domeniul IT 371

afla multe date despre mediul n care lucreaz, despre programul de lucru,
i multe alte aspecte utile n luarea unei decizii. De multe ori ceea ce ne
imaginm noi c nseamn o meserie nu se potrivete deloc cu realitatea.
Dac putem intra n contact direct cu oamenii care lucreaz n domeniu
sau dac putem vizita locul acestora de munc, ne poate fi de mare ajutor.
Angajarea temporar pe timpul vacanelor colare, n domenii ct mai
apropiate de meseriile pe care le dorim, ar putea s v ajute s v dai
seama mai bine dac aceste meserii vi se potrivesc cu adevrat.
n plus experiena acumulat n acest fel poate fi foarte valoroas mai
trziu, atunci cnd vei scrie un curriculum vitae. Aici putem include i
munca de voluntariat, care este de multe ori privit cu ochi foarte buni de
ctre angajatori.

1. Folosind orice surs de informaie de care dispunei, cutai 5 meserii din


domeniul IT care v-ar putea trezi interesul i scriei denumirile acestora pe caiet
sau pe o foaie de hrtie.
2. Pentru una dintre aceste meserii, cutai o descriere ct mai detaliat a sa.
Notai 5 caliti cerute de aceast meserie.
3. Care sunt sarcinile i responsabilitile meseriei selectate?
4. Care este nivelul de pregtire necesar pentru meseria selectat la punctul 2?
5. Care sunt condiiile de munc ale acestei meserii (numr de ore zilnice de
munc, cerine fizice ale postului, nivelul de stres, etc.) ?
6. Care sunt posibilitile de avansare n carier dintr-un astfel de post? Putei
folosi pentru a rezolva aceast sarcin de lucru urmtoarele adrese web:
http://www23.hrdc-drhc.gc.ca/ch/e/docs/ch_welcome.asp
http://hotjobs.yahoo.com
http://www.careeroink.com/career-reference/
http://www.go.ise.ro/

A2.3. Evaluarea posibilelor cariere

Ai reuit probabil s v facei o idee despre carierele din domeniul IT pe


care le-ai putea urma i care sunt cerinele pentru fiecare dintre acestea. Pe de
alt parte, ai realizat un inventar a ceea ce tii i dorii s facei.
Acum vei afla cum s comparai ceea ce oferii voi i ceea ce vi se cere
pe piaa muncii. Vei vedea care sunt modalitile prin care v putei da seama
dac o meserie este potrivit pentru voi sau nu.
372 Manual de Informatic pentru clasa a XII-a

nainte de a trece la treab, dorim s mai precizm civa factori de care


trebuie s inei cont n alegerea unei meserii. Nu este suficient s fii bine pregtit
pentru o meserie, s avei destule caliti pentru aceasta, s v plac s folosii
abilitile solicitate. Trebuie s luai n calcul i urmtorii patru factori importani:

Tendina pieei muncii diferitele fenomene economice i sociale, pot


influena n timp cererea de for de munc. De exemplu, dac nainte de
1989, inginerii erau la mare cutare, imediat dup revoluie acetia au intrat
oarecum n umbr, muli dintre ei fiind nevoii s se reprofileze. Dei acum
este foarte cutat o anumit meserie, peste civa ani s-ar putea s fie
dificil s gseti un loc de munc n meseria respectiv. De aceea, cnd
alegi o meserie, trebuie s studiezi statisticile i s afli care vor fi probabil
meseriile cutate peste civa ani.

Lucrul n aer liber unele persoane prefer s lucreze n aer liber, alii din
potriv prefer munca n interior, ca de exemplu ntr-un birou, n spital,
ntr-un laborator, etc.

Munca fizic v place i putei desfura munc fizic grea?

Condiii periculoase de munc muli oameni sufer accidente la locul de


munc. Multe meserii presupun un anumit grad de periculozitate. ntrebarea
este dac suntei dispui s v asumai astfel de riscuri sau preferai un loc
de munc cu condiii sigure?

A2.4. Scrierea unui curriculum vitae

Scrierea unui curriculum vitae poate fi o munc dificil pentru cei care nu
sunt familiarizai cu acest tip de document, dar exist o serie de tehnici care fac
aceast munc mai uoar.
Scopul acestui document este s conving angajatorul c ar trebui s te
invite la un interviu. Este ntr-un anumit sens o form de publicitate, prin care
ncerci s atragi atenia, s strneti interesul, s descri abilitile i realizrile tale
cele mai deosebite i s inviti angajatorul s te contacteze.
E foarte important ca un curriculum vitae s fie ct mai concis, angajatorul
nu va petrece foarte mult vreme citindu-l. Acest document va arta angajatorului
cine eti, ce ti, ce poi face, i care sunt realizrile tale.
Prima impresie lsat de ctre curriculum vitae este foarte important. El
trebuie s fie bine organizat, uor de citit (spre exemplu, utilizai fontul Arial sau
Times New Roman, de mrime 12 pt) i corect din punct de vedere gramatical.
Observaie ! Dac adaugi i date calendaristice, ordinea acestora va fi cea invers
cronologic.
Anexa 2. Dezvoltarea profesional n domeniul IT 373

Seciunile importante ale unui curriculum vitae sunt:


Date personale nume complet, adres, numr de telefon, adres de
e-mail, adresa paginii de web (dac exist).
Observaie ! Dac nu avei o adres de e-mail, este momentul s v creai una
acum! Avei ns grij la id-ul ales. Acesta trebuie s fie unul serios, profesional.
Obiectivul de carier/obiectivul pentru poziia solicitat
Abiliti speciale i calificri corespunztoare obiectivului ales
o referii-v aici la abilitile descoperite n prima seciune (A2.1);
o limbi strine cunoscute;
o abiliti de lucru cu calculatorul;
o certificri obinute;
o dac nu ai experien relevant, accentueaz aptitudinile pe care
le-ai dezvoltat n termeni de relaii interpersonale, organizaionale
sau cunotinele referitoare la aspectele postului la care aspiri.
Educaie vei meniona aici colile i calificrile obinute. Nu este necesar
s treci n CV coala primar i gimnaziul absolvit, dect dac au fost
instituii prestigioase. Menioneaz numele colii absolvite, diploma
obinut, data i, dac doreti, poi scrie i specializarea obinut (ex.
Bucureti, Diploma Bacalaureat, Liceul "Ion Neculce", 1999). Numele
diplomelor obinute nu se abreviaz. Toate etapele educaionale vor fi
scrise n ordine invers absolvirii lor (cea mai recent fiind prima).
O sub-seciune este cea a cursurilor care au relevan n raport cu locul de
munc solicitat.
Proiecte - n aceast sub-seciune pot fi scrise proiectele relevante, la care
ai participat.
Experien IT&C - vor fi menionate att cunotinele teoretice, ct i cele
practice.
Experiena profesional - posturi ocupate pn n momentul de fa,
poziia ocupat, perioada, responsabiliti pe care le-ai avut.
Vei meniona aici cercetrile la care ai participat, certificri obinute,
premiile i bursele obinute (vei meniona numele premiului i numele
instituiei care a acordat premiul i data).
Activiti de voluntariat, implicare n cadrul comunitii, asociaii la
care suntei membri
Articole/cri publicate
Alte activiti i interese activiti extracurriculare, hobbyuri, etc.
374 Manual de Informatic pentru clasa a XII-a

Din ce n ce mai mult n ntreaga Europ, dar i la noi n ar, este folosit
formatul european al CV-ului. Formatul european este utilizat, n mod special,
pentru locuri de munc cu standarde superioare pentru angajai.

1. Redactai CV-ul personal, folosind formatul european pe care l putei descrca


de pe internet de la adresa: http://www.go.ise.ro/uchazeni/cv_eu.rtf.
2. Descoperii greelile tipice la redactarea unui CV, folosind adresele web:
http://www.cdm.uwaterloo.ca/restest.asp i
http://www.cdm.uwaterloo.ca/restest2.asp.
3. ncercai s depistai i s corectai n CV-ul vostru eventualele greeli, dup
modelul anterior.

A2.5. Pregtirea i susinerea interviului


Dac ai fost invitat pentru un interviu, acesta reprezint un prim succes. CV-ul
pe care l-ai trimis a strnit interesul instituiei/firmei respective pentru persoana ta. Dar,
de acum ncepe o alt competiie pe care, de asemenea, trebuie s o ctigi.
Prima condiie pentru a te prezenta ct mai bine este s nu te gndeti la
ceilali candidai, orict de muli ar fi acetia. Poi fi singurul care particip la
interviu sau poi fi unul din mai muli candidai i s ctigi.
Pregtirea pentru interviu const n a nva s pori o conversaie cu
angajatorul i s rspunzi la anumite ntrebri. Scopul tu este s-l convingi pe
acesta c tu eti persoana cea mai potrivit pentru postul respectiv, c ai abilitile
i deprinderile necesare.
ncearc s te gndeti c interviul este de fapt o conversaie ntre doi
parteneri egal interesai de aceast conversaie. Amndoi avei informaii impor-
tante de expus i de aflat.
Iat cteva sugestii de care ar fi bine s ii cont n pregtirea pentru interviu:
Adopt o inut corespunztoare, curat i ngrijit. Statisticile spun c
70% din mesajul pe care l transmii este exclusiv vizual. Alege s transmii
un mesaj elegant prin inuta ta.
Pentru femei, cea mai potrivit este o inut clasic, sobr, simpl, dar de
bun-gust. Taiorul i fusta sau pantalonul pot fi o variant adecvat de
mbrcminte pentru interviu. Nu exagera cu accesoriile. Nu purta
lnioare sau brri zgomotoase, ncrcate de pietre preioase sau tot
felul de medalioane. ncearc s fii ct mai discret, dar cu haine de
calitate. Nu abuzai cu machiajul i folosii doar o baz care s v acopere
micile imperfeciuni, nu folosii culori tari la fardul de pleoape sau de obraz.
Rujul trebuie s fie ct mai discret, cu un contur foarte fin.
Anexa 2. Dezvoltarea profesional n domeniul IT 375

Brbaii pot opta oricnd pentru un costum clasic, bine croit, evitnd, pe ct se
poate culorile nchise precum negru sau bleu-marin. Indiferent ct de cald ar fi
afar, prezint-te la interviu cu o cma cu mnec lung i cravat.

Dezvolt-i capacitatea de comunicare.

Pregtete pentru interviu un dosar pe care s l ai la tine i care s conin:


o Date despre companie (rapoarte anuale, materiale privind vnzrile, etc).
o Cteva copii suplimentare ale CV-ului i ale scrisorilor de recomandare.
o O list cu 10-15 ntrebri pe care le poi pune n timpul interviului i
care se bazeaz pe datele pe care le ai despre companie.
o Un pix, foi i orice alte lucruri care crezi c i pot fi utile (acte de studii,
foi matricole, etc.).

n ziua dinaintea interviului sun la firm pentru a confirma ntlnirea. Fi


sigur c ti unde trebuie s ajungi i f n aa fel nct s ajungi cu 10
minute nainte de ora fixat. Ia n calcul orice situaie care poate duce la o
eventual ntrziere i evit-o. ncearc s nu ajungi n ultimul moment,
agitat i transpirat.
Verific-i inuta nainte de interviu. Verific-i hainele, imaginea general,
aranjeaz-i prul. Exerseaz zmbetul!
Ai grij la limbajul corpului. Acesta poate da indicii cu privire la starea ta de
spirit. Nu evita contactul vizual cu intervievatorul, dar nu l fixa cu privirea.
Contactul vizual e una dintre cele mai puternice forme de comunicare,
dovedind ncredere i putere. Nu f micri brute, nu-i ncrucia braele. Nu
acoperi faa cu minile, ine-i minile departe de fa.
Demonstreaz entuziasm i interes sincer.
Subliniaz-i abilitile i capacitile. Descrie valoarea ta i beneficiile pe
care le oferi. Arat cum poi tu contribui la: 1) creterea vnzrilor,
2) reducerea costurilor, 3) mbuntirea productivitii, 4) rezolvarea
problemelor organizatorice.
Ia notie n timpul interviului. Te poi folosi de aceste notie mai trziu, n
timpul interviului. Dac nu eti sigur, poi cere permisiunea mai nti.
Las intervievatorul s aduc n discuie problema salariului. Odat
propus o sum, aceasta poate fi negociat.
Fii pregtit s rspunzi la toate ntrebrile, chiar i la cele incomode.
nainte de interviu, pregtete un rspuns pentru fiecare ntrebare care ar
putea fi o problem pentru tine i exerseaz acest rspuns pn vei fi sigur
pe el. Majoritatea ntrebrilor care pot aprea n cadrul unui interviu pot fi
prevzute. n consecin, poi s-i pregteti din timp rspunsurile.

ntotdeauna, n urmtoarele 24 de ore de dup interviu, trimite o scrisoare


de mulumire. Aceasta te poate detaa de ceilali candidai.
376 Manual de Informatic pentru clasa a XII-a

Exemple de ntrebri frecvente la interviurile pentru angajare:

Cum ai descrie cariera dumneavoastr de pn acum?


Care era activitatea dvs. la locul de munc anterior?
Ce v plcea (nu v plcea) la aceast activitate?
Care au fost elementele noi pe care le-ai nvat acolo?
De ce ai prsit locul de munc anterior ? (atenie - nu fii prea critic la
adresa fostului ef)
Descrie-ne eful tu.
Descrie-te pe tine nsui.
De ce te intereseaz locul acesta de munc?
Cum te-ar descrie prietenii ti?
Ai mai fost i la alte interviuri?
Ce tii despre firma noastr? De ce ai ales-o? (merit s tii ceva despre
firm informai-v din timp)
Ce v-ar plcea s obinei n munc (n carier)? Cum v vedei (ce v-ar
plcea s facei) peste 5 (10) ani?
Care v sunt punctele forte (slabe), la ce suntei bun (mai puin bun)?
Care sunt cunotinele i aptitudinile pe care le-ai aplica la noul loc de
munc?
De ce ar trebui s v ncredinm dvs. acest loc de munc? Ce beneficiu
ne-ai aduce?
Ce tip de munc v face s fii ncreztor?
Suntei dispus s lucrai peste programul normal?
Suntei capabil i dispus s lucrai ocazional cu un volum mare de munc?
tii s v odihnii sau s v relaxai?
Cum v petrecei vacanele? Care sunt interesele de timp liber?
V place sportul?
Care este starea sntii dumneavoastr?
Avei ceva ntrebri?

Fii tu nsui !
Fii cinstit !
Fii pozitiv !
ANEXA 3
Caractere HTML

nainte de prezentarea tabelelor, inserm textul de mai jos, pentru c au fost


folosite normele W3C ("http://www.w3.org"):
"Portions International Organization for Standardization 1986
Permission to copy in any form is granted for use with conforming
SGML systems and applications as defined in ISO 8879, provided this
notice is included in all copies."

A3.1. Caractere ISO 8859-1

&#161 &#191
&#162 &#192
&#163 &#193
&#164 &#194
&#165 &#195
&#166 &#196
&#167 &#197
&#168 &#198
&#169 &#199
&#170 &#200
&#171 &#201
&#172 &#202
&#173 desprire n silabe &#203
&#174 &#204
&#175 &#205
&#176 &#206
&#177 &#207
&#178 &#208
&#179 &#209
&#180 &#210
&#181 &#211
&#182 &#212
&#183 &#213
&#184 &#214
&#185 &#215
&#186 &#216
&#187 &#217
&#188 &#218
&#189 &#219
378 Manual de Informatic pentru clasa a XII-a

&#190 &#220
&#221 &#238
&#222 &#239
&#223 &#240
&#224 &#241
&#225 &#242
&#226 &#243
&#227 &#244
&#228 &#245
&#229 &#246
&#230 &#247
&#231 &#248
&#232 &#249
&#233 &#250
&#234 &#251
&#235 &#252
&#236 &#253
&#237 &#254
&#160 spaiu incorporat &#255
&#258 ~ &#259 `
&#350 { &#351 [
&#354 } &#355 ]

A3.2. Litere greceti i semne matematice

&#913 &#923
&#914 &#924
&#915 &#925
&#916 &#926
&#917 &#927
&#918 &#928
&#919 &#929
&#920 &#931
&#921 &#932
&#922 &#933
&#934 &#8230
&#935 &#8242
&#936 &#8243
&#937 &#8254
&#945 &#8260
&#946 &#8482
&#947 &#8592
&#948 &#8593
&#949 &#8594
&#950 &#8595
Anexa 3. Caractere HTML 379

&#951 &#8596
&#952 &#8706
&#953 &#8719
&#954 &#8721
&#955 &#8722
&#956 &#8730
&#957 &#8734
&#958 &#8745
&#959 &#8747
&#960 &#8776
&#961 &#8800
&#962 &#8801
&#963 &#8804
&#964 &#8805
&#965 &#9674
&#966 &#9824
&#967 &#9827
&#968 &#9829
&#969 &#9830
&#8226

A3.3. Semne speciale

&#34 " &#8211


&#38 & &#8212
&#60 < &#8216
&#62 > &#8217
&#338 &#8218
&#339 &#8220
&#352 &#8221
&#353 &#8222
&#376 &#8224
&#710 &#8225
&#732 &#8240
&#8204 &#8249
&#8205 &#8250
&#8206 &#8364
&#8207
Indicaii / Rspunsuri
Partea I. Baze de date
1.1.
Barem de corectare i notare pentru testul 1:
Rspunsurile corecte sunt: 1-b, 2-c, 3-b, 4-d, 5-b, 6-c
6 x 1.5 = 9p
Oficiu 1p
Total 10 p
Barem de notare pentru testul 2:
1. 3 x 0,2 = 0,6 p
2. 8 relaii x 0,30 p = 2,4 p (0,15 puncte pentru cardinalitatea relaiei i 0,15
puncte pentru opionalitate)
3. 2 x 2 p = 4 p (pentru fiecare relaie se acord 4x0,15p=0,60 p; pentru
opionalitatea relaiilor, 4x0,15p=0.60 p pentru cardinalitatea relaiilor, 0,3 p
pentru alegerea entitii de intersecie, 0,3 p pentru atributele entitii de
intersecie, 0,2 p pentru UID).
4. 2 x 0.5 = 1 p
Oficiu 2p
Total 10 p

1.3.
Barem de corectare i notare pentru testul de autoevaluare:
Rspunsurile corecte sunt:
1-c, 2-b, 3-b, 4-a.
Rspunsul corect pentru punctul 5
este prezentat n figura alturat:
Se acord:
1.5 p x 4 (pentru ntrebrile 1, 2, 3, 4)
2 p (pentru ntrebarea 5)
Oficiu 2 p
Total 10 p
Indicaii / Rezolvri 381

Partea a II-a. Programare WEB

Capitolul 2.
Rezolvrile problemelor propuse:
1.
1.1.
SELECT nume_m FROM materiale
WHERE depozit=Depozit 2;
1.2.
SELECT depozit FROM materiale
WHERE nume_m LIKE %Material 3%;
1.3.
SELECT SUM(cantitate*pret_u)
AS valoare_totsla_materiale
FROM materiale;
1.4.
SELECT depozit,
SUM(cantitate*pret_u)
AS valoare_totala FROM
materiale GROUP BY depozit;
1.5.
UPDATE materiale
SET pret_u=1.1 pret_u
WHERE nume_m=material 1;
1.6.
DELETE from materiale
WHERE nume_m=material 3;
2.
2.1.
SELECT nume FROM imprumuturi
WHERE nume LIKE %Banca 1%;
2.2.
SELECT banca, SUM(suma) AS suma_imprumutata FROM imprumuturi
GROUP BY banca;
2.3.
SELECT nume, COUNT(suma) AS nr_imprumuturi FROM imprumuturi
GROUP BY nume;
2.4. Pentru simplitate, descompunem problema n mai multe subprobleme. Ideea
este de a crea un tabel de manevr, s-l numim pers, care s rein pentru
fiecare persoan totalul sumei pe care a mprumutat-o.

a) Crem tabelul de manevr pers:


382 Manual de Informatic pentru clasa a XII-a

CREATE TABLE pers AS


SELECT nume, SUM(suma) AS suma_imprumutata
FROM imprumuturi GROUP BY nume;
b) Selectm rspunsul la problem, pornind de la tabelul pers:
SELECT nume, suma_imprumutata AS suma_maxima FROM pers
WHERE suma_imprumutata=(SELECT MAX(suma_imprumutata) FROM
pers);
c) ntruct nu mai este necesar, tabelul de manevr pers este ters.
DROP TABLE pers;
2.5.
a) Rezolvare cu subinterogare:
SELECT DISTINCT nume FROM imprumuturi
WHERE banca IN
(SELECT banca FROM imprumuturi WHERE nume=Ionescu Grigore);
b) Rezolvare utiliznd mecanismul auto-uniunii:
SELECT DISTINCT B.nume
FROM imprumuturi AS A INNER JOIN imprumuturi AS B
ON A.banca=B.banca AND A.nume=Ionescu Grigore;
3.
3.1.
SELECT nume,
COUNT(tip_p) AS nr_proprietati
FROM proprietari, proprietati
WHERE cod=cod_proprietar
GROUP BY cod_proprietar;
3.2
SELECT nume FROM proprietari
WHERE cod NOT IN
(SELECT cod_proprietar FROM proprietati)
3.3.
SELECT cod_proprietar FROM proprietati
WHERE cod_proprietar NOT IN
(SELECT cod FROM proprietari);

3.4.
SELECT nume, SUM(valoare) AS valoare_proprietati
FROM proprietari, proprietati
WHERE cod=cod_proprietar
GROUP BY cod_proprietar
ORDER BY valoare_proprietati DESC;
4
4.1.
SELECT B.nume FROM
baieti AS A, fete AS B, prieteni AS L
Indicaii / Rezolvri 383

WHERE
A.nume=mihai AND
A.varsta=18 AND
A.cod=L.cod_b AND
L.cod_f=B.cod;
4.2.
SELECT nume FROM fete
WHERE
cod NOT IN (SELECT cod_f FROM prieteni);
4.3.
SELECT nume,
COUNT(cod_f) AS nr_prietene
FROM baieti, prieteni
WHERE cod=cod_b
GROUP BY cod_b;
4.4.
SELECT nume, COUNT(cod_b) AS nr_prieteni
FROM fete,prieteni
WHERE cod=cod_f
GROUP BY cod_f
ORDER BY nr_prieteni DESC
LIMIT 1;
4.5.
SELECT AVG(A.varsta) AS medie_varsta_baieti,
AVG (B.varsta) AS medie_varsta_fete
FROM baieti AS A, fete AS B;

Capitolul 3.
Rspunsurile la testele recapitulative:
1. 1-c, 2-d, 3-b, 4-a; 2. 1-b, 2-a; 3. 1-a, 2-b.

Capitolul 5.
Rezolvrile problemelor propuse:
1. a) F, b) A, c) A, d) A. 3.b).
6. Fiierul PHP care afieaz formularul este:
<HTML><HEAD></HEAD>
<BODY>
<FORM action="http://localhost/testare.php" method="post">
Introduceti valoarea <BR>
<INPUT type="text" name="valoarea"><BR>
<INPUT type="submit" value="GO">
</FORM></BODY></HTML>
384 Manual de Informatic pentru clasa a XII-a

Script-ul este dat mai jos. Observai utilizarea lui require_once() care include n
corpul script-ului fiierul care conine formularul:
<?
$v=$_POST["valoarea"];
if ($v>=1 && $v<=10 )
echo "OK";
else
{echo "Data introdusa este eronata";
require_once( "test_er.php");}
?>
9.
<FORM action="http://localhost/testare.php" method="post">
a11<INPUT type="text" name="a11"><BR>
a12<INPUT type="text" name="a12"><BR>
a21<INPUT type="text" name="a21"><BR>
a22<INPUT type="text" name="a22"><BR>
<INPUT type="submit" value="GO">
</FORM>
<?
$a11=$_POST["a11"]; $a12=$_POST["a12"];
$a21=$_POST["a21"]; $a22=$_POST["a22"];
echo "<TABLE border=5>";
echo " <TR> <TD> $a11 </TD><TD> $a12 </TD></TR>";
echo " <TR> <TD> $a21 </TD><TD> $a22 </TD></TR>";
echo "</TABLE>";
?>

Partea a III-a. Programare orientat pe obiecte i programare


vizual n Java

Capitolul 7.
Rezolvrile problemelor propuse:
1. a) 2. c) 3. c) o constant real care nu se termin cu f, este considerat
automat ca fiind de tipul double. Prin urmare, este apelat automat metoda cu
parametru de tip double. 4. d) Clasa este nzestrat cu doi constructori
(suprancrcai). Este apelat constructorul cu un singur parametru. Data membru a
este iniializat implicit cu 0. 27. b). 28. a). 29. d). 30. c).

Capitolul 8.
Rezolvrile problemelor propuse:
1. 1-c, 2-a, 3-b. 2. 1-e, 2-b, 3-g, 4-a, 5-d, 6-c, 7-f