Contact și feedback

Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.


Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.


Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.

Shortcuturi

Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.

Generale

Meniu shortcuturi?
Căutare probleme sau utilizatori/
Navigare printre rezultatele căutării↑, ↓
Meniu de contact și feedbackCTRL + Shift + F
Ieșire din meniuriEsc

Editor probleme

Setări editorCTRL + Shift + S
Schimbare stil editorCTRL + Shift + E
Șabloane de codCTRL + Shift + 1/2/3
Golire editorCTRL + Shift + 4

Structuri repetitive (while, do while, for, etc)

În această lecție vom învăța ce sunt structurile repetitive și de ce sunt utile.

Obține medalia mult dorită. Devino As la olimpiadă.

Curs complet de olimpiadă, pregătit de olimpici de la Oxford și TU Delft.

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 (a la puterea b): trebuie să îl înmulțim pe a în mod repetat, de b ori;
  • Să calculăm media a n numere.

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:

  1. Se execută instrucțiunea inițializare;
  2. Cât timp condiția este adevărată:
    1. Se execută instrucțiune 1, instrucțiune 2, …;
    2. Se execută instrucțiunea continuare;

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:

Imagine reprezentativă (01)

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

# Problemă Dificultate
57. Medie patratica Ușoară (2 )
501. Afisare numere pare Ușoară (2 )
505. Cate sunt multiple Medie (4 )
293. Gard Medie (4 )
503. Puteri mai mici Ușoară (2 )
Vrei mai multe probleme? Pe această pagină găsești întreaga listă de probleme propuse.

Bibliografie și alte resurse

Obține medalia mult dorită. Devino As la olimpiadă.

Curs complet de olimpiadă, pregătit de olimpici de la Oxford și TU Delft.

Cuprinsul lecției

Se încarcă…

Citește și

Transformarea unei litere mici în literă mare în C++Câte numere naturale sunt într-un interval dat? (C++)Instrucțiunea break (structuri repetitive)Numărul aranjamentelor în C++ (formula aranjamentelor)Distanța dintre două puncte în C++Valoarea absolută (modulul) unui număr în C++Rădăcina cubică a unui număr în C++ (cube root)Matrice în C++. Declararea și parcurgerea tablourilor bidimensionaleSuma divizorilor unui număr în C++Cum să calculezi instant 2 la puterea N în C++Al N-lea termen dintr-o progresie geometricăPrima cifră a unui număr în C++Aria unui triunghi folosind coordonatele acestora în C++Oglinditul unui număr în C++Numărul permutărilor în C++ (formula permutărilor)Cum să citești și să afișezi în fișiere în C++Căutare binară în C++Tutorial instalare CodeBlocks (ușor) - Introducere în informatică C++Do while vs while în C++ - Care e diferența?Aria și circumferința unui cerc în C++Copiuțe: Cifrele unui numărAl N-lea termen Fibonacci în C++Instrucțiunea de decizie în C++: if, else, switch, caseCifra maximă și minimă a unui număr în C++Ce este o variabilă unsigned în C++?De ce cer unele probleme răspunsul modulo 666013 sau modulo 1.000.000.007?Verificare dacă șir de caractere este palindrom în C++Transformarea unui număr din baza 2 în baza 10 în C++Află secolul unui an citit de la tastatură în C++Matrice Fibonacci - al n-lea termen Fibonacci în timp logaritmicInterschimbarea a două variabile în C++ (3 metode)Codul ASCII (tabel complet)Indicatorul lui Euler al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Funcții în C++. Ce sunt subprogrameleȘirul lui Fibonacci în C++Suma elementelor unui vector recursiv în C++Numere triunghiulare. Verificarea unui număr triunghiularStructuri repetitive (while, do while, for, etc)CMMDC recursiv a două numere naturale în C++Afișarea divizorilor primi ai unui număr în C++Aplicații cu ciurul lui Eratostene în C++: suma divizorilor, numărul divizorilorAl N-lea termen dintr-o progresie aritmeticăVectori de frecvență (de apariții) în C++Cel mai mare divizor comun (CMMDC) a două numere în C++Operații cu numere mari în C++ - Toate funcțiile explicateCe este o funcție void în C++?Numărul de divizori primi ai unui număr în C++Calculul combinărilor de n luate câte k (nCk) în C++Factorialul unui număr în C++Comentarii în C++Cifrele unui număr. Prelucrarea cifrelor unui număr în C++Pointer în C++. Variabile de tipul char * (char steluță)Ce înseamnă endl în C++?Verificare număr prim în C++ (Clasa a IX-a)Numărul minim de peroane pentru o gară în C++Materia pentru olimpiada de informatică - tot ce trebuie să știiMaximul și minimul a trei valori în C++Generarea șirului Fibonacci generalizat în C++Indicatorul lui Euler în C++Instrucțiunea continue (structuri repetitive)CMMMC a două numere în C++ (cel mai mic multiplu comun)Suma divizorilor numerelor de la 1 la N (Folosind ciurul lui Eratostene)Numărul combinărilor în C++ (formula combinărilor)Maximul și minimul unui vector în C++Verifică dacă un număr dat este o putere de 2 în C++Instrucțiunea for (structuri repetitive)Maximul și minimul a două valori în C++Numărul de apariții al unui număr într-un vector în C++Matrice pătratice în C++. Diagonala principală și secundarăCitește un șir de caractere cu spații în C++Mediana unui șir de valori în C++Tipuri de date în C++: numere întregi, reale, caractere și alteleInversarea unui vector în C++Cel mai semnificativ bit în C++Interclasarea a doi vectori în C++Funcții predefinite în C++ (matematice, șiruri de caractere)Verificare dacă un număr este palindrom în C++Verificarea unui an bisect în C++Verifică dacă un bit de pe o anumită poziție este 1 sau 0 în C++Numărul de cifre ale factorialului unui numărMaximul și minimul a n valori în C++Cifra maximă a unui număr recursiv în C++Recursivitate în C++Numărul de divizori al unui număr în C++Verifică dacă o literă este vocală în C++Transformarea unei litere mari în literă mică în C++Verifică dacă trei puncte sunt coliniare C++Cum să afișezi partea întreagă a unui număr real în C++Inversarea unui șir de caractere în C++Ciurul lui Eratostene în C++Verifică dacă un caracter este literă în C++Cel mai frecvent element dintr-un șir în C++Suma numerelor naturale dintr-un interval dat în C++Cel mai mic/mare divizor prim al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Algoritm recursiv pentru căutare binară (clasa a X-a)Cel mai puțin semnificativ bit în C++Verifică dacă un număr este par sau impar fără modulo în C++Radicalul unui număr în C++ (rădăcina pătrată)Afișarea elementelor unui vector recursiv în C++Vectorii în C++: declarare și parcurgereTransformarea unui număr din baza 10 în baza 2 în C++Citirea și afișarea matricelor în C++Tipul struct în C++. Ce sunt structurile de date neomogeneSuma 1 + 2 + 3 + ... + N în C++Sortare crescătoare recursivă în C++ - Merge sort și Bubble sortCea mai lungă secvență de elemente crescătoare în C++Verifică dacă o literă este mică sau mare în C++Aflarea sumei primelor N sume GaussInstrucțiunea do while (structuri repetitive)Cifra de control a unui numărBordarea unei matrice în C++Oglinditul recursiv al unui număr în C++Divide et Impera (metodă de programare C++)Ridicarea la putere în timp logaritmic în C++. Exponențiere rapidăVerifică dacă un caracter este cifră în C++Combinatorică în C++: permutări, aranjamente, combinări și alteleInstrucțiunea while (structuri repetitive)Verifică dacă un număr aparține șirului Fibonacci în C++Vectorii în C++: citire și afișareCel mai mic număr cu suma cifrelor N în C++Numărul de divizori al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Ce înseamnă variabilă globală și locală în C++?Șiruri de caractere în C++. Tot ce trebuie să știiComplexitatea unui algoritm (timp și spațiu) în C++

© Drepturi de autor

Echipa InfoAs își rezervă drepturile de autor pentru conținutul acestei pagini. Copierea conținutului fără acordul scris expres al InfoAs reprezintă o încălcare a Legii 8/1996 și va fi tratată ca atare.

Trimite lecția

Toată lecția

Doar videoclipul pe YouTube

Informatica devine ușoară cu InfoAs

Intră în cont