Sunteți pe pagina 1din 5

CURS NR. 7.

Instrucţiuni (2)

INSTRUCŢIUNEA DE CICLARE
Mai sunt numite şi instrucţiuni de iteraţie sau bucle. Majoritatea problemelor pe care le
rezolvăm cu ajutorul calculatorului presupun parcurgerea unor relaţii în mod repetat, la fiecare
parcurgere, unele variabile modificându-şi valorile după anumite legi.
Toate limbajele de programare conţin instrucţiuni cu ajutorul cărora se poate programa
executarea unor cicluri. În limbajul C există trei instrucţiuni de ciclare: for, while, do…while.

7.1. Instrucţiunea de ciclare for


Este folosită pentru programarea ciclurilor care au o variabilă conducătoare, şi are forma
generală:
…..
for ( expr1 ; expr2 ; expr3 )
instrucţiune ;
…..
Semnificaţia elementelor componente ale ciclului este următoarea:
expr1 – se evaluează o singură dată, la intrarea în instrucţiunea for, înaintea primei iteraţii şi
reprezintă expresia în cadrul căreia se iniţializează variabila conducătoare de ciclu. În această
expresie mai pot fi iniţializate şi alte variabile.
expr2 – corespunde testului din schema logică. De obicei este o expresie logică, de valoarea
acesteia depinzând execuţia corpului ciclului.
expr3 – este expresia prin care se modifică valoarea variabilei conducătoare de ciclu. Aceasta se
evaluează de fiecare dată după executarea instrucţiunii ce formează corpul ciclului. Este în general
o expresie de incrementare sau decrementare.
instrucţiune – poate fi o instrucţiune simplă sau compusă şi reprezintă corpul ciclului.
Funcţionare :
La întâlnirea cuvântului cheie for se realizează următoarele:
1. se evaluează expresia expr1;
2. se evaluează expr2. Dacă aceasta este adevărată (≠0) se execută corpul ciclului. Dacă
expresia este = 0 se părăseşte ciclul, execuţia programului continuând cu următoarea
instrucţiune care urmează după ciclul for.
3. după executarea corpului ciclului se evaluează expr3 după care se revine la punctul 2
(evaluarea expresiei expr2).
Exemplu nr. 1: Calculul factorialului: n! = 1 * 2 * 3 * … * n
Vom folosi o variabilă ajutătoare “i”, aceasta va lua valori de la 1 la n, factorialul
calculându-se astfel:

fact = 1;
for ( i=1 ; i < = n ; i++ )
fact *= i;

Exemplu nr. 2: Calculul valorilor funcţiei: y=f(x)=3.4*x3 + 5.25*x2 + 3*x + 1.6 în
intervalul [a,b] parcurs cu pasul h.

for(x=a ; x<=b ; x+=h)
{ y = 3.4 * pow(x,3) + 5.25*x*x + 3*x + 1.6;
printf(“\n \t x=%6.3lf \t y=%6.3lf”,x,y);
}

Observaţii :
1. Corpul ciclului for nu se execută niciodată dacă expresia expr2 are valoarea zero de la
început;
2. Dacă expr2 lipseşte din antetul instrucţiunii, ea se consideră adevărată (ciclu for infinit);
3. Oricare din cele trei expresii poate lipsi, însă caracterele ; trebuie scrise.

fact=1; i=1;
for ( ; i < = n ; )
{ fact *= i; i++; }

4. Oricare din cele trei expresii pot fi compuse din mai multe instrucţiuni separate prin
caracterul ,

for (fact=1, i=1 ; i < = n ; i++ )
fact *= i;

Program exemplu:
Calculul sumei elementelor unui şir format din “n” elemente reale a0, a1, a2, … , an-1. Suma
elementelor şirului este: S = a0 + a1 + a2 + … + an-1.
Pentru calculul sumei vom iniţializa valoarea acesteia cu 0 (S = 0). Vom utiliza o relaţie de
forma S = S + ai, unde i = 0 ÷ n-1;
Vom utiliza instrucţiunea for de două ori: prima dată pentru introducerea elementelor
şirului, a doua oară pentru calcularea sumei elementelor şirului.

#include <stdio.h>
#include <conio.h>
void main (void)
{ int n,i; double a[20],s; clrscr();
printf(“\n Introduceţi numărul de elemente, n=”); scanf(“%d”,&n);
for( i=0 ; i<n ; i++ ) // citirea elementelor sirului
{ printf(“\n \t a[%2d]=”,i);
scanf(“%lf”, &a[i]);
}
for( s=0, i=0 ; i<n ; i++ ) // calculul sumei
s += a[i];
printf(“\n Suma elementelor este S=%10.3lf”,s); // afisarea sumei calculate
getch();
}
7.2. Cicluri for suprapuse
Dacă instrucţiunile care compun corpul unui ciclu for (numit ciclu for exterior) conţin alt
ciclu for (numit ciclu for interior), cele două cicluri for se numesc suprapuse, imbricate sau incluse.
Observaţie : Ciclul interior trebuie să fie cuprins complet în corpul ciclului exterior.
Forma generală a ciclurilor suprapuse este următoarea:

for(expr_1_1 ; expr_1_2 ; expr_1_3 )
{ …
for(expr_2_1 ; expr_2_2 ; expr_2_3 )
{ … }

}

Exemplu: Afişarea tuturor posibilităţilor de a obţine 100 de lei utilizând monede de 10, 20
şi 50 de lei.
Considerăm următoarele variabile a – numărul de monede de 10 lei; b – 20 lei, c – 50 lei.
Intervalul de valori pentru fiecare variabilă este: a = 0÷10; b = 0÷5; c = 0÷2;
În consecinţă, pe baza celor prezentate mai sus, putem scrie următoarea secvenţă de
program:

for(a=0;a<=10;a++)
for(b=0;b<=5;b++)
for(c=0;c<=2;c++)
if( a*10 + b*20 + c*50 == 100)
printf(“\n %2d*10+%2d*20+%2d*50 = 100”,a,b,c);

Program exemplu: Produsul elementelor strict pozitive ale unei matrice dreptunghiulare Amxn.

#include <stdio.h>
#include <conio.h>
void main (void)
{int m,n,i,j; double a[10][10], p=1; clrscr();
printf(“\n Introduceti numarul de linii si de coloane, m si n:”);
scanf(“%d %d”,&m,&n);
for(i=0 ; i < m ; i++) // citirea elementelor matricei
for(j=0 ; j < n ; j++)
{ printf(“\n a[%d][%d]=”,i,j);
scanf(“%lf”,&a[i][j]); }
for(i=0 ; i < m ; i++) // afisarea matricei
{ for(j=0 ; j < n ; j++)
printf(“ %8.3lf ”,a[i][j]);
printf(‘\n”);
}
for(i=0 ; i < m ; i++) // calculul produsului elementelor strict pozitive
for(j=0 ; j < n ; j++)
if(a[i][j]>0)
p*=a[i][j];
printf(“\n \n Produsul elem. strict pozitive: P=%10.3lf”,p); // afisarea produsului
getch();
}

7.3. Instrucţiunea de ciclare while


Se utilizează pentru programarea unor operaţii de un număr de ori necunoscut. Este o
instrucţiune de ciclare condiţionată anterior. Forma generală este următoarea:

while(expresie)
instrucţiune;

Interpretarea sintaxei este următoarea: “atât timp cât … “.

Funcţionare :
Se evaluează expresia expresie, dacă aceasta este nenulă se execută instrucţiune, după care
se revine la evaluarea expresiei. În cazul în care expresie este nulă se trece la instrucţiunea
următoare din program.

Exemplu nr. 1 : Suma elementelor …


unui şir. s=0; i=0;
while(i<n) …
{ s+=a[i]; i++} while(n!=0)
… { printf(“\n %d”,n%10); n/=10; }

Exemplu nr. 2 : Afişarea pe rânduri
diferite a cifrelor unui număr natural
Observaţii:
1. expresie este de cele mai multe ori o expresie logică;
2. dacă expresie are valoarea 0 de la început, corpul ciclului nu se execută;
3. dacă valoarea expresiei este întotdeauna ≠0 atunci ciclul este infinit.
Exemplu:
while(1)
{…}
4. Ciclul while poate fi utilizat şi pentru scrierea ciclurilor cu variabilă conducătoare:
Exemplu:
… …
fact=1; fact=1; i=1;
for(i=1 ; i<=n ; i++) Ù while(i<=n)
fact*=i; { fact*=i; i++; }
… …

7.5. Instrucţiunea de ciclare do … while


Se utilizează la fel ca şi instrucţiunea while pentru programarea ciclurilor care se execută de un
număr de ori necunoscut. Diferenţa dntre cele două instrucţiuni constă în faptul că do … while este o
instrucţiune de ciclare condiţionată posterior. Aceasta înseamnă că mai întâi se execută corpul ciclului şi
abia apoi se verifică condiţia. Forma generală este următoarea:

do
instrucţiune
while( expresie);

Conţine două cuvinte cheie: do (execută), respectiv while. Interpretarea sintaxei este următoarea:
execută … atât timp cât … . Instrucţiunea se încheie cu ;.
Funcţionarea :
Instrucţiunea este executată, apoi se evaluează expresia. Dacă valoarea acesteia este ≠0
(adevărată) se reia execuţia instrucţiunii. În cazul în care valoarea expresiei este nulă (falsă), se părăseşte
ciclul, execuţia programului continuând cu instrucţiunea imediat următoare ciclului.
Exemplu: Citirea unui număr pozitiv:

do { printf(“\n a=”); scanf(“%d”,&a); } while (a<=0);

Observaţii :
1. Diferenţa dintre while şi do … while constă în aceea că în cazul ciclului do … while instrucţiunea
se execută cel puţin o dată chiar dacă expresia este falsă, spre deosebire de while unde
instrucţiunea nu se execută dacă expresia este falsă;
2. Dacă expresia este întotdeauna ≠0 ciclul do … while este infinit;
Exemplu: … do { …. } while(1); …
3. Instrucţiunea poate fi utilizată şi pentru programarea ciclurilor cu variabilă conducătoare.
Exemplu:

fact=1; i=1;
do { fact*=i; i++;
} while(i<=n);

Program exemplu:
Ordonarea crescătoarea a elementelor unui şir de numere reale.

#include <stdio.h>
#include <conio.h>
void main(void)
{ int n,i,a[20],k=1,aux; clrscr();
do{ printf("\n Introd n="); scanf("%d",&n); } while(n<=0);
for(i=0;i<n;i++) // citirea elementelor sirului
{printf("\n \t a[%2d]=",i);
scanf("%d",&a[i]); }
for(i=0;i<n;i++) // afisarea elementelor sirului
printf("%4d",a[i]);
while(k!=0) // ordonarea crescatoare a elementlor sirului
{ for(k=0,i=0;i<n-1;i++)
if(a[i]>a[i+1])
{ aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; k++; }
}
printf("\n");
for(i=0;i<n;i++) // afisarea sirului ordonat
printf("%4d",a[i]);
getch();
}

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