Ce vei învăța astăzi?
După această lecție vei ști să determini lungimea unui șir de caractere, să parcurgi șirul cu o structură for și să numări aparițiile unor caractere, precum vocalele.
Lungimea unui șir cu strlen
Definiție: Funcția strlen(s) returnează numărul de caractere din șirul s, fără a număra caracterul terminator '\0'. Se găsește în biblioteca <cstring>.
Analogia: numărarea mărgelelor
Determinarea lungimii este ca numărarea mărgelelor dintr-un șirag: numeri fiecare mărgea până ajungi la capăt, dar nu numeri nodul care leagă capetele (terminatorul).
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int n = strlen(s);
cout << "Sirul are " << n << " caractere" << endl;
return 0;
}
Ce învățăm: pentru intrarea bac, strlen(s) returnează 3, deși șirul ocupă 4 poziții în memorie (3 litere + '\0').
Parcurgerea unui șir cu for
Parcurgerea înseamnă vizitarea fiecărui caracter al șirului, de la poziția 0 până la poziția n - 1. Este operația de bază pentru orice prelucrare: numărare, căutare, transformare.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int n = strlen(s);
for (int i = 0; i < n; i++)
{
cout << s[i] << " ";
}
return 0;
}
Parcurgerea șirului BAC
n = 3Numărarea vocalelor
O aplicație tipică a parcurgerii: numărăm câte vocale conține un șir de litere mici. Folosim un contor (o variabilă care numără, adică își crește valoarea cu 1 la fiecare potrivire) pe care îl incrementăm de fiecare dată când caracterul curent este vocală.
Exemplu ghidat: câte vocale are un cuvânt?
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int vocale = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
s[i] == 'o' || s[i] == 'u')
{
vocale++;
}
}
cout << "Numarul de vocale: " << vocale << endl;
return 0;
}
Observă: strlen(s) este apelat la fiecare iterație în condiția buclei. E corect, dar la BAC preferăm să reținem lungimea într-o variabilă: int n = strlen(s).
Exercițiu de completare
Completează enunțul despre parcurgerea șirurilor:
Lungimea unui șir se determină cu funcția ______ din biblioteca ______. Parcurgem șirul cu o structură ______, iar variabila care reține poziția curentă se numește ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care afișează caracterele unui șir:
Bancă de cuvinte:
Test de înțelegere
Test rapid - parcurgerea șirurilor:
1. Ce returnează strlen(s)?
2. La ce folosește variabila i în bucla for?
3. Câte iterații face bucla for (int i = 0; i < n; i++) pentru n = 4?
strlen(s) în condiția buclei, gen for (i = 0; i < strlen(s); i++): funcția s-ar executa la fiecare pas și programul ar fi inutil de lent. Salvează rezultatul o singură dată, într-o variabilă, înainte de buclă.Aprofundare
Cazuri particulare și detalii avansate:
- Cele două forme de parcurgere sunt echivalente. Fie condiția
s[i] != '\0', fiei < strlen(s), ambele parcurg exact caracterele reale ale șirului. Alegerea depinde de problemă. - Nu apela
strlen(s)în fiecare iterație (în condiția unuifor): funcția parcurge din nou întregul șir de fiecare dată. Mai bine salvezi lungimea într-o variabilăn = strlen(s)înainte de buclă. - Vocalele pot include și literele cu diacritice sau majusculele; în problemele BAC șirurile conțin de regulă litere mici, fără diacritice, iar vocalele sunt
a, e, i, o, u. - Caracterul de spațiu nu este vocală și nu este literă: când parcurgi un text, un test
s[i] == ' 'separat te ajută să despărți cuvintele. strlenreturneazăsize_t(un tip întreg fără semn); la comparații cuintnu apar probleme practice la dimensiunile din BAC.
Parcurgerea este fundația tuturor prelucrărilor de șiruri: orice problemă (numărare, căutare, transformare) înseamnă, la bază, „mergi caracter cu caracter și aplică o regulă".
PbInfo - Numărul de vocale
Enunț:
Cerință: Se citește un cuvânt s, format doar din litere mici. Să se afișeze numărul de vocale din cuvânt.
Date de intrare:
Programul citește de la tastatură cuvântul s.
Date de ieșire:
Programul va afișa un număr natural reprezentând numărul de vocale.
Restricții și precizări:
Cuvântul are cel mult 100 de caractere. Vocalele sunt: a, e, i, o, u.
Exemplu:
Intrare:
bacalaureat
Ieșire:
6
Cum gândim soluția:
- Citim cuvântul cu
cin.getlinesaucin - Parcurgem șirul cu
for, până lastrlen(s) - Dacă
s[i]este a, e, i, o sau u, 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 vocale = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
s[i] == 'o' || s[i] == 'u')
{
vocale++;
}
}
cout << vocale;
return 0;
}
Ce învățăm: parcurgerea completă a șirului plus un contor rezolvă orice problemă de numărare: vocale, consoane, litere.
PbInfo - Câte consoane
Enunț:
Cerință: Se citește un cuvânt s, format doar din litere mici. Să se afișeze numărul de consoane din cuvânt.
Date de intrare:
Programul citește de la tastatură cuvântul s.
Date de ieșire:
Programul va afișa numărul de consoane.
Restricții și precizări:
Cuvântul are cel mult 100 de caractere. O consoană este o literă mică care nu este vocală.
Exemplu:
Intrare:
bacalaureat
Ieșire:
5
Cum gândim soluția:
- Citim cuvântul și parcurgem fiecare caracter
- Dacă este literă mică (
s[i] >= 'a'șis[i] <= 'z') și nu este vocală, atunci este consoană - Incrementăm contorul și îl afișăm
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 consoane = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
{
if (s[i] != 'a' && s[i] != 'e' && s[i] != 'i' &&
s[i] != 'o' && s[i] != 'u')
{
consoane++;
}
}
}
cout << consoane;
return 0;
}
Ce învățăm: condițiile >= 'a' și <= 'z' verifică dacă un caracter este literă mică, folosind ordinea caracterelor din codul ASCII.
Exercițiul Practic: parcurgerea și numărarea
Sarcini de lucru
Completează următoarele sarcini pentru a exersa parcurgerea șirurilor
Sarcina 1: Câte litere a?
Cerință: Scrie un program C++ complet care citește un cuvânt de litere mici și afișează de câte ori apare litera a în el. Pentru intrarea banana se afișează 3.
Soluție pentru Sarcina 1:
#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;
}
Verifică: în banana literele sunt b-a-n-a-n-a: litera a apare de 3 ori.
Sarcina 2: Lungimea și caracterele
Cerință: Scrie un program C++ complet care citește un cuvânt, afișează mai întâi lungimea lui, apoi fiecare caracter pe câte o linie. Pentru intrarea bac afișează: 3, apoi b, a, c pe linii separate.
Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int n = strlen(s);
cout << n << endl;
for (int i = 0; i < n; i++)
{
cout << s[i] << endl;
}
return 0;
}
Verifică: reținem lungimea într-o variabilă (n) și o folosim în bucla for.