Ce vei învăța astăzi?
După această lecție vei recapitula tot ce ai învățat despre mulțimi: reprezentarea, operațiile și verificările, apoi vei rezolva un test integrativ.
Recapitulare: mulțimea și reprezentarea ei
Mulțimea este un model conceptual neliniar: elemente distincte, fără ordine. O reprezentăm în C++ cu un vector de prezență, unde frec[x] = 1 dacă x ∈ A.
Recapitulare rapidă
- Elemente distincte: fiecare valoare apare o singură dată
- Reprezentare: frec[x] = 1 marchează prezența lui x
- Afișare sortată: parcurgem vectorul crescător
Tabel rezumativ al operațiilor cu mulțimi
| Operația | Simbol | Condiția în C++ | Exemplu (A={1,2,3}, B={3,4}) |
|---|---|---|---|
| Reuniunea | A ∪ B |
frecA[i] == 1 || frecB[i] == 1 |
{1, 2, 3, 4} |
| Intersecția | A ∩ B |
frecA[i] == 1 && frecB[i] == 1 |
{3} |
| Diferența | A - B |
frecA[i] == 1 && frecB[i] == 0 |
{1, 2} |
| Apartenența | x ∈ A |
frecA[x] == 1 |
3 ∈ A (adevărat) |
| Incluziunea | A ⊆ B |
fără frecA[i] == 1 && frecB[i] == 0 |
A ⊆ B (fals) |
| Egalitatea | A = B |
frecA[i] == frecB[i] pentru toți i |
A = B (fals) |
Program de recapitulare în C++
Un program complet care calculează reuniunea, intersecția, diferența și numărul de elemente distincte pentru două mulțimi.
#include <iostream>
using namespace std;
int main() {
int n, m, x, i, A[101] = {0}, B[101] = {0}, nr = 0;
cin >> n;
for (i = 1; i <= n; i++) {
cin >> x;
A[x] = 1;
}
cin >> m;
for (i = 1; i <= m; i++) {
cin >> x;
B[x] = 1;
}
cout << "Reuniune: ";
for (i = 1; i <= 100; i++)
if (A[i] == 1 || B[i] == 1)
cout << i << " ";
cout << endl;
cout << "Intersectie: ";
for (i = 1; i <= 100; i++)
if (A[i] == 1 && B[i] == 1)
cout << i << " ";
cout << endl;
cout << "Diferenta A - B: ";
for (i = 1; i <= 100; i++)
if (A[i] == 1 && B[i] == 0)
cout << i << " ";
cout << endl;
for (i = 1; i <= 100; i++)
if (A[i] == 1 || B[i] == 1)
nr++;
cout << "Elemente distincte: " << nr << endl;
return 0;
}
Observă: același pereche de vectori de prezență susține toate operațiile; fiecare operație se reduce la o condiție simplă.
Exercițiu de completare
Completează rezumatul operațiilor:
Reuniunea A ∪ B conține elementele din A ______ B, intersecția A ∩ B conține elementele ______, iar diferența A - B conține elementele din A care nu sunt în ______.
Bancă de cuvinte:
Exercițiu de completare
Completează condițiile C++:
Reuniunea: frecA[i] == 1 ______ frecB[i] == 1; intersecția: frecA[i] == 1 ______ frecB[i] == 1; diferența: frecA[i] == 1 ______ frecB[i] == 0.
Bancă de cuvinte:
Test de înțelegere
Test rapid - recapitulare:
1. Pentru A = {1, 2, 3} și B = {3, 4}, reuniunea A ∪ B este:
2. Pentru aceleași mulțimi, intersecția A ∩ B este:
3. Câte valori distincte are șirul 2 5 2 3 5?
|| la reuniune, && la intersecție și && cu frecB[i] == 0 la diferență — inversarea lor costă puncte.Aprofundare
Legăturile dintre operații: operațiile cu mulțimi nu sunt izolate; între ele există echivalențe utile la rezolvarea problemelor și la verificarea soluțiilor.
- A ⊆ B ⟺ A ∪ B = B ⟺ A ∩ B = A: dacă una dintre condiții e adevărată, toate sunt; poți verifica încrucișat un program care testează incluziunea (faptul că toate elementele lui A se află și în B).
- Cardinalul reuniunii: |A ∪ B| = |A| + |B| - |A ∩ B|; numărând elementele celor două mulțimi și elementele comune, obții cardinalul reuniunii fără a o construi.
- Diferența și incluziunea: A - B = ∅ exact atunci când A ⊆ B; dacă diferența este vidă, mulțimea A este inclusă în B.
- Structură unică: toate operațiile folosesc aceeași pereche de vectori de prezență; doar condiția din buclă se schimbă, ceea ce face programul ușor de extins.
- Pentru BAC: un program care combină toate operațiile (ca în recapitulare) acoperă o mare parte din subiectele de tipul "prelucrări pe mulțimi".
PbInfo - Reuniunea și cardinalul
Enunț:
Cerință: Se citesc două mulțimi de numere naturale. Să se afișeze reuniunea lor sortată, apoi cardinalul acesteia.
Date de intrare:
Programul citește n, apoi n elemente ale primei mulțimi, apoi m, apoi m elemente ale celei de-a doua mulțimi.
Date de ieșire:
Programul va afișa pe prima linie elementele reuniunii, iar pe a doua linie cardinalul reuniunii.
Restricții și precizări:
1 ≤ n, m ≤ 100; elementele sunt numere naturale între 1 și 100.
Exemplu:
Intrare:
3 1 2 3 3 3 4 5
Ieșire:
1 2 3 4 5 5
Cum gândim soluția:
- Marcăm prezența elementelor din ambele mulțimi
- Afișăm valorile din reuniune și numărăm cardinalul
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int n, m, x, i, frec[101] = {0}, nr = 0;
cin >> n;
for (i = 1; i <= n; i++) {
cin >> x;
frec[x] = 1;
}
cin >> m;
for (i = 1; i <= m; i++) {
cin >> x;
frec[x] = 1;
}
for (i = 1; i <= 100; i++)
if (frec[i] == 1) {
cout << i << " ";
nr++;
}
cout << endl << nr;
return 0;
}
Ce învățăm: reuniunea și cardinalul ei se obțin dintr-o singură parcurgere a vectorului de prezență.
PbInfo - Elemente comune
Enunț:
Cerință: Se citesc două mulțimi de numere naturale. Să se afișeze câte elemente comune au cele două mulțimi (cardinalul intersecției).
Date de intrare:
Programul citește n, apoi n elemente ale primei mulțimi, apoi m, apoi m elemente ale celei de-a doua mulțimi.
Date de ieșire:
Programul va afișa pe ecran numărul de elemente comune.
Restricții și precizări:
1 ≤ n, m ≤ 100; elementele sunt numere naturale între 1 și 100.
Exemplu:
Intrare:
4 1 2 3 4 3 3 4 5
Ieșire:
2
Cum gândim soluția:
- Marcăm prezența elementelor din ambele mulțimi
- Numărăm valorile cu frecA == 1 și frecB == 1
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int n, m, x, i, frecA[101] = {0}, frecB[101] = {0}, nr = 0;
cin >> n;
for (i = 1; i <= n; i++) {
cin >> x;
frecA[x] = 1;
}
cin >> m;
for (i = 1; i <= m; i++) {
cin >> x;
frecB[x] = 1;
}
for (i = 1; i <= 100; i++)
if (frecA[i] == 1 && frecB[i] == 1)
nr++;
cout << nr;
return 0;
}
Ce învățăm: cardinalul intersecției se obține numărând valorile comune celor doi vectori de prezență.
Exercițiul Practic: Recapitulare și test
Sarcini de lucru
Completează următoarele sarcini pentru a-ți verifica cunoștințele din modul
Sarcina 1: Rezolvă problema integrativ
Cerință: Pentru A = {2, 4, 6, 8} și B = {4, 6, 9}, calculează A ∪ B, A ∩ B, A - B și cardinalul reuniunii.
Soluție pentru Sarcina 1:
A ∪ B = {2, 4, 6, 8, 9}
A ∩ B = {4, 6}
A - B = {2, 8}
|A ∪ B| = 5
Sarcina 2: Scrie programul de recapitulare
Cerință: Scrie un program C++ care citește două mulțimi și afișează reuniunea, intersecția și numărul de elemente distincte.
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int main() {
int n, m, x, i, A[101] = {0}, B[101] = {0}, nr = 0;
cin >> n;
for (i = 1; i <= n; i++) {
cin >> x;
A[x] = 1;
}
cin >> m;
for (i = 1; i <= m; i++) {
cin >> x;
B[x] = 1;
}
cout << "Reuniune: ";
for (i = 1; i <= 100; i++)
if (A[i] == 1 || B[i] == 1) {
cout << i << " ";
nr++;
}
cout << endl;
cout << "Intersectie: ";
for (i = 1; i <= 100; i++)
if (A[i] == 1 && B[i] == 1)
cout << i << " ";
cout << endl;
cout << "Elemente distincte: " << nr << endl;
return 0;
}