Școala Româno-Britanică
Modulul 2 Clasa a X-a | C++

Ora 8: Palindrom și cuvinte într-un șir

Ce vei învăța astăzi: Cum verificăm dacă un cuvânt este palindrom (un cuvânt care se citește identic de la stânga la dreapta și invers, de exemplu „civic") și cum separăm cuvintele (adică le despărțim după spații, pentru a le prelucra individual) unui text după spații

Rezultat practic: Scrii programe C++ care verifică palindromuri și care identifică și numără cuvintele dintr-un text (Competența 3.4).

Competența 3.4 Săptămâna 8

Înainte de a începe

De ce contează? Verificarea palindromului este o problemă clasică de examen, iar separarea cuvintelor este pasul obligatoriu înaintea oricărei analize de text — frecvențe, cuvinte lungi, sortări — exact tehnica pe care o vei folosi la testul modulului.

Ce știi deja?

La ora 7 ai transformat caractere-cifră în valori numerice. Citește cuvântul „civic" de la dreapta la stânga: ce observi? Ce perechi de caractere ar trebui comparate pentru a verifica această proprietate?

Ideea-cheie: Un șir este palindrom dacă fiecare pereche simetrică (două caractere aflate la aceeași distanță de capetele cuvântului) s[i] și s[n - 1 - i] coincide — este suficientă parcurgerea până la mijloc; cuvintele unui text se separă detectând spațiile dintre ele.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

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
Verificarea cu for
Separarea cuvintelor după spații
Numărarea cuvintelor

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.

Algoritm verificarePalindrom citește s n = strlen(s) palindrom = adevărat pentru i = 0, n / 2 - 1 execută dacă s[i] != s[n - 1 - i] atunci palindrom = fals sfârșit dacă sfârșit pentru dacă palindrom atunci scrie "DA" altfel scrie "NU" Sfârșit algoritm
C++ - verificarea unui palindrom
#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 = 2
i = 0 s[0] = c, s[4] = c, egale
i = 1 s[1] = a, s[3] = a, egale
rezultat palindrom rămâne true, se afișează DA

Separarea 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.

C++ - numărarea cuvintelor unui text
#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

C++ - cuvintele pe linii separate (cuvinte despărțite prin câte un spațiu)
#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:
identic s[n - 1 - i] egale

Exercițiu de completare a codului

Completează programul care verifică un palindrom:
bool palindrom = true;
for (int i = 0; i < n / ______; i++)
{
    if (s[i] != s[n - 1 - ______])
    {
        ______ = false;
    }
}
if (______)
{
    cout << "DA";
}
Bancă de cuvinte:
2 i palindrom

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?

Ai grijă la: nu parcurge întregul șir la verificarea palindromului — după mijloc perechile se repetă, deci bucla se oprește la 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ă la n, 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 strtok sau 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.

APLICARE ȘI REZOLVARE DE PROBLEME

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:
  1. Calculăm lungimea n = strlen(s)
  2. Comparăm perechile simetrice până la n / 2
  3. 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:
  1. Citim textul cu cin.getline
  2. Numărăm caracterele care marchează început de cuvânt
  3. 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ȚII PRACTICE

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ă.

Scrie pe caiet - De reținut

Titlul lecției

Ora 8: Palindrom și cuvinte într-un șir

Definiția lecției

Un cuvânt este palindrom dacă se citește identic de la stânga la dreapta și de la dreapta la stânga, de exemplu capac sau civic. Pentru a verifica această proprietate, comparăm perechile simetrice s[i] cu s[n - 1 - i], parcurgând doar până la mijlocul cuvântului. Dacă toate perechile sunt egale, cuvântul este palindrom. Un cuvânt dintr-un text este o secvență de litere delimitată de spații, de începutul sau de sfârșitul textului. Separarea cuvintelor se face detectând spațiile sau folosind funcția strtok. Numărarea cuvintelor urmărește de câte ori începe un cuvânt nou după un spațiu. Aceste tehnici sunt pasul obligatoriu înaintea oricărei analize de text, de la frecvențe la sortări.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm verificarePalindrom citește s n = strlen(s) palindrom = adevărat pentru i = 0, n / 2 - 1 execută dacă s[i] != s[n - 1 - i] atunci palindrom = fals sfârșit dacă sfârșit pentru dacă palindrom atunci scrie "DA" altfel scrie "NU" Sfârșit algoritm

Algoritmul cheie - cod C++

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    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" << endl;
    }
    else
    {
        cout << "NU" << endl;
    }

    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Scrie un program care citește un cuvânt și afișează DA dacă este palindrom, altfel NU. Pentru cuvântul civic, programul afișează: DA.

#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" << endl;
    }
    else
    {
        cout << "NU" << endl;
    }

    return 0;
}