Upload
others
View
8
Download
0
Embed Size (px)
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