Cum funcționează
Aici apare un tip nou de condiție: nu „există un element care...", ci „toate elementele sunt...".
Diferența schimbă complet logica.
Ca să demonstrezi că toate elementele unei linii sunt pare, trebuie să le verifici pe toate. Dar
ca să demonstrezi că nu sunt, e suficient un singur contraexemplu. De aici tehnica:
bool toatePare = true; // presupui ca proprietatea e adevarata
for (...)
if (contraexemplu) { toatePare = false; break; }
Pornești optimist, cu true, și cauți ceva care să te contrazică. Primul element impar strică
totul, deci break — nu mai are rost să continui acea linie.
Aceasta e inversul tiparului obișnuit. La problemele de tip „există un element care..." pornești
cu false și cauți o confirmare. Aici pornești cu true și cauți o infirmare. Confuzia dintre
cele două e cea mai frecventă greșeală de logică din categoria matricilor.
Atenție la resetarea lui toatePare: se declară în interiorul buclei de linii, deci
repornește de la true pentru fiecare linie. Dacă ar fi declarat înainte, o linie cu elemente
impare ar „strica" toate liniile următoare.
Flagul exista rezolvă separat cazul NU EXISTA și afișarea antetului o singură dată — același
truc ca la căutarea unei valori într-un vector.
Greșeli frecvente
- Pornirea cu
toatePare = false — logica se inversează și rezultatele sunt aproape întotdeauna
greșite.
- Declararea lui
toatePare în afara buclei de linii — nu se resetează, deci după prima linie
„stricată" nicio linie nu mai e raportată.
- Afișarea liniei în interiorul buclei
j — linia apare de mai multe ori, câte o dată pentru
fiecare element par.
- Confuzia dintre „toate pare" și „există un par" — sunt condiții complet diferite.
- Afișarea lui
i fără + 1.