Documente Academic
Documente Profesional
Documente Cultură
Instruciuni C\C++
(partea a II-a)
7. Instruciunea while
Sintaxa: while (expresie-test) instruciune-corp
Instruciunea while i 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 esenial c instruciunea while pstreaz controlul dup executarea instruciunii
corp, relund evaluarea expresiei-test. Controlul execuiei trece la urmtoarea instruciune din textul
surs al programului (dac n corp nu sunt prevzute salturi) numai atunci cnd expresia test devine
fals (egal 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 lurii 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
1
urmtorul ir 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 string
(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
numai dup aceasta intr n ciclul testare repetare, spre deosebire de while care ncepe direct cu
evaluarea expresiei test. In concluzie, instruciunea 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. De exemplu, n programul urmtor utilizatorul trebuie s
introduc mai nti un numr pentru ca acesta s poat fi testat dac este sau nu strict pozitiv:
2
#include<iostream>
using namespace std;
int main(){
int a;
do{
cout<<"Dati un numar strict pozitiv, a=";
cin>>a;
}while(a<=0);
cout<<"Avem a="<<a<<endl;
return 0;
}
/* EXEMPLU:
Dati un numar
Dati un numar
Dati un numar
Avem a=12
Press any key
pozitiv, a=-2
pozitiv, a=-10
pozitiv, a=12
to continue . . .*/
Un alt exemplu: pentru a copia tot stringul mesaj, inclusiv terminatorul de string, este de
preferat utilizarea instruciunii do-while:
#include<iostream>
using namespace std;
const int dimMax=100;
int main(){
char ch,text[dimMax],mesaj[dimMax]="Un exemplu banal!";
int i=0;
do {
ch=text[i]=mesaj[i];
i++;
} while (ch!='\0');
cout<<text<<endl;
return 0;
}
Dac irul de caractere text este vid, este copiat numai codul caracterului nul (zero).
Atenie; urmtoarea compactificare duce la o expresie ambigu:
do
ch=text[i]=mesaj[i++];
while (ch!='\0');
cout<<text<<endl;
9. Instruciunea for
Sintaxa: for ( expresie-inial; expresie-test; expresie-reluare) instruciune-corp
Instruciunea for, cu o sintax mult mai complex dect 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,
3
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 executat de secvena de
instruciuni:
i=0;
while (i<100){
tab[i]=0;
i++;
}
In final menionm c n C++ sintaxa instruciunii for permite ca n locul expresiei iniiale s apar
o instruciune declaraie, n acest caz domeniul de vizibilitate al variabilelor declarate aici este
restrns la blocul format de instruciunea for respectiv. Mai precis, urmtoarea secven de cod
int n=10;
for(int i=1,s=0;i<=n; i++){
s+=i;
cout<<"i="<<i<<" s="<<s<<endl;
}
este echivalent cu
int n=10;
{
int i=1,s=0;
while(i<=n){
s+=i;
cout<<"i="<<i<<" s="<<s<<endl;
i++;
}
}
/* REZULTAT
i=0 break
i=1 j=0 break
i=2 j=0 j=1 break
i=3 j=0 j=1 j=2 break
i=4 j=0 j=1 j=2 j=3 break
Press any key to continue . . .*/
Exemplu:
#include<iostream>
using namespace std;
int main(void){
int i, j;
for (i = 0; i<5; i++){
cout << "i=" << i;
for (j = 0; j<5; j++){
if (i == j) {
cout << " continue ";
continue;
}
cout << " j=" << j;
}
cout << endl;
}
return 0;
}
/* REZULTAT
i=0 continue j=1 j=2 j=3 j=4
i=1 j=0 continue j=2 j=3 j=4
i=2 j=0 j=1 continue j=3 j=4
i=3 j=0 j=1 j=2 continue j=4
i=4 j=0 j=1 j=2 j=3 continue
Press any key to continue . . .*/
Iat o ilustrare a utilizrii instruciunilor break i continue n rezolvarea urmtoarei probleme: s se scrie o funcie care afieaz numai valorile comune a doi vectori, fiecare valoare fiind
afiat o singur dat.
#include<iostream>
using namespace std;
//afiseaza valorile comune o singura data
void afisare(int a[], int b[], int dim){
for (int i = 0; i<dim; i++){
double val = a[i];
//aflam daca val este valoare comuna
int eValoareComuna = 0;
for (int j = 0; j < dim; j++){
if (b[j] != val) continue; //->j++
eValoareComuna = 1;
break; //oprim for-ul dupa j
}
if (!eValoareComuna) continue;
//->i++
//val este valoare comuna
//aflam daca a mai fost afisata
int aFostAfisata = 0;
for (int k = 0; k<i; k++){
if (a[k] != val) continue; //->k++
aFostAfisata = 1;
break; //oprim for-ul dupa k
}
if (aFostAfisata) continue;
//->i++
//val este valoare comuna
//nu a mai fost afisata
//o afisam
cout << val << ' ';
}
cout << endl;
}
int main(){
const int dim = 10;
int a[dim] = { 1, 7, 3, 4, 4, 3, 7, 3, 9, 0 };
int b[dim] = { 0, 9, 3, 5, 1, 3, 7, 3, 0, 1 };
afisare(a, b, dim);
return 0;
}
/*REZULTAT:
1 7 3 9 0
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.
9