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