Invatare Atomica

Structura FOR

Progres lectie:
0%
🎯

Obiectivul lectiei

Dupa aceasta lectie, vei sti sa folosesti bucla FOR — cea mai eleganta structura repetitiva pentru un numar cunoscut de repetitii.

Dupa aceasta lectie vei putea:

  • Sa analizezi structura repetitiva cu contor
  • Sa explici sintaxa for
  • Sa utilizezi echivalenta for - while
  • Sa aplici variatii utile
  • Sa aplici exemplu: suma primelor n numere
  • Sa construiesti FOR-uri imbricate (nested for)

Incearca singur!

🎯 INCEARCA

Tabla inmultirii cu 7!

#include <iostream> using namespace std; int main() { cout << "Tabla inmultirii cu 7:" << endl; for (int i = 1; i <= 10; i++) { cout << "7 x " << i << " = " << 7 * i << endl; } return 0; }
🚀 Ruleaza pe OnlineGDB

Observa cat de compact e codul! Totul intr-o singura linie: for (start; conditie; pas)

1

Structura repetitiva cu contor

Structura repetitiva cu contor
FOR combina totul intr-o singura linie: initializare, conditie si incrementare. Perfect cand stii exact de cate ori vrei sa repeti!
2

Sintaxa FOR

Sintaxa FOR
for (initializare; conditie; pas) { // instructiuni }
Initializare int i = 1 - se executa O SINGURA DATA, la inceput
Conditie i <= 10 - se verifica INAINTE de fiecare repetitie
Pas i++ - se executa DUPA fiecare repetitie
3

Echivalenta FOR - WHILE

Echivalenta FOR - WHILE
// FOR: for (int i = 1; i <= 5; i++) { cout << i; } // WHILE echivalent: int i = 1; while (i <= 5) { cout << i; i++; }
4

Variatii utile

Variatii utile
// Numarare inversa: for (int i = 10; i >= 1; i--) { ... } // Pas de 2: for (int i = 0; i <= 100; i += 2) { ... } // Numere pare: for (int i = 2; i <= 20; i += 2) { ... }
5

Exemplu: Suma primelor n numere

Exemplu: Suma primelor n numere
int n, suma = 0; cout << "n = "; cin >> n; for (int i = 1; i <= n; i++) { suma += i; // echivalent cu: suma = suma + i } cout << "Suma: " << suma;
6

FOR imbricate (nested for)

FOR imbricate (nested for)

O bucla FOR poate fi plasata in interiorul altei bucle FOR. Aceasta se numeste bucla imbricata (nested).

Regula esentiala: pentru fiecare iteratie a buclei exterioare, bucla interioara ruleaza complet, de la primul la ultimul pas al ei.

// Structura generala: for (int i = 1; i <= n; i++) { // bucla EXTERIOARA (randuri) for (int j = 1; j <= i; j++) { // bucla INTERIOARA (coloane) cout << "*"; } cout << endl; // rand nou dupa fiecare linie de stele } // Rezultat pentru n=4: // * // ** // *** // ****

Cum se citeste: i este numarul randului (1, 2, 3, ..., n). Pe randul i, vrem sa afisam exact i stele, deci j merge de la 1 la i.

Atentie: variabilele de control ale celor doua bucle trebuie sa fie diferite (de obicei i si j).

Exercitii practice

Exercitiul 1 (Nivel minim) - Programare

Cerinta: Citeste un numar n si calculeaza suma tuturor numerelor de la 1 la n folosind bucla FOR.

Vezi rezolvarea

Rezolvare pas cu pas:

  1. Declara doua variabile intregi: int n, suma = 0;
  2. Citeste n de la tastatura: cin >> n;
  3. Foloseste o bucla FOR care merge de la 1 la n si aduna fiecare valoare la suma: for (int i = 1; i <= n; i++) { suma += i; }
  4. Afiseaza rezultatul: cout << "Suma: " << suma;

Verificare: pentru n = 5, suma trebuie sa fie 1+2+3+4+5 = 15. Testeaza si cu n = 10 (rezultat asteptat: 55).

Exercitiul 2 (Nivel standard) - Programare

Cerinta: Citeste un numar n si afiseaza tabla inmultirii cu n (de la n*1 pana la n*10).

Vezi rezolvarea

Rezolvare pas cu pas:

  1. Declara int n; si citeste-l: cin >> n;
  2. Foloseste o bucla FOR cu contorul i de la 1 la 10: for (int i = 1; i <= 10; i++)
  3. In corpul buclei calculeaza si afiseaza produsul: cout << n << " x " << i << " = " << n * i << endl;

Verificare pentru n = 3: trebuie sa apara 10 linii, de la "3 x 1 = 3" pana la "3 x 10 = 30". Endl-ul de la finalul liniei este important ca fiecare rezultat sa apara pe randul lui.

Exercitiul 3 (Nivel performanta) - Programare

Cerinta: Citeste un numar n si calculeaza n! (factorial). n! = 1 * 2 * 3 * ... * n

Vezi rezolvarea

Schita de rezolvare (nu solutia completa):

  1. Declara int n; si o variabila rezultat initializata cu 1, nu cu 0: long long fact = 1; (initializarea cu 0 ar face tot produsul 0).
  2. Citeste n.
  3. Foloseste un FOR de la 1 la n care inmulteste fact cu i la fiecare pas, acelasi tipar ca la suma din Exercitiul 1, dar cu inmultire in loc de adunare: fact *= i;
  4. Afiseaza fact.

Capcane: int tine numere pana la 2147483647, deci 12! = 479001600 incape, dar 13! = 6227020800 depaseste si rezultatul iese gresit. Atentie: in Code::Blocks cu MinGW (mediul din lectia 1) long ocupa tot 4 octeti, exact ca int, deci nu mareste nimic. Tipul care chiar extinde intervalul este long long (8 octeti, pana la 9223372036854775807, adica pana la 20!). Subiect nepredat explicit in lectie, dar util de stiut. Verifica separat cazul n = 0 (0! = 1, prin definitie).

Criterii de evaluare: tip de date potrivit si justificat, initializare corecta cu 1, tratarea cazului n = 0.

Exercitiul 4 (Nivel performanta) - Programare

Cerinta: Citeste un numar n si verifica daca este prim (se divide doar cu 1 si cu el insusi).

Vezi rezolvarea

Schita de rezolvare:

  1. Citeste n.
  2. Foloseste un FOR care parcurge posibilii divizori de la 2 pana la n-1: for (int i = 2; i < n; i++)
  3. La fiecare pas verifica daca n se imparte exact la i, cu operatorul % (predat la lectia despre operatori aritmetici): daca n % i == 0, atunci n NU e prim.
  4. Daca niciun i din interval nu imparte exact n, atunci n e prim.

Cazuri limita de tratat separat: n = 1 nu e considerat prim, n = 2 este prim (nu are niciun divizor intre 2 si 1).

Criterii de evaluare: tratarea corecta a cazurilor limita, folosirea corecta a operatorului %, oprirea logicii cand se gaseste un divizor.

Exercitiul 5 (Nivel performanta) - Programare

Cerinta: Deseneaza un triunghi de stele folosind FOR-uri imbricate (nested for — vezi Atomul 6). Urmeaza pasii:

  1. Citeste de la tastatura un numar n (numarul de randuri ale triunghiului, ex: 5).
  2. Scrie un FOR exterior care parcurge randurile: for (int i = 1; i <= n; i++).
  3. In interiorul sau, scrie un FOR interior care afiseaza exact i stele pe randul i: for (int j = 1; j <= i; j++) cout << "*";
  4. Dupa FOR-ul interior, adauga cout << endl; pentru a trece la randul urmator.
  5. Compileaza si verifica: pentru n=4 rezultatul trebuie sa fie:
    *
    **
    ***
    ****
Vezi rezolvarea

Schita de rezolvare (structura e deja explicata in cerinta, aici doar atentia la capcane):

  1. FOR exterior cu i de la 1 la n = randul curent.
  2. FOR interior cu j de la 1 la i = numarul de stele de pe randul i (creste cu fiecare rand).
  3. Dupa ce se termina FOR-ul interior (nu inainte!), scrie cout << endl; pentru randul nou.

Capcane frecvente: daca pui endl in interiorul FOR-ului interior, stelele apar cate una pe rand in loc de grupate; daca folosesti aceeasi variabila i si pentru bucla interioara, programul se blocheaza sau da rezultat gresit.

Criterii: numar corect de stele pe fiecare rand, forma triunghiului respectata pentru n=4 (1, 2, 3, 4 stele).

Ce ai invatat astazi

  • Ai invatat structura repetitiva cu contor
  • Acum stii sintaxa for
  • Ai descoperit echivalenta for - while
  • Ai explorat variatii utile
  • Ai inteles exemplu: suma primelor n numere
  • Ai construit FOR-uri imbricate (nested for)

Vrei mai mult?

Provocare: Scrie un program cu DOUA bucle FOR imbricate care afiseaza intreaga tabla a inmultirii de la 1x1 pana la 10x10, cate un rand pentru fiecare numar (nu doar tabla unui singur n, ca la Exercitiul 2). Bucla exterioara alege numarul, bucla interioara calculeaza produsul cu 1..10.

De ce? La tabla inmultirii poti schimba ordinea buclelor for(i...) si for(j...) fara sa strici rezultatul. La triunghiul de stele (Exercitiul 5), unde limita lui j depinde de i, aceeasi schimbare ar distruge complet desenul. Care e diferenta exacta intre cele doua situatii care face schimbarea sigura intr-un caz si periculoasa in celalalt?

Deschidere: Buclele imbricate stau in spatele oricarui program care lucreaza cu un tabel: o foaie Excel parcursa rand cu rand si coloana cu coloana, o imagine procesata pixel cu pixel, sau o tabla de joc verificata linie cu linie.

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →