Școala Româno-Britanică
Modulul 1 Clasa a X-a | C++

Ora 4: Operații cu mulțimi: intersecția și diferența

Ce vei învăța astăzi: Ce sunt intersecția (mulțimea elementelor care aparțin simultan ambelor mulțimi) A ∩ B și diferența (mulțimea elementelor care aparțin primei mulțimi, dar nu și celei de-a doua) A - B a două mulțimi și cum le calculăm în C++

Rezultat practic: Calculezi în C++ intersecția și diferența a două mulțimi reprezentate prin vectori de prezență (Competența 3.1).

Competența 3.1 Săptămâna 2

Înainte de a începe

De ce contează? Intersecția găsește elementele comune (de exemplu elevii înscriși la două activități), iar diferența scoate în evidență ce se află doar într-o singură mulțime — două operații cerute des la evaluări.

Ce știi deja?

Din ora 3 știi că reuniunea se testează cu ||. Ce operator logic crezi că exprimă „aparține simultan ambelor mulțimi"? Dar „aparține doar lui A"?

Ideea-cheie: Intersecția reține elementele comune (frecA[i] == 1 && frecB[i] == 1), iar diferența A - B reține elementele din A care nu sunt în B (frecA[i] == 1 && frecB[i] == 0).
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei învăța ce sunt intersecția și diferența a două mulțimi și cum le calculăm în C++, folosind vectori de prezență.

Definiția intersecției A ∩ B
Definiția diferenței A - B
Condițiile C++ pentru cele două operații
Afișarea rezultatelor în C++

Intersecția A ∩ B

Definiție: Intersecția mulțimilor A și B, notată A ∩ B, este mulțimea elementelor care aparțin simultan lui A și lui B.

Exemplu

Dacă A = {1, 2, 3, 4} și B = {3, 4, 5}, atunci A ∩ B = {3, 4}.

Diferența A - B

Definiție: Diferența mulțimilor A și B, notată A - B, este mulțimea elementelor care aparțin lui A, dar nu aparțin lui B.

Exemplu

Dacă A = {1, 2, 3, 4} și B = {3, 4, 5}, atunci A - B = {1, 2}.

Intersecția

Elementele comune celor două mulțimi

Diferența

Elementele din A care nu sunt în B

Intersecția și diferența în C++

Pentru intersecție folosim operatorul logic && (și): frecA[i] == 1 && frecB[i] == 1. Pentru diferență verificăm frecA[i] == 1 && frecB[i] == 0.

citeste n, apoi n elemente in frecA citeste m, apoi m elemente in frecB scrie "Intersectia:" pentru i = 1, 100 executa daca frecA[i] == 1 SI frecB[i] == 1 atunci scrie i scrie "Diferenta A - B:" pentru i = 1, 100 executa daca frecA[i] == 1 SI frecB[i] == 0 atunci scrie i
C++ - Intersecția A ∩ B și diferența A - B
#include <iostream>
using namespace std;

int main() {
    int n, m, x, i, frecA[101] = {0}, frecB[101] = {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;
    }

    cout << "Intersectia: ";
    for (i = 1; i <= 100; i++)
        if (frecA[i] == 1 && frecB[i] == 1)
            cout << i << " ";
    cout << endl;

    cout << "Diferenta A - B: ";
    for (i = 1; i <= 100; i++)
        if (frecA[i] == 1 && frecB[i] == 0)
            cout << i << " ";
    cout << endl;
    return 0;
}

Observă: intersecția reține elementele comune (&&), iar diferența reține elementele din A care nu sunt în B (frecB[i] == 0).

Exercițiu de completare

Completează enunțul despre intersecție:

Intersecția mulțimilor A și B, notată A ______ B, este mulțimea elementelor care aparțin ______ lui A și lui B. În C++ o testăm cu operatorul ______.

Bancă de cuvinte:
simultan &&

Exercițiu de completare

Completează enunțul despre diferență:

Diferența A - B este mulțimea elementelor care aparțin lui ______, dar nu aparțin lui ______. În C++, verificăm frecA[i] == 1 și frecB[i] == ______.

Bancă de cuvinte:
A B 0

Test de înțelegere

Test rapid - intersecția și diferența:

1. Dacă A = {1, 2, 3, 4} și B = {3, 4, 5}, atunci A ∩ B este:

2. Pentru aceleași mulțimi, A - B este:

3. Condiția C++ pentru intersecție este:

Ai grijă la: la diferența A - B condiția pe B este frecB[i] == 0, nu frecB[i] == 1; și reține că diferența nu este comutativă: A - B diferă, în general, de B - A.

Aprofundare

Proprietățile operațiilor: intersecția este comutativă (A ∩ B = B ∩ A), dar diferența nu este: A - B diferă, în general, de B - A.

  • Diferența simetrică: (A - B) ∪ (B - A) reprezintă elementele care aparțin exact uneia dintre mulțimi; în C++ se obține combinând frecA[i] == 1 && frecB[i] == 0 cu frecB[i] == 1 && frecA[i] == 0.
  • Mulțimi disjuncte (fără elemente comune): dacă A ∩ B = ∅, atunci intersecția este vidă, iar A - B = A.
  • Complementul: pentru un univers U cunoscut, complementul lui A este U - A, adică frecA[i] == 0.
  • Relația cu reuniunea: A ∩ B ⊆ A ∪ B și A - B ⊆ A ∪ B; operațiile se pot combina într-un singur program.
  • Pentru BAC: problemele cer frecvent intersecția și diferența simultan; scrie ambele condiții în bucle separate, apoi afișează etichetele pentru claritate.
APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Intersecția a două mulțimi

Enunț:

Cerință: Se citesc două mulțimi de numere naturale. Să se afișeze intersecția lor, sortată crescător.

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 elementele intersecției, în ordine crescătoare, separate prin spații.

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:

3 4
Cum gândim soluția:
  1. Marcăm prezența elementelor din A și din B
  2. Afișă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};
    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)
            cout << i << " ";
    return 0;
}

Ce învățăm: intersecția reține doar elementele comune ambelor mulțimi, folosind operatorul &&.

PbInfo - Diferența a două mulțimi

Enunț:

Cerință: Se citesc două mulțimi de numere naturale. Să se afișeze diferența A - B, sortată crescător.

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 elementele lui A care nu sunt în B, în ordine crescătoare.

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:

1 2
Cum gândim soluția:
  1. Marcăm prezența elementelor din A și din B
  2. Afișăm valorile cu frecA == 1 și frecB == 0
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};
    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] == 0)
            cout << i << " ";
    return 0;
}

Ce învățăm: diferența A - B reține elementele din A care nu se găsesc în B, adică frecA[i] == 1 și frecB[i] == 0.

EXERCIȚII PRACTICE

Exercițiul Practic: Intersecție și diferență

Sarcini de lucru

Completează următoarele sarcini pentru a aplica intersecția și diferența

Sarcina 1: Calculează operațiile

Cerință: Pentru A = {2, 3, 5, 7} și B = {3, 5, 6, 9}, scrie A ∩ B și A - B.

Soluție pentru Sarcina 1:
A ∩ B = {3, 5}
A - B = {2, 7}
Sarcina 2: Scrie programul

Cerință: Scrie un program C++ care citește două mulțimi și afișează pe rândurile separate intersecția și diferența A - B.

Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;

int main() {
    int n, m, x, i, frecA[101] = {0}, frecB[101] = {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;
    }
    cout << "Intersectia: ";
    for (i = 1; i <= 100; i++)
        if (frecA[i] == 1 && frecB[i] == 1)
            cout << i << " ";
    cout << endl;
    cout << "Diferenta A - B: ";
    for (i = 1; i <= 100; i++)
        if (frecA[i] == 1 && frecB[i] == 0)
            cout << i << " ";
    cout << endl;
    return 0;
}

Scrie pe caiet - De reținut

Titlul lecției

Ora 4: Operații cu mulțimi: intersecția și diferența

Definiția lecției

Intersecția a două mulțimi A și B, notată A ∩ B, este mulțimea elementelor care aparțin simultan ambelor mulțimi. Diferența A - B este mulțimea elementelor care aparțin lui A, dar nu aparțin lui B. În C++, cele două operații se obțin cu condițiile frecA[i] == 1 && frecB[i] == 1, respectiv frecA[i] == 1 && frecB[i] == 0. Intersecția este comutativă (A ∩ B = B ∩ A), dar diferența nu este: A - B diferă, în general, de B - A. Un exemplu real: elevii înscriși la două activități simultane formează intersecția, iar cei care participă doar la prima activitate formează diferența. Dacă cele două mulțimi nu au elemente comune, spunem că sunt disjuncte, iar diferența A - B este chiar A.

Definiții esențiale

Algoritmul cheie - pseudocod

citeste n, apoi n elemente in frecA citeste m, apoi m elemente in frecB scrie "Intersectia:" pentru i = 1, 100 executa daca frecA[i] == 1 SI frecB[i] == 1 atunci scrie i scrie "Diferenta A - B:" pentru i = 1, 100 executa daca frecA[i] == 1 SI frecB[i] == 0 atunci scrie i

Algoritmul cheie - cod C++

C++ - Intersecția A ∩ B și diferența A - B
#include <iostream>
using namespace std;

int main() {
    int n, m, x, i, frecA[101] = {0}, frecB[101] = {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;
    }

    cout << "Intersectia: ";
    for (i = 1; i <= 100; i++)
        if (frecA[i] == 1 && frecB[i] == 1)
            cout << i << " ";
    cout << endl;

    cout << "Diferenta A - B: ";
    for (i = 1; i <= 100; i++)
        if (frecA[i] == 1 && frecB[i] == 0)
            cout << i << " ";
    cout << endl;
    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Un magazin lansează două campanii de reduceri. Managerul vrea produsele aflate la reducere în ambele campanii (intersecția) și produsele care apar doar în prima campanie (diferența A - B):

C++ - Promoții comune și promoții doar în prima campanie
#include <iostream>
using namespace std;

int main() {
    int n, m, x, i, frecA[101] = {0}, frecB[101] = {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;
    }
    cout << "Intersectia: ";
    for (i = 1; i <= 100; i++)
        if (frecA[i] == 1 && frecB[i] == 1)
            cout << i << " ";
    cout << endl;
    cout << "Diferenta A - B: ";
    for (i = 1; i <= 100; i++)
        if (frecA[i] == 1 && frecB[i] == 0)
            cout << i << " ";
    cout << endl;
    return 0;
}