INSTRUCŢIUNEA DO
Sunt situatii când la o secventa de instructiuni repetitiva sa apara necesitatea ca testul pentru reluarea buclei sa se faca la sfârsit. În aceste cazuri trebuie folosita instructiunea do, numita si instructiunea repetitiva (de buclare) cu test final. Formatul instructiunii este:
do
instructiune
while (expresie) ;
unde instructiune este un bloc sau chiar o singura instructiune si constituie corpul buclei, iar expresie este testul final al buclei.
Se executa corpul buclei, dupa care se evalueaza expresie si daca este diferita de zero (adevarata) atunci se reia executia corpului instructiunii, astfel daca expresie este zero (falsa) bucla ia sfârsit si se trece la instructiunea urmatoare de dupa do. Din modul de executare a instructiunii do se observa ca instructiune (corpul buclei) se executa cel putin o data.
si instructiunea do poate defini o bucla infinita:
do
.......
.......
if (.....) break;
........
........
while (1);
iesirea din bucla facându-se cu break sau return ca mai sus.
Iata în continuare câteva exemple de utilizare a instructiunii do.
Exemplu 3.7.1.
Acest program determina o radacina a ecuatiei f(x) = 0 din intervalul a,b cu precizia eps prin metoda înjumatatirii intervalului.
# include "stdio.h"
# include "math.h"
main ( )
unsigned i, k;
double a, b, c, x, fa, fb, fc, eps, f ( );
printf("Determinarea radacinii ecuatiei f(x) = 0 în intervalul a,b cu precizia eps \n");
printf("prin metoda înjumatatirii intervalului n");
do
printf("Introduceti (a,b,eps): ");
scanf("%1f, %1f, %1f, &a, &b, &eps);
while (a > = b eps < = 0);
fa = f (a);
fb = f (b);
tf (fa* fb >0)
printf ("Nu este diferenta de semn între f (a) si f (b) \n");
exit (1);
k = 0;
if (fa = = 0)
x = a;
k = 1;
else
if (fb = = 0)
x = b;
k = 1;
else
do
c = (a+b)/2;
fc = f (c);
if (fc = = 0)
x = c;
k = 1;
else
if (a*fc < 0)
b = c;
fb = fc;
else
a = c;
fa = fc;
while (k = 0 && fabs (b-a)> = eps);
if (k)
printf("Radacina ecuatiei (exact) este : %1f \n", x);
else
printf("Radacina ecuatiei este : %1f \n", x);
/ Definitia functiei f (x)
double f (double x)
return (x x x -3 x +1);
Observati ca prima bucla do se executa atât timp cât datele de intrare introduse sunt eronate, adica limita stânga a intervalului a este > = decât limita dreapta, sau precizia ce trebuie atinsa eps este < = 0. În a doua bucla se înjumatateste intervalul pâna când s-a gasit radacina exacta sau pâna când b-a < eps.
Exemplu 3.7.2.
În acest program se ordoneaza crescator un sir de numere. Întrucât sirul are dimensiune variabila, necunoscuta înainte de eexecutie, memoria necesara pentru elementele sale se aloca dinamic cu ajutorul functiei malloc. Din acest motiv s-a inclus si fisierul (header "alloc.h".
# include "stdio.h"
# include "alloc.h"
main ( )
int i, j = 2, k = 0, n = 0;
float a, b;
printf("Program pt. ordonarea crescatoare a unui sir\n");
/ Introducerea dimensiunii sirului
do
if (k)
printf("Numar negativ n");
printf("Dimensiunea sirului = ");
scanf("%d , &n);
k = 1;
while (n< = 0);
/ Alocare dinamica de memorie pt. sirul a si conversia pointerului de tip char întors de functia malloc la pointerul de tip float cum sunt elementele sirului
a = (float ) malloc (n sizeof (float));
if (a = = )
printf ("Memorie insuficienta (dimens. sir prea mare)\n");
exit (1);
/ Introducerea elementelor sirului
for ( i = 0 ; i < = n-1; i + + )
printf("a %d = ", i );
scanf("%f, &b); a i = b;
/ Ordonarea crescatoare a sirului de numere prin metoda interschimbarii (bulelor)
do
k = 0;
for (i = 0; i <= n-j; i ++)
if (a i + 1
b = a i ; a i = a i + 1 ; a i + 1 = b;
k = 1;
j + + ;
while (k);
/ scrierea sirului ordonat cresc.
printf ("siru 1 ordonat crescator : \n");
for (i = 0 ; i < n-1 ; i + + )
printf("%f, ", a [i] );
printf(("%f, a [n-1] );
Observati ca prima bucla do se executa cât timp s-a introdus o dimensiune a sirului incorecta (n < = 0) .A doua bucla do ordoneaza efectiv sirul si se executa pâna când nu mai sunt de facut interschimbari (k = 0), deci, sirul este ordonat. de asemenea , observati ca am folositinstructiunea do si for , în situatiile când testul pentru terminarea sau repetarea buclei trebuie sa se faca la sfârsit, dupa executia corpului buclei.
|