Sunteți pe pagina 1din 11

11.

Instrucţiunile limbajului C (continuare)

11.5. Instrucţiunile ciclice


 Raţionamentul uman de tip iterativ îşi găseşte corespondentul în limbajul C în instrucţiunile ciclice
(repetitive) – ce implementează structurile ciclice din programarea structurată.
 Instrucţiunile ciclice permit execuţia repetată a unei instrucţiuni sau a unei secvenţe de instrucţiuni
înglobate într-o instrucţiune compusă.
 Întreaga construcţie este considerată din punct de vedere sintactic ca o singură instrucţiune şi se poate
utiliza în orice context în care este permisă prezenţa unei instrucţiuni în C.
 Instrucţiunea sau secvenţa de instrucţiuni ce se execută în mod repetat formează corpul ciclului.
 În principiu, orice acţiune repetitivă trebuie să se încheie după un număr finit de paşi (reluări/repetări), ca
urmare a neîndeplinirii unei condiţii(în limbajul C) ce constituie aşa-numita relaţie de condiţionare a
ciclului .
 În limbajul C există trei tipuri de instrucţiuni ciclice :
- instrucţiunea while - ce implementează ciclul cu test iniţial (condiţionat anterior);
- instrucţiunea do - while - ce implementează ciclul cu test final (condiţionat posterior);
- instrucţiunea for - ce implementează ciclul cu contor.
11.5.1. Instrucţiunea while

Instrucţiunea implementează structura de ciclu cu test iniţial (condiţionat anterior) din programarea structurată
şi are sintaxa :
instructiune_while
while ( expresie ) instructiune

unde expresie este orice expresie validă în limbajul C şi implementează relaţia de condiţionare a ciclului şi
instrucţiune este o singură instrucţiune C . În cazul în care corpul ciclului ar trebui descris prin mai multe
instrucţiuni, acestea se pot grupa într-o singură instrucţiune, constituind astfel o instrucţiune compusă.
Efectul execuţiei acestei instrucţiuni este următorul :
- 1- se evaluează expresia expresie. În cazul în care valoarea expresiei este nenulă se continuă cu pasul
2, în caz contrar execuţia se încheie, situaţie în care se continuă cu execuţia instrucţiunii imediat următoare
instrucţiunii while;
- 2- se execută instrucţiune (corpul ciclului) şi apoi se revine la pasul 1.
O descriere echivalentă a modului de execuţie : atâta timp cât valoarea expresiei expresie este nenulă se
execută în mod repetat instrucţiunea instrucţiune. Execuţia ciclului se încheie în momentul în care expresia are
valoarea zero, situaţie în care se continuă cu execuţia instrucţiunii imediat următoare instrucţiunii while.

Observaţii :
- corpul ciclului poate să nu se execute niciodată dacă expresia are valoarea zero chiar la intrarea în ciclu;
- evident contextul în care se execută instrucţiunea ce constituie corpul ciclului sau chiar elementele variabile ce
intervin în expresie trebuie să acţioneze asupra expresiei, modificând-o, astfel încât, la un moment dat, valoarea
acesteia să devină nulă, asigurând astfel finitudine numărului de execuţii ale corpului ciclului;
- instrucţiunea care constituie corpul ciclului poate să definească un alt mod de execuţie a instrucţiunii while
decât cel indicat mai sus. Astfel ea poate realiza încheierea instrucţiunii while fără a se evalua expresia ce constituie
relaţia de condiţionare, prin intermediul unei aşa numite ieşiri forţate din ciclu (de exemplu corpul ciclului poate
conţine un apel al funcţiei exit).
Reamintim descrierea structurii de ciclu cu test iniţial din programarea structurată :

relatia_de_conditionare
cât timp expresie_condiţie execută
corpul ciclului
NU expresie_conditie DA
| *secvenţă
|_□

* Secventa

Exemple

1. Se preia de la consolă o secvenţă de întregi. Să se calculeze produsul valorilor introduse. Sesiunea se încheie când
nu se introduce un întreg de la tastatură (când se tastează un caracter ce nu este cifră zecimală, + sau - ).

2. Să se calculeze suma cifrelor unui număr dat n, pozitiv.

1 1 1
3. Să se calculeze în diferite moduri suma 1      (n ≥ 100000)
2 3 n

4. Să se calculeze şi să se afişeze cel mai mare divizor comun pentru două numere m si n
1. Se preia de la consolă o secvenţă de întregi. Să se calculeze produsul valorilor introduse. Sesiunea se încheie când
nu se introduce un întreg de la tastatură (când se tastează un caracter ce nu este cifră zecimală, + sau - ).

#include <stdio.h>

int main(void)
{
int x;
long prod;
prod=1L;
while (printf("x="),scanf("%d",&x)==1)
prod*=x;
printf("prod = %ld\n",prod);
return 0;
}
2. Să se calculeze suma cifrelor unui număr dat n, pozitiv.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
long n;
int sum=0;
printf("n=(n>0) =");
if(scanf("%ld",&n)!=1 || n<0)
{
printf("Date eronate\n");
exit(1);
}
printf("Suma cifrelor lui %ld ",n);
while(n>0)
{
sum+=n%10;
n/=10;
}
printf(" = %d\n",sum);
return 0;
}
1 1 1
3. Să se calculeze în diferite moduri suma 1    (n ≥ 100000)
2 3 n
#include <stdio.h>
int main(void)
{
long i,n;
float h;
n=100000L;
h=0.0f;
i=1;
while (i<=n)
{
h=h+1.0f/i;
i++;
}
printf("h1=%.6f\n",h);
h=0.0f;
i=n;
while (i>=1)
{
h=h+1.0f/i;
i-- ;
}
printf("h2=%.6f\n",h);
h=0.0f; i=0;
while (++i<=n)
h=h+1.0f/i;
printf("h3=%.6f\n",h);
return 0;
} // h1=12.090851 h2=12.090152 h3=12.090851
4. Să se calculeze şi să se afişeze cel mai mare divizor comun pentru două numere m si n

#include <stdio.h>

int main(void)
{
int m,n,r;

printf("m,n =");
if(scanf("%d%d",&m,&n)!=2)
printf("Date eronate\n");
else
{
printf("cmmdc al numerelor %d si %d = ",m,n);
while (n!=0)
{
r=m%n;
m=n;
n=r;
}
printf("%d\n",m);
}
return 0;
}
11.5.2. Instrucţiunea do - while
Instrucţiunea implementează structura de ciclu cu test final (condiţionat posterior) din programarea structurată
şi are sintaxa :
instructiune_do-while
do instructiune while ( expresie )

unde expresie este orice expresie validă în limbajul C şi implementează relaţia de condiţionare a ciclului, iar
instrucţiune este o singură instrucţiune C (în cazul în care corpul ciclului ar trebui descris prin mai multe
instrucţiuni, acestea se grupează într-o instrucţiune compusă).
Efectul execuţiei acestei instrucţiuni este următorul :
- 1 - se execută instrucţiune (corpul ciclului).;
- 2- se evaluează expresia expresie. În cazul în care expresia este nenulă se revine la pasul 1, în caz
contrar execuţia se încheie, situaţie în care se continuă cu execuţia instrucţiunii imediat următoare instrucţiunii do -
while.
O descriere echivalentă a modului de execuţie : se repetă execuţia instrucţiunii instrucţiune atâta timp
cât valoarea expresiei expresie este nenulă. Execuţia ciclului se încheie în momentul în care expresia are valoarea
zero, situaţie în care se continuă cu execuţia instrucţiunii imediat următoare instrucţiunii do-while.

Observaţii :
- corpul ciclului se execută cel puţin o dată, spre deosebire de cazul ciclului while;
- evident contextul în care se execută instrucţiunea ce constituie corpul ciclului sau chiar elementele variabile ce
intervin în expresie trebuie să acţioneze asupra expresiei, modificând-o, astfel încât, la un moment dat, valoarea
acesteia să devină nulă, asigurând astfel finitudine numărului de execuţii ale corpului ciclului;
- instrucţiunea care constituie corpul ciclului poate să definească un alt mod de execuţie a instrucţiunii do -
while decât cel indicat mai sus. Astfel ea poate realiza încheierea instrucţiunii do - while fără a se evalua expresia ce
constituie relaţia de condiţionare, prin intermediul unei aşa numite ieşiri forţate din ciclu (de exemplu corpul ciclului
poate conţine un apel al funcţiei exit).
Reamintim descrierea structurii de ciclu cu test final din programarea structurată :

corpul ciclului

repetă
* Secventa *secvenţă
cât timp expresie_condiţie

NU DA
expresie_conditie

relatia_de_conditionare

Având în vedere diferenţele menţionate în privinţa momentului evaluării condiţiei, înainte pentru while şi
respectiv după execuţia corpului ciclului, pentru do-while, pentru aplicaţiile în care corpul ciclului se execută cel
puţin odată, ciclul do-while se poate folosi cu acelaşi corp în locul ciclului while şi reciproc.
In general se poate scrie :

do  instrucţiune;
instrucţiune; while (expresie)
while (expresie); instrucţiune;
Exemple.

5. Sã se calculeze valoarea aproximativă a lui ex cu o eroare mai mică în modul decât epsilon, pentru un x preluat de la
consola (|x|<=0.5).
Se ştie că :
x x x 2 x3
e =1+ + + +
1! 2! 3!
şi modulul erorii de aproximare este < epsilon când modulul ultimului termen adăugat în sumă este < epsilon.
5.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define EPS 1e-10

int main(void)
{
double x,t,e;
int k;
char car;

do
{
do
{
printf("x=");
fflush(stdin);
} while (scanf("%lf",&x) !=1 || (fabs(x)> 0.5));
t=1.0;
e=1.0;
k=1;
do
{
t=x*t/k;
e=e+t;
k++;
}while (fabs(t) >EPS);

printf("expapr(%g) = %0.14g in %d iteratii\n", x, e, k - 1);


printf("expcalc(%g) = %0.14g\n ",x,exp(x));
printf("Doriti sa continuati ?(D/N)");
fflush(stdin);
scanf("%c",&car);
} while (car!='n' && car!='N' );
return 0;
}

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