Cum funcționează
Problema cere explicit date structurate, iar motivul se vede imediat: fiecare elev are două
informații care trebuie să rămână împreună. Dacă ai ține numele într-un vector și mediile în altul,
la sortare ar trebui să le interschimbi pe amândouă, sincronizat — o singură scăpare și numele
ajung pe mediile greșite.
struct rezolvă asta: numele și media devin un singur element.
struct Elev {
char nume[30];
double media;
};
De aici, un Elev se comportă ca orice altă valoare — se copiază întreg, cu tot cu nume:
Elev aux = e[i];
e[i] = e[j];
e[j] = aux;
Aceasta e interschimbarea clasică prin variabilă auxiliară, doar că mută o structură, nu un număr.
Variabila aux e obligatorie: fără ea, e[i] = e[j] ar distruge valoarea lui e[i] înainte s-o
poți salva.
Sortarea folosită e prin selecție directă: pentru fiecare poziție i, cauți printre elementele
rămase (j de la i + 1) unul mai bun și îl aduci în față. Nu e cea mai rapidă metodă, dar pentru
n < 30 e perfect suficientă și e cea mai ușor de scris corect din memorie.
Pentru ordine descrescătoare, condiția e e[j].media > e[i].media. Pentru crescătoare ar fi
<. Este singurul caracter care decide sensul sortării — verifică-l de două ori.
Accesul la câmpuri se face cu punct: e[i].media, e[i].nume.
Greșeli frecvente
- Vectori paraleli în loc de
struct — enunțul cere explicit date structurate, iar sincronizarea
manuală e sursă sigură de erori.
- Interschimbarea doar a mediilor, nu și a numelor — elevii ajung cu notele altora. Cu
struct
greșeala devine imposibilă.
- Semnul greșit în comparație — se obține ordine crescătoare în loc de descrescătoare.
- Lipsa variabilei
aux — e[i] = e[j]; e[j] = e[i]; lasă ambele poziții cu aceeași valoare.
j = i în loc de j = i + 1 — elementul se compară cu el însuși, inutil.
char nume[30] prea mic pentru nume lungi — dimensiunea trebuie să acopere și terminatorul.