miercuri, 10 iulie 2013

Structuri iterative



Prin intermediul construcţiilor de tip bloc prezentate în aceasta secţiune se poate repeta, în mod controlat, un grup de instrucţiuni. În cazul unui număr nedefinit de repetiţii, condiţia de oprire poate fi testată la începutul sau la sfârşitul unui ciclu, prin alegerea structurii adecvate.
Se vor utiliza structuri Do…Loop pentru a executa un grup de instrucţiuni de un număr de ori nedefinit aprioric. Daca se cunoaşte numărul de cicluri, se va utiliza structura For…Next.

Înainte de continuare se va testa o condiţie (despre care se presupune ca poate fi modificata în instrucţiunile executate). Diferitele variante posibile pentru Do…Loop diferă după momentul evaluării condiţiei si decizia luata.

La folosirea structurilor iterative, mai ales începători, trebuie să fim atenţi ca să nu intrăm intr-o buclă infinită. Nu este recomandat modificarea variabilei contor în interiorul ciclului.

În general structurile iterative pot să fie imbricate.

 Pentru a avea structuri clare este bine să folosim anumite litere  pentru variabile contor. (de ex i,j,k..)

 For...Next

 Sintaxa:

For contor=start to end step pas

instructiuni

Next

start, send, step sunt variabile numerice, pas nu este obligatoriu de precizat, implicit este 1


Mod de funcţionare: se repetă setul de instrucţiuni până 
contor <= end pentru step >= 0 sau 
contor  >= end pentru step < 0
 

După ce toate instrucţiunile s-au executat, valoarea step este adăugata la valoarea contorului si instrucţiunile se executa din nou, după acelaşi test ca si prima data, sau bucla For…Next este terminată şi se executa prima instrucţiune de după linia Next.



Specificarea numelui contorului în linia Next poate clarifica textul sursa, mai ales în cazul când exista structuri For…Next imbricate.

Corpul unei bucle For…Next poate include (complet) o altă structură For…Next. În asemenea situaţii, structurile imbricate trebuie sa aibă variabile contor diferite.

Instrucţiunile Exit For pot fi plasate oriunde în corpul unei bucle si provoacă abandonarea ciclării. Controlul execuţiei se transfera la prima instrucţiune de după linia Next.

De asemenea putem plasa şi un GoTo linia n, care va determina saltul executării programului la linia n.



For Each…Next


Similara structurii For…Next, structura For Each…Next repeta un grup de instrucţiuni pentru fiecare element dintr-o colecţie de obiecte sau dintr-un tablou (cu excepţia celor de un tip utilizator). Este utila atunci când nu se cunoaște numărul de elemente sau daca aceasta se modifica, în timpul execuţiei.


Sintaxa este:

For Each element In colectie



instructiuni



Next

unde

element este variabila utilizata pentru parcurgerea elementelor. Pentru parcurgerea unui tablou, element poate fi doar o variabila de tip Variant.

group este numele colecţiei de obiecte sau al tabloului.

Execuţia unei structuri For Each…Next este

1. Se defineşte element ca numind primul element din grup (daca nu exista nici un element, se transfera controlul la prima instrucţiune de după Next – se părăseşte bucla fără executarea instrucţiunilor).

Se executa instrucţiunile din corpul buclei For.

Se testează daca element este ultimul element din grup. Daca răspunsul este afirmativ, se părăseşte bucla.

2. Se defineşte element ca numind următorul element din grup.

Se repeta paşii.

Buclele For Each...Next pot fi imbricate cu condiţia ca elementele utilizate la iterare să fie diferite.



Exemplu
Sub CloseForms()

    For Each frm In Application.Forms

        If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close

    Next

End Sub

Determină închiderea tututor panourilor de comandă în afară de cel active

Sau

Dim TestArray(10) As Integer, I As Variant

For Each I In TestArray

    TestArray(I) = I

Next I

Va atribui fiecărui element din tablou valoarea contorului.





While…Wend


Executa un grup de instrucţiuni atât timp cât este adevărata o condiţie.
Sintaxa

While conditie



Instructiuni



Wend

Este recomandat să se utilizeze o structură Do…Loop în locul acestei structuri.



With


Programarea orientata pe obiecte produce, datorită calificărilor succesive, construcţii foarte complexe atunci când se numesc proprietăţile unui obiect. În cazul modificărilor succesive ale mai multor proprietăţi ale aceluiaşi obiect,repetarea zonei de calificare poate produce erori de scriere si conduce la un text greu de citit. Codul este simplificat prin utilizarea structurii With…End With. O asemenea structura execută o serie de instrucţiuni pentru un obiect sau pentru o variabilă de tip utilizator. 

Sintaxa este:

With obiect



instructiuni


End With

unde

obiect este numele unui obiect sau a unui tip definit de utilizator



Permiţând omiterea recalificărilor din referințele la obiectul precizat, orice construcţie de tipul

".nume" este interpretată în instrucţiunile structurii drept "object.nume".

Într-un bloc With nu se poate schimba obiectul procesat.

La plasarea unui bloc With în interiorul altui bloc With, obiectul extern este mascat complet, deci calificările eventuale la acest obiect vor fi efectuate.

Nu se recomandă saltul în si dintr-un bloc With.



Exemplu


With MyLabel

    .Height = 2000

    .Width = 2000

    .Caption = "This is MyLabel"

End With

Determina setarea dimensiuniilor si textului unei etichete.

Sau imbricate

With MyObject

    .Height = 100        ' Same as MyObject.Height = 100.

    .Caption = "Hello World"    ' Same as MyObject.Caption = "Hello World".

    With .Font

        .Color = Red        ' Same as MyObject.Font.Color = Red.

        .Bold = True        ' Same as MyObject.Font.Bold = True.

    End With

End With





Do…Loop


Se vor utiliza structuri Do…Loop pentru a executa un grup de instrucţiuni de un număr de ori nedefinit aprioric.

Dacă se cunoaşte numărul de cicluri, se va utiliza structura For…Next.

Înainte de continuare se va testa o condiţie (despre care se presupune ca poate fi modificata în instrucţiunile executate). Diferitele variante posibile pentru Do…Loop diferă după momentul evaluării condiţiei si decizia luată.



Do While / Until conditie



instructiuni



Loop



Sau



Do



instructiuni



Loop While / Until conditie



unde

conditie este o expresie care este evaluată.

instructiuni se repetă atâta timp (while) sau pâna când (until) condiţia devine True.



Dacă decizia este de a nu continua ciclarea, atunci se va executa prima instrucţiune care urmează întregii structuri, de după linia care începe cu Loop

Se poate abandona ciclarea oriunde în corpul structurii prin utilizarea comenzii Exit Do (cu aceasta sintaxa).

Structurile Do pot fi înserate (dar complet) unele în altele. O terminare (prin orice metoda) a unei bucle transferă controlul la nivelul Do imediat superior.



Do While…Loop

Testează condiţia la începutul buclei, execută bucla numai dacă rezultatul este True si continuă astfel până când o noua evaluare produce False.
Do Until…Loop
Testează condiţia la începutul buclei, execută bucla numai dacă rezultatul este False si continuă astfel până când o noua evaluare produce True.
Do…Loop While
Se execută întotdeauna bucla o dată, se testează condiţia la
sfârşitul buclei si se repetă bucla atât timp cât condiţia este
True. Oprirea este pe condiţie falsă.
Do…Loop Until

Se execută întotdeauna bucla o dată, se testează condiţia la
sfârşitul buclei si se repetă bucla atât timp cât condiţia este
False. Oprirea este pe condiţie adevărată.

Niciun comentariu:

Trimiteți un comentariu