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 (1 index), bidimensional (2 indeci); tridimensional (3 indeci), etc. Pentru fiecare dimensiune tabloul va avea alocat un index. Indexul pentru fiecare dimensiune are o valoare de nceput/limita inferioar (n VB.NET 0) i o limit superioar (egal cu numrul de valori ale unei dimensiuni - 1) -capacitate (numrul de elemente care pot fi memorate/nregistrate) n tablou), care definete numrul maxim de elemente care pot fi memorate. Exemplu capacitatea tabloului tridimensional VanzariJudetMagazinLuna(39,15,11) care va memora vnzrile unei firme pentru 40 de judee, maxim 16 magazine n jude pe luni (12) va fi: 40 x 16 x 12 = 7.680 celule (sau elemente) -tipul/natura elementului memorat (toate elementele sunt de acelai tip) 2) Cum se definete un tablou? [Acces] numeTablou([listIndeci]) As tipData Unde: -acces: definete nivelul de acces i poate fi Dim, Public, Protected, Friend, Private, ProtectedFriend -tipData: definete natura datelor memorate i poate fi dat de tip primitiv sau obiect (toate datele sunt de aceelai tip) - listIndeci: conine valorile maxime ale indecilori pentru fiecare dimensiune. La definire lista poate lipsi dar este obligatorie nainte de

utilizare. Dac la definire lista lipsete, n VB se considera c tabloul este definit dinamic (adic) putea fi redimensionat dup necesiti. In VB.NET toate tablourile sunt dinamice, pot fi redimensionate. Exemplu:

3) Cum se acceseaz n general elementele unui tablou? -cu ajutorul indecilor Astfel fiind dat tabloul Dim NumeStudenti (99) As String - pentru a ncrca (memora date) n celula 10 (care care indexul 9) o valoare (obiectul unStudent de tip Student) vom avea: NumeStudenti(9)=unStudent (practic tabloul cu indexul adecvat apare n partea stng a unei operatii de atribuire) -pentru a citi (a valorifica) informaia din celula 15 (index 14) vom avea: StudentCautat= NumeStudent(14) (practic tabloul cu indexul adecvat apare n partea dreapt a unei operatii de atribuire)

4) Cum se acceseaz o metod sau o proprietate a unui obiect memorat ntr-un tablou? -tot cu ajutorul indecilor, dar numele tabloului mpreun cu incii adecvai vor califica numele proprietii sau metodei Exemplu: Fie clasa Examen cu urmtoarea structur:

Unde: m_Disciplina este de tip String; m_DataExamen este de tip Date; m_Nota este de tip Integer. Iar pentru atributele: m_Disciplina , m_DataExamen, m_Nota vor fi implementate i proprietile corespunztoare: disciplina , dataExamen, nota. Pentru tabloul Examene care conine ca elemente obiecte instaniate din clasa Examen ( tablou cu o dimensiune i care poate conine maxim 10 examene), vom avea: a) Definirea clasei Examen:
Public Class Examen Private m_Disciplina As String Private m_DataExamen As Date Private m_Nota As Integer Public Property disciplina() As String Get Return m_Disciplina End Get Set(ByVal value As String) m_Disciplina = value End Set End Property Public Property dataExamen() As Date Get Return m_DataExamen End Get

Set(ByVal value As m_DataExamen = End Set End Property Public Property nota() Get Return m_Nota End Get Set(ByVal value As m_Nota = value End Set End Property End Class

Date) value As Integer

Integer)

b) Definirea tabloului Examene


Public Class Form1 Dim Examene(9) As Examen End Class

c) ncarc elementul 3 (index 2)


Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 'Definesc un obiect Dim unExamen As New Examen 'Incarc obiectul in celula 2 Examene(2) = unExamen 'Incarc proprietatile obiectului Examene(2).disciplina = InputBox("Tasatai disciplina") Examene(2).dataExamen = InputBox("Tastati data") Examene(2).nota = InputBox("Tasatati nota") End Sub

Practic proprietatea care urmeaz s fie ncrcat n tablou, apare n partea stng a unei operaii de atribuire, fiind calificat (precedat de numele tabloului cu indexul 2 i punct: Examene(2). ) d) Listez elementul 3 (index 2)
Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click 'Definesc variabila pentru mesaj Dim s As String s = "" 'Verific daca in celula am memorat un obiect If IsNothing(Examene(2)) Then 'daca nu am memorat un obiect MsgBox("In celula ... nu avem nimic incarcat") Else 'construiesc mesajul daca am memorat un obiect s = Examene(2).disciplina & " " & Examene(2).dataExamen & " " & Examene(2).nota

End If 'Afisez mesajul (continutul celulei 3 - index 2) MsgBox(s) End Sub

Practic proprietatea care urmeaz s fie citit (extras) din tablou, apare n partea dreapt a unei operaii de atribuire, fiind calificat (precedat de numele tabloului cu indexul 2 i punct: Examene(2). ) 5) Cum se redimensioneaz (se definete dinamic) un tablou? -cu ajutorul comenzii Redim. Practic se creeaz un nou tablou cu un numr nou de elemente. n mod implicit prin redimensionare se pierd datele coninute de tabloul iniial. Cu Redim putem fixa numrul iniial de dimensiuni dac acestea nu au fost fixate la definirea iniial, dup care nu mai pot fi modificate. In mod normal prin Redim se modific doar limitele superioare ale dimensiunilor. 6) Care este sintaxa instruciunii Redim? Redim [Preserve] numeTablou(listIndeci) Unde: -Preserve \pri-zrv\: este o clauz opional prin a crui prezen se asigur copierea elementelor existente n noul tablou. Datele din vechiul tabel sunt pstrate - listIndeci: conine noii indeci, limita superioar, pentru fiecare dimensiune, a fiecrui nou index Exemplu: -redimensionarea vectorului Examene cu pierderea datelor Redim Examene (14) -redimensionarea vectorului Examene cu pstrarea datelor Redim Preserve Examene (20)

7) Care este clasa din care deriv tablourile? -clasa Array. Practic orice tablou este un obiect de tip Array 8) Care sunt cele mai importante proprieti i metode ale clasei Array

a) Proprietile clasei Array sunt: .Length: returneaz numrul total de elemente coninute de tablou (n cazul nostru, pentru vectorul Examene, 10 elemente; n cazul VanzariJudetMagazinLuna(39,15,11), 40 x 16 x 12 = 7.680 elemente) .Rank: returneaz numrul de dimensiuni ale tabloului, minim 1 (n cazul nostru, pentru vectorul Examene, 1; n cazul VanzariJudetMagazinLuna(39,15,11), 3) b) Principalele metode de instan ale clasei Array sunt: .GetLength(dimensiune As Integer):returneaz numrul de elemente ale dimensiunii precizate .GetLowerBound(dimensiune As Integer): returneaz valoarea limitei inferioare a indexului pentru dimensiunea precizat (pentru tablourile VB.NET 0) .GetUpperBound(dimensiune As Integer): returneaz valoarea limitei superioare a indexului pentru dimensiunea precizat c) Principalele metode tip clas (partajate) ale clasei Array sunt:

Array.Sort(numeTablou): sorteaz cresctor elementele tabloului precizat (tabloul trebuie s aib doar o dimensiune - vector) Array.Reverse(numeTablou): inverseaz elementele tabloului precizat (tabloul trebuie s aib doar o dimensiune - vector) 10) Cum se parcurge un vector? -cu ajutorul structurii For index Next index pentru fiecare dimensiune. Dup sintaxa:
For index As Integer = 0 To NumeTabblou.GetUpperBound(dimensiune)

Next index

Exemplu: Pentru tabloul Matrice(2, 3) cu valorile de tip String: Coloan 1 Coloan Linie Linie 1 (index: I=0) Linie 2 (index: I= 1) Linie 3 (index: I= 2) Vom avea:
Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click 'Definire tablou Dim Matrice(2, 3) As String ' o matrice cu 3 linii si 4 coloane 'a) incarcare date 'parcurg linia For i As Integer = 0 To Matrice.GetUpperBound(0) 'parcurg coloana For j As Integer = 0 To Matrice.GetUpperBound(1) 'definesc un element Dim unElement As String unElement = "" 'construiesc valoarea elementului de linie i+1 si coloana j+1 unElement = CStr(i + 1) & "," & CStr(j + 1) 'adaug elementul in linia i si coloana j Matrice(i, j) = unElement Next j Next i 'b) Vizualizare continut vector 'parcurg linia For i As Integer = 0 To Matrice.GetUpperBound(0) 'parcurg coloana For j As Integer = 0 To Matrice.GetUpperBound(1) 'afiseaza valoarea din linia i si coloana j MsgBox(Matrice(i, j)) Next j Next i

Coloan 2 (index: j=1) 1,2 2,2 3,2

Coloan 3 (index: j=2) 1,3 2,3 3,3

Coloan 4 (index: j=3) 1,4 2,4 3,4

(index: j=0) 1,1 2,1 3,1

End Sub

11) Cum poate fi utilizat metoda Finalize i care este ordinea de distrugere a obiectelor? -dup cum tim garbage collector (gc), atunci cnd elimin un obiect din memorie, ncearc s apeleze metoda Finalize -metoda Finalize nu poate fi apelat n mod expres pentru un obiect prin program (apelul l poate realiza doar gc) Pentru a evidenia att modul (ordinea de distrugere) a obiectelor din memorie ct i utilizarea metodei Finalize vom defini clasa EchipaDeFotbal cu structura:

Public Class EchipaDeFodbal Public m_NumeClub As String Public Property numeClub() As String Get Return m_NumeClub End Get Set(ByVal value As String) m_NumeClub = value End Set End Property Protected Overrides Sub Finalize() MsgBox("A fost eliminata echipa: " & m_NumeClub) End Sub End Class

i vectorul Cupa(15) care va conine echipele care vor juca n optimi care va fi redimensionat Cupa(7) pentru echipele care vor juca n sferturi. Vom avea:
Public Class Form1 'Definesc vectorul Dim Cupa(15) As EchipaDeFodbal

Private Sub btnIncarc16_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnIncarc16.Click 'Incarc cele 16 echipe (in ordinea calificarii) For i As Integer = 0 To Cupa.GetUpperBound(0) 'Definesc un obiect Dim oEchipa As New EchipaDeFodbal 'Incarc datele in obiect oEchipa.numeClub = InputBox("Tastati numele clubului") 'Adaug obiectul in vector Cupa(i) = oEchipa Next 'Afisez echipele incarcate For i As Integer = 0 To Cupa.GetUpperBound(0) MsgBox(Cupa(i).numeClub) Next End Sub Private Sub btnRaman8_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRamn8.Click 'Redimensionez vectorul ReDim Preserve Cupa(7) 'Fortam lansarea curatatorului de gunoaie GC.Collect() End Sub End Class

De fiecare dat, dup lansarea n execuie, la evenimentul btnRaman8_Click vom avea o ordine aleatoare i diferir a celor 8 echipe (obiecte) care vor fi distruse. 12) Cum putem defini o clas care are un atribut de tip multivaloare (de tip Tablou sau colecie)? Pentru a clarifica aceast nou cerin vom proceda astfel: - ierarhia de clase:

Unde: -clasa Persoana este abstract -clasele Angajat i Copil sunt clase concrete i sunt derivate din clasa Persoana (Angajat este o Persoana; Copil este o Persoana) -atributele m_Cnp, m_NumePrenume, m_Sex, m_Departament, m_NumeTata i m_NumeMama sunt de tip String (m_Sex poate lua doar valorile M masculin, F-feminin); m_DataNasterii este de tip Date; m_SalariuNegociat este de tip Integer; m_Copii este de tip tablou, o celul fiind de tipul Copil -pentru atributele m_Cnp, m_NumePrenume, m_Sex, m_Departament, m_NumeTata i m_NumeMama vor fi definite proprietile aferente: cnp, numePrenume, sex, departament, numeTata i numeMama -metodele: AdaugUnCopil() permite adugarea la sfrit a unui element n tablou Copii; CitescUnCopil() permite citirea unui element de index precizat

din tabloul Copii; AreCopii() este o funcie logic care va returna valoarea True dac n atributil m_Copii de tip tabel am introdus un obiect de tip copil i False n caz contrar; CitescLimitaSuperioara() returneaz limita superioar a indexului vectorului m_Copii pentru angajaii cu copii (pentru care am adaugat cel puin un copil) a) Definirea claselor presupune:
'Definirea clasei Persoana Public MustInherit Class Persoana 'Definirea atributelor Private m_Cnp As String Private m_NumePrenume As String Private m_DataNasterii As Date Private m_Sex As String 'Definirea proprietatilor Public Property cnp() As String Get Return m_Cnp End Get Set(ByVal value As String) m_Cnp = value End Set End Property Public Property numePrenume() As String Get Return m_NumePrenume End Get Set(ByVal value As String) m_NumePrenume = value End Set End Property Public Property dataNasterii() As Date Get Return m_DataNasterii End Get Set(ByVal value As Date) m_DataNasterii = value End Set End Property Public Property sex() As String Get Return m_Sex End Get 'Reguli de validare Set(ByVal value As String) If value = "M" Or value = "F" Then m_Sex = value Else MsgBox("Sex diferit de M sau F") m_Sex = ""

End If End Set End Property End Class 'Definirea clasei Copil Public Class Copil 'Precizarea clase parinte Inherits Persoana 'Definirea atributelor Private m_NumeTata As String Private m_NumeMama As String Public Property numeTata() As String Get Return m_NumeTata End Get Set(ByVal value As String) m_NumeTata = value End Set End Property Public Property numeMama() As String Get Return m_NumeMama End Get Set(ByVal value As String) m_NumeMama = value End Set End Property End Class 'Definirea clasei Angajat Public Class Angajat 'Precizarea clasei parinte Inherits Persoana 'Definire atribute Private m_Departament As String Private m_SalariuNegociat As Integer 'Definire atribut multivaloare de tip tablou Private m_Copii() As Copil 'Definire proprietati Public Property departament() As String Get Return m_Departament End Get Set(ByVal value As String) m_Departament = value End Set End Property 'Definirea metodelor Public Sub AdaugUnCopil(ByVal unCopil As Copil, ByVal nr As Integer) If nr = 1 Then ' daca este primul copil ReDim Preserve m_Copii(0) m_Copii(m_Copii.GetUpperBound(0)) = unCopil Else 'daca nu este primul copil ReDim Preserve m_Copii(m_Copii.GetUpperBound(0) + 1)

m_Copii(m_Copii.GetUpperBound(0)) = unCopil End If End Sub Public Function CitescUnCopil(ByVal i As Integer) As Copil If AreCopii() Then 'Verific indexul If i >= 0 And i <= m_Copii.GetUpperBound(0) Then Return m_Copii(i) Else MsgBox("Copilul de index " & i & "nu exista") Return Nothing End If Else MsgBox("Angajatul nu are copii") Return Nothing End If End Function Public Function AreCopii() As Boolean If m_Copii.Length >= 0 Then Return True Else Return False End If End Function Public Function CitescLimitaSuperioara() As Integer If AreCopii() Then Return m_Copii.GetUpperBound(0) Else Return -1 End If End Function End Class

b) crearea ncarcarea cu date i listarea unui angajat


Public Class Form1 'Definesc obiectul unAngajat Dim unAngajat As New Angajat Dim nrCopii As Integer Private Sub btnUnAngajat_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnUnAngajat.Click btnAdaugUnCopil.Visible = False Dim raspuns As String 'Preluarea date pentru unAngajat unAngajat.cnp = InputBox("Tastati cnp") unAngajat.numePrenume = InputBox("Tasati nume si prenume") unAngajat.sex = InputBox("Tasrati sex") raspuns = InputBox("Are copii DA sau NU")

'Testez daca are copii If raspuns.ToUpper = "DA" Then btnAdaugUnCopil.Visible = True nrCopii = 0 End If End Sub Private Sub btnAdaugUnCopil_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdaugUnCopil.Click 'Adaug un copil nrCopii = nrCopii + 1 Dim unCopil As New Copil unCopil.numePrenume = InputBox("Tastati Nume si Prenume Copil") unCopil.numeTata = InputBox("Tastati Nume Tata") unAngajat.AdaugUnCopil(unCopil, nrCopii) End Sub Private Sub btnListezAngajat_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnListezAngajat.Click 'definesc sirul cu numele copiilor Dim s As String Dim unCopil As Copil s = "" If unAngajat.AreCopii Then For i As Integer = 0 To unAngajat.CitescLimitaSuperioara unCopil = unAngajat.CitescUnCopil(i) s = s & unCopil.numePrenume & " " Next End If MsgBox("Angajatul: " & unAngajat.numePrenume & " Are copii: " & s) End Sub End Class

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