Sunteți pe pagina 1din 15

C9 Utilizare tablourilor n VB NET

1) Ce este un tablou n VB.NET prin ce se caracterizeaz? -o variabil de memorie ce conine o list (o mulime) de elemente de acelai tip, stocate n zone contiguie de memorie; Un tablou se caracterizeaz prin: -nume (numele variabilei) -rang/dimensiune (numrul de dimensiuni/ indeci): unidimensional ( inde!), bidimensional (" indeci); tridimensional (# indeci), etc$ %entru &iecare dimensiune tabloul va avea alocat un inde!$ 'nde!ul pentru &iecare dimensiune are o valoare de nceput/limita in&erioar (n ()$*+, -) i o limit superioar (egal cu numrul de valori ale unei dimensiuni - ) -capacitate (numrul de elemente care pot &i memorate/nregistrate) n tablou), care de&inete numrul ma!im de elemente care pot &i memorate$ +!emplu capacitatea tabloului tridimensional VanzariJudetMagazinLuna(39,15,11) care va memora v.nzrile unei &irme pentru /- de 0udee, ma!im 1 magazine n 0ude pe luni ( ") va &i: /- ! 1 ! " 2 3$14- celule (sau elemente) -tipul/natura elementului memorat (toate elementele sunt de acelai tip) 2) Cum se define te un tablou? 56cces7 nume,ablou(5list'ndeci7) 6s tip8ata Unde: -acces: de&inete nivelul de acces i poate &i 8im, %ublic, %rotected, 9riend, %rivate, %rotected9riend -tip8ata: de&inete natura datelor memorate i poate &i dat de tip primitiv sau obiect (toate datele sunt de aceelai tip) - list'ndeci: conine valorile ma!ime ale indecilori pentru &iecare dimensiune$ :a de&inire lista poate lipsi dar este obligatorie nainte de

utilizare$ 8ac la de&inire lista lipsete, n () se considera c tabloul este de&init dinamic (adic) putea &i redimensionat dup necesiti$ 'n ()$*+, toate tablourile sunt dinamice, pot &i redimensionate$ +!emplu:

!) Cum se acceseaz n "eneral elementele unui tablou? -cu a0utorul indecilor 6st&el &iind dat tabloul Dim NumeStudenti (99) As String - pentru a ncrca (memora date) n celula - (care care inde!ul ;) o valoare (obiectul un<tudent de tip <tudent) vom avea: NumeStudenti(9)=unStudent (practic tabloul cu inde!ul adecvat apare n partea st.ng a unei operatii de atribuire) -pentru a citi (a valori&ica) in&ormaia din celula = (inde! /) vom avea: StudentCautat= NumeStudent(14) (practic tabloul cu inde!ul adecvat apare n partea dreapt a unei operatii de atribuire)

#) Cum se acceseaz o metod sau o proprietate a unui obiect memorat ntr$un tablou? -tot cu a0utorul indecilor, dar numele tabloului mpreun cu incii adecvai vor cali&ica numele proprietii sau metodei +!emplu: 9ie clasa +!amen cu urmtoarea structur:

Unde: m>8isciplina este de tip <tring; m>8ata+!amen este de tip 8ate; m>*ota este de tip 'nteger$ 'ar pentru atributele: m>8isciplina , m>8ata+!amen, m>*ota vor &i implementate i proprietile corespunztoare: disciplina , data+!amen, nota$ %entru tabloul +!amene care conine ca elemente obiecte instaniate din clasa +!amen ( tablou cu o dimensiune i care poate conine ma!im e!amene), vom avea: a) 8e&inirea clasei +!amen:
Public Class Examen Private m_Disciplina As String Private m_DataExamen As Date Private m_Nota As Integer Public Property disciplina() As String et !eturn m_Disciplina End et Set("y#al value As String) m_Disciplina $ value End Set End Property Public Property dataExamen() As Date et !eturn m_DataExamen End et

Set("y#al value As m_DataExamen $ End Set End Property Public Property nota() et !eturn m_Nota End et Set("y#al value As m_Nota $ value End Set End Property End Class

Date) value As Integer

Integer)

b) 8e&inirea tabloului +!amene


Public Class %orm& Dim Examene(') As Examen End Class

c) ?ncarc elementul # (inde! ")


Private Sub "utton&_Clic(("y#al sender As )b*ect+ "y#al e As System,EventArgs) -andles "utton&,Clic( .De/inesc un obiect Dim unExamen As Ne0 Examen .Incarc obiectul in celula 1 Examene(1) $ unExamen .Incarc proprietatile obiectului Examene(1),disciplina $ Input"ox(23asatai disciplina2) Examene(1),dataExamen $ Input"ox(23astati data2) Examene(1),nota $ Input"ox(23asatati nota2) End Sub

%ractic proprietatea care urmeaz s &ie ncrcat n tablou, apare n partea st.ng a unei operaii de atribuire, &iind cali&icat (precedat de numele tabloului cu inde!ul " i punct: Examene(1), ) d) :istez elementul # (inde! ")
Private Sub "utton1_Clic(("y#al sender As )b*ect+ "y#al e As System,EventArgs) -andles "utton1,Clic( .De/inesc variabila pentru mesa* Dim s As String s $ 22 .#eri/ic daca in celula am memorat un obiect I/ IsNot4ing(Examene(1)) 34en .daca nu am memorat un obiect 5sg"ox(2In celula ,,, nu avem nimic incarcat2) Else .construiesc mesa*ul daca am memorat un obiect s $ Examene(1),disciplina 6 2 2 6 Examene(1),dataExamen 6 2 2 6 Examene(1),nota

End I/ .A/ise7 mesa*ul (continutul celulei 8 9 index 1) 5sg"ox(s) End Sub

%ractic proprietatea care urmeaz s &ie citit (e!tras) din tablou, apare n partea dreapt a unei operaii de atribuire, &iind cali&icat (precedat de numele tabloului cu inde!ul " i punct: Examene(1), ) %) Cum se redimensioneaz &se define te dinamic) un tablou? -cu a0utorul comenzii @edim$ %ractic se creeaz un nou tablou cu un numr nou de elemente$ ?n mod implicit prin redimensionare se pierd datele coninute de tabloul iniial$ Au @edim putem &i!a numrul iniial de dimensiuni dac acestea nu au &ost &i!ate la de&inirea iniial, dup care nu mai pot &i modi&icate$ 'n mod normal prin @edim se modi&ic doar limitele superioare ale dimensiunilor$ ') Care este sinta(a instruc)iunii *edim? @edim 5%reserve7 nume,ablou(list'ndeci) Unde: -%reserve \pri-zBrv\: este o clauz opional prin a crui prezen se asigur copierea elementelor e!istente n noul tablou$ 8atele din vecCiul tabel sunt pstrate - list'ndeci: conine noii indeci, limita superioar, pentru &iecare dimensiune, a &iecrui nou inde! +!emplu: -redimensionarea vectorului +!amene cu pierderea datelor @edim +!amene ( /) -redimensionarea vectorului +!amene cu pstrarea datelor @edim %reserve +!amene ("-)

+) Care este clasa din care deri, tablourile? -clasa 6rraD$ %ractic orice tablou este un obiect de tip 6rraD -) Care sunt cele mai importante propriet)i i metode ale clasei .rra/

a) r!"riet#$i%e &%asei Arra' sunt( $:engtC: returneaz numrul total de elemente coninute de tablou (n cazul nostru, pentru vectorul +!amene, - elemente; n cazul (anzariEudetFagazin:una(#;, =, ), /- ! 1 ! " 2 3$14- elemente) $@anG: returneaz numrul de dimensiuni ale tabloului, minim nostru, pentru vectorul +!amene, ; n cazul (anzariEudetFagazin:una(#;, =, ), #) )) rin&i"a%e%e met!de de instan$# a%e &%asei Arra' sunt( $Het:engtC(dimensiune 6s 'nteger):returneaz numrul de elemente ale dimensiunii precizate $Het:oIer)ound(dimensiune 6s 'nteger): returneaz valoarea limitei in&erioare a inde!ului pentru dimensiunea precizat (pentru tablourile ()$*+, -) $HetUpper)ound(dimensiune 6s 'nteger): returneaz valoarea limitei superioare a inde!ului pentru dimensiunea precizat &) rin&i"a%e%e met!de ti" &%as# ("arta*ate) a%e &%asei Arra' sunt( (n cazul

6rraD$<ort(nume,ablou): sorteaz cresctor elementele tabloului precizat (tabloul trebuie s aib doar o dimensiune - vector) 6rraD$@everse(nume,ablou): inverseaz elementele tabloului precizat (tabloul trebuie s aib doar o dimensiune - vector) 10) Cum se parcur"e un ,ector? -cu a0utorul structurii +!r inde, - Ne,t inde, pentru &iecare dimensiune$ 8up sinta!a:
%or index As Integer $ : 3o Nume3abblou, et;pper"ound(dimensiune)

J
Next index

+!emplu: %entru tabloul Fatrice(", #) cu valorile de tip <tring: Aoloan Aoloan :inie :inie '2-) (inde!: , ", #, ," "," #," ,# ",# #,# ,/ ",/ #,/ (inde!: 02-) Aoloan " (inde!: 02 ) Aoloan # (inde!: 02") Aoloan / (inde!: 02#)

:inie " (inde!: '2 ) :inie # (inde!: '2 ") (om avea:

Private Sub "utton8_Clic(("y#al sender As )b*ect+ "y#al e As System,EventArgs) -andles "utton8,Clic( .De/inire tablou Dim 5atrice(1+ 8) As String . o matrice cu 8 linii si < coloane .a) incarcare date .parcurg linia %or i As Integer $ : 3o 5atrice, et;pper"ound(:) .parcurg coloana %or * As Integer $ : 3o 5atrice, et;pper"ound(&) .de/inesc un element Dim unElement As String unElement $ 22 .construiesc valoarea elementului de linie i=& si coloana *=& unElement $ CStr(i = &) 6 2+2 6 CStr(* = &) .adaug elementul in linia i si coloana * 5atrice(i+ *) $ unElement Next * Next i .b) #i7uali7are continut vector .parcurg linia %or i As Integer $ : 3o 5atrice, et;pper"ound(:) .parcurg coloana %or * As Integer $ : 3o 5atrice, et;pper"ound(&) .a/isea7a valoarea din linia i si coloana * 5sg"ox(5atrice(i+ *)) Next * Next i

End Sub

11) Cum poate fi utilizat metoda 1inalize i care este ordinea de distru"ere a obiectelor? -dup cum tim garbage collector (gc), atunci c.nd elimin un obiect din memorie, ncearc s apeleze metoda 9inalize -metoda 9inalize nu poate &i apelat n mod e!pres pentru un obiect prin program (apelul l poate realiza doar gc) %entru a evidenia at.t modul (ordinea de distrugere) a obiectelor din memorie c.t i utilizarea metodei 9inalize vom de&ini clasa +cCipa8e9otbal cu structura:

Public Class Ec4ipaDe%odbal Public m_NumeClub As String Public Property numeClub() As String et !eturn m_NumeClub End et Set("y#al value As String) m_NumeClub $ value End Set End Property Protected )verrides Sub %inali7e() 5sg"ox(2A /ost eliminata ec4ipa> 2 6 m_NumeClub) End Sub End Class

i vectorul Aupa( =) care va conine ecCipele care vor 0uca n optimi care va &i redimensionat Aupa(3) pentru ecCipele care vor 0uca n s&erturi$ (om avea:
Public Class %orm& .De/inesc vectorul Dim Cupa(&?) As Ec4ipaDe%odbal

Private Sub btnIncarc&@_Clic(("y#al sender As )b*ect+ "y#al e As System,EventArgs) -andles btnIncarc&@,Clic( .Incarc cele &@ ec4ipe (in ordinea cali/icarii) %or i As Integer $ : 3o Cupa, et;pper"ound(:) .De/inesc un obiect Dim oEc4ipa As Ne0 Ec4ipaDe%odbal .Incarc datele in obiect oEc4ipa,numeClub $ Input"ox(23astati numele clubului2) .Adaug obiectul in vector Cupa(i) $ oEc4ipa Next .A/ise7 ec4ipele incarcate %or i As Integer $ : 3o Cupa, et;pper"ound(:) 5sg"ox(Cupa(i),numeClub) Next End Sub Private Sub btn!amanA_Clic(("y#al sender As )b*ect+ "y#al e As System,EventArgs) -andles btn!amnA,Clic( .!edimensione7 vectorul !eDim Preserve Cupa(B) .%ortam lansarea curatatorului de gunoaie C,Collect() End Sub End Class

8e &iecare dat, dup lansarea n e!ecuie, la evenimentul btn!amanA_Clic( vom avea o ordine aleatoare i di&erir a celor 4 ecCipe (obiecte) care vor &i distruse$ 12) Cum putem defini o clas care are un atribut de tip multi,aloare &de tip Tablou sau colec)ie)? %entru a clari&ica aceast nou cerin vom proceda ast&el: - ierarCia de clase:

Unde: -clasa %ersoana este abstract -clasele 6nga0at i Aopil sunt clase concrete i sunt derivate din clasa %ersoana (6nga0at este o %ersoana; Aopil este o %ersoana) -atributele m>Anp, m>*ume%renume, m><e!, m>8epartament, m>*ume,ata i m>*umeFama sunt de tip <tring (m><e! poate lua doar valorile F K masculin, 9-&eminin); m>8ata*asterii este de tip 8ate; m><alariu*egociat este de tip 'nteger; m2Copii este de tip tablou3 o celul fiind de tipul Copil -pentru atributele m>Anp, m>*ume%renume, m><e!, m>8epartament, m>*ume,ata i m>*umeFama vor &i de&inite proprietile a&erente: cnp, nume%renume, se!, departament, nume,ata i numeFama -metodele: Adaug.nC!"i%() permite adugarea la s&.rit a unui element n tablou Aopii; Cites&.nC!"i%() permite citirea unui element de inde! precizat

din tabloul Aopii; AreC!"ii() este o &uncie logic care va returna valoarea ,rue dac n atributil m>Aopii de tip tabel am introdus un obiect de tip copil i 9alse n caz contrar; Cites&LimitaSu"eri!ara() returneaz limita superioar a inde!ului vectorului m>Aopii pentru anga0aii cu copii (pentru care am adaugat cel puin un copil) a) 8e&inirea claselor presupune:
.De/inirea clasei Persoana Public 5ustIn4erit Class Persoana .De/inirea atributelor Private m_Cnp As String Private m_NumePrenume As String Private m_DataNasterii As Date Private m_Sex As String .De/inirea proprietatilor Public Property cnp() As String et !eturn m_Cnp End et Set("y#al value As String) m_Cnp $ value End Set End Property Public Property numePrenume() As String et !eturn m_NumePrenume End et Set("y#al value As String) m_NumePrenume $ value End Set End Property Public Property dataNasterii() As Date et !eturn m_DataNasterii End et Set("y#al value As Date) m_DataNasterii $ value End Set End Property Public Property sex() As String et !eturn m_Sex End et .!eguli de validare Set("y#al value As String) I/ value $ 252 )r value $ 2%2 34en m_Sex $ value Else 5sg"ox(2Sex di/erit de 5 sau %2) m_Sex $ 22

End I/ End Set End Property End Class .De/inirea clasei Copil Public Class Copil .Preci7area clase parinte In4erits Persoana .De/inirea atributelor Private m_Nume3ata As String Private m_Nume5ama As String Public Property nume3ata() As String et !eturn m_Nume3ata End et Set("y#al value As String) m_Nume3ata $ value End Set End Property Public Property nume5ama() As String et !eturn m_Nume5ama End et Set("y#al value As String) m_Nume5ama $ value End Set End Property End Class .De/inirea clasei Anga*at Public Class Anga*at .Preci7area clasei parinte In4erits Persoana .De/inire atribute Private m_Departament As String Private m_SalariuNegociat As Integer .De/inire atribut multivaloare de tip tablou Private m_Copii() As Copil .De/inire proprietati Public Property departament() As String et !eturn m_Departament End et Set("y#al value As String) m_Departament $ value End Set End Property .De/inirea metodelor Public Sub Adaug;nCopil("y#al unCopil As Copil+ "y#al nr As Integer) I/ nr $ & 34en . daca este primul copil !eDim Preserve m_Copii(:) m_Copii(m_Copii, et;pper"ound(:)) $ unCopil Else .daca nu este primul copil !eDim Preserve m_Copii(m_Copii, et;pper"ound(:) = &)

m_Copii(m_Copii, et;pper"ound(:)) $ unCopil End I/ End Sub Public %unction Citesc;nCopil("y#al i As Integer) As Copil I/ AreCopii() 34en .#eri/ic indexul I/ i C$ : And i D$ m_Copii, et;pper"ound(:) 34en !eturn m_Copii(i) Else 5sg"ox(2Copilul de index 2 6 i 6 2nu exista2) !eturn Not4ing End I/ Else 5sg"ox(2Anga*atul nu are copii2) !eturn Not4ing End I/ End %unction Public %unction AreCopii() As "oolean I/ m_Copii,Eengt4 C$ : 34en !eturn 3rue Else !eturn %alse End I/ End %unction Public %unction CitescEimitaSuperioara() As Integer I/ AreCopii() 34en !eturn m_Copii, et;pper"ound(:) Else !eturn 9& End I/ End %unction End Class

b) crearea ncarcarea cu date i listarea unui anga0at


Public Class %orm& .De/inesc obiectul unAnga*at Dim unAnga*at As Ne0 Anga*at Dim nrCopii As Integer Private Sub btn;nAnga*at_Clic(("y#al sender As )b*ect+ "y#al e As System,EventArgs) -andles btn;nAnga*at,Clic( btnAdaug;nCopil,#isible $ %alse Dim raspuns As String .Preluarea date pentru unAnga*at unAnga*at,cnp $ Input"ox(23astati cnp2) unAnga*at,numePrenume $ Input"ox(23asati nume si prenume2) unAnga*at,sex $ Input"ox(23asrati sex2) raspuns $ Input"ox(2Are copii DA sau N;2)

.3este7 daca are copii I/ raspuns,3o;pper $ 2DA2 34en btnAdaug;nCopil,#isible $ 3rue nrCopii $ : End I/ End Sub Private Sub btnAdaug;nCopil_Clic(("y#al sender As )b*ect+ "y#al e As System,EventArgs) -andles btnAdaug;nCopil,Clic( .Adaug un copil nrCopii $ nrCopii = & Dim unCopil As Ne0 Copil unCopil,numePrenume $ Input"ox(23astati Nume si Prenume Copil2) unCopil,nume3ata $ Input"ox(23astati Nume 3ata2) unAnga*at,Adaug;nCopil(unCopil+ nrCopii) End Sub Private Sub btnEiste7Anga*at_Clic(("y#al sender As )b*ect+ "y#al e As System,EventArgs) -andles btnEiste7Anga*at,Clic( .de/inesc sirul cu numele copiilor Dim s As String Dim unCopil As Copil s $ 22 I/ unAnga*at,AreCopii 34en %or i As Integer $ : 3o unAnga*at,CitescEimitaSuperioara unCopil $ unAnga*at,Citesc;nCopil(i) s $ s 6 unCopil,numePrenume 6 2 2 Next End I/ 5sg"ox(2Anga*atul> 2 6 unAnga*at,numePrenume 6 2 Are copii> 2 6 s) End Sub End Class