Utilizarea tablourilor, tipurilor definite de utilizator, enumerarilor si a sirurilor de caractere
Tablouri
Asa un ati īnvatat , un tip descrie
setul de valori pe care o variabila le poate vea si un set de
operatii pe care programele dumneavoastra le pot executa cu variabila
respectiva. Cu exceptia sirurilor de caractere , toate tipurile
pe care le-am prezentat pāna acum pot avea numai o valoare. Pe masura
ce programele dumneavoastra īncep sa execute operatii mai utile,
este posibil ca o variabila sa contina mai multe valori. De
exemplu, variabila punctaj poate sa retina punctajul
obtinut de toti studentii īn sesiunea de examene. Un tablou este
o structura de date care poate sa pastreze mai multe valori de
acelasi tip. Tablourile trebuie concepute ca niste colectii de
date care poarta acelasi nume si au acelasi tip.
Bineīnteles, 626p1511g daca tabloul este de tip Variant atunci elementele
acestuia pot sa contina diferite tipuri de date (numerice,
siruri de caractere, date calendaristice, obiecte).
Īn Visula Basic sunt doua tipuri de tablouri: tablouri
cu dimensiune fixa si tablouri dinamice.
Tablourile cu dimensiune fixa sunt tablourile care au
un numar fix e componente. Acesta este declarat de la īnceput astfel īncāt
compilatorul aloca suficienta memorie pentru a putea retine
toate elementele. Declararea unui tablou cu dimensiune fixa se poate face
īn doua moduri:
- prin specificarea numarului ultimului element
Dim|Public|Private NumeTablou(NrUltimulElement) As TipData
Exemplu:
Dim aPuncte(5) As Integer
Cānd declarati un tablou primul element este 0. Exista totusi
posibilitatea sa faceti ca primul element sa fie 1. Pentru
aceasta inserati declarati Option Base 1 īn sectiunea General a
modulului īn care declarati tabloul.
Pentru a atribui valori fiecarui element din tablou veti proceda
astfel:
aPuncte(0)=270
aPuncte(1)=250
aPuncte(2)=289
aPuncte(3)=275
aPuncte(4)=300
- prin specificarea marginilor (adica se specifica numarul
primului si ultimului element)
Dim|Public|Private NumeTablou(NrPrimulElement To NrUltimulElement) As
TipData
Exemple:
Dim a( 1 To 10) As Double
Dim b(10 To 100) as Date
Tablourile dinamice sunt tablourile care au un numar
variabil de elemente. Exista situatii cānd nu stiti de cāte
elemente aveti nevoie īn tabloul dumneavoastra. si pentru a nu
aloca un spatiu prea mare sau prea mic de memorie, Visual Basic va
ofera posibilitatea sa redimensionati tabloul īn functie de
necesitati. Pentru a crea un tablou dinamic trebuie sa-l
declarati fara dimensiune:
Dim NumeTablou() As TipData
si apoi īn functie de cāte elemente aveti
nevoie i le alocati cu ajutorul instructiunii ReDim.
ReDim NumeTablou(NrUltimulElement) sau
ReDim NumeTablou(NrPrimulElement To NrUltimulElement)
Instructiune ReDim are aceeasi sintaxa ca instructiunea Dim
de la tablourile cu dimensiune fixa. Instructiunea ReDim poate fi
folosita numai īn interoirul unei proceduri
Exemplu:
Dim Salarii() As Integer
si apoi īntr-o procedura se aloca numarul de elemente:
Private Sub CalculareImpozit()
ReDim Salarii(1 To 10)
.............
End Sub
Īn toate exemplele prezentate pāna acum, tablourile au
constatat īntr-un singur rānd de date. Totusi, limbajul Visual Basic
accepta tablouri bi-,tri, si multi- dimensionale. Cea mai buna
cale de a vizualiza u tabel un tabel bidimensional este o matrice cu rānduri
si coloana. Daca tabelul contine trei dimensiuni,
considerati-l ca pe mai multe pagini, fiecare dintre ele continānd
matrice bidimensiuonale. Rāndurile tabelului merg de la stānga la dreapta , īn
tip ce coloanele merg de sus īn jos pe pagina. Declararea uni tabel
multidimensional este asemanatoare cu cea a unui tabel cu o
singura dimensiune. Diferenta consta īn faptul ca se mai
specifica si numarul de elemente al celorlalte dimensiuni.
Exemple:
Dim aCuloarePunctePlane(10,10) As Byte
Private aCuloarePuncteSpatiu( 1 To 30,1 To 50, 1 To 60) As Byte
Cānd adresati un element al unui tablou
multidimensional trebuie sa specificati numarul de ordine al
elementului pe fiecare dimensiune.
Exemple:
aCuloarePunctePlane(3,6)=10
aCuloarePuncteSpatiu(15,49,3)>=20
Pentru gestionarea cāt mai eficienta a elementelor tablourilor sunt de
mare folos structurile repetitive.
Tipuri definite de
utilizator
Vor aparea situatii cānd veti dori ca o
singura variabila sa stocheze mai multe informatii de
tipuri diferite dar care se afla īn strānsa legatura. Pentru aceasta Visual Basic va permite sa
creati tipuri definite de utilizator. Aceste sunt compuse dintr-un
numar de componente numite cāmpuri. Spre deosebire de tablouri, cāmpurile
pot contine tipuri de date diferite. Fiecare cāmp are un nume (identificator
de cāmp). Sintaxa unui tip definit de utilizator este urmatoarea:
Private| Public Type NumeTip
Nume_cāmp1 As TipData
Nume_cāmp2 As TipData
............
Nume_cāmp3 As TipData
End Type
Exemplu:
Private Type InfoStudent
sNume As String *
30
dDataNasterii As Date
sSex As String *1
sMediaAdmitere As Single
iMediiSemestriale(1 To 8) As Integer
sAdresa As String * 30
End Type
Dupa ce ati creat un anumit tip puteti defini variabile locale,
la nivel de modul sau globale de acel tip.
Exemple:
Dim student As InfoStudent
Dim StudentiContabiliate(1 To 70) As InfoStudent
Atribuirea sau recuperarea de valori stocate īn cāmpurile
acestor variabile se face exact ca īn cazul proprietatilor
controalelor sau a formelor.
Exemple:
Student.sNume="Munteanu Razvan"
Student.sMediaAdmitere= 9,91
Enumerarile
Tipul enumerare defineste o multime o multime
ordonata de valori: se enumera un sir de identificatori care
desemneaza valorile posibile. Īn mod implicit primul element al
enumerarii este initializat cu 0. Fiecare alt element desemneaza
succesorul valorii specificate de elementul precedent. Identificatorii apar īn
ordinea crescatoare a valorii lor.
Sintaxa:
Private|Public Enum NumeEnumerare
Element1[=valoare]
Element2[=valoare]
........
Elementn[=valoare]
End Enum
Exemplu:
Private Enum
ZileSaptamāna
Luni = 1
Marti
Miercur
Joi
Vineri
Sāmbata
Duminica
End Enum
Dupa ce am creat un tip enumere, ca si īn cazul tipurilor definite de
utilizator, putem defini o variabila de tip enumerare. Aceasta
variabila va putea sa ia ca valoare doar elementele din enumerare.
Exemplu:
Dim ZiSptamāna As Zile
Saptamāna
ZiSaptamāna =
Miercuri
siruri de caractere
Dupa cum ati vazut pāna joule , Visual
Basic ca si alte limbaje de programare, lucreaza cu cuvinte, deci cu
siruri de caractere. Pentru a putea manipula īntr-un mod cāt mai usor
cuvintele Visual Basic pune la dispozitia programatorilor tipul de date
String. Astfel puteti sa declarati o variabila de tip
String care va putea sa stocheze siruri de caractere. Declararea unei
astfel de variabile se realizeaza īn felul urmator:
[Public| Private] Dim NumeVariabila As String
[*NrCaractere]
Puteti specifica la declaratie numarul de
caractere astfel īncāt compilatorul sa stie ce cantitate de memorie
sa aloce. Daca nu stabiliti de la īnceput numarul de
caractere compilatorul va aloca memorie īn mod dinamic īn functie de
necesitatile de moment determinate de diferitele lungimi ale
sirurilor de caractere ce vor fi stocate īn variabila.
Asa cum am mai precizat operatiile pe care le suporta irurile de
caractere sunt operatia de concatenare si cele de comparatie.
Exemplu de concatenare:
Dim sNume As String, sPrenume As String, sNumeIntreg
sNume="Munteanu "
sPrenume="Razvan"
sNumeIntreg =sNume & sPrenume `sNumeIntreg va contine sirul de
caractere
“ ˝Munteanu Razvan˝
De asemenea exista o serie īntreaga de
functii pe care le puteti folosi ca sa prelucratii
sirurile de caractere:
- strInversat=StrReverse(strNormal) inverseaza ordinea caracterelor
īntr-un sir;
- NrCaractere=Len(strsir) returneaza numarul de caractere al
sirului;
- strRezultat=Left(strsir,intNrCaractere) extrage dintr-un sir de
caractere primele intNrCaractere din partea stānga a sirului;
- strRezultat=Right(strsir,intNrCaractere) extrage dintr-un sir de
caractere primele intNrCaractere din partea dreapta a sirului;
- strRezultat=Mid(strsir,intCaracterStart [,intNrCaractere]) extrage
dintr-un sir de caractere primele intNrCaractere din partea stānga a
sirului īncepānd cu pozitia intCaracterStart;
- lngRezultat=InStr ([intStart, ]strsir, strCauta[, intCompara])
verifica daca un caracter sau un sir( strCauta) se
gaseste īn interiorul altui sir (strsir). Īn caz afirmativ
functia returneaza pozitia primului caracter cautat īn
sirul strsir.
Exemplu:
Presupunem ca variabila Nume contine numele complet. Dorim sa
extragem numele de familie. Vom proceda astfel:
strSpatiu=˝ ˝
lngNrCaracter=InStr(Nume,strSpatiu)
NumeFam=Left(Nume,lngNrCaracter)
Voi prezenta īn continuare un program mai amplu ca va
utiliza diferite structuri de control si diferite tipuri de date.
Programul va prelua informatii despre studenti prin intermediul unei
ferestre si va afisa o lista ce cuprinde studentii īn
ordinea punctajului obtinut la examene.
Adaugati urmatoarele elemente la proiect:
Form1
Name frmInfo
Caption Culegere date
Label1 Caption Nume
Label2 Caption Specializare
Label3 Caption Grupa
Label4 Caption Puncte
TextBox1 Name cmdNume ; Text ˝˝
TextBox2 Name cmdSpecializare ; Text ˝˝
TextBox3 Name cmdGrupa ; Text ˝˝
TextBox4 Name cmdPuncte ; Text ˝˝
CommandButton1 Name cmdAdaugare ; Caption Adaugare
CommandButton2 Name cmdAdaugare ; Caption Adaugare
Din meniul Project mai adaugati o forma la proiect.
Form2
Name frmAfisare ; Caption Rezultare
CommandButton1 Name cmdTerminare ; Caption Terminare
Īn fereastra Components (Ctrl+T) bifati controlul
ActiveX Microsoft FlexGrid Control pentru al putea utiliza īn acest proiect. El
va fi adaugat la controalele din Cutia de instrumente(ToolBox). Adaugati la forma un control FlexGrid.
Name flxRzultate
FexedCols 1
Cols 5
Din meniul Project adaugati un modul standard la
proiect (cu comanda Add Module) īn acre scrieti urmatorul cod:
Option Explicit
Public Type InfoStudent
Nume As String * 30
Specializare As String * 20
Grupa As Integer
puncte As Integer
End Type
Public aStudenti(1 To 70) As InfoStudent
Public iNrStudenti As Integer
Īn fereastra de cod a primei forme adaugati codul
urmator:
Option Explicit
Option Base 1
Private Sub cmdAdaugare_Click()
iNrStudenti = iNrStudenti + 1
With aStudenti(iNrStudenti)
.Nume = txtNume.Text: txtNume.Text = ""
.Specializare = txtSpecializare.Text: txtSpecializare.Text = ""
.Grupa = Cint(txtGrupa.Text): txtGrupa.Text = ""
.puncte = Cint(txtPuncte.Text): txtPuncte.Text = ""
End With
End Sub
Private Sub cmdAfisare_Click()
Unload frmInfo
frmAfisare.Show
End Sub
Private Sub Form_Load()
iNrStudenti = 0
End Sub
Iar īn fereastra de cod a formei doi adaugati
urmatorul cod:
Option Explicit
Private Sub cmdTerminare_Click()
End
End Sub
Private Sub Form_Load()
Sortare
With flxRezultate
.Row = 0:
.Col = 1: .Text = "Numele"
.Col = 2: .Text = "Specializarea"
.Col = 3: .Text = "Grupa"
.Col = 4: .Text = "Pnctajul"
Dim i As Integer
For i = 1 To iNrStudenti
.Row = i
.Col = 1: .Text = aStudenti(i).Nume
.Col = 2: .Text = aStudenti(i).Specializare
.Col = 3: .Text = aStudenti(i).Grupa
.Col = 4: .Text = aStudenti(i).puncte
.Rows = iNrStudenti + 1
Next i
End With
End Sub
Private Sub Sortare()
Dim i As Byte, j As Byte, aux As InfoStudent
For i = 1 To iNrStudenti
For j = i + 1 To iNrStudenti
If aStudenti(i).puncte < aStudenti(j).puncte Then
aux = aStudenti(i)
aStudenti(i) = aStudenti(j)
aStudenti(j) = aux
End If
Next j
Next i
End Sub
|