InfoBook.ro ← Harta anului
Modul 02 · Decizie și repetiție
Modul 02 · Instrucțiuni

Programul care alege și repetă

Cu doar două superputeri — „dacă…atunci" și „repetă cât timp" — poți construi orice algoritm din lume. Serios: orice. Astăzi le stăpânești pe amândouă.

🎯 Obiectiv 1Scrii corect if/else, if/else if și switch — și alegi forma potrivită.
🎯 Obiectiv 2Alegi bucla potrivită: while, do-while sau for — și le convertești între ele.
🎯 Obiectiv 3Urmărești execuția pe schemă + cod + variabile — tehnica nr. 1 la BAC.
1

Decizia: if / else

Programul ajunge la o răscruce, pune o întrebare cu răspuns DA/NU și alege drumul. Rulează-l pas cu pas!

nota =
DA NU START citește nota nota ≥ 5 ? „Promovat" „Corigent" STOP romb = întrebare cu două ieșiri; exact una dintre ramuri se execută
Variabile
nota
Ecran
 
Alege o notă și apasă „Pas cu pas". 👣
Aceeași idee, trei sintaxe. În C++ condiția stă între paranteze rotunde și blocul între acolade; în Python, două puncte și indentarea obligatorie; în pseudocod, cuvintele „dacă / altfel".

Operatorii cu care pui întrebări (recapitulare din Modulul 01)

RelaționalÎnțeles
<   >   <=   >=comparații obișnuite
==egal? (DOUĂ semne egal!)
!=diferit?
Logic (C++ / Python)Înțeles
&& / andambele condiții adevărate
|| / ormăcar una adevărată
! / notinversează valoarea de adevăr
Greșeala nr. 1 din toate timpurile: if (x = 5) cu un singur egal. Asta nu întreabă „x este 5?", ci atribuie 5 lui x — și condiția devine mereu adevărată. La BAC se punctează diferența!
2

Decizie înlănțuită: if / else if / else

Când drumurile sunt mai mult de două, legăm deciziile în lanț: prima condiție adevărată câștigă, restul nici nu se mai verifică.

Exemplu: categorii de vârstă

v =
DA NU DA NU citește v v < 14 ? „copil" v < 18 ? „adolescent" „adult" STOP prima condiție adevărată câștigă; restul nu se mai verifică deloc
Variabile
v
Ecran
 
Alege o vârstă și pornește execuția. Încearcă 10, 16 și 40! 👣
De reținut: în lanțul if / else if / else, ordinea condițiilor contează. Dacă puneai întâi „v < 18", un copil de 10 ani ar fi fost etichetat „adolescent" — condiția mai restrictivă vine prima.
3

Selecție multiplă: switch (C++) / match (Python)

Când compari aceeași variabilă cu mai multe valori exacte, ambele limbaje au o poartă cu mai multe ieșiri.

Exemplu: ziua săptămânii după număr — apasă pe o valoare

1Luni
2Marți
3Miercuri
4Joi
5Vineri
6Weekend
7Weekend
altinvalid

switch-ul „deschide" exact ușița potrivită — și linia de cod corespunzătoare se aprinde în ambele limbaje

⚙ C++ — switch

🐍 Python — match (3.10+)

Capcana break (doar C++): fără break, execuția „cade" în case-ul următor — de-asta case 6 și case 7 pot împărți același cod. În Python match nu există căderea: fiecare case e izolat, iar gruparea se face cu | (sau).
Când folosești selecția multiplă? Doar pentru comparații cu valori exacte (1, 2, 'a', 7…). Pentru intervale (v < 14, nota ≥ 5) rămâi la if / else if. default (C++) și case _ (Python) prind tot ce n-a potrivit nimic — plasa de siguranță obligatorie.
4

Condiții compuse pe viu: anul bisect

Regula sună ciudat: divizibil cu 4, dar nu cu 100 — sau divizibil cu 400. De unde vine? Din astronomie!

🌍 De ce există anii bisecți — povestea din spatele condiției

Un an real (o rotație completă în jurul Soarelui) durează 365,2422 zile — nu fix 365. Dacă am ignora restul, calendarul ar „aluneca": după câteva sute de ani, Crăciunul ar pica vara. Repararea s-a făcut în două etape:

46 î.Hr. · Iulius Cezar O zi în plus la fiecare 4 ani: 29 februarie. media: 365,25 zile/an prea mult cu ~11 minute pe an → o zi întreagă la fiecare ~128 de ani
1582 · Papa Grigore Șterge cele 10 zile deja adunate și scoate 3 bisecți la fiecare 400 de ani: secolele NEdivizibile cu 400. 97 bisecți / 400 ani 1700, 1800, 1900 → NU · 1600, 2000, 2400 → DA
Azi · calendarul gregorian Media coboară aproape perfect pe anul real. media: 365,2425 zile/an abaterea rămasă: o zi întreagă abia la ~3.300 de ani

🧮 Socoteala, în patru rânduri

Cât durează anul real365,2422 zile
Eroarea lui Cezar: 365,25 − 365,2422+0,0078 zile/an → +3,12 zile în 400 de ani
Corecția lui Grigore: scoate 3 bisecți → (400 · 365 + 97) / 400365,2425 zile/an
Eroarea rămasă: 365,2425 − 365,24220,0003 zile/an ≈ 26 s/an
Atenție la unități: „0,0003 zile" și „26 de secunde" sunt aceeași eroare (0,0003 × 24 × 3600 ≈ 26) — pe an. În 400 de ani se adună doar 0,12 zile (~3 ore), de aceea regula nu a mai avut nevoie de alt „petic".
Tradus în logică: bisect = (an % 4 == 0 && an % 100 != 0) || an % 400 == 0
din 4 în 4 ani (Cezar) · MINUS secolele (Grigore) · PLUS secolele divizibile cu 400. Exact condiția compusă pe care o testezi mai jos.
an =
DA NU DA NU DA NU citește an an % 4 == 0 ? an % 100 != 0 ? an%400==0? ✔ AN BISECT feb. are 29 zile ✘ an obișnuit — feb. are 28 zile
an % 4 == 0  (divizibil cu 4? — regula lui Cezar)
an % 100 != 0  (NU e an de secol?)
an % 400 == 0  (secol special? — regula lui Grigore)
 
Testează cazurile-capcană: 1900 (divizibil cu 4 și cu 100, dar nu cu 400 → NU e bisect) și 2000 (divizibil cu 400 → E bisect). Exact genul de teste de limită despre care am vorbit în Modulul 01!
5

Repetiția: while, do-while, for

Trei unelte pentru aceeași treabă — diferă doar când se verifică condiția și cine numără.

while

Verifică înainte de fiecare pas. Poate să nu execute niciodată corpul.

Folosește-l când nu știi de câte ori repeți: „cât timp mai am cifre…"

do … while

Verifică după. Corpul se execută garantat măcar o dată.

Perfect pentru meniuri și validări. (Nu există în Python — se simulează cu while True + break.)

for

Contor integrat: inițializare, condiție, pas — toate pe o linie.

Folosește-l când știi numărul de repetări: „pentru fiecare i de la 1 la n".

▶ Fiecare buclă, cu schema ei — pas cu pas

Variabile
n
Ecran
 
Alege o buclă din tab-uri și pornește execuția. 👣

🔁 Conversia for ⇄ while — echivalență cerută la BAC

1for (i = 1; i <= n; i++)
2{
3 cout << i;
4}
1i = 1; // init
2while (i <= n) { // cond
3 cout << i; // corp
4 i++; // pas
5}
Aceleași 4 piese — init, cond, corp, pas — doar așezate diferit. La BAC, subiectul II cere frecvent exact această rescriere; verifică mereu că pasul rămâne ultimul în corp.
6

Simulator: suma 1..n, cu tabel de urmărire

Algoritmul-rege al capitolului. Privește cum se rotește bucla în schemă, în cod și în tabelul de urmărire — simultan.

n =
DA NU START citește n s ← 0; i ← 1 i ≤ n ? s ← s + i i ← i + 1 scrie s STOP stânga: corpul (s←s+i; i←i+1) se întoarce la condiție dreapta: pe NU se iese din buclă → scrie s → STOP
Variabile
n
i
s
Ecran
 
verificare i ≤ nis
Apasă „Pas cu pas". Tabelul de urmărire se completează pe măsură ce bucla se rotește. 👣
Tehnica de BAC: la subiectul I primești un pseudocod și un n concret — iar tabelul acesta, făcut pe hârtie, e exact cum obții răspunsul fără să te încurci. Exersează-l până devine reflex.
7

O primă privire spre eficiență

Două programe pot da același răspuns muncind foarte diferit. Numără pașii cu noi.

n =
1// suma 1..n cu buclă
2s = 0;
3for (i = 1; i <= n; i++)
4 s = s + i;
1// suma 1..n cu formula lui Gauss
2s = n * (n + 1) / 2;
3 
4 
Vocabular nou: spunem că bucla are complexitate O(n) — pașii cresc direct cu n — iar formula are O(1) — un singur pas, indiferent de n. Revenim serios la acest subiect în Modulul 03 (Euclid) și Modulul 09 (sortări).
8

Vânătoarea de bug-uri

Două programe, două erori clasice. Găsește linia vinovată din fiecare.

🐞 Bug 1: programul ar trebui să afișeze cel mai mare dintre a și b

🐞 Bug 2: programul ar trebui să afișeze numerele de la 1 la 5 — dar nu se oprește niciodată!

9

Ce afișează codul?

Trei întrebări în stil BAC. Fă tabelul de urmărire în minte (sau pe hârtie!) înainte să alegi.

10

Fișa de sinteză

Ideile-temelie ale întregului an.

if (condiție) … else … — drumuri alternative; condiția e o expresie logică (adevărat/fals).
== compară, = atribuie. Confuzia dintre ele e cea mai frecventă eroare la începători și la BAC.
while = nu știu de câte ori; for = știu de câte ori; do-while = măcar o dată (doar C++).
Orice for ⇄ while: init; while(cond){ corp; pas; } — echivalență cerută la examen.
Bucla infinită apare când condiția nu devine niciodată falsă — verifică mereu cine modifică contorul.
Tabelul de urmărire (i, s, condiție) e unealta cu care „rulezi" programe pe hârtie.
if / else if / else: prima condiție adevărată câștigă — pune condiția mai restrictivă prima.
switch (C++) / match (Python 3.10+) — pentru valori exacte; fără break, C++ „cade" în case-ul următor.
Anul bisect: (an%4==0 && an%100!=0) || an%400==0 — regula lui Cezar, rafinată de Grigore în 1582.
Eficiență: O(n) = pașii cresc cu n; O(1) = constant. Algoritmul ales contează, nu doar rezultatul.
Exersează pe pbinfo.ro: categoriile „Structura alternativă" și „Structura repetitivă" — minimum 8 probleme. Începe cu maximul a 3 numere și seria despre divizibilitate.
← anteriorModul 01 · Principiile unui program urmează →Modul 03 · Prelucrarea numerelor