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 î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.
frec[caracter] = 1 pentru fiecare literă întâlnită
ș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.
#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:
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:
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ă:
'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 >> sse 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.
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:
- Citim cuvântul cu
cin.getline - Marcăm fiecare literă în vectorul de prezență
- 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:
- Extragem cifrele cu n % 10 și n = n / 10
- Marcăm fiecare cifră în frec[10]
- 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ț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;
}