Metode evoluate de programare Limbajele c şi C++



Yüklə 1,64 Mb.
səhifə12/44
tarix07.04.2018
ölçüsü1,64 Mb.
#46828
1   ...   8   9   10   11   12   13   14   15   ...   44

5.7. Instrucţiunea for

Instrucţiunea for, ca şi instrucţiunea while, se utilizează pentru a realiza o structură repetitivă pretestată. Formatul instrucţiunii este:


for(exp1; exp2; exp3) instructiune;
Antetul ciclului este definit de for(exp1; exp2; exp3) iar instructiune formează corpul ciclului. Prima expresie exp1 constituie partea de iniţializare a ciclului, iar exp3 este partea de reiniţializare a ciclului. Condiţia de continuare a ciclului este exp2. De obicei exp1 şi exp3 reprezintă atribuiri.

Efectul:


  1. se execută secvenţa de iniţializare definită de expresia exp1;

  2. se evaluează exp2; dacă exp2 are valoarea zero, atunci se iese din ciclu, adică se trece la instrucţiunea următoare instrucţiunii for, altfel se execută instrucţiunea din corpul ciclului;

  3. se execută apoi secvenţa de reiniţializare definită de exp3, apoi se reia secvenţa de la punctul 2).

Observaţii:

1o. Ca şi în cazul instrucţiunii while, instrucţiunea din corpul ciclului for poate să nu se execute niciodată dacă exp2 are valoarea zero chiar la prima evaluare.

2o. Expresiile din antetul instrucţiunii for pot fi şi vide; totuşi caracterele “;” vor fi întotdeauna prezente.

3o. Comparând instrucţiunile for şi while observăm că instrucţiunea for cu formatul anterior se poate realiza cu secvenţa următoare folosind while:
exp1;

while (exp2)

{ instructiune;

exp3;

}

Invers, o instrucţiune while de forma: while (exp) instructiune este echivalentă cu următoarea instrucţiune for:



for(; exp; ) instructiune.
Autorii limbajului C propun ca instrucţiunea for să se folosească cu prioritate pentru ciclurile care au pas.

Exemple:


Vom da o secvenţă de instrucţiuni care însumează elementele unui tablou:
s=0;

for(i=0; i

sau scrisă mai compact:

for (s=0, i=0; i

În continuare vom da un mic program care afişează numărul caracterelor citite de la intrarea standard stdin.
#include

void main(void)

{ long n;

for (n=0; getchar()!=EOF; n++);

printf (“\nnumarul caracterelor citite =%ld\n”,n);

}

sau scrisă cu instrucţiunea while


#include

void main(void)

{ long n=0;

while (getchar()!=EOF) n++;

printf (“\nnumarul caracterelor citite =%ld\n”,n);

}

5.8. Instrucţiunea do while

Această instrucţiune realizează structura repetitivă condiţionată posterior (posttestată) dar modificată faţă de REPEAT . . . UNTIL. Această instrucţiune s-a introdus pentru o mai mare flexibilitate în scrierea programelor. Formatul ei este:

do

instructiune;



while (exp);

Efectul:


  1. se execută instrucţiunea instructiune;

  2. se evaluează expresia exp din paranteze;

  3. dacă valoarea expresiei este zero se trece la instrucţiunea următoare instrucţiunii do-while; altfel se revine şi se execută din nou instructiune.

Observaţii:



1o. Structura realizată de instrucţiunea do-while poate fi realizată printr-o secvenţă în care se foloseşte instrucţiunea while astfel:

instructiune;

while (exp) instructiune;

2o. Se observă că în cazul instrucţiunii do-while, corpul ciclului se execută cel puţin odată, spre deosebire de ciclurile while şi for unde corpul ciclului poate să nu se execute niciodată.

Exemplu:


Vom da un program care calculează rădăcina pătrată dintr-un număr real a>=0.
#include

#define EPS 1e-10

void main (void)

{ double x1,x2,y,a;

clrscr(); // sterge ecranul

printf(“\ndati un numar real pozitiv a=”);

if (scanf(“%lf”,&a) !=1 || a<0) printf (“numarul citit nu este pozitiv\n”);

else {


x2 = 1.0;

do { x1 = x2;

x2 = 0.5 *(x1+a/x1); // formula de iteratie

if ((y=x2-x1) < 0) y = -y;

}

while (y >= EPS);



printf (“radacina patrata din:%g este: %.2lf\n”,a,x2); // 2 zecimale

} //sfirsit else

}

5.9. Instructiunea switch

Instrucţiunea switch permite realizarea structurii alternativa generalizată. Ea este echivalentă cu o imbricare de structuri de alternativă simple. Utilizarea instrucţiunii switch face în schimb programul mult mai clar.

Formatul instrucţiunii switch este următorul:
switch (exp)

{ case c1: sir1

break;

case c2: sir2



break;

. . .


case cn: sirn

break;


default: sir

}
unde: c1,. . . cn sunt constante sau constante simbolice;

sir1, . . . ,sirn, sir sunt şiruri de instrucţiuni.
Efectul:


  1. se evaluează expresia din paranteză;

  2. se compară pe rând valoarea expresiei cu valorile constantelor c1, . . . , cn;

  3. dacă valoarea expresiei coincide cu valoarea lui ck, se execută secvenţa de instrucţiuni definită prin sirk; în cazul în care valoarea expresiei nu coincide cu nici una din constantele c1, . . . , cn, se execută secvenţa de instrucţiuni definită prin sir;

  4. după execuţia secvenţei sirk sau sir se trece la instrucţiunea următoare instrucţiunii switch, adică la prima instrucţiune aflată după acolada închisă care termină instrucţiunea switch respectivă; evident, acest lucru are loc dacă şirul care se execută nu impune, el insuşi, un alt mod de continuare a execuţiei, de exemplu o revenire din funcţia respectivă, un salt la o anumită instrucţiune, etc.

Observaţii:

1o. Ramura default nu este obligatorie. În lipsa ei, dacă valoarea expresiei nu coincide cu nici una din constantele c1,. . . , cn, instrucţiunea switch respectivă nu are nici un efect.

2o.Construcţia break reprezintă o instrucţiune. Ea termină fiecare ramură de instrucţiuni sir1, . . . , sirn, provocând saltul la instrucţiunea următoare instrucţiunii switch sau, cum se mai spune, realizează ieşirea din instrucţiunea switch.

3o. Instrucţiunea break nu este obligatorie. În cazul în care este absentă, se execută secvenţial următoarea ramură. De exemplu dacă avem secvenţa:

switch (exp)

{ case c1: sir1

case c2: sir2

}

ea se execută în felul următor:



  1. dacă valoarea expresiei este egală cu c1 se execută sir1 şi apoi sir2;

  2. dacă valoarea expresiei este egală cu c2 se execută sir2;

  3. dacă valoarea expresiei diferă de valorile c1 şi c2 instrucţiunea switch de mai sus nu este efectivă, se trece la instrucţiunea următoare care urmează după switch.

  4. secvenţa de mai sus se putea realiza şi astfel:

if (exp = = c1)

{ sir1

sir2

}else if (exp = = c2) sir2


Exemplu:

Vom citi din fişierul de intrare construcţii de forma: op1 operator op2, unde op1 şi op2 sunt numere întregi (operanzi întregi) iar operator este un operator aritmetic {“+”, “-“, “*”, “/”}. La ieşire se va scrie valoarea expresiei citite. De exemplu dacă se citeşte secvenţa 100/3 se va afişa rezultatul 33. Programul permite citirea şi evaluarea mai multor astfel de expresii, până la întâlnirea sfârşitului de fişier.


#include

void main (void)

{ int op1,op2,operator,rezultat,i;

while (( i=scanf(“%d %c %d”, &op1,&operator, &op2)) != EOF)

if (i = = 3 ) // ramura adevarat inseamna ca s-au citit 3 campuri corecte

{ switch (operator)

{ case ‘+’: rezultat = op1 + op2 ; // avem adunare

break;


case ‘-‘ : rezultat = op1 – op2; // avem scadere

break;


case ‘*’ : rezultat = op1 * op2; // avem inmultire

break;


case ‘/’ : // avem impartire intreaga

if (op2 = = 0)

{ printf (“divizor nul\n”);

rezultat = 0;

} else rezultat = op1 / op2;

break;


default : printf (“operator eronat\n”);

rezultat = 0;

} // sfarsit switch

printf (“%d %c %d %d\n”, op1, operator, op2, rezultat);

} else

printf (“expresie eronat\n”); // sfarsit if



} // sfarsit while



Yüklə 1,64 Mb.

Dostları ilə paylaş:
1   ...   8   9   10   11   12   13   14   15   ...   44




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin