Manual de
L&S Info-mat
Copyright 2007-2016 L&S INFO-MAT
Refeni tiinifici:
Prof. Gradul I Carmen Minc, Colegiul Naional Sf. Sava", Bucureti
Prof .Gradul I, Enciu Magdalena, Colegiul Naional Octav Onicescu, Bucureti
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
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.
Cea mai realist variant a relaiei dintre JUCTOR i ECHIP este aadar:
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
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
5. Care dintre urmtoarele fraze pot fi citite din schema de mai jos?
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?
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
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
http://www.acm.org/classics/nov95/toc.html
Capitolul 1. Proiectarea bazelor de date 23
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:
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.
Figura 1.27.
Entitatea propus
Figura 1.28.
Schema propus
28 Manual de Informatic pentru clasa a XII-a
Modelul tabelar toate datele sunt memorate sub forma unui singur
tabel, un tablou bidimensional de date.
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.
atributul coloana
instana linia
Figura 1.31. Maparea entitilor
titlu Pk *
autor Pk *
data_apariiei *
format *
nr_pagini *
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:
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
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.
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
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
Adaug puin umor prezentrii tale, dac acest lucru este posibil.
Pstreaz treaz interesul auditorului pe parcursul ntregii prezentri.
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.
prezentate aici!
Capitolul 2. Limbajul MySQL 49
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]
);
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 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
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
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.
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].
Tip Descriere
FLOAT Ocup 4 octei.
DOUBLE Ocup 8 octei.
56 Manual de Informatic pentru clasa a XII-a
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
Operatorii se mpart, aa cum suntem deja obinuii din alte limbaje de programare,
n mai multe grupe. Acestea sunt prezentate n continuare.
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
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.
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;
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
Operatorii IS NULL, IS NOT NULL testeaz dac o valoare este sau nu NULL
(sunt singurii operatori prin care se testeaz acest lucru)!
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.
CASE v
WHEN v1 THEN val1
[WHEN v2 THEN val2]
...
[WHEN vn THEN valn]
[ELSE valn+1]
END
CASE 2
WHEN 1 THEN unu
WHEN 2 THEN doi
WHEN 3 THEN trei
ELSE alta valoare
END;
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
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.
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.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.
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
Exemplul 2.19. Se consider tabelul din Fig. 2.10, numit pers, care cuprinde
numele i data naterii pentru dou persoane:
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.
Figura 2.19.
Tabelul propus
Dac oraul de domiciliu nu este cunoscut, se prefer, n locul valorii NULL, s fie
afiat irul necunoscut:
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.
Exemplul 2.27. Presupunem c tabelul principal are drept cheie primar cmpul
"Nume":
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,...)
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
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.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.30.
Exemplu de filtrare
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.
B2) Pentru tergerea unei coloane, chiar dac conine date, se utilizeaz
instruciunea:
ALTER TABLE nume_tabel
DROP COLUMN nume_coloana
Exemplul 2.38. Fie tabelele de mai jos, ambele cu aceleai coloane, de acelai tip:
UPDATE prs
SET oras=braila
WHERE nume IN (ioana, florin); Figura 2.34. Tabelul actualizat
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
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);
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.
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
Figura 2.48.
Rezultatul obinut
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
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;
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;
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".
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
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);
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
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.
Figura 2.63.
Tabelul materiale
Figura 2.64.
Tabelul imprumuturi
Ce este Internet-ul ?
Protocolul TCP / IP
Ce trebuie s tim despre site-uri ?
Un program FTP
Cum scriem un fiier HTML?
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.
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.
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:
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.
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
Server
Cerere Rspuns
Rspuns
Cerere
Cerere Rspuns
Client 3
Client 1
Client 2
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.
Termenul descrie accesul gratuit la codul surs al unui produs software, care este
1
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.
Figura 3.2.
Fereastra de introducere a
datelor de identificare
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.
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.
Observaii
Procednd astfel, putem scrie uor cod HTML. Din cnd n cnd, vizualizm
efectul modificrilor i identificm eventualele erori.
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?
<!-- Un comentariu
pe mai multe linii -->
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.
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...
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.
Mai jos, putei observa o pagin aa cum este scris n Notepad i aa cum
este afiat de browser-ul Internet Explorer:
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
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.
<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:
.Stil {font-size:20pt;
color:red;
background:yellow;
font-style:italic;
width=3cm;
height:4 cm;}
<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>
<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
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>.
Dac dou cuvinte ale unui paragraf sunt separate prin mai multe spaii,
browser-ul afieaz doar un singur spaiu.
Elementul  
Mrimea difer: pentru <H1> titlul este scris utiliznd font-ul de dimensiune
maxim, iar pentru <H6> dimensiunea este minim.
Atenie !
normal italic
normal small-caps
C) font-weight poate lua valorile:
normal bold
100 900
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
Limbajul CSS permite stilizarea la nivel de text prin intermediul unor atribute
care sunt detaliate n cele ce urmeaz.
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>
left right
center justify
Exemplul 4.22. Pentru a obine indentarea din figura alturat, am folosit stilul de
mai jos:
P {text-indent:1cm;}
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>
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.
Pentru a forma astfel de liste, avem nevoie de cteva elemente HTML care
vor fi detaliate n cele ce urmeaz.
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
B. risca II. risca
C. ajunge III. ajunge
<OL tyle="A"> <OL tyle="I">
Capitolul 4 HTML, CSS - primele noiuni 119
Elementul UL are atributul type. Valorile pe care le poate lua acest atribut,
precum i modul n care arat lista se observ n continuare:
Observaii !
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
Coninut
estur (padding)
Bordur (border)
Margine (margin)
Observaii !
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).
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
P {font-size:40pt;
color:RGB(12,56,23);}
body {background-repeat:fixed;}
body {background-repeat:scroll;}
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;}
Observaie ! Pentru grosimea bordurii se mai pot folosi valorile: thin (subire),
medium (medie) sau thick (groas).
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>.
Figura 4.35
Figura 4.36. Exemplu de pagin
care conine o imagine
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.
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
Observaii !
<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
Figura 4.43.
Exemplu de tabel
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:
frame - definete prile care vor fi trasate din chenarul care nconjoar
tabelul. Atributul poate lua valorile:
<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
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>
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>.
Elementul CAPTION are atributul align. Cele patru valori pe care le poate
lua i efectul lor, le putei observa mai jos:
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.
<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. 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
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.
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>
Termenul este o traducere a celui din limba englez, hyperlink. Din comoditate, este
1
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>
Exemple:
Exemple:
<A href="#top"> in top </A> <BR> (salt n partea de sus a documentului).
Exemplul 4.52. Un alt fiier HTML conine o ancor ctre fiierul anterior (numit
lung.html):
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.
Exemplul 4.53. Pentru a obine acest efect, pentru atributul href se va completa
mailto, urmat de : i de adresa de e-mail:
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
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>
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:
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
x2,y2
xn,yn
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.
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
Observaii !
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.
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">
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">
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.
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).
Observaie ! n exemplul dat iniial, fereastra este mprit n dou linii. Apoi, a
doua linie este mprit n trei coloane.
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%"> Avem 2 linii. Prima linie ocup 30% din
nlimea ferestrei, iar a doua, 70%.
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:
<FRAME src="c:/test.html">
Sus i jos marginea este de 100 pixeli, iar n stnga i dreapta este
de 150 pixeli:
? 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.
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>
<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.
<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>
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
<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.
<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>
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)
<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
<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>
<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>
Exemplul 4.70. Pentru semne speciale (se pot lsa mai multe spaii ntre cuvinte):
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:
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.
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.
Figura 4.90.
Pagina propus
166 Manual de Informatic pentru clasa a XII-a
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:
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.
Posibile teme:
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
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.
<?php
...
?>
<?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
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>
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".
<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>
<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
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
5.5.1. Constante
5.5.2. Variabile
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:
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);
?>
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;
<?php
$x=1;
$y=-2;
$z="un sir";
$x=$y=$z;
echo ($x);
?>
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.2. Instruciunea IF
if (expresie) instructiune1
else 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
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.
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));
?>
<?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...
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...
Multe dintre funciile prezentate le-ai ntlnit dac ai studiat limbajul C/C++.
Tabelul urmtor le prezint succint:
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.
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";
?>
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.
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.
Figura 5.19.
Figura 5.20.
Figura 5.21.
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).
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
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
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().
<?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();
?>
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.
<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>
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.
5.14. Aplicaii
Figura 5.28.
Pagina principal
204 Manual de Informatic pentru clasa a XII-a
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";
?>
<?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");
<HTML>
<BODY>
<H1> pagina ce ar trebui afisata
</BODY>
</HTML>
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:
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):
<?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;
?>
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.
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.).
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();
?>
<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();
?>
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>";
?>
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
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!
n acest capitol vom nva s scriem programe n limbajul Java. Mai jos
sunt prezentate principalele noiuni pe care le vei studia:
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
Totui, programele pe care le vom putea realiza dup studiul acestui capitol nu vor utiliza
1
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
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.
class prima {
public static void main(String[] args) {
System.out.println("Acesta este primul program Java");}
}
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
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
6.5. Comentarii
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.
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]
b) Tipuri reale
Observaie ! Pentru tipul real float, literalii trebuie urmai n mod obligatoriu de
litera f. Excepie fac literalii care reprezint valori ntregi.
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);
Caracter Semnificaie
\\ backslash
\n newline
\' apostrof
\ ghilimele
\r carriage return
\t tab
\f salt la pagin nou
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.8. Operatori
n acest paragraf vor fi prezentai operatorii utilizai n Java.
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.
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).
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
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).
Exist trei tipuri de operatori logici care acioneaz asupra datelor de tip
boolean:
! negare logic;
&& i logic;
|| sau logic.
Operatorul sau logic (binar) acioneaz astfel: dac cel puin unul din
operanzi este true, rezultatul este true, altfel rezultatul este false.
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).
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
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.
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: *=, /=, %=, +=, -=, <<=,
>>=, &>, ^=, |=.
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.
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).
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.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);
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
Instruciunea nu face nimic, dar are sens n programul Java, dup cum va
rezulta din studiul altor instruciuni. Instruciunea vid se marcheaz prin ;.
Exemplul 6.30. Mai jos, putei observa o instruciune compus care subordoneaz
mai multe instruciuni vide.
{
;
;
;
}
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
Forma 1.
if (expresie de tip boolean) instruciune1 else instruciune2
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
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");
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);
Observaie ! Secvena se execut cel puin o dat, dup care se pune problema
dac s se repete sau nu (prin evaluarea expresiei logice).
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).
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.
6.10. Masive
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.
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]);
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];
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]);
V 1 2 3 4
0 1 2 3
V1 9 9 9
0 1 2
Figura 6.7. Pasul nti
V 1 2 3 4
0 1 2 3
V1 9 9 9
0 1 2
Man
V 1 2 3 4
0 1 2 3
V1 9 9 9
0 1 2
Man
V 1 2 3 4
0 1 2 3
V1 9 9 9
0 1 2
Figura 6.10. Ultimul pas
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
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
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.
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.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
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
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); }
}
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.
S analizm programul:
clasa Complex:
Foarte important !
z
Figura 7.1. x y
256 Manual de Informatic pentru clasa a XII-a
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();
}
}
De reinut !
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
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.
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;}
class Complex {
double x,y;
Complex (double x)
{ this.x=x; }
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
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;
}
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().
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++.
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:
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; }
}
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
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
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.
7.8.2.3. Subiruri
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","***" ));
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
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);
}
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");
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");
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.
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();
}
}
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
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();
}
}
7.10. Polimorfism
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.
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);
}
}
class Muncitor
{ int ore_lucrate;
Muncitor(int ore_lucrate)
{ this.ore_lucrate=ore_lucrate; }
double salariu()
{ return ore_lucrate * 2; }
}
Observaii !
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
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();
}
}
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:
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(); }
}
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
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).
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
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 {}
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.
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"); }
}
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
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) {}
}
}
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
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.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()); }
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]+" "); }
}
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);
}
}
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(); }
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
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.
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.
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.
Pentru a nelege conceptele care stau la baza programrii vizuale vom porni
de la un exemplu arhicunoscut n programarea clasic.
//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
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);
}
}
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.
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Doua butoane"); }
}
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.
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.
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);
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");
}
}
De reinut !
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
Figura 8.9.
GridLayout(3,3)
Figura 8.10.
GridLayout(3,3,5,8)
De reinut !
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.
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);
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
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");
}
}
import java.awt.*;
import java.awt.event.*; Figura 8.23.
import javax.swing.*; Fereastra programului
332 Manual de Informatic pentru clasa a XII-a
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
3.2.7. Meniuri
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"); }
}
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));
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
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Fereastra din care pot introduce textul");}
}
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
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
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!
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).
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");
}
}
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:
Observaii !
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Imagine"); }
}
drawLine(int x1, int y1, int x2, int y2) - deseneaz o linie
(segment) ntre punctele de coordonate (x1,y1) i (x2,y2).
90
180 0
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
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.
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();
}
}
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();
}
}
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
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.
// 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
ntrebare. Care este modalitatea prin care putem afia elegant rezultatele
interogrii unei baze de date?
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...
Figura 8.45.
Fereastra propus
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
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).
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.
20. Realizai un scurt referat despre tipul de aplicaie Java numit applet.
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.
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.
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.
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
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.
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.
Fii tu nsui !
Fii cinstit !
Fii pozitiv !
ANEXA 3
Caractere HTML
¡ ¿
¢ À
£ Á
¤ Â
¥ Ã
¦ Ä
§ Å
¨ Æ
© Ç
ª È
« É
¬ Ê
­ desprire n silabe Ë
® Ì
¯ Í
° Î
± Ï
² Ð
³ Ñ
´ Ò
µ Ó
¶ Ô
· Õ
¸ Ö
¹ ×
º Ø
» Ù
¼ Ú
½ Û
378 Manual de Informatic pentru clasa a XII-a
¾ Ü
Ý î
Þ ï
ß ð
à ñ
á ò
â ó
ã ô
ä õ
å ö
æ ÷
ç ø
è ù
é ú
ê û
ë ü
ì ý
í þ
  spaiu incorporat ÿ
Ă ~ ă `
Ş { ş [
Ţ } ţ ]
Α Λ
Β Μ
Γ Ν
Δ Ξ
Ε Ο
Ζ Π
Η Ρ
Θ Σ
Ι Τ
Κ Υ
Φ …
Χ ′
Ψ ″
Ω ‾
α ⁄
β ™
γ ←
δ ↑
ε →
ζ ↓
Anexa 3. Caractere HTML 379
η ↔
θ ∂
ι ∏
κ ∑
λ −
μ √
ν ∞
ξ ∩
ο ∫
π ≈
ρ ≠
ς ≡
σ ≤
τ ≥
υ ◊
φ ♠
χ ♣
ψ ♥
ω ♦
•
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
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.
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>";
?>
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