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.
Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.
Meniu shortcuturi | ? |
Căutare probleme sau utilizatori | / |
Navigare printre rezultatele căutării | ↑, ↓ |
Meniu de contact și feedback | CTRL + Shift + F |
Ieșire din meniuri | Esc |
Setări editor | CTRL + Shift + S |
Schimbare stil editor | CTRL + Shift + E |
Șabloane de cod | CTRL + Shift + 1/2/3 |
Golire editor | CTRL + Shift + 4 |
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:
a^b
(a
la puterea b
): trebuie să îl înmulțim pe a
în mod repetat, de b
ori;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.
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ă.
while
Iată sintaxa instrucțiunii. Este asemănătoare ca la cea de if
.
while(condiție) {
instrucțiune 1;
instrucțiune 2;
…
}
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ă.
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ă.";
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.
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);
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.
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.
for
Instrucțiunea for
se execută astfel:
inițializare
;condiția
este adevărată:instrucțiune 1
, instrucțiune 2
, …;continuare
;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
.
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 for
ul invers:
for(int i = n; i >= 1; i--) {
cout << i << " ";
}
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.
break
Sintaxa instrucțiunii break
este următoarea:
break;
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;
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:
continue
Sintaxa acestei instrucțiuni este următoarea:
continue;
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 << " ";
}
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);
}
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
0
uri.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
cout << "1";
for(int i = 1; i <= n; ++i) {
cout << "0";
}
}
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 << " ";
}
# | 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. |