Ce vei învăța astăzi?
După această lecție vei ști să cauți un caracter într-un șir, să cauți un subșir (un grup de caractere) și să numeri aparițiile unui caracter printr-o căutare manuală.
Căutarea unui caracter cu strchr
Definiție: strchr(s, c) returnează un pointer către prima apariție a caracterului c în șirul s. Dacă caracterul nu apare, returnează NULL. Poziția caracterului se calculează cu p - s.
Analogia: căutarea unei pagini la carte
Dacă un prieten îți spune „caută prima pagină pe care apare cuvântul tău", tu întorci paginile până găsești prima apariție. Dacă nu există, îi răspunzi că nu s-a găsit. Exact asta face strchr, dar pentru caractere.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
char *p = strchr(s, 'a');
if (p == NULL)
{
cout << "Caracterul 'a' nu apare in sir";
}
else
{
cout << "Prima aparitie a caracterului 'a' este la pozitia "
<< p - s;
}
return 0;
}
Ce învățăm: p - s este diferența dintre două adrese din memorie și dă exact poziția (începând de la 0) a caracterului găsit.
Căutarea unui subșir cu strstr
Definiție: strstr(s, sub) caută șirul sub în interiorul șirului s și returnează un pointer către prima apariție, sau NULL dacă subșirul nu există.
Exemplu ghidat: conține textul cuvântul „BAC"?
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101], sub[101];
cin.getline(s, 101);
cin.getline(sub, 101);
char *p = strstr(s, sub);
if (p == NULL)
{
cout << "Subsirul nu apare in text";
}
else
{
cout << "Subsirul incepe la pozitia " << p - s;
}
return 0;
}
Observă: pentru textul elevul a luat bac și subșirul bac, se afișează poziția 15.
Căutarea manuală: numărarea aparițiilor
Prin căutare manuală parcurgem șirul caracter cu caracter și comparăm fiecare caracter cu cel căutat. Astfel putem număra toate aparițiile, nu doar prima.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
char c;
cin.getline(s, 101);
cin >> c;
int contor = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == c)
{
contor++;
}
}
cout << "Caracterul " << c << " apare de " << contor << " ori";
return 0;
}
Ce învățăm: căutarea manuală cu for + contor este metoda sigură la BAC pentru orice problemă de numărare.
Exercițiu de completare
Completează enunțul despre căutare:
Funcția ______ caută un caracter într-un șir, iar ______ caută un subșir. Ambele returnează un ______ către prima apariție; dacă nu găsesc nimic, returnează ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care găsește poziția primei apariții:
Bancă de cuvinte:
Test de înțelegere
Test rapid - căutarea în șiruri:
1. Ce returnează strchr(s, 'a') dacă 'a' nu există în s?
2. Cum se calculează poziția caracterului găsit?
3. Ce caută strstr(s, sub)?
strchr se calculează cu p - s, nu cu p + s; iar dacă funcția întoarce NULL, orice folosire a pointerului întors este greșită. Verifică întotdeauna pointerul înainte de a-l folosi.Aprofundare
Cazuri particulare și detalii avansate:
strchrreturnează un pointer, nu o poziție. Pentru a afla poziția folosim diferența de pointeri:poz = p - s. Dacă caracterul nu există, returneazăNULL; verificareap != NULLeste obligatorie.- Căutarea manuală cu
for: parcurgem șirul și ne oprim la prima pozițieicus[i] == c. Un indicatorgasit(boolean) ne ajută să afișăm rezultatul corect la final. - Numărarea aparițiilor continuă parcurgerea până la capăt, incrementând un contor de fiecare dată când
s[i] == c. strstr(s, sub)caută un subșir întreg, nu un singur caracter; și el returnează pointer către prima apariție sauNULL.- Mai multe apariții: pentru a găsi toate pozițiile unui caracter, parcurgem întregul șir cu
forși testăm fiecare caracter în parte.
Căutarea răspunde la întrebarea „apare caracterul X în șir și, dacă da, unde?" — aceeași idee stă la baza căutării unui cuvânt într-un text și a verificării dacă un subșir se află în altul.
PbInfo - Căutarea unui caracter
Enunț:
Cerință: Se citesc un șir s și un caracter c. Să se afișeze poziția primei apariții a caracterului c (pozițiile încep de la 0) sau -1 dacă caracterul nu apare.
Date de intrare:
Programul citește de la tastatură șirul s, apoi caracterul c.
Date de ieșire:
Programul va afișa poziția primei apariții sau -1.
Restricții și precizări:
Șirul are cel mult 100 de caractere și conține doar litere mici.
Exemplu:
Intrare:
bacalaureat l
Ieșire:
4
Cum gândim soluția:
- Citim șirul cu
cin.getlineși caracterul cucin - Parcurgem șirul cu
forși ne oprim la prima potrivire cubreak - Afișăm poziția sau -1 dacă nu am găsit
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
char c;
cin.getline(s, 101);
cin >> c;
int poz = -1;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == c)
{
poz = i;
break;
}
}
cout << poz;
return 0;
}
Ce învățăm: inițializăm poziția cu -1 („nu am găsit") și o actualizăm la prima potrivire, apoi ieșim cu break.
PbInfo - Câte litere a are
Enunț:
Cerință: Se citește un text format doar din litere mici. Să se afișeze de câte ori apare litera a în text.
Date de intrare:
Programul citește de la tastatură textul.
Date de ieșire:
Programul va afișa un număr reprezentând numărul de apariții ale literei a.
Restricții și precizări:
Textul are cel mult 100 de caractere și conține doar litere mici, fără spații.
Exemplu:
Intrare:
banana
Ieșire:
3
Cum gândim soluția:
- Citim textul cu
cin.getline - Parcurgem fiecare caracter și, dacă este
'a', incrementăm contorul - Afișăm contorul
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int contor = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == 'a')
{
contor++;
}
}
cout << contor;
return 0;
}
Ce învățăm: numărarea tuturor aparițiilor se face prin căutare manuală completă, nu cu strchr (care găsește doar prima apariție).
Exercițiul Practic: căutarea în șiruri
Sarcini de lucru
Completează următoarele sarcini pentru a exersa căutarea de caractere și subșiruri
Sarcina 1: Conține subșirul BAC?
Cerință: Scrie un program C++ complet care citește un text și afișează DA dacă textul conține subșirul bac, altfel NU, folosind strstr.
Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
if (strstr(s, "bac") != NULL)
{
cout << "DA";
}
else
{
cout << "NU";
}
return 0;
}
Verifică: pentru intrarea examenul de bac, programul afișează DA.
Sarcina 2: Câte e-uri are textul?
Cerință: Scrie un program C++ complet care citește un text cu litere mici și afișează de câte ori apare litera e. Pentru intrarea elevul evalueaza se afișează 3 (e, e, e).
Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int contor = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == 'e')
{
contor++;
}
}
cout << contor;
return 0;
}
Verifică: în elevul evalueaza literele e apar pe pozițiile 0, 6 și 14, deci contorul ajunge la 3.