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

Ora 7: Aplicații practice cu mulțimi

Ce vei învăța astăzi: Cum rezolvăm probleme reale cu mulțimi: numere distincte, litere distincte și cuvinte distincte

Rezultat practic: Rezolvi în C++ probleme practice cu mulțimi, folosind vectori de prezență pentru numere și pentru caractere (Competența 5.1).

Competența 5.1 Săptămâna 4

Înainte de a începe

De ce contează? Mulțimile nu sunt doar teorie: notele elevilor, literele unui text sau codurile produselor sunt exemple reale de valori distincte pe care le prelucrezi cu aceleași tehnici.

Ce știi deja?

Din ora 6 știi să numeri valorile distincte dintr-un șir de numere cu vector de frecvență. Cum crezi că adaptezi această tehnică pentru caracterele unui cuvânt?

Ideea-cheie: Fiecare caracter are un cod ASCII (o valoare numerică între 0 și 255 asociată caracterului), deci poate fi folosit direct ca indice (poziție într-un vector) într-un vector de prezență de 256 de poziții pentru litere.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei învăța cum aplicăm mulțimile în probleme practice: numere distincte, litere distincte și cuvinte distincte.

Numere distincte din șiruri de date reale
Litere distincte dintr-un cuvânt
Vector de prezență pentru caractere
Aplicații cu cin.getline și strlen

Numere distincte în date reale

În practică, multe situații cer valori distincte: notele obținute de elevi, numerele de telefon, codurile produselor. Vectorul de prezență ne ajută să le identificăm rapid.

Exemplu: notele unui elev

Notele 9 7 9 10 7 au valorile distincte {7, 9, 10}. Dacă profesorul vrea să știe câte note diferite a primit elevul, răspunsul este 3.

Litere și cuvinte distincte

Pentru litere, folosim codul ASCII al fiecărui caracter ca indice în vectorul de prezență: frec[s[i]] = 1. Pentru cuvinte, lucrăm cu șiruri de caractere și le comparăm.

Litere

frec[caracter] = 1 pentru fiecare literă întâlnită

Cuvinte

șiruri de caractere citite cu cin.getline

Reține: un caracter are valoare numerică (codul ASCII), deci putem folosi un vector de 256 de poziții pentru prezența caracterelor.

Literele distincte dintr-un cuvânt în C++

Citim un cuvânt cu cin.getline (funcție care citește întreaga linie, inclusiv spațiile), aflăm lungimea cu strlen (funcție care numără caracterele unui șir), marcăm fiecare caracter și afișăm caracterele marcate.

citeste s n = lungime(s) frec[0..255] = 0 pentru i = 0, n-1 executa daca s[i] != ' ' atunci frec[s[i]] = 1 pentru i = 0, 255 executa daca frec[i] == 1 atunci scrie caracterul corespunzator lui i
C++ - Literele distincte dintr-un cuvânt
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char s[100];
    int frec[256] = {0}, i, n;
    cin.getline(s, 100);
    n = strlen(s);
    for (i = 0; i < n; i++)
        if (s[i] != ' ')
            frec[s[i]] = 1;
    for (i = 0; i < 256; i++)
        if (frec[i] == 1)
            cout << (char)i << " ";
    return 0;
}

Observă: frec[s[i]] folosește codul ASCII al caracterului ca indice, iar (char)i transformă indicele înapoi în caracter la afișare.

Exercițiu de completare

Completează enunțul despre literele distincte:

În cuvântul mama, literele distincte sunt ______ și ______. Un caracter se marchează cu frec[______] = 1.

Bancă de cuvinte:
m a s[i]

Exercițiu de completare

Completează fraza despre aplicații practice:

Pentru a citi un cuvânt cu spații folosim cin.______, iar lungimea lui o aflăm cu str______ din biblioteca ______.

Bancă de cuvinte:
getline len cstring

Test de înțelegere

Test rapid - aplicații practice:

1. Câte litere distincte are cuvântul banana?

2. Ce dimensiune are vectorul de prezență pentru caractere?

3. Funcția strlen din <cstring> returnează:

Ai grijă la: 'A' și 'a' au coduri ASCII diferite, deci sunt caractere distincte; iar pentru șiruri care conțin spații folosește cin.getline, nu cin >>.

Aprofundare

Codul ASCII: fiecare caracter are o valoare numerică (de exemplu 'A' = 65, 'a' = 97, '0' = 48). De aceea un caracter poate fi folosit direct ca indice în vectorul de prezență: frec[s[i]] = 1.

  • Litere mari vs. mici: 'A' și 'a' au coduri ASCII diferite, deci sunt considerate caractere distincte. Dacă problema le tratează ca identice, transformăm întâi tot textul în minuscule (tolower) sau în majuscule.
  • Ignorarea spațiilor: dacă șirul conține spații, le filtrăm cu if (s[i] != ' ') înainte de marcare, ca în algoritmul principal.
  • Dimensiunea vectorului: pentru caractere standard, 256 de poziții (frec[256]) acoperă întregul cod ASCII extins; se indexează de la 0.
  • Citirea cu spații: cin.getline(s, 100) citește întreaga linie, inclusiv spațiile; cin >> s se oprește la primul spațiu.
  • Pentru BAC: problemele cu litere distincte, vocale, numărarea unor caractere se rezolvă cu aceeași tehnică, folosind strlen și vector de 256.
APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Literele distincte

Enunț:

Cerință: Se citește un cuvânt. Să se afișeze literele distincte din el, în ordine alfabetică.

Date de intrare:

Programul citește de la tastatură un cuvânt format din litere mici.

Date de ieșire:

Programul va afișa literele distincte, în ordine alfabetică, fără spații între ele.

Restricții și precizări:

Cuvântul are cel mult 100 de litere mici.

Exemplu:

Intrare:

banana

Ieșire:

abn
Cum gândim soluția:
  1. Citim cuvântul cu cin.getline
  2. Marcăm fiecare literă în vectorul de prezență
  3. Parcurgem vectorul și afișăm literele marcate
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char s[100];
    int frec[256] = {0}, i, n;
    cin.getline(s, 100);
    n = strlen(s);
    for (i = 0; i < n; i++)
        frec[s[i]] = 1;
    for (i = 0; i < 256; i++)
        if (frec[i] == 1)
            cout << (char)i;
    return 0;
}

Ce învățăm: caracterele devin indici în vectorul de prezență, iar afișarea în ordinea codurilor ASCII dă ordinea alfabetică pentru litere mici.

PbInfo - Cifrele distincte

Enunț:

Cerință: Se citește un număr natural n. Să se afișeze cifrele distincte ale lui n, în ordine crescătoare.

Date de intrare:

Programul citește de la tastatură numărul natural n.

Date de ieșire:

Programul va afișa cifrele distincte ale lui n, în ordine crescătoare, separate prin spații.

Restricții și precizări:

n este un număr natural cu cel mult 9 cifre.

Exemplu:

Intrare:

202530

Ieșire:

0 2 3 5
Cum gândim soluția:
  1. Extragem cifrele cu n % 10 și n = n / 10
  2. Marcăm fiecare cifră în frec[10]
  3. Afișăm cifrele marcate crescător
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;

int main() {
    int n, frec[10] = {0}, i;
    cin >> n;
    while (n > 0) {
        frec[n % 10] = 1;
        n = n / 10;
    }
    for (i = 0; i <= 9; i++)
        if (frec[i] == 1)
            cout << i << " ";
    return 0;
}

Ce învățăm: cifrele unui număr formează o mulțime; le identificăm cu restul împărțirii la 10 și un vector de prezență de dimensiune 10.

EXERCIȚII PRACTICE

Exercițiul Practic: Mulțimi în probleme reale

Sarcini de lucru

Completează următoarele sarcini pentru a aplica mulțimile în situații reale

Sarcina 1: Analizează o situație reală

Cerință: Un elev a primit notele 8, 9, 8, 10, 9. Scrie câte note diferite a primit și care sunt acestea, apoi explică ce mulțime reprezintă.

Soluție pentru Sarcina 1:
Note diferite: 8, 9, 10 (3 note distincte)
Explicație: mulțimea notelor elevului este {8, 9, 10};
dublurile (8 și 9 repetate) apar o singură dată într-o mulțime.
Sarcina 2: Scrie programul

Cerință: Scrie un program C++ care citește un cuvânt și afișează numărul de litere distincte din el, folosind cin.getline și strlen.

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

int main() {
    char s[100];
    int frec[256] = {0}, i, n, nr = 0;
    cin.getline(s, 100);
    n = strlen(s);
    for (i = 0; i < n; i++)
        if (frec[s[i]] == 0) {
            frec[s[i]] = 1;
            nr++;
        }
    cout << nr;
    return 0;
}

Scrie pe caiet - De reținut

Titlul lecției

Ora 7: Aplicații practice cu mulțimi

Definiția lecției

Problemele practice cu mulțimi folosesc aceleași tehnici, adaptate la tipul datelor. Pentru numere, vectorul de prezență se indexează direct cu valoarea citită. Pentru caractere, folosim codul ASCII: fiecare caracter are o valoare numerică (de exemplu 'A' = 65, 'a' = 97), deci poate fi folosit ca indice într-un vector de 256 de poziții. Citirea unui text cu spații se face cu cin.getline, iar lungimea lui se află cu strlen. Un exemplu real: aflarea literelor distincte dintr-un cuvânt — marcăm fiecare caracter cu frec[s[i]] = 1 și afișăm la final caracterele marcate, în ordinea codurilor ASCII. Aceeași tehnică rezolvă probleme cu vocale, consoane sau orice alt tip de caracter.

Definiții esențiale

Algoritmul cheie - pseudocod

citeste s n = lungime(s) frec[0..255] = 0 pentru i = 0, n-1 executa daca s[i] != ' ' atunci frec[s[i]] = 1 pentru i = 0, 255 executa daca frec[i] == 1 atunci scrie caracterul corespunzator lui i

Algoritmul cheie - cod C++

C++ - Literele distincte dintr-un cuvânt
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char s[100];
    int frec[256] = {0}, i, n;
    cin.getline(s, 100);
    n = strlen(s);
    for (i = 0; i < n; i++)
        if (s[i] != ' ')
            frec[s[i]] = 1;
    for (i = 0; i < 256; i++)
        if (frec[i] == 1)
            cout << (char)i << " ";
    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Un joc de cuvinte cere jucătorului să afișeze literele distincte care apar în cuvântul introdus, ignorând spațiile:

C++ - Literele distincte dintr-un cuvânt
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char s[100];
    int frec[256] = {0}, i, n;
    cin.getline(s, 100);
    n = strlen(s);
    for (i = 0; i < n; i++)
        if (s[i] != ' ')
            frec[s[i]] = 1;
    for (i = 0; i < 256; i++)
        if (frec[i] == 1)
            cout << (char)i << " ";
    return 0;
}