Sunteți pe pagina 1din 37

CAPITOLUL 2

TIPURI DE DATE, INSTRUCTIUNI SI FUNCTII VISUAL BASIC.NET

2.1 Variabile, constante si tipuri de date

In cadrul oricarui program adesea este necesar sa se memoreze temporar anumite


valori actunci cand Visual Basic executa calcule.
Visual Basic, ca majoritatea limbajelor de programare, foloseste variabile pentru
stocarea valorilor. Variabilele trebuie sa aiba un nume, acesta este un cuvant folosit cand
se lucreaza cu valoarea pe care o contine variabila, si un tip de data, care determina ce fel
de date poate contine variabila. Matricele pot fi de asemenea folosite pentru stocarea
colectiilor indexate de variabile inrudite.
Constantele pot stoca si ele valori, dar, dupa cum o sugereaza si numele, aceste valori
raman nemodificate de-a lungul executiei aplicatiei. Folosirea constantelor poate face
codul mai lizibil deoarece in locul unor numere se vor afla nume mai usor de inteles.
Exista de asemenea o serie de constante predefinite in Visual Basic, dar pot fi create si
constante proprii.
Tipurile de date controleaza stocarea interna a datelor in Visual Basic.

Variabile
Programele Visual Basic declara si folosesc variabile in moduri similare cu alte
limbaje de programare.
O variabila este locul din memorie rezervat pentru o valoare necunoscuta.
A declara o variabila inseamna a-i spune programului despre ea de la bun inceput. O
variabila poate fi declarata cu instructiunea Dim, prin furnizarea unui nume pentru
variabila:
Dim numeVariabila As tip

Variabilele declarate prin Dim in cadrul unei proceduri exista doar atata timp cat
executa procedura. La incheierea procedurii, valoarea variabilei dispare. In plus, valoarea
unei variabile dintr-o procedura este locala acelei proceduri – adica accesul la o variabila
dintr-o anumita procedura nu poate fi permis din cadrul altei proceduri. Aceste
caracteristici permit folosirea acelorasi nume de variabile in proceduri diferite, fara a
exista conflicte sau modificari ale continutului lor.
Declaratii si atribuiri. Variabilele pot fi declarate folosind cuvintele cheie Dim,
Private, Public sau Static.
• Dim se foloseste in interiorul unei proceduri pentru a declara o variabila
locala care este vizibila numai in cadrul acelei proceduri.
• Private impreuna cu Dim pot fi folosite in afara procedurilor, dar in interiorul
claselor sau modulelor pentru a crea variabile care pot fi accesate de oriunde
din interiorul clasei sau modulului respectiv.
• Public se poate folosi in interiorul modulelor pentru a crea variabile globale,
adica variabile care exista pe toata durata programului si care pot fi accesate
de oriunde in proiectul curent. Daca se foloseste cuvantul cheie Public in
interiorul unei clase se va crea un camp public pentru acea clasa.
• Static se foloseste pentru a declara variabile statice in interiorul procedurilor.
Static nu se poate folosi la declararea procedurii pentru a face toate variabilele
declarate in acea procedura statice.
Urmatoarea secventa de cod demonstreaza cele cinci tipuri de variabile:
Module MyModule
Public myGlobalVar As String
' Aceasta variabila globala este vizibila pentru intreaga aplicatie.
Private myModuleVar As String
Dim myModuleVar2 As String
' Aceste variabile sunt vizibile numai in interiorul modulului curent.

Sub MyProcedure()
Dim myPrivateVar As String
' Aceasta variabila private este vizibila numai in interiorul acestei
proceduri.
Static counter As Integer
' Aceasta variabila statica isi mentine valoarea intre apeluri
' consecutive ale procedurii

End Sub
End Module

Variabile neatribuite si nefolosite


Visual Basic emite un avertisment de compilare daca se declara o variabila locala
care nu se foloseste niciunde in metoda (procedura/functia) curenta. Desi aceste variabile
nu afecteaza cu nimic executia programului, prezenta lor poate fi o simptoma a unor
greseli mai mari de programare. VisualBasic poate de asemenea ajuta la evitarea erorilor
de tipul NullReferenceException, care se petrec atunci cand se declara si se foloseste o
variabila care nu a fost initializata (nu i-a fost atribuita o valoare in momentul declararii)
asa ca in cazul urmator:
Dim s As String
' Urmatoarea linie cauzeaza urmatorul avertisment: Variable 's' is used before
' it has been assigned a value. O exceptie NullReferenceException poate avea
' loc in timpul rularii.
MessageBox.Show(s.ToString)

Visual Basic deriva din limbajul Basic, mai exact din versiunea Microsoft a
limbajului numita QuickBasic. Aceste versiuni mai vechi nu forteaza utilizatorul sa
declare toate variabilele folosite in program si aceasta optiune a fost pastrata si in
versiunile mai recente inclusiv VisualBasic .NET 2005 desi declararea variabilelor este
implicit obligatorie. Puteti controla aceasta optiune cu ajutorul directivei Option Explicit
plasata pe prima linie de cod a modulului.
' Forteaza declararea explicita a tuturor variabilelor din modul.
Option Explicit On
Option Explicit ' Clauza On poate fi omisa.

' Face ca declararea variabilelor sa fie optionala.


Option Explicit Off
In mod implicit variabilele trebuie declarate cu clauza explicita As, dar aceasta
poate fi omisa daca se seteaza un tip de date implicit. Tipul Object este tipul implicit.
Dim obj ` variabila de tip object

Este insa recomandat ca toate variabilele sa fie declarate cu tipul propriu si nu ar


trebui schimbat comportamentul implicit fara a avea un motiv bun.
Exista cateva restrictii privind numele de variabila, si anume:
• trebuie sa inceapa cu o litera;
• nu poate contine caracterul punct sau un caracter rezervat, de declaratie de tip;
• nu trebuie sa depaseasca 255 de caractere;
• trebuie sa fie unic in cadrul aceluiasi domeniu, care este spatiul in cadrul
caruia o variabila poate fi apelata – o procedura, un formular etc.
Pot fi declarate mai multe variabile in cadrul aceleiasi instructiuni Dim, Private
sau Public sau poate fi folosita o singura clauza As daca variabilele declarate pe aceeasi
linie sunt de acelasi tip:
Dim cantitate As Long, greutate As Single, adresa As String
Dim x, y, z As Long

Transferarea valorilor in variabile se face cu ajutorul instructiunii de atribuire.


Aceasta are urmatoarea forma:
Dim varNume As tip
varNume = expresie

varNume poate fi orice nume posibil de variabila care a fost declarata, iar expresie se
refera la o valoare imediata sau o variabila.
In continuare se prezinta un exemplu de atribuire a unei valori unei variabile.
Dim varNume As Integer
varNume = 100 ’atribuie o valoare unei variabile de tip Integer

Dim varNume2 As String


varNume2=”Ionescu” ’atribuie o valoare unei variabile de tip String

Variabilele locale sau cele declarate la nivel de clasa (campurile) pot fi declarate si
initializate folosind o singura instructiune. Aceasta optiune permite simplificarea codului.
Dim latime As Single=1000
Dim nume As String=”Ion”
Dim dataCurenta As Date=Now() ’atribuie variabilei valoarea datei curente

Dupa cum arata ultima instructiune valoarea care este asociata unei variabile nu
trebuie sa fie neaparat o constanta. Puteti initializa o variabila numai daca este singura
variabila declarata in instructiunea Dim, Private sau Public. Initializarea variabilelor este
extrem de folositoare mai ales in cazul variabilelor declarate la nivel de clasa
(campuri(fields)) si al variabilelor globale deoarece ofera o metoda simpla de a avea
valori implicite pentru campuri si proprietati.
Public Class Person
Public Country As String = "USA"
End Class
Initializatorii functioneaza de asemenea cu variabile care au un tip de data
complex (cum ar fi de exemplu o clasa ) cum ar fi de exemplu:
Dim txtBox As TestBox
txtBox = New TextBox()

Acest cod poate fi scris mai concis in felul urmator:


Dim txtBox As TextBox = New TextBox()

Visual Basic suporta o sintaxa speciala care permite programatorului sa declare o


variabila fara a scrie numele clasei mai multe ori.
Dim ds As New DataSet()

In Visual Basic .NET variabilele pot fi declarate in 3 locuri distincte si anume: la


nivel de procedura (variabile locale), la nivel de clasa (campuri) si la nivel de bloc de
instructiuni.

Variabile la nivel de bloc de instructiuni


Daca o instructiune Dim apare in interiorul unui bloc de cod If..EndIf, Select
Case…EndSelect, For…Next, Do…Loop sau While…EndWhile, variabila care este
declarata este o variabila de bloc.
If x = 0 Then
Dim y As Integer ' variabila la nivel de bloc

End If

Aceste variabile pot fi folosite numai in interiorul blocului in care au fost


declarate. Variabilele la nivel de bloc imbunatatesc lizibilitatea codului. O procedura sau
o functie poate contine 2 sau mai multe variabile de bloc cu acelasi nume cu conditia ca
ele sa se afle in blocuri de cod care nu se suprapun:
If x = 0 Then
Dim y As Integer ' variabila la nivel de bloc

End If
Do
Dim y As Long ' alta variabila la nivel de bloc

Loop

Variabilele locale se declara in interiorul unei proceduri sau functii dupa cum
urmeaza:
Public Sub Suma()
Dim s As Indeger=0
EndSub
Aceste variabile sunt accesibile numai in cadrul procedurii in care au fost declarate.
Aceste variabile locale pot fi declarate prin cuvintele-cheie Dim sau Static, dupa cum
urmeaza:
Dim variabilaTempProc As tip

Static variabilaTempProc As tip

Valorile variabilelor locale declarate prin Static se pastreaza atata vreme cat aplicatia
ruleaza, pe cand variabilele declarate cu Dim exista doar cata vreme procedura este
executata.

Variabilele declarate la nivel de clasa(campurile) sunt cele declarate deasupra


oricarei proceduri sau functii, fie in module de program fie in cadrul unui formular ca in
cazul urmator:
Public Class Form1
Dim x As Integer = 0 ‘variabila declarata la nivel de clasa

Private Sub BtnOk_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnOk.Click

End Sub
End Class

Variabile statice
Pe langa un domeniu, variabilele au si o durata de viata, adica perioada de timp cat isi
pot pastra valoarea. Valorile variabilelor declarate la nivelul modulelor si al claselor se
pastraza pe toata durata aplicatiei. Cu toate acestea, variabilele locale declarate cu Dim
exista doar cat timp se executa procedura sau functia in care au fost declarate. La
inchiderea rularii unei proceduri, valorile variabilelor locale nu sunt pastrate, iar memoria
ocupata de ele este eliberata.
La urmatoarea executie a procedurii, toate variabilele locale se reinitializeaza. Dar si
asa, valoarea unei variabile locale poate fi pastrata facand-o statica. Cuvantul-cheie Static
va fi folosit exact la fel ca si declaratia Dim pentru a declara una sau mai multe variabile
de acest tip intr-o procedura.
De exemplu, urmatoarea functie va calcula un total in derulare adaugand o noua
valoare la totalul anterior in variabila statica Acumulat:
Function TotalInDerulare(num)
Static Acumulat
Acumulat = Acumulat + num
TotalInDerulare = Acumulat
End Function

Daca Acumulat ar fi fost declarat cu Dim in loc de Static, valorile insumate in pasii
anteriori nu ar fi fost pastrate intre apelurile functiei, iar functia ar fi returnat exact
aceeasi valoare cu care a fost apelata.
Acelasi rezultat putea fi obtinut declarand Acumulat la nivel de clasa sau de modul.
Dar in acest caz variabila ar fi putut fi alterata de alte proceduri sau functii ale clasei sau
modulului.
Constante
Deseori se constata prezenta in cod a unor valori constante care se repeta mereu.
Alteori se constata ca programul depinde de valorile anumitor numere greu de retinut –
valori care in sine nu au o semnificatie deosebita – sau de valori care s-ar putea sa se
schimbe in perioada de testare a programului, cum este de exemplu valoarea pentru o
scalare.
In astfel de cazuri, lizibilitatea codului creste spectaculos – si el devine mai usor de
intretinut – utilizand constantele. O constanta este un nume semnificativ care tine locul
unui numar sau sir de caractere care nu se schimba. Cu toate ca o constanta seamana
oarecum cu o variabila, o constanta nu poate fi modificata si nu i se poate atribui o alta
valoare, asa cum se intampla cu variabilele. Exista doua surse de constante:
• Constante intrinseci sau definite de sistem care sunt furnizate de aplicatii sau
de controale. Constantele Visual Basic sunt enumerate in cadrul bibliotecilor
de obiecte Visual Basic (VB) si Visual Basic for Applications (VBA) din
cadrul utilitarului Object Browser. Celelalte aplicatii care ofera biblioteci de
obiecte, precum Microsoft Excel sau Microsoft Project, ofera si o lista de
constante care pot fi folosite impreuna cu obiectele, metodele si proprietatile
lor. Constantele sunt, de asemenea, definite in biblioteca de obiecte a fiecarui
control ActiveX.
• Constantele simbolice sau definite de utilizator sunt declarate prin
instructiunea Const si vor fi descrise in paragraful urmator.

Crearea propriilor constante


Sintaxa pentru declararea unei constante este:
Public|Private Const nume_constanta As tip = expresie

unde argumentul nume_constanta este un nume simbolic valid (aceleasi reguli ca pentru
variabile), iar expresie este compusa din constante numerice sau siruri de caractere si din
operatori, dar nu pot fi folosite apeluri de functii sau valori care nu se cunosc in
momentul compilarii. Pe langa aceste doua argumente este obligatoriu sa se foloseasca
cuvantul-cheie Const, restul sunt optionale.
Exemple de definiri de constante cu instructiunea Const:
Const conPi = 3.14159265358979
Public Const conNumarPlanete As Integer = 9
Const conDataCurenta = #08/21/02#
Const conNumeDeCod = ”Vultur”
Public Const conPiScurt = 3.14, conMaxPlanete = 9, conPopulatiaLumii = 6E+09
Const conPi2 = 2 * conPi

Domeniul unei instructiuni Const este identic cu al unei declaratii de variabila si se


supune acelorasi reguli.

Tipuri de date
Variabilele sunt entitati destinate stocarii valorilor; ele se caracterizeaza prin nume si
tip de data. Tipul de data al unei variabile indica modul in care bitii care reprezinta
respectivele valori sunt stocati in memoria calculatorului. La declararea unei variabile,
acesteia i se poate asocia si un tip de data. Toate variabilele au un tip de data care
determina felul datelor pe care le poate stoca.
Daca nu este furnizat nici un tip de data, variabila capata implicit tipul de data
Object. Tipul de data Object este tipul din care deriva toate celelalte tiputi de date.
Daca o variabila memoreaza intotdeauna acelasi tip de data, Visual Basic o va
manevra mult mai eficient daca este declarata ca acel tip de data. De exemplu, o variabila
care memoreaza numele unei persoane este mai bine sa aiba tipul sir de caractere.
Tipurile de date pot fi aplicate nu numai variabilelor. La atribuirea unei valori pentru
o proprietate, acea valoare are un tip de data; argumentele au de asemenea tipuri de date.
De fapt, aproape orice componenta Visual Basic care implica date implica si un tip de
data. De asemenea, pot fi declarate matrice pentru oricare din tipurile fundamentale de
date.
Inainte de a utiliza o variabila de tip non-Object, trebuie folosita una dintre
instructiunile Private, Public, Dim sau Static pentru a-i declara tipul. In continuare se
prezinta cateva exemple de declaratii posibile de variabile cu tip de date:
Private i As Integer
Dim nrMare As Double
Static Nume As String
Public PlatiFacute As Currency
Privat n, Test As Integer, Prenume As String

Tipurile de date in Visual Basic 2005 si in .NET in geleral se impart in ValueTypes si


ReferenceTypes. Tipurile de date ValueType sunt tipurile de date primitive,
structurile(tipuri valuetype definite de utilizator) si enumeratiile. Tipurile de date
ReferenceType sunt Clasele(majoritatea tipurilor de date pe care programatorii le declara
sunt clase), delegatii, vectorii si tipul de date String.

Tipul de date Object


Tipul Object poate contine orice tip si variabilelor de acest tip le pot fi atribuite
valorile oricarui tip de date deoarece toate variabilele sunt de tip Object in .NET inclusiv
valorile intregi si sir de caractere. Unei variabile i se poate atribui intotdeauna o valoare
al carui tip deriva din tipul variabilei.
Dim o As Object, s As String
s = "ABCDE"
o = 123
o = s

Tipuri de date numerice


Variabilele numerice sunt Long, Integer, Short si Byte. Variabilele de tip Long au
o marime de 64 de biti, variabilele de tip Integer au 32 de biti, cele Short au 16 biti, iar
cele de tip Byte au 8 biti fara semn. In general ar trebui sa folositi variabile cu valori pe
32 de biti deoarece sunt la fel de rapide sau mai rapide decat cele pe 16 biti si
considerabil mai rapide decat cele pe 64 de biti mai ales in operatii de inmultire si
impartire. Aceste variabile tin numere fara virgula.
Tipul de date Boolean
Dupa cum sugereaza si numele acest tip de date este folosit pentru a stoca 2
valori: True si False. Acest tip de data este memorat pe 32 de biti, desi ar fi putut fi stocat
si pe 1 bit. Valoarea implicita a aestui tip de data este False.

Tipuri de date cu virgula flotanta


Visual Basic 2005 suporta doua tipuri de date cu virgula flotanta: Single si
Double, care ocupa 4 respectiv 8 bytes.
Dim s As Single=12.3
Dim d As Double=s*450.0

Tipul de date Decimal


Acest tip de date este memorat pe 128 de biti si este folosit pentru calcule bancare
unde datele nu pot fi rotunjite sau trunchiate. Acest tip de date poate tine numere cu o
precizie de 28 cifre zecimale
Dim d As Decimal=123.45

Tipul de date Char


O variabila de tip Char poate tine un singur caracter Unicode si deci ocupa 16 biti.
Cand se atribuie o valoare unei variabile de tip Char trebuie folosit sufixul „c” pentru a
indica, ca valoarea atribuita trebuie convertita la tipul Char inainte de atribuire.
Dim ch As Char=”A”c ’de remarcat folosirea sufixului „c”

Urmatoarea linie de cod genereaza o eroare de compilare


Ch=”ABC”c ’mai mult de un caracter

Unei variabile de tip Char i se poate atribui o valoare si in cazul urmator:


Dim ch As Char=”ABC”

caz in care variabila are valoarea primului caracter din sir.

Tipul de date String


Teoretic acest tip de date poate tine in jur de 2 milioane de caractere, dar desigur
un sir de o astfel de lungime ar fi fatal pentru o aplicatie. Puteti adauga noi caractere la sir
folosind operatorul „&” dupa cum se observa in exemplul urmator:
Dim s As String=”ABC”
s = s & „D” ’in acest moment valoarea variabilei s va fi „ABCD”

O variabila de tip String careia nu i-a fost atribuita o valoare are valoarea
Nothing. Exista o diferenta intre o variabila String care contine un sir nul si o variabila
String careia nu i-a fost atribuita o valoare.
Dim s as String=”” ’sir nul
MessageBox.Show(s.Length) ’afiseaza 0
Dim t as String
MessageBox.Show(s.Length) ’genereaza o eroare de compilare

Tipul de date Date


Acest tip de date poate fi folosit pentru a stoca atat date calendaristice cat si
timpul.
Dim d As Date=#3/21/2007 12:00 PM#

Pentru atribuirea unei valori unei variabile de acest tip se pot folosi si functiile
globale Now() si Today()
Dim d As Date=Now

Deoarece Date este un tip de date primitiv se poate folosi si operatorul de


comparatie ca in cazul urmator:
If Today<=#12/21/2007# Then
’Nu suntem inca in anul 2008
End If

Vectori(Arrays)
Vectorii permit apelarea la o serie de variabile avand acelasi nume si care folosesc
un numar(index) pentru a se deosebi unele de altele. Acest lucru este util in multe situatii
la scrierea codului, deoarece pot fi create bucle care lucreaza eficient cu orice element din
vector folosind indexul. Vectorii au atat limite inferioare cat si limite superioare, iar
elementele lor sunt continui in cadrul acelor limite.
Toate elementele dintr-un vector au acelasi tip de data. Daca, insa, tipul de data
este Object, elementele, luate individual pot contine tipuri diferite de date. Pot fi creati
vectori de orice tip de data inclusiv tipuri de date definite de utilizator.
In Visual Basic exista doua tipuri de vectori: vectori cu dimensiune fixa si vectori
dinamici, a caror dimensiune poate fi modificata.
Toti vectorii in VisualBasic au indexul primului element 0. Vectorii pot fi
unidimensionali, bidimensionali si jagged(vectori de vectori).

Vectori cu dimensiune fixa


Un vector se declara in felul urmator:
Dim arr(5) As Integer ’vector
Dim arr2(5,5) As Integer ’matrice

Dupa cum se observa din exemplul precedent valoarea care se pune intre
paranteze reprezinta cel mai mare index din vector, nu numarul de elemente din vector.
Deci vectorul arr(5) are indexul ultimului element 5 si deci are 6 elemente.
O alta modalitate de a declara un vector este:
Dim arr(0 To 10) As Integer ’vector de 11 elemente (se poate specifica si
limita inferioara)

Vectorii pot fi declarati ca si celelalte tipuri de variabile la nivel de clasa, modul


sau la nivel de procedura ca variabile locale.
In continuare se prezinta si alte exemple de declaratii de vectori uni-dimensionali:
Dim contoare(14) As Integer ’vector de 15 elemente intregi
Dim nume(5) As String ’vector de 6 elemente intregi

Prima declaratie declara un vector de 15 elemente cu indexul mergand de la 0 la


14. A doua creeaza o matrice de 21 de elemente, cu indexul mergand de la 0 la 20. Limita
inferioara implicita este 0.

Vectori dinamici
Apar situatii cand nu se poate sti dinainte cat de mare trebuie declarat un vector.
In aceste cazuri este necesar a schimba dimensiunea vectorului in timpul executiei.
Un vector dinamic poate fi redimensionat in orice moment. Vectorii dinamici sunt printre
cele mai flexibile si mai convenabile facilitati din Visual Basic si ele ajuta la o mai
eficienta administrare a memoriei.
Puteti declara un vector folosind instructiunea Dim si sa alocati memorie pentru el
intr-o instructuine ReDim ulterioara. O instructiune ReDim nu poate exista fara o
instructiune Dim pentru un anumit vector. Deoarece ReDim nu poate declara tipul de date
al vectorului aceasta instructiune nu contine clauza As.
’se declara vectorul
Dim arr() As Integer
....
’se creaza vectorul
ReDim arr(100)

Instructiunea ReDim poate schimba numarul de elemente dintr-un vector dar nu


poate schimba numarul de dimensiuni(rangul) al acestuia. Rangul vectorului se indica
intr-o instructiune Dim prin inserarea numarului potrivit de virgule intre paranteze.
Dim arr( , ) as String ’declara un vector cu 2 dimensiuni (matrice)
Dim arr3( , , ) as Integer ’ declara un vector cu 3 dimensiuni
’creaza vectorii
ReDim arr2(10,10)
ReDim arr3(10,10,10)

Puteti recrea vectorul de oricate ori doriti daca nu modificati numarul de


dimensiuni. Dupa fiecare executie a unei declaratii ReDim, toate valorile memorate la
momentul respectiv in vector se pierd. Puteti folosi ReDim Preserve pentru a pastra
valorile deja existente in vector. Prin folosirea cuvantului-cheie Preserve poate fi
modificata doar limita superioara a ultimei dimensiuni a unui vector multidimensional; la
incercarea de schimbare a oricarei alte dimensiuni sau a limitei inferioare se genereaza o
eroare de compilare.
Dim arr( , ) as String ’declara un vector cu 2 dimensiuni (matrice)
Dim arr3( , , ) as Integer ’ declara un vector cu 3 dimensiuni
’creaza vectorii
ReDim arr2(10,10)
ReDim arr3(10,10,10)
....
ReDim Preserve arr2(10,20)
ReDim Preserve arr3(10,10,20)
’urmatoarele randuri genereaza o eroare de compilare
ReDim Preserve arr2(20,10)
ReDim Preserve arr2(10,20,20)

Initializatori pentru vectori


Puteti initializa valorile dintr-un vector folosind o initializare speciala care consta
dintr-o lista de valori delimitate prin virgula si inchise intre acolade.
Dim arr() As Integer={0,1,2,3,4}’declara si creaza un vector de 5 elemente

Daca se foloseste initializatorul trebuie omis numarul de elemente dintre


paranteze. Cand creati vectori multidimensionali, trebuie sa indicati rangul vectorului si
trebuie sa folositi grupuri imbricate de acolade.
’declara si creaza un vector bidimensional de siruri cu 2 randuri si 3 coloane
Dim arr2(,) As String={{„a”,”b”,”c”},{ „d”,”e”,”f”}}

Pentru a manipula eficient un vector multidimensional, pot fi folosite buclele For


imbricate. De exemplu, urmatoarele instructiuni initializeaza fiecare element din
MatriceA cu o valoare bazata pe locul acestuia in matrice:
Dim i As Integer, j As Integer
Static MatriceA(1 To 10, 1 To 10) As Double
For i = 1 To 10
For j = 1 To 10
MatriceA(i, j) = i * 10 +j
Next j
Next i

2.2 Instructiuni de decizie

Instructiunile de decizie permit controlul desfasurarii programului. Acestea testeaza


conditii si in functie de rezultat efectueaza operatii diferite. Instructiunile logice din
Visual Basic, denumite si structuri de decizie, sunt:
• If ... Then
• If ... Then ... Else
• Select Case

Instructiunea If...Then...Else
Principala instructiune de decizie este blocul If...Then...Else...End If. Visual Basic
suporta mai multe variante ale acestei instructiuni inclusiv versiunile pe una sau mai
multe linii.
' Versiunea pe o singura linie, fara clauza else
If x > 0 Then y = x
' Versiunea pe o singura linie, cu clauza else
If x > 0 Then y = x Else y = 0

' Versiunea pe mai multe linii a instructiunii de mai sus(mai lizibila)


If x > 0 Then
y = x
Else
y = 0
End If

' Exemplu de folosire a unui bloc If_ElseIf..Else


If x > 0 Then
y = x
ElseIf x < 0 Then
y = x * x
Else ' X este cu siguranta 0, nu mai este nevoie sa il testam.
x = -1
End If

Deseori o instructiune If combina mai multe expresii de tip boolean folosind


operatorii AndAlso, OrElse, Not.
Aceasta instructiune se foloseste la executia conditionata a uneia sau mai multor
instructiuni. Se poate folosi sintaxa pe un singur rand sau sintaxa de bloc:
If conditie Then instructiune

If conditie Then
instructiuni
End If

unde, conditie este de obicei o comparatie, dar poate fi si o expresie care se poate evalua
la o valoarea de tip boolean. Cand conditie este True Visual Basic executa toate
instructiunile care urmeaza dupa cuvantul cheie Then.
De exemplu, daca se doreste afisarea unui mesaj pentru utilizatorii care furnizeaza
parola corecta, atunci se poate folosi urmatoarea structura If ... Then:
If (strUserPass = strSystemPass) Then
MessageBox.Show(”Parola se afla in fisierul MyUser.txt!”)
End If

S-a considerat ca parola corecta se afla intr-un fisier si a fost depusa anterior in
variabila string strSystemPass. Parola furnizata de utilizator se citeste in variabila string
strUserPass. Daca utilizatorul a dat parola corecta se va semnaliza sonor si se va afisa
mesajul ”Noua parola se afla in fisierul MyUser.txt!”. Daca, in schimb, parola a fost
gresita, programul continua cu instructiunile de dupa End If fara a executa instructiunile
din structura If.

Instructiunea de comparare If ... Then ... Else


Un bloc If ... Then ... Else se foloseste pentru a defini mai multe blocuri de
instructiuni dintre care unul singur este executat:
If conditie1 Then
bloc de instructiuni 1
ElseIf conditie2 Then
bloc de instructiuni 2 ...
Else
bloc de instructiuni n
End If
Visual Basic testeaza intai conditie1. Daca ea are valoarea False, continua testarea
cu conditie2 si asa mai departe pana ce gaseste o conditie cu valoarea True. In acel
moment, Visual Basic executa blocul de instructiuni corespunzator si apoi continua cu
codul care urmeaza dupa End If. Ca optiune, poate fi inclus un bloc de instructiuni Else,
care va fi executat in cazul in care nici una din conditii nu are valoarea True.
De exemplu, aceasta instructiune se poate folosi pentru a determina raspunsul
utilizatorului la o caseta de dialog simpla, cu doua butoane Yes si No:
If (MessageBox.Show("Sunteti gata", "", MessageBoxButtons.YesNo) =
Windows.Forms.DialogResult.Yes) Then
MessageBox.Show("Ati raspuns ""Yes"" !")
Else
MessageBox.Show("Ati raspuns ""No"" !")
End If

Instructiunea Select Case


Dupa cum s-a prezentat pana acum pentru realizarea ramificarilor in program se
utilizeaza instructiune If, cu formele sale If…Then si If…Then…Else. Dar, in cazurile in
care se lucreaza cu foarte multe conditii, ajungandu-se la peste patru instructiuni If una in
alta, codul devine greu de scris si inteles (ca, de exemplu, ”If this is true, then if this is
true, then do something, else if this is true do something, else if this is true do
something”).
Formatul instructiunii Select Case de baza este:
Select Case Expresie
Case Valoare1Expresie
Bloc de instructiuni
[Case Valoare2Expresie
Bloc de instructiuni]
[Case Else
Bloc de instructiuni]
End Select

Asa cum se poate vedea, Select Case alege dintre cateva conditii. Pot exista oricat de
multe seturi de Case ValoareExpresie. Expresiile utilizare pot fi expresii numerice (cu
constante si variabile) sau siruri de caractere. Altfel spus, expresiile nu sunt expresii
conditionale (cu valori True sau False), ci expresii care au valori intregi sau de tip
caracter.
Linia Case Else este optionala, dar linia End Select este obligatorie, ca terminator al
instructiunii Select Case.
Aceasta instructiune nu este la fel de versatila ca si instructiunea If in privinta
faptului ca poate testa numai o singura expresie cu o lista de valori. Fiecare bloc Case
poate contine mai multe teste si poate de asemenea folosi cuvantul cheie “To” pentru a
specifica o gama de valori.
' Testeaza primul caracter din variabila firstName.
Dim ch As Char = firstName.Chars(0)
Select Case ch
Case "0"c To "9"c
' este o cifra.
Case "A"c To "Z"c, "a"c To "z"c
' este o litera.
Case "."c, ","c, " "c, ";"c, ":"c, "?"c
' este un spatiu sau un semn de punctuatie.
Case Else
' este altceva.
End Select

De asemenea se pot folosi si operatori de comparatie in blocurile Case. Acesti


operatori trebuie sa fie precedati de cuvantul cheie „Is”.
Case Is < "0"c, Is > "9"c
' nu este o cifra.

Cuvantul cheie Exit Select permite iesirea din structura Select inainte ca fluxul de
controlul sa ajunga la sfarsitul blocului Case.
Cea mai eficienta tehnica de optimizare cu blocul Select Case este sa mutati cele mai
fregvente cazuri in partea de sus a structurii. De exemplu, in exemplul de cod de mai sus
poate doriti sa testati daca caracterul este o litera inainte de a testa daca este o cifra.
Aceasta tehnica poate mari putin viteza de executie a codului in cazul in care lucrati cu
text care contine mai multe cuvinte decat numere.
In continuare se prezinta un exemplu simplu de folosire a acestei instructiuni.
Private Sub btnOk_Click(sender As Object, e as EventArgs)Handles btnOk.Click
'Pe baza varstei afiseaza ce vehicul se poate conduce
Dim intAge As Integer=0
intAge = Integer.Parse(txtAge.Text)
Select Case intAge
Case Is < 14
MessageBox.Show("Poti conduce o bicicleta!")
Case 14 To 18
MessageBox.Show ("Poti conduce un scuter!")
Case Is > 18
MessageBox.Show ("Poti conduce o masina!")
End Select
End Sub

In exemplul de mai sus utilizatorul introduce o varsta in caseta de text txtAge. Daca
varsta pe care a introdus-o este mai mica de 14 programul afiseaza mesajul „Poti conduce
o bicicleta”, daca varsta este intre 14 si 18 programul va afisa mesajul „Poti conduce un
scuter”, iar daca varsta introdusa este mai mare de 18 mesajul afisat este „Poti conduce o
masina”.

2.3 Instructiuni de buclare


Instructiunile de buclare sunt instructiuni care contin o bucla. Se numeste bucla un
bloc de instructiuni care se executa in mod repetat.
In Visual Basic exista doua tipuri diferite de instructiuni de buclare, si anume bucla
de tip Do…Loop si bucla de tip For…Next. Aceste instructiuni repeta un bloc de
instructiuni pana cand se realizeaza o anumita conditie. Una dintre erorile des intalnite in
programele care contin bucle este realizarea incorecta a inchiderii buclei sau impunerea
unei conditii gresite (sau care nu se poate realiza), ceea ce conduce la bucle fara sfarsit.

Bucla For...Next
Aceasta instructiune se poate folosi pentru a executa un bloc de cod de un numar
predefinit de ori. In continuare se prezinta sintaxa acestei instructiuni.
For contor [As tip de date] = startValue To endValue [Step increment]
' instructiuni care se executa in bucla...
Next

Contor este o variabila numerica utilizata pentru a controla numarul de bucle


realizate. La inceputul iteratiei contor e initializat cu valoarea startValue. La fiecare
iteratie realizata variabila contor se modifica, prin incrementarea sau decrementarea cu
valoarea pasului „increment”. Daca clauza Step este omisa pasul de incrementare este
implicit 1.
Clauza Step este optionala si poate fi folosita pentru numararea inversa sau cu
incrementi diferiti de 1. Clauza „As” nu este obligatorie dar este recomandata pentru a
evita folosirea aceleiasi variabile cand bucla se termina. Puteti parasi bucla inainte ca
variabila de control a acesteia sa ajunga la limita superioara folosind cuvantul cheie Exit
For.
' Gaseste primul element 0 dintr-un vector de numere intregi.
For i As Integer = 0 To UBound(arr)
If arr(i) = 0 Then
Console.WriteLine("Elementul este la pozitia {0}", i)
Exit For
End If
Next

Visual Basic introduce cuvantul cheie Continue For, care permite trecerea la
urmatoarea iteratie din bucla fara a mai executa instructiunile care se gasesc dupa acest
cuvant cheie.
' Proceseaza numai elementele diferite de 0 din vector.
For i As Integer = 0 To UBound(arr)
If arr(i) = 0 Then Continue For
' Instructiunile urmatoare sunt procesate numai daca arr(i) <> 0.

Next

Variabila de control poate fi orice tip de date numeric, dar in practica este recomandat
sa se foloseasca numai variabile de tip Integer sau Long. Cand se foloseste, o variabila de
control de tip Integer sau Long este cu pana la 10 ori mai rapida decat una de tip Single,
Double sau Decimal.
In continuare se prezinta un exemplu de folosire a acestei instructiuni. Acest exemplu
realizeaza adunarea tuturor elementelor unui vector.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim arr() As Integer = {1, 4, 2, 7, 8} 'vector de 5 elemente
Dim suma As Integer = 0 'variabila care tine suma elementelor
For i As Integer = 0 To arr.Length - 1
suma = suma + arr(i)
Next
MessageBox.Show(suma)
End Sub
In exemplul de mai sus nu se specifica clauza Step si deci pasul de iteratie este
considerat in mod implicit 1. Programul de mai sus realizeaza insumarea tuturor
elementelor din vectorul arr, aceasta suma fiind depusa in variabila suma si apoi afisata
sub forma de masaj folosind functia MessageBox.Show.
In continuare se va prezenta un program care numara pana la 10 din 2 in 2. Dupa
cum se poate observa in codul de mai jos se va folosi clauza Step pentru a face pasul de
iterare 2.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
For i As Integer = 0 To 10 Step 2
MessageBox.Show(i)
Next
End Sub

Bucla For Each…Next


Aceasta bucla permite “vizitarea” fiecarui element al unui vector sau colectii.
Spre deosebire de bucla For…Next variabila de control poate fi acum de orice tip de date.
In continuare se prezinta un exemplu simplu de folosire a acestei instructiuni.
Dim arr() As Integer = {1, 2, 3}
For Each i As Integer In arr
Console.WriteLine(i)
Next

Acest exemplu realizeaza afisarea fiecarui element din vector. In interiorul buclei
cand trebuie sa se faca referire la un element din vector se va folosi variabila de control
“i” in loc de arr(i).

Bucla Do…Loop
Structura Do…Loop este mai flexibila decat bucla For…Next prin faptul ca puteti
pune testarea conditiei de terminare fie la inceputul, fie la sfarsitul buclei. In cazul in care
conditia de terminare se testeaza la sfarsitul buclei instructiunile din bucla vor fi
executate cel putin o data.
Sintaxa acestei instructiuni este prezentata mai jos.
Do While conditie ’executa atata timp cat conditie este adevarata
Bloc de instructiuni
Loop

Do
Bloc de instructiuni
Loop Until conditie ’executa pana cand conditia este adevarata

Se poate folosi fie clauza Where, fie clauza Until ca in exemplele de mai jos.
' Exemplu de bucla Do loop care testeaza conditia de terminare la inceput
' Aceasta bucla nu se executa niciodata daca x <= 0.
Do While x > 0’executa atata timp cat x > 0
y = y + 1
x = x \ 2
Loop
' Exemplu de bucla Do loop care testeaza conditia de terminare la sfarsit
' Aceasta bucla se executa cel putin o data chiar daca x <= 0.
Do
y = y + 1
x = x \ 2
Loop Until x <= 0’executa atata timp cat x<=0

' Bucla infinita-necesita o instructiune Exit Do pentru a parasi bucla.


Do

Loop

Puteti parasi o bucla Do…Loop in orice moment folosind instructiunea Exit Do


sau puteti trece la pasul urmator de iterare si sa sariti peste instructiunile ramase folosind
instructiunea Continue Do.
Do
y = y + 1
x = x \ 2
' Sare peste instructiunile ramase in bucla daca x par.
If (x Mod 2) = 0 Then Continue Do

Loop Until x <= 0

In continuare se va prezenta acelasi exemplu de adunare a elementelor unui


vector, dar de aceasta data se va folosi bucla Do…Loop.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim arr() As Integer = {1, 4, 2, 7, 8} 'vector de 5 elemente
Dim suma As Integer = 0 'variabila care tine suma elementelor
Dim contor As Integer=0 ’
Do While(contor<arr.Length)
suma=suma+arr(contor)
contor=contor+1 ’incrementeaza contorul
Loop
MessageBox.Show(suma)
End Sub

Variabila contor care este testata in cadrul buclei este contor. Atata timp cat
contor are valoarea mai mica decat numarul de elemente din vector se executa
instructiunile din bucla. Bucla se executa pana cand valoarea lui contor devine egala cu
numarul de elemente din vector. Deci singurul mod prin care se poate termina este prin
variabila contor, aceasta fiind modificata in cadrul buclei. Instructiunea contor=contor+1
realizeaza incrementarea variabilei contor de fiecare data cand se executa bucla.
In general nu are nici un sens sa se foloseasca o bucla Do…Loop daca se poate
ajunge la acelasi rezultat prin folosirea unei bucle For…Next, dar exista o exceptie. Sa
presupunem ca aveti doua bucle For imbricate si ati vrea sa iesiti din ambele bucle din
interiorul celei de-a doua bucle.
For i As Integer = 1 To 10
For j As Integer = 1 to 20
' Daca functia Evaluate returneaza 0, vreti sa iesiti din amandoua
buclele, dar acest cod nu merge cum trebuie.
If Evaluate(i, j) = 0 Then Exit For

Next
Next

Instructiunea Exit For poate iesi numai din bucla cea mai din interior. Pentru a
obtine rezultatul dorit trebuie folosite 2 tipuri de bucle.
For i As Integer = 1 To 10
Dim j As Integer = 1
Do While j <= 10
' Iasa din bucla For
If Evaluate(i, j) = 0 Then Exit For

' Se pregateste pentru iteratia urmatoare.
j += 1
Loop
Next

Bucle imbricate
In interiorul unei bucle For…Next pot fi plasate orice instructiuni Visual Basic, chiar
si o alta bucla For…Next. Atunci cand in interiorul unei bucle se afla alta bucla, se spune
ca avem bucle imbricate(nested loops).
Buclele imbricate sunt folosite atunci cand programul trebuie sa repete o bucla de un
anumit numar de ori. In fig.2.9. se prezinta un exemplu de bucla imbricata. Se poate
spune ca bucla interioara este mai rapida, adica se executa mai repede, decat bucla
exterioara, care asteapta dupa cea interioara.
Bucla interioara este cea care numara de la 1 la 10. Aceasta bucla este mai rapida
deoarece variabila In parcurge intregul domeniul de la 1 la 10 inainte ca variabila Out a
buclei exterioare sa termine prima iteratie. Cand bucla exterioara trece la o noua iteratie,
bucla interioara porneste din nou. Astfel, bocul de instructiuni din bucla interioara se
executa de 40 de ori in total.
O sursa de erori o reprezinta plasare incorecta a instructiuni Next. Intotdeauna bucla
interioara este cea care se termina prima, deci primul Next trebuie sa fie al buclei
interioare.
In contionuare se prezinta un exemplu de utilizare a buclelor imbricate.
Private Sub nested2()
' Bucla interioara este controlata de variabila buclei exterioare
For intOut as Integer = 5 To 1 Step -1
For intIn as Integer= 1 To intOut
MessageBox.Show(intOut & ” ” & intIn)
Next intIn
Next intOut
End Sub

In exemplul de mai sus variabila de control a buclei interioare depinde de variabila de


control a buclei exterioare.
Fig.2.1. Doua bucle imbricate

2.4 Lucrul cu proceduri


Sarcina de a programa poate fi mult usurata impartind programul in componente
logice mai mici. Aceste componente – numite proceduri – pot deveni baza pentru a
imbunatati, extinde si reutiliza aplicatiile in Visual Basic.
Procedurile sunt utile pentru a compacta sarcinile repetabile sau partajabile, precum
calculele care se repeta foarte des, manipularea textului si a controalelor sau operatiilor
cu baze de date.
Visual Basic suporta doua tipuri de proceduri (metode), care pot avea vizibilitate
Public, Private, Friend, Protected si Protected Friend. Daca nu se specifica nici un
modificator de acces, vizibilitatea procedurii (metodei) este implicit publica (Public). O
procedura marcata cu cuvantul cheie Function poate returna o valoare, pe cand o
procedura marcata cu cuvantul cheie Sub nu poate returna nici o valoare. Codul care
cheama procedura poate decide sa ignore valoarea returnata de functie si sa trateze
functia ca si cum ar fi o procedura de tip Sub.
' Daca PrintReport este o functie care returneaza o valoare de tip boolean,
amandoua instructiunile care urmeaza sunt valide.
Dim ok As Boolean = PrintReport()
PrintReport()

Definitia unei proceduri poate include parametri declarati cu cuvintele cheie ByVal,
ByRef, Optional si ParamArray.

Procedurile Sub
O procedura Sub este un bloc de cod executat ca raspuns la un eveniment. Divizand
codul unui modul in proceduri Sub, este mult mai usoara gasirea sau modificarea unei
portiuni de cod din cadrul aplicatiei.
Sintaxa unei proceduri Sub este urmatoarea:
Private|Public|Friend|Protected [Shared] Sub nume_procedura (argumente)
instructiuni
End Sub

La fiecare apel al procedurii vor fi executate instructiunile dintre Sub si End Sub.
Instructiunea End Sub este adaugata automat de Visual Basic atunci cand se scrie
instructiunea de declarare a procedurii Sub. Procedurile Sub pot fi inserate in module
standard, module clasa sau module formular.
In Visual Basic 2005 lista de argumente care sunt date procedurii trebuie scrisa intre
paranteze, fie ca este apelata o procedura Sub sau o procedura Function. Cuvantul cheie
Call este optional, iar in practica este rar folosit.
Sub ProcOne()
ProcTwo(123, "abc") ’se apeleaza procedura ProcTwo
' De asemenea se poate folosi si cuvantul cheie Call.
Call ProcTwo(456, "def")
End Sub

Sub ProcTwo(ByVal cantitate As Integer, ByVal mesaj As String)



End Sub

In Visual Basic se face distinctie intre doua tipuri de proceduri Sub, si anume:
• proceduri generale;
• proceduri eveniment.

Proceduri generale
O procedura generala spune aplicatiei cum sa efectueze o anumita operatie. O data ce
o procedura generala este definita, ea trebuie apelata explicit de catre aplicatie. O
procedura eveniment ramane inactiva pana cand este apelata pentru a raspunde la
evenimente determinate de utilizator sau declansate de sistem.
Unul dintre motivele pentru care procedurile generale sunt necesare este faptul ca
mai multe proceduri eveniment ar putea sa aiba nevoie sa execute aceleasi actiuni. O
strategie de programare corecta este plasarea instructiunilor comune intr-o procedura
distincta (o procedura generala) si apelarea ei de catre procedurile eveniment. Aceasta
elimina necesitatea de a duplica acel cod si face aplicatia mai usor de intretinut.

Proceduri eveniment
Cand un obiect Visual Basic recunoaste aparitia unui eveniment, el apeleaza automat
procedura eveniment folosind numele controlului care a generat evenimentul si numele
corespunzator evenimentului.
O procedura eveniment are urmatoarea sintaxa:
Private Sub numeCtrl_numeEvent(sender as Object, e As EventArgs)Handles
numeCtrl.numeEvent

End Sub

Unde Private este modificatorul de acces al procedurii eveniment,


numeCtrl_numeEvent este numele procedurii. Acest nume este generat implicit de VB in
functie de numele controlului si numele evenimentului generat. Cele doua argumente din
paranteze sunt „sender” si respectiv „e”. Argumentul „sender” este de tip Object si
reprezinta controlul care a generat evenimentul, iar argumentul „e” este de tip EventArgs
si poate contine date aditionale despre eveniment. Tipul de date al argumentului „e”
difera in functie de tipul de eveniment generat.
Partea din definitia procedurii care ii spune lui VisualBasic ce control a generat si ce
eveniment este „Handles numeCtrl.numeEvent”. Aici numeCtrl este numele controlului
care a generat evenimentul si numeEvent este evenimentul generat de controlul numeCtrl.
Proceduri Function
Visual Basic cuprinde functii incluse, sau intrinseci, precum Math.Sqrt, Math.Cos. In
plus, instructiunea Function poate fi folosita pentru a scrie propriile proceduri Function.
Sintaxa unei proceduri Function este urmatoarea:
Private|Public|Protected|Friend [Shared] Function nume_procedura (argumente) As
tip
Instructiuni
Return valoare
End Function

Ca si procedurile Sub, o procedura Function este o procedura distincta care preia


argumente, executa o serie de instructiuni si schimba valoarea argumentelor sale. Spre
deosebire de procedurile Sub, o procedura Function poate returna o valoare catre
procedura apelanta.
De exemplu, se poate scrie o functie care calculeaza ipotenuza unui triunghi
dreptunghic atunci cand se dau valorile catetelor:
Function Ipotenuza(A As Integer, B As Integer) As String
Ipotenuza = Sqr(A ^ 2 + B ^ 2)
End Function

Aceasta procedura Function este apelata la fel cum este apelata orice functie
incorporata din Visual Basic. De exemplu:
lbl1.Text = Ipotenuza(Integer.Parse(Text1.Text),Integer.Parse(Text2.Text))
’valorile catetelor se introduc in doua casete de text

sau
strX = Ipotenuza (Width, Height) ’valorile catetelor se afla in doua
variabile

Argumente declarate cu ByVal si ByRef


Un parametru al unei proceduri poate fi declarat folosind fie cuvantul cheie ByVal,
fie, cuvantul cheie ByRef, fie nici unul. Acesti parametrii se declara ca si variabilele
numai ca fara a folosi cuvantul cheie Dim. Daca este folosit ByVal (sau daca nu se
specifica nici un cuvant), argumentul este declarat prin valoare. Pentru a se asigura ca nu
exista nici o ambiguitate, Visual Basic insereaza automat cuvantul ByVal. Cand se
apeleaza o astfel de procedura, se realizeaza o copie a argumentului si aceasta copie este
data procedurii. Daca procedura modifica parametrul, valoarea originala a acestuia nu
este afectata.
Daca un parametru este declarat cu cuvantul cheie ByRef, atunci cand se apeleaza
procedura orice modificare a parametrului in interiorul procedurii afecteaza valoarea
originala a argumentului.
In continuare se prezinta 2 exemple simple care ilustreaza aceste doua concepte.
Module Module1 ’trecerea parametrilor prin valoare
Public Sub ProcUnu(ByVal x As Integer)
x = x + 2
End Sub
Sub Main()
Dim a As Integer = 0
Console.WriteLine(a) ’afiseaza 0
ProcUnu(a)
Console.WriteLine(a) ‘afiseaza 0
Console.ReadLine()
End Sub

End Module

Dupa cum se observa, metoda (procedura) ProcUnu are ca parametru o variabila de


tip intreg. Acest parametru a fost declarat cu cuvantul cheie ByVal. Linia de cod din
interiorul procedurii modifica valoarea parametrului dat acestei proceduri, prin
incrementare cu 2.
Metoda Main declara o variabila „a” pe care o initializeaza cu 0 si pe care o va trece
ca parametru procedurii (metodei) ProcUnu. A doua linie de cod a metodei Main afiseaza
valoarea variabilei „a” inaintea chemarii metodei ProcUnu (acesta valoare va fi 0). In
linia a 3 a se cheama metoda ProcUnu dandu-i ca argument variabila „a”. Aceasta metoda
realizeaza incrementarea parametrului „a”, acesta devenind in interiorul metodei 2.
Deoarece parametrul x a fost definit folosind cuvantul cheie ByVal valoarea initiala a
variabilei „a” nu va fi modificata la terminarea metodei. Acest lucru este evidentiat si de
linia 4 de cod care va afisa valoarea variabilei a dupa chemarea metodei ProcUnu.
Variabila „a” va ramane neschimbata desi a fost modificata in cadrul metodei.
Module Module1
Public Function ProcUnu(ByRef x As Integer) As Integer
x = x + 2
End Function
Sub Main()
Dim a As Integer = 0
Console.WriteLine(a)
ProcUnu(a)
Console.WriteLine(a)
Console.ReadLine()
End Sub
End Module

Singura deosebire intre acest cod si cel de dinainte este declararea parametrului
metodei folosind cuvantul cheie ByRef. Daca se mai ruleaza o data codul se observa o
diferenta si anume aceea ca valoarea variabilei „a” dupa chemarea metodei ProcUnu este
2 in loc de 0. Aceasta s-a intamplat din cauza ca, folosirea cuvantului cheie ByRef pentru
declararea parametrului face ca metoda sa nu mai foloseasca o copie a valorii variabilei
trecuta functiei ci chiar valoarea acestei variabile. Acest lucru duce la modificarea valorii
originale a variabilei date ca argument metodei.

Cuvantul cheie Optional


Se pot defini parametrii optionali pentru o metoda folosind cuvantul cheie Optional.
Dar daca se foloseste aceasta metoda de declarare a parametrilor trebuie ca pentru fiecare
din acesti parametrii optionali sa se specifice in mod explicit o valoare implicita chiar
daca aceasta valoare este 0, un sir nul sau Nothing. In continuare se prezinta un exemplu
pentru definirea unei metode cu parametrii optionali.
Sub MyProc(Optional ByVal n As Integer = -1, _
Optional ByVal p As Person = Nothing, Optional ByVal s As String = "")

End Sub

Daca altundeva in program se apeleaza aceasta procedura se pot omite parametrii


optionali ca si in codul care urmeaza.
MyProc(1) ' se omit al doilea si al treilea argument.
MyProc(, , "abc") ' se omite primul si al doile argument.

Cand se omite un parametru optional Visual Basic verifica definitia procedurii si


creaza un argument invizibil care are aceeasi valoare cu valoarea implicita a parametrului
omis. In continuare se prezinta un exemplu de folosire a parametrilor optionali.
Module Module1
Public Function Suma(Optional ByVal x As Integer = 0, Optional ByVal y As
Integer = 0) As Integer
Return x + y
End Function
Sub Main()
Dim sum As Integer = 0
sum = Suma()
Console.WriteLine(sum)
sum = Suma(2)
Console.WriteLine(sum)
sum = Suma(3, 2)
Console.WriteLine(sum)
Console.ReadLine()
End Sub
End Module

Dupa cum se observa, metoda (functia) Suma are 2 parametrii optionali a caror
valoare implicita este 0. Aceasta metoda poate fi acum chemata fara a i se da vreun
argument, caz in care se folosesc valorile implicite specificate in semnatura metodei. A
doua linie de cod din metoda Main cheama metoda Suma fara nici un argument si
rezultatul returnat va fi 0, dupa cum se poate observa din rularea codului. A 4 a linie de
cod cheama metoda Suma dand o valoare numai parametrului x. Pentru parametrul y
metoda va folosi valoarea implicita. Rezultatul Sumei in acest caz va fi 2. A 6 a linie de
cod da valori ambilor parametrii ai metodei si prin urmare rezultatul returnat va fi suma
acestor doi parametri.

Folosirea cuvantului cheie ParamArray


Se pot crea metode care pot lua orice numar de argumente folosind cuvantul cheie
ParamArray. Se pot crea vectori de argumente de orice tip. Sunt de mentionat 3 lucruri
importante:
• Argumentele ParamArray sunt trecute prin valoare, deci modificarea lor in
interiorul metodei nu va afecta valoarea originala.
• Nu se poate omite niciun parametru la o procedura care se asteapta sa primeasca
un vector de parametrii.
result=Suma(1, ,3) ’aceasta linie de cod va genera o eroare de compilare
• Se pot da ca argumente variabile de tip vector metodelor care asteapta argumente
ParamArray
Dim arr() as Integer={1,2,3}
result=Suma(arr)
Este interesant ca acest tip de parametru este un vector si i se pot aplica toate
metodele definite pentru vectori de catre .NET.
In continuare se prezinta niste exemple simple de folosire a acestui tip de parametru.
Module Module1
Public Function Suma(ByVal ParamArray arr() As Integer) As Integer
Dim i As Integer = arr.Length ’determina numarul de argumente date
functiei
Dim s As Integer = 0
For j As Integer = 0 To i - 1
s = s + arr(j)
Next
Return s
End Function
Sub Main()
Dim sum As Integer = 0
Dim arr1() As Integer = {1, 2, 3}’declara un vector de 3 elemente
sum = Suma(1, 5, 8)’cheama functia Suma cu 3 argumente
Console.WriteLine(sum)
sum = Suma(arr1)’cheama functia Suma dandu-i ca argument un vector
Console.WriteLine(sum)
Console.ReadLine()
End Sub
End Module

Metoda Suma are declarat un parametru de tip intreg folosind cuvantul cheie
ParamArray. Aceasta inseamna ca metodei i se poate da ca argument un vector de
numere intregi de orice lungime. Metoda Main arata 2 moduri de folosire a unei astfel de
functii: prin specificarea fiecarui argument in parte sau prin declararea unui vector si
trecerea lui ca argument pentru metoda respectiva.
Aceasta metoda de definire a parametrilor pentru metode (proceduri/functii) este
suportata numai de Visual Basic. O alta metoda, care este suportata de toate limbajele din
pachetul Visual Studio si care are acelasi rezultat poarta numele de method overloading.
Aceasta metoda este recomandata in locul celei care foloseste cuvantul cheie Optional.
Tehnica method overloading presupune crearea mai multor metode (proceduri sau
functii) cu acelasi nume si care difera numai prin semnatura lor. Semnatura unei metode
este formata din: numele metodei, numarul de parametrii si tipul de date al acestor
parametrii.
Public Function DoubleIt(ByVal x As Long) As Long
instructiuni
End Function

In exemplul de mai sus se prezinta o functie al carui nume este DoubleIt si care ia un
singur argument de tip Long. Semnatura acestei metode este formata din numele ei si
numarul si tipul argumentelor sale asa cum se prezinta mai jos.
DoubleIt(Long)’semnatura functiei

In continuare se prezinta un alt exemplu de metoda si semnatura acesteia.


Public Function Suma(x As Integer, y As Integer) As Integer
instructiuni
End Function

Metoda de mai sus se numeste DisplayCalculatedCost si ia doua argumente de tip


Integer. Semnatura acestei functii este Suma(Integer, Integer).
Dupa cum se poate observa tipul de date returnat de functie nu este considerat ca
facand parte din semnatura metodei. Acest lucru defineste una din regulile acestei tehnici
si anume ca doua metode (functii) nu pot diferi numai prin tipul de date returnat.
Pentru aplicarea tehnicii method overloading trebuie respectate urmatoarele reguli:
• Fiecare metoda (functie, procedura) trebuie sa difere de celalalte prin una sau mai
multe din urmatoarele:
o Numarul de parametrii
o Tipul de date al parametrilor
o Ordinea parametrilor
• Fiecare metoda ar trebui sa aiba acelasi nume; altfel se creaza metode complet
diferite.
Aceasta tehnica ar trebui sa fie aplicata pentru a oferi metode diferite dar care fac
sintactic acelasi lucru. Mai mult de o metoda cu acelasi nume poate fi definita in acelasi
modul sau clasa atata timp cat metodele difera prin semnatura lor.
Pentru folosirea acestei tehnici se poate folosi cuvantul cheie Overloads, dar acesta
este optional. Daca insa se foloseste pentru o metoda, atunci trebuie folosit pentru toate.
In continuare se prezinta un exemplu simplu de folosire a tehnicii overloading.
Module Module1

Public Function Suma(ByVal x As Integer) As Integer


Return x + 2
End Function
Public Function Suma(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function
Sub Main()
Dim sum As Integer = 0
sum = Suma(3, 5)
Console.WriteLine(sum)
Console.ReadLine()
End Sub

End Module

Dupa cum se observa cele doua metode Suma au o lista diferita de parametri.
Functionalitatea InteliSense oferita de mediul VisualStudio recunoaste acest tip de
metode si listeaza sintaxa de folosire pentru fiecare dintre ele.

Se poate iesi dintr-o metoda (functie, procedura) si reda controlul codului care a
chemat-o in 3 moduri distincte. Aceasta se face prin folosirea cuvintelor cheie ExitSub,
ExitFunction si Return. Procedurile de tip Function pot returna o valoare prin atribuirea
acelei valori numelui functiei sau prin folosirea cuvantului Return ca in exemplul de mai
jos.
Function DoubleIt(ByVal x As Long) As Long
DoubleIt = x * 2
End Function

Function DoubleIt(ByVal x As Long) As Long


Return x * 2
End Function

Prima functie returneaza o valoare prin atribuirea acelei valori numelui functiei, iar
cea de a doua prin folosirea cuvantului Return.
Folosirea cuvantului Return este recomandata pentru returnarea unei valori dintr-o
functie mai ales in cazul in care o functie are mai multe puncte posibile de iesire,
deoarece scuteste programatorul de a mai scrie in mod explicit ExitFunction. Folosirea
cuvantului Return fara un argument cauzeaza iesirea imediata din procedura. Un alt
avantaj al folosirii cuvantului Return este ca se poate schimba numele metodei (functiei)
fara a fi nevoie sa se modifice toate instantele numelui metodei (functiei) in interiorul
functiei.
In continuare se prezinta un exemplu de metoda(functie) care are doua puncte
posibile de iesire.
Function DaSauNu(ByVal n As Boolean) As Integer
If(n=True) Then
Return 1 ’returneaza 1 daca n=true
Else
Return 0 ’returneaza 0 daca n=false
End If
End Function

Functia din exemplul de mai sus poate returna 1 sau 0 in functie de valoarea
argumentului boolean „n” care s-a dat functiei.

2.5 Functii predefinite in Visual Basic


Functiile predefinite din Visual Basic au fost incluse pentru a ajuta programatorul si
sunt foarte des folosite. Acestea sunt functii referitoare la date numerice, siruri de
caractere, date calendaristice, ora si formatare.

Functii numerice
Sunt functii care realizeaza conversii si calcule cu date numerice.
Ca orice functie si functiile numerice returneaza o valoare de un anumit tip si
majoritatea acestor functii necesita unul sau mai multe argumente.
Functiile numerice se impart in functii de conversie si functii matematice.

Functii de conversie.
Pentru realizarea conversiilor intre diferitele tipuri de date numerice se folosesc
metodele clasei Convert. Aceste functii convertesc argumentul dat lor in diferite tipuri de
date cum ar fi Boolean, Byte, Char, Decimal, Integer, DateTime etc. In continuare se
prezinta o lista a functiilor de conversie oferite de aceasta clasa.
Convert.ToBoolean() –converteste argumentul dat in echivalentul sau boolean
Convert.ToByte()-converteste argumentul la un intreg pe 8 biti fara semn
Convert.ToChar()-converteste argumentul la un tip de date caracter
Convert.ToDateTime()-returneaza data si /sau ora specificata. Nu se efectueaza
o conversie
Convert.ToDecimal()
Convert.ToDouble()
Convert.ToInt16()
Convert.ToInt32()
Convert.Toint64()
Convert.ToSingle()
Convert.ToString()
Convert.ToBoolean()

Acestea sunt doar o parte a functiilor oferite de clasa Convert.


Argumentele functiilor de conversie numerice pot fi date imediate dar si o expresie
care produce un rezultat numeric. La realizarea unei conversii trebuie sa se tina seama si
de compatibilitate, adica argumentul sa poata fi convertit in tipul de date ales. De
exemplu nu se poate converti numarul 123456789 in Short prin functia ToShort(),
deoarece o data de tip short nu poate stoca un numar atat de mare.
Visual Basic realizeaza conversii implicite de la tipuri de date mai mici la tipuri de
date mai mari (de exemplu de la Byte la Integer, sau de la Integer la Long). Cand se
incearca o conversie de la un tip de date mai mare la un tip de date mai mic (de la Integer
la Byte sau de la Object la Byte sau Integer) se folosesc functiile de conversie expuse de
clasa Convert. Deoarece o variabila de tip Object poate contine orice alta variabila, de
cele mai multe ori trebuie realizata o conversie de la acest tip de date la un alt tip de date
cum ar fi Byte sau String sau un tip de date definit de programator. In continuare se
prezinta cateva exemple de folosire a acestor functii de conversie.
0 Sub Main()
1 Dim a As Byte = 0
2 Dim b As Integer=255
3 Dim obj As Object=300
4 Dim s As String
5 Dim obj2 As Object=”portocale”
6 a=Convert.ToByte(b)’conversia reuseste
7 b=256
8 a=Convert.ToByte(b)’conversia nu reuseste
9 a=Convert.ToByte(obj)’conversia nu reuseste
10 b=Convert.ToInt32(obj)’conversia reuseste
11 b=Convert.ToInt32(obj2)’conversia nu reuseste
12 s=Convert.ToString(obj2)’conversia reuseste
13 Dim obj3 As Object=”123”
14 a=Convert.ToByte(obj3)’conversia reuseste
15 End Sub

Conversia de la linia 6 reuseste deoarece chiar daca variabila „b” este de tip
Integer, aceasta contine o valoare care incape intr-un tip de date Byte. Conversia de la
liniile 8, 9 nu reuseste deoarece valorile variabilelor „b” si respectiv „obj” nu pot intra
intr-un tip de date Byte. Conversia de la linia 10 reuseste deoarece valoarea continuta in
variabila de tip Object „obj” incape intr-o variabila de tip Integer. Conversia de la linia 11
nu reuseste deoarece variabila obj2 contine o valoare de tip String („portocale”) care nu
poate fi convertita la o variabila de tip integer. Conversia de la linia 12 reuseste deoarece
continutul variabilei obj2 poate fi convertit la o variabila de tip String. Conversia de la
linia 13 reuseste deoarece cu toate ca variabila obj3 contine o valoare de tip string,
aceasta valoare este un numar ce poate fi convertit la tipul de date byte. Acest tip de
conversie se poate aplica si in cazul urmator:
Dim s As String=”234”
Dim a As Byte=Convert.ToByte(s)

Pe langa functiile de conversie expuse de clasa Convert, fiecare tip de date (fie ca
este tip primitiv de date sau un tip de date creat de utilizator) expune o metoda pentru
conversia tipului respectiv de date la un sir de caractere. Aceasta metoda se cheama
ToString.
Dim s As String=123’nu este corect
Dim a As Byte=100
Dim ss As String=a’nu este corect
Dim s As String=a.ToString()’ este Ok

Prima si a treia linie de cod de mai sus genereaza o eroare de conversie in alte
limbaje din pachetul Visual Studio 2005, dar nu genereaza o eroare in VB deoarece
functia ToString() este chemata in mod implicit pentru a face conversia de la tipul de date
numeric la tipul de date String. Cu toate ca nu se genereaza o eroare este recomandata
chemarea explicita a functiei ToString dupa cum se arata in ultima linie de cod.

Functia valoare absoluta


Metoda (functia) Abs a clasei Math returneaza valoarea absoluta a argumentului sau.
Aceasta functie afecteaza semnul si valoarea argumentului. Valoarea absoluta este
valoarea pozitiva a argumentului. De exemplu valoarea absoluta a lui 10 este 10, iar
valoarea absoluta a lui -10 este tot 10. Aceasta functie are utilitate practica mai ales in
calculul diferentelor de varsta, greutate sau la calculul distantelor.
Sub Main()
Dim varsta1 As Integer = 15
Dim varsta2 As Integer = 35
Console.WriteLine("diferenta de varsta" & Math.Abs(varsta1 - varsta2))
Console.ReadLine()
End Sub

Functii matematice
Functiile matematice predefinite sunt expuse de clasa Math. Cateva dintre acestea
sunt: Acos, Asin, Atan, Cos, Sin, Log, Sqrt, Tan, Exp.
• Exp returneaza e ridicat la puterea specificata de argumentul functiei.
• Sqrt returneaza radacina patrata din argumentul specificat.
• Log returneaza logaritmul natural al argumentului specificat.
Clasa Math expune si doua constante matematice si anume e=2.718282 si pi=3.1415.

Exemple:
intVar1=Math.Sqrt(4) ’ intVar1=2
intVar1=Math.Sqrt(64) ’ intVar1=8
intVar1=Math.Sqrt(25) ’ intVar1=5

Generarea de numere aleatoare


In mediul de programare .NET generarea de numere aleatoare se face cu ajutorul
obiectului Random si a metodelor expuse de acesta. Obiectul Random expune 3 metode
pentru generare de numere aleatoare si anume: Next, NextByte si NextDouble. In
continuare se prezinta un exemplu simplu de folosire a acestui obiect pentru a genera un
numar aleator.
Sub Main()
Dim r As Random = New Random()
Console.WriteLine(r.Next(0, 5)) ’returneaza un numar aleator intre 0 si 5
Console.WriteLine(r.Next(10)) ’returneaza un numar aleator pana la 10
Console.WriteLine(r.Next()) ’returneaza un numar aleator
Console.ReadLine()
End Sub

Acest exemplu prezinta cele 3 variante ale metodei Next. Prima varianta permite
generarea de numere aleatoare intre o limita inferioara si una superioara, cea de-a doua
permite generarea de numere aleatoare pana la o anumita limita superioara, iar cea de-a 3
a genereaza un numar aleator fara a specifica o limita. Metoda NextDouble este folosita
pentru a genera un numar aleator intre 0.0 si 1.0.
In continuare se prezinta un exemplu simplu in care computerul genereaza un numar
aleator intre doua limite introduse de utilizator de al tastatura.

Exemplu:
Private Sub btnRnd_Click(sender As Object, e As EventArgs)Handles btnRnd.Click

Dim min As Integer =0


Dim max As Integer =0
Dim nr As Random = New Random()

min=Integer.Parse(txtMin.Text)
max=Integer.Parse(txtMax.Text)
MessageBox.Show(String.Format("Numarul random este: {0}", nr.Next(min, max)))

End Sub

In exemplul de mai sus utilizatorul introduce limitele intre care vrea sa genereze un
numar aleator in 2 casete de text txtMin si respectiv txtMax. Apoi programul afiseaza
numarul generat prin intermediul unei casete de mesaj.
In continuare se prezinta un exemplu de joc. Computer-ul genereaza un numar
aleator intre 1 si 100 si apoi, utilizand casete de mesaje, ofera utilizatorului sugestii pana
cand acesta ghiceste numarul. La sfarsit afiseaza un mesaj care informeaza utilizatorul la
a cata incercare a ghicit numarul.
Formularul utilizat contine o eticheta, o caseta cu text si doua butoane de comanda
(fig.2.2.), avand proprietatile setate ca in tabelul urmator.
Fig.2.2. Formularul jocului
Control Proprietate Valoare
Label Text Introduceti numarul:
TextBox Name txtUserNr
Text
Button1 Name btnOK
Text &OK
Button2 Name btnCancel
Text &Cancel

Public Class Form1


‘declaratii de variabile la nivel de clasa
‘acestea vor fi vizibile de catre toata aplicatia
Dim min As Byte=0
Dim max As Byte=100
Dim rnd As Random=new Random()’obiectul random care genereaza numarul
Dim nr As Byte=0’tine numarul generat aleator
Dim contor As Byte=0

Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnCancel.Click
Me.Close()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles MyBase.Load
nr =rnd.Next(min,max)
End Sub

Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnOk.Click
If(nr=Integer.Parse(txtUserNr))Then
MessageBox.Show(“Ai ghicit din ” & contor & “ incercari!”)
Else If (nr<Integer.Parse(txtUserNr) Then
MessageBox.Show(“Prea mare. Mai incearca!!”)
contor=contor+1
Else
MessageBox.Show(“Prea mic. Mai incearca!”)
contor=contor+1
End If
End Sub

End Class

Functii pentru siruri de caractere


Functiile pentru lucrul cu siruri de caractere sunt expuse de clasa String si se
impart in:
• Functii pentru compararea a doua siruri. Cele 3 functii expuse sunt
String.Equals, String.Compare si String.CompareOrdinal
• Functii pentru indexare si cautare. Un sir de caractere este un vector de
caractere care poate fi cautat prin iterare exact ca in cazul unui vector sau prin
folosirea metodelor (functiilor) speciale expuse de clasa String.
• Functii de transformare a sirurilor. Aceasta categorie de functii include functii
pentru inserarea, stergerea, inlocuirea, truncherea sirurilor, precum si functii
pentru despartirea unui sir in mai multe subsiruri.
• Functii pentru formatarea sirurilor. Pentru formatarea sirurilor se foloseste
functia String.Format.

Compararea sirurilor
Cea mai eficienta metoda de a vedea daca doua siruri sunt egale este sa vedem daca
variabilele care contin sirurile arata spre aceeasi zona de memorie. Aceasta se face
folosind functia String.ReferenceEquals(). Aceasta functie ia 2 parametrii de tip Object si
returneaza o valoare booleana in functie de rezultatul comparatiei.
Daca 2 variabile nu arata spre aceeasi adresa de memorie este necesara realizarea unei
comparatii caracter cu caracter. Pentru aceasta mediul .NET ofera metoda String.Equals()
care realizeaza atat o comparare a zonelor de memorie cat si a valorilor variabilelor.
Aceasta operatie se poate descrie in felul urmator: Daca variabilele arata spre aceeasi
zona de memorie atunci sirurile sunt egale, altfel daca adresele nu sunt egale compara
sirurile caracter cu caracter.
In continuare se prezinta un exemplu de folosire a acestei metode.
string poem1 = "Kubla Khan"
string poem2 = "Kubla Khan"
string poem3 = String.Copy(poem2)
string poem4 = "kubla khan"
’//
Console.WriteLine(String.Equals(poem1,poem2)) ’true
Console.WriteLine(poem1.Equals(poem3) ’true
Console.WriteLine(poem1 = poem3) ’echivalent cu Equals
Console.WriteLine(poem1 = poem4) ’false-deoarece un sir contine si litere mari

Cautarea si modificarea sirurilor


Aceasta sectiune descrie metodele (functiile) folosite pentru a realiza diferite sarcini
cum ar fi localizarea unui subsir intr-un alt sir, modificarea de la litere mari la litere mici,
inlocuirea si stergerea caracterelor dintr-un sir, despartirea unui sir in mai multe subsiruri
in functie de un caracter delimitator, stergerea spatiilor de la inceputul si sfarsitul
sirurilor.

Cautarea continutului unui sir


Un sir este un vector de caractere in care indexul primului caracter din sir este 0. Se
poate cauta un caracter intr-un sir folosind sintaxa sir (index), unde index este pozitia
caracterului in sir. Pentru localizarea pozitiei unui subsir intr-un sir se folosesc metodele
IndexOf si IndexOfAny. In tabelul urmator se prezinta un rezumat al fiecarei metode.

Nume functie Descriere


(n) Indexeaza un caracter aflat la pozitia n in
interiorul unui sir
Dim ndx As Integer=0
Do While(ndx<sir.Length)
MessageBox.Show(sir(ndx))
ndx=ndx+1
Loop
IndexOf/LastIndexOf(string,[start],[count]) Returneaza indexul primei/ultimei instante
a unui sir specificat intr-un alt sir. count
este numarul de caractere examinate, iar
start este pozitia din sir de unde se incepa
cautarea.
Dim s As String=”portocale”
Dim n As Integer=s.IndexOf(„or”) ’1
n=s.IndexOf(„a”) ’6
n=s.IndexOf(„a”,4) ’6

Transformarea sirurilor
Tabelul urmator prezinta un sumar al celor mai importante functii de modificare a
sirurilor.

Nume functie Descriere


Insert(nr as Integer,sir as String) Insereaza sirul sir la pozitia nr specificata.
Dim s As String=”portocale”
Dim s2 As String=s.Insert(9,” verzi”)
’s2 contine sirul „portocale verzi”
PadRight/PadLeft Adauga la un sir un caracter specificat pana
cand sirul este de o marime specificata. Daca
nu se specifica nici un caracter, caracterul
spatiu este folosit.
Dim s As String=”test”
s=s.PadRight(s.Length+3,”*”)
’s contine sirul „test***”
Remove(p,n) Sterge „n” caractere incepand de la pozitia
„p”.
Dim s as Atring=”mere verzi”
s=s.Remove(4,6)
’s contine textul „mere”
Replace(A,B) Inlocuieste toate instantele caracterului sau
sirului de caractere A, cu caracterul sau sirul
de caractere B.
Dim s As String=”mere”
s=s.Replace(„e”,”i”)
’s contine textul „miri”

Split(arr() As Char) Vectorul de caractere contine delimitatori care


sunt folositi pentru a imparti sirul in mai
multe subsiruri care sunt apoi returnate ca
elemente ale unui vector de string-uri.
Dim s as String=”mere,pere;caise”
Dim a() as String=s.Split(New Char(){„ ,
”, ” ; ”})
MessageBox.Show(a(2)) ’afiseaza „caise”
ToUpper() ToUpper-stransforma toate literele din sir in
ToLower() litere mari. ToLower-transforma toate literele
din sir in litere mici.
Dim s as String=”poPEscU”
s=s.ToUpper()
’s contine textul „POPESCU”
s=s.ToLower()
’s contine textul „popescu”
Trim() Sterge toate spatiile de la inceputul si sfarsitul
Trim(ParamArray a() as Char) sirului. Daca se specifica un vector de
caractere toate caracterele din vector sunt
sterse de la inceputul si sfarsitul sirului.
Dim s as String=” Popescu**”
s=s.Trim() ’s contine „Popescu**”
s=s.Trim(„*”) ’s contine „Popescu”
TrimStart(ParamArray a() as Char) Sterge caracterele fie de la inceputul, fie de la
TrimEnd(ParamArray a() as Char) sfarsitul sirului. Daca se specifica null,
caracterele spatiu sunt sterse.
Dim s as String=” **Ionescu++”
s=s.TrimStart(null) ’ s contine
„**Ionescu++”
s=s.TrimStart(„*”) ’s contine „Ionescu++”
s=s.TrimEnd(„+”) ’s contine „Ionescu”
Substring(n) Extrage sirul care incepe la pozitia „n” si are o
Substring(n,l) lungime „l”, daca aceasta se specifica. Daca
se specifica numai o pozitie, se extrage sirul
de la pozitia „n” pana la sfarsitul sirului.
Dim s as String=”mere,pere”
s=s.Substring(5,4)’s contine ”pere”
s=s.Substring(5)’s contine „pere”
ToCharArray() Extrage caracterele dintr-un sir si le pune intr-
ToCharArray(n,l) un vector de caractere unicode.
Dim s as String=”aeiou”
Dim a() as Char=s.ToCharArray()
’a(0) este „a”
’a(1) este „e”
’a(2) este „i”

Functia de formatare
Functia de formatare se numeste String.Format si este principala metoda folosita
pentru formatarea datelor numerice si calendaristice. Accepta un argument de tip string
compus din text si elemente speciale de formatare. Pe langa argumentul de tip string
accepta unul sau mai multe argumente care reprezinta datele supuse formatarii. In
continuare se prezinta un exemplu simplu de folosire a acestei metode.
Dim s as String=String.Format(„Radacina patrata a lui {0} este {1}.”,4,2)
’s va contine valoarea „Radacina patrata a lui 4 este 2.”

Aceasta metoda are mai multe variante, dar aceasta este cea mai comuna si ilustreaza
2 elemente importante prezente in toate variantele: un sir de formatare si o lista de
argumente.
Figura urmatoare desparte un exemplu de folosire al metodei Format in elementele
sale componente.

Fig.2.3 Exemplu de folosire a metodei Format

Dupa cum se poate observa fiecare element de formatare contine un index si un string
de aliniere si formatare optional. Toate elementele de formatare sunt incluse intre
acolade.
• Indexul incepe de la 0 si indica argumentul caruia ii va fi aplicat elementul de
formatare. Indexul poate fi repetat pentru a se referi la acelasi argument de
mai multe ori.
• Elementul de aliniere este optional si este un numar intreg care indica latimea
minima a zonei care contine valoarea formatata. Daca aceasta valoare este
pozitiva, valoarea argumentului este aliniata la dreapta, iar daca valoarea este
negativa argumentul este aliniat la stanga.
• Sirul de formatare optional contine codurile de formatare care vor fi aplicate
valorii argumentului.

Formatarea valorilor numerice


Sunt disponibili 9 specificatori de format pentru formatarea numerelor in format
monetar, stiintific, hexazecimal sau in alte reprezentari. Fiecare din acesti specificatori de
format poate avea atasat un numar intreg care specifica precizia specifica formatului.
Caracterele pentru formatarea valorilor numerice sunt:

Specificator Descriere Exemplu Rezultat


de format
C sau c Valoare monetara. Numarul este {0:C2},1458.75 $ 1,458.75
reprezentat sub forma unei valori
monetare. Precizia specifica
numarul de cifre zecimale
D sau d Decimal. Se aplica valorilor intregi. {0:D5},455 00455
Precizia indica numarul total de {0:D5},-455 -00455
spatii pe care il ocupa
numarul.Numarului i se adauga 0
uri in partea stanga daca este
necesar
E sau e Stiintific. Numarul este {0,10:E2},3298.78 3.30+E003
convertit la o notatie stiintifica: {0,10:E4},-54783.4 -
ddddE+nnn. Precizia specifica 5.4783+E004
numarul de digiti dupa virgula.
F sau f Numarul este convertit la un format {0,10:F0},162.57 162
ddd.ddd. Precizia specifica numarul {0,10:F2},8162.57 8162.57
de digiti folositi
G sau g General. Numarul este convertit la {0,10:G},.0000099 9.9E-06
un numar fix sau la o notatie {0,10:G2},455.89 4.6E+02
stiintifica pe baza preciziei si a {0,10:G3},455.89 456
tipului de numar. Formatul stiintific {0,10:G},783229.34 783229.34
este folosit daca exponentul e >=
cu precizia specificata sau <-4
N sau n Numar. Converteste la un sir care {0,10:N},1045.78 1,045.78
foloseste „ , ” ca separator pentru {0,10:N1},45.98 45.9
mii. Precizia specifica numarul de
zecimale folosite.
P sau p Procent. Numarul este inmultit cu {0,10:P},0.78 78.00%
100 si prezentat ca un procentaj cu {0,10:P3},0.7865 78.650%
un numar de zecimale specificat de
precizie
R sau r Round-trip. Converteste numarul la {0,10:R},1.62736 1.62736
un string si retine toti digitii de
precizie. Numarul care trebuie
convertit trebuie un numar cu
virgula.
X sau x Hexazecimal. Converteste numarul {0,10:X},25 19
in reprezentarea sa hexazecimala. {0,10:X4},25 0019
Precizia indica numarul minim de {0,10:x4},31 001f
digiti afisati. Numarului i se adauga
0 uri daca este necesar.

Specificatorii de format pot fi folositi si pentru a inbunatatii rezultatul functiei


ToString.
Dim pct as Decimal=.758
MessageBox.Show(„Procentajul este ” & pct.ToString(„P2”)) ’75.80%

Formatarea datelor cu caractere standard


Format Example—
Specifier Description Example—English German
d Short date pattern 1/19/2004 19.1.2004
D Long date pattern Monday, January 19, Montag, 19 Januar,
2004 2004
f Full date/time pattern (short Monday, January 19, Montag, 19 Januar,
time) 2004 4:05 PM 2004 16:05
F Full date/time pattern (full time) Monday, January 19, Montag, 19 Januar,
2004 4:05:20 PM 2004 16:05:20
g General date/time pattern (short 1/19/2004 4:05 PM 19/1/2004 16:05
time)
G General date/time pattern (long 1/19/2004 4:05:20 19/1/2004 16:05:20
time) PM
M, m Month day pattern January 19 19 Januar
Y, y Year month pattern January, 2004 Januar, 2004
t Short time pattern 4:05 PM 16:05
T Long time pattern 4:05:20 PM 16:05:20
s Universal Sortable Date-Time 2004-01- 2004-01-
pattern. Conforms to ISO 8601. 19T16:05:20 19T16:05:20
Uses local time.
u Universal Sortable Date-Time 2004-01-19 2004-01-19
pattern 16:05:20Z 16:05:20Z
U Universal Sortable Date-Time Monday, January 19, Montag, 19. Januar,
pattern. Uses universal time. 2004 21:05:20 PM 2004 21:05:20

Caractere pentru formatarea datelor


Format Description Example
d Day of month. No leading zero. 5
dd Day of month. Always has two digits. 05
ddd Day of week with three-character abbreviation. Mon
dddd Day of week full name. Monday
M Month number. No leading zero. 1
MM Month number with leading zero if needed. 01
MMM Month name with three-character abbreviation. Jan
MMMM Full name of month. January
Format Description Example
y Year. Last one or two digits. 5
yy Year. Last one or two digits with leading zero if needed. 05
yyyy Four-digit year. 2004
HH Hour in 24-hour format. 15
mm Minutes with leading zero if needed. 20

Functii speciale
Functiile speciale se refera la functiile care lucreaza cu date calendaristice si ore.
Functiile pentru lucrul cu aceste data sunt expuse de catre clasa Date. Acestea permit
citirea datei curente, operatii de adunare si scadere cu data calendaristice si multe altele.