Programare Competitivă

Instrucțiunea for

Instrucțiunea for este una dintre cele mai folosite structuri din programare. Ea apare foarte des atunci când vrem să lucrăm cu numere, intervale sau pași clari.

Deși while și do while ne permit deja să repetăm instrucțiuni, for vine cu un avantaj important: > toate informațiile despre repetare sunt scrise într-un singur loc.


De ce avem nevoie de for?

Să ne gândim la o situație simplă:

  • vrem să afișăm numerele de la 1 la 10;
  • știm exact de unde începem;
  • știm exact unde ne oprim;
  • știm că avansăm cu +1.

Într-o astfel de situație, for este alegerea naturală.


Forma generală a instrucțiunii for

for (initializare; conditie; modificare) {
    instructiuni;
}

Această linie spune tot ce trebuie:

  • initializare - de unde pornim;
  • conditie - cât timp continuăm;
  • modificare - cum trecem la pasul următor.

Un exemplu foarte simplu

int i;
for (i = 1; i <= 5; i++) {
    cout << i << endl;
}

Ce se întâmplă aici:

  1. i pornește de la 1;
  2. se verifică dacă i <= 5;
  3. se afișează valoarea;
  4. i crește cu 1;
  5. pașii se repetă.

Cum ar arăta același lucru cu while

int i = 1;
while (i <= 5) {
    cout << i << endl;
    i++;
}

Observăm că:

  • trebuie să scriem mai mult cod;
  • există riscul să uităm i++;
  • logica este împărțită în mai multe locuri.

Diferența dintre for și while

for while
Ideal când știm numărul de pași Ideal când nu știm exact câți pași
Totul este într-o singură linie Logica este împărțită
Mai ușor de citit Mai flexibil
Foarte folosit la numărări Foarte folosit la condiții

Exemple utile cu for

Afișarea numerelor pare între 1 și 10

int i;
for (i = 2; i <= 10; i = i + 2) {
    cout << i << " ";
}
Output:
2 4 6 8 10

Afișarea numerelor de la 10 la 1

int i;
for (i = 10; i >= 1; i--) {
    cout << i << " ";
}
Output:
10 9 8 7 6 5 4 3 2 1

Afișarea unui mesaj de mai multe ori

int i;
for (i = 1; i <= 3; i++) {
    cout << "Invat C++!" << endl;
}
Output:
Invat C++!
Invat C++!
Invat C++!

Calcularea sumei numerelor de la 1 la n

int n, i;
cin >> n;
int suma = 0;

for (i = 1; i <= n; i++) {
    suma = suma + i;
}

cout << suma;
Input:
10
Output:
55

Calcularea produsului numerelor de la 1 la n

int n, i;
cin >> n;
int produs = 1;

for (i = 1; i <= n; i++) {
    produs = produs * i;
}

cout << produs;
Input:
5
Output:
120

Încearcă și tu

Completează codul de mai jos astfel încât, în urma executării datelor de intrare din Input, să se afiseze datele din Output.

Input:
20
Output:
20 10 5 2 1

Atenție la acolade { }

La fel ca și în cazul instrucțiunilor if și while, dacă avem mai mult de o instrucțiune în interiorul buclei, acoladele sunt obligatorii.

int suma = 0, i;
for (i = 1; i <= 5; i++) {
    cout << i << " ";
    suma = suma + i;
}
cout << endl << suma;
Output:
1 2 3 4 5
15

Greșeli frecvente

1. Buclă infinită

int i;
for (i = 1; i <= 5; i--) // GREȘIT

Valoarea lui i scade, iar condiția rămâne mereu adevărată.

int i;
for (i = 1; i <= 5; i++) {
    if (i % 2 == 1)
        i--;             // GREȘIT
}

Valoarea lui i va rămane blocată cu valoarea 1


2. Condiție greșită

int i;
for (i = 1; i == 5; i++) // GREȘIT

Bucla nu se execută niciodată.


Când alegem for?

Alege for atunci când:

  • numeri;
  • știi exact numărul de pași;
  • parcurgi intervale;
  • faci calcule repetitive;
  • pui accent pe repetiție și nu pe condiție;
  • ai un pas constant;

Ce să reții

  • for are trei componente: inițializare, condiție, pas.
  • Este ideal când știm exact câte repetări facem.
  • Suma se inițializează cu 0, produsul cu 1.
  • Atenție la buclele infinite (pasul greșit).
  • Acoladele sunt obligatorii dacă avem mai multe instrucțiuni în buclă.

Probleme

pbinfoAfisarenumere1

pbinfoAfisare M2

pbinfoUltimeleimpare

pbinfoNumere

pbinfoPc

pbinfoPrize