Sari la conținut

Capitolul 12 · Lecția 12.2 din 2

Sortarea vectorilor de structuri

Sortarea după un câmp, cu departajare pe al doilea criteriu: catalogul complet.

Capitolul 12: Structuri (struct)Conținut verificat

Pe scurt pentru BAC · 4 idei

  • La sortarea pe două criterii schimbi elementele când primul criteriu e încălcat strict sau când e egal și al doilea e încălcat.
  • Pentru ordine alfabetică la medii egale schimbi când strcmp(v[j].nume, v[j+1].nume) > 0.
  • Interschimbarea copiază structura întreagă, aux = v[j], deci numele și media rămân împreună.
  • Cu vectori paraleli, ca nume[100][21] și medie[100], trebuie interschimbate ambele, numele prin strcpy.
Pe această pagină5 secțiuni

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:

  1. criteriul 1 strict (medie mai mică înaintea uneia mai mari la sortare descrescătoare) → schimbi;
  2. criteriul 1 EGAL și criteriul 2 încălcat (strcmp > 0 = ordine alfabetică greșită) → schimbi;
  3. 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ă.

Reține

Departajarea: else if (criteriu1 EGAL && criteriu2 gresit). Cu struct, interschimbarea e o singură atribuire pe element: motivul real pentru care struct-ul exista în programă.

Greșeli frecvente

  1. Compararea numelor cu > direct nu compilează pe char[]: obligatoriu strcmp.
  2. La medii egale FĂRĂ departajare explicită, ordinea rămâne cea din citire: dacă subiectul cere alfabetic, condiția a doua e obligatorie.
  3. bubble sort pe struct: limita interioară tot n-i-1 rămâne.

Instrumente pentru lecția asta

Sortarea, pas cu pas

Bubble sort și selection sort animate pe un vector: fiecare comparație și schimbare, explicate în cuvinte, cu play/pauză/pas.

Se încarcă instrumentul…

Bifează când ai terminat, ca s-o vezi citită pe toate dispozitivele.

Testează-te pe capitolul 12

Lecția în clipuri

Clipuri scurte, cu voce și subtitrări.

Folosim cookie-uri esențiale, fără de care site-ul nu merge, și cookie-uri de analiză anonimizate, ca să vedem ce pagini ajută. Detalii în politica de confidențialitate