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

Ora 11: Aplicații integrate cu șiruri de caractere

Ce vei învăța astăzi: Să combini tehnicile învățate (parcurgere, separare de cuvinte, conversii, funcții din cstring) într-un singur program care prelucrează un text complet

Rezultat practic: Rezolvi probleme integrate cu șiruri (probleme care combină mai multe tehnici într-un singur program): cel mai lung cuvânt, eliminarea spațiilor multiple (adică reducerea mai multor spații consecutive la unul singur) și extragerea cifrelor dintr-un text (adică selectarea doar a cifrelor, ignorând literele), scriind programe C++ complete, pas cu pas (Competența 5.2).

Competența 5.2 Săptămâna 10

Înainte de a începe

De ce contează? Problemele reale nu testează o singură funcție, ci combină mai multe tehnici într-un singur program — exact astfel de probleme apar la testul modulului și la BAC.

Ce știi deja?

La ora 10 ai recapitulat funcțiile pentru șiruri. Cum ai combina strtok (separarea cuvintelor) cu strlen (lungimea) pentru a găsi cel mai lung cuvânt dintr-un text?

Ideea-cheie: O aplicație integrată îmbină cel puțin două tehnici din modul (parcurgere + separare, conversii + dicționar); planul se scrie înaintea codului — citește, prelucrează, afișează — astfel încât un singur program să rezolve mai multe cerințe.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei putea combina mai multe prelucrări de șiruri într-un singur program și vei rezolva aplicații integrate: găsirea celui mai lung cuvânt, curățarea unui text de spații multiple și extragerea cifrelor.

Ce este o aplicație integrată
Cel mai lung cuvânt dintr-un text
Eliminarea spațiilor multiple
Cifrele dintr-un șir: numărare și sumă

Ce este o aplicație integrată?

Definiție: O aplicație integrată este un program care combină mai multe prelucrări asupra acelorași date, într-o succesiune logică: citește textul, îl separă în cuvinte, numără, transformă și afișează rezultatele. Fiecare pas folosește tehnicile învățate separat: parcurgerea, funcțiile din <cstring>, conversiile șir-număr.

De exemplu, un program care primește un eseu poate afișa simultan: numărul de cuvinte, cel mai lung cuvânt, numărul de cifre și suma lor. Toate aceste prelucrări folosesc aceeași parcurgere de bază, dar cu reguli diferite.

Analogia: linia de asamblare

O aplicație integrată seamănă cu o linie de asamblare dintr-o fabrică: materia primă (textul citit) trece prin mai multe stații (prelucrări), iar fiecare stație adaugă un rezultat. La final, toate rezultatele sunt adunate și livrate împreună.

Stația 1

Citirea textului (cin.getline)

Stația 2

Separarea în cuvinte după spații

Stația 3

Numărarea și măsurarea lungimilor

Stația 4

Afișarea tuturor rezultatelor

Cel mai lung cuvânt dintr-un text

Definiție: Un cuvânt dintr-un text este o secvență de litere delimitată de spații (sau de începutul/sfârșitul textului). Pentru a găsi cel mai lung cuvânt, parcurgem textul și reținem, pentru fiecare cuvânt, poziția de început și lungimea; comparăm fiecare lungime cu maximul curent și, când găsim un cuvânt mai lung, reținem și poziția lui de început, pentru a-l putea afișa.

Algoritm celMaiLungCuvânt citește text n = strlen(text) inceput = 0 lungimeMax = 0 pozitieMax = 0 pentru i = 0, n execută dacă text[i] = ' ' sau text[i] = '\0' atunci lungime = i - inceput dacă lungime > lungimeMax atunci lungimeMax = lungime pozitieMax = inceput sfârșit dacă inceput = i + 1 sfârșit dacă sfârșit pentru scrie "Cel mai lung cuvânt are ", lungimeMax, " litere" scrie cuvântul de la pozitieMax, cu lungimeMax litere Sfârșit algoritm
C++ - cel mai lung cuvânt, cu afișarea cuvântului
#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int inceput = 0;
    int lungimeMax = 0;
    int pozitieMax = 0;
    int i = 0;

    while (i <= n)
    {
        if (s[i] == ' ' || s[i] == '\0')
        {
            int lungime = i - inceput;
            if (lungime > lungimeMax)
            {
                lungimeMax = lungime;
                pozitieMax = inceput;
            }
            inceput = i + 1;
        }
        i++;
    }

    cout << "Cuvantul cel mai lung are " << lungimeMax
         << " litere: ";
    for (int j = pozitieMax; j < pozitieMax + lungimeMax; j++)
    {
        cout << s[j];
    }
    cout << endl;

    return 0;
}

Ce învățăm: testarea terminatorului '\0' (prin condiția i <= n) este obligatorie pentru a procesa ultimul cuvânt, care nu are spațiu după el. Reținerea poziției de început ne permite să afișăm cuvântul, nu doar lungimea.

Eliminarea spațiilor multiple

Definiție: Un text poate conține spații multiple între cuvinte (din cauza tastării sau a formatării). Normalizarea textului înseamnă construirea unui șir nou în care între cuvinte există exact un spațiu, fără spații la început sau la sfârșit. Construim șirul rezultat caracter cu caracter, într-un tablou separat.

Algoritm eliminareSpațiiMultiple citește text k = 0 (poziția de scriere în șirul rezultat) pentru i = 0, strlen(text) - 1 execută dacă text[i] != ' ' atunci rezultat[k] = text[i] k = k + 1 altfel dacă k > 0 și rezultat[k - 1] != ' ' atunci rezultat[k] = ' ' k = k + 1 sfârșit dacă sfârșit pentru dacă k > 0 și rezultat[k - 1] = ' ' atunci k = k - 1 sfârșit dacă rezultat[k] = '\0' scrie rezultat Sfârșit algoritm
C++ - eliminarea spațiilor multiple dintr-un text
#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int k = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] != ' ')
        {
            rezultat[k] = s[i];
            k++;
        }
        else if (k > 0 && rezultat[k - 1] != ' ')
        {
            rezultat[k] = ' ';
            k++;
        }
    }

    if (k > 0 && rezultat[k - 1] == ' ')
    {
        k--;
    }
    rezultat[k] = '\0';

    cout << rezultat << endl;

    return 0;
}

Ce învățăm: o literă se copiază întotdeauna; un spațiu se copiază doar dacă ultimul caracter deja scris nu este spațiu. La final eliminăm un eventual spațiu rămas la capăt și închidem șirul cu '\0'.

Cifrele dintr-un șir: numărare și sumă

Definiție: Un text poate amesteca litere și cifre (ex. "bac2026abc"). Prelucrarea cifrelor folosește conversia caracter-cifră: s[i] - '0' transformă caracterul '2' în valoarea numerică 2. Testul s[i] >= '0' && s[i] <= '9' verifică dacă un caracter este cifră, pentru că cifrele au coduri ASCII consecutive.

Algoritm cifreDinȘir citește text numarCifre = 0 suma = 0 pentru i = 0, strlen(text) - 1 execută dacă text[i] este cifră atunci numarCifre = numarCifre + 1 suma = suma + (text[i] - '0') sfârșit dacă sfârșit pentru scrie numarCifre, suma Sfârșit algoritm
C++ - numărul de cifre și suma lor
#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int numarCifre = 0;
    int suma = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            numarCifre++;
            suma = suma + (s[i] - '0');
        }
    }

    cout << "Numar de cifre: " << numarCifre << endl;
    cout << "Suma cifrelor: " << suma << endl;

    return 0;
}

Ce învățăm: prelucrarea cifrelor dintr-un șir combină parcurgerea (de la ora 3) cu conversia caracter-cifră (de la ora 7) — un exemplu clasic de aplicație integrată.

Exercițiu de completare

Completează enunțul despre aplicațiile integrate:

O aplicație integrată combină mai multe prelucrări: ______ textul în cuvinte după spații, aflăm ______ celui mai lung cuvânt și transformăm caracterele-cifră în valori numerice cu ______. La final, șirul rezultat se închide cu caracterul ______.

Bancă de cuvinte:
separăm lungimea s[i] - '0' '\0'

Exercițiu de completare a codului

Completează programul care calculează suma cifrelor dintr-un text:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s[1001];
    cin.getline(s, 1001);
    int suma = ______;
    for (int i = 0; i < strlen(______); i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            suma = suma + (______ - '0');
        }
    }
    cout << ______;
    return 0;
}
Bancă de cuvinte:
0 s s[i] suma

Test de înțelegere

Test rapid - aplicații integrate:

1. Cum găsim cel mai lung cuvânt dintr-un text?

2. Cum transformăm caracterul '5' în valoarea numerică 5?

3. Ce face condiția i <= n la parcurgerea unui text?

Ai grijă la: la eliminarea spațiilor multiple, condiția s[i] == ' ' && s[i + 1] == ' ' iese din șir la ultima poziție; verifică mai întâi că i + 1 nu depășește lungimea, altfel citești memorie neinițializată.

Aprofundare

Cazuri particulare și detalii avansate:

  • Text cu spații consecutive: algoritmul cu strtok tratează automat spațiile multiple; cel manual trebuie să evite cuvintele vide (de lungime 0), verificând lungime > 0 înainte de comparație.
  • Spații la începutul sau la sfârșitul textului: la normalizare, primul caracter scris nu trebuie să fie spațiu (condiția k > 0), iar spațiul final se elimină scăzând k.
  • Frază fără spații: dacă textul are un singur cuvânt, algoritmul îl procesează prin testul s[i] == '\0', iar maximul devine chiar lungimea lui.
  • Cifrele nu sunt litere: la numărarea cuvintelor, un grup de cifre poate fi considerat cuvânt sau nu, în funcție de enunț; citește restricțiile cu atenție.
  • Combinarea tuturor prelucrărilor: un singur for poate număra simultan cuvintele, cifrele și vocalele, actualizând mai mulți contori — eficiența unei aplicații integrate.

Aplicațiile integrate îți arată că șirurile de caractere nu se prelucrează cu o singură tehnică, ci cu un lanț de pași: fiecare pas transformă datele, iar la final programul afișează un rezultat complet, exact ca un raport de analiză a unui text.

APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Cifrele unui text

Enunț:

Cerință: Se citește un text format din litere mici și cifre, fără spații. Să se afișeze numărul de cifre din text și suma lor, fiecare pe câte o linie.

Date de intrare:

Programul citește de la tastatură textul s, pe o singură linie.

Date de ieșire:

Programul va afișa pe prima linie numărul de cifre, iar pe a doua linie suma lor.

Restricții și precizări:

Textul are cel mult 100 de caractere și conține doar litere mici și cifre.

Exemplu:

Intrare:

bac2026abc

Ieșire:

4
10
Cum gândim soluția:
  1. Citim textul cu cin.getline
  2. Parcurgem cu for și testăm fiecare caracter cu s[i] >= '0' && s[i] <= '9'
  3. Numărăm cifrele și adunăm s[i] - '0' pentru fiecare cifră
  4. Afișăm cele două rezultate
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 numarCifre = 0;
    int suma = 0;

    for (int i = 0; i < strlen(s); i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            numarCifre++;
            suma = suma + (s[i] - '0');
        }
    }

    cout << numarCifre << endl;
    cout << suma << endl;

    return 0;
}

Ce învățăm: pentru bac2026abc, cifrele sunt 2, 0, 2, 6: deci 4 cifre și suma 10. Testul de cifră și conversia s[i] - '0' lucrează împreună.

PbInfo - Spații normale

Enunț:

Cerință: Se citește un text care poate conține mai multe spații între cuvinte. Să se afișeze textul corectat, cu un singur spațiu între cuvinte și fără spații la început sau la sfârșit.

Date de intrare:

Programul citește de la tastatură textul, pe o singură linie.

Date de ieșire:

Programul va afișa textul normalizat, pe o singură linie.

Restricții și precizări:

Textul are cel mult 1000 de caractere și conține doar litere mici și spații.

Exemplu:

Intrare:

ana   are    mere

Ieșire:

ana are mere
Cum gândim soluția:
  1. Declarăm un șir rezultat în care construim textul corectat
  2. Copiem literele întotdeauna; copiem un spațiu doar dacă ultimul caracter scris nu este spațiu
  3. Eliminăm spațiul final și adăugăm terminatorul '\0'
  4. Afișăm șirul rezultat
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int k = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] != ' ')
        {
            rezultat[k] = s[i];
            k++;
        }
        else if (k > 0 && rezultat[k - 1] != ' ')
        {
            rezultat[k] = ' ';
            k++;
        }
    }

    if (k > 0 && rezultat[k - 1] == ' ')
    {
        k--;
    }
    rezultat[k] = '\0';

    cout << rezultat << endl;

    return 0;
}

Ce învățăm: construim un șir nou caracter cu caracter; regula „copiază un spațiu doar după un caracter diferit" elimină automat spațiile multiple.

EXERCIȚII PRACTICE

Exercițiul Practic: aplicații integrate

Sarcini de lucru

Completează următoarele sarcini pentru a consolida prelucrarea integrată a textelor

Sarcina 1: Analiza unui text

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ă pe prima linie numărul de cuvinte, iar pe a doua linie cel mai lung cuvânt. Pentru intrarea ana are mere verzi se afișează 4 și verzi.

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;
    char lung[101] = "";

    while (p != NULL)
    {
        cuvinte++;
        if (strlen(p) > strlen(lung))
        {
            strcpy(lung, p);
        }
        p = strtok(NULL, " ");
    }

    cout << cuvinte << endl;
    cout << lung << endl;

    return 0;
}

Verifică: textul are 4 cuvinte, iar cel mai lung este verzi (5 litere). Comparăm cu strlen și copiem cu strcpy.

Sarcina 2: Vocale și cifre

Cerință: Scrie un program C++ complet care citește un text fără spații și afișează pe prima linie numărul de vocale, iar pe a doua linie numărul de cifre. Pentru intrarea bac2026e se afișează 3 și 4.

Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;

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

    int vocale = 0;
    int cifre = 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++;
        }
        if (s[i] >= '0' && s[i] <= '9')
        {
            cifre++;
        }
    }

    cout << vocale << endl;
    cout << cifre << endl;

    return 0;
}

Verifică: bac2026e are vocalele a, a, e (3) și cifrele 2, 0, 2, 6 (4). Un singur for actualizează ambii contori.

Scrie pe caiet - De reținut

Titlul lecției

Ora 11: Aplicații integrate cu șiruri de caractere

Definiția lecției

O aplicație integrată este un program care combină mai multe prelucrări de șiruri într-o singură succesiune logică: citește textul, îl separă în cuvinte, numără, transformă și afișează rezultatele. Problemele tipice sunt găsirea celui mai lung cuvânt, normalizarea textului și extragerea cifrelor. Normalizarea textului înseamnă eliminarea spațiilor multiple, lăsând exact un spațiu între cuvinte și niciunul la capete. Extragerea cifrelor folosește testul s[i] >= '0' && s[i] <= '9' și conversia s[i] - '0'. Fiecare pas folosește tehnicile învățate separat: parcurgerea, funcțiile din <cstring> și conversiile. Un singur for poate actualiza mai mulți contori, de exemplu numărul de cuvinte, de vocale și de cifre. Planul se scrie înaintea codului: citește, prelucrează, afișează.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm celMaiLungCuvânt citește text n = strlen(text) inceput = 0, lungimeMax = 0, pozitieMax = 0 pentru i = 0, n execută dacă text[i] = ' ' sau text[i] = '\0' atunci lungime = i - inceput dacă lungime > lungimeMax atunci lungimeMax = lungime pozitieMax = inceput sfârșit dacă inceput = i + 1 sfârșit dacă sfârșit pentru scrie cuvântul de la pozitieMax, cu lungimeMax litere Sfârșit algoritm

Algoritmul cheie - cod C++

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

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

    int n = strlen(s);
    int inceput = 0;
    int lungimeMax = 0;
    int pozitieMax = 0;

    for (int i = 0; i <= n; i++)
    {
        if (s[i] == ' ' || s[i] == '\0')
        {
            int lungime = i - inceput;
            if (lungime > lungimeMax)
            {
                lungimeMax = lungime;
                pozitieMax = inceput;
            }
            inceput = i + 1;
        }
    }

    for (int j = pozitieMax; j < pozitieMax + lungimeMax; j++)
    {
        cout << s[j];
    }
    cout << endl;

    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Scrie un program care citește un text și afișează câte cifre conține, apoi suma lor. Pentru textul bac2026, programul afișează: 4 cifre, suma 10.

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

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

    int n = strlen(s);
    int numarCifre = 0;
    int suma = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            numarCifre++;
            suma = suma + (s[i] - '0');
        }
    }

    cout << numarCifre << " cifre" << endl;
    cout << "Suma: " << suma << endl;

    return 0;
}