STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele...

12
1 STRUCTURA REPETITIVA Structura repetitiva sau iterativa este cunoscuta sub numele de bucla sau ciclu si realizeaza repetarea unui grup de instructiuni atat timp cat este indeplinita o conditie Procesul de control cuprinde trei actiuni Initializarea: stabileste starea initiala, dinainte de parcurgerea primului ciclu. Testarea: compara starea curenta cu starea care determina terminarea procesului de repetare. Daca sunt indeplinite conditiile de terminare se pune capat repetarii Modificarea: schimba starea curenta astfel incat procesul sa avanseze catre starea finala. Daca modificarea nu are loc sau este incorecta procesul de repetare nu se termina si se obtine un ciclu infinit. Structura repetitiva poate fi: Cu numar cunoscut de pasi Cu numar necunoscut de pasi STRUCTURA REPETITIVA CU NUMAR CUNOSCUT DE PASI In cazul structurii repetitive cu numar cunoscut de pasi sunt necesare doua variabile de memorie: una numita contor care se foloseste pentru a numara de cate ori s-a repetat corpul ciclului si una numita numar de repetari car determine de cate ori trebuie sa se execute corpul ciclului. In acest caz condititia de repetare este ca valoarea contorului sa fie mai mica sau egala cu valoare numarului de repetari. Initializarea ciclului trebuie sa contina obligatoriu si pasul de initializare a contorului, iar modificarea ciclului trebuie sa contina obligatoriu operatia de incrementare a contorului In pseudocod forma generala este pentru contorvi,vf[pas v] executa ... sfarsit_pentru Cuvantul pentru marcheaza inceputul structurii, iar cuvantul sfarsit_pentru sfarsitul structurii. Virgula dintre vi si vf delimiteaza operatia de atribuire a contorului cu valoarea initiala (vi) de valoare finala la care trebuie sa ajunga contorul (vf). Cuvantul pas precede valoarea cu care se incrementeaza contorul (v) si este optional. Daca nu se specifica pasul v este considerat egal cu 1. Cuvantul executa determina inceputul secventei de instructiuni care se vor executa repetat

Transcript of STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele...

Page 1: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

1

STRUCTURA REPETITIVA Structura repetitiva sau iterativa este cunoscuta sub numele de bucla sau ciclu si realizeaza repetarea unui grup de instructiuni atat timp cat este indeplinita o conditie Procesul de control cuprinde trei actiuni Initializarea: stabileste starea initiala, dinainte de parcurgerea primului ciclu. Testarea: compara starea curenta cu starea care determina terminarea procesului de repetare. Daca sunt indeplinite conditiile de terminare se pune capat repetarii Modificarea: schimba starea curenta astfel incat procesul sa avanseze catre starea finala. Daca modificarea nu are loc sau este incorecta procesul de repetare nu se termina si se obtine un ciclu infinit. Structura repetitiva poate fi:

Cu numar cunoscut de pasi Cu numar necunoscut de pasi

STRUCTURA REPETITIVA CU NUMAR CUNOSCUT DE PASI

In cazul structurii repetitive cu numar cunoscut de pasi sunt necesare doua variabile de memorie: una numita contor care se foloseste pentru a numara de cate ori s-a repetat corpul ciclului si una numita numar de repetari car determine de cate ori trebuie sa se execute corpul ciclului. In acest caz condititia de repetare este ca valoarea contorului sa fie mai mica sau egala cu valoare numarului de repetari. Initializarea ciclului trebuie sa contina obligatoriu si pasul de initializare a contorului, iar modificarea ciclului trebuie sa contina obligatoriu operatia de incrementare a contorului In pseudocod forma generala este

pentru contorvi,vf[pas v] executa ...

sfarsit_pentru Cuvantul pentru marcheaza inceputul structurii, iar cuvantul sfarsit_pentru sfarsitul structurii. Virgula dintre vi si vf delimiteaza operatia de atribuire a contorului cu valoarea initiala (vi) de valoare finala la care trebuie sa ajunga contorul (vf). Cuvantul pas precede valoarea cu care se incrementeaza contorul (v) si este optional. Daca nu se specifica pasul v este considerat egal cu 1. Cuvantul executa determina inceputul secventei de instructiuni care se vor executa repetat

Page 2: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

2

Exemplu 1: Se citesc n numere intregi. Sa se calculeze suma lor Pseudocod Schema logica

intreg n,i,s,a; inceput citeste n; s0; pentru i1,n executa citeste a; ss+a; sfarsit_pentru; scrie s; sfarsit.

Scrie s

s=0;

Citeste n

START

i=1;

i<=n DA

Citeste a

n

S=s+a;

i=i+1;

NU

STOP

Page 3: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

3

Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod Schema logica

intreg n,i,s,m; inceput citeste m,n; s0; pentru i1,n executa daca i mod m=0 atunci ss+i; sfarsit_daca sfarsit_pentru; scrie s; sfarsit.

In C++ instructiunea care implementeaza structura repetitiva cu numar cunoscut de pasi este instructiunea for Forma generala

for (exp_1; exp_2; exp_3) instructiune

Cele trei expresii se folosesc pentru implementarea procesului de control al executării repetate a instrucţiunii şi corespund cetor trei acţiuni ale acestui proces: exp_1, pentru iniţializare, prin care se stabileşte starea dinainte de prima execuţie a

instrucţiunii, exp_2, pentru testare, prin compararea stării curente cu starea care termină procesul

de repetare şi are rolui de a termina executarea repetată a instrucţiunii; trebuie să fie o expresie numerică, al cărei rezultat să poată fi interpretat ca o constantă logică (True sau False),

Page 4: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

4

exp_3, pentru modificare, prin schimbarea stării curente, astfel încât să se avanseze către starea finală, care incheie procesul de repetare a executării instrucţiunii

Instrucţiunea for se execută astfel: Pas 1. Se evaluează expresia exp_1. Pas 2. Se evaluează expresia exp_2. Dacă rezultatul expresiei este diferit de 0

(corespunde valorii logice True) se execută instrucţiune, altfel se trece la execuţia instrucţiunii care urmează instrucţiunii for.

Pas 3. Se evaluează expresia exp_3 şi se revine la Pas 2. Exemplu 1 Sa se afle suma primelor n numere naturale int n,s=0,i; cout<<”n=”; cin>>n; for(i=1;i<=n;i++) s=s+i; cout<<”Suma este „<<s; Exemplu 2 Sa se afle suma cifrelor unui numar natural n int n,s; cout<<”n=”; cin>>n; for(s=0;n;n/=10) s=s+n/10; cout<<”Suma cifrelor este „<<s; Exemplul 2 mai poate fi scris si altfel int n,s; cout<<”n=”; cin>>n; for(s=0;n;s+=n%10,n/=10); cout<<”Suma cifrelor este „<<s; sau int n,s; cout<<”n=”; cin>>n; for(s=0;n/=10;s+=n%10); cout<<”Suma cifrelor este „<<s; Observaţie: Din punct de vedere sintactic, cele trei componente ale instrucţiunii for sunt expresii. Oricare dintre ele şi chiar toate trei pot fi expresit vide. Caracterele ; sunt insa obligatorii. De exemplu, instrucţiunea for (;;) ; este corectă din punct de vedere sintactic. Ea execută un ciclu infinit (un ciclu care nu se termină). Programul care conţine un cicku infinit se numeşte program care ciclează la infinit.

Page 5: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

5

Exemplu3 Se citesc mai multe numere intregi de la tastura pana la citirea numarului 0. Sa se calculeze suma numerelor pare citite int a,s; cin>>a for(s=0;a;) { if(!(a%2)) s+=a; cin>>a;} cout<<”Suma cifrelor pare este „<<s; In acest exemplu a treia expresie este vida. Actiunea de modificare a procesului de control are loc in corpul ,structurii repetitive prin citirea variabilei a Exemplu4 Se citesc cifrele unui numar incepand cu cifra cea mai semnificativa. Sa se afiseze numarul int n,c cin>>c; for(n=0;c>=0 && c<=9;) {n=n*10+c; cin>>c;} cout<<n; In acest exemplu a treia expresie este vida. Actiunea de modificare a procesului de control are loc in corpul ,structurii repetitive prin citirea variabilei c. Crearea unui flux de date este considerata o expresie. Programul poate fi rescris astfel int n,c cin>>c; for(n=0;c>=0 && c<=9; n=n*10+c,cin>>c) cout<<n; In expresia exp_1 se pot declara variabile de memorie si se pot initializa. Exemplu poate fi rescris astfel for(int n=0, c=0;c>=0 && c<=9; n=n*10+c,cin>>c) cout<<n; Exemplul 5 Se citeste un numar natural n si un sir de numere intregi. Sa se afiseze suma numarelor pare citite int n,i,a,s; cin>>n for(i=1,s=0;i<=n;i++) { cin>>a; if(!(a%2)) s=s+a;} cout<<s;

Page 6: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

6

Numararea executarii repetate a instructiunii for se poate face prin incrementarea sau decrementarea contorului. Exemplul poate fi rescris astfel int n,i,a,s; cin>>n for(i=n,s=0;i>=1;i--) { cin>>a; if(!(a%2)) s=s+a;} cout<<s; Exemplul 6 Se citeste un numar natural n. Sa se afiseze in ordine descrecatoare toate numerele naturale pare mai mici sau egale cu n int n,i; cin>>n; for(i=n;i>=2;i--) { if(!(i%2)) cout<<i<<” „; } Exemplul 7 Un numar natural se numeste perfect daca este egal cu suma divizorilor sai mai mici decat el. Se citeste un numar natural de la tastatura. Sa se afiseze numerele naturale perfecte mai mici sau egale cu el int s,n,i; cin>>n for(i=2;i<=n;i++) { for(j=2,s=1;j<i;j++) if(i%j==0) s=s+j; if(s==i) cout<<i<<” „; } Exemplul8 Variabila contor contor a instructiunii for poate avea orice tip numeric: int, char, float sau double for(char c=’a’;c<=’z’;c++) cout<<c; for(float x=0.9;x>=0.1;x=x-0.1) cout x<<” „;

Page 7: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

7

STRUCTURA REPETITIVA CU NUMAR NECUNOSCUT DE PASI In functie de momentul cand se face testarea exista doua tipuri de structuri repetitive cu numar necunoscut de pasi

Structuri repetitive conditionate anterior Structuri repetitive conditionate posterior

Structura repetitivă conditionata anteriror testeaza conditia de terminare a ciclului înainte de executarea corpului ciclului. Forma generala este

cat_timp conditie executa ...

sfarsit_cat_timp; Cuvantul cat_timp marcheaza inceputul structurii, iar cuvantul sfarsit_cat_timp sfarsitul structurii Cuvintele cat_timp si executa delimiteaza expresia logica ce se evalueaza pentru a testa conditia de terminare a ciclului Exemplu : Se citesc numere intregi pana la citirea numarului 0. Sa se calculeze suma numerelor citite Pseudocod Schema logica

intreg n,s,a; inceput citeste n; s0; cat_timp a<>0 executa citeste a; ss+a; sfarsit__cat_timp; scrie s; sfarsit.

Scrie s

s=0;

Citeste n

START

a=0 NU

Citeste a

n

s=s+a;

DA

STOP

Citeste a

Page 8: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

8

Structura repetitivă condiţionată posterior testează condiţia de terminare a ci clulul după executarea corpului ciclului. Forma generala este

repeta …

pana_cand conditie; Cuvântul repetă marchează inceputul structurii, iar sfarşitul expresiei logice marchează sfărşitul structurii. Cuvintele repetă şi până_când delimitează secvenţa de paşi care se va executa repetat, iar cuvântul pănă_când precede expresia logică ce se evaluează pentru a testa condiţia de terminare a ciclului. Ciclul se termina cand valoarea logica a expresiei este adevarat, altfel spus corpul ciclului se executa atata timp cat valoarea logica a conditiei este fals Exemplu: Sã se realizeze un algoritm ce calculeazã suma cifrelor unui numar natural Pseudocod Schema logica

intreg n,s,a; inceput citeste n; s ← 0; Repeta s ← s + n%10 ; n ← n/10 ; cat-timp (n>0) ; scrie s; sfarsit

Structura repetitivă condiţionată posterior mai poate fi descrisă şi prin raţionamentul execută... cât timp pe care o putem folosi pseudocod pentru descruerea structurii

Page 9: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

9

Forma generala Executa

... Cat_timp conditie

Cuvantul executa marcheaza inceputul structurii, iar sfărşitul expresiei logice rnarchează sfărşitul structurii. Cuvintele execută şi cât_timp delimitează secvenţa de paşi care se va executa repetat, iar cuvântul cât_timp precede expresia logică ce se evaluează pentru a testa condiţia de terminare a ciclului (ciclul se execută cât tirnp expresia logică are vabarea adevărat, altfel spus execuţia sa se termină cănd expresia logică are valoarea fals Exemplu: Sã se realizeze un algoritm ce calculeazã suma cifrelor unui numar natural repeta-cat_timp executa-cat_timp

intreg n,s,a; inceput citeste n; s ← 0; Repeta s ← s + n%10 ; n ← n/10 ; cat-timp (n>0) ; scrie s; sfarsit

intreg n,s,a; inceput citeste n; s ← 0; executa s ← s + n%10 ; n ← n/10 ; cat-timp (n>0) ; scrie s; sfarsit

Observatie In cazul structurii condiţionate posterior este obligatoriu să se execute acţiunea cel puţin o dată, spre deosebire de structura repetitivă condiţionată anterior, unde este posibil să nu se execute niciodată Orice structură repetitivă condiţionată anterior poate fi transformată intr-o structură repetitivă condiţionată posterior. Reciproca este şi ea adevărată. Dacă vom consiciera că in corpul ciclului există două tipuri de acţiuni: una de modificare. care schimbă starea curentă astfel incăt să se avarrseze către slarea finală (acţiunemodificare), şi una prin care se efectuează prelucrările obişnuite (acţiune prelucrare), atunci următoarele două structuri sunt echivalente: Structura repetitiva conditionata anterior

Structura repetitiva conditionata anterior

actiune initializare; cat_timp conditie executa actiuneprelucrare actiunemodificare sfarsit_cat_timp

actiune initializare; repeta actiuneprelucrare actiunemodificare cat_timp conditie

Orice structură repetitivă cu număr cunoscut de paşi poate fi transformată intr-o structură repetitivă cu număr necunoscut de paşi. Reciproca nu este adevărată. Structura repetitiva cu numar cunoscut de pasi

Structura repetitiva cu numar necunoscut de pasi

Page 10: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

10

Pentr contorvi,vf executa actiune prelucrare sfarsit_pentru

contorvi cat_timp contor<=vi executa actiune prelucrare contorcontor+1; sfarsit_cat_timp

Instructiunea while implementeaza structura repetitiva cu numar necunoscut de pasi Forma generala

while(expresie) instructiune

Instructiunea while se executa astfel

Pas1: Se evalueaza instructiunea expresie Pasul 2: Daca rezultatul expresiei este diferit de 0( corespunde valorii logice true) se

executa instructiune se executa instructiune, apoi se revine la pasul 1; altfel se trece la executarea instructiunii care urmeaza instructiunii while

Exemplul 1: Se citesc mai multe numere intregi de la tastatura, pana la citirea numarului 0. Sa se calculeze suma numerelor pare citite int a,s; cout<<”a=”; cin>>a; while(a) { if(!(a%2)) s+=a; cout<<”a=”; cin>>a; } cout<<”suma= ”<<s; Exemplul 2: Se citesc cifrele unui numar natural incepand cu cea mai semnificativa. Sa se afiseze numarul int n,c; cout<<”cifra= ”; cin>>c; while(c>=0 && c<=9) { n=n*10+c; cout<<”cifra= ”; cin>>c; } cout<<”numarul= ”<<n;

Page 11: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

11

Exemplul 3 Se citeste un numar natural. Sa se afiseze suma cifrelor int n,s=0; cout<<”numarul= ”; cin>>n; while(n) { s=s*10+n%10; n/=10; } cout<<”suma cifrelor= ”<<s; Expresia care se evalueaza poate fi formata si dintr-o expresie compusa din mai multe expresii legate de operatorul virgula, iar instructiunea care se executa poate fi si instructiunea vida Exemplul anterior mai poate fi scris si astfel int n,s=0; cout<<”numarul= ”; cin>>n; while(s+=n%10,n/=10); cout<<”suma cifrelor= ”<<s; Instructiunea do... while implementeaza structura repetitiva cu numar necunoscut de pasi conditionata posterior Forma generala

do instructiune

while(expresie) Instructiunea do... while se executa astfel

Pas1: Se executa instructiunea Pasul 2: Se evalueaza instructiunea expresie. Daca rezultatul expresiei este diferit

de 0( corespunde valorii logice true) se revine la pasul 1; altfel se trece la executarea instructiunii care urmeaza instructiunii do...while

Exemplul 1: Se citeste un numar natural. Sa se afiseze suma cifrelor int n,s=0; cout<<”numarul= ”; cin>>n; do { s=s*10+n%10; n/=10; } while(n) cout<<”suma cifrelor= ”<<s; Observatii 1) Structurile repetitive cu numar necunoscut de pasi pot fi implementate atat cu instructiunea while cat si cu instructiunea do...while

Page 12: STRUCTURA REPETITIVA bucla ciclu - mateinfo.net · 3 Exemplul 2: Se citesc de la tastatura numerele m si n. Sa se afle suma numerelor mai mici sau egale cu n care se divid cu m Pseudocod

12

2) Spre deosebire de instructiunea while, instructiunea do...while se executa cel putin odata. Exemplul 2: Se citesc cifrele unui numar natural incepand cu cea mai semnificativa. Sa se afiseze numarul int n,c; cout<<”cifra= ”; cin>>c; do { n=n*10+c; cout<<”cifra= ”; cin>>c; } while(c>=0 && c<=9) cout<<”numarul= ”<<n; Observatie: Programul din exemplul 2 nu este echivalent cu cel implementat prin instructiunea while pentru ca nu produce acelasi rezultat. De exemplu daca utilizatorul introduce prima oara valoarea 11 se va afisa 11 prin acest program si 0 prin programul implementat cu instructiunea while. Programul urmator corecteaza aceasta eroare int n,c; cout<<”cifra= ”; cin>>c; if(c>=0 && c<=9) do { n=n*10+c; cout<<”cifra= ”; cin>>c; } while(c>=0 && c<=9); cout<<”numarul= ”<<n;