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
|