Ce vei învăța astăzi?
După această lecție vei recapitula toate funcțiile pentru șiruri învățate în modul, vei rezolva probleme combinate și vei susține un test final de verificare.
Tabel rezumativ al funcțiilor
Toate funcțiile din tabel se găsesc în biblioteca <cstring>. Le folosim la fel la BAC: #include <iostream> și #include <cstring>, using namespace std;, int main().
| Funcție | Ce face | Exemplu |
|---|---|---|
strlen(s) |
lungimea șirului (fără terminator) | strlen("bac") = 3 |
strcpy(a, b) |
copiază b în a | strcpy(d, s) |
strcat(a, b) |
lipește b la sfârșitul lui a | strcat(d, s) |
strcmp(a, b) |
compară a cu b (negativ, 0, pozitiv) | strcmp(a, b) < 0 |
strchr(s, c) |
caută caracterul c | strchr(s, 'a') |
strstr(s, sub) |
caută subșirul sub | strstr(s, "bac") |
Reține: la verificarea palindromului și la conversiile șir-număr nu folosim funcții speciale, ci parcurgerea manuală cu for.
Problemă combinată: cel mai lung cuvânt
Combinăm separarea cuvintelor după spații cu determinarea lungimii (strlen) pentru a găsi cuvântul cel mai lung dintr-un text.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[1001];
cin.getline(s, 1001);
int n = strlen(s);
int inceput = 0;
int maxim = 0;
int i = 0;
while (i <= n)
{
if (s[i] == ' ' || s[i] == '\0')
{
int lungime = i - inceput;
if (lungime > maxim)
{
maxim = lungime;
}
inceput = i + 1;
}
i++;
}
cout << "Cea mai lunga secventa de litere are "
<< maxim << " caractere" << endl;
return 0;
}
Ce învățăm: parcurgem textul; la fiecare spațiu (sau la final) comparăm lungimea cuvântului curent, i - inceput, cu maximul.
Problemă combinată: inversarea unui cuvânt
Inversarea unui șir folosește parcurgerea cu for până la jumătate și interschimbarea perechilor simetrice, exact ca la verificarea palindromului, dar de data aceasta modificăm șirul.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int n = strlen(s);
for (int i = 0; i < n / 2; i++)
{
char aux = s[i];
s[i] = s[n - 1 - i];
s[n - 1 - i] = aux;
}
cout << s << endl;
return 0;
}
Ce învățăm: pentru intrarea bac, programul afișează cab. Aceeași tehnică servește și la conversia număr în șir.
Exercițiu de completare
Completează enunțul rezumativ:
Lungimea unui șir se află cu ______, copierea cu ______, concatenarea cu ______, iar compararea cu ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care afișează lungimea unui șir:
Bancă de cuvinte:
Test de înțelegere
Test final - modulul 2:
1. Care secvență afișează lungimea șirului s?
2. Care funcție caută un subșir într-un șir?
3. Care este ordinea corectă pentru inversarea unui șir?
#include <cstring>, uitarea cin.ignore() la citirea mixtă, formatul de ieșire greșit sau compararea șirurilor cu == în loc de strcmp.Aprofundare
Cazuri particulare și detalii avansate:
- Problemele combinate cer alegerea funcției potrivite: pentru lungime folosim
strlen, pentru copierestrcpy, pentru lipirestrcat, pentru compararestrcmp, pentru căutarestrchr/strstr. Alege funcția după operația cerută, nu după numele problemei. - Textul cu mai multe spații consecutive: algoritmul cu
strtoktratează automat spațiile multiple; cel manual trebuie să evite cuvintele vide (lungime 0). - Parcurgerea până la
'\0'inclusiv (condițiai <= n) este cheia pentru a procesa ultimul cuvânt al textului, care nu are spațiu după el. - Combinațiile clasice la BAC: numărare + maxim (cuvinte și cea mai lungă), palindrom + vocale, conversie + suma cifrelor, frecvență + sortare. Fiecare problemă nouă este o combinație a pașilor învățați.
- Corectitudinea se verifică pe exemple cu cazuri-limită: text cu un singur cuvânt, text cu spații la început sau la final, cuvânt de o literă, text gol.
Recapitularea nu înseamnă doar reluarea funcțiilor, ci învățarea de a combina tehnici: separare + lungime, palindrom + numărare, dicționar + raport. Astfel se rezolvă orice problemă de șiruri de la BAC.
PbInfo - Cuvântul cu cele mai multe vocale
Enunț:
Cerință: Se citesc două cuvinte, formate din litere mici. Să se afișeze cuvântul care conține mai multe vocale (dacă au același număr, se afișează primul).
Date de intrare:
Programul citește de la tastatură cele două cuvinte, separate printr-un spațiu.
Date de ieșire:
Programul va afișa cuvântul cu mai multe vocale.
Restricții și precizări:
Cuvintele au cel mult 100 de caractere.
Exemplu:
Intrare:
bacalaureat calculator
Ieșire:
bacalaureat
Cum gândim soluția:
- Scriem o funcție care numără vocalele unui cuvânt
- Numărăm vocalele ambelor cuvinte
- Afișăm cuvântul cu mai multe vocale
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int numaraVocale(char s[101])
{
int contor = 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')
{
contor++;
}
}
return contor;
}
int main()
{
char a[101], b[101];
cin >> a >> b;
if (numaraVocale(a) >= numaraVocale(b))
{
cout << a;
}
else
{
cout << b;
}
return 0;
}
Ce învățăm: împărțim problema în subprobleme: o funcție care numără vocalele și o comparație simplă în main.
PbInfo - Cuvintele inversate
Enunț:
Cerință: Se citește un text format din cuvinte despărțite prin câte un spațiu. Să se afișeze fiecare cuvânt inversat, pe câte o linie.
Date de intrare:
Programul citește de la tastatură textul, pe o singură linie.
Date de ieșire:
Programul va afișa fiecare cuvânt inversat, pe câte o linie.
Restricții și precizări:
Textul are cel mult 1000 de caractere; cuvintele au cel mult 100 de litere.
Exemplu:
Intrare:
ana are mere
Ieșire:
ana era erem
Cum gândim soluția:
- Despărțim textul în cuvinte cu
strtok - Pentru fiecare cuvânt îl inversăm caracter cu caracter
- Afișăm cuvântul inversat pe o linie nouă
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char text[1001];
cin.getline(text, 1001);
char *p = strtok(text, " ");
while (p != NULL)
{
int n = strlen(p);
for (int i = 0; i < n / 2; i++)
{
char aux = p[i];
p[i] = p[n - 1 - i];
p[n - 1 - i] = aux;
}
cout << p << endl;
p = strtok(NULL, " ");
}
return 0;
}
Ce învățăm: strtok ne dă pe rând fiecare cuvânt, iar inversarea se aplică fiecăruia înainte de afișare.
Exercițiul Practic: recapitularea modulului
Sarcini de lucru
Completează următoarele sarcini pentru a consolida întregul modul
Sarcina 1: Cuvinte și cel mai lung
Cerință: Scrie un program C++ complet care citește un text de cuvinte și afișează pe o linie numărul de cuvinte, iar pe următoarea linie lungimea celui mai lung cuvânt. Pentru intrarea ana are mere verzi se afișează 4 și 5.
Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char text[1001];
cin.getline(text, 1001);
char *p = strtok(text, " ");
int cuvinte = 0;
int maxim = 0;
while (p != NULL)
{
cuvinte++;
if (strlen(p) > maxim)
{
maxim = strlen(p);
}
p = strtok(NULL, " ");
}
cout << cuvinte << endl;
cout << maxim << endl;
return 0;
}
Verifică: ana are mere verzi are 4 cuvinte, iar cel mai lung (verzi) are 5 litere.
Sarcina 2: Palindrom și vocale
Cerință: Scrie un program C++ complet care citește un cuvânt, afișează pe prima linie DA sau NU dacă este palindrom, iar pe a doua linie numărul de vocale. Pentru intrarea capac se afișează DA și 2.
Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int n = strlen(s);
bool palindrom = true;
int vocale = 0;
for (int i = 0; i < n; i++)
{
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
s[i] == 'o' || s[i] == 'u')
{
vocale++;
}
}
for (int i = 0; i < n / 2; i++)
{
if (s[i] != s[n - 1 - i])
{
palindrom = false;
}
}
if (palindrom)
{
cout << "DA" << endl;
}
else
{
cout << "NU" << endl;
}
cout << vocale << endl;
return 0;
}
Verifică: capac este palindrom și are vocalele a, a, deci 2 vocale.