Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Scrierea de cod reutilizabil Visual Basic

Informatica


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

    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.


Document Info


Accesari: 2822
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )