Instrucţiuni repetitive

Instrucţiunile de acest tip asigură repetarea unei instrucţiuni (simple sau compuse) de un anumit număr de ori sau cât timp este îndeplinită o condiţie. În C++ sunt în număr de trei: while, do-while, for.

### **Instrucţiunea while**

Are sintaxa generală:

```
while(<expresie_condiţională>) <instrucţiune>;

```

Intrucţiunea determină repetarea instrucţiunii cât timp evaluarea expresiei se face cu valoarea true. Dacă, la un moment dat în execuţie, evaluarea se face cu false, instrucţiunea este închisă şi se trece la linia următoare din program.

În exemplul următor variabila n este iniţializată cu 10 şi, pe rând, după ce este afişată, i se coboară valoarea până la 1. Să reţinem, deci, că ultima execuţie se va face pentru valoarea 1.

```
 int n = 10;
 while (n>0)
 {
     cout << n << ", ";
     n--;
 }

```

Efectule execuţiei ar fi, evident, afişarea valorilor 10, 9, 8 … 1. Întreg procesul de execuţie al secvenţei se poate descrie astfel:

pas 1: lui n i se atribuie valoarea iniţială 10

pas 2: este verificată valoarea lui n prin expresia n > 0. În acest moment există două posibilităţi,

• valoarea expresiei este true, adică n>0, caz în care se trece la executarea pasului 3

• valoarea este evaluată ca false, adică n<=0, caz în care se trece la executarea instrucţiunii aflate în program după secvenţă.

pas 3: se execută instrucţiunea compusă {cout << n << ", "; n--;}, după care se revine la pasul 2.

Trebuie făcută, în general, următoarea observaţiei. Instrucţiunea trebuie să se oprească la un moment dat. Acest lucru înseamnă că valoarea variabilelor verificate trebuie, cumva, modificată, astfel încât valoarea expresiei să devină false. În cazul nostru, acest lucru se realizează prin instrucţiunea n--, ce determină scăderea unei unităţi la fiecare execuţie a secvenţei.

Este important să reţinem şi că, la ieşirea din instrucţiune, varibila/variabilele vor avea primele valori care nu verifică

### **Instrucţiunea do-while**

Are sintaxa generală

```
do
{
<instrucţiune;>
}
while (<expresie_condiţională>);

```

Instrucţiunea do-while are un comportament asemănător instrucţiunii while, dar se deosebeşte prin aceea că asigură execuţia instrucţiunii cel puţin o dată, indiferent de îndeplinirea condiţiei.

În exemplul următor am rescris codul de la instrucţiunea while:

```
int n = 10;
do
  {
  cout << n << ", ";
  n--;
  }
while (n>0) ;

```

După cum se obsevă, efectul execuţiei este identic, în urma sa afişându-se, în ordine, numerele de la 10 la 1.

### **Instrucţiunea for**

Numită şi intrucţiune repetitivă cu număr cunoscut de paşi, instrucţiunea for este concepută pentru a se executa de un număr determinat de ori.

Sintaxa sa generală este:

```
for(<instrucţiune_iniţializare>; <expresie_condiţională>; <expresie_creştere)
  {
  <lista_instrucţiuni>;
  }

```

Precum în cazul while şi instrucţiunea din interiorul for  se execută cât timp expresia condiţională este evaluată cu true.

Procesul de execuţie al instrucţiunii for poate fi rezumat astfel:

pas 1: se execută instrucţiunea de iniţializare. De obicei, în acest moment se declară o variabilă contor şi este iniţializată cu o valoare. Această instrucţiune este executată o singură dată, la început.

pas 2: este evaluată expresia. Dacă rezultatul evaluării este true, instrucţiunea continuă. Altfel este terminată şi programul continuă cu pasul 5.

pas 3: este executată instrucţiunea. Aceasta poate fi o instrucţiune simplă sau compusă.

pas 4: se execută expresia de creştere. Se revine la pas 2

pas 5: Instrucţiunea for este terminată şi se trece la isntrucţiunea următoare.

Urmărind exemplele anterioare, iată cum, folosind instrucţiunea for putem afişa numerele de la 1 la 10, în ordine descrescătoare:

```
int i;

for(i=10;i>0;i--)

cout<<i<<’,’;

```

Cele trei câmpuri ale instrucţiunii sunt opţionale. Ele pot lipsi din scrierea instrucţiunii, dar ar trebui înlocuit efectul executării lor prin alte instrucţiuni. În exemplul următor vom rescrie secvenţa anterioară, făcând iniţializarea înainte.

```
int i=10;
for(;i>0;i--)
  cout<<i<<’,’;

```

Chiar dacă un câmp lipseşte, separatorul ; este obligatoriu. Trebuie avut în vedere că o instrucţiune for fără expresie condiţională este echivalentă cu o instrucţiune for infinită.

Remarcabil este că fiecare câmp poate conţine mai multe instrucţiuni. Totuşi, fiind considerate expresii, acestea nu pot conţine instrucţiuni compuse. Pot fi scrise, însă, mai multe instrucţiuni, despărţite prin virgulă, care este un separator de expresii. Este, astfel, posibil să avem, spre exemplu, în cadrul unui for, două variabile de ciclare, iniţializându-le şi modificându-le valorile amândurora.

```
for(i=10, j=0;i>0,j<=10;i--, j++)
  cout<<i<<'+'<<j<<'='<<i+j<<endl;

```

Exemplul de mai sus foloseşte această facilitate pentru a determina scrierea lui 10 ca sumă de două numere naturale.

Instrucţiunea for, afară de utilizarea tocmai prezentată, utilizată, altminteri, cel mai frecvent, admite şi iterarea unor domenii. În acest caz sintaxa este:

```
for(declarare: domeniu)
       <lista_instrucţiuni>;

```