Sunteți pe pagina 1din 8

Instruciuni de iterare

Instruciunile de iterare (ciclare) permit ca un grup de instruciuni s se execute


repetat, pn se ndeplinete o anumit condiie. n C, exist trei categorii de cicluri:
ciclul cu test iniial: instruciunea while;
ciclul cu test iniial i numr cunoscut de repetri: instruciunea for;
ciclul cu test final: instruciunea do-while.
Instruciunea while
Instruciunea while permite programarea ciclurilor cu test iniial. Forma general a
instruciunii while este urmtoarea:
while (expresie_condiie) instruciune;
unde instruciune este o instruciune vid, o singur instruciune sau un bloc de instrciuni, iar
expresie_condiie poate s fie orice expresie. Bucla se reia atta timp ct condiia este
adevrat, adic expresie_condiie ia o valoare diferit de zero. Cnd condiia devine fals, se
iese din ciclu i se continu execuia programului cu instruciunea ce urmeaz dup ciclu.
De exemplu, programul Afiseaza cod caracter utilizeaz un ciclu while pentru a afia
codul caracterului tastat. Ieirea din ciclu se face cnd se tasteaz caracterul ghilimele ( ).
/* Afiseaza cod caracter */
#include <stdio.h>
#include <conio.h>
void main()
{
int c;
clrscr();
/* Iesire cu caracterul " (ghilimele) *\
while ((c=getche()) != '"') printf("\ - %d\n",c);
}
n anumite cazuri, instruciunea repetat poate fi vid. De exemplu, secvena
while (getch())!='C');
ateapt apsarea tastei C pentru continuarea execuiei.
Programul Radical din numar pozitiv utilizeaz un ciclu while pentru a determina, cu o
anumit aproximaie, radicalul unui numr pozitiv. Programul folosete faptul c irul xn, unde
n este numr natural i x0 >0, are limita a .La un moment dat, programul utilizeaz numai
ultimii doi termini ai irului: xn-1, memorat n x i xn, memorat n y. Calculul se consider
ncheiat cnd diferena, n valoare absolut, dintre x i y este mai mic dect o valoare impus
delta.
/* Radical din numar pozitiv */
#include <stdio.h>
#include <conio.h>
void main()
32

{
float a,x=1,y,z;
const float delta=0.00001;
clrscr();
printf("\t Introduceti un numar pozitiv:");
scanf("%f",&a);
if (a<0) printf("\t Numarul %f este negativ:",a);
else
{
y=(x+a/x)/2;
z=x-y;
if (z<0) z=-z;
while (z>delta)
{
x=y;
y=(x+a/x)/2;
z=x-y;
if (z<0) z=-z;
}
printf("\t Radical din %g este %g\n",a,x);
}
getche();
}
Instruciunea for
n limbajul C, bucla for are o putere i o flexibilitate deosebit. Ea ofer o cea mai
compact metod de programare a ciclurilor cu test iniial.
Forma general a instruciunii for este urmtoarea:
for (expresie_iniializare; expresie_condiie; expresie_incrementare) instruciune;
unde:
expresie_iniializare este o instruciune care realizeaz iniializarea buclei;
expresie_condiie este oexpresie relaional care determin ieirea din bucl;
expresie_incrementare stabilete modul n care se modific variabila de control a buclei
(contorul).
Rolul celor trei expresii este urmtorul:
expresie_iniializare este evaluat o singur dat, naintea primei iteraii, pentru a efectua
iniializrile necesare (variabila de control i ali parametrii);
expresie_condiie este evaluat i testat nainte de fiecare iteraie;
expresie_incrementare se evaluaz la sfritul fiecrei iteraii i actualizeaz parametrii
ciclului.
Instruciunea for poate fi echivalat cu urmtorul ciclu while:
expresie_iniializare;
while (expresie_condiie)
{
instruciune;
expresie_incrementare;
33

}
Instruciunea subordonat ciclului este executat dup verificarea condiiei, dac aceasta
este adevrat. Cnd condiia devine fals, se iese din ciclu i se continu execuia
programului cu instruciunea ce urmeaz dup ciclu.
De exemplu, programul Suma a n numere reale utilizeaz ciclul for, pentru citirea
termenului irului i pentru calculul sumei acestora.
/* Suma a n numere reale */
#include <stdio.h>
#include <conio.h>
void main()
{
int i,a[50];
long int s;
char n;
clrscr();
printf("\tn=");scanf("%d",&n);
for (i=1;i<=n;i++)
{
printf("\ta(%d)=",i);
scanf("%i",&a[i]);
}
s=0;
for (i=1;i<=n;++i) s=s+a[i];
printf("suma=%ld",s);
getch();
}
Pentru ai mri puterea, flexibilitatea i aplicabilitatea sunt permise mai multe
variaiuni ale ciclului for. De exemplu, secvena:
s=0;
for (i=1;i<=n;++i) s=s+a[i];
poate fi scris i sub forma urmtoare:
s=0;
for (i=0;i<n;s+=a[++i]);
Una dintre cele mai folosite variaiuni folosete operatorul virgul a se mri numrul
de expresii la inializare sau incrementare. De exemplu, secvena anterioar poate fi scris i
sub forma urmtoare:
for (i=0,s=0;i<n;s+=a[++i]);
iar secvena:
printf("\tn=");scanf("%d",&n);
for (i=1;i<=n;i++)
{
printf("\ta(%d)=",i);
34

scanf("%i",&a[i]);
}
s=0;
for (i=1;i<=n;++i) s=s+a[i];
printf("suma=%ld",s);
poate fi echivalat cu o singur instruciune for:
for (i=1,s=0,printf("\tn="),scanf("%d",&n);
i<=n;
printf("\ta(%d)=",i),scanf("%i",&a[i]),s+=a[i++]);
printf("suma=%ld",s);
de unde i gluma care afirm c un program n C poate fi redus la o singur instruciune for.
Utilizarea expresiilor de tip virgul permit i cotrolul ciclului cu mai muli contori. De
exemplu programul Inverseaza sir folosete un ciclu for controlat de doi contori i i j.
/* Inverseaza sir */
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
char i,j,n,c,sir[50];
clrscr();
printf("\tIntroduceti un sir:");gets(sir);
for (i=0,n=strlen(sir),j=n-1;i<=j;++i,--j)
{
c=sir[i];
sir[i]=sir[j];
sir[j]=c;
};
printf("sir=%s",sir);
getch();
}
Observaie: Fiecare din cele trei seciuni ale buclei for poate s conin orice expresie
valid i nu este necesar ca expresiile s aib legtur cu scopul utilizrii lor.
De exemplu, programul Afiseaza caractere conine o bucl for fr iniializare i
pentru care expresia de incrementare este una de atribuire. Ieirea din bucl are loc cnd
expresia c-27 ia valoarea zero, adic atunci cnd se tasteaz Esc
/* Afiseaza caractere */
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
clrscr();
printf("Introduceti caractere:");
35

/* Iesire cu Esc */
for (;c-27;c=getch()) printf("%c\n",c);
}
Ciclul for, din programul de mai sus, se poate scrie i fr expresia de incrementare,
adic sub forma:
for (;c-27;)
{
c=getch();
printf("%c\n",c);
}
Cum un ciclu for poate utiliza orice expresii, cicluldin programul Afiseaza caractere,
se poate scrie i fr expresii, adic sub forma:
for (;;) /* Ciclu infinit */
{
c=getch();
if (c-27) printf("%c",c);
else break;
}
}
Dac pentru ieirea din bucl nu s-ar utiliza instruciunea break, ciclul ar fi infinit.
Observaie: Un ciclu for poate s nu conin nici o instruciune subordonat.
De exemplu, pentru a se realiza o temporizare egal cu o valoare cunoscut temp, se
poate utiliza secvena:
/* Ciclu fara instructiune */
for (t=1;t<temp;t++);
Instruciunea do-while
Instruciunea do-while permite programarea ciclurilor cu test final. Spre deosebire de
ciclurile while i for care testeaz condiia la nceputul buclei, ciclul do-while verific condiia
la sfritul buclei.
Forma general a instruciunii do-while este urmtoarea:
do
instruciune;
while (expresie_condiie)
Instruciunea se execut cel puin o dat i se reia atta timp ct condiia este
adevrat, adic expresie_condiie ia o valoare diferit de zero.
Pentru exemplificare, se consider programul Factorial, care calculeaz factorialul
unui numr natural:

36

/* Factorial */
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int n,i=1;
long int f=1;
printf("\tIntroduceti un numar natural:");
scanf("%ld",&n);
f = 1;
do
{
f *= i;
i++;
}
while (i<=n);
printf("\tn!=%ld",f);
getch();
}
Instruciuni de salt
Aceast categorie de instruciuni permite ntreruperea necondiionat a unei secvene
i continuarea programului dintr-un alt punct. Din aceast categorie fac parte instruciunile:
break, continue, goto i return (va fi prezentat n detaliu n capitolul destinat funciilor).
Instruciunea break

Instruciunea break se utilizeaz n dou contexte:


n instruciunea switch, pentru a marca ncheierea secvenei de instruciuni asociate unui
selector case sau clauzei default, cu ieire din instruciunea switch.
n instruciunile de ciclare, pentru a determina ieirea forat (ntreruperea iteraiilor)
dintr-un ciclu, indiferent de valoarea condiiei de ciclare.

Observaie: Pentru ieirea forat dintr-un program, se poate folosi funcia exit() care
acioneaz ca un break generalizat. Prototipul acestei funcii este
void exit(int cod_de_intoarcere);
i se gsete n fiierele antet process.h i stdlib.h . Valoarea cod_de_intoarcere este returnat
procesului, de obicei, sistemul de operare i indic tipuri de erori (zero indic terminarea
normal a programului).
De exemplu, n programul Testeaza cod, instruciunea break este utilizat pentru a
determina ieirea forat dintr-un ciclu while, atunci cnd codul introdus este corect, i funcia
exit(), atunci cnd, dup trei ncercri, nu s-a introdus codul corect.
/* Testeaza cod */
#include <stdio.h>
#include <conio.h>
37

#include <process.h>
void main()
{
char i;
unsigned int cod,pin=1234;
i=1;
while (i-4)
{
clrscr();
printf("Introduceti codul PIN:");
scanf("%ud\n",&cod);
if (cod==pin) break;
++i;
}
if (i>3) exit(1);
else printf("Cod PIN corect");
getch();
}
Observaie: n cazul ciclurilor (sau instruciunilor switch) imbricate, instruciunea
break determin ieirea forat numai din ciclul (sau instruciunea switch) care o conine i nu
afecteaz ciclurile (sau instruciunile switch) externe.
Instruciunea continue
Instruciunea continue se utilizeaz numai n cadrul blocului instruciunilor de ciclare
pentru a ntrerupe execuia iteraiei curente (srind peste instruciunile urmtoare) dup care:
n cazul instruciunilor while i do-while, se continu cu evaluarea expresiei condiiei de
ciclare;
n cazul instruciunii for, se continu cu evaluarea expresiei de incrementare (actualizare
contori) dup care se face evaluarea expresiei condiiei de ciclare.
Pentru exemplificare, se consider programul Numarare spatii sir care numr spaiile
dintr-un ir dat.
/* Numarare spatii sir */
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
char i,j,n,sir[50];
clrscr();
printf("\tIntroduceti un sir:");gets(sir);
for (i=j=0,n=strlen(sir);i<=n;++i)
{
if (sir[i] != ' ') continue;
j++;
};
printf("numar spatii=%d",j);
getch();
}
38

n cazul ciclurilor imbricate, instruciunea continue este asociat ciclului n al crui


bloc se afl i nu afecteaz ciclurile externe.
Instruciunea goto
Instruciunea goto are sintaxa:
goto eticheta;
.
.
.
eticheta:
Efectul instruciunii goto este ntreruperea secvenei curente i continuarea execuiei
cu instruciunea ce urmeaz dup eticheta. Eticheta poate fi plasat nainte sau dup
instruciunea goto dar numai n aceeai funcie cu aceasta.
Pentru exemplificare, se consider programul urmtor:
/* Factorial cu GOTO */
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
unsigned char n,i=1;
unsigned long int f=1;
printf("\tIntroduceti un numar natural:");
scanf("%uc",&n);
f = 1;
eticheta:
{
f *= i;
i++;
}
if (i<=n) goto eticheta;
printf("\tn!=%u",f);
getch();
}
Instruciuni de tip expresie
Instruciunea expresie este pur i simplu o expresie valid urmat de punct i virgul.
De exemplu, secvena de mai jos conine expresii valide.
f();
a=b+c;
x+f();
;

/* apel de functie */
/* instructiune de atribuire */
/* expresie valda, apelul functiei
poate efectua ceva */
/* instructiune vida */

39

S-ar putea să vă placă și