Structuri repetitive (while, do while, for, etc)
În această lecție vom învăța ce sunt structurile repetitive și de ce sunt utile.
De multe ori se întâmplă să avem nevoie să repetăm un set de instrucțiuni de un număr de ori. Iată câteva exemple:
- Să calculăm valoarea
a^b(ala putereab): trebuie să îl înmulțim peaîn mod repetat, debori; - Să calculăm media a
nnumere.
Limbajul C++ ne oferă o varietate de modalități de a repeta un set de instrucțiuni. Le vom prezenta aici, menționând de asemenea la ce este bun fiecare structură repetitivă în parte (unele structuri vor fi utile doar în anumite contexte).
Se recomandă să cunoști structura de decizie (if și switch) înainte de a învăța
structurile repetitive.
Structura repetitivă while
Vezi articolul în detaliu aici
Una dintre cele mai des utilizate structuri repetitive, instrucțiunea while
funcționează ca și un if, doar că repetă instrucțiunile dintre acolade până
când condiția este falsă.
Sintaxa structurii while
Iată sintaxa instrucțiunii. Este asemănătoare ca la cea de if.
while(condiție) {
instrucțiune 1;
instrucțiune 2;
…
}
Observații
Dacă condiția este falsă de la început, atunci nu se vor executa
instrucțiunile niciodată.
Dacă condiția este mereu adevărată, atunci se va crea o buclă infinită,
iar codul nu se va opri niciodată.
Exemple
Să zicem că avem un număr n și vrem să afișăm în ordine numerele n, n - 1, …, 3, 2, 1. Putem să folosim structura while astfel:
//Pentru n = 5, se va afișa:
//5 4 3 2 1
int n;
cin >> n;
while(n != 0) {
cout << n << " ";
n--;
}
Să vedem pas cu pas ce se întâmplă. Urmărește animația de mai jos:
| Variabilă | Valoare |
|---|---|
| n | 001122334455 |
Consolă: 5 4 3 2 1
Observăm că dacă condiția este mereu adevărată, atunci codul nu se va opri
niciodată (spunem că formăm o buclă infinită). De aceea, este important să
ne asigurăm că va exista un moment în care condiția să fie falsă. În
următorul exemplu, este evident că nu va exista niciun moment în care
condiția n == n să fie falsă, însă în exemplul de după poate fi mai
dificil să găsim eroarea.
//Pentru n = 5, se va afișa:
//5 5 5 5 5 5 5 5 … (la infinit)
int n;
cin >> n;
while(n == n) {
cout << n << " ";
}
//Pentru n = 6, se va afișa:
//6 4 2
//Pentru n = 5, se va afișa:
//5 3 1 -1 -3 -5 … (va continua la infinit, deoarece nu se atinge niciodată valoarea 0)
int n;
cin >> n;
while(n != 0) {
cout << n << " ";
n -= 2;
}
În următorul exemplu, codul nu va intra deloc în structura while:
int n = 0;
while(n != 0) {
cout << n << " ";
}
cout << "Nu se va afișa niciun număr, pentru că n este 0 încă de la început, condiția fiind falsă.";
Structura repetitivă do while
Vezi articolul în detaliu aici
Spre deosebire de structura while, do while execută instrucțiunile dintre
acolade cel puțin o dată, indiferent dacă condiția este adevărată sau
nu.
Exemplu
Pentru codul anterior, putem executa instrucțiunile cel puțin odată folosind
structura do while în loc de cea while.
//Se afișează 0 o singură dată
int n = 0;
do {
cout << n << " ";
} while(n != 0);
Structura repetitivă for
Vezi articolul în detaliu aici
Instrucțiunea for este utilă în cazul în care vrem să executăm niște
instrucțiuni de un număr fix de ori — spre deosebire de while sau do while, când executăm codul pe baza unei condiții oarecare.
Sintaxa instrucțiunii for
Iată sintaxa acestei instrucțiuni.
for(inițializare; condiție; continuare) {
instrucțiune 1;
instrucțiune 2;
…
}
Sintaxa acestei instrucțiuni poate părea dificilă pentru început, însă se dovedește a fi foarte ușor de înțeles dacă analizăm modul de execuție.
Modul de execuție a instrucțiunii for
Instrucțiunea for se execută astfel:
- Se execută instrucțiunea
inițializare; - Cât timp
condițiaeste adevărată: 1. Se executăinstrucțiune 1,instrucțiune 2, …; 2. Se execută instrucțiuneacontinuare;
Observații
Practic, echivalentul instrucțiunii for este următorul:
inițializare;
while(condiție) {
instrucțiune 1;
instrucțiune 2;
…
continuare;
}
Deși avem un echivalent al codului folosind while, care este astfel mai
versatil, observăm că acest cod poate fi mai greu de înțeles — nu știm, cel
puțin la prima vedere, dacă instrucțiunea inițializare are legătură sau nu
cu structura repetitivă, și nu știm dacă instrucțiunea continuare are
legătură sau nu cu celelalte instrucțiuni dintre acolade.
Instrucțiunile inițializare, condiție și continuare Pot fi lăsate goale.
Iată un echivalent pentru while(n == n):
for(; n == n;) {
…
}
În exemplul de mai sus, instrucțiunea de inițializare este inexistentă, și
nu există nicio instrucțiune de continuare.
Exemple
Să zicem că vrem să afișăm primele n numere naturale nenule. Putem proceda
astfel:
for(int i = 1; i <= n; i++) {
cout << i << " ";
}
Mai întâi, inițializăm o variabilă i, de tip int, egală cu 1. Condiția
de oprire este i <= n, iar la fiecare pas, instrucțiunea de continuare este
i++. Putem urmări ce se întâmplă în animația de mai jos, pentru n = 5:
| Variabilă | Valoare |
|---|---|
| n | 5 |
| i | 554433221- |
Consolă: 1 2 3 4 5
În programare, se obișnuiește să numești variabila de iterație (numit și iteratorul)
i,j, și așa mai departe.
Sau, putem parcurge forul invers:
for(int i = n; i >= 1; i--) {
cout << i << " ";
}
Instrucțiunea break
Vezi articolul în detaliu aici
Instrucțiunea break întrerupe execuția unei structuri repetitive (while,
do while, for), trecând la instrucțiunile de după indiferent dacă
condiția acestor structuri mai sunt sau nu adevărate.
Sintaxa instrucțiunii break
Sintaxa instrucțiunii break este următoarea:
break;
Exemple
Afișarea primelor n numere naturale, însă dacă atingem valoarea 5, ne
oprim.
//Pentru n = 8, se va afișa:
//1 2 3 4 5 (ne oprim la 5)
//Pentru n = 3, se va afișa:
//1 2 3
for(int i = 1; i <= n; i++) {
cout << i << " ";
if(i == 5) {
break;
}
}
Multe probleme cer citirea și prelucrarea unor numere până când se întâlnește
valoarea 0. De exemplu, dacă vrem să calculăm suma unor numere până la
întâlnirea lui 0, putem proceda astfel:
//Pentru numerele 4 9 10 0, se va afișa:
//23
int sum = 0;
while(true) {
int nr;
cin >> nr;
if(nr == 0) {
break;
}
sum += nr;
}
cout << sum;
Instrucțiunea continue
Vezi articolul în detaliu aici
Instrucțiunea continue trece peste instrucțiunile rămase din iterația
curentă și continuă cu următoarea iterație. Putem observa cum funcționează
instrucțiunea continue în diagrama următoare:

Sintaxa instrucțiunii continue
Sintaxa acestei instrucțiuni este următoarea:
continue;
Exemplu
Să zicem că vrem să afișăm numerele pare mai mici sau egale decât n.
Procedăm astfel:
//Pentru n = 7, se va afișa:
//2 4 6
int n;
cin >> n;
for(int i = 1; i <= n; ++i) {
if(i % 2 == 1) { //Numărul este impar, deci sărim peste el
continue;
}
//Linia următoare se rulează doar pentru numerele pare:
cout << i << " ";
}
Probleme rezolvate
Media geometrică
Să se calculeze media geometrică a n numere naturale. Media geometrică este
egală cu rădăcina de ordinul n a produsului numerelor. Testează-ți
rezolvarea pe această pagină.
Exemplu: Pentru n = 3 și numerele 1, 8, 27, rezultatul va fi 6.
Rezolvare: Vom citi n, după care folosind o structură repetitivă de tip
for, vom calcula produsul numerelor. La final, ridicăm numărul la puterea 1 / n.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n, prod = 1;
cin >> n;
for(int i = 1; i <= n; ++i) {
int x;
cin >> x;
prod *= x;
}
cout << pow(prod, 1.0 / n);
}
Zece la puterea n
Dându-se un număr natural n (cel mult egal cu 100), să se afișeze pe ecran
rezultatul operației 10^n. Testează-ți rezolvarea pe această
pagină.
Exemplu: Pentru n = 3, se va afișa 1000.
Rezolvare: Pentru valori mici ale lui n, putem să înmulțim repetat o
variabilă cu 10. Cu toate acestea, răspunsul pentru n = 100 nu va încăpea
nici măcar în tipul de dată long long. De aceea, mai simplu este să folosim
un artificiu de afișare: afișăm pe ecran 1, urmat de n 0uri.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
cout << "1";
for(int i = 1; i <= n; ++i) {
cout << "0";
}
}
Exerciții propuse
Completează următoarele secvențe de cod:
Să se afișeze descrescător primele n numere naturale, sărind peste numerele
divizibile cu 3:
int n;
cin >> n;
for(int i = n; i >= 1; i--) {
if(??? % 3 == 0) {
???;
}
cout << i << " ";
}
Să se calculeze suma primelor n numere naturale, mai mici sau egale cu 10:
int n, sum = 0;
cin >> n;
for(int i = 1; i <= n; i++) {
if(i > 10) {
???;
}
cout << i << " ";
}
Probleme propuse
Setul de probleme 124 nu a fost găsit.
Bibliografie și alte resurse
DS
Autorul acestei lecții
Dominic Satnoianu
Această lecție a fost redactată de către Dominic Satnoianu.
© 2021 – 2025 Aspire Education Labs SRL. Toate drepturile rezervate.
Așa cum este specificat și în termeni și condiții, conținutul acestei pagini este protejat de legea drepturilor de autor și este interzisă copierea sau modificarea acestuia fără acordul scris al autorilor.
Încălcarea drepturilor de autor este o infracțiune și se pedepsește conform legii.
Comentarii 0