+ All Categories
Home > Documents > C9 Utilizare Tablourilor in VB NET

C9 Utilizare Tablourilor in VB NET

Date post: 29-Dec-2015
Category:
Upload: ion-buligiu
View: 42 times
Download: 4 times
Share this document with a friend
Description:
C9 Utilizare Tablourilor in VB NET
20
C9 Utilizare tablourilor în VB NET 1) Ce este un tablou în VB.NET prin ce se caracterizează? -o variabilă de memorie ce conţine o listă (o mulţime) de elemente de acelaşi tip, stocate în zone contiguie de memorie; Un tablou se caracterizează prin: -nume (numele variabilei) -rang/dimensiune (numărul de dimensiuni/ indecşi): unidimensional (1 index), bidimensional (2 indecşi); tridimensional (3 indecşi), 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 numărul de valori ale unei dimensiuni - 1) -capacitate (numărul de elemente care pot fi memorate/înregistrate) în tablou), care defineşte numărul maxim de elemente care pot fi memorate. Exemplu capacitatea tabloului tridimensional VanzariJudetMagazinLuna(39,15,11) care va memora vânzările unei firme pentru 40 de judeţe, 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 acelaşi tip)
Transcript
Page 1: C9 Utilizare Tablourilor in VB NET

C9 Utilizare tablourilor în VB NET

1) Ce este un tablou în VB.NET prin ce se caracterizează?

-o variabilă de memorie ce conţine o listă (o mulţime) de elemente de acelaşi tip, stocate în zone contiguie de memorie;

Un tablou se caracterizează prin:

-nume (numele variabilei)

-rang/dimensiune (numărul de dimensiuni/ indecşi): unidimensional (1 index), bidimensional (2 indecşi); tridimensional (3 indecşi), 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 numărul de valori ale unei dimensiuni - 1)

-capacitate (numărul de elemente care pot fi memorate/înregistrate) în tablou), care defineşte numărul maxim de elemente care pot fi memorate. Exemplu capacitatea tabloului tridimensional VanzariJudetMagazinLuna(39,15,11) care va memora vânzările unei firme pentru 40 de judeţe, 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 acelaşi tip)

2) Cum se defineşte un tablou?

[Acces] numeTablou([listăIndecşi]) As tipData

Unde:

-acces: defineşte nivelul de acces şi poate fi Dim, Public, Protected, Friend, Private, ProtectedFriend

-tipData: defineşte natura datelor memorate şi poate fi dată de tip primitiv sau obiect (toate datele sunt de aceelaşi tip)

- listăIndecşi: conţine valorile maxime ale indecşilori pentru fiecare dimensiune. La definire lista poate lipsi dar este obligatorie înainte de

Page 2: C9 Utilizare Tablourilor in VB NET

utilizare. Dacă la definire lista lipseşte, în VB se considera că tabloul este definit dinamic (adică) putea fi redimensionat după necesităţi. In VB.NET toate tablourile sunt dinamice, pot fi redimensionate.

Exemplu:

3) Cum se accesează în general elementele unui tablou?

-cu ajutorul indecşilor

Astfel fiind dat tabloul Dim NumeStudenti (99) As String

- pentru a încărca (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 stângă a unei operatii de atribuire)

-pentru a citi (a valorifica) informaţia din celula 15 (index 14) vom avea:

StudentCautat= NumeStudent(14)

(practic tabloul cu indexul adecvat apare în partea dreaptă a unei operatii de atribuire)

Page 3: C9 Utilizare Tablourilor in VB NET

4) Cum se accesează o metodă sau o proprietate a unui obiect memorat într-un tablou?

-tot cu ajutorul indecşilor, dar numele tabloului împreună cu incşii adecvaţi vor califica numele proprietăţii sau metodei

Exemplu:

Fie clasa Examen cu următoarea 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 proprietăţile corespunzătoare: disciplina , dataExamen, nota.

Pentru tabloul Examene care conţine ca elemente obiecte instanţiate din clasa Examen ( tablou cu o dimensiune şi care poate conţine 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

Page 4: C9 Utilizare Tablourilor in VB NET

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

End Class

b) Definirea tabloului Examene

Public Class Form1 Dim Examene(9) As ExamenEnd 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 încărcată în tablou, apare în partea stângă a unei operaţii 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

Page 5: C9 Utilizare Tablourilor in VB NET

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 operaţii de atribuire, fiind calificată (precedată de numele tabloului cu indexul 2 şi punct: Examene(2). )

5) Cum se redimensionează (se defineşte dinamic) un tablou?

-cu ajutorul comenzii Redim. Practic se creează un nou tablou cu un număr nou de elemente. În mod implicit prin redimensionare se pierd datele conţinute de tabloul iniţial. Cu Redim putem fixa numărul iniţial de dimensiuni dacă acestea nu au fost fixate la definirea iniţială, după care nu mai pot fi modificate. In mod normal prin Redim se modifică doar limitele superioare ale dimensiunilor.

6) Care este sintaxa instrucţiunii Redim?

Redim [Preserve] numeTablou(listăIndecşi)

Unde:

-Preserve \pri-’zərv\: este o clauză opţională prin a cărui prezenţă se asigură copierea elementelor existente în noul tablou. Datele din vechiul tabel sunt păstrate

- listăIndecşi: conţine noii indecşi, limita superioară, pentru fiecare dimensiune, a fiecărui nou index

Exemplu:

-redimensionarea vectorului Examene cu pierderea datelor

Redim Examene (14)

-redimensionarea vectorului Examene cu păstrarea datelor

Redim Preserve Examene (20)

Page 6: C9 Utilizare Tablourilor in VB NET

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 proprietăţi şi metode ale clasei Array

a) Proprietăţile clasei Array sunt:

.Length: returnează numărul total de elemente conţinute 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ă numărul 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ă numărul 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:

Page 7: C9 Utilizare Tablourilor in VB NET

Array.Sort(numeTablou): sortează crescător 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

Page 8: C9 Utilizare Tablourilor in VB NET

Exemplu: Pentru tabloul Matrice(2, 3) cu valorile de tip String:

Coloană

Linie

Coloană 1

(index: j=0)

Coloană 2

(index: j=1)

Coloană 3

(index: j=2)

Coloană 4

(index: j=3)

Linie 1 (index: I=0)

1,1 1,2 1,3 1,4

Linie 2 (index: I= 1)

2,1 2,2 2,3 2,4

Linie 3 (index: I= 2)

3,1 3,2 3,3 3,4

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

Page 9: C9 Utilizare Tablourilor in VB NET

Next i End Sub

11) Cum poate fi utilizată metoda Finalize şi care este ordinea de distrugere a obiectelor?

-după cum ştim garbage collector (gc), atunci când 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 evidenţia atât modul (ordinea de distrugere) a obiectelor din memorie cât ş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 SubEnd Class

şi vectorul Cupa(15) care va conţine 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

Page 10: C9 Utilizare Tablourilor in VB NET

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 SubEnd Class

De fiecare dată, după lansarea în execuţie, 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 colecţie)?

Pentru a clarifica această nouă cerinţă vom proceda astfel:

- ierarhia de clase:

Page 11: C9 Utilizare Tablourilor in VB NET

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 proprietăţile aferente: cnp, numePrenume, sex, departament, numeTata şi numeMama

-metodele: AdaugUnCopil() permite adăugarea la sfârşit a unui element în tablou Copii; CitescUnCopil() permite citirea unui element de index precizat

Page 12: C9 Utilizare Tablourilor in VB NET

din tabloul Copii; AreCopii() este o funcţie 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 angajaţii cu copii (pentru care am adaugat cel puţin un copil)

a) Definirea claselor presupune:

'Definirea clasei PersoanaPublic 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 = ""

Page 13: C9 Utilizare Tablourilor in VB NET

End If End Set End Property

End Class

'Definirea clasei CopilPublic 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 PropertyEnd Class

'Definirea clasei AngajatPublic 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)

Page 14: C9 Utilizare Tablourilor in VB NET

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")

Page 15: C9 Utilizare Tablourilor in VB NET

'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 SubEnd Class


Recommended