Sunteți pe pagina 1din 40

Bucle

Programarea calculatoarelor i
limbaje de programare I
Capitolul 6

Introducere

n capitolul trecut am vzut cum putem


selecta diferite instruciuni pentru execuie
folosind instruciunea if
O bucl este o structur de control care
provoac executarea unei instruciuni sau a
unei secvene de instruciuni n mod repetat

Instruciunile se execut atta timp ct sunt


ndeplinite una sau mai multe condiii

Vom descrie diferite tipuri de bucle


Vom vedea cum se pot implementa buclele
folosind instruciunea while
Vom prezenta, de asemenea, buclele
imbricate
Programarea calculatoarelo
r i limbaje de programare

Sumar
1.
2.
3.

4.
5.

Instruciunea while
Fazele de execuie a unei bucle
Implementarea buclelor folosind
instruciunea while
Operaii n bucl
Instruciuni while imbricate

Programarea calculatoarelo
r i limbaje de programare

Instruciunea while

Aceast instruciune, ca i if,


testeaz o condiie
while(expresie)
Instruciune

Exemplu
while(valIn!=25)
cin>>valIn;

Instruciunea care se execut n mod


repetat se numete corpul buclei
Programarea calculatoarelo
r i limbaje de programare

Instruciunea while

Condiia din instruciunea while poate fi o


expresie de orice tip de dat
Aproape ntotdeauna ea este o expresie
logic
Instruciunea while din exemplul de mai
sus spune urmtorul lucru:
Dac valoarea expresiei este true (nenul),
execut corpul buclei iar apoi revino i testeaz
din nou expresia. Dac expresia este false
(zero), treci de corpul buclei
Programarea calculatoarelo
r i limbaje de programare

Instruciunea while

Dac expresia este fals de la nceput,


corpul nu se execut niciodat
n figura de mai jos artm n mod
schematic modul de execuie a instruciunii
while
while (expresie)
false

true

Instruciune

Instruciunea 2

Programarea calculatoarelo
r i limbaje de programare

Instruciunea while

Corpul buclei poate fi i un bloc, fapt care


ne permite s executm mai multe
instruciuni n mod repetat

Exemplu
while(expresie)
{
...
}

Blocul se execut pn cnd expresia


devine fals
Programarea calculatoarelo
r i limbaje de programare

Sumar
1.
2.
3.

4.
5.

Instruciunea while
Fazele de execuie a unei bucle
Implementarea buclelor folosind
instruciunea while
Operaii n bucl
Instruciuni while imbricate

Programarea calculatoarelo
r i limbaje de programare

Fazele de execuie a unei bucle


1.
2.

3.

4.

5.

Intrarea n bucl. Este punctul n care programul ajunge


la prima instruciune din interiorul buclei
Iterarea. De fiecare dat cnd se execut corpul buclei,
spunem c facem cte o trecere prin bucl. Aceast trecere
se numete iteraie
Testul buclei. Reprezint punctul n care se evalueaz
expresia din instruciunea while. n urma acestei evaluri
se poate lua decizia de a se ncepe o nou iteraie sau de
a trece la instruciunea imediat urmtoare buclei
Condiia de terminare. Este condiia care provoac
ieirea din bucl, trecndu-se la prima instruciune de dup
bucl. Aceast condiie apare n instruciunea while
Ieirea din bucl. ntr-o bucl while, ieirea din bucl
apare cnd expresia din instruciunea while este false sau
0. n acest moment, se ntrerupe repetarea corpului buclei

Programarea calculatoarelo
r i limbaje de programare

Fazele de execuie a unei bucle

Dei condiia de terminare poate


deveni valid n mijlocul corpului
buclei, iteraia curent este executat
pn la capt i numai dup aceea
calculatorul verific din nou expresia
din instruciunea while

Programarea calculatoarelo
r i limbaje de programare

10

Sumar
1.
2.
3.

4.
5.

Instruciunea while
Fazele de execuie a unei bucle
Implementarea buclelor folosind
instruciunea while
Operaii n bucl
Instruciuni while imbricate

Programarea calculatoarelo
r i limbaje de programare

11

Implementarea buclelor folosind


instruciunea while

n rezolvarea problemelor se pot ntlni


dou tipuri majore de bucle:

Bucl controlat de contor

bucla controlat de un contor;


bucla controlat de un eveniment.
n timpul unui antrenament sportiv vi se cere s
alergai de 3 ori n jurul stadionului

Bucl controlat de un eveniment

Vi se cere s alergai pn cnd vei auzi sunetul


fluierului
Programarea calculatoarelo
r i limbaje de programare

12

Bucla controlat de un contor

O astfel de bucl folosete o variabil numit variabil


de control al buclei
naintea buclei ea este iniializat, adic i se atribuie o
valoare iniial
Apoi, n fiecare iteraie a buclei ea trebuie
incrementat

Exemplu
intcontorBucla=1;//initializare
while(contorBucla<=10)//test
{
...//actiunecareserepeta
contorBucl++;//incrementare
}
Programarea calculatoarelo
r i limbaje de programare

13

Bucla controlat de un contor

n acest exemplu, contorBucla este variabila de


control al buclei
Ea este iniializat cu valoarea 1 nainte de
intrarea n bucl
Instruciunea while testeaz expresia
contorBucla<=10
i execut bucla atta timp ct expresia este
adevrat
Ultima instruciune a buclei incrementeaz
variabila contorBucla
Variabilele folosite n acest fel se numesc contoare
Programarea calculatoarelo
r i limbaje de programare

14

Bucla controlat de un contor

La folosirea acestor bucle, programatorul


trebuie s urmreasc iniializarea
contorului naintea instruciunii while
Trebuie, de asemenea, s urmareasc dac
n interiorul buclei valoarea lui se modific n
aa fel nct la un moment dat condiia s
devin fals
O bucl din care programul nu poate iei
deloc se numete bucl infinit
Aceast situaie apare atunci cnd n
program se omite incrementarea contorului
Programarea calculatoarelo
r i limbaje de programare

15

Bucla controlat de un eveniment

Pentru aceast categorie de bucle


condiia de terminare depinde de un
eveniment care poate aprea n
timpul execuiei corpului buclei
Vom studia dou tipuri de bucle
controlate de evenimente:

bucla controlat de o valoare de


semnalizare (valoare santinel)
bucla controlat de sfritul unui fiier
(EOF)
Programarea calculatoarelo
r i limbaje de programare

16

Bucla controlat de o valoare de


semnalizare (valoare santinel)

Aceste bucle se folosesc n special atunci cnd se


prelucreaz volume mari de date
La fiecare iteraie se citete i se prelucreaz cte un set de
date
Anumite valori dintre cele citite vor semnaliza ncheierea
buclei while
Bucla while i continu execuia atta timp ct valorile
citite nu sunt cele de semnalizare (santinel)

Exemplu
intluna,ziua;
cin>>luna>>ziua;//citesteprimulsetdedate
while(!(luna==2&&ziua==31))
{
...//procesare
cin>>luna>>ziua;//urmatorulsetdedate
}

Programarea calculatoarelo
r i limbaje de programare

17

Bucla controlat de o valoare de


semnalizare (valoare santinel)

Este bine ca valorile santinel s fie dintre cele


care nu apar n mod obinuit ntre datele valide de
intrare
nainte de intrarea n bucl este citit primul set de
date
Dac nu este vorba despre valorile santinel, ele
sunt procesate
La sfritul buclei se citete urmtorul set de date,
revenindu-se apoi la nceputul buclei
Bucla se execut pn la citirea valorilor santinel
Acestea nu sunt prelucrate i conduc la ieirea din
bucl
Programarea calculatoarelo
r i limbaje de programare

18

Bucla controlat de o valoare de


semnalizare (valoare santinel)

Exemplu
Atunci cnd prelucrm date de tip char
putem folosi caracterul newline ca valoare
santinel
charinChar;
cin.get(inChar);
while(inChar!=\n)
{
cout<<inChar;
cin.get(inChar);
}
Programarea calculatoarelo
r i limbaje de programare

19

Bucla controlat de o valoare de


semnalizare (valoare santinel)

Ce se ntmpl dac nu introducem valoare


santinel?

Un program interactiv ne va cere n continuu noi


valori
Dac intrrile n program se fac dintr-un fiier i
datele se epuizeaz naintea apariiei valorii
santinel, stream-ul intr in fail state

O greeal frecvent n urma creia


programul poate avea o evoluie nedorit
este folosirea neintenionat a operatorului
= n locul lui ==
Programarea calculatoarelo
r i limbaje de programare

20

Bucla controlat de o valoare de


semnalizare (valoare santinel)

Exemplu
charinChar,valSemnal;
cin>>inChar>>valSemnal;
while(valSemnal=1)
//dingresealaamfolosit=
//inlocde==
{
...
cin>>inChar>>valSemnal;
}
Programarea calculatoarelo
r i limbaje de programare

21

Bucla controlat de o valoare de


semnalizare (valoare santinel)

Aceast eroare creeaz o bucl infinit


Expresia din instruciunea while este o
asignare i nu o expresie logic
Calculatorul evalueaz valoarea variabilei
valSemnal dup asignare
Aceasta va fi 1 i va fi interpretat ca fiind true
Expresia testat n exemplul de mai sus
stocheaz valoarea 1 n valSemnal nlocuind
valoarea care tocmai a fost citit
Pentru c expresia este tot timpul true, bucla
nu se ntrerupe niciodat
Programarea calculatoarelo
r i limbaje de programare

22

Bucla controlat de sfritul unui


fiier (EOF)

Dup ce programul citete i ultimele date


din fiierul de intrare, calculatorul ajunge la
sfritul fiierului (EOF, end of file)
n acest moment starea stream-ului este
normal
Dar dac ncercm s citim o nou dat,
stream-ul intr n fail state
Putem folosi acest comportament n
avantajul nostru n buclele while n care se
citete un numr necunoscut de valori
Programarea calculatoarelo
r i limbaje de programare

23

Bucla controlat de sfritul unui


fiier (EOF)

Starea de eroare a stream-ului poate


fi interpretat ca valoare santinel
Numele stream-ului poate aprea
ntr-o expresie logic la fel ca o
variabil booleean
ntr-un astfel de test, rezultatul este

true dac ultima operaie de


intrare/ieire a avut succes
false dac aceasta a euat
Programarea calculatoarelo
r i limbaje de programare

24

Bucla controlat de sfritul unui


fiier (EOF)

Exemplu
S presupunem c avem un fiier de date
care conine valori ntregi

intinVal;
inData>>inVal;
while(inVal){
cout<<inVal<<endl;
inData>>inVal;
}
Programarea calculatoarelo
r i limbaje de programare

25

Bucla controlat de sfritul unui


fiier (EOF)

Dac fiierul de date conine numerele 10,


20 i 30, primele 3 citiri se vor realiza corect
Chiar i dup citirea lui 30 starea streamului este normal
Dac dorim s citim dup sfritul fiierului,
ns, stream-ul va intra n stare de eroare
Aceasta nseamn c valoarea expresiei
logice din while va fi false provocnd ieirea
din bucl
Orice eroare de citire conduce la intrarea
stream-ului n fail state
Programarea calculatoarelo
r i limbaje de programare

26

Sumar
1.
2.
3.

4.
5.

Instruciunea while
Fazele de execuie a unei bucle
Implementarea buclelor folosind
instruciunea while
Operaii n bucl
Instruciuni while imbricate

Programarea calculatoarelo
r i limbaje de programare

27

Operaii n bucl

Pentru a avea sens, o bucl trebuie s


realizeze o operaie
Vom discuta despre urmtoarele
operaii care apar frecvent n
programe:

contorizare
nsumare
pstrarea unei valori anterioare

Programarea calculatoarelo
r i limbaje de programare

28

Contorizarea

O operaie comun este memorarea


numrului de iteraii executate
Programul care urmeaz citete i
numr caracterele dintr-o propoziie,
pn la apariia punctului

Programarea calculatoarelo
r i limbaje de programare

29

Contorizarea

Exemplu
#include<iostream>
usingnamespacestd;
intmain()
{
charinChar;
intcount=0;//initializareacontorului
cin.get(inChar);//citireaprimuluicaracter
while(inChar!='.')
{
count++;//incrementareacontorului
cin.get(inChar);//citireaurmatoruluicaracter
}
cout<<"Propozitiaare"<<count
<<"caractere"<<endl;
return0;
}

Programarea calculatoarelo
r i limbaje de programare

30

Contorizarea

Dup terminarea buclei, count va conine cu


1 mai puin dect numrul de caractere
citite, adic nu numr i valoarea santinel
(.)
Facem o prim citire naintea buclei pentru
c aceasta este controlat de un caracter de
semnalizare
O variabil care numr cte iteraii se
execut se numete contor de iteraii
n exemplu, variabila count este un contor
de iteraii
Programarea calculatoarelo
r i limbaje de programare

31

nsumarea

Cu ajutorul buclelor se poate implementa nsumarea


unui set de valori

Exemplu
#include<iostream>
usingnamespacestd;
intmain()
{
intnumar;
intsuma=0;
intcontor=1;
while(contor<=5)
{
cin>>numar;
suma=suma+numar;
contor++;
}
cout<<"Sumaeste"<<suma<<endl;
return0;
}

Programarea calculatoarelo
r i limbaje de programare

32

nsumarea

Iniializm suma cu 0 nainte de nceputul buclei


Atunci cnd se execut prima dat instruciunea
suma=suma+numar;
se adaug valoarea curent a variabilei suma la
valoarea variabilei numar pentru a forma noua
valoare a variabilei suma
Dup executarea buclei

variabila suma va conine suma celor 5 valori


citite

contor va conine valoarea 6

numar va conine ultima valoare citit


Programarea calculatoarelo
r i limbaje de programare

33

Pstrarea unei valori anterioare

S presupunem c dorim s scriem un


program care contorizeaz numrul de
operatori != dintr-un fiier surs C++
Va trebui s numrm de cte ori apare
semnul ! urmat de =
De fiecare dat vom citi din fiierul de
intrare un caracter pstrnd ultimele dou
valori n dou variabile diferite
La fiecare iteraie valoarea curent devine
valoare anterioar i apoi se citete o nou
valoare
Bucla se termin cnd se ajunge la EOF
Programarea calculatoarelo
r i limbaje de programare

34

Pstrarea unei valori anterioare


#include<iostream>
#include<fstream>
usingnamespacestd;
intmain()
{
intcontor=0;
charcarAnterior;
charcarCurent;
ifstreaminFisier;
inFisier.open("main.cpp");
inFisier.get(carAnterior);
inFisier.get(carCurent);
while(inFisier)
{
if(carCurent=='='&&carAnterior=='!')
contor++;
carAnterior=carCurent;
inFisier.get(carCurent);
}
cout<<contor
<<"operator(i)!=aufostgasitiinfisier"
<<endl;
return0;
}

Programarea calculatoarelo
r i limbaje de programare

35

Pstrarea unei valori anterioare

Contorul din acest exemplu este un


contor de evenimente
El este o variabil care se
incrementeaz atunci cnd apare un
anumit eveniment
Este iniializat cu valoarea 0 spre
deosebire de contorul de iteraii din
exemplul precedent care este
iniializat cu 1
Programarea calculatoarelo
r i limbaje de programare

36

Sumar
1.
2.
3.

4.
5.

Instruciunea while
Fazele de execuie a unei bucle
Implementarea buclelor folosind
instruciunea while
Operaii n bucl
Instruciuni while imbricate

Programarea calculatoarelo
r i limbaje de programare

37

Instruciuni while imbricate

Exemplu
Ne propunem s numrm cte caractere ; sunt pe
fiecare linie dintr-un fiier
charinChar;
inFisier.get(inChar);
while(inFisier)
{
intcontorPunctVirgula=0;
while(inChar!='\n')
{
if(inChar==';')
contorPunctVirgula++;
inFisier.get(inChar);
}
cout<<contorPunctVirgula<<endl;
inFisier.get(inChar);
}

Programarea calculatoarelo
r i limbaje de programare

38

Instruciuni while imbricate

ablonul sintactic al buclelor imbricate:

Iniializarea_buclei_exterioare
while(condiia_buclei_exterioare)
{
...
Iniializarea_buclei_interioare
while(condiia_buclei_interioare)
{
Procesarea_i_actualizarea_buclei_interioare
}
...
Actualizarea_buclei_exterioare
}
Programarea calculatoarelo
r i limbaje de programare

39

Instruciuni while imbricate

Fiecare bucl are propria iniializare,


testare i actualizare
Se poate ca bucla extern s nu fac
nicio procesare
Pe de alt parte, bucla interioar
poate fi o mic parte a procesrii
realizate de bucla exterioar

Programarea calculatoarelo
r i limbaje de programare

40

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