Sunteți pe pagina 1din 6

1Instruciuni pentru controlul fluxului de execuie al unui program

INSTRUCIUNI PENTRU CONTROLUL FLUXULUI DE EXECUIE AL UNUI PROGRAM


Conceptul de control al execuiei este fundamental pentru comportamentul unui program i se refer la ordinea de execuie a prelucrrilor din cadrul programului. Toate limbajele de programare ofer posibilitatea specificrii acestei ordini prin intermediul structurilor de control. Structurile de control de baz, specifice limbajelor cod-main i de asamblare sunt secvenierea i saltul. Limbajele de nivel nalt ofer structuri de control mai puternice, i anume: selecia, numit i ramificare condiionat sau decizie i repetiia, numit i ciclare sau buclare. Susintorii programrii structurate au artat c orice program poate fi scris utiliznd doar trei structuri de control, i anume secvenierea, decizia cu dou alternetive i ciclarea cu test iniial. Totodat ei au artat c folosirea salturilor nu este o obinuin bun n programare, deoarece programele rezultate sunt greu de neles i modificat. Totui, s-a constatat c restricia de utilizare doar a celor trei structuri de control specifice programrii structurate este de multe ori mult prea sever. n acest scop s-a introdus noiunea de program bine-structurat, care pe lng cele trei structuri de control poate conine i altele, dintre care: decizia cu alternative multiple, ciclarea cu test final, ciclarea cu contor, ciclarea cu scurtcircuitarea buclei, etc. De fapt, condiia ca un program s fie lizibil i mentenabil este ca instruciunile sale s fie structurate dup principii bine fundamentate, simple i ct mai naturale. Limbajul C ofer structurile de control necesare scrierii de programe bine structurate. Folosirea corect i disciplinat a acestor structuri este sarcina programatorului. 1. SECVENIEREA INSTRUCIUNILOR n C orice expresie poate deveni o instruciune dac este terminat cu ; ca n urmtorul exemplu:
x = y+7;

n C, caracterul ; este terminator de instruciune, spre deosebire de Pascal unde caracterul ; este separator de instruciuni. Cea mai simpl instruciune este instruciunea vid sau nul i are forma:
;

n C este posibil gruparea unei secvene de instruciuni ntro singur instruciune. Structura rezultat se numete instruciune compus sau bloc. Gruparea se face prin ncadrarea secvenei ntre acolade { i }. Un exemplu de bloc este corpul unei funcii sau corpul unei bucle. Imediat dup acolada stng ce marcheaz nceputul unui bloc poate apare opional o secven de declaraii de variabile, eventual cu iniializri. Aceste variabile sunt locale blocului n care sunt definite. Un exemplu de bloc este: 1

2Instruciuni pentru controlul fluxului de execuie al unui program


{ int t=a; a=b; b=t;

} 2. INSTRUCIUNEA if-else Aceast instruciune permite efectuarea de decizii binare n cadrul programului. Sintaxa instruciunii este:
if (expr)

instruciune1
else

instruciune2 ramura else fiind opional. Execuia instruciunii decurge astfel: se evalueaz expresia expr; dac rezultatul este nenul, adic adevrat se execut intruciunea instruciune1, altfel se execut instruciunea instruciune2. Urmtorul program utilizeaz o instruciune if-else pentru a decide ntre calculul sumei sau diferenei a dou numere reale n funcie de valoarea unui caracter.
#include <stdio.h> main() { char op; float op1,op2,rez; printf ("Introduceti operatorul (+ sau -) si dati operanzii:"); scanf ("%c%f%f",&op,&op1,&op2); if (op == '+') rez = op1 + op2; else rez = op1 - op2; printf("Rezultatul este:%10.5f\n", rez); return 0; }

3. INSTRUCIUNEA switch Atunci cnd ntr-un program trebuie efectuate decizii multiple, utilizarea instruciunii if-else este greoaie i nenatural. n aceste situaii se recomand utilizarea instruciunii switch. Intruciunea switch testeaz dac valoarea unei expresii ntregi corespunde cu una din mai multe valori constante ntregi, efectund o ramificare corespunztoare n program. Dac valoarea expresiei nu corespunde nici uneia dintre constante, programul continu de la eticheta default dac aceasta este prezent n instruciunea switch, altfel continu cu instruciunea urmtoare. Sintaxa instruciunii switch este:
switch (expr) { case expr-const1: instruciuni1

3Instruciuni pentru controlul fluxului de execuie al unui program


case expr-const2: instruciuni2

. . . case expr-constn: instruciunin default: instruciunin+1


}

Fiecare punct de ramificaie case este etichetat cu o constant ntreag. Dac o astfel de constant este egal cu valoarea expresiei expr, controlul execuiei este transferat n punctul de ramificaie corespunzror constantei respective. Altfel controlul execuiei este transferat la eticheta default, dac aceasta exist. 4. INSTRUCIUNEA while Instruciunea while permite implementarea ciclurilor cu test iniial. Sintaxa instruciunii este:
while (expr)

instruciune Execuia instruciunii decurge astfel: se evalueaz nti expresia expr; dac rezultatul este nenul, adic adevrat, se execut instruciunea instruciune i apoi controlul execuiei este transferat imediat naintea instruciunii while; altfel, execuia continu cu instruciunea imediat urmtoare instruciunii while. Pentru exemplificarea instruciunii while se consider urmtorul program care contorizeaz liniile, cuvintele i caracterele citite de la intrarea standard. Execuia se termin la detectarea marcajului de sf`rit de fiier, EOF, n fiierul standard de intrare. Prin cuvnt se nelege orice secven de caractere care nu conine caracterele blanc, tab i sfrit de linie.
#include <stdio.h> #define INTERIOR 0 /* in interiorul unui cuvant */ #define EXTERIOR 1 /* in exteriorul unui cuvant */ main() { int c, nlin, ncuv, ncar, stare; stare = EXTERIOR; nlin = ncuv = ncar = 0; while ( (c=getchar()) != EOF ) { ++ncar; if (c=='\n') ++nlin; if ( (c==' ') || (c=='\n') || (c=='\t')) stare = EXTERIOR; else if (stare == EXTERIOR) { stare = INTERIOR; ++ncuv; } } printf ("%d%d%d\n", nlin, ncuv, ncar); return 0; }

4Instruciuni pentru controlul fluxului de execuie al unui program 5. INSTRUCIUNEA do-while Instruciunea do-while permite implementarea ciclurilor cu test final. Sintaxa acesteia este:
do

instruciune while (expr); Execuia instruciunii decurge astfel: se execut instruciunea instruciune i apoi se evalueaz expresia expr; dac rezultatul este nenul, adic adevrat, controlul execuiei este transferat imediat naintea instruciunii do-while; altfel, execuia continu cu instruciunea imediat urmtoare instruciunii do-while. Pentru exemplificarea instruciunii do-while se consider un program ce joac urmtorul joc cu utilizatorul: programul "se g`ndete" la un numr cuprins n gama 0...1000 i apoi cere utilizatorului s ghiceasc acest numr. Dup fiecare ncercare de ghicire din partea utilizatorului, programul l informeaz dac numrul ncercat este mai mare sau mai mic dect numrul la care s-a g`ndit programul. Jocul se ncheie cnd utilizatorul gsete numrul respectiv.
#include <stdio.h> #include <stdlib.h> #include <time.h> #define NMAX 1000 main() { int numar, incercare; /* randomize() si random() nu sunt functii ANSI */ randomize(); numar = 1+random(NMAX); do { printf("La ce numar m-am gandit?\n"); scanf("%d", &incercare); if ((incercare<1) || (incercare>NMAX)) printf("Numarul trebuie sa fie ntre 1 si %d\n",NMAX); else if (incercare<numar) printf("Numarul tau este prea mic\n"); else if (numar<incercare) printf("Numarul tau este prea mare\n"); } while (incercare!=numar); printf("Acesta este!\n"); return 0; }

6. INSTRUCIUNEA for Aceast instruciune este destinat implementarii buclelor n care apare urmatoarea situaie: naintea intrarii n bucl trebuie iniializate una sau mai multe variabile, iar la fiecare trecere prin corpul buclei trebuie actualizate una sau mai multe variabile. Sintaxa instruciunii este:

5Instruciuni pentru controlul fluxului de execuie al unui program


for (expr1; expr2; expr3)

instruciune Cea mai simpla modalitate de a nelege cum lucreaz instruciunea for este de a o compara cu instruciunea while. Orice instruciune for este echivalat cu urmtoarea secven: expr1;
while (expr2) {

instruciune expr3;
}

n general, expr1 i expr3 sunt atribuiri sau apeluri de funcii, iar expr2 este o expresie relaional sau logic. Oricare dintre expresiile expr1, expr2 sau expr3 poate fi omis. Dac expr1 sau expr3 lipsesc, sunt pur i simplu eliminate din secvena echivalent. Dac expr2 lipsete, este considerat ca fiind permanent adevrat. Pentru exemplificarea instruciunii for se consider urmtorul program ce utilizeaz formula c(5/9) (f32) pentru a calcula i afia tabela de conversie a temperaturilor Fahrenheit n temperaturi Celsius, n gama 0..300 cu pasul 20.
#include <stdio.h> #define MINIM 0 #define MAXIM 300 #define PAS 20 main() { int fahr; float cel; for (fahr=MINIM;fahr<=MAXIM;fahr+=PAS) { cel=(5.0/9.0)*(fahr-32); printf("%3d %6.1f\n", fahr,cel); } return 0; }

7. INSTRUCIUNILE break, continue i goto Deseori este convenabil s se poat prsi o bucl altfel dect prin euarea testului de la nceputul sau de la sfritul buclei. Instruciunea break ofer att posibilitatea "scurtcircuitrii" buclelor for, while i do-while, ct i ieirii forate din instruciunea switch. Astfel, executarea unei instruciuni break are ca efect prsirea imediat a buclei sau instruciunii switch curente i transferul controlului execuiei la instruciunea imediat urmtoare acesteia. Instruciunea continue ofer posibilitatea revenirii la nceputul unei bucle mai devreme dect n mod normal, fiind util atunci cnd se dorete evitarea executrii restului buclei curente. Cu toate c aceast facilitate nu este absolut necesar, limbajul C ofer i posibilitatea efecturii de salturi necondiionate prin intermediul instruciunii goto. Facem ns 5

6Instruciuni pentru controlul fluxului de execuie al unui program observaia c destinaia saltului, identificat printr-o etichet urmat de caracterul :, trebuie s se afle n corpul aceleiai funcii ca i instruciunea goto corespunztoare.

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