Cum funcționează
Două aspecte noi față de problemele de până acum.
Nu știi câte numere sunt. Enunțul nu dă un n la început, deci citești până se termină
fişierul:
int n = 0;
while (f >> x[n]) n++;
Citirea returnează false când nu mai are ce citi, deci bucla se oprește singură, iar n rămâne cu
numărul exact de valori. Același tipar ca la
numărarea aparițiilor unui cuvânt.
Numărarea valorilor distincte. Ideea: un element se numără o singură dată, la prima lui
apariție. Deci pentru fiecare x[i] verifici dacă a mai apărut înainte:
for (int j = 0; j < i; j++) // j < i, nu j < n
Detaliul esențial e j < i. Dacă ai compara cu tot vectorul (j < n), fiecare element s-ar găsi pe
el însuși și nimic n-ar fi numărat vreodată. Comparând doar cu ce e înaintea lui:
- prima apariție a lui
21 nu găsește nimic înainte → se numără
- a doua apariție îl găsește pe primul → nu se mai numără
Astfel fiecare valoare distinctă se numără exact o dată, fără să modifici vectorul.
break oprește căutarea la prima potrivire — nu are rost să continui.
Maximul se calculează separat, pornind de la x[0] (nu de la 0) — aceeași regulă ca la
maximul dintr-o matrice. Aici, valorile fiind
naturale, 0 ar merge, dar obiceiul corect te scutește de greșeli la alte probleme.
Observă că maximul valorilor distincte e același cu maximul tuturor valorilor — duplicatele nu
schimbă cea mai mare valoare.
Greșeli frecvente
j < n în loc de j < i — fiecare element se găsește pe sine, deci nr rămâne 0.
- Ștergerea duplicatelor din vector — funcționează, dar e mult mai lung decât simpla numărare.
- Citirea cu un
n presupus — enunțul nu dă numărul de valori; trebuie citit până la sfârșit.
- Numărarea tuturor valorilor în loc de cele distincte —
10 în loc de 9 în primul exemplu.
- Omiterea prefixelor
nr= și max= sau afișarea lor pe același rând.