Documente Academic
Documente Profesional
Documente Cultură
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 - ).
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>
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);