Ce vei învăța astăzi?
După această lecție vei ști să verifici dacă un cuvânt este palindrom (se citește identic și de la dreapta la stânga) și să separam cuvintele unui text după spații, numărându-le sau afișându-le.
Ce este un palindrom?
Definiție: Un cuvânt este palindrom dacă se citește identic de la stânga la dreapta și de la dreapta la stânga. Exemple: capac, radar, anna.
Analogia: oglinda
Un palindrom este ca un cuvânt privit în oglindă: imaginea reflectată este identică cu originalul. Dacă ținem cuvântul capac în fața oglinzii, în oglindă tot capac se citește.
| Cuvânt | Citit invers | Este palindrom? |
|---|---|---|
| capac | capac | DA |
| ana | ana | DA |
| bac | cab | NU |
Verificarea palindromului în C++
Comparăm perechile simetrice: s[0] cu s[n-1], s[1] cu s[n-2] etc. Dacă toate perechile sunt egale, cuvântul este palindrom. Ajunge să parcurgem până la n / 2.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int n = strlen(s);
bool palindrom = true;
for (int i = 0; i < n / 2; i++)
{
if (s[i] != s[n - 1 - i])
{
palindrom = false;
}
}
if (palindrom)
{
cout << "DA";
}
else
{
cout << "NU";
}
return 0;
}
Verificarea cuvântului capac (n = 5)
n / 2 = 2Separarea cuvintelor după spații
Un text este format din cuvinte despărțite prin spații. Un caracter este început de cuvânt dacă nu este spațiu și este ori primul caracter, ori este precedat de un spațiu.
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int cuvinte = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] != ' ' && (i == 0 || s[i - 1] == ' '))
{
cuvinte++;
}
}
cout << cuvinte;
return 0;
}
Ce învățăm: condiția „s[i] nu este spațiu ȘI (este primul caracter SAU anteriorul este spațiu)" marchează exact începutul fiecărui cuvânt.
Afișarea cuvintelor pe linii separate
Exemplu ghidat: fiecare cuvânt pe o linie
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
for (int i = 0; i < strlen(s); i++)
{
if (s[i] != ' ')
{
cout << s[i];
}
else
{
cout << endl;
}
}
return 0;
}
Observă: pentru textul ana are mere, programul afișează pe trei linii: ana, are, mere.
Exercițiu de completare
Completează enunțul despre palindroame:
Un cuvânt este palindrom dacă se citește ______ de la stânga la dreapta și de la dreapta la stânga. Comparăm caracterul s[i] cu caracterul ______, până la jumătatea șirului. Dacă toate perechile sunt ______, cuvântul este palindrom.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care verifică un palindrom:
Bancă de cuvinte:
Test de înțelegere
Test rapid - palindrom și cuvinte:
1. Cuvântul „capac" este:
2. Câte cuvinte are textul „ana are mere"?
3. Până unde parcurgem șirul la verificarea palindromului?
n / 2; și nu uita că 'A' și 'a' au coduri ASCII diferite, deci un cuvânt cu litere mari trebuie normalizat înainte de comparație.Aprofundare
Cazuri particulare și detalii avansate:
- De ce parcurgem doar până la
n / 2? Fiecare pereche simetrică(s[i], s[n-1-i])se verifică o singură dată; dacă am merge până lan, am verifica fiecare pereche de două ori, fără folos. - Un singur caracter este palindrom (nu are perechi de comparat), iar șirul gol este considerat palindrom.
- Palindrom cu majuscule și minuscule:
"Ana"nu este palindrom după coduri ASCII ('A' ≠ 'a'); dacă problema cere ignorarea literei mari/mici, transformăm totul în minuscule înainte de verificare. - Palindrom de text (frază): dacă textul conține spații, le eliminăm sau le ignorăm la comparare; cuvântul cu spații
"ele fac cafea"poate fi palindrom de frază. - Separarea cuvintelor: într-un text, cuvintele sunt delimitate de spații; le parcurgem cu
strtoksau manual, urmărind pozițiile de început și de sfârșit ale fiecăruia.
Palindromul și separarea cuvintelor sunt fundația problemelor de text: verificări de simetrie, numărare de cuvinte, găsirea celui mai lung cuvânt și afișarea cuvintelor în diverse forme.
PbInfo - Cuvânt palindrom
Enunț:
Cerință: Se citește un cuvânt s, format din litere mici. Să se afișeze DA dacă cuvântul este palindrom, altfel NU.
Date de intrare:
Programul citește de la tastatură cuvântul s.
Date de ieșire:
Programul va afișa DA sau NU.
Restricții și precizări:
Cuvântul are cel mult 100 de caractere.
Exemplu:
Intrare:
capac
Ieșire:
DA
Cum gândim soluția:
- Calculăm lungimea
n = strlen(s) - Comparăm perechile simetrice până la
n / 2 - Dacă găsim o pereche diferită, afișăm NU; altfel afișăm DA
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int n = strlen(s);
bool palindrom = true;
for (int i = 0; i < n / 2; i++)
{
if (s[i] != s[n - 1 - i])
{
palindrom = false;
}
}
if (palindrom)
{
cout << "DA";
}
else
{
cout << "NU";
}
return 0;
}
Ce învățăm: un singur caracter central (pentru lungime impară) nu trebuie comparat cu nimic; de aceea parcurgem doar până la n / 2.
PbInfo - Câte cuvinte
Enunț:
Cerință: Se citește un text format din cuvinte despărțite prin câte un spațiu. Să se afișeze numărul de cuvinte din text.
Date de intrare:
Programul citește de la tastatură textul, pe o singură linie.
Date de ieșire:
Programul va afișa numărul de cuvinte.
Restricții și precizări:
Textul are cel mult 100 de caractere; cuvintele sunt despărțite prin câte un spațiu.
Exemplu:
Intrare:
ana are mere
Ieșire:
3
Cum gândim soluția:
- Citim textul cu
cin.getline - Numărăm caracterele care marchează început de cuvânt
- Afișăm numărul
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 cuvinte = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] != ' ' && (i == 0 || s[i - 1] == ' '))
{
cuvinte++;
}
}
cout << cuvinte;
return 0;
}
Ce învățăm: numărul de cuvinte este egal cu numărul de „începuturi de cuvânt" din text.
Exercițiul Practic: palindrom și cuvinte
Sarcini de lucru
Completează următoarele sarcini pentru a exersa palindroamele și separarea cuvintelor
Sarcina 1: Palindrom fără cuvinte magice
Cerință: Scrie un program C++ complet care citește un cuvânt și afișează DA sau NU, dar folosind un break imediat ce se descoperă o pereche diferită (nu compară toate perechile).
Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int n = strlen(s);
bool palindrom = true;
for (int i = 0; i < n / 2; i++)
{
if (s[i] != s[n - 1 - i])
{
palindrom = false;
break;
}
}
if (palindrom)
{
cout << "DA";
}
else
{
cout << "NU";
}
return 0;
}
Verifică: pentru cuvântul bac, bucla se oprește imediat la prima pereche diferită (b cu c) și afișează NU.
Sarcina 2: Cuvintele pe linii
Cerință: Scrie un program C++ complet care citește un text cu cuvinte despărțite prin câte un spațiu și afișează fiecare cuvânt pe câte o linie. Pentru intrarea bacalaureat 2026 se afișează pe două linii: bacalaureat și 2026.
Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
for (int i = 0; i < strlen(s); i++)
{
if (s[i] != ' ')
{
cout << s[i];
}
else
{
cout << endl;
}
}
return 0;
}
Verifică: spațiul este „granița" dintre cuvinte; oriunde apare spațiu, trecem la linia nouă.