Scrierea de cod reutilizabil Visual Basic
Scrierea programului se face mult mai usor daca împartim
programul în subprograme relativ independente, pentru fiecare din ele
scriindu-se programe mult mai simple. De altfel realizarea unui program de mare
complexitate impune aproape ca necesitate organizarea unor date si a
actiunilor la care acestea trebuie spuse, sub forma de subprograme.
În Visual Bsic exista un mecanism evoluat de declarare si utilizare a
subprogramelor.
În Visula Basic subprogramele sunt de tipuri: proceduri si functii.
Ce
este o procedura ?
Sunt blocuri de cod constituite din instructiuni, date
locale si alte subprograme. Acestea
pot fi utilizate în cadrul altor programe sau a altor
subprograme pentru a îndeplini o anumita sarcina. În Visual Basic
sunt doua tipuri de proceduri: proceduri generale si proceduri eveniment.
Procedurile generale sunt blocuri de cod care îi spun
aplicatiei cum sa îndeplineasca o
anumita sarcina. O data creata o procedura
generala trebuie invocata în mod explicit de catre
aplicatie pentru a se executa codul ce-l contine.
Procedurile eveniment sunt blocuri de cod asociate diferitelor evenimente
recunoscute de un obiect (control sau forma)
si acre se executa în momentul în care se produce evenimentul
respectiv. Exemplu
cmdButon_Click() este procedura aferenta
evenimentului Click de mouse al butonului cmdButon. Aceasta 919f59j îsi va începe
executia în momentul în care utilizatorul va apasa butonul cmdButon.
Numele unei astfel de proceduri este format din numele obiectului aferent , caracterul _ si numele evenimentului ce-i
declanseaza executia.
Sintaxa definirii unei proceduri:
[Private|Public][Static] Sub
NumeProcedura (lista_parametri_formali)
Instructiuni
End Sub
O procedura eveniment poate fi definita doar
Private.
Procedurile comunica date cu programul apelant cu ajutorul parametrilor.
Ce
este o functie ?
O functie este
asemanatoare cu o procedura cu deosebirea ca functia
furnizeaza un rezultat atribuit numelui de functie, acest lucru
permitând ca apelul ei sa se faca chiar din expresia care
contine valoarea calculata. De asemea spre
deosebire de proceduri functiile au tip.
Sintaxa definirii unei functii:
[Private|Public Static]Function
NumeFuctie (lisa_parametri_formali) [As tip]
instructiuni
End Function
Exemplu:
Private Fuction ArieCerc(iRaza As Integer)
ArieCerc=3,14*iRaza^2
End Fuction
Pe lânga functiile pe care le veti crea
dumneavoastra puteti folosi o serie întreaga de functii
standard oferite de bibliotecile Visual Basic; functii matematice, de
prelucrare a sirurilor de caractere etc.
Utilizarea functiilor si procedurilor în program
Odata ce ati scrie o
functie sau o procedura veti dori sa o apelati
dintr-un program sau un alt subprogram. Apelarea procedurilor
difera de apelare functiilor. În timp ce
functiile returneza un rezultat si pot fi apelate din cadrul
unei expresii apelurile de procedura sunt instructiuni liniare de
sine statatoare. Apelarea unei proceduri se poate face în doua
moduri:
NumeProcedura lista_parametri_actuali
Sau
Call NumeProcedura(lista_parametri_actuali)
Exemplu:
Aduna x, y
Sau
Call Aduna(x,y)
Apelarea functiilor se poate face de asemenea în doua moduri.
Exemplu:
ArieParalelipiped=2* (Aria1 l,L+ Aria2 l,h+Aria3 L,h )
Sau
ArieParalelipiped=2* (Aria1(l,L)+ Aria2(l,h)+Aria3(L,h) )
Schimbul de date cu ajutorul
parametrilor
De cele mai multe ori procedurile si functiile pe
care le veti scrie trebuie sa schimbe informatii cu programele
care le apeleaza. Procedurile pot primi date de la programul apelant
si pot returna date programului apelant prin intermediul parametrilor
formali ai procedurii. Parametrii formali se caracterizeaza prin:
- un parametru formal apare ca un identificator; acestuia i se asociaza un
tip de data;
- parametrii formali declarati într-o procedurii sunt cunoscuti în întreg
textul procedurii si necunoscuti în afara;
- în cadrul procedurii parametrii formali se manifesta ca niste
variabile de tipul respectiv;
- daca lista parametrilor formali este vida atunci sau nu exista
schimb de informatii cu restul programului sau acesta se realizeaza
prin intermediul variabilelor globale.
În Visual Basic se pot defini mai multe tipuri de parametri formali:
parametri transmisi prin valoare, parametri transmisi prin
referinta, parametri optionali, lista cu numar
nedefinit de parametri.
Parametri transmisi prin valoare sunt precedati de
cuvântul cheie ByVal; acesti parametri pot fi modificati în corpul
procedurii dar valorile noi nu se transmit catre blocul apelant
, sunt doar parametri de intrare.
Exemplu:
Private Sub Form_Load()
Dim x As Integer
x=10
MsgBox ˝Valoarea initiala a variabilei x
este: ˝ & Cstr(x)
ApelValoare x
MsgBox ˝Valoare a lui x ramâne nemodificata
în afara procedurii: ˝& Cstr(x)
End Sub
Private Sub ApelReferinta(ByRef x As Integer)
x=x+10
MsgBox ˝Noua valoare a variabilei x este: ˝ & Cstr(x)
End Sub
Parametrul x este parametru de intrare transmis prin
valoare. Valoarea sa poate suferi modificari în corpul proceduri dar ea nu
va fi transmisa catre blocul apelant. În cazul transmiterii prin
valoare procedurii i se transmite o copie copie a variabilei.
Parametri
transmisi prin referinta sunt parametri impliciti pe care
îi foloseste Visual Basic. Pentru o mai buna lizibilitate a
programului puteti folosi cuvântul cheie ByRef înaintea unui parametru pe
care vreti sa-l transmiteti prin referinta. Parametrii actuali sunt variabile. Acesti
parametri pot fi modificati în corpul procedurii, ei sunt parametri de
iesire. Nu sunt transmisi prin valoare ci se transmit prin
adresa lor. Deci în blocul apelant valorrile parametrilor
actuali vor fi modificate.
Exemplu
Private Sub Form_Load()
Dim x As Integer
x=10
MsgBox ˝Valoarea initiala a variabilei x
este: ˝ & Cstr(x)
ApelReferinta x
MsgBox ˝Noua valoare a lui x modificata în
procedura este: ˝& Cstr(x)
End Sub
Private Sub ApelReferinta(ByRef x As Integer)
x=x+10
End Sub
Parametrii optionali sunt precedati de cuvântul
cheie Optional. Daca ati declarat un
parametru optional atunci toti parametri din sublista de parametri
formali care urmeaza dupa acel parametru trebuie sa fie
declarati ca optionali. Daca declarati un
parametru ca optional în momentul în care programul invoca procedura
nu este necesar ca sa-i transmita o valoare parametrului declarat
optional.
Exemplu:
Private Sub Foarm_Load()
Dim x As Integer
ParamOptional
ParamOptional x
End Sub
Private Sub ParamOptional(Optional x As Integer)
If Not Is Missing(x) Then
MsgBox
˝Parametrul x a fost transmis!˝
Else
MsgBox
˝Parametrul x lipseste!˝
End If
End Sub
Exista situati în care nu veti sti exact
numarul de parametri pe care îl veti transmite procedurii. Folosind
cuvântul cheie ParamArray puteti transmite proceddurii pe care o
apelati un numar nedefinit de parametri.
Exemplu:
Private Sub Form_Load()
ParamInf 4, 10, 3, 100
ParamInf 4, 10, 3, 100, 150
End Sub
Private Sub ParamInf(ParamArray parametri())
Dim x As Variant, suma As Integer: suma = 0
Dim NrParam As Byte: NrParam = 0
For Each x In parametri
suma = suma + x
NrParam = NrParam + 1
Next
MsgBox "Suma celor " & CStr(NrParam) & " parametri este: " &
CStr(suma)
End Sub
Iesirea dintr-o
procedura sau functie
Exista situatii în care procedurile si
functiile îsi îndeplinesc sarcina pe care o au fara ca
sa execute toate instructiunile din corpul procedurii sau
functiei. Pentru astfel de situatii puteti utiliza
instructiunile Exit Sub si Exit Function care determina
terminarea executiei procedurii sau functiei chiar daca nu s-a executat ultima linie de instructiune a
subprogramului.
Utilizarea functiei Sub
Exista situatii în care veti dori ca
programul dumneavoastra sa-si înceapa executia
fara a afisa o forma. Veti dori ca programul
sa execute niste procesari ce nu necesita
interfata grafica ( încarcarea de
date dintr-un fisier, efectuarea de diferite calcule etc. ). Pentru aceasta din fereastra Project
Properties selectati Ca Startup Object Main Form. Apoi adaugati la proiect un modul standard
în care sa definiti o procedura Sub Main().
Introduceti în corpul acestei proceduri tot codul ce
doriti sa fie executat la lansarea în executie a
aplicatiei.
Apelul recursiv
Desi conceptul de recursivitate este cunoscut de mult
timp în matematica, în programare a fost introdus o data cu
aparitia unor limbaje de nivel înalt (Algo, Pascal). Despre un obiect se
spune ca este recursiv daca este definit prin el însusi.
Exemple:
- multimea numerelor naturale:
a) 1 este numar natural;
b) succesorul unui numar natural este un numar natural;
- functia factorial (n!) - definita prin numere naturale:
a) 0!=1;
b) daca n>0, atunci atunci n!=n*(n-1)!
- structura de tip arbore:
a) un singur nod (0) este un arbore (arbore vid);
b) daca a1 si a2 sunt arbori atunci structura urmatoare este
arbore:
0
a1 a2
Puterea recursivitatii rezita în
posibilitatea de a putea defini un set infint de obiecte printr-o relatie
sau un set finit de relatii. Recursivitatea nu trebuie confundata cu
itineratia desi ele sunt strâns legate:
- itineratia înseamna executia repetata a unei
portiuni de program, pâna în momentul în care este îndeplinita o
anumita conditie; fiecare executie se duce pâna la
capat, se verifica îndeplinirea conditiei si în cazul unui
anumit raspuns se reia executia de la început (de exemplu structurile
repetitive For.Next si Do.Loop);
- recursivitatea presupune, de asemenea, executia repetata a unei
portiuni de program, dar , spre deosebire de structurile repetitive, în
cazul recursivitatii conditia de terminare este verificata
în cursul executiei programului(nu la sfârsit) si în cazul unui
anumit rezultat, întreaga portiune, portiune de program (care
formeaza blocul unei proceduri sau functii) este apelat din nou ca
orice subprogram. În particular ca procedura a blocului care nu si-a
terminat înca executia; în momentul satisfacerii conditiei de
terminare, se reia executia programului apelant din punctul în care s-a
apelat pe el însusi; acest lucru este valabil pentru toate apelurile anterioare
satisfacerii conditiei.
Subprogramele recursive necesita evaluarea unei
conditii de terminare, fara de care un apel recursiv ar duce la
un ciclu infinit
În programare recursivitatea este exprimata prin proceduri sau
functii autoapelate. Daca o procedura P contin o
referinta directa la ea însasi, se spune ca este
direct recursiva; daca P contine o referinta la o
alta procedura Q, care la rândul ei contine o referinta
(directa sau indirecta) la P, se spune ca P este indirect
recursiva.
În general, recursivitatea se foloseste doar atunci când "adâncimea"
recursivitatii ( numarul apelurilor
recursive generat de un anumit apel) este relativ mica, deoarece fiecare
apel recursiv al subprogramului necesita alocarea unui volum de memorie
variabilelor sale curente.
Algoritmii recursivi sunt potriviti a i utilizati
în special în doua cazuri: când problema este definita recursiv sau
când datele care trebuie prelucrate sunt definite în termeni recursivi.
Exista o serie întreaga de algoritmi recursivi grupati în câteva
categorii:
a) algoritmi ce implementeaza metode de rezolvare definite recursiv;
b) algoritmi de divizare ("divide et impera")
c) algoritmi pentru aflarea tuturor solutiilor unei probleme;
d) algoritmi cu revenire(backtracking);
e) algoritmi ce necesita recursivitate indirecta;
Voi prezenta în continuare doi algoritmi recursivi destul de simpli, marea
majortate a algoritmilor ce rezolva probleme de recursivitate fiind
compecsi.
Un algoritm care implementeaza o metoda de
rezolvare definita recursiv este algoritmul de determinare a celui mai
mare divizor comun a doua numere naturale, cunoscut sub numele de
algoritmul lui Euclid.
Pe o forma introduceti doua casete de text pe care sa le
numiti txtNr1 si txtNr2 si un buton de comanda numit cmdCalculeaza.
Adaugati în fereastra de cod urmatoarele instructiuni:
Option Explicit
Private Function Cmmdc(ByVal m As Integer, ByVal n As Integer) As Integer
If n = 0 Then
Cmmdc = m
Else
Cmmdc = Cmmdc(n, m Mod n)
End If
End Function
Private Sub cmdCalculeaza_Click()
MsgBox "Cel ami mare divizor camun este: " & _
CStr(Cmmdc(Cint(txtNr1.Text), Cint(txtNr2.Text)))
End Sub
Introduceti în fiecare caseta de tex câte un numar natural
si apasati butonul de comanda pentru a vedea care este cel
mai mare divizor comun al lor.
Voi prezenta în continuare un algoritm de cautare a
unui element într-un sir ordonat crescator prin metoda "divide et
impera".
Introduceti pe o forma doua casete de text numite
txtElemsir si txtElemCautat. Adaugati de asemenea,
doua butoane numite cmdAdauga si cmdCauta. Introduceti
în fereastra de text urmatorul cod:
Option Explicit
Private aSir(1 To 70) As Integer
Private iNrElem As Integer
Private Sub cmdCauta_Click()
Dim poz As Integer
poz = CautareBinara(aSir, Cint(txtElemCautat.Text), 1, iNrElem)
If poz Then
MsgBox "Numarul exista pe pozitia: " & CStr(poz)
Else
MsgBox "Numarul nu exista!"
End If
End Sub
Private Sub cndAdauga_Click()
iNrElem = iNrElem + 1
aSir(iNrElem) = Cint(txtElemsir.Text)
txtElemsir.Text = ""
End Sub
Private Sub Form_Load()
iNrElem = 0
End Sub
Private Function CautareBinara(aSir() As Integer, ByVal elem _
As Integer, ByVal inceput As Integer, ByVal sfarsit As Integer)
Dim mijloc As Integer
If inceput < sfarsit Then
mijloc = (inceput + sfarsit) / 2
If elem = aSir(mijloc) Then
CautareBinara = mijloc
Else
If elem < aSir(mijloc) Then
CautareBinara = CautareBinara(aSir, elem, inceput, mijloc - 1)
Else
CautareBinara = CautareBinara(aSir, elem, mijloc + 1, sfarsit)
End If
End If
Else
CautareBinara = 0
End If
End Function
Introduceti rând pe rând numerele din sirul de
numere în ordine crescatoare. Scrieti un
numar în caseta de text txtElemsir dupa care apasati
butonul cmdAdauga. Procedati asa pâna
când ati introdus toate numerele din sir. Apoi în caseta de
text txtElemCautat introduceti numarul din sir pe care
doriti sa-l cautati apoi apasati butonul
cmdCauta. Va fa fi afisata pozitia pe care se
afla numarul în sir.
|