PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE …web.ulbsibiu.ro/cristian.matran/html/docs/selectie_re...5...

45
PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE DE PROGRAMARE (IV)

Transcript of PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE …web.ulbsibiu.ro/cristian.matran/html/docs/selectie_re...5...

PROGRAMAREA CALCULATOARELOR ŞI

LIMBAJE DE PROGRAMARE(IV)

2

Instrucţiuni condiţionale• Instrucţiunea reprezintă o formă de ramificare a ordinii de execuţie a

instrucţiunilor programului. Ramificarea se face funcţie de o condiţie ce poate fi testată pe un set de date cu care se lucrează în aplicaţie. În funcţie de rezultatul evaluării (“adevărat” sau “fals”) se execută una dintre instrucţiuni. Forma generală este:

Dacă test_logic adevăratexecută instrucţiunea 1

altfelexecută instrucţiunea 2

• Dacă se execută instrucţiunea de pe o ramură, atunci instrucţiunea de pe cealaltă ramură nu se mai execută. După executarea uneia dintre aceste instrucţiuni, execuţia programului se continuă cu instrucţiunea următoare instrucţiunii condiţionale.

• Testul logic care hotărăşte ramura ce se va executa este de obicei un test de egalitate. Condiţiile se pot compune prin operatori logici de tipul “şi”, “sau”, “nu”, iar în final rezultă o condiţie de forma: dacă variabila ... este mai mică decât ... şi mai mare decât ..., atunci ...

18.12.2017 13:26

3

• Există şi varianta de instrucţiune condiţională în care, în funcţie de o valoare întreagă se face alegerea dintr-un set de instrucţiuni, după care se execută instrucţiunea aleasă. Aceasta are forma:

Dacă Variabila este egală cu Valoare1 atunciexecută instrucţiunea1

altfel, dacă Variabila este egală cu Valoare2 atunci

execută instrucţiunea2altfel,

dacă Variabila......altfel

execută instrucţiunea implicită

18.12.2017 13:26

4

Tabelul 2.8 – Operatorii destinati comparării datelor în VBA

Operator

Exemplu Descriere

> CInt(txtPrima.Text) > intVal1 Operatorul “mai mare ca” returnează True sau 0dacă valoarea Argument1 este mai mare decâtvaloarea Argument2.

< sngVal2 < 2000.05 Operatorul “mai mic ca” returnează True sau 0 dacă valoarea Argument1 este mai mică decât valoarea Argument2.

= chrRasp = “a” Operatorul “egal cu” returnează True sau 0 dacăvaloarea Argument1 este egală cu valoareaArgument2.

<= chrRasp <= “B” Operatorul “mai mic sau egal” returnează Truesau 0 dacă valoarea Argument1 este mai micăsau egală decât valoarea Argument2.

>= dblVal3 >= sngVal4 Operatorul “mai mare sau egal” returnează Truesau 0 dacă valoarea Argument1 este mai maresau egală decât valoarea Argument2.

18.12.2017 13:26

5

• NOTĂ: In cazul în care cele 2 argumente sunt şiruri de caractere, mărimea valorii fiecăruia este dată de codul ASCII al fiecărui caracter. Spre exemplu “ABC” < “ADC” deoarece codul ASCII al caracteruluiB este mai mic decât codul ASCII al caracterului D.

• Proiectantul de aplicaţii trebuie să acorde o mare importanţă tipurilorde argumente ce sunt comparate, altfel rezultatele comparării putând fiiimprevizibile.

• O regulă general valabilă este ca ambele argumente să fie de acelaşi tip sau măcar de tipuri compatibile (deşi în acest ultim caz rezultatulcomparării nu este întotdeauna cel corect). Dacă se compară egalitateaunui argument de tip întreg cu un argument de tip double, rezultatulpoate fi False chiar dacă aparent valorile celor două argumente suntegale, deoarece valoarea argumentului de tip double este aproximată la ultima zecimală – poate avea tot atât de bine valoarea 0 cât şi 1). Acelaşi rezultat False se poate obţine şi în cazul comparării egalităţiiunui argument single şi unul double chiar dacă aparent au valoareegală şi aceasta deoarece pot apare diferenţe în reprezentarea internă a celor două valori datorită rotunjirilor pe care sistemul le realizează.

• Spre exemplu dacă primul argument are valoarea 4.5362 în simplăprecizie şi al doilea argument valoarea 4.5362 în dublă precizie, intern oricare din valori, fiind rotunjită, poate avea valoarea reală de 4.53620000000000001 în loc de 4.53620000000000000.

18.12.2017 13:26

6

Test logic

Adevărat

(Da)

Fals

(Nu)

Fig. 2.11. Reprezentarea grafică a testului logic

18.12.2017 13:26

7

Instrucţiunea IF• Instrucţiunea IF stă la baza dezvoltării oricărui tip de aplicaţie şi

aceasta deoarece cu ajutorul ei aplicaţia analizează datele, direcţionând fluxul informatic în funcţie de rezultatele analizei efectuate. In cazul în care această instrucţiune nu ar exista rularea aplicaţiei ar decurge secvenţial executând instrucţiune după instrucţiune până la terminarea codului. Prin IF fluxul execuţiei poate parcurge numai anumite secvenţe de program pe căi predefinite de proiectant în funcţie de condiţiile impuse şi de rezultatul manipulării datelor pe timpul rulării.

18.12.2017 13:26

• In general o instrucţiunea If conţine una sau două secvenţe de cod, executând una dintre ele, funcţie de rezultatul unei operaţii de comparare a 1 sau 2 argumente. Instrucţiunea poate fi întâlnită în una din următoarele forme:

– If … Then

– If … Then … Else ... End If

18.12.2017 13:26 8

9

Structura de decizie IF … THEN• Structura are următorul format:

‘Dacă verifică numai o condiție de adevăr și folosește o instrucțiune‘simplăIf <TestComparare> Then <instrucţiune>

Exemple:Sub FixData1()

Data = #12/13/2017# If Data < Now Then Data = Now

End Sub

Sub FixData2()Dim Data As DateData = CDate(InputBox("Introduceti data (mm/dd/yyyy):"))If Data < Now Then Data = NowMsgBox Data

End Sub

sau‘Dacă verifică numai o condiție de adevăr și folosește o ‘instrucțiune compusă

If <TestComparare> Then<instrucţiune1>…<instrucţiuneN>

End If

10

unde:<TestComparare> – o expresie de comparare care poatelua valoarea True sau False<instrucţiune> – o instrucţiune de atribuire, un apel de procedură, etc.

• Dacă expresia <TestComparare> are valoarea True atunciva fi executată instrucţiunea <instrucţiune> sau blocul de instrucţiuni <instrucţiune1> … <instrucţiuneN>. Dacărezultatul evaluării este False atunci execuţia va face un salt automat la instrucţiunea ce urmează structuriidecizionale.

11

Sub formula()Dim val As Integer, a As Integer, b As Integer, c As IntegerDim d As Single, e As Single, f As Single, g As Single

a = InputBox("a=")b = InputBox("b=")c = InputBox("c=")val = InputBox("Introduceti o valoare (0-9): ")If val = 0 Then

d = a + b + ce = a + b / 2f = (a) ^ 2 + (b) ^ 2 + (c) ^ 2g = (d + f) / e

End Ifvar = MsgBox("Ati apasat tasta " & val & Chr(13) & Chr(10) & "a=" & a & Chr(13) & _

Chr(10) & "b=" & b & Chr(13) & Chr(10) & "c=" & c & Chr(13) & Chr(10) & "d=" & _d & Chr(13) & Chr(10) & "e=" & e & Chr(13) & Chr(10) & "f=" & f & Chr(13) & Chr(10) _ & "g=" & g)End Sub

18.12.2017 13:2612

1

• Să presupunem cazul în care un salariat este recompensat cu 5% din valoarea produselor realizate peste limita de 10 000 lei şi este penalizat în cazul în care producţia este sub limită cu 10% din valoarea ce trebuie adăugată pentru atingerea limitei. Să se scrie o aplicaţie care să ceară printr-o casetă de tip InputBox valoarea producţiei realizate; să calculeze dacă este cazul valoarea primei şi să o afişeze într-o casetă de tip MsgBox; să calculeze penalizarea în cazul în care nu se atinge limita de producţie. Conţinutul procedurii eveniment de calcul a primei sau penalizării este:

Dim sngValLimit As Single, ValRealizat As Double, sngPrima As Single, sngPenalizare As Single

Dim sngDiferenta As Single, intButon As IntegersngValLimit = 1E+4 ‘Se initializeaza valoarea limita a productiei

‘Se citeste valoarea produselor realizate de salariatValRealizat = val(InputBox(“Valoarea realizată a productiei “, “Valoare productie”))If ValRealizat > sngValLimit Then ‘Daca valoarea realizată este mai mare decit valoarea limta

atuncisngDiferenta = ValRealizat – sngValLimitsngPrima = sngDiferenta * .05 ‘Se calculeaza prima de salarizareintButon = MsgBox(“Prima realizată este de “ & sngPrima & “ lei”, 64,“Prima de

salarizare”)End IfIf ValRealizat < sngValLimit Then ‘Dacă valoarea realizată este mai mică decit valoarea limta

atuncisngDiferenta = sngValLimit - ValRealizat sngPenalizare = sngDiferenta * .1 ‘Se calculeaza penalizareaintButon = MsgBox(“Penalizarea este de “ & sngPenalizare & “ lei”, 64,“Penalizare”)

End If

14

Structura de decizie IF … THEN … ELSE• Exemplul anterior poate fi rezolvat într-un mod mai elegant prin utilizarea structurii de

decizie If … Then … Else. Forma generală a acestei structuri este:

If <TestComparare1> Then<instrucţiune1>…<instrucţiuneN>

Else If <TestComparare2><instrucţiune1>…<instrucţiuneN>…

Else If <TestComparareN><instrucţiune1>…<instrucţiuneN> Else <instrucţiune1>…<instrucţiuneN>

End If

15

• In cazul în care expresia <TestComparare1> este adevărat atunci se execută primul bloc de instrucţiuni. In cazul în care expresia < TestComparare2> este adevărată atunci se execută al doilea bloc de instrucţiuni, şi aşa mai departe. In cazul în care toate expresiile < TestComparare1>, <TestComparare2>, …, < TestComparareN> sunt false atunci este executat ultimul bloc de instrucţiuni. Utilizând structura If … Then … Else blocul decizional al aplicaţiei anterioare va avea următoarea formă

If ValRealizat > sngValLimit Then ‘Daca valoarea realizată este mai mare decit valoarea limta atuncisngDiferenta = ValRealizat – sngValLimitsngPrima = sngDiferenta * .05 ‘Se calculeaza prima de salarizareintButon = MsgBox(“Prima realizată este de “ & sngPrima & “ lei”, 64,“Prima de salarizare”)

Else If ValRealizat < sngValLimit Then ‘Daca valoarea realizată este mai mică decit valoarea limta atuncisngDiferenta = sngValLimit - ValRealizat sngPenalizare = sngDiferenta * .1 ‘Se calculeaza penalizareaintButon = MsgBox(“Penalizarea este de “ & sngPenalizare & “ lei”, 64,“Penalizare”)

Else ‘AltfelintButon = MsgBox (“Atit penalizarea cit şi prima sunt 0 lei, 64, “Producţie la limită” )

End If

16

Expresii de comparare cu condiţii multiple• Expresiile de comparare din cadrul structurii decizionale admit

utilizarea unor operatori suplimentari: Or, And şi Not – tab. 2.9. Aceşti operatori sunt utilizaţi pentru definirea unor condiţii compuse. Operatorii Or, And şi Not se mai numesc şi operatori logici.

Tabelul 2.9 – Operatorii pentru definirea condiţiilor compuse

Op. Exemplu Descriere

And If (intVal < 10) And (intVal > 5) Are valoarea True dacă intVal mai mic ca 10 şimai mare ca 5 (intVal trebuie să aparţinădomeniului 5 … 10)

Or If (intVal = 10) Or (intVal = 5) Are valoarea True dacă intVal este egal cu 5 sau10

Not If Not (intVal < 5) Are valoarea True dacă intVal este mai mare ca 5.

17

ExempluSă se scrie o structură decizională care:• să adune două valori de tip single (sngVal1, sngVal2) dacă

intOpt este 1 sau 2 • să scadă din prima valoare a doua dacă intOpt este mai mare ca

2 şi mai mic sau egal cu 10• să dubleze suma celor 2 valori dacă intOpt este mai mic ca 1 şi

mai mare ca 10.

If (intOpt =1) Or (intOpt = 2) ThensngTotal = sngVal1 + sngVal2

Else If (intOpt >2) and (intOpt <= 10) ThensngTotal = sngVal1 – sngVal2

ElsesngTotal = 2 * (sngVal1 + sngVal2)

End If

18.12.2017 13:26

18

19

Structuri decizionale imbricate• Structura decizională de tip If … Then … Else este indicată în cazul în care

vor fi tratate cel mult trei expresii de comparare. In caz contrar codul devine confuz, fiind dificil de descifrat. Ca exemplu, se consideră o structură de decizie care să testeze la modul general acţionarea butoanelor ce pot apare într-o casetă de dialog de tip MsgBox.

• O astfel de casetă poate conţine 7 tipuri de butoane – tab. 5.2. Considerând că valoarea returnată de casetă este memorată în variabila intBut, structura de decizie va determina tipul de buton acţionat şi va afişa o casetă de tip MsgBox care să conţină mesajul “Butonul vb… a fost acţionat (... reprezintă numele butonului).

If (intBut =1) Then strMsg = “OK”Else If (intBut =2) Then strMsg = “Cancel”Else If (intBut =3) Then strMsg = “Abort”Else If (intBut =4) Then strMsg = “Retry”Else If (intBut =5) Then strMsg = “Ignore”Else If (intBut =6) Then strMsg = “Yes”Else strMsg = “No”End If intMsg = MsgBox(“Butonul vb” & strMsg & “ a fost actionat”, 64,

“Butoane caseta MsgBox”)

Constantă Valoare Descriere

vbOk 1 A fost selectat butonul Ok

vbCancel 2 A fost selectat butonul Cancel

vbAbort 3 A fost selectat butonul Abort

vbRetry 4 A fost selectat butonul Retry

vbIgnore 5 A fost selectat butonul Ignore

vbYes 6 A fost selectat butonul Yes

vbNo 7 A fost selectat butonul No18.12.2017 13:26 20

21

• Pentru simplificare, dacă vor fi compaeate mai mult de 3 expresii, se recomandă utilizarea structurii de tip Select Case care are următorul format:

Select Case <Expresie> Case <valoare1>:

<instrucţiune1>…

<instrucţiuneN>Case <valoare2>:

<instrucţiune1>…

<instrucţiuneN>…

Case <valoareN>:<instrucţiune1>…

<instrucţiuneN> Case Else

<instrucţiune1>…

<instrucţiuneN>End Select

unde: <expresie> – o expresie matematică (care să aibă o valoare întreagă) sau de manipulare a şirurilor de caractere<valoare> – o valoare de acelaşi tip cu valoarea expresiei.

22

• Deşi structura pare complicată modul în care funcţionează este relativ simplu. Astfel, în prima fază este evaluată <Expresie>, după care este executat blocul de instrucţiuni care corespunde instrucţiunii Case care are <valoare> egală cu valoarea <Expresie>.

• Utilizând noua structură aplicaţia anterioară devine:Select Case intBut

Case 1: strMsg = “OK”Case 2: strMsg = “Cancel”Case 3: strMsg = “Abort”Case 4: strMsg = “Retry”Case 5: strMsg = “Ignore”Case 6: strMsg = “Yes”Case Else strMsg = “No”

End Select

• NOTĂ: Caracterul “:” este opţional dar se recomandă utilizarea sa deoarece codul aplicaţiei este mai clar şi în cazul în care blocul de instrucţiuni conţine doar o singură instrucţiune, aceasta poate fi scrisă pe acelaşi rând cu Case.

23

Variante ale structurii SELECT CASEStructură Case ... Else cu test de

comparareStructură Case ... Else cu testarea încadrării

într-un domeniuSelect Case <Expresie>

Case Is <test1>:<instrucţiune1>…<instrucţiuneN>

Case Is <test2>:<instrucţiune1>…<instrucţiuneN>

…Case <testN>:

<instrucţiune1>…<instrucţiuneN>

Case Else<instrucţiune1>…<instrucţiuneN>

End Select

Select Case <Expresie>Case <Expresie1> To <Expresie2>:

<instrucţiune1>…<instrucţiuneN>

Case <Expresie3> To <Expresie4>:<instrucţiune1>…<instrucţiuneN>

…Case <ExpresieM> To <ExpresieN>:

<instrucţiune1>…<instrucţiuneN>

Case Else<instrucţiune1>…<instrucţiuneN>

End Select

24

unde: <Expresie> – o expresie, constantă matematică sau de tip şir de caractere<test> – secvenţa unui test de comparare formată din operator şi argument2deoarece VBA-ul consideră ca argument1 valoarea conţinută în <Expresie>

• In cazul structurii cu test de comparare VBA-ul evaluează <Expresie> după care compară valoarea obţinută conform fiecărui <test>. In cazul în care valoarea testului este True atunci blocul de instrucţiuni ataşat instrucţiunii Case Is care conţine testul este executată. După execuţia blocului de instrucţiuni, execuţia codului continuă cu prima instrucţiune ce urmează după End Select. In cazul în care toate testele au valoarea False va fi executat blocul de instrucţiuni ataşat de Case Else.

• In cazul structurii cu testarea încadrării într-un domeniu de valori VBA-ul evaluează <Expresie> după care testează încadrarea valoarii obţinute în domeniul definit de valorile <Expresie1> … <Expresie2>. In cazul în care domeniul conţine valoarea din <Expresie> atunci blocul de instrucţiuni ataşat instrucţiunii Case care conţine domeniul dat este executată. După execuţia blocului de instrucţiuni, execuţia codului continuă cu prima instrucţiune ce urmează după End Select. In cazul în care valoarea din <Expresie> nu se încadrează în nici un domeniu va fi executat blocul de instrucţiuni ataşat de Case Else.

25

Exemplu:

• Utilizarea unei structuri Select Case cu test de comparare pentru a determina dacă valoarea introdusă de utilizator printr-o casetă de tip InputBox se încadrează în domeniul [80 … 120].

Dim strRezAdm As String, sngRezAdm As Single, intBut As IntegerstrRezAdm = InputBox("Introduceti o valoare in domeniul [ 80 ... 120 ][ N/mm^2 ]", _

"Rezistenta admisibila la torsiune a otelurilor laminate", "100")sngRezAdm = CSng(strRezAdm)Select Case sngRezAdm

Case Is < 80:intBut = MsgBox("Valoarea rezistentei admisibile prea mica !", 64,

"Eroare")Case Is > 120:

intBut = MsgBox("Valoarea rezistentei admisibile prea mare !", 64, "Eroare")

Case Else:intBut = MsgBox("Rezistentei admisibila este in domeniu !", 64,

"Introducere corecta")End Select

26

In cazul utilizării unei structuri cu testarea încadrării într-un domeniu de valori exemplul anterior se simplifică semnificativ:

Dim strRezAdm As String, sngRezAdm As Single, intBut As IntegerstrRezAdm = InputBox("Introduceti o valoare in domeniul _

[80 ... 120 ][ N/mm^2 ]", "Rezistenta admisibila la torsiune a _otelurilor laminate", "100")

sngRezAdm = CSng(strRezAdm)Select Case sngRezAdm

Case 80 To 120intBut = MsgBox("Rezistenta admisibila este _

in domeniu !", 64, "Introducere corecta")Case Else:

intBut = MsgBox("Rezistenta admisibila este _in afara domeniu !", 64, "Eroare")

End Select

27

Instrucţiuni de ciclare

Sunt instrucţiuni elementare (instrucţiuni repetitive sau bucle).

Prin aceste instrucţiuni se specifică faptul că o instrucţiune se va executa în mod repetat, controlul repetării instrucţiunilor făcându-se pe diverse criterii:

• o instrucţiune poate fi executată de un număr fix de ori • o instrucţiune poate fi executată până la îndeplinirea unei

condiţii.

Condiţia de terminare a execuţiei buclei poate fi testată • la începutul • la sfârşitul buclei.

28

Structura de ciclare For … Next• Această structură mai este întâlnită în cărţile de specialitate sub numele de

structură de ciclare For … Next.

• Instrucţiunea de ciclare care se execută de un număr finit de ori se numeşte ciclul for (for=”pentru”), iar funcţionarea este descrisă prin:

Pentru Contor =Valoare_iniţială până la Valoare_finalăInstrucţiune_1...IeşireInstrucţiune_N

Următoarea valoare a contoruluiunde Valoare_iniţială este o valoare de iniţializare a contorului,

Valoare_finală este o valoare de terminare a instrucţiunii

29

Formatul structurii este:For <Contor> = <ValoareInitiala> To <ValoareFinala> [Step

<PasIncrementare>]<instructiune1>…[Exit For]<instructiuneN>Next <Contor>

unde: <Contor> – variabilă de tip numeric sau variant care memorează numărul de ciclări ale blocului de instrucţiuni incluse în structură. <ValoareInitiala> – expresie, variabilă sau valoare numerică iniţială a variabilei <Contor><ValoareFinala> – expresie, variabilă sau valoare numerică finală a variabilei <Contor><PasIncrementare> – valoare numerică, utilizată ca pas de incrementare a valorii memorate în variabila <Contor>. Argumentul este opţional şi în cazul în care este omis (caz în care trebuie omis şi cuvântul rezervat Step) este automat considerat de VBA ca având valoarea 1. <PasIncrementare> poate fi o valoare negativă, dar în acest caz argumentul <ValoareFinală> trebuie să fie mai mic decât argumentul <ValoareInitiala>.

30

• Iniţial valoarea memorată în variabila <Contor> este <ValoareInitiala>. Această valoare este incrementată cu <PasIncrementare> la fiecare parcurgere a blocului de instructiuni, până când depăşeşte <ValoareFinala>. In momentul depăşirii execuţia aplicaţiei sare la instrucţiunea imediat următoare expresiei Next <Contor>.

• Din structura de ciclare For … Next se pot face ieşiri forţate intercalând în corpul structurii instrucţiunea Exit For. Intercalarea se poate face în cadrul unei structuri de decizie (structură de tip If … Then … Else sau Select Case) şi anume atunci când este îndeplinită o anumită condiţie. Atunci când instrucţiunea Exit For este întâlnită, execuţia abandonează structura de ciclare, continuând cu prima linie ce urmează instrucţiunii Next <Contor>.

• NOTĂ: Valoarea variabilei <contor> poate fi modificată în interiorul corpului structurii de ciclare dar acest mod de lucru nu este recomandat deoarece se poate pierde controlul executării structurii.

31

Schema de funcţionare a ciclului FOR...NEXT

Iniţializare

Test

Instrucţiune

Reluare

Adevărat

Fals

32

• Procedura ce urmează – Private Sub cmdStart_Click()– adună toate numerele pare din intervalul [0 … 100]. Procedura este ataşată butonului de comandă Start, iar procedura Private Sub cmdStop_Click() este ataşată butonului de comandă Stop.

Private Sub cmdStart_Click()'Calculul sumei numerelor pare de la 0 la 100

Const intValInitial As Integer = 0, intValFinal As Integer = 100, intPas As Integer = 2Dim intContor As Integer, intSuma As Integer, strSuma As String

For intContor = intValInitial To intValFinal Step intPasintSuma = intSuma + intContor

Next intContorstrSuma = CStr(intSuma)intButon = MsgBox("Suma numerelor pare de la 0 la 100 este " & strSuma, vbInformation + vbOKOnly, _"Exemplu de utilizare a ciclului For ... Next")

End SubPrivate Sub cmdStop_Click()

EndEnd Sub

33

• Dacă se face verificarea condiţiei înainte de execuţia buclei, instrucţiunile de ciclare se numesc cicluri while (while=”atât timp cât”) şi funcţionarea poate fi decrisă prin:

Atât timp cât Condiţia este adevăratăexecută Instrucţiunea

• În cazul acestei instrucţiuni de ciclare, instrucţiunea din interiorul ciclului nu se va executa niciodată în cazul în care condiţia este falsă de la început.

Structura de ciclare DO WHILE ... LOOP

18.12.2017 13:26

34

• Formatul structurii este:Do While <condiţie>

<instrucţiune1>…<instrucţiuneN>

Loopunde: <condiţie> – expresie de comparare

<instrucţiune1> … <instructiuneN> – corpul structuriiLoop – marchează sfârşitul structurii de ciclare

NOTĂ:La utilizarea structurilor de ciclare proiectantul aplicaţiei trebuie să se asigure ca execuţia blocului de instrucţiuni să determine modificarea argumentelor expresiei de comparare (se recomandă ca un singur argument să fie modificat). In caz contrar se obţine un ciclu infinit (dacă iniţial condiţia este 0 sau True şi dacă executarea corpului structurii nu modifică argumentele expresiei de comparare, atunci valoarea condiţiei va rămâne neschimbată determinând executarea la nesfârşit a blocului de instrucţiuni). Singura metodă sigură de ieşire dintr-un ciclu infinit este apăsarea simultană a tastelor Ctrl şi Break.

35

Schema de funcţionare a ciclului DO WHILE...LOOP

Instrucţiune TestAdevărat

Fals

36

Structura de ciclare Do Until … Loop

• Spre deosebire Do While … Loop structura Do Until … Loop execută blocul de instrucţiuni care formează corpul structurii atâta timp cât condiţia de ciclare are valoarea 1 sau False. Prin urmare ciclarea este terminată în momentul în care condiţia are valoarea 0 sau True. Formatul structurii este:

Do Until <condiţie><instrucţiune1>…<instrucţiuneN>

Loopunde:

<condiţie> – expresie de comparare<instrucţiune1> … <instructiuneN> – corpul structuriiLoop – marchează sfârşitul structurii de ciclare

NOTĂ: Nu se poate da o recomandare privind avantajele utilizării structurii Do While … Loop comparativ cu structura Do Until … Loop deoarece din punct de vedere al execuţiei codului ambele sunt la fel de eficiente. Utilizarea unei structuri sau a celeilalte este funcţie de preferinţele proiectantului codului.

37

Structurile de ciclare Do … While Loop şi Do … Until Loop

• Cele 2 structuri sunt derivate din structurile de ciclare anterior prezentate. Deosebirea faţă de structurile anterioare constă în poziţionarea condiţiei de ciclare. In timp ce în cazul structurilor Do While … Loop şi Do Until … Loop condiţia este scrisă pe prima linie (imediat după Do While respectiv Do Until) la celelalte două condiţia este poziţionată pe ultima linie a structurii (imediat înaintea cuvântului rezervat Loop.

• Din punct de vedere al parcurgerii codului cele 2 structuri funcţionează similar cu structura din care au derivat (Do … While Loop similar cu Do While … Loop şi Do … Until Loop similar cu Do Until … Loop).

• NOTĂ: Cele 3 puncte ( … ) simbolizează blocul de instrucţiuni conţinute în structura de ciclare.

• Avantajul oferit cele 2 noi structuri este acela că elimină necesitatea definirii argumentelor condiţiei de ciclare înaintea începerii structurii (vezi exemplele de la structurile de ciclare anterior prezentate).

38

• În cazul în care condiţia este testată după execuţia instrucţiunii, instrucţiunile de ciclare se numesc cicluri do-while (do-while= execută ... atât timp cât”). În aces caz, instrucţiunea din interiorul ciclului se execută cel puţin o dată, chiar dacă rezultatul condiţiei de terminare este fals de la început.Forma generală a instrucţiunii este:

Execută Instrucţiunea atât timp cât Condiţia este adevărată

• În ambele cazuri, dacă instrucţiunea din interiorul buclei nu afectează valoarea de adevăr a condiţiei de terminare, bucla va fi infinită ( nu se va întrerupe din execuţie).

39

Schema de funcţionare a ciclului Do...While... Loop

Instrucţiune

TestAdevărat

Fals

40

• Structura Do … While ... Loop

Dim strRezAdm As String, sngRezAdm As Single, intBut As IntegerDo ‘inceputul structurii de ciclare

intBut = MsgBox("Rezistenta admisibila trebuie sa apartina domeniului [80 … 120] !”, _

64, "Eroare")strRezAdm = InputBox("Introduceti o valoare in domeniul [ 80 ... 120

] N/mm^2 ", _"Rezistenta admisibila la torsiune a otelurilor laminate",

"100")If strRezAdm = “” Then ‘dacă butonul Cancel este selectat atunci

End ‘se iese din aplicatieElse

sngRezAdm = CSng(strRezAdm)End If

While (sngRezMat < 80) Or (sngRezAdm > 120) Loop ‘Atit timp cit valoarea nu este in domeniu, repeta instructiunileintBut = MsgBox("Rezistenta admisibila este de “ & strRezAdm & “[N/mm^2]”, 64, "Introducere corecta")

41

• Structura Do … Until ... LoopDim strRezAdm As String, sngRezAdm As Single, intBut As IntegerDo ‘inceputul structurii de ciclare

intBut = MsgBox("Rezistenta admisibila trebuie sa apartina domeniului [80 … 120] !”, _

64, "Eroare")strRezAdm = InputBox("Introduceti o valoare in domeniul [ 80 ...

120 ] N/mm^2 ", _"Rezistenta admisibila la torsiune a otelurilor laminate",

"100")If strRezAdm = “” Then ‘dacă butonul Cancel este selectat atunci

End ‘se iese din aplicatieElse

sngRezAdm = CSng(strRezAdm)End If

Until (sngRezMat > 80) And (sngRezAdm < 120) Loop ‘Repetă ciclul până când valoarea este în domeniuintBut = MsgBox("Rezistenta admisibila este de “ & strRezAdm & “[N/mm^2]”, 64, "Introducere corecta")

42

• OBS.: După cum se poate observa în ambele exemple blocul iniţial de instrucţiuni nu mai apare, nemaifiind necesară definirea argumentelor condiţiei de ciclare înaintea începerii ciclului deoarece, condiţia de ciclare nu mai este pozţionată pe prima linie a ciclului ci pe ultima.

• Ciclurile Do … While Loop şi Do … Until Loop sunt indicate acolo unde blocul de instrucţiuni conţinute de ciclu trebuie executate măcar odată.

43

Ieşirea forţată din cicluri• Sunt cazuri când este necesară ieşirea dintr-un ciclu fără a fi îndeplinită

condiţia de sfârşit a ciclului. Spre exemplu se proiectează o procedură de preluare a unui număr dat (să zicem M) de valori. In acest caz preluarea o facem în interiorul unui ciclu For…Loop în care variabila de ciclare poate lua valori de la 1 la M. Ce se întâmplă dacă utilizatorul dispune de un număr mai mic de valori. Pentru această situaţie se se plasează în ciclu o instrucţiune If care pentru o anumită valoare face ieşirea forţată din ciclu.

• Ieşirea forţată dintr-un ciclu se realizează cu instrucţiunile Exit For pentru ciclurile For…Loop sau Exit Do pentru ciclurile Do…While, Do…Until.

• Exemplu: Să presupunem că M =10 şi proiectăm ca ieşirea forţată dintr-un ciclu For să fie realizată atunci când variabila sngVal are valoarea 0, atunci ciclul va va fi următorul:

For intCiclu = 1 to 10If sngVal=0 then

Exit For ‘ieşire forţată din cicluEnd If

‘corpul ciclului For’Next intCiclu

18.12.2017

44

18.12.2017 13:26 45