Lectia 12

Structuri repetitive

Atunci când se doreşte repetarea unei acţiuni de un anumit număr de ori este necesară utilizarea unei structuri repetitive. În funcţie de numărul repetărilor acestea se clasifică în:

· Structuri repetitive cu număr nedeterminat de paşi

o Cu test iniţial

o Cu test final

· Structuri repetitive cu număr fix de paşi

Structura repetitivă cu test iniţial

Numele acestei structuri repetitive ţine de faptul că înaintea executării blocului de instrucţiuni se verifică îndeplinirea unei condiţii. În limbajul C++ este cunoscută sub denumirea de structura while. Reprezentarea acestei structuri este:

Schema logică

Pseudocod

Instructiune C++

while (expresie logică)

instrucţiune;

sau:

while (expresie logică)

{ instrucţiune1;

instrucţiune2;

......................

instrucţiunen;

};

Mod de execuţie:

  • Pas 1 :Se determină valoarea de adevăr a condiţiei notată C;

  • Pas 2: Dacă este adevărată atunci se execută blocul de instrucţiuni notat BI şi se revine la pas1

  • Pas 3: Dacă este falsă atunci se părăseşte structura repetitivă.

Observaţii:

  • Dacă la prima evaluare a condiţiei C valaorea de adevar este Fals, atunci blocul de instrucţiuni BI nu va fi executat nici macar o singură dată ci se va părăsi structura repetitivă cu test iniţial;

  • Evaluarea condiţiei C se face la fiecare reluare a structurii si este recomandat ca forma ei să fie cât mai simplă;

  • Utilizarea acestei structuri este recomandată atunci când nu se cunoaşte numărul de repetări ale buclei şi atunci când condiţia poate avea valoarea fals încă de la intrarea în structură;

  • Blocul de instrucţiuni notat BI poate conţine orice fel de structură de control, deci şi o altă structură repetitivă cu test iniţial(while-uri imbricate);

  • Buclele infinite nu vor fi sesizate ca erori de compilare;

  • Utilizatorul este obligat să fie atent în evitarea formării de bucle infinite, şi să verifice ca după un anumit număr de repetări să existe premizele transformării în Fals a valorii condiţiei C.

Structura repetitivă cu test final

În acest caz blocul de instrucţiuni este executat iniţial fără nici o verificare a unei condiţii, aceasta finnd verificată la final. În limbajul C++ este cunoscută sub denumirea de structura do-while. Reprezentarea acestei structuri este:

Schema logică

Pseudocod

Instructiune C++

do

instrucţiune;

while (expresie logică);

sau:

do

{ instrucţiune1;

instrucţiune2;

......................

instrucţiunen;

}

while (expresie logică)

Mod de execuţie:

  • Pas 1 :Se execută blocul de instrucţiuni notat BI;

  • Pas 2: Se calculează valoarea de adevăr a condiţiei notate C;

  • Pas 3: Daca este adevărată atunci se revine la pas1

  • Pas 3: Dacă este falsă atunci se părăseşte structura repetitivă.

Observaţii:

  • BI va fi executat cel puţin o singură dată, atunci cînd la prima evaluare a condiţiei C rezultatul este Fals;

  • spre deosebire de structura repetitivă cu test iniţial, în acest caz blocul de instrucţiuni BI se execută cel puţin o singură dată;

  • este recomandată utilizarea ei în situaţiile în care nu se cunoaşte numărul de repetări ale buclei şi există certitudinea executării cel puţin o singură dată a blocului de instrucţiuni;

  • utilizatorul este obligat să fie atent în evitarea formării de bucle infinite şi să verifice ca după un anumit număr de repetări să existe premizele transformării în fals a valorii condiţiei C şi deci şă se părăsească structura repetitivă;

Structura repetitivă cu număr fix de paşi

Spre deosebire de structurile repetitive prezentate anterior, structura repetitivă cu număr fix de paşi se foloseşte atunci când se cunoaşte în mod exact, de la început, de câte ori trebuie repetată o acţiune. Se mai numeşte şi structură repetitivă cu contor, iar în funcţie de valoarea pasului (mai mare decât 0/ mai mică decât 0) apare în două forme:

  • cu pas pozitiv

  • cu pas negativ

for(iniţializare; condiţie oprire; pas)

instrucţiune;

sau:

for(iniţializare; condiţie oprire; pas)

{ instrucţiune1;

instrucţiune2;

.............

instrucţiunen;

};

Unde:

  • expr1- reprezintă valoarea iniţială a variabilei de tip contor

  • C - condiţia de oprire, sau valoarea finală la care trebuie să ajungă valoarea variabilei contor

  • Pas - reprezintă o valoare constantă care are scopul de a modifica în progresie aritmetică crescătoare/descrescătoare valoarea variabilei contor

Mod de execuţie

  • pas1 - se iniţializeză variabila contor cu valoarea expresiei expr1. Această operaţie se execută o singură dată;

  • pas 2 - se verifică indeplinirea condiţiei de oprire;

  • pas 3 - dacă nu este îndeplinită condiţia de oprire atunci se execută blocul de instrucţiuni notat BI;

  • pas 4 - se adaugă valoarea pasului la valoarea variabilei contor şi se revine la pasul 2;

  • pas 5 – dacă condiţia de oprire este îndeplinită atunci se încheie execuţia acestei structuri.

Observaţii

· dacă pasul este pozitiv, în momentul în care valoarea variabilei contor devine mai mare decât valoarea finală atunci se va încheia execuţia structurii repetitive cu număr fix de paşi;

· numărul de repetări ale blocului de instrucţiuni BI se calculează cu relaţia:

· dacă valoarea iniţială este egală cu valoarea finală atunci Bi se va executa o singură dată, indiferent de valoarea şi semnul pasului;

· dacă valoarea iniţială este mai mare decât valoarea finală şi pasul este pozitiv atunci BI nu se va executa nici măcar o singură dată.

· Linia contor=contor±pas nu apare nici în limbajul pseudocod şi nici în forma instrucţiunii for, ea se subântelege şi execută automat la fiecare nouă repetare a structurii.

· Blocul de instrucţiuni poate fi alcătuit din orice fel de instrucţiune a limbajului C++, iar în condiţia în care se doreşte executarea mai multor instrucţiuni în cadrul instrucţiunii for, atunci acestea trebuie grupate între acolade.

Conversii între structuri repetitive

Între cele trei tipuri de structuri repetitive există următoarele operații de conversie:

Instrucţiunea for poate fi înlocuită întotdeauna de una dintre structurile repetitive while sau do-while, dar nu întotdeauna o structură while sau do-while poate fi înlocuită cu o instrucţiune for. Atunci când realizaţi o conversie din instrucţiunea while în do-while trebuie sa aveţi grijă ca secvenţa de cod obţinută după conversie sa fie echivalentă cu secvenţa iniţială (să se obţină acelaşi rezultat).