Documente Academic
Documente Profesional
Documente Cultură
7. Instruciunea while
Sintaxa: while (expresie-test) instruciune-corp Instruciunea while insereaz n mod repetat n fluxul de execuie instruciunea sa corp, att timp ct expresia-test este adevarat (are o valoare nenul). Este asemntoare cu instruciunea if, cu diferena esential c, dup executarea instruciunii corp, controlul este pstrat de while i se reia evaluarea expresiei-test. Controlul execuiei trece la urm-toarea instruciune din textul sursa al programului (daca n corp nu sunt prevazute salturi) numai atunci cand expresia test devine fals (egala cu zero). Dac expresia test este fals de la bun nceput, instruciunea corp nu este executat niciodat. Tipul expresiei-test trebuie sa fie scalar (numeric sau pointer) i la evaluare sunt completate toate efectele ei secundare naintea luarii deciziei de contiunare sau de terminare a ciclrii. Instruciunea-corp poate fi de orice tip (inclusiv o instruciune while), dar ca s aibe sens utilizarea ei trebuie sa fie o instruciune efectiv i nu o declaraie, de exemplu. De regul, instruciunea corp
este o instruciune compus, coninnd o secven de cod care descrie aciunea care trebuie repetat. De exemplu, pentru a tipri codurile ASCII ale caracterelor stringului text, se poate utiliza urmatorul sir de instruciuni:
int i=0; while(text[i]!='\0'){ cout<<(int)text[i]<<" "; i++; }
Dac irul de caractere este vid (adic text[0]== '\0'), nu este tiparit nici un cod ASCII. Secventa de mai sus poate fi compactat astfel:
int i=0; while(text[i]!='\0') cout<<(int)text[i++]<<" "; cout<<endl;
sau
int ch,i=0; while((ch=text[i++])!='\0') cout<<ch<<" "; cout<<endl;
Primele dou variante sunt complet echivalente, a treia, dei execut acelai lucru, difer de primele prin valoarea indexului i la ieirea din ciclare: deoarece n ultima variant incrementarea indexului are loc la evaluarea condiiei de continuare, i este incrementat i n cazul n care se decide ieirea din ciclare, astfel c n final valoarea indexului depete cu o unitate locul terminatorului de ir (caracterul nul).
8. Instruciunea do-while
Sintaxa: do instruciune-corp while (expresie-test); Instruciunile while i do-while sunt foarte asemntoare, singura diferen aprnd doar la iniierea ciclrii: la start, do-while execut o dat, n mod necondiionat, instruciunea sa corp i dup aceasta intr n ciclul evaluare test repetare execuie, spre deosebire de while care ncepe direct cu evaluarea expresiei test. In concluzie, instruc-tiunea do-while este echivalent cu urmtoarea secven de instruciuni: instruciune-corp while (expresie-test) instruciune-corp De remarcat c sintaxa instruciunii do-while prevede existena terminatorului ;care nu poate fi nlocuit cu nimic altceva (aici nu are sensul de instruciune nul). Instruciunea do-while este de preferat n locul instruciunii while n situaia n care aciunea iterat trebuie executat cel puin o dat. Exemplu: pentru a tipri toate codurile ASCII ale caracterelor stringului text, inclusiv codul terminatorului de ir (caracterul nul), este de preferat utilizarea instruciunii do-while:
int ch, i=0; do { ch=text[i]; cout<<ch<<" "; i++; } while (ch!='\0'); cout<<endl;
Dac irul de caractere text este vid, este imprimat numai codul caracterului nul (zero). Evident c i aceast secven poate fi scris ntr-un mod mai compact:
int ch, i=0; do cout<<(ch=text[i++])<<" "; while (ch!='\0'); cout<<endl;
Instruciunile while i do-while sunt preferate atunci cand expresia-test nu depinde direct de variabila indexat.
9. Instruciunea for
Sintaxa: for ( expresie-inial; expresie-test; expresie-reluare) instruciune-corp Instruciunea for, cu o sintaxa mult mai complex decat celelalte instruciuni de ciclare, furnizeaz o scriere compactat a etapelor standard de execuie a unui proces iterativ: iniializarea variabilelor naintea startului, evaluarea testului de ciclare, execuia aciunilor din corpul ciclului, actualizarea variabilelor implicate n expresia-test, reluarea testrii. In general (cu cteva excepii care vor fi precizate ulterior) instruciunea for este echivalent cu urmatoarea secven de instruciuni: expresie-inial; while ( expresie-test) { instruciune-corp expresie-reluare; } De exemplu, iniializarea cu zero a componentelor tabloului tab[100], executat de secvena de instruciuni:
i=0; while (i<100){ tab[i]=0; i++; }
Execuia instruciunii for ncepe cu evaluarea expresie-iniiale i completarea tuturor efectelor sale secundare. Expresia iniial poate fi de orice tip, scopul ei este de iniializare a valorilor variabilelor implicate n ciclare (dac trebuie facute mai multe atribuiri se poate folosi operatorul virgul, desigur). Ea este evaluat o singur dat, imediat nainte de intrarea n ciclarea propriu-zis. Dup evaluarea expresiei de iniializare se trece la evaluarea expresiei-test (i
completarea efectelor ei secundare). Expresia test trebuie s fie de tip scalar. Dac rezultatul evaluarii e fals execuia instruciunii for se ncheie aici, iar controlul este preluat de urmatoarea instruciune din textul surs. Dac expresia-test este adevarat se continu cu execuia instruciuniicorp. Dup finalizarea aciunilor descrise de corpul ciclui for (instruciunea-corp) i imediat nainte de reluarea testrii este evaluat expresia-reluare. Expresia-reluare poate avea orice tip, ea este utilizat mai ales pentru actualizarea valorii variabilei index. Dup completarea efectelor secundare a expresiei-reluare se reia procesul iterativ prin re-evaluarea expresiei test. Oricare dintre cele trei expresii din antetul instruciunii for poate lipsi, doar prezena celor doua simboluri punct i virgul este obligatorie. In cazul n care lipsete expresia-test ( fapt interzis pentru if sau pentru while) se consider ca testul de reluare a iteraiei este n mod implicit satisfcut. In acest caz, dac nu este prevzut ieirea forat (prin salt) din ciclare, execuia instruciunii for continu la nesfarit i, n consecin, blocheaza execuia programului. De reinut: urmatoarea form a instruciunei for: for ( ; expresie-test; ) instruciune-corp este echivalent cu while ( expresie-test ) instruciune-corp n timp ce forma: for ( ; ; ) instruciune-corp este echivalent cu while ( 1 ) instruciune-corp. Urmatoarele exemple ilustreaz modul uzual de utilizare al instruciunii for. Exemplul 1. Sumarea din trei n trei a elementelor unui tablou uni-dimensional, tab[], ncepand cu tab[2]:
for( suma=0,i=2; i<n; i+=3) suma+=tab[i];
for(i=0; i<20; i++){ if (i%3==0) continue; cout<<i<<" "; } cout<<endl; return 0; } /* REZULTAT 1 2 4 5 7 8 10 11 13 14 16 17 19 Press any key to continue */
Dac n matricea mat nu exist elemente nule sunt afiate toate inversele elementelor i apoi apare textul "GATA", altfel afiarea se ncheie la prima apariie a lui zero. Se poate nlocui goto cu return dac afiarea se efectueaz ntr-o funcie adecvat.