Problema-tip
"Afișați elevii în ordinea DESCRESCĂTOARE a mediilor; la medii egale, ALFABETIC." Două criterii, o singură sortare.
Soluția completă
#include <iostream>
#include <cstring>
using namespace std;
struct Elev {
char nume[20];
int nota;
};
int main() {
Elev e[4] = {{"Bogdan", 9}, {"Ana", 9}, {"Dan", 7}, {"Carmen", 8}};
int n = 4;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - 1 - i; j++) {
bool schimb = e[j].nota < e[j + 1].nota ||
(e[j].nota == e[j + 1].nota && strcmp(e[j].nume, e[j + 1].nume) > 0);
if (schimb) {
Elev aux = e[j]; e[j] = e[j + 1]; e[j + 1] = aux;
}
}
for (int i = 0; i < n; i++)
cout << e[i].nume << " " << e[i].nota << "\n";
return 0;
}Atenție: Cheia lectiei e departajarea: doi elevi cu aceeasi nota se ordoneaza alfabetic. De aceea conditia de interschimbare are doua parti, legate prin SAU.
Pentru intrarea: Ana 9.5, Dan 9.75, Barbu 9.5 → ieșirea: Dan 9.75, Ana 9.5, Barbu 9.5 (egalitate rezolvată alfabetic) ✓.
Cheia: condiția de interschimbare
Cele două criterii se combină EXACT așa:
- criteriul 1 strict (medie mai mică înaintea uneia mai mari la sortare descrescătoare) → schimbi;
- criteriul 1 EGAL și criteriul 2 încălcat (strcmp > 0 = ordine alfabetică greșită) → schimbi;
- altfel nu schimbi.
Interschimbarea copiază STRUCTURA ÎNTREAGĂ (aux = v[j]): numele și media călătoresc împreună: exact avantajul struct-ului față de doi vectori paraleli.
Varianta cu vectori paraleli (de recunoscut)
Unele subiecte folosesc nume[100][21] + medie[100]: la interschimbare trebuie schimbate AMBELE (numele cu strcpy prin buffer). Orice câmp uitat = date "amestecate": eroarea clasică pe care subiectele o exploatează.
Greșeli frecvente
- Compararea numelor cu > direct nu compilează pe char[]: obligatoriu strcmp.
- La medii egale FĂRĂ departajare explicită, ordinea rămâne cea din citire: dacă subiectul cere alfabetic, condiția a doua e obligatorie.
- bubble sort pe struct: limita interioară tot n-i-1 rămâne.