Cum funcționează
Problema pare simplă, dar ascunde capcana cea mai des întâlnită la căutarea unui maxim:
cu ce valoare pornești?
Reflexul obișnuit e int maxim = 0;. Aici ar fi greșit: toate valorile căutate sunt negative,
deci mai mici decât 0. Niciuna n-ar trece testul x[i] > maxim, iar rezultatul ar rămâne 0 —
o valoare care nici măcar nu e în vector.
Soluția e să nu inventezi o valoare de start, ci să iei primul element care se califică. Asta
face condiția:
if (!gasit || x[i] > maxim) maxim = x[i];
Se citește: „dacă n-am găsit încă niciun negativ, ia-l pe acesta; altfel, ia-l doar dacă e mai
mare decât ce am." La prima valoare negativă, !gasit e adevărat și maxim se inițializează
corect. De la a doua încolo, contează doar comparația.
Bonusul e că același flag gasit răspunde și la întrebarea dacă trebuie afișat NU EXISTA.
Pentru X = [23, -7, -40, 200, -15, 0], elementele negative sunt -7, -40 și -15. maxim
devine -7 la prima, rămâne -7 la următoarele. Atenție: 0 nu e negativ, deci nu intră în
calcul.
Greșeli frecvente
int maxim = 0; — cea mai frecventă. Niciun număr negativ nu e mai mare decât 0, deci
rezultatul rămâne 0.
maxim = x[0]; — corect doar dacă primul element e negativ. Pentru [23, -7, ...] ai porni
de la 23 și n-ai găsi niciodată un negativ mai mare.
x[i] <= 0 — include și zeroul, care nu e negativ.
- Căutarea minimului din greșeală —
-40 pare „mai mare" vizual, dar este mai mic. Pe numere
negative, cu cât cifra e mai mare, cu atât valoarea e mai mică.
- Omiterea formatului
max= — enunțul cere exact acest prefix.